From fe7b7fb0bda88760abd22fe137b9ba052d8ee8a5 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 2 Mar 2018 16:24:34 +0300 Subject: [PATCH] Create actual fix: add empty brackets for classes in super-type lists Related to KT-21082 --- .../idea/quickfix/expectactual/CreateActualFix.kt | 12 ++++++++++++ .../multiModuleQuickFix/sealed/js/Sealed.kt.after | 4 ++-- .../sealedSubclass/js/Sealed.kt.after | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateActualFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateActualFix.kt index e9a6616ed3f..63d1f665b6e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateActualFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateActualFix.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.DiagnosticFactory import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo import org.jetbrains.kotlin.idea.core.* import org.jetbrains.kotlin.idea.highlighter.markers.actualsForExpected @@ -41,6 +42,7 @@ import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier +import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.MultiTargetPlatform import org.jetbrains.kotlin.resolve.getMultiTargetPlatform @@ -259,6 +261,16 @@ internal fun KtPsiFactory.generateClassOrObjectByExpectedClass( } } + val context = expectedClass.analyze() + actualClass.superTypeListEntries.zip(expectedClass.superTypeListEntries).forEach { (actualEntry, expectedEntry) -> + if (actualEntry !is KtSuperTypeEntry) return@forEach + val superType = context[BindingContext.TYPE, expectedEntry.typeReference] + val superClassDescriptor = superType?.constructor?.declarationDescriptor as? ClassDescriptor ?: return@forEach + if (superClassDescriptor.kind == ClassKind.CLASS || superClassDescriptor.kind == ClassKind.ENUM_CLASS) { + actualEntry.replace(createSuperTypeCallEntry("${actualEntry.typeReference!!.text}()")) + } + } + declLoop@ for (expectedDeclaration in expectedClass.declarations.filter { !it.exists() }) { val descriptor = expectedDeclaration.toDescriptor() ?: continue val actualDeclaration: KtDeclaration = when (expectedDeclaration) { diff --git a/idea/testData/multiModuleQuickFix/sealed/js/Sealed.kt.after b/idea/testData/multiModuleQuickFix/sealed/js/Sealed.kt.after index 2d8a67e4aa2..1af589034d5 100644 --- a/idea/testData/multiModuleQuickFix/sealed/js/Sealed.kt.after +++ b/idea/testData/multiModuleQuickFix/sealed/js/Sealed.kt.after @@ -1,6 +1,6 @@ // Sealed: to be implemented actual sealed class Sealed { - actual object Obj : Sealed - actual class Klass actual constructor(x: Int) : Sealed + actual object Obj : Sealed() + actual class Klass actual constructor(x: Int) : Sealed() } \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/sealedSubclass/js/Sealed.kt.after b/idea/testData/multiModuleQuickFix/sealedSubclass/js/Sealed.kt.after index 705d42755fe..f1101d9b6ec 100644 --- a/idea/testData/multiModuleQuickFix/sealedSubclass/js/Sealed.kt.after +++ b/idea/testData/multiModuleQuickFix/sealedSubclass/js/Sealed.kt.after @@ -3,4 +3,4 @@ actual sealed class Sealed actual object Obj : Sealed() -actual class Klass actual constructor(x: Int) : Sealed \ No newline at end of file +actual class Klass actual constructor(x: Int) : Sealed() \ No newline at end of file