From 5cdbe0964819fd57ca44605263f36459c925e3d3 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Thu, 1 Mar 2018 18:02:12 +0300 Subject: [PATCH] PY-16176 Existing imports are suggested first in auto import quickfix --- .../imports/ImportCandidateHolder.java | 1 + .../long/__init__.py | 0 .../long/pkg/__init__.py | 0 .../long/pkg/path/__init__.py | 6 ++++++ .../main.py | 4 ++++ .../short.py | 2 ++ .../main.py | 4 ++++ .../mod.py | 2 ++ .../quickFixes/PyAddImportQuickFixTest.java | 20 ++++++++++++++++++- 9 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfLonger/long/__init__.py create mode 100644 python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfLonger/long/pkg/__init__.py create mode 100644 python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfLonger/long/pkg/path/__init__.py create mode 100644 python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfLonger/main.py create mode 100644 python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfLonger/short.py create mode 100644 python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfNonProject/main.py create mode 100644 python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfNonProject/mod.py diff --git a/python/src/com/jetbrains/python/codeInsight/imports/ImportCandidateHolder.java b/python/src/com/jetbrains/python/codeInsight/imports/ImportCandidateHolder.java index a767bba92e3b..e80f593be376 100644 --- a/python/src/com/jetbrains/python/codeInsight/imports/ImportCandidateHolder.java +++ b/python/src/com/jetbrains/python/codeInsight/imports/ImportCandidateHolder.java @@ -177,6 +177,7 @@ public class ImportCandidateHolder implements Comparable } int getRelevance() { + if (myImportElement != null) return 4; final Project project = myImportable.getProject(); final PsiFile psiFile = myImportable.getContainingFile(); final VirtualFile vFile = psiFile == null ? null : psiFile.getVirtualFile(); diff --git a/python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfLonger/long/__init__.py b/python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfLonger/long/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfLonger/long/pkg/__init__.py b/python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfLonger/long/pkg/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfLonger/long/pkg/path/__init__.py b/python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfLonger/long/pkg/path/__init__.py new file mode 100644 index 000000000000..950f95854caf --- /dev/null +++ b/python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfLonger/long/pkg/path/__init__.py @@ -0,0 +1,6 @@ +class ClassA(object): + pass + + +class ClassB(object): + pass diff --git a/python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfLonger/main.py b/python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfLonger/main.py new file mode 100644 index 000000000000..714f9d3f4f4a --- /dev/null +++ b/python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfLonger/main.py @@ -0,0 +1,4 @@ +from long.pkg.path import ClassA + +print(ClassA()) +print(ClassB()) \ No newline at end of file diff --git a/python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfLonger/short.py b/python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfLonger/short.py new file mode 100644 index 000000000000..8b92a665d5c3 --- /dev/null +++ b/python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfLonger/short.py @@ -0,0 +1,2 @@ +class ClassB(object): + pass diff --git a/python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfNonProject/main.py b/python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfNonProject/main.py new file mode 100644 index 000000000000..e90976e90b4d --- /dev/null +++ b/python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfNonProject/main.py @@ -0,0 +1,4 @@ +from datetime import time + +print(time()) +print(datetime()) \ No newline at end of file diff --git a/python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfNonProject/mod.py b/python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfNonProject/mod.py new file mode 100644 index 000000000000..5d0c7d3d80bf --- /dev/null +++ b/python/testData/quickFixes/PyAddImportQuickFixTest/existingImportsAlwaysSuggestedFirstEvenIfNonProject/mod.py @@ -0,0 +1,2 @@ +class datetime: + pass diff --git a/python/testSrc/com/jetbrains/python/quickFixes/PyAddImportQuickFixTest.java b/python/testSrc/com/jetbrains/python/quickFixes/PyAddImportQuickFixTest.java index 9851cbc75f28..4fca126d0f5c 100644 --- a/python/testSrc/com/jetbrains/python/quickFixes/PyAddImportQuickFixTest.java +++ b/python/testSrc/com/jetbrains/python/quickFixes/PyAddImportQuickFixTest.java @@ -91,7 +91,25 @@ public class PyAddImportQuickFixTest extends PyQuickFixTestCase { public void testAllVariantsSuggestedWhenExistingNonProjectImportFits() { doMultiFileAutoImportTest("Import", quickfix -> { final List candidates = ContainerUtil.map(quickfix.getCandidates(), c -> c.getPresentableText("time")); - assertSameElements(candidates, "time", "time from datetime"); + assertOrderedEquals(candidates, "time from datetime", "time"); + return false; + }); + } + + // PY-16176 + public void testExistingImportsAlwaysSuggestedFirstEvenIfLonger() { + doMultiFileAutoImportTest("Import", quickfix -> { + final List candidates = ContainerUtil.map(quickfix.getCandidates(), c -> c.getPresentableText("ClassB")); + assertOrderedEquals(candidates, "ClassB from path", "short.ClassB"); + return false; + }); + } + + // PY-16176 + public void testExistingImportsAlwaysSuggestedFirstEvenIfNonProject() { + doMultiFileAutoImportTest("Import", quickfix -> { + final List candidates = ContainerUtil.map(quickfix.getCandidates(), c -> c.getPresentableText("datetime")); + assertOrderedEquals(candidates, "datetime from datetime", "mod.datetime"); return false; }); }