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]