New J2K: Fix supertypes constructor calls

This commit is contained in:
Ilya Kirillov
2019-01-11 15:49:13 +03:00
committed by Ilya Kirillov
parent 5cdc01621d
commit d1c1aeed0b
3 changed files with 22 additions and 18 deletions
@@ -204,16 +204,16 @@ class NewCodeBuilder {
if (isInInterface) {
renderList(extendTypes) { renderType(it) }
} else {
extendTypes.singleOrNull()?.also {
renderType(it)
extendTypes.singleOrNull()?.also { superType ->
renderType(superType)
val primaryConstructor = parentClass.primaryConstructor()
val delegationCall =
parentClass
.primaryConstructor()
primaryConstructor
?.delegationCall
?.let { it as? JKDelegationConstructorCall }
if (delegationCall != null) {
printer.par { delegationCall.arguments.accept(this) }
} else {
} else if (!superType.isInterface()) {
printer.printWithNoIndent("()")
}
}
@@ -608,7 +608,7 @@ class NewCodeBuilder {
}
printer.printWithNoIndent(javaNewExpression.classSymbol.displayName().escapedAsQualifiedName())
javaNewExpression.typeArgumentList.accept(this)
if (javaNewExpression.constructorIsPresent() || !javaNewExpression.isAnonymousClass()) {
if (!javaNewExpression.classSymbol.isInterface()) {
printer.par(ROUND) {
javaNewExpression.arguments.accept(this)
}
@@ -709,6 +709,8 @@ class NewCodeBuilder {
printer.printWithNoIndent(" constructor ")
if (ktPrimaryConstructor.parameters.isNotEmpty()) {
renderParameterList(ktPrimaryConstructor.parameters)
} else {
printer.print("()")
}
}
@@ -44,17 +44,6 @@ interface JKJavaNewExpression : JKExpression, JKTypeArgumentListOwner, PsiOwner
fun JKJavaNewExpression.isAnonymousClass() =
classBody !is JKEmptyClassBody
fun JKJavaNewExpression.constructorIsPresent(): Boolean {
if (arguments.expressions.isNotEmpty()) return true
val symbol = classSymbol
return when (symbol) {
is JKMultiverseClassSymbol -> symbol.target.constructors.isNotEmpty()
is JKMultiverseKtClassSymbol -> symbol.target.constructor != null
is JKUniverseClassSymbol -> symbol.target.classBody.declarations.any { it is JKKtConstructor }
is JKUnresolvedClassSymbol -> true //TODO ???
else -> TODO(symbol::class.toString())
}
}
interface JKJavaDefaultNewExpression : JKExpression {
val classSymbol: JKClassSymbol
@@ -296,4 +296,17 @@ fun JKType.arrayInnerType(): JKType? =
val namesOfPrimitiveTypes by lazy {
KotlinBuiltIns.FQ_NAMES.primitiveTypeShortNames.map { it.identifier.decapitalize() }
}
}
fun JKClassSymbol.isInterface(): Boolean {
val target = target
return when (target) {
is PsiClass -> target.isInterface
is KtClass -> target.isInterface()
is JKClass -> target.classKind == JKClass.ClassKind.INTERFACE
else -> false
}
}
fun JKType.isInterface(): Boolean =
(this as? JKClassType)?.classReference?.isInterface() ?: false