Don't use relative import resolving for references in user skeletons

This commit is contained in:
Andrey Vlasovskikh
2013-10-23 20:12:12 +04:00
parent 70f532bb20
commit 198c872e98
4 changed files with 20 additions and 5 deletions
@@ -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 extends PyElement> T getUserSkeleton(@NotNull T element) {
final PsiFile file = element.getContainingFile();
@@ -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);
@@ -0,0 +1,5 @@
from io import BytesIO
fd = BytesIO('foo')
fd.read(10) # Should resolve
fd.<warning descr="Unresolved attribute reference 'foo' for class 'BytesIO'">foo</warning>()
@@ -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);