New J2K: Introduce type arguments

This commit is contained in:
Ilya Kirillov
2018-11-21 14:36:09 +03:00
committed by Ilya Kirillov
parent 40c5b56c10
commit f58d791a05
10 changed files with 83 additions and 34 deletions
@@ -145,7 +145,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
} }
JKDelegationConstructorCallImpl(symbol, callee, argumentList.toJK()) JKDelegationConstructorCallImpl(symbol, callee, argumentList.toJK())
} else { } else {
val call = JKJavaMethodCallExpressionImpl(symbol, argumentList.toJK()) val call = JKJavaMethodCallExpressionImpl(symbol, argumentList.toJK(), typeArgumentList.toJK())
if (method.findChildByRole(ChildRole.DOT) != null) { if (method.findChildByRole(ChildRole.DOT) != null) {
JKQualifiedExpressionImpl((method.qualifier as PsiExpression).toJK(), JKJavaQualifierImpl.DOT, call) JKQualifiedExpressionImpl((method.qualifier as PsiExpression).toJK(), JKJavaQualifierImpl.DOT, call)
} else { } else {
@@ -207,10 +207,15 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
return JKJavaNewExpressionImpl( return JKJavaNewExpressionImpl(
symbolProvider.provideDirectSymbol(constructor!!) as JKMethodSymbol, 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 { fun PsiArrayAccessExpression.toJK(): JKExpression {
return JKArrayAccessExpressionImpl(arrayExpression.toJK(), indexExpression?.toJK() ?: TODO()) return JKArrayAccessExpressionImpl(arrayExpression.toJK(), indexExpression?.toJK() ?: TODO())
} }
@@ -506,16 +506,22 @@ class NewCodeBuilder {
override fun visitMethodCallExpression(methodCallExpression: JKMethodCallExpression) { override fun visitMethodCallExpression(methodCallExpression: JKMethodCallExpression) {
printer.printWithNoIndent(FqName(methodCallExpression.identifier.fqName).shortName().asString()) printer.printWithNoIndent(FqName(methodCallExpression.identifier.fqName).shortName().asString())
if (methodCallExpression.typeArguments.isNotEmpty()) { methodCallExpression.typeArgumentList.accept(this)
printer.par(ANGLE) {
renderList(methodCallExpression.typeArguments) { it.accept(this) }
}
}
printer.par { printer.par {
methodCallExpression.arguments.accept(this) 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) { override fun visitParenthesizedExpression(parenthesizedExpression: JKParenthesizedExpression) {
printer.par { printer.par {
parenthesizedExpression.expression.accept(this) parenthesizedExpression.expression.accept(this)
@@ -613,11 +619,10 @@ class NewCodeBuilder {
} }
override fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression) { override fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression) {
printer.printWithNoIndent(FqName(javaNewExpression.constructorSymbol.fqName).shortName()) printer.printWithNoIndent(javaNewExpression.identifier.name)
javaNewExpression.typeArgumentList.accept(this)
printer.par(ROUND) { printer.par(ROUND) {
renderList(javaNewExpression.arguments.expressions, ", ") { javaNewExpression.arguments.accept(this)
it.accept(this)
}
} }
} }
@@ -797,7 +802,7 @@ class NewCodeBuilder {
} }
override fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression) { override fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression) {
val psiConstructor = javaNewExpression.constructorSymbol.target val psiConstructor = javaNewExpression.identifier.target
val fqName = when (psiConstructor) { val fqName = when (psiConstructor) {
is PsiMethod -> psiConstructor.containingClass?.getKotlinFqName()!! is PsiMethod -> psiConstructor.containingClass?.getKotlinFqName()!!
is KtFunction -> psiConstructor.containingClassOrObject?.fqName!! is KtFunction -> psiConstructor.containingClassOrObject?.fqName!!
@@ -44,7 +44,7 @@ class ArrayInitializerConversion(private val context: ConversionContext) : Recur
return JKJavaMethodCallExpressionImpl( return JKJavaMethodCallExpressionImpl(
methodOrConstructorReference, methodOrConstructorReference,
JKExpressionListImpl(dimensions[0]), 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) { if (dimensions[1] !is JKStubExpression) {
@@ -73,7 +73,7 @@ class ArrayInitializerConversion(private val context: ConversionContext) : Recur
return JKJavaMethodCallExpressionImpl( return JKJavaMethodCallExpressionImpl(
context.symbolProvider.provideByFqName("kotlin/arrayOfNulls"), context.symbolProvider.provideByFqName("kotlin/arrayOfNulls"),
JKExpressionListImpl(dimensions[0]), JKExpressionListImpl(dimensions[0]),
listOf(JKTypeElementImpl(resultType)) JKTypeArgumentListImpl(listOf(JKTypeElementImpl(resultType)))
) )
} }
@@ -184,22 +184,22 @@ sealed class JKJavaQualifierImpl : JKQualifier {
class JKJavaMethodCallExpressionImpl( class JKJavaMethodCallExpressionImpl(
override var identifier: JKMethodSymbol, override var identifier: JKMethodSymbol,
arguments: JKExpressionList, arguments: JKExpressionList,
typeArguments: List<JKTypeElement> = emptyList() typeArgumentList: JKTypeArgumentList = JKTypeArgumentListImpl()
) : JKJavaMethodCallExpression, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { ) : JKJavaMethodCallExpression, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaMethodCallExpression(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaMethodCallExpression(this, data)
override val arguments: JKExpressionList by child(arguments) override val arguments: JKExpressionList by child(arguments)
override var typeArguments: List<JKTypeElement> by children(typeArguments) override var typeArgumentList: JKTypeArgumentList by child(typeArgumentList)
} }
class JKJavaNewExpressionImpl( class JKJavaNewExpressionImpl(
override val constructorSymbol: JKMethodSymbol, override var identifier: JKMethodSymbol,
arguments: JKExpressionList arguments: JKExpressionList,
typeArgumentList: JKTypeArgumentList
) : JKJavaNewExpression, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { ) : JKJavaNewExpression, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
override val arguments: JKExpressionList by child(arguments)
override var typeArgumentList: JKTypeArgumentList by child(typeArgumentList)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaNewExpression(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaNewExpression(this, data)
override var arguments by child(arguments)
} }
class JKJavaDefaultNewExpressionImpl( class JKJavaDefaultNewExpressionImpl(
@@ -396,12 +396,13 @@ class JKInheritanceInfoImpl(implements: List<JKTypeElement>) : JKInheritanceInfo
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitInheritanceInfo(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitInheritanceInfo(this, data)
} }
class JKDelegationConstructorCallImpl( class JKDelegationConstructorCallImpl(
override val identifier: JKMethodSymbol, override val identifier: JKMethodSymbol,
expression: JKExpression, expression: JKExpression,
arguments: JKExpressionList arguments: JKExpressionList
) : JKBranchElementBase(), JKDelegationConstructorCall, PsiOwner by PsiOwnerImpl() { ) : JKBranchElementBase(), JKDelegationConstructorCall, PsiOwner by PsiOwnerImpl() {
override var typeArguments by children(emptyList<JKTypeElement>()) override var typeArgumentList: JKTypeArgumentList by child(JKTypeArgumentListImpl())
override val expression: JKExpression by child(expression) override val expression: JKExpression by child(expression)
override val arguments: JKExpressionList by child(arguments) override val arguments: JKExpressionList by child(arguments)
@@ -517,3 +518,10 @@ class JKAnnotationImpl(name: JKNameIdentifier) : JKAnnotation, JKBranchElementBa
override var name: JKNameIdentifier by child(name) override var name: JKNameIdentifier by child(name)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitAnnotation(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitAnnotation(this, data)
} }
class JKTypeArgumentListImpl(typeArguments: List<JKTypeElement> = emptyList()) : JKTypeArgumentList, JKBranchElementBase(),
PsiOwner by PsiOwnerImpl() {
override val typeArguments: List<JKTypeElement> by children(typeArguments)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitTypeArgumentList(this, data)
}
@@ -71,12 +71,12 @@ sealed class JKKtQualifierImpl : JKQualifier, JKElementBase() {
class JKKtCallExpressionImpl( class JKKtCallExpressionImpl(
override val identifier: JKMethodSymbol, override val identifier: JKMethodSymbol,
arguments: JKExpressionList, arguments: JKExpressionList,
typeArguments: List<JKTypeElement> = emptyList() typeArgumentList: JKTypeArgumentList = JKTypeArgumentListImpl()
) : JKKtMethodCallExpression, JKBranchElementBase() { ) : JKKtMethodCallExpression, JKBranchElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtMethodCallExpression(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtMethodCallExpression(this, data)
override var arguments: JKExpressionList by child(arguments) override var arguments: JKExpressionList by child(arguments)
override var typeArguments: List<JKTypeElement> by children(typeArguments) override var typeArgumentList: JKTypeArgumentList by child(typeArgumentList)
} }
class JKKtLiteralExpressionImpl( class JKKtLiteralExpressionImpl(
@@ -115,7 +115,10 @@ class JKKtModifierImpl(override val type: JKKtModifier.KtModifierType) : JKKtMod
} }
class JKKtAlsoCallExpressionImpl( 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() { ) : JKKtAlsoCallExpression, JKBranchElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtAlsoCallExpression(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtAlsoCallExpression(this, data)
override var statement override var statement
@@ -140,7 +143,7 @@ class JKKtAlsoCallExpressionImpl(
) )
) )
) )
override var typeArguments: List<JKTypeElement> by children(emptyList()) override var typeArgumentList: JKTypeArgumentList by child(typeArgumentList)
} }
class JKKtAssignmentStatementImpl( class JKKtAssignmentStatementImpl(
@@ -286,3 +289,21 @@ class JKKtTryCatchSectionImpl(
override var block: JKBlock by child(block) override var block: JKBlock by child(block)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtTryCatchSection(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, 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 <R, D> accept(visitor: JKVisitor<R, D>, 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 <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtEmptyGetterOrSetter(this, data)
}
@@ -26,10 +26,7 @@ interface JKJavaMethod : JKMethod, JKBranchElement {
interface JKJavaMethodCallExpression : JKMethodCallExpression interface JKJavaMethodCallExpression : JKMethodCallExpression
interface JKJavaNewExpression : JKExpression { interface JKJavaNewExpression : JKMethodCallExpression
val constructorSymbol: JKMethodSymbol
val arguments: JKExpressionList
}
interface JKJavaDefaultNewExpression : JKExpression { interface JKJavaDefaultNewExpression : JKExpression {
val classSymbol: JKClassSymbol val classSymbol: JKClassSymbol
@@ -164,10 +164,17 @@ interface JKQualifiedExpression : JKExpression, JKAssignableExpression {
var selector: JKExpression var selector: JKExpression
} }
interface JKMethodCallExpression : JKExpression, JKBranchElement { interface JKTypeArgumentList : JKTreeElement {
val typeArguments: List<JKTypeElement>
}
interface JKTypeArgumentListOwner : JKTreeElement {
var typeArgumentList: JKTypeArgumentList
}
interface JKMethodCallExpression : JKExpression, JKTypeArgumentListOwner, JKBranchElement {
val identifier: JKMethodSymbol val identifier: JKMethodSymbol
val arguments: JKExpressionList val arguments: JKExpressionList
var typeArguments: List<JKTypeElement>
} }
interface JKFieldAccessExpression : JKAssignableExpression { interface JKFieldAccessExpression : JKAssignableExpression {
@@ -33,6 +33,8 @@ interface JKVisitor<out R, in D> {
fun visitPrefixExpression(prefixExpression: JKPrefixExpression, data: D): R = visitUnaryExpression(prefixExpression, data) fun visitPrefixExpression(prefixExpression: JKPrefixExpression, data: D): R = visitUnaryExpression(prefixExpression, data)
fun visitPostfixExpression(postfixExpression: JKPostfixExpression, data: D): R = visitUnaryExpression(postfixExpression, data) fun visitPostfixExpression(postfixExpression: JKPostfixExpression, data: D): R = visitUnaryExpression(postfixExpression, data)
fun visitQualifiedExpression(qualifiedExpression: JKQualifiedExpression, data: D): R = visitExpression(qualifiedExpression, 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 visitMethodCallExpression(methodCallExpression: JKMethodCallExpression, data: D): R = visitExpression(methodCallExpression, data)
fun visitFieldAccessExpression(fieldAccessExpression: JKFieldAccessExpression, data: D): R = visitAssignableExpression(fieldAccessExpression, data) fun visitFieldAccessExpression(fieldAccessExpression: JKFieldAccessExpression, data: D): R = visitAssignableExpression(fieldAccessExpression, data)
fun visitClassAccessExpression(classAccessExpression: JKClassAccessExpression, data: D): R = visitExpression(classAccessExpression, data) fun visitClassAccessExpression(classAccessExpression: JKClassAccessExpression, data: D): R = visitExpression(classAccessExpression, data)
@@ -73,7 +75,7 @@ interface JKVisitor<out R, in D> {
fun visitJavaField(javaField: JKJavaField, data: D): R = visitField(javaField, data) fun visitJavaField(javaField: JKJavaField, data: D): R = visitField(javaField, data)
fun visitJavaMethod(javaMethod: JKJavaMethod, data: D): R = visitMethod(javaMethod, data) fun visitJavaMethod(javaMethod: JKJavaMethod, data: D): R = visitMethod(javaMethod, data)
fun visitJavaMethodCallExpression(javaMethodCallExpression: JKJavaMethodCallExpression, data: D): R = visitMethodCallExpression(javaMethodCallExpression, 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 visitJavaDefaultNewExpression(javaDefaultNewExpression: JKJavaDefaultNewExpression, data: D): R = visitExpression(javaDefaultNewExpression, data)
fun visitJavaModifier(javaModifier: JKJavaModifier, data: D): R = visitModifier(javaModifier, data) fun visitJavaModifier(javaModifier: JKJavaModifier, data: D): R = visitModifier(javaModifier, data)
fun visitJavaNewEmptyArray(javaNewEmptyArray: JKJavaNewEmptyArray, data: D): R = visitExpression(javaNewEmptyArray, data) fun visitJavaNewEmptyArray(javaNewEmptyArray: JKJavaNewEmptyArray, data: D): R = visitExpression(javaNewEmptyArray, data)
@@ -63,6 +63,10 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitPostfixExpression(postfixExpression: JKPostfixExpression, data: Nothing?) = visitPostfixExpression(postfixExpression) override fun visitPostfixExpression(postfixExpression: JKPostfixExpression, data: Nothing?) = visitPostfixExpression(postfixExpression)
fun visitQualifiedExpression(qualifiedExpression: JKQualifiedExpression) = visitExpression(qualifiedExpression, null) fun visitQualifiedExpression(qualifiedExpression: JKQualifiedExpression) = visitExpression(qualifiedExpression, null)
override fun visitQualifiedExpression(qualifiedExpression: JKQualifiedExpression, data: Nothing?) = visitQualifiedExpression(qualifiedExpression) 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) fun visitMethodCallExpression(methodCallExpression: JKMethodCallExpression) = visitExpression(methodCallExpression, null)
override fun visitMethodCallExpression(methodCallExpression: JKMethodCallExpression, data: Nothing?) = visitMethodCallExpression(methodCallExpression) override fun visitMethodCallExpression(methodCallExpression: JKMethodCallExpression, data: Nothing?) = visitMethodCallExpression(methodCallExpression)
fun visitFieldAccessExpression(fieldAccessExpression: JKFieldAccessExpression) = visitAssignableExpression(fieldAccessExpression, null) fun visitFieldAccessExpression(fieldAccessExpression: JKFieldAccessExpression) = visitAssignableExpression(fieldAccessExpression, null)
@@ -143,7 +147,7 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitJavaMethod(javaMethod: JKJavaMethod, data: Nothing?) = visitJavaMethod(javaMethod) override fun visitJavaMethod(javaMethod: JKJavaMethod, data: Nothing?) = visitJavaMethod(javaMethod)
fun visitJavaMethodCallExpression(javaMethodCallExpression: JKJavaMethodCallExpression) = visitMethodCallExpression(javaMethodCallExpression, null) fun visitJavaMethodCallExpression(javaMethodCallExpression: JKJavaMethodCallExpression) = visitMethodCallExpression(javaMethodCallExpression, null)
override fun visitJavaMethodCallExpression(javaMethodCallExpression: JKJavaMethodCallExpression, data: Nothing?) = visitJavaMethodCallExpression(javaMethodCallExpression) 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) override fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression, data: Nothing?) = visitJavaNewExpression(javaNewExpression)
fun visitJavaDefaultNewExpression(javaDefaultNewExpression: JKJavaDefaultNewExpression) = visitExpression(javaDefaultNewExpression, null) fun visitJavaDefaultNewExpression(javaDefaultNewExpression: JKJavaDefaultNewExpression) = visitExpression(javaDefaultNewExpression, null)
override fun visitJavaDefaultNewExpression(javaDefaultNewExpression: JKJavaDefaultNewExpression, data: Nothing?) = visitJavaDefaultNewExpression(javaDefaultNewExpression) override fun visitJavaDefaultNewExpression(javaDefaultNewExpression: JKJavaDefaultNewExpression, data: Nothing?) = visitJavaDefaultNewExpression(javaDefaultNewExpression)