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())
} 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())
}
@@ -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!!
@@ -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)))
)
}
@@ -184,22 +184,22 @@ sealed class JKJavaQualifierImpl : JKQualifier {
class JKJavaMethodCallExpressionImpl(
override var identifier: JKMethodSymbol,
arguments: JKExpressionList,
typeArguments: List<JKTypeElement> = emptyList()
typeArgumentList: JKTypeArgumentList = JKTypeArgumentListImpl()
) : JKJavaMethodCallExpression, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaMethodCallExpression(this, data)
override val arguments: JKExpressionList by child(arguments)
override var typeArguments: List<JKTypeElement> 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 <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaNewExpression(this, data)
override var arguments by child(arguments)
}
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)
}
class JKDelegationConstructorCallImpl(
override val identifier: JKMethodSymbol,
expression: JKExpression,
arguments: JKExpressionList
) : 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 arguments: JKExpressionList by child(arguments)
@@ -516,4 +517,11 @@ class JKAnnotationListImpl(annotations: List<JKAnnotation> = emptyList()) : JKAn
class JKAnnotationImpl(name: JKNameIdentifier) : JKAnnotation, JKBranchElementBase() {
override var name: JKNameIdentifier by child(name)
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(
override val identifier: JKMethodSymbol,
arguments: JKExpressionList,
typeArguments: List<JKTypeElement> = emptyList()
typeArgumentList: JKTypeArgumentList = JKTypeArgumentListImpl()
) : JKKtMethodCallExpression, JKBranchElementBase() {
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 typeArguments: List<JKTypeElement> 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 <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtAlsoCallExpression(this, data)
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(
@@ -285,4 +288,22 @@ class JKKtTryCatchSectionImpl(
override var parameter: JKParameter by child(parameter)
override var block: JKBlock by child(block)
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 JKJavaNewExpression : JKExpression {
val constructorSymbol: JKMethodSymbol
val arguments: JKExpressionList
}
interface JKJavaNewExpression : JKMethodCallExpression
interface JKJavaDefaultNewExpression : JKExpression {
val classSymbol: JKClassSymbol
@@ -164,10 +164,17 @@ interface JKQualifiedExpression : JKExpression, JKAssignableExpression {
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 arguments: JKExpressionList
var typeArguments: List<JKTypeElement>
}
interface JKFieldAccessExpression : JKAssignableExpression {
@@ -33,6 +33,8 @@ interface JKVisitor<out R, in D> {
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<out R, in D> {
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)
@@ -63,6 +63,10 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
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<Unit, Nothing?> {
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)