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.lang.java.JavaLanguage
import com.intellij.psi.* 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.PsiLiteralExpressionImpl
import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl
import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.impl.* import org.jetbrains.kotlin.j2k.tree.impl.*
@@ -39,7 +41,10 @@ class JavaToJKTreeBuilder {
is PsiLiteralExpression -> { is PsiLiteralExpression -> {
return toJK() return toJK()
} }
is PsiCallExpression -> { is PsiMethodCallExpression -> {
return toJK()
}
is PsiReferenceExpression -> {
return toJK() return toJK()
} }
} }
@@ -74,16 +79,23 @@ class JavaToJKTreeBuilder {
return JKPostfixExpressionImpl(operand.toJK(), operationSign.toJK()) return JKPostfixExpressionImpl(operand.toJK(), operationSign.toJK())
} }
fun PsiCallExpression.toJK(): JKExpression { fun PsiMethodCallExpression.toJK(): JKExpression {
return JKJavaCallExpressionImpl(resolveMethod().toJK(), argumentList.toJK()) 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 { fun PsiExpressionList.toJK(): JKExpressionList {
this ?: return JKExpressionListImpl(emptyArray())
return JKExpressionListImpl(expressions.map { it.toJK() }.toTypedArray()) return JKExpressionListImpl(expressions.map { it.toJK() }.toTypedArray())
} }
fun PsiMethod?.toJK(): JKJavaMethodReference { fun PsiIdentifier.convertMethodReference(): JKJavaMethodReference {
return JKJavaMethodReferenceImpl() return JKJavaMethodReferenceImpl()
} }
} }
@@ -77,12 +77,12 @@ sealed class JKJavaQualificationIdentifierImpl : JKJavaQualificationIdentifier,
object DOT : JKJavaQualificationIdentifierImpl() object DOT : JKJavaQualificationIdentifierImpl()
} }
class JKJavaCallExpressionImpl(override val method: JKJavaMethodReference, class JKJavaCallExpressionImpl(override val arguments: JKExpressionList,
override val arguments: JKExpressionList) : JKJavaCallExpression, JKElementBase() { override val identifier: JKJavaMethodReference) : JKJavaCallExpression, JKElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaCallExpression(this, data) 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) { override fun <D> acceptChildren(visitor: JKVisitor<Unit, D>, data: D) {
method.accept(visitor, data) identifier.accept(visitor, data)
arguments.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) { override fun <D> acceptChildren(visitor: JKVisitor<Unit, D>, data: D) {
expressions.forEach { it.accept(visitor, data) } 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 JKJavaAssignmentExpression : JKExpression
interface JKJavaCall : JKCall
interface JKJavaTypeIdentifier : JKTypeIdentifier { interface JKJavaTypeIdentifier : JKTypeIdentifier {
val typeName: String val typeName: String
} }
@@ -48,7 +46,7 @@ interface JKJavaOperatorIdentifier : JKOperatorIdentifier
interface JKJavaQualificationIdentifier : JKQualificationIdentifier interface JKJavaQualificationIdentifier : JKQualificationIdentifier
interface JKJavaCallExpression : JKCallExpression { interface JKJavaCallExpression : JKCallExpression {
override val method: JKJavaMethodReference override val identifier: JKJavaMethodReference
} }
interface JKJavaMethodReference : JKMethodReference interface JKJavaMethodReference : JKMethodReference
@@ -60,14 +60,14 @@ interface JKPostfixExpression : JKUnaryExpression {
} }
interface JKQualifiedExpression : JKExpression { interface JKQualifiedExpression : JKExpression {
val reciever: JKExpression val receiver: JKExpression
val operator: JKQualificationIdentifier val operator: JKQualificationIdentifier
val selector: JKStatement val selector: JKStatement
} }
interface JKCallExpression : JKExpression { interface JKCallExpression : JKExpression {
val identifier: JKMethodReference
val arguments: JKExpressionList val arguments: JKExpressionList
val method: JKMethodReference
} }
interface JKExpressionList : JKElement { interface JKExpressionList : JKElement {
@@ -90,8 +90,6 @@ interface JKBlock : JKElement {
var statements: List<JKStatement> var statements: List<JKStatement>
} }
interface JKCall : JKExpression
interface JKIdentifier : JKElement interface JKIdentifier : JKElement
interface JKTypeIdentifier : JKIdentifier interface JKTypeIdentifier : JKIdentifier
@@ -53,12 +53,6 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitModifier(modifier: JKModifier, data: Nothing?) = visitModifier(modifier) override fun visitModifier(modifier: JKModifier, data: Nothing?) = visitModifier(modifier)
fun visitAccessModifier(accessModifier: JKAccessModifier) = visitModifier(accessModifier, null) fun visitAccessModifier(accessModifier: JKAccessModifier) = visitModifier(accessModifier, null)
override fun visitAccessModifier(accessModifier: JKAccessModifier, data: Nothing?) = visitAccessModifier(accessModifier) 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) fun visitJavaField(javaField: JKJavaField) = visitDeclaration(javaField, null)
override fun visitJavaField(javaField: JKJavaField, data: Nothing?) = visitJavaField(javaField) override fun visitJavaField(javaField: JKJavaField, data: Nothing?) = visitJavaField(javaField)
fun visitJavaMethod(javaMethod: JKJavaMethod) = visitDeclaration(javaMethod, null) 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) override fun visitJavaMethodReference(javaMethodReference: JKJavaMethodReference, data: Nothing?) = visitJavaMethodReference(javaMethodReference)
fun visitJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier) = visitAccessModifier(javaAccessModifier, null) fun visitJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier) = visitAccessModifier(javaAccessModifier, null)
override fun visitJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier, data: Nothing?) = visitJavaAccessModifier(javaAccessModifier) 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) fun visitKtFun(ktFun: JKKtFun) = visitDeclaration(ktFun, null)
override fun visitKtFun(ktFun: JKKtFun, data: Nothing?) = visitKtFun(ktFun) override fun visitKtFun(ktFun: JKKtFun, data: Nothing?) = visitKtFun(ktFun)
fun visitKtConstructor(ktConstructor: JKKtConstructor) = visitDeclaration(ktConstructor, null) 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) override fun visitKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement, data: Nothing?) = visitKtAssignmentStatement(ktAssignmentStatement)
fun visitKtCall(ktCall: JKKtCall) = visitCall(ktCall, null) fun visitKtCall(ktCall: JKKtCall) = visitCall(ktCall, null)
override fun visitKtCall(ktCall: JKKtCall, data: Nothing?) = visitKtCall(ktCall) 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)
} }