From 198c872e9803e1b61f690d984e048003ac0abc6f Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Wed, 23 Oct 2013 20:12:12 +0400 Subject: [PATCH] Don't use relative import resolving for references in user skeletons --- .../codeInsight/userSkeletons/PyUserSkeletonsUtil.java | 9 ++++++++- .../python/psi/resolve/QualifiedNameResolverImpl.java | 7 +++---- .../PyUnresolvedReferencesInspection/bytesIORead.py | 5 +++++ .../PyUnresolvedReferencesInspectionTest.java | 4 ++++ 4 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 python/testData/inspections/PyUnresolvedReferencesInspection/bytesIORead.py diff --git a/python/src/com/jetbrains/python/codeInsight/userSkeletons/PyUserSkeletonsUtil.java b/python/src/com/jetbrains/python/codeInsight/userSkeletons/PyUserSkeletonsUtil.java index 55a8df17ec00..da0ad54784d0 100644 --- a/python/src/com/jetbrains/python/codeInsight/userSkeletons/PyUserSkeletonsUtil.java +++ b/python/src/com/jetbrains/python/codeInsight/userSkeletons/PyUserSkeletonsUtil.java @@ -24,16 +24,17 @@ import com.intellij.openapi.projectRoots.SdkModificator; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; +import com.intellij.psi.util.QualifiedName; import com.jetbrains.python.PythonHelpersLocator; import com.jetbrains.python.codeInsight.controlflow.ScopeOwner; import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil; import com.jetbrains.python.psi.*; -import com.intellij.psi.util.QualifiedName; import com.jetbrains.python.psi.resolve.*; import com.jetbrains.python.psi.types.PyClassLikeType; import com.jetbrains.python.psi.types.PyType; @@ -77,6 +78,12 @@ public class PyUserSkeletonsUtil { return ourUserSkeletonsDirectory; } + public static boolean isUnderUserSkeletonsDirectory(@NotNull PsiFile file) { + final VirtualFile skeletonsDir = getUserSkeletonsDirectory(); + final VirtualFile virtualFile = file.getVirtualFile(); + return skeletonsDir != null && virtualFile != null && VfsUtilCore.isAncestor(skeletonsDir, virtualFile, false); + } + @Nullable public static T getUserSkeleton(@NotNull T element) { final PsiFile file = element.getContainingFile(); diff --git a/python/src/com/jetbrains/python/psi/resolve/QualifiedNameResolverImpl.java b/python/src/com/jetbrains/python/psi/resolve/QualifiedNameResolverImpl.java index 4795d329a86b..43a21edf3dc4 100644 --- a/python/src/com/jetbrains/python/psi/resolve/QualifiedNameResolverImpl.java +++ b/python/src/com/jetbrains/python/psi/resolve/QualifiedNameResolverImpl.java @@ -28,12 +28,12 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.util.QualifiedName; import com.jetbrains.python.codeInsight.userSkeletons.PyUserSkeletonsUtil; import com.jetbrains.python.console.PydevConsoleRunner; import com.jetbrains.python.facet.PythonPathContributingFacet; import com.jetbrains.python.psi.impl.PyBuiltinCache; import com.jetbrains.python.psi.impl.PyImportResolver; -import com.intellij.psi.util.QualifiedName; import com.jetbrains.python.sdk.PythonSdkType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -216,9 +216,8 @@ public class QualifiedNameResolverImpl implements RootVisitor, QualifiedNameReso return Collections.emptyList(); } - if (myRelativeLevel >= 0) { - PsiFile footholdFile = myContext.getFootholdFile(); - assert footholdFile != null; + final PsiFile footholdFile = myContext.getFootholdFile(); + if (myRelativeLevel >= 0 && footholdFile != null && !PyUserSkeletonsUtil.isUnderUserSkeletonsDirectory(footholdFile)) { PsiDirectory dir = footholdFile.getContainingDirectory(); if (myRelativeLevel > 0) { dir = ResolveImportUtil.stepBackFrom(footholdFile, myRelativeLevel); diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/bytesIORead.py b/python/testData/inspections/PyUnresolvedReferencesInspection/bytesIORead.py new file mode 100644 index 000000000000..8168e1399a86 --- /dev/null +++ b/python/testData/inspections/PyUnresolvedReferencesInspection/bytesIORead.py @@ -0,0 +1,5 @@ +from io import BytesIO + +fd = BytesIO('foo') +fd.read(10) # Should resolve +fd.foo() diff --git a/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java index 5ab20d7facd1..54cbf2e1aebf 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java @@ -318,6 +318,10 @@ public class PyUnresolvedReferencesInspectionTest extends PyTestCase { doMultiFileTest("a.py"); } + public void testBytesIORead() { + doTest(); + } + private void doTest() { myFixture.configureByFile(TEST_DIRECTORY + getTestName(true) + ".py"); myFixture.enableInspections(PyUnresolvedReferencesInspection.class);