diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index a818d37d13e..c3e15f3a285 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -145,7 +145,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) { } JKDelegationConstructorCallImpl(symbol, callee, argumentList.toJK()) } else { - val call = JKJavaMethodCallExpressionImpl(symbol, argumentList.toJK()) + val call = JKJavaMethodCallExpressionImpl(symbol, argumentList.toJK(), typeArgumentList.toJK()) if (method.findChildByRole(ChildRole.DOT) != null) { JKQualifiedExpressionImpl((method.qualifier as PsiExpression).toJK(), JKJavaQualifierImpl.DOT, call) } else { @@ -207,10 +207,15 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) { return JKJavaNewExpressionImpl( symbolProvider.provideDirectSymbol(constructor!!) as JKMethodSymbol, - argumentList.toJK() + argumentList.toJK(), + typeArgumentList.toJK() ) } + fun PsiReferenceParameterList.toJK(): JKTypeArgumentList = + JKTypeArgumentListImpl(this.typeArguments.map { JKTypeElementImpl(it.toJK(symbolProvider)) }) + + fun PsiArrayAccessExpression.toJK(): JKExpression { return JKArrayAccessExpressionImpl(arrayExpression.toJK(), indexExpression?.toJK() ?: TODO()) } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index e0961112661..260b114c1ba 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -506,16 +506,22 @@ class NewCodeBuilder { override fun visitMethodCallExpression(methodCallExpression: JKMethodCallExpression) { printer.printWithNoIndent(FqName(methodCallExpression.identifier.fqName).shortName().asString()) - if (methodCallExpression.typeArguments.isNotEmpty()) { - printer.par(ANGLE) { - renderList(methodCallExpression.typeArguments) { it.accept(this) } - } - } + methodCallExpression.typeArgumentList.accept(this) printer.par { methodCallExpression.arguments.accept(this) } } + override fun visitTypeArgumentList(typeArgumentList: JKTypeArgumentList) { + if (typeArgumentList.typeArguments.isNotEmpty()) { + printer.par(ANGLE) { + renderList(typeArgumentList.typeArguments) { + it.accept(this) + } + } + } + } + override fun visitParenthesizedExpression(parenthesizedExpression: JKParenthesizedExpression) { printer.par { parenthesizedExpression.expression.accept(this) @@ -613,11 +619,10 @@ class NewCodeBuilder { } override fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression) { - printer.printWithNoIndent(FqName(javaNewExpression.constructorSymbol.fqName).shortName()) + printer.printWithNoIndent(javaNewExpression.identifier.name) + javaNewExpression.typeArgumentList.accept(this) printer.par(ROUND) { - renderList(javaNewExpression.arguments.expressions, ", ") { - it.accept(this) - } + javaNewExpression.arguments.accept(this) } } @@ -797,7 +802,7 @@ class NewCodeBuilder { } override fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression) { - val psiConstructor = javaNewExpression.constructorSymbol.target + val psiConstructor = javaNewExpression.identifier.target val fqName = when (psiConstructor) { is PsiMethod -> psiConstructor.containingClass?.getKotlinFqName()!! is KtFunction -> psiConstructor.containingClassOrObject?.fqName!! diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ArrayInitializerConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ArrayInitializerConversion.kt index faa95923974..a7766424e7f 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ArrayInitializerConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ArrayInitializerConversion.kt @@ -44,7 +44,7 @@ class ArrayInitializerConversion(private val context: ConversionContext) : Recur return JKJavaMethodCallExpressionImpl( methodOrConstructorReference, JKExpressionListImpl(dimensions[0]), - if (type is JKJavaPrimitiveType) emptyList() else listOf(JKTypeElementImpl(type)) + JKTypeArgumentListImpl(if (type is JKJavaPrimitiveType) emptyList() else listOf(JKTypeElementImpl(type))) ) } if (dimensions[1] !is JKStubExpression) { @@ -73,7 +73,7 @@ class ArrayInitializerConversion(private val context: ConversionContext) : Recur return JKJavaMethodCallExpressionImpl( context.symbolProvider.provideByFqName("kotlin/arrayOfNulls"), JKExpressionListImpl(dimensions[0]), - listOf(JKTypeElementImpl(resultType)) + JKTypeArgumentListImpl(listOf(JKTypeElementImpl(resultType))) ) } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt index ad20b929ac7..d91aad04fd8 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt @@ -184,22 +184,22 @@ sealed class JKJavaQualifierImpl : JKQualifier { class JKJavaMethodCallExpressionImpl( override var identifier: JKMethodSymbol, arguments: JKExpressionList, - typeArguments: List = emptyList() + typeArgumentList: JKTypeArgumentList = JKTypeArgumentListImpl() ) : JKJavaMethodCallExpression, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { override fun accept(visitor: JKVisitor, data: D): R = visitor.visitJavaMethodCallExpression(this, data) override val arguments: JKExpressionList by child(arguments) - override var typeArguments: List by children(typeArguments) + override var typeArgumentList: JKTypeArgumentList by child(typeArgumentList) } - class JKJavaNewExpressionImpl( - override val constructorSymbol: JKMethodSymbol, - arguments: JKExpressionList + override var identifier: JKMethodSymbol, + arguments: JKExpressionList, + typeArgumentList: JKTypeArgumentList ) : JKJavaNewExpression, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { + override val arguments: JKExpressionList by child(arguments) + override var typeArgumentList: JKTypeArgumentList by child(typeArgumentList) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitJavaNewExpression(this, data) - - override var arguments by child(arguments) } class JKJavaDefaultNewExpressionImpl( 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 5c89471eee6..149e62ddb1a 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -396,12 +396,13 @@ class JKInheritanceInfoImpl(implements: List) : JKInheritanceInfo override fun accept(visitor: JKVisitor, data: D): R = visitor.visitInheritanceInfo(this, data) } + class JKDelegationConstructorCallImpl( override val identifier: JKMethodSymbol, expression: JKExpression, arguments: JKExpressionList ) : JKBranchElementBase(), JKDelegationConstructorCall, PsiOwner by PsiOwnerImpl() { - override var typeArguments by children(emptyList()) + override var typeArgumentList: JKTypeArgumentList by child(JKTypeArgumentListImpl()) override val expression: JKExpression by child(expression) override val arguments: JKExpressionList by child(arguments) @@ -516,4 +517,11 @@ class JKAnnotationListImpl(annotations: List = emptyList()) : JKAn class JKAnnotationImpl(name: JKNameIdentifier) : JKAnnotation, JKBranchElementBase() { override var name: JKNameIdentifier by child(name) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitAnnotation(this, data) +} + +class JKTypeArgumentListImpl(typeArguments: List = emptyList()) : JKTypeArgumentList, JKBranchElementBase(), + PsiOwner by PsiOwnerImpl() { + override val typeArguments: List by children(typeArguments) + override fun accept(visitor: JKVisitor, data: D): R = visitor.visitTypeArgumentList(this, data) + } \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt index 3f98ffd396e..914e69cfb82 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt @@ -71,12 +71,12 @@ sealed class JKKtQualifierImpl : JKQualifier, JKElementBase() { class JKKtCallExpressionImpl( override val identifier: JKMethodSymbol, arguments: JKExpressionList, - typeArguments: List = emptyList() + typeArgumentList: JKTypeArgumentList = JKTypeArgumentListImpl() ) : JKKtMethodCallExpression, JKBranchElementBase() { override fun accept(visitor: JKVisitor, data: D): R = visitor.visitKtMethodCallExpression(this, data) override var arguments: JKExpressionList by child(arguments) - override var typeArguments: List by children(typeArguments) + override var typeArgumentList: JKTypeArgumentList by child(typeArgumentList) } class JKKtLiteralExpressionImpl( @@ -115,7 +115,10 @@ class JKKtModifierImpl(override val type: JKKtModifier.KtModifierType) : JKKtMod } class JKKtAlsoCallExpressionImpl( - statement: JKStatement, override val identifier: JKMethodSymbol, override val parameterName: String = "it" + statement: JKStatement, + override val identifier: JKMethodSymbol, + override val parameterName: String = "it", + typeArgumentList: JKTypeArgumentList = JKTypeArgumentListImpl() ) : JKKtAlsoCallExpression, JKBranchElementBase() { override fun accept(visitor: JKVisitor, data: D): R = visitor.visitKtAlsoCallExpression(this, data) override var statement @@ -140,7 +143,7 @@ class JKKtAlsoCallExpressionImpl( ) ) ) - override var typeArguments: List by children(emptyList()) + override var typeArgumentList: JKTypeArgumentList by child(typeArgumentList) } class JKKtAssignmentStatementImpl( @@ -285,4 +288,22 @@ class JKKtTryCatchSectionImpl( override var parameter: JKParameter by child(parameter) override var block: JKBlock by child(block) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitKtTryCatchSection(this, data) +} + +class JKKtGetterOrSetterImpl( + body: JKStatement, + modifierList: JKModifierList, + override val kind: JKKtGetterOrSetter.Kind +) : JKKtGetterOrSetter, JKBranchElementBase() { + override var body: JKStatement by child(body) + override var modifierList: JKModifierList by child(modifierList) + override fun accept(visitor: JKVisitor, data: D): R = visitor.visitKtGetterOrSetter(this, data) +} + +class JKKtEmptyGetterOrSetterImpl : JKKtEmptyGetterOrSetter, JKBranchElementBase() { + override var body: JKStatement by child(JKEmptyStatementImpl()) + override var modifierList: JKModifierList by child(JKModifierListImpl()) + override val kind: JKKtGetterOrSetter.Kind + get() = error("Cannot get kind of JKKtEmptyGetterOrSetter") + override fun accept(visitor: JKVisitor, data: D): R = visitor.visitKtEmptyGetterOrSetter(this, data) } \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt index 80e01b66aef..cf0c544101f 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt @@ -26,10 +26,7 @@ interface JKJavaMethod : JKMethod, JKBranchElement { interface JKJavaMethodCallExpression : JKMethodCallExpression -interface JKJavaNewExpression : JKExpression { - val constructorSymbol: JKMethodSymbol - val arguments: JKExpressionList -} +interface JKJavaNewExpression : JKMethodCallExpression interface JKJavaDefaultNewExpression : JKExpression { val classSymbol: JKClassSymbol diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt index 2bd224517f4..ecfe0cdc34e 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt @@ -164,10 +164,17 @@ interface JKQualifiedExpression : JKExpression, JKAssignableExpression { var selector: JKExpression } -interface JKMethodCallExpression : JKExpression, JKBranchElement { +interface JKTypeArgumentList : JKTreeElement { + val typeArguments: List +} + +interface JKTypeArgumentListOwner : JKTreeElement { + var typeArgumentList: JKTypeArgumentList +} + +interface JKMethodCallExpression : JKExpression, JKTypeArgumentListOwner, JKBranchElement { val identifier: JKMethodSymbol val arguments: JKExpressionList - var typeArguments: List } interface JKFieldAccessExpression : JKAssignableExpression { diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt index 9ae59fcbb14..b59920bf2b0 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt @@ -33,6 +33,8 @@ interface JKVisitor { fun visitPrefixExpression(prefixExpression: JKPrefixExpression, data: D): R = visitUnaryExpression(prefixExpression, data) fun visitPostfixExpression(postfixExpression: JKPostfixExpression, data: D): R = visitUnaryExpression(postfixExpression, data) fun visitQualifiedExpression(qualifiedExpression: JKQualifiedExpression, data: D): R = visitExpression(qualifiedExpression, data) + fun visitTypeArgumentList(typeArgumentList: JKTypeArgumentList, data: D): R = visitTreeElement(typeArgumentList, data) + fun visitTypeArgumentListOwner(typeArgumentListOwner: JKTypeArgumentListOwner, data: D): R = visitTreeElement(typeArgumentListOwner, data) fun visitMethodCallExpression(methodCallExpression: JKMethodCallExpression, data: D): R = visitExpression(methodCallExpression, data) fun visitFieldAccessExpression(fieldAccessExpression: JKFieldAccessExpression, data: D): R = visitAssignableExpression(fieldAccessExpression, data) fun visitClassAccessExpression(classAccessExpression: JKClassAccessExpression, data: D): R = visitExpression(classAccessExpression, data) @@ -73,7 +75,7 @@ interface JKVisitor { fun visitJavaField(javaField: JKJavaField, data: D): R = visitField(javaField, data) fun visitJavaMethod(javaMethod: JKJavaMethod, data: D): R = visitMethod(javaMethod, data) fun visitJavaMethodCallExpression(javaMethodCallExpression: JKJavaMethodCallExpression, data: D): R = visitMethodCallExpression(javaMethodCallExpression, data) - fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression, data: D): R = visitExpression(javaNewExpression, data) + fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression, data: D): R = visitMethodCallExpression(javaNewExpression, data) fun visitJavaDefaultNewExpression(javaDefaultNewExpression: JKJavaDefaultNewExpression, data: D): R = visitExpression(javaDefaultNewExpression, data) fun visitJavaModifier(javaModifier: JKJavaModifier, data: D): R = visitModifier(javaModifier, data) fun visitJavaNewEmptyArray(javaNewEmptyArray: JKJavaNewEmptyArray, data: D): R = visitExpression(javaNewEmptyArray, data) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt index dd238374d4c..b1a0678543b 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt @@ -63,6 +63,10 @@ interface JKVisitorVoid : JKVisitor { override fun visitPostfixExpression(postfixExpression: JKPostfixExpression, data: Nothing?) = visitPostfixExpression(postfixExpression) fun visitQualifiedExpression(qualifiedExpression: JKQualifiedExpression) = visitExpression(qualifiedExpression, null) override fun visitQualifiedExpression(qualifiedExpression: JKQualifiedExpression, data: Nothing?) = visitQualifiedExpression(qualifiedExpression) + fun visitTypeArgumentList(typeArgumentList: JKTypeArgumentList) = visitTreeElement(typeArgumentList, null) + override fun visitTypeArgumentList(typeArgumentList: JKTypeArgumentList, data: Nothing?) = visitTypeArgumentList(typeArgumentList) + fun visitTypeArgumentListOwner(typeArgumentListOwner: JKTypeArgumentListOwner) = visitTreeElement(typeArgumentListOwner, null) + override fun visitTypeArgumentListOwner(typeArgumentListOwner: JKTypeArgumentListOwner, data: Nothing?) = visitTypeArgumentListOwner(typeArgumentListOwner) fun visitMethodCallExpression(methodCallExpression: JKMethodCallExpression) = visitExpression(methodCallExpression, null) override fun visitMethodCallExpression(methodCallExpression: JKMethodCallExpression, data: Nothing?) = visitMethodCallExpression(methodCallExpression) fun visitFieldAccessExpression(fieldAccessExpression: JKFieldAccessExpression) = visitAssignableExpression(fieldAccessExpression, null) @@ -143,7 +147,7 @@ interface JKVisitorVoid : JKVisitor { override fun visitJavaMethod(javaMethod: JKJavaMethod, data: Nothing?) = visitJavaMethod(javaMethod) fun visitJavaMethodCallExpression(javaMethodCallExpression: JKJavaMethodCallExpression) = visitMethodCallExpression(javaMethodCallExpression, null) override fun visitJavaMethodCallExpression(javaMethodCallExpression: JKJavaMethodCallExpression, data: Nothing?) = visitJavaMethodCallExpression(javaMethodCallExpression) - fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression) = visitExpression(javaNewExpression, null) + fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression) = visitMethodCallExpression(javaNewExpression, null) override fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression, data: Nothing?) = visitJavaNewExpression(javaNewExpression) fun visitJavaDefaultNewExpression(javaDefaultNewExpression: JKJavaDefaultNewExpression) = visitExpression(javaDefaultNewExpression, null) override fun visitJavaDefaultNewExpression(javaDefaultNewExpression: JKJavaDefaultNewExpression, data: Nothing?) = visitJavaDefaultNewExpression(javaDefaultNewExpression)