From f392777e01f251ddbf110af1e1fa10774d063faf Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Mon, 22 Jul 2024 16:25:37 +0300 Subject: [PATCH] PY-44858 Create regular packages in refactorings initiated from top-level files in source/content roots Otherwise, if someone wants to move a definition/extract a superclass from there to a brand-new package, e.g. from main.py to pkg/mod.py, a namespace "pkg" package will be created. Restore the original behavior of PyExtractSuperclassTest.testMultifileNew: the origin file was inside a regular project root without __init__.py alongside. GitOrigin-RevId: 750414b18582740076c14bfcfd07fa38992b4428 --- .../jetbrains/python/psi/resolve/PyNamespacePackageUtil.kt | 1 + .../after/src/main.py} | 0 .../after/src/pkg}/__init__.py | 0 .../after/src/pkg/subpkg/__init__.py | 0 .../after/src/pkg/subpkg/b.py | 2 ++ .../before/src/main.py | 2 ++ .../com/jetbrains/python/refactoring/PyMoveTest.java | 6 ++++++ 7 files changed, 11 insertions(+) rename python/testData/refactoring/{extractsuperclass/multifileNew/after/__init__.py => move/moveSymbolFromTopLevelModuleToNewPackageCreatesInitPy/after/src/main.py} (100%) rename python/testData/refactoring/{extractsuperclass/multifileNew/before => move/moveSymbolFromTopLevelModuleToNewPackageCreatesInitPy/after/src/pkg}/__init__.py (100%) create mode 100644 python/testData/refactoring/move/moveSymbolFromTopLevelModuleToNewPackageCreatesInitPy/after/src/pkg/subpkg/__init__.py create mode 100644 python/testData/refactoring/move/moveSymbolFromTopLevelModuleToNewPackageCreatesInitPy/after/src/pkg/subpkg/b.py create mode 100644 python/testData/refactoring/move/moveSymbolFromTopLevelModuleToNewPackageCreatesInitPy/before/src/main.py diff --git a/python/python-psi-impl/src/com/jetbrains/python/psi/resolve/PyNamespacePackageUtil.kt b/python/python-psi-impl/src/com/jetbrains/python/psi/resolve/PyNamespacePackageUtil.kt index 2fb953d80726..1ecf92334eec 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/psi/resolve/PyNamespacePackageUtil.kt +++ b/python/python-psi-impl/src/com/jetbrains/python/psi/resolve/PyNamespacePackageUtil.kt @@ -41,6 +41,7 @@ fun isNamespacePackage(element: PsiElement): Boolean { fun isInNamespacePackage(element: PsiElement): Boolean { val myFile = element.containingFile ?: return false val parentDirectory = myFile.containingDirectory + if (parentDirectory.virtualFile in PyUtil.getSourceRoots(element)) return false return parentDirectory != null && isNamespacePackage(parentDirectory) } diff --git a/python/testData/refactoring/extractsuperclass/multifileNew/after/__init__.py b/python/testData/refactoring/move/moveSymbolFromTopLevelModuleToNewPackageCreatesInitPy/after/src/main.py similarity index 100% rename from python/testData/refactoring/extractsuperclass/multifileNew/after/__init__.py rename to python/testData/refactoring/move/moveSymbolFromTopLevelModuleToNewPackageCreatesInitPy/after/src/main.py diff --git a/python/testData/refactoring/extractsuperclass/multifileNew/before/__init__.py b/python/testData/refactoring/move/moveSymbolFromTopLevelModuleToNewPackageCreatesInitPy/after/src/pkg/__init__.py similarity index 100% rename from python/testData/refactoring/extractsuperclass/multifileNew/before/__init__.py rename to python/testData/refactoring/move/moveSymbolFromTopLevelModuleToNewPackageCreatesInitPy/after/src/pkg/__init__.py diff --git a/python/testData/refactoring/move/moveSymbolFromTopLevelModuleToNewPackageCreatesInitPy/after/src/pkg/subpkg/__init__.py b/python/testData/refactoring/move/moveSymbolFromTopLevelModuleToNewPackageCreatesInitPy/after/src/pkg/subpkg/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/refactoring/move/moveSymbolFromTopLevelModuleToNewPackageCreatesInitPy/after/src/pkg/subpkg/b.py b/python/testData/refactoring/move/moveSymbolFromTopLevelModuleToNewPackageCreatesInitPy/after/src/pkg/subpkg/b.py new file mode 100644 index 000000000000..07d9e0efebfa --- /dev/null +++ b/python/testData/refactoring/move/moveSymbolFromTopLevelModuleToNewPackageCreatesInitPy/after/src/pkg/subpkg/b.py @@ -0,0 +1,2 @@ +class MyClass: + pass diff --git a/python/testData/refactoring/move/moveSymbolFromTopLevelModuleToNewPackageCreatesInitPy/before/src/main.py b/python/testData/refactoring/move/moveSymbolFromTopLevelModuleToNewPackageCreatesInitPy/before/src/main.py new file mode 100644 index 000000000000..1dea43b79188 --- /dev/null +++ b/python/testData/refactoring/move/moveSymbolFromTopLevelModuleToNewPackageCreatesInitPy/before/src/main.py @@ -0,0 +1,2 @@ +class MyClass: + pass \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/refactoring/PyMoveTest.java b/python/testSrc/com/jetbrains/python/refactoring/PyMoveTest.java index 710eab0b22a4..ef23ffde9920 100644 --- a/python/testSrc/com/jetbrains/python/refactoring/PyMoveTest.java +++ b/python/testSrc/com/jetbrains/python/refactoring/PyMoveTest.java @@ -427,6 +427,12 @@ public class PyMoveTest extends PyTestCase { }); } + public void testMoveSymbolFromTopLevelModuleToNewPackageCreatesInitPy() { + doComparingDirectories(testDir -> { + moveSymbols(testDir, "pkg/subpkg/b.py", "MyClass"); + }); + } + //PY-44858 public void testMoveNotCreateInitPyForNamespacePackagesToAnotherDirectory() { doMoveSymbolsTest("pkg/subpkg/B/module_b.py", "myfunc");