diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromUsageFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromUsageFix.kt index 4a3fe857fbc..bcf554382c5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromUsageFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromUsageFix.kt @@ -122,14 +122,15 @@ open class CreateClassFromUsageFix protected constructor( } } } - if (classInfo.kind != ClassKind.ENUM_ENTRY) { + + if (classInfo.kind != ClassKind.ENUM_ENTRY && parents.find { it is PsiPackage } == null) { parents += SeparateFileWrapper(PsiManager.getInstance(project)) } } if (ApplicationManager.getApplication().isUnitTestMode) { val targetParent = applicableParents.firstOrNull { element -> - element.allChildren.any { it is PsiComment && it.text == "// TARGET_PARENT:" } + if (element is PsiPackage) false else element.allChildren.any { it is PsiComment && it.text == "// TARGET_PARENT:" } } ?: classInfo.applicableParents.last() return doInvoke(targetParent, editor, file) } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/kotlinRefactoringUtil.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/kotlinRefactoringUtil.kt index 56cd7648c95..100c1f72761 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/kotlinRefactoringUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/kotlinRefactoringUtil.kt @@ -38,6 +38,7 @@ import com.intellij.openapi.util.text.StringUtil import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.* +import com.intellij.psi.impl.file.PsiPackageBase import com.intellij.psi.impl.light.LightElement import com.intellij.psi.presentation.java.SymbolPresentationUtil import com.intellij.psi.util.PsiTreeUtil @@ -406,9 +407,13 @@ fun chooseContainerElement( return "$name$params" } - private fun PsiElement.renderText(): String { - if (this is SeparateFileWrapper) return "Extract to separate file" - return StringUtil.shortenTextWithEllipsis(text!!.collapseSpaces(), 53, 0) + private fun PsiElement.renderText(): String = when (this) { + is SeparateFileWrapper -> "Extract to separate file" + is PsiPackageBase -> qualifiedName + else -> { + val text = text ?: "" + StringUtil.shortenTextWithEllipsis(text.collapseSpaces(), 53, 0) + } } private fun PsiElement.getRepresentativeElement(): PsiElement = when (this) { diff --git a/idea/testData/multiModuleQuickFix/createClassFromUsageImport/header/a/b/B1.kt b/idea/testData/multiModuleQuickFix/createClassFromUsageImport/header/a/b/B1.kt new file mode 100644 index 00000000000..1c94ccf3a9b --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createClassFromUsageImport/header/a/b/B1.kt @@ -0,0 +1 @@ +package a.b \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createClassFromUsageImport/header/a/b/ClassG.after b/idea/testData/multiModuleQuickFix/createClassFromUsageImport/header/a/b/ClassG.after new file mode 100644 index 00000000000..aa228ab696e --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createClassFromUsageImport/header/a/b/ClassG.after @@ -0,0 +1,5 @@ +package a.b + +class ClassG { + +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createClassFromUsageImport/header/a/common.after b/idea/testData/multiModuleQuickFix/createClassFromUsageImport/header/a/common.after new file mode 100644 index 00000000000..ae32654a1f9 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createClassFromUsageImport/header/a/common.after @@ -0,0 +1,5 @@ +// "Create class 'ClassG'" "true" + +package a + +import a.b.ClassG \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createClassFromUsageImport/header/a/common.kt b/idea/testData/multiModuleQuickFix/createClassFromUsageImport/header/a/common.kt new file mode 100644 index 00000000000..5cbff5b5ef4 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createClassFromUsageImport/header/a/common.kt @@ -0,0 +1,6 @@ +// "Create class 'ClassG'" "true" +// ERROR: Unresolved reference: ClassG + +package a + +import a.b.ClassG \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createClassFromUsageRef/header/a/b/B1.kt b/idea/testData/multiModuleQuickFix/createClassFromUsageRef/header/a/b/B1.kt new file mode 100644 index 00000000000..1c94ccf3a9b --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createClassFromUsageRef/header/a/b/B1.kt @@ -0,0 +1 @@ +package a.b \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createClassFromUsageRef/header/a/b/ClassG.after b/idea/testData/multiModuleQuickFix/createClassFromUsageRef/header/a/b/ClassG.after new file mode 100644 index 00000000000..aa228ab696e --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createClassFromUsageRef/header/a/b/ClassG.after @@ -0,0 +1,5 @@ +package a.b + +class ClassG { + +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createClassFromUsageRef/header/a/common.after b/idea/testData/multiModuleQuickFix/createClassFromUsageRef/header/a/common.after new file mode 100644 index 00000000000..0ff55d2de9b --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createClassFromUsageRef/header/a/common.after @@ -0,0 +1,9 @@ +// "Create class 'ClassG'" "true" + +package a + +import a.b.ClassG + +fun test() { + ClassG() +} diff --git a/idea/testData/multiModuleQuickFix/createClassFromUsageRef/header/a/common.kt b/idea/testData/multiModuleQuickFix/createClassFromUsageRef/header/a/common.kt new file mode 100644 index 00000000000..5e36eee4dc3 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createClassFromUsageRef/header/a/common.kt @@ -0,0 +1,8 @@ +// "Create class 'ClassG'" "true" +// ERROR: Unresolved reference: ClassG + +package a + +fun test() { + a.b.ClassG() +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java index 82217c5e5d8..f3e44f4e572 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java @@ -199,6 +199,16 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul runTest("idea/testData/multiModuleQuickFix/convertPropertyGetterToInitializer/"); } + @TestMetadata("createClassFromUsageImport") + public void testCreateClassFromUsageImport() throws Exception { + runTest("idea/testData/multiModuleQuickFix/createClassFromUsageImport/"); + } + + @TestMetadata("createClassFromUsageRef") + public void testCreateClassFromUsageRef() throws Exception { + runTest("idea/testData/multiModuleQuickFix/createClassFromUsageRef/"); + } + @TestMetadata("createFunInExpectClass") public void testCreateFunInExpectClass() throws Exception { runTest("idea/testData/multiModuleQuickFix/createFunInExpectClass/");