Create actual fix: add empty brackets for classes in super-type lists

Related to KT-21082
This commit is contained in:
Mikhail Glukhikh
2018-03-02 16:24:34 +03:00
parent ef3e0b01c4
commit fe7b7fb0bd
3 changed files with 15 additions and 3 deletions
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory import org.jetbrains.kotlin.diagnostics.DiagnosticFactory
import org.jetbrains.kotlin.diagnostics.Errors 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.caches.project.ModuleSourceInfo
import org.jetbrains.kotlin.idea.core.* import org.jetbrains.kotlin.idea.core.*
import org.jetbrains.kotlin.idea.highlighter.markers.actualsForExpected 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.lexer.KtTokens
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.MultiTargetPlatform import org.jetbrains.kotlin.resolve.MultiTargetPlatform
import org.jetbrains.kotlin.resolve.getMultiTargetPlatform 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() }) { declLoop@ for (expectedDeclaration in expectedClass.declarations.filter { !it.exists() }) {
val descriptor = expectedDeclaration.toDescriptor() ?: continue val descriptor = expectedDeclaration.toDescriptor() ?: continue
val actualDeclaration: KtDeclaration = when (expectedDeclaration) { val actualDeclaration: KtDeclaration = when (expectedDeclaration) {
@@ -1,6 +1,6 @@
// Sealed: to be implemented // Sealed: to be implemented
actual sealed class Sealed { actual sealed class Sealed {
actual object Obj : Sealed actual object Obj : Sealed()
actual class Klass actual constructor(x: Int) : Sealed actual class Klass actual constructor(x: Int) : Sealed()
} }
@@ -3,4 +3,4 @@
actual sealed class Sealed actual sealed class Sealed
actual object Obj : Sealed() actual object Obj : Sealed()
actual class Klass actual constructor(x: Int) : Sealed actual class Klass actual constructor(x: Int) : Sealed()