From f20ab38e84953d027abb8c4b2b3f9776d6ad72da Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Fri, 23 Jun 2017 16:03:55 +0300 Subject: [PATCH] PY-18816 Exclude qualified references from type aliases stubs Since, otherwise, these custom stubs conflict with the standard "initializer" field of PyTargetExpressionStub and, thus, break resolve in stubbed files, e.g. when exported symbols are aliased in "__init__.py" of a package, etc. The current workaround is not to keep RHS text of such assignments in the custom stubs, relying on existing functionality of PyTypingAliasStubType instead, but inspect both when extracting type aliases from the stub tree. --- .../typing/PyTypingTypeProvider.java | 18 ++------- .../psi/impl/stubs/PyTypingAliasStubType.java | 40 ++++++++++++++++--- python/testData/stubs/TypeAliasStubs.py | 5 ++- .../com/jetbrains/python/PyStubsTest.java | 5 +++ 4 files changed, 47 insertions(+), 21 deletions(-) diff --git a/python/src/com/jetbrains/python/codeInsight/typing/PyTypingTypeProvider.java b/python/src/com/jetbrains/python/codeInsight/typing/PyTypingTypeProvider.java index 7f41bfc813ba..f9b895986b6c 100644 --- a/python/src/com/jetbrains/python/codeInsight/typing/PyTypingTypeProvider.java +++ b/python/src/com/jetbrains/python/codeInsight/typing/PyTypingTypeProvider.java @@ -41,8 +41,6 @@ import com.jetbrains.python.psi.impl.PyExpressionCodeFragmentImpl; import com.jetbrains.python.psi.impl.PyPsiUtils; import com.jetbrains.python.psi.impl.stubs.PyTypingAliasStubType; import com.jetbrains.python.psi.resolve.*; -import com.jetbrains.python.psi.stubs.PyTargetExpressionStub; -import com.jetbrains.python.psi.stubs.PyTypingAliasStub; import com.jetbrains.python.psi.types.*; import one.util.streamex.StreamEx; import org.jetbrains.annotations.NotNull; @@ -615,7 +613,7 @@ public class PyTypingTypeProvider extends PyTypeProviderBase { } @Nullable - private static PyExpression createExpressionFromFragment(@NotNull String contents, @NotNull PsiElement anchor) { + public static PyExpression createExpressionFromFragment(@NotNull String contents, @NotNull PsiElement anchor) { final PyExpressionCodeFragmentImpl codeFragment = new PyExpressionCodeFragmentImpl(anchor.getProject(), "dummy.py", contents, false); codeFragment.setContext(FileContextUtil.getContextFile(anchor)); final PyExpressionStatement statement = as(codeFragment.getFirstChild(), PyExpressionStatement.class); @@ -787,22 +785,12 @@ public class PyTypingTypeProvider extends PyTypeProviderBase { // Presumably, a TypeVar definition or a type alias if (element instanceof PyTargetExpression) { final PyTargetExpression targetExpr = (PyTargetExpression)element; - PyExpression assignedValue = null; + final PyExpression assignedValue; if (context.maySwitchToAST(expression)) { assignedValue = targetExpr.findAssignedValue(); } else { - final PyTargetExpressionStub stub = targetExpr.getStub(); - if (stub != null) { - final PyTypingAliasStub aliasStub = stub.getCustomStub(PyTypingAliasStub.class); - if (aliasStub != null) { - assignedValue = createExpressionFromFragment(aliasStub.getText(), expression); - } - } - else { - // Use PSI to get the assigned value but only if the same expression would be saved in stubs - assignedValue = PyTypingAliasStubType.getAssignedValueIfTypeAliasLike(targetExpr); - } + assignedValue = PyTypingAliasStubType.getAssignedValueStubSafe(targetExpr); } if (assignedValue != null) { elements.add(assignedValue); diff --git a/python/src/com/jetbrains/python/psi/impl/stubs/PyTypingAliasStubType.java b/python/src/com/jetbrains/python/psi/impl/stubs/PyTypingAliasStubType.java index c6b6d83368c8..ea59fb65b7e7 100644 --- a/python/src/com/jetbrains/python/psi/impl/stubs/PyTypingAliasStubType.java +++ b/python/src/com/jetbrains/python/psi/impl/stubs/PyTypingAliasStubType.java @@ -23,11 +23,14 @@ import com.intellij.util.io.StringRef; import com.jetbrains.python.PyElementTypes; import com.jetbrains.python.codeInsight.typing.PyTypingTypeProvider; import com.jetbrains.python.psi.*; +import com.jetbrains.python.psi.stubs.PyTargetExpressionStub; +import com.jetbrains.python.psi.stubs.PyTargetExpressionStub.InitializerType; import com.jetbrains.python.psi.stubs.PyTypingAliasStub; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.IOException; +import java.util.Objects; import java.util.regex.Pattern; import static com.jetbrains.python.psi.PyUtil.as; @@ -52,17 +55,17 @@ public class PyTypingAliasStubType extends CustomTargetExpressionStubType