New J2K: Added java -> jk converter for method call.

This commit is contained in:
Dimach
2017-10-19 02:17:27 +03:00
committed by Ilya Kirillov
parent 9bfd8e4453
commit 98d01d600a
6 changed files with 34 additions and 26 deletions
@@ -18,7 +18,9 @@ package org.jetbrains.kotlin.j2k
import com.intellij.lang.java.JavaLanguage
import com.intellij.psi.*
import com.intellij.psi.impl.source.tree.ChildRole
import com.intellij.psi.impl.source.tree.java.PsiLiteralExpressionImpl
import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl
import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.impl.*
@@ -39,7 +41,10 @@ class JavaToJKTreeBuilder {
is PsiLiteralExpression -> {
return toJK()
}
is PsiCallExpression -> {
is PsiMethodCallExpression -> {
return toJK()
}
is PsiReferenceExpression -> {
return toJK()
}
}
@@ -74,16 +79,23 @@ class JavaToJKTreeBuilder {
return JKPostfixExpressionImpl(operand.toJK(), operationSign.toJK())
}
fun PsiCallExpression.toJK(): JKExpression {
return JKJavaCallExpressionImpl(resolveMethod().toJK(), argumentList.toJK())
fun PsiMethodCallExpression.toJK(): JKExpression {
val method = methodExpression as PsiReferenceExpressionImpl
val identifier = (method.referenceNameElement as PsiIdentifier).convertMethodReference()
val call = JKJavaCallExpressionImpl(argumentList.toJK(), identifier)
return if (method.findChildByRole(ChildRole.DOT) != null) {
JKQualifiedExpressionImpl((method.qualifier as PsiExpression).toJK(), JKJavaQualificationIdentifierImpl.DOT, call)
}
else {
call
}
}
fun PsiExpressionList?.toJK(): JKExpressionList {
this ?: return JKExpressionListImpl(emptyArray())
fun PsiExpressionList.toJK(): JKExpressionList {
return JKExpressionListImpl(expressions.map { it.toJK() }.toTypedArray())
}
fun PsiMethod?.toJK(): JKJavaMethodReference {
fun PsiIdentifier.convertMethodReference(): JKJavaMethodReference {
return JKJavaMethodReferenceImpl()
}
}
@@ -77,12 +77,12 @@ sealed class JKJavaQualificationIdentifierImpl : JKJavaQualificationIdentifier,
object DOT : JKJavaQualificationIdentifierImpl()
}
class JKJavaCallExpressionImpl(override val method: JKJavaMethodReference,
override val arguments: JKExpressionList) : JKJavaCallExpression, JKElementBase() {
class JKJavaCallExpressionImpl(override val arguments: JKExpressionList,
override val identifier: JKJavaMethodReference) : JKJavaCallExpression, JKElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaCallExpression(this, data)
override fun <D> acceptChildren(visitor: JKVisitor<Unit, D>, data: D) {
method.accept(visitor, data)
identifier.accept(visitor, data)
arguments.accept(visitor, data)
}
}
@@ -111,4 +111,14 @@ class JKExpressionListImpl(override val expressions: Array<JKExpression>) : JKEx
override fun <D> acceptChildren(visitor: JKVisitor<Unit, D>, data: D) {
expressions.forEach { it.accept(visitor, data) }
}
}
class JKQualifiedExpressionImpl(override val receiver: JKExpression, override val operator: JKQualificationIdentifier,
override val selector: JKStatement) : JKQualifiedExpression, JKElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitQualifiedExpression(this, data)
override fun <D> acceptChildren(visitor: JKVisitor<Unit, D>, data: D) {
receiver.accept(visitor, data)
operator.accept(visitor, data)
selector.accept(visitor, data)
}
}
@@ -33,8 +33,6 @@ interface JKJavaForLoop : JKLoop
interface JKJavaAssignmentExpression : JKExpression
interface JKJavaCall : JKCall
interface JKJavaTypeIdentifier : JKTypeIdentifier {
val typeName: String
}
@@ -48,7 +46,7 @@ interface JKJavaOperatorIdentifier : JKOperatorIdentifier
interface JKJavaQualificationIdentifier : JKQualificationIdentifier
interface JKJavaCallExpression : JKCallExpression {
override val method: JKJavaMethodReference
override val identifier: JKJavaMethodReference
}
interface JKJavaMethodReference : JKMethodReference
@@ -60,14 +60,14 @@ interface JKPostfixExpression : JKUnaryExpression {
}
interface JKQualifiedExpression : JKExpression {
val reciever: JKExpression
val receiver: JKExpression
val operator: JKQualificationIdentifier
val selector: JKStatement
}
interface JKCallExpression : JKExpression {
val identifier: JKMethodReference
val arguments: JKExpressionList
val method: JKMethodReference
}
interface JKExpressionList : JKElement {
@@ -90,8 +90,6 @@ interface JKBlock : JKElement {
var statements: List<JKStatement>
}
interface JKCall : JKExpression
interface JKIdentifier : JKElement
interface JKTypeIdentifier : JKIdentifier
@@ -53,12 +53,6 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitModifier(modifier: JKModifier, data: Nothing?) = visitModifier(modifier)
fun visitAccessModifier(accessModifier: JKAccessModifier) = visitModifier(accessModifier, null)
override fun visitAccessModifier(accessModifier: JKAccessModifier, data: Nothing?) = visitAccessModifier(accessModifier)
fun visitValueArgument(valueArgument: JKValueArgument) = visitElement(valueArgument, null)
override fun visitValueArgument(valueArgument: JKValueArgument, data: Nothing?) = visitValueArgument(valueArgument)
fun visitStringLiteralExpression(stringLiteralExpression: JKStringLiteralExpression) = visitLiteralExpression(stringLiteralExpression, null)
override fun visitStringLiteralExpression(stringLiteralExpression: JKStringLiteralExpression, data: Nothing?) = visitStringLiteralExpression(stringLiteralExpression)
fun visitModalityModifier(modalityModifier: JKModalityModifier) = visitModifier(modalityModifier, null)
override fun visitModalityModifier(modalityModifier: JKModalityModifier, data: Nothing?) = visitModalityModifier(modalityModifier)
fun visitJavaField(javaField: JKJavaField) = visitDeclaration(javaField, null)
override fun visitJavaField(javaField: JKJavaField, data: Nothing?) = visitJavaField(javaField)
fun visitJavaMethod(javaMethod: JKJavaMethod) = visitDeclaration(javaMethod, null)
@@ -83,8 +77,6 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitJavaMethodReference(javaMethodReference: JKJavaMethodReference, data: Nothing?) = visitJavaMethodReference(javaMethodReference)
fun visitJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier) = visitAccessModifier(javaAccessModifier, null)
override fun visitJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier, data: Nothing?) = visitJavaAccessModifier(javaAccessModifier)
fun visitJavaModifier(javaModifier: JKJavaModifier) = visitModifier(javaModifier, null)
override fun visitJavaModifier(javaModifier: JKJavaModifier, data: Nothing?) = visitJavaModifier(javaModifier)
fun visitKtFun(ktFun: JKKtFun) = visitDeclaration(ktFun, null)
override fun visitKtFun(ktFun: JKKtFun, data: Nothing?) = visitKtFun(ktFun)
fun visitKtConstructor(ktConstructor: JKKtConstructor) = visitDeclaration(ktConstructor, null)
@@ -95,6 +87,4 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement, data: Nothing?) = visitKtAssignmentStatement(ktAssignmentStatement)
fun visitKtCall(ktCall: JKKtCall) = visitCall(ktCall, null)
override fun visitKtCall(ktCall: JKKtCall, data: Nothing?) = visitKtCall(ktCall)
fun visitKtProperty(ktProperty: JKKtProperty) = visitDeclaration(ktProperty, null)
override fun visitKtProperty(ktProperty: JKKtProperty, data: Nothing?) = visitKtProperty(ktProperty)
}