From c6222fa129e27efd630159b0b5a7ddb619666ed4 Mon Sep 17 00:00:00 2001 From: Petr Date: Thu, 2 Oct 2025 15:36:45 +0200 Subject: [PATCH] PY-83529 Add tests for binary skeletons resolution (cherry picked from commit 419975ed4ccbc4690cabe4f57307b0d6ad4fbc1e) GitOrigin-RevId: cff0c0137a2f0b51ded1da567baf6fa9ed7c5e6f --- .../from_import_binary.after.py | 1 + .../from_import_binary.py | 1 + .../import_and_reference_binary.after.py | 3 ++ .../import_and_reference_binary.py | 3 ++ .../import_attribute_from_binary.after.py | 1 + .../import_attribute_from_binary.py | 1 + .../import_binary.after.py | 1 + .../import_binary.py | 1 + .../python_stubs/pkg/__init__.py | 0 .../python_stubs/pkg/subpkg/__init__.py | 0 .../python_stubs/pkg/subpkg/binary.py | 2 ++ .../site-packages/pkg/subpkg/__init__.py | 0 .../from_import_binary.after.py | 1 + .../from_import_binary.py | 1 + .../import_and_reference_binary.after.py | 3 ++ .../import_and_reference_binary.py | 3 ++ .../import_attribute_from_binary.after.py | 1 + .../import_attribute_from_binary.py | 1 + .../import_binary.after.py | 1 + .../import_binary.py | 1 + .../python_stubs/pkg/__init__.py | 0 .../python_stubs/pkg/subpkg/__init__.py | 0 .../python_stubs/pkg/subpkg/binary.py | 2 ++ .../site-packages/pkg/subpkg/.gitkeep | 0 .../from_import_binary.py | 2 ++ .../import_and_reference_binary.py | 4 +++ .../import_binary.py | 2 ++ .../python_stubs/pkg/__init__.py | 0 .../python_stubs/pkg/subpkg/__init__.py | 0 .../python_stubs/pkg/subpkg/binary.py | 0 .../site-packages/pkg/subpkg/__init__.py | 0 .../jetbrains/python/Py3CompletionTest.java | 32 +++++++++++++++++++ .../python/PyMultiFileResolveTest.java | 15 ++++++++- 33 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 python/testData/completion/importNestedBinarySubModule/from_import_binary.after.py create mode 100644 python/testData/completion/importNestedBinarySubModule/from_import_binary.py create mode 100644 python/testData/completion/importNestedBinarySubModule/import_and_reference_binary.after.py create mode 100644 python/testData/completion/importNestedBinarySubModule/import_and_reference_binary.py create mode 100644 python/testData/completion/importNestedBinarySubModule/import_attribute_from_binary.after.py create mode 100644 python/testData/completion/importNestedBinarySubModule/import_attribute_from_binary.py create mode 100644 python/testData/completion/importNestedBinarySubModule/import_binary.after.py create mode 100644 python/testData/completion/importNestedBinarySubModule/import_binary.py create mode 100644 python/testData/completion/importNestedBinarySubModule/python_stubs/pkg/__init__.py create mode 100644 python/testData/completion/importNestedBinarySubModule/python_stubs/pkg/subpkg/__init__.py create mode 100644 python/testData/completion/importNestedBinarySubModule/python_stubs/pkg/subpkg/binary.py create mode 100644 python/testData/completion/importNestedBinarySubModule/site-packages/pkg/subpkg/__init__.py create mode 100644 python/testData/completion/importNestedBinarySubModuleNoInitPy/from_import_binary.after.py create mode 100644 python/testData/completion/importNestedBinarySubModuleNoInitPy/from_import_binary.py create mode 100644 python/testData/completion/importNestedBinarySubModuleNoInitPy/import_and_reference_binary.after.py create mode 100644 python/testData/completion/importNestedBinarySubModuleNoInitPy/import_and_reference_binary.py create mode 100644 python/testData/completion/importNestedBinarySubModuleNoInitPy/import_attribute_from_binary.after.py create mode 100644 python/testData/completion/importNestedBinarySubModuleNoInitPy/import_attribute_from_binary.py create mode 100644 python/testData/completion/importNestedBinarySubModuleNoInitPy/import_binary.after.py create mode 100644 python/testData/completion/importNestedBinarySubModuleNoInitPy/import_binary.py create mode 100644 python/testData/completion/importNestedBinarySubModuleNoInitPy/python_stubs/pkg/__init__.py create mode 100644 python/testData/completion/importNestedBinarySubModuleNoInitPy/python_stubs/pkg/subpkg/__init__.py create mode 100644 python/testData/completion/importNestedBinarySubModuleNoInitPy/python_stubs/pkg/subpkg/binary.py create mode 100644 python/testData/completion/importNestedBinarySubModuleNoInitPy/site-packages/pkg/subpkg/.gitkeep create mode 100644 python/testData/resolve/multiFile/importNestedBinarySubModule/from_import_binary.py create mode 100644 python/testData/resolve/multiFile/importNestedBinarySubModule/import_and_reference_binary.py create mode 100644 python/testData/resolve/multiFile/importNestedBinarySubModule/import_binary.py create mode 100644 python/testData/resolve/multiFile/importNestedBinarySubModule/python_stubs/pkg/__init__.py create mode 100644 python/testData/resolve/multiFile/importNestedBinarySubModule/python_stubs/pkg/subpkg/__init__.py create mode 100644 python/testData/resolve/multiFile/importNestedBinarySubModule/python_stubs/pkg/subpkg/binary.py create mode 100644 python/testData/resolve/multiFile/importNestedBinarySubModule/site-packages/pkg/subpkg/__init__.py diff --git a/python/testData/completion/importNestedBinarySubModule/from_import_binary.after.py b/python/testData/completion/importNestedBinarySubModule/from_import_binary.after.py new file mode 100644 index 000000000000..b36b99a97c3b --- /dev/null +++ b/python/testData/completion/importNestedBinarySubModule/from_import_binary.after.py @@ -0,0 +1 @@ +from pkg.subpkg import binary diff --git a/python/testData/completion/importNestedBinarySubModule/from_import_binary.py b/python/testData/completion/importNestedBinarySubModule/from_import_binary.py new file mode 100644 index 000000000000..79bda85cd939 --- /dev/null +++ b/python/testData/completion/importNestedBinarySubModule/from_import_binary.py @@ -0,0 +1 @@ +from pkg.subpkg import diff --git a/python/testData/completion/importNestedBinarySubModule/import_and_reference_binary.after.py b/python/testData/completion/importNestedBinarySubModule/import_and_reference_binary.after.py new file mode 100644 index 000000000000..151525a93641 --- /dev/null +++ b/python/testData/completion/importNestedBinarySubModule/import_and_reference_binary.after.py @@ -0,0 +1,3 @@ +import pkg.subpkg.binary + +pkg.subpkg.binary \ No newline at end of file diff --git a/python/testData/completion/importNestedBinarySubModule/import_and_reference_binary.py b/python/testData/completion/importNestedBinarySubModule/import_and_reference_binary.py new file mode 100644 index 000000000000..10e840412ba3 --- /dev/null +++ b/python/testData/completion/importNestedBinarySubModule/import_and_reference_binary.py @@ -0,0 +1,3 @@ +import pkg.subpkg.binary + +pkg.subpkg. \ No newline at end of file diff --git a/python/testData/completion/importNestedBinarySubModule/import_attribute_from_binary.after.py b/python/testData/completion/importNestedBinarySubModule/import_attribute_from_binary.after.py new file mode 100644 index 000000000000..ec397d3ea4d2 --- /dev/null +++ b/python/testData/completion/importNestedBinarySubModule/import_attribute_from_binary.after.py @@ -0,0 +1 @@ +from pkg.subpkg.binary import func \ No newline at end of file diff --git a/python/testData/completion/importNestedBinarySubModule/import_attribute_from_binary.py b/python/testData/completion/importNestedBinarySubModule/import_attribute_from_binary.py new file mode 100644 index 000000000000..731e13361dec --- /dev/null +++ b/python/testData/completion/importNestedBinarySubModule/import_attribute_from_binary.py @@ -0,0 +1 @@ +from pkg.subpkg.binary import \ No newline at end of file diff --git a/python/testData/completion/importNestedBinarySubModule/import_binary.after.py b/python/testData/completion/importNestedBinarySubModule/import_binary.after.py new file mode 100644 index 000000000000..8a181313c89c --- /dev/null +++ b/python/testData/completion/importNestedBinarySubModule/import_binary.after.py @@ -0,0 +1 @@ +import pkg.subpkg.binary diff --git a/python/testData/completion/importNestedBinarySubModule/import_binary.py b/python/testData/completion/importNestedBinarySubModule/import_binary.py new file mode 100644 index 000000000000..6fcd31b706e5 --- /dev/null +++ b/python/testData/completion/importNestedBinarySubModule/import_binary.py @@ -0,0 +1 @@ +import pkg.subpkg. diff --git a/python/testData/completion/importNestedBinarySubModule/python_stubs/pkg/__init__.py b/python/testData/completion/importNestedBinarySubModule/python_stubs/pkg/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/completion/importNestedBinarySubModule/python_stubs/pkg/subpkg/__init__.py b/python/testData/completion/importNestedBinarySubModule/python_stubs/pkg/subpkg/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/completion/importNestedBinarySubModule/python_stubs/pkg/subpkg/binary.py b/python/testData/completion/importNestedBinarySubModule/python_stubs/pkg/subpkg/binary.py new file mode 100644 index 000000000000..2678676a144e --- /dev/null +++ b/python/testData/completion/importNestedBinarySubModule/python_stubs/pkg/subpkg/binary.py @@ -0,0 +1,2 @@ +def func(): + ... \ No newline at end of file diff --git a/python/testData/completion/importNestedBinarySubModule/site-packages/pkg/subpkg/__init__.py b/python/testData/completion/importNestedBinarySubModule/site-packages/pkg/subpkg/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/completion/importNestedBinarySubModuleNoInitPy/from_import_binary.after.py b/python/testData/completion/importNestedBinarySubModuleNoInitPy/from_import_binary.after.py new file mode 100644 index 000000000000..b36b99a97c3b --- /dev/null +++ b/python/testData/completion/importNestedBinarySubModuleNoInitPy/from_import_binary.after.py @@ -0,0 +1 @@ +from pkg.subpkg import binary diff --git a/python/testData/completion/importNestedBinarySubModuleNoInitPy/from_import_binary.py b/python/testData/completion/importNestedBinarySubModuleNoInitPy/from_import_binary.py new file mode 100644 index 000000000000..79bda85cd939 --- /dev/null +++ b/python/testData/completion/importNestedBinarySubModuleNoInitPy/from_import_binary.py @@ -0,0 +1 @@ +from pkg.subpkg import diff --git a/python/testData/completion/importNestedBinarySubModuleNoInitPy/import_and_reference_binary.after.py b/python/testData/completion/importNestedBinarySubModuleNoInitPy/import_and_reference_binary.after.py new file mode 100644 index 000000000000..151525a93641 --- /dev/null +++ b/python/testData/completion/importNestedBinarySubModuleNoInitPy/import_and_reference_binary.after.py @@ -0,0 +1,3 @@ +import pkg.subpkg.binary + +pkg.subpkg.binary \ No newline at end of file diff --git a/python/testData/completion/importNestedBinarySubModuleNoInitPy/import_and_reference_binary.py b/python/testData/completion/importNestedBinarySubModuleNoInitPy/import_and_reference_binary.py new file mode 100644 index 000000000000..10e840412ba3 --- /dev/null +++ b/python/testData/completion/importNestedBinarySubModuleNoInitPy/import_and_reference_binary.py @@ -0,0 +1,3 @@ +import pkg.subpkg.binary + +pkg.subpkg. \ No newline at end of file diff --git a/python/testData/completion/importNestedBinarySubModuleNoInitPy/import_attribute_from_binary.after.py b/python/testData/completion/importNestedBinarySubModuleNoInitPy/import_attribute_from_binary.after.py new file mode 100644 index 000000000000..ec397d3ea4d2 --- /dev/null +++ b/python/testData/completion/importNestedBinarySubModuleNoInitPy/import_attribute_from_binary.after.py @@ -0,0 +1 @@ +from pkg.subpkg.binary import func \ No newline at end of file diff --git a/python/testData/completion/importNestedBinarySubModuleNoInitPy/import_attribute_from_binary.py b/python/testData/completion/importNestedBinarySubModuleNoInitPy/import_attribute_from_binary.py new file mode 100644 index 000000000000..731e13361dec --- /dev/null +++ b/python/testData/completion/importNestedBinarySubModuleNoInitPy/import_attribute_from_binary.py @@ -0,0 +1 @@ +from pkg.subpkg.binary import \ No newline at end of file diff --git a/python/testData/completion/importNestedBinarySubModuleNoInitPy/import_binary.after.py b/python/testData/completion/importNestedBinarySubModuleNoInitPy/import_binary.after.py new file mode 100644 index 000000000000..8a181313c89c --- /dev/null +++ b/python/testData/completion/importNestedBinarySubModuleNoInitPy/import_binary.after.py @@ -0,0 +1 @@ +import pkg.subpkg.binary diff --git a/python/testData/completion/importNestedBinarySubModuleNoInitPy/import_binary.py b/python/testData/completion/importNestedBinarySubModuleNoInitPy/import_binary.py new file mode 100644 index 000000000000..6fcd31b706e5 --- /dev/null +++ b/python/testData/completion/importNestedBinarySubModuleNoInitPy/import_binary.py @@ -0,0 +1 @@ +import pkg.subpkg. diff --git a/python/testData/completion/importNestedBinarySubModuleNoInitPy/python_stubs/pkg/__init__.py b/python/testData/completion/importNestedBinarySubModuleNoInitPy/python_stubs/pkg/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/completion/importNestedBinarySubModuleNoInitPy/python_stubs/pkg/subpkg/__init__.py b/python/testData/completion/importNestedBinarySubModuleNoInitPy/python_stubs/pkg/subpkg/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/completion/importNestedBinarySubModuleNoInitPy/python_stubs/pkg/subpkg/binary.py b/python/testData/completion/importNestedBinarySubModuleNoInitPy/python_stubs/pkg/subpkg/binary.py new file mode 100644 index 000000000000..2678676a144e --- /dev/null +++ b/python/testData/completion/importNestedBinarySubModuleNoInitPy/python_stubs/pkg/subpkg/binary.py @@ -0,0 +1,2 @@ +def func(): + ... \ No newline at end of file diff --git a/python/testData/completion/importNestedBinarySubModuleNoInitPy/site-packages/pkg/subpkg/.gitkeep b/python/testData/completion/importNestedBinarySubModuleNoInitPy/site-packages/pkg/subpkg/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/resolve/multiFile/importNestedBinarySubModule/from_import_binary.py b/python/testData/resolve/multiFile/importNestedBinarySubModule/from_import_binary.py new file mode 100644 index 000000000000..819ccb137089 --- /dev/null +++ b/python/testData/resolve/multiFile/importNestedBinarySubModule/from_import_binary.py @@ -0,0 +1,2 @@ +from pkg.subpkg import binary +# diff --git a/python/testData/resolve/multiFile/importNestedBinarySubModule/import_and_reference_binary.py b/python/testData/resolve/multiFile/importNestedBinarySubModule/import_and_reference_binary.py new file mode 100644 index 000000000000..99163e4f5e3d --- /dev/null +++ b/python/testData/resolve/multiFile/importNestedBinarySubModule/import_and_reference_binary.py @@ -0,0 +1,4 @@ +import pkg.subpkg.binary + +print(pkg.subpkg.binary) +# \ No newline at end of file diff --git a/python/testData/resolve/multiFile/importNestedBinarySubModule/import_binary.py b/python/testData/resolve/multiFile/importNestedBinarySubModule/import_binary.py new file mode 100644 index 000000000000..d8f4b74f32b6 --- /dev/null +++ b/python/testData/resolve/multiFile/importNestedBinarySubModule/import_binary.py @@ -0,0 +1,2 @@ +import pkg.subpkg.binary +# diff --git a/python/testData/resolve/multiFile/importNestedBinarySubModule/python_stubs/pkg/__init__.py b/python/testData/resolve/multiFile/importNestedBinarySubModule/python_stubs/pkg/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/resolve/multiFile/importNestedBinarySubModule/python_stubs/pkg/subpkg/__init__.py b/python/testData/resolve/multiFile/importNestedBinarySubModule/python_stubs/pkg/subpkg/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/resolve/multiFile/importNestedBinarySubModule/python_stubs/pkg/subpkg/binary.py b/python/testData/resolve/multiFile/importNestedBinarySubModule/python_stubs/pkg/subpkg/binary.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/resolve/multiFile/importNestedBinarySubModule/site-packages/pkg/subpkg/__init__.py b/python/testData/resolve/multiFile/importNestedBinarySubModule/site-packages/pkg/subpkg/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testSrc/com/jetbrains/python/Py3CompletionTest.java b/python/testSrc/com/jetbrains/python/Py3CompletionTest.java index f66b4ef7b321..6c2977f8606e 100644 --- a/python/testSrc/com/jetbrains/python/Py3CompletionTest.java +++ b/python/testSrc/com/jetbrains/python/Py3CompletionTest.java @@ -861,6 +861,38 @@ public class Py3CompletionTest extends PyTestCase { ); } + public void testImportNestedBinarySubModule() { + final String testDir = getTestName(true); + runWithAdditionalClassEntryInSdkRoots(testDir + "/site-packages", () -> { + runWithAdditionalClassEntryInSdkRoots(testDir + "/python_stubs", () -> { + for (String fileName : List.of("import_binary", + "from_import_binary", + "import_attribute_from_binary", + "import_and_reference_binary")) { + myFixture.configureByFile("%s/%s.py".formatted(testDir, fileName)); + myFixture.completeBasic(); + myFixture.checkResultByFile("%s/%s.after.py".formatted(testDir, fileName)); + } + }); + }); + } + + public void testImportNestedBinarySubModuleNoInitPy() { + final String testDir = getTestName(true); + runWithAdditionalClassEntryInSdkRoots(testDir + "/site-packages", () -> { + runWithAdditionalClassEntryInSdkRoots(testDir + "/python_stubs", () -> { + for (String fileName : List.of("import_binary", + "from_import_binary", + "import_attribute_from_binary", + "import_and_reference_binary")) { + myFixture.configureByFile("%s/%s.py".formatted(testDir, fileName)); + myFixture.completeBasic(); + myFixture.checkResultByFile("%s/%s.after.py".formatted(testDir, fileName)); + } + }); + }); + } + private void doTestVariants(String @NotNull ... expected) { final String testName = getTestName(true); myFixture.configureByFile(testName + ".py"); diff --git a/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java b/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java index f72a510c458a..f308c40e64c9 100644 --- a/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java +++ b/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java @@ -624,7 +624,20 @@ public class PyMultiFileResolveTest extends PyMultiFileResolveTestCase { runWithAdditionalClassEntryInSdkRoots(testDir + "/site-packages", () -> { runWithAdditionalClassEntryInSdkRoots(testDir + "/python_stubs", () -> { PsiFile file = myFixture.configureByFile(testDir + "/ImportAttributeFromNestedBinarySubModule.py"); - assertResolveResult(doResolve(file), PyFunction.class, "func", null); + assertResolveResult(doResolve(file), PyFunction.class, "func", "binary.py"); + }); + }); + } + + public void testImportNestedBinarySubModule() { + final String testDir = getTestName(true); + runWithAdditionalClassEntryInSdkRoots(testDir + "/site-packages", () -> { + runWithAdditionalClassEntryInSdkRoots(testDir + "/python_stubs", () -> { + for (PsiFile file : myFixture.configureByFiles(testDir + "/import_binary.py", + testDir + "/import_and_reference_binary.py", + testDir + "/from_import_binary.py")) { + assertResolveResult(doResolve(file), PyFile.class, "binary.py", null); + } }); }); }