PY-46361 Don't suggest stubs from legacy python-skeletons for auto import

GitOrigin-RevId: ec56e579d0240cb03b2f16bb468b7a1be6a95762
This commit is contained in:
Mikhail Golubev
2021-01-08 16:51:06 +00:00
committed by intellij-monorepo-bot
parent 8910b97535
commit 55e52c42b6
5 changed files with 38 additions and 3 deletions
@@ -10,6 +10,7 @@ import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.QualifiedName;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.codeInsight.PyCodeInsightSettings;
import com.jetbrains.python.codeInsight.userSkeletons.PyUserSkeletonsUtil;
import com.jetbrains.python.inspections.unresolvedReference.PyPackageAliasesProvider;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.PyFileImpl;
@@ -106,8 +107,10 @@ public class PyImportCollector {
private void addSymbolImportCandidates(PsiFile existingImportFile) {
Project project = myNode.getProject();
List<PsiNamedElement> symbols = new ArrayList<>(PyClassNameIndex.find(myRefText, project, true));
GlobalSearchScope scope = PySearchUtilBase.excludeSdkTestsScope(myNode);
GlobalSearchScope scope = PySearchUtilBase.excludeSdkTestsScope(myNode)
.intersectWith(GlobalSearchScope.notScope(PyUserSkeletonsUtil.getUserSkeletonsDirectoryScope(project)));
List<PsiNamedElement> symbols = new ArrayList<>(PyClassNameIndex.find(myRefText, project, scope));
if (!isQualifier()) {
symbols.addAll(PyFunctionNameIndex.find(myRefText, project, scope));
}
@@ -0,0 +1,2 @@
class MyView(<error descr="Unresolved reference 'View'">Vi<caret>ew</error>):
pass
@@ -0,0 +1 @@
<error descr="Unresolved reference 'django'">dj<caret>ango</error>.settings
@@ -20,7 +20,9 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.QualifiedName;
import com.intellij.util.ObjectUtils;
import com.intellij.util.Processor;
import com.intellij.util.containers.ContainerUtil;
@@ -29,10 +31,15 @@ import com.jetbrains.python.codeInsight.PyCodeInsightSettings;
import com.jetbrains.python.codeInsight.imports.AutoImportQuickFix;
import com.jetbrains.python.codeInsight.imports.ImportCandidateHolder;
import com.jetbrains.python.codeInsight.imports.PythonImportUtils;
import com.jetbrains.python.codeInsight.userSkeletons.PyUserSkeletonsUtil;
import com.jetbrains.python.formatter.PyCodeStyleSettings;
import com.jetbrains.python.inspections.unresolvedReference.PyUnresolvedReferencesInspection;
import com.jetbrains.python.psi.LanguageLevel;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyFile;
import com.jetbrains.python.psi.PyReferenceExpression;
import com.jetbrains.python.psi.stubs.PyClassNameIndex;
import com.jetbrains.python.psi.stubs.PyModuleNameIndex;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -129,7 +136,9 @@ public class PyAddImportQuickFixTest extends PyQuickFixTestCase {
// PY-25234
public void testUserSkeletonStdlibModule() {
doMultiFileAutoImportTest("Import 'alembic'");
runWithAdditionalClassEntryInSdkRoots(getTestName(true) + "/site-packages", () -> {
doMultiFileAutoImportTest("Import 'alembic'");
});
}
// PY-16176
@@ -326,6 +335,26 @@ public class PyAddImportQuickFixTest extends PyQuickFixTestCase {
doMultiFileAutoImportTest("Import 'matplotlib.pyplot as plt' locally");
}
// PY-46361
public void testPackagesFromPythonSkeletonsNotSuggested() {
GlobalSearchScope scope = GlobalSearchScope.allScope(myFixture.getProject());
List<PyFile> djangoPackages = PyModuleNameIndex.findByQualifiedName(QualifiedName.fromComponents("django"),
myFixture.getProject(), scope);
PyFile djangoPackage = assertOneElement(djangoPackages);
assertTrue(PyUserSkeletonsUtil.isUnderUserSkeletonsDirectory(djangoPackage));
doMultiFileNegativeTest("Import");
}
// PY-46361
public void testClassesFromPythonSkeletonsNotSuggested() {
PyClass djangoViewClass = PyClassNameIndex.findClass("django.views.generic.base.View", myFixture.getProject());
assertNotNull(djangoViewClass);
assertTrue(PyUserSkeletonsUtil.isUnderUserSkeletonsDirectory(djangoViewClass.getContainingFile()));
doMultiFileNegativeTest("Import");
}
private void doTestProposedImportsOrdering(String @NotNull ... expected) {
doMultiFileAutoImportTest("Import", fix -> {
final List<String> candidates = ContainerUtil.map(fix.getCandidates(), c -> c.getPresentableText());