diff --git a/python/src/com/jetbrains/python/psi/PySliceExpression.java b/python/src/com/jetbrains/python/psi/PySliceExpression.java index 974e9933e8e8..21904f7411ae 100644 --- a/python/src/com/jetbrains/python/psi/PySliceExpression.java +++ b/python/src/com/jetbrains/python/psi/PySliceExpression.java @@ -1,11 +1,13 @@ package com.jetbrains.python.psi; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * @author yole */ public interface PySliceExpression extends PyExpression { + @NotNull PyExpression getOperand(); @Nullable diff --git a/python/src/com/jetbrains/python/psi/impl/PySliceExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PySliceExpressionImpl.java index d2762d013d80..73471583e088 100644 --- a/python/src/com/jetbrains/python/psi/impl/PySliceExpressionImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PySliceExpressionImpl.java @@ -2,11 +2,11 @@ package com.jetbrains.python.psi.impl; import com.intellij.lang.ASTNode; import com.intellij.psi.util.PsiTreeUtil; -import com.jetbrains.python.PyElementTypes; import com.jetbrains.python.PythonDialectsTokenSetProvider; import com.jetbrains.python.psi.PyExpression; import com.jetbrains.python.psi.PySliceExpression; import com.jetbrains.python.psi.PySliceItem; +import com.jetbrains.python.psi.types.PyTupleType; import com.jetbrains.python.psi.types.PyType; import com.jetbrains.python.psi.types.TypeEvalContext; import org.jetbrains.annotations.NotNull; @@ -20,15 +20,25 @@ public class PySliceExpressionImpl extends PyElementImpl implements PySliceExpre super(astNode); } + @Nullable + @Override public PyType getType(@NotNull TypeEvalContext context) { - return context.getType(getOperand()); + final PyType type = context.getType(getOperand()); + // TODO: Currently we don't evaluate the static range of the slice, so we have to return a generic tuple type without elements + if (type instanceof PyTupleType) { + return PyBuiltinCache.getInstance(this).getTupleType(); + } + return type; } + @NotNull + @Override public PyExpression getOperand() { return childToPsiNotNull(PythonDialectsTokenSetProvider.INSTANCE.getExpressionTokens(), 0); } @Nullable + @Override public PySliceItem getSliceItem() { return PsiTreeUtil.getChildOfType(this, PySliceItem.class); } diff --git a/python/testData/inspections/PyTupleAssignmentBalanceInspection3/test.py b/python/testData/inspections/PyTupleAssignmentBalanceInspection3/test.py index 64a709385a1e..ee978cb01b67 100644 --- a/python/testData/inspections/PyTupleAssignmentBalanceInspection3/test.py +++ b/python/testData/inspections/PyTupleAssignmentBalanceInspection3/test.py @@ -12,4 +12,10 @@ a, b = c a, b = [1, 2, 3] a, b = 'str' a, b = {1, 2, 3} -a, b = {1:2, 2: 3, 3:4} \ No newline at end of file +a, b = {1:2, 2: 3, 3:4} + +# PY-6315 +def test_tuple_slice(): + def f(): + return 1, 2, 3 + x, y = f()[:2]