From aaaf2828d95aa8f36e5ddcba4709b9501393f84d Mon Sep 17 00:00:00 2001 From: Aleksei Kniazev Date: Mon, 23 Sep 2019 18:58:51 +0300 Subject: [PATCH] regression with moving future import to the top, test for extended completion (PY-23475) GitOrigin-RevId: 218984c89d2229b6a32947650f46df4f1c3aecef --- .../python/codeInsight/imports/AddImportHelper.java | 4 ++++ .../importAddedAfterModuleLevelDunder.after.py | 7 +++++++ .../importAddedAfterModuleLevelDunder.py | 6 ++++++ .../className/importAddedAfterModuleLevelDunder/src.py | 2 ++ .../MoveFromFutureImportAboveModuleLevelDunder.py | 6 ++++++ .../MoveFromFutureImportAboveModuleLevelDunder_after.py | 7 +++++++ .../com/jetbrains/python/PyClassNameCompletionTest.java | 5 +++++ python/testSrc/com/jetbrains/python/PyQuickFixTest.java | 5 +++++ 8 files changed, 42 insertions(+) create mode 100644 python/testData/completion/className/importAddedAfterModuleLevelDunder/importAddedAfterModuleLevelDunder.after.py create mode 100644 python/testData/completion/className/importAddedAfterModuleLevelDunder/importAddedAfterModuleLevelDunder.py create mode 100644 python/testData/completion/className/importAddedAfterModuleLevelDunder/src.py create mode 100644 python/testData/inspections/MoveFromFutureImportAboveModuleLevelDunder.py create mode 100644 python/testData/inspections/MoveFromFutureImportAboveModuleLevelDunder_after.py diff --git a/python/python-psi-impl/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java b/python/python-psi-impl/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java index 2e4f2f768626..7e379a756d3b 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java +++ b/python/python-psi-impl/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java @@ -217,6 +217,10 @@ public class AddImportHelper { seeker = feeler; } else if (isAssignmentToModuleLevelDunderName(feeler)) { + if (priority == ImportPriority.FUTURE) { + seeker = feeler; + break; + } feeler = feeler.getNextSibling(); seeker = feeler; skippedOverStatements = true; diff --git a/python/testData/completion/className/importAddedAfterModuleLevelDunder/importAddedAfterModuleLevelDunder.after.py b/python/testData/completion/className/importAddedAfterModuleLevelDunder/importAddedAfterModuleLevelDunder.after.py new file mode 100644 index 000000000000..46ed32f03028 --- /dev/null +++ b/python/testData/completion/className/importAddedAfterModuleLevelDunder/importAddedAfterModuleLevelDunder.after.py @@ -0,0 +1,7 @@ +"""Module docstring""" + +__author__ = "aknizev" + +from src import foo + +foo() \ No newline at end of file diff --git a/python/testData/completion/className/importAddedAfterModuleLevelDunder/importAddedAfterModuleLevelDunder.py b/python/testData/completion/className/importAddedAfterModuleLevelDunder/importAddedAfterModuleLevelDunder.py new file mode 100644 index 000000000000..0ba19c9145b7 --- /dev/null +++ b/python/testData/completion/className/importAddedAfterModuleLevelDunder/importAddedAfterModuleLevelDunder.py @@ -0,0 +1,6 @@ +"""Module docstring""" + +__author__ = "aknizev" + + +foo \ No newline at end of file diff --git a/python/testData/completion/className/importAddedAfterModuleLevelDunder/src.py b/python/testData/completion/className/importAddedAfterModuleLevelDunder/src.py new file mode 100644 index 000000000000..6584985db844 --- /dev/null +++ b/python/testData/completion/className/importAddedAfterModuleLevelDunder/src.py @@ -0,0 +1,2 @@ +def foo(): + pass \ No newline at end of file diff --git a/python/testData/inspections/MoveFromFutureImportAboveModuleLevelDunder.py b/python/testData/inspections/MoveFromFutureImportAboveModuleLevelDunder.py new file mode 100644 index 000000000000..e03fa77943da --- /dev/null +++ b/python/testData/inspections/MoveFromFutureImportAboveModuleLevelDunder.py @@ -0,0 +1,6 @@ +"""Module docstring""" + +__author__ = "akniazev" + +from __future__ import absolute_import +import collections \ No newline at end of file diff --git a/python/testData/inspections/MoveFromFutureImportAboveModuleLevelDunder_after.py b/python/testData/inspections/MoveFromFutureImportAboveModuleLevelDunder_after.py new file mode 100644 index 000000000000..7037b8b25d21 --- /dev/null +++ b/python/testData/inspections/MoveFromFutureImportAboveModuleLevelDunder_after.py @@ -0,0 +1,7 @@ +"""Module docstring""" + +from __future__ import absolute_import + +__author__ = "akniazev" + +import collections \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyClassNameCompletionTest.java b/python/testSrc/com/jetbrains/python/PyClassNameCompletionTest.java index 026a858c23b0..5ad2c894854c 100644 --- a/python/testSrc/com/jetbrains/python/PyClassNameCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PyClassNameCompletionTest.java @@ -96,6 +96,11 @@ public class PyClassNameCompletionTest extends PyTestCase { doTest(); } + // PY-23475 + public void testImportAddedAfterModuleLevelDunder() { + doTest(); + } + // PY-20976 public void testOrderingLexicographicalBaseline() { doTestCompletionOrder("a.foo", "b.foo"); diff --git a/python/testSrc/com/jetbrains/python/PyQuickFixTest.java b/python/testSrc/com/jetbrains/python/PyQuickFixTest.java index c8ec567a3d3b..a55487021eed 100644 --- a/python/testSrc/com/jetbrains/python/PyQuickFixTest.java +++ b/python/testSrc/com/jetbrains/python/PyQuickFixTest.java @@ -186,6 +186,11 @@ public class PyQuickFixTest extends PyTestCase { doInspectionTest(PyFromFutureImportInspection.class, PyBundle.message("QFIX.move.from.future.import"), true, true); } + // PY-23475 + public void testMoveFromFutureImportAboveModuleLevelDunder() { + doInspectionTest(PyFromFutureImportInspection.class, PyBundle.message("QFIX.move.from.future.import"), true, true); + } + public void testComparisonWithNone() { doInspectionTest(PyComparisonWithNoneInspection.class, PyBundle.message("QFIX.replace.equality"), true, true); }