fixed PY-11316 Unresolved reference 'numpy.square' and relative (PY-12474, PY-13124...
authorEkaterina Tuzova <Ekaterina.Tuzova@jetbrains.com>
Tue, 24 Feb 2015 15:18:58 +0000 (18:18 +0300)
committerEkaterina Tuzova <Ekaterina.Tuzova@jetbrains.com>
Tue, 24 Feb 2015 15:18:58 +0000 (18:18 +0300)
Added resolve from site-packages to the appropriate skeleton symbol. It's made only for relative imports, other cases are covered in ResolveImportUtil.resolveRelativeImportAsAbsolute

python/src/com/jetbrains/python/psi/resolve/QualifiedNameResolverImpl.java

index 45ae96f53caf18abe71ee0f2b0e7a30f6d1e04cf..07136f58f7e737330ce3d2d6a6d8b27d5f216a9e 100644 (file)
@@ -25,6 +25,7 @@ import com.intellij.openapi.module.Module;
 import com.intellij.openapi.module.ModuleManager;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.openapi.roots.FileIndexFacade;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.PsiDirectory;
 import com.intellij.psi.PsiElement;
@@ -38,6 +39,7 @@ import com.jetbrains.python.facet.PythonPathContributingFacet;
 import com.jetbrains.python.psi.PyFile;
 import com.jetbrains.python.psi.impl.PyBuiltinCache;
 import com.jetbrains.python.psi.impl.PyImportResolver;
+import com.jetbrains.python.sdk.PySdkUtil;
 import com.jetbrains.python.sdk.PythonSdkType;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -246,6 +248,9 @@ public class QualifiedNameResolverImpl implements RootVisitor, QualifiedNameReso
     if (!myWithoutRoots) {
       addResultsFromRoots();
     }
+    else if (footholdFile != null){
+      addResultsFromSkeletons(footholdFile);
+    }
 
     mySourceResults.addAll(myLibResults);
     myLibResults.clear();
@@ -268,6 +273,33 @@ public class QualifiedNameResolverImpl implements RootVisitor, QualifiedNameReso
     return results;
   }
 
+  /**
+   * Resolve relative imports from sdk root to the skeleton dir
+   */
+  private void addResultsFromSkeletons(@NotNull final PsiFile foothold) {
+    final boolean inSource = FileIndexFacade.getInstance(foothold.getProject()).isInContent(foothold.getVirtualFile());
+    if (inSource) return;
+    PsiDirectory containingDirectory = foothold.getContainingDirectory();
+    if (myRelativeLevel > 0) {
+      containingDirectory = ResolveImportUtil.stepBackFrom(foothold, myRelativeLevel);
+    }
+    if (containingDirectory != null) {
+      final QualifiedName containingPath = QualifiedNameFinder.findCanonicalImportPath(containingDirectory, null);
+      if (containingPath != null && containingPath.getComponentCount() > 0) {
+        final QualifiedName absolutePath = containingPath.append(myQualifiedName.toString());
+        final QualifiedNameResolverImpl absoluteVisitor =
+          (QualifiedNameResolverImpl)new QualifiedNameResolverImpl(absolutePath).fromElement(foothold);
+
+        final Sdk sdk = PythonSdkType.getSdk(foothold);
+        if (sdk == null) return;
+        final VirtualFile skeletonsDir = PySdkUtil.findSkeletonsDir(sdk);
+        if (skeletonsDir == null) return;
+        final PsiDirectory directory = myContext.getPsiManager().findDirectory(skeletonsDir);
+        myLibResults.add(absoluteVisitor.resolveModuleAt(directory));
+      }
+    }
+  }
+
   private void addResultsFromRoots() {
     if (myVisitAllModules) {
       for (Module mod : ModuleManager.getInstance(myContext.getProject()).getModules()) {