From dffb44c11c66a37ec78bc91a76ce3fd2093aca71 Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Fri, 2 Aug 2019 20:51:11 +0300 Subject: [PATCH] Create actual/expect quick fix should render super type correctly --- .../quickfix/expectactual/ExpectActualUtils.kt | 14 +++++++------- .../common/My.kt | 9 +++++++++ .../common/My.kt.after | 9 +++++++++ .../common/Other.kt | 5 +++++ .../common/Other.kt.after | 5 +++++ .../jvm/My.kt | 3 +++ .../jvm/My.kt.after | 8 ++++++++ .../common/My.kt | 4 ++++ .../common/My.kt.after | 9 +++++++++ .../common/Other.kt | 5 +++++ .../common/Other.kt.after | 5 +++++ .../jvm/My.kt | 8 ++++++++ .../jvm/My.kt.after | 8 ++++++++ .../quickfix/QuickFixMultiModuleTestGenerated.java | 10 ++++++++++ 14 files changed, 95 insertions(+), 7 deletions(-) create mode 100644 idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/common/My.kt create mode 100644 idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/common/My.kt.after create mode 100644 idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/common/Other.kt create mode 100644 idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/common/Other.kt.after create mode 100644 idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/jvm/My.kt create mode 100644 idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/jvm/My.kt.after create mode 100644 idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/common/My.kt create mode 100644 idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/common/My.kt.after create mode 100644 idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/common/Other.kt create mode 100644 idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/common/Other.kt.after create mode 100644 idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/jvm/My.kt create mode 100644 idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/jvm/My.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt index 2ce3bd7c475..523f4c2d057 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt @@ -11,6 +11,7 @@ import com.intellij.psi.JavaDirectoryService import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.project.implementedDescriptors import org.jetbrains.kotlin.idea.caches.resolve.analyzeWithContent +import org.jetbrains.kotlin.idea.codeInsight.shorten.addToBeShortenedDescendantsToWaitingSet import org.jetbrains.kotlin.idea.core.KotlinNameSuggester import org.jetbrains.kotlin.idea.core.findOrCreateDirectoryForPackage import org.jetbrains.kotlin.idea.core.getFqNameWithImplicitPrefix @@ -23,11 +24,8 @@ import org.jetbrains.kotlin.idea.core.overrideImplement.makeNotActual import org.jetbrains.kotlin.idea.core.toDescriptor import org.jetbrains.kotlin.idea.project.platform import org.jetbrains.kotlin.idea.refactoring.createKotlinFile +import org.jetbrains.kotlin.idea.util.* import org.jetbrains.kotlin.idea.util.application.runWriteAction -import org.jetbrains.kotlin.idea.util.hasDeclarationOf -import org.jetbrains.kotlin.idea.util.hasInlineModifier -import org.jetbrains.kotlin.idea.util.isEffectivelyActual -import org.jetbrains.kotlin.idea.util.module import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.FqName @@ -42,6 +40,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.types.AbbreviatedType import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.utils.addToStdlib.safeAs fun createFileForDeclaration(module: Module, declaration: KtNamedDeclaration): KtFile? { val fileName = declaration.name ?: return null @@ -123,12 +122,13 @@ internal fun KtPsiFactory.generateClassOrObject( val superType = context[BindingContext.TYPE, originalEntry.typeReference] val superClassDescriptor = superType?.constructor?.declarationDescriptor as? ClassDescriptor ?: return@forEach if (superClassDescriptor.kind == ClassKind.CLASS || superClassDescriptor.kind == ClassKind.ENUM_CLASS) { + val entryText = IdeDescriptorRenderers.SOURCE_CODE.renderType(superType) ?: return@forEach val newGeneratedEntry = if (generateExpectClass) { - createSuperTypeEntry(generatedEntry.typeReference!!.text) + createSuperTypeEntry(entryText) } else { - createSuperTypeCallEntry(generatedEntry.typeReference!!.text + "()") + createSuperTypeCallEntry("$entryText()") } - generatedEntry.replace(newGeneratedEntry) + generatedEntry.replace(newGeneratedEntry).safeAs()?.addToBeShortenedDescendantsToWaitingSet() } } if (generatedClass.isAnnotation()) { diff --git a/idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/common/My.kt b/idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/common/My.kt new file mode 100644 index 00000000000..d918f1738de --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/common/My.kt @@ -0,0 +1,9 @@ +// "Create actual class for module testModule_JVM (JVM)" "true" +// DISABLE-ERRORS + +package my + +import other.Another +import other.Other + +expect class My : Other \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/common/My.kt.after b/idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/common/My.kt.after new file mode 100644 index 00000000000..1459443e379 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/common/My.kt.after @@ -0,0 +1,9 @@ +// "Create actual class for module testModule_JVM (JVM)" "true" +// DISABLE-ERRORS + +package my + +import other.Another +import other.Other + +expect class My : Other \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/common/Other.kt b/idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/common/Other.kt new file mode 100644 index 00000000000..bdc9f49e0bc --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/common/Other.kt @@ -0,0 +1,5 @@ +package other + +class Other + +class Another \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/common/Other.kt.after b/idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/common/Other.kt.after new file mode 100644 index 00000000000..bdc9f49e0bc --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/common/Other.kt.after @@ -0,0 +1,5 @@ +package other + +class Other + +class Another \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/jvm/My.kt b/idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/jvm/My.kt new file mode 100644 index 00000000000..11bdfa1c30a --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/jvm/My.kt @@ -0,0 +1,3 @@ +// My: to be implemented +// DISABLE-ERRORS +package my diff --git a/idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/jvm/My.kt.after b/idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/jvm/My.kt.after new file mode 100644 index 00000000000..68879fd84c5 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/jvm/My.kt.after @@ -0,0 +1,8 @@ +// My: to be implemented +// DISABLE-ERRORS +package my + +import other.Another +import other.Other + +actual class My : Other() \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/common/My.kt b/idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/common/My.kt new file mode 100644 index 00000000000..3b316c94ec2 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/common/My.kt @@ -0,0 +1,4 @@ +// My: to be implemented +// DISABLE-ERRORS + +package my \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/common/My.kt.after b/idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/common/My.kt.after new file mode 100644 index 00000000000..1d16a12892d --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/common/My.kt.after @@ -0,0 +1,9 @@ +// My: to be implemented +// DISABLE-ERRORS + +package my + +import other.Another +import other.Other + +expect class My : Other \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/common/Other.kt b/idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/common/Other.kt new file mode 100644 index 00000000000..bdc9f49e0bc --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/common/Other.kt @@ -0,0 +1,5 @@ +package other + +class Other + +class Another \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/common/Other.kt.after b/idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/common/Other.kt.after new file mode 100644 index 00000000000..bdc9f49e0bc --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/common/Other.kt.after @@ -0,0 +1,5 @@ +package other + +class Other + +class Another \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/jvm/My.kt b/idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/jvm/My.kt new file mode 100644 index 00000000000..c4a913f2563 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/jvm/My.kt @@ -0,0 +1,8 @@ +// "Create expected class in common module testModule_Common" "true" +// DISABLE-ERRORS +package my + +import other.Another +import other.Other + +actual class My : Other() \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/jvm/My.kt.after b/idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/jvm/My.kt.after new file mode 100644 index 00000000000..f1d60ed8e96 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/jvm/My.kt.after @@ -0,0 +1,8 @@ +// "Create expected class in common module testModule_Common" "true" +// DISABLE-ERRORS +package my + +import other.Another +import other.Other + +actual class My : Other() \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java index 22a4a0f0023..5935758c1c0 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java @@ -204,6 +204,11 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul runTest("idea/testData/multiModuleQuickFix/convertPropertyToFunction/"); } + @TestMetadata("createActualClassWithSuperTypeFromOtherPackage") + public void testCreateActualClassWithSuperTypeFromOtherPackage() throws Exception { + runTest("idea/testData/multiModuleQuickFix/createActualClassWithSuperTypeFromOtherPackage/"); + } + @TestMetadata("createActualWithRootPackage") public void testCreateActualWithRootPackage() throws Exception { runTest("idea/testData/multiModuleQuickFix/createActualWithRootPackage/"); @@ -219,6 +224,11 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul runTest("idea/testData/multiModuleQuickFix/createClassFromUsageRef/"); } + @TestMetadata("createExpectClassWithSuperTypeFromOtherPackage") + public void testCreateExpectClassWithSuperTypeFromOtherPackage() throws Exception { + runTest("idea/testData/multiModuleQuickFix/createExpectClassWithSuperTypeFromOtherPackage/"); + } + @TestMetadata("createExpectWithRootPackage") public void testCreateExpectWithRootPackage() throws Exception { runTest("idea/testData/multiModuleQuickFix/createExpectWithRootPackage/");