diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index f7dc00d5d52..bd66aa15cdb 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -291,10 +291,10 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) { this.referencedTypes.map { with(expressionTreeMapper) { JKTypeElementImpl(it.toJK(symbolProvider, Nullability.NotNull)) } } val implTypes = this.implementsList?.mapTypes().orEmpty() - val extTypes = this.extendsList?.mapTypes().orEmpty() + val extensionType = this.extendsList?.mapTypes().orEmpty() return JKClassImpl( JKNameIdentifierImpl(name!!), - JKInheritanceInfoImpl(extTypes + implTypes), + JKInheritanceInfoImpl(extensionType, implTypes), classKind, typeParameterList?.toJK() ?: JKTypeParameterListImpl(), createClassBody(), diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index accdcfaa0c3..3e8bdacc3d8 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -185,18 +185,10 @@ class NewCodeBuilder { val primaryConstructor = klass.primaryConstructor() primaryConstructor?.accept(this) - if (klass.inheritance.inherit.isNotEmpty()) { - printer.printWithNoIndent(" : ") - val delegationCall = primaryConstructor?.delegationCall as? JKDelegationConstructorCall - renderList(klass.inheritance.inherit) { - it.accept(this) - if (delegationCall != null && delegationCall.isCallOfConstructorOf(it.type)) { - printer.par { - delegationCall.arguments.accept(this) - } - } - } + if (klass.inheritance.present()) { + printer.printWithNoIndent(" : ") + klass.inheritance.accept(this) } //TODO should it be here? @@ -205,6 +197,36 @@ class NewCodeBuilder { klass.classBody.accept(this) } + override fun visitInheritanceInfo(inheritanceInfo: JKInheritanceInfo) { + val parentClass = inheritanceInfo.parentOfType()!! + val isInInterface = parentClass.classKind == JKClass.ClassKind.INTERFACE + val extendTypes = inheritanceInfo.extends.map { it.type.updateNullability(Nullability.NotNull) } + val implementTypes = inheritanceInfo.implements.map { it.type.updateNullability(Nullability.NotNull) } + if (isInInterface) { + renderList(extendTypes) { renderType(it) } + } else { + extendTypes.singleOrNull()?.also { + renderType(it) + val delegationCall = + parentClass + .primaryConstructor() + ?.delegationCall + ?.let { it as? JKDelegationConstructorCall } + if (delegationCall != null) { + printer.par { delegationCall.arguments.accept(this) } + } else { + printer.printWithNoIndent("()") + } + } + } + + if (implementTypes.isNotEmpty() && extendTypes.size == 1) { + printer.printWithNoIndent(", ") + } + renderList(implementTypes) { renderType(it) } + } + + private fun renderEnumConstants(enumConstants: List) { renderList(enumConstants) { it.accept(this) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InsertDefaultPrimaryConstructorConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InsertDefaultPrimaryConstructorConversion.kt index e3383d0d78a..0b38f4a4c03 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InsertDefaultPrimaryConstructorConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InsertDefaultPrimaryConstructorConversion.kt @@ -28,15 +28,15 @@ class InsertDefaultPrimaryConstructorConversion(private val context: ConversionC element.classBody.declarations += constructor - val superClassSymbol = element.inheritance.inherit.map { it.type } - .filterIsInstance() - .mapNotNull { (it.classReference as? JKClassSymbol) } - .firstOrNull { it.kind == JKClass.ClassKind.CLASS } + val superClassSymbol = + (element.inheritance.extends.singleOrNull() as? JKClassType)?.classReference if (superClassSymbol is JKUniverseClassSymbol) { val superClass = recurse(superClassSymbol.target) val superConstructor = context.symbolProvider.provideUniverseSymbol( - superClass.declarationList.single { it is JKKtConstructor && it.parameters.isEmpty() } as JKMethod + superClass.declarationList.singleOrNull { it is JKKtConstructor && it.parameters.isEmpty() } as? JKMethod ?: return recurse( + element + ) ) constructor.delegationCall = JKDelegationConstructorCallImpl(superConstructor, JKSuperExpressionImpl(), JKExpressionListImpl()) } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/StaticsToCompanionExtractConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/StaticsToCompanionExtractConversion.kt index e6e9f31fda2..ac267502318 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/StaticsToCompanionExtractConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/StaticsToCompanionExtractConversion.kt @@ -40,7 +40,7 @@ class StaticsToCompanionExtractConversion : RecursiveApplicableConversionBase() return JKClassImpl( JKNameIdentifierImpl(""), - JKInheritanceInfoImpl(emptyList()), + JKInheritanceInfoImpl(emptyList(), emptyList()), JKClass.ClassKind.COMPANION, JKTypeParameterListImpl(), JKClassBodyImpl(), diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt index f6a0c3caf16..d98858c35e0 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -377,8 +377,12 @@ class JKLambdaExpressionImpl( override fun accept(visitor: JKVisitor, data: D): R = visitor.visitLambdaExpression(this, data) } -class JKInheritanceInfoImpl(implements: List) : JKInheritanceInfo, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { - override val inherit: List by children(implements) +class JKInheritanceInfoImpl( + extends: List, + implements: List +) : JKInheritanceInfo, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { + override var extends: List by children(extends) + override var implements: List by children(implements) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitInheritanceInfo(this, data) } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt index acbd5354580..381db5ebcb7 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt @@ -68,9 +68,13 @@ val JKClass.declarationList: List interface JKInheritanceInfo : JKTreeElement, JKBranchElement { - val inherit: List + var extends: List + var implements: List } +fun JKInheritanceInfo.present(): Boolean = + extends.isNotEmpty() || implements.isNotEmpty() + interface JKAnnotationList : JKTreeElement { var annotations: List }