New J2K: Added declaration statements, local variables and stub expression.

This commit is contained in:
Dimach
2018-05-29 17:05:05 +03:00
committed by Ilya Kirillov
parent 26c011b44a
commit 3bbef363e6
9 changed files with 68 additions and 32 deletions
@@ -232,8 +232,8 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
return JKJavaFieldImpl(
with(modifierMapper) { modifierList.toJK() },
with(expressionTreeMapper) { typeElement?.toJK() } ?: TODO(),
JKNameIdentifierImpl(this.name),
with(expressionTreeMapper) { initializer?.toJK() } ?: TODO()
JKNameIdentifierImpl(name),
with(expressionTreeMapper) { initializer?.toJK() } ?: JKStubExpressionImpl()
).also {
(symbolProvider.provideSymbol(this) as? JKUniverseFieldSymbol)?.run { target = it }
}
@@ -265,14 +265,26 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
return JKBlockImpl(statements.map { it.toJK() })
}
fun Array<out PsiElement>.toJK(): List<JKDeclaration> {
return this.map {
if (it is PsiLocalVariable) {
JKLocalVariableImpl(
with(modifierMapper) { it.modifierList.toJK() },
with(expressionTreeMapper) { it.typeElement.toJK() },
JKNameIdentifierImpl(it.name ?: TODO()),
with(expressionTreeMapper) { it.initializer?.toJK() } ?: JKStubExpressionImpl()
).also { i -> symbolProvider.symbols[it] = JKUniverseFieldSymbol(i) }
} else TODO()
}
}
fun PsiStatement.toJK(): JKStatement {
if (this is PsiExpressionStatement) {
return JKExpressionStatementImpl(with(expressionTreeMapper) { expression.toJK() })
return when (this) {
is PsiExpressionStatement -> JKExpressionStatementImpl(with(expressionTreeMapper) { expression.toJK() })
is PsiReturnStatement -> JKReturnStatementImpl(with(expressionTreeMapper) { returnValue?.toJK() ?: JKStubExpressionImpl() })
is PsiDeclarationStatement -> JKDeclarationStatementImpl(declaredElements.toJK())
else -> TODO("for ${this::class}")
}
if (this is PsiReturnStatement) {
return JKReturnStatementImpl(with(expressionTreeMapper) { returnValue?.toJK() ?: TODO() })
}
TODO("for ${this::class}")
}
}
@@ -21,13 +21,8 @@ import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType.*
import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
class JKJavaFieldImpl(
modifierList: JKModifierList,
type: JKTypeElement,
name: JKNameIdentifier,
initializer: JKExpression
) : JKJavaField, JKBranchElementBase() {
class JKJavaFieldImpl(modifierList: JKModifierList, type: JKTypeElement, name: JKNameIdentifier, initializer: JKExpression) : JKJavaField,
JKBranchElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaField(this, data)
override var initializer: JKExpression by child(initializer)
@@ -37,13 +32,8 @@ class JKJavaFieldImpl(
}
class JKJavaMethodImpl(
modifierList: JKModifierList,
returnType: JKTypeElement,
name: JKNameIdentifier,
valueArguments: List<JKValueArgument>,
block: JKBlock
modifierList: JKModifierList, returnType: JKTypeElement, name: JKNameIdentifier, valueArguments: List<JKValueArgument>, block: JKBlock
) : JKJavaMethod, JKBranchElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaMethod(this, data)
override var modifierList: JKModifierList by child(modifierList)
@@ -65,7 +55,6 @@ class JKJavaLiteralExpressionImpl(
}
}
class JKJavaAccessModifierImpl(override val type: JKJavaAccessModifier.AccessModifierType) : JKJavaAccessModifier, JKElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaAccessModifier(this, data)
}
@@ -36,7 +36,6 @@ class JKClassImpl(
}
class JKNameIdentifierImpl(override val value: String) : JKNameIdentifier, JKElementBase() {}
class JKModifierListImpl(
@@ -59,6 +58,7 @@ class JKBlockImpl(statements: List<JKStatement> = emptyList()) : JKBlock, JKBran
override var statements by children(statements)
}
class JKBinaryExpressionImpl(
left: JKExpression,
right: JKExpression,
@@ -100,14 +100,18 @@ class JKQualifiedExpressionImpl(
override var selector: JKExpression by child(selector)
}
class JKExpressionStatementImpl(
expression: JKExpression
) : JKExpressionStatement, JKBranchElementBase() {
class JKExpressionStatementImpl(expression: JKExpression) : JKExpressionStatement, JKBranchElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitExpressionStatement(this, data)
override val expression: JKExpression by child(expression)
}
class JKDeclarationStatementImpl(declaredStatements: List<JKDeclaration>) : JKDeclarationStatement, JKBranchElementBase() {
override val declaredStatements by children(declaredStatements)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitDeclarationStatement(this, data)
}
class JKArrayAccessExpressionImpl(
expression: JKExpression,
indexExpression: JKExpression
@@ -151,3 +155,15 @@ class JKBooleanLiteral(val value: Boolean) : JKLiteralExpression, JKElementBase(
override val type: LiteralType
get() = BOOLEAN
}
class JKLocalVariableImpl(modifierList: JKModifierList, type: JKTypeElement, name: JKNameIdentifier, initializer: JKExpression) :
JKLocalVariable, JKBranchElementBase() {
override var modifierList by child(modifierList)
override val initializer by child(initializer)
override val name by child(name)
override val type by child(type)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitLocalVariable(this, data)
}
class JKStubExpressionImpl() : JKStubExpression, JKElementBase()
@@ -69,7 +69,11 @@ class JKMultiverseMethodSymbol(override val target: PsiMethod) : JKMethodSymbol
}
class JKUniverseFieldSymbol : JKFieldSymbol {
class JKUniverseFieldSymbol() : JKFieldSymbol {
constructor(target: JKField) : this() {
this.target = target
}
override lateinit var target: JKField
override val declaredIn: JKSymbol
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
@@ -18,9 +18,7 @@ package org.jetbrains.kotlin.j2k.tree
import org.jetbrains.kotlin.j2k.tree.impl.JKMethodSymbol
interface JKJavaField : JKField, JKBranchElement {
val initializer: JKExpression
}
interface JKJavaField : JKField, JKBranchElement
interface JKJavaMethod : JKMethod, JKBranchElement {
val block: JKBlock
+10 -1
View File
@@ -47,8 +47,11 @@ interface JKMethod : JKDeclaration, JKModifierListOwner {
interface JKField : JKDeclaration, JKModifierListOwner {
val type: JKTypeElement
val name: JKNameIdentifier
val initializer: JKExpression
}
interface JKLocalVariable : JKField
interface JKModifier : JKTreeElement
interface JKModifierList : JKTreeElement {
@@ -83,6 +86,10 @@ interface JKExpressionStatement : JKStatement {
val expression: JKExpression
}
interface JKDeclarationStatement : JKStatement {
val declaredStatements: List<JKDeclaration>
}
interface JKBinaryExpression : JKExpression {
var left: JKExpression
var right: JKExpression
@@ -147,4 +154,6 @@ interface JKValueArgument : JKTreeElement {
interface JKStringLiteralExpression : JKLiteralExpression {
val text: String
}
}
interface JKStubExpression : JKExpression
@@ -17,7 +17,6 @@
package org.jetbrains.kotlin.j2k.tree
interface JKKtProperty : JKField {
val initializer: JKExpression
val getter: JKBlock
val setter: JKBlock
}
@@ -8,6 +8,7 @@ interface JKVisitor<out R, in D> {
fun visitClass(klass: JKClass, data: D): R = visitDeclaration(klass, data)
fun visitMethod(method: JKMethod, data: D): R = visitDeclaration(method, data)
fun visitField(field: JKField, data: D): R = visitDeclaration(field, data)
fun visitLocalVariable(localVariable: JKLocalVariable, data: D): R = visitField(localVariable, data)
fun visitModifier(modifier: JKModifier, data: D): R = visitTreeElement(modifier, data)
fun visitModifierList(modifierList: JKModifierList, data: D): R = visitTreeElement(modifierList, data)
fun visitAccessModifier(accessModifier: JKAccessModifier, data: D): R = visitModifier(accessModifier, data)
@@ -20,6 +21,7 @@ interface JKVisitor<out R, in D> {
fun visitNameIdentifier(nameIdentifier: JKNameIdentifier, data: D): R = visitIdentifier(nameIdentifier, data)
fun visitExpression(expression: JKExpression, data: D): R = visitTreeElement(expression, data)
fun visitExpressionStatement(expressionStatement: JKExpressionStatement, data: D): R = visitStatement(expressionStatement, data)
fun visitDeclarationStatement(declarationStatement: JKDeclarationStatement, data: D): R = visitStatement(declarationStatement, data)
fun visitBinaryExpression(binaryExpression: JKBinaryExpression, data: D): R = visitExpression(binaryExpression, data)
fun visitUnaryExpression(unaryExpression: JKUnaryExpression, data: D): R = visitExpression(unaryExpression, data)
fun visitPrefixExpression(prefixExpression: JKPrefixExpression, data: D): R = visitUnaryExpression(prefixExpression, data)
@@ -34,6 +36,7 @@ interface JKVisitor<out R, in D> {
fun visitLiteralExpression(literalExpression: JKLiteralExpression, data: D): R = visitExpression(literalExpression, data)
fun visitValueArgument(valueArgument: JKValueArgument, data: D): R = visitTreeElement(valueArgument, data)
fun visitStringLiteralExpression(stringLiteralExpression: JKStringLiteralExpression, data: D): R = visitLiteralExpression(stringLiteralExpression, data)
fun visitStubExpression(stubExpression: JKStubExpression, data: D): R = visitExpression(stubExpression, data)
fun visitJavaField(javaField: JKJavaField, data: D): R = visitField(javaField, data)
fun visitJavaMethod(javaMethod: JKJavaMethod, data: D): R = visitMethod(javaMethod, data)
fun visitJavaForLoop(javaForLoop: JKJavaForLoop, data: D): R = visitLoop(javaForLoop, data)
@@ -13,6 +13,8 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitMethod(method: JKMethod, data: Nothing?) = visitMethod(method)
fun visitField(field: JKField) = visitDeclaration(field, null)
override fun visitField(field: JKField, data: Nothing?) = visitField(field)
fun visitLocalVariable(localVariable: JKLocalVariable) = visitField(localVariable, null)
override fun visitLocalVariable(localVariable: JKLocalVariable, data: Nothing?) = visitLocalVariable(localVariable)
fun visitModifier(modifier: JKModifier) = visitTreeElement(modifier, null)
override fun visitModifier(modifier: JKModifier, data: Nothing?) = visitModifier(modifier)
fun visitModifierList(modifierList: JKModifierList) = visitTreeElement(modifierList, null)
@@ -37,6 +39,8 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitExpression(expression: JKExpression, data: Nothing?) = visitExpression(expression)
fun visitExpressionStatement(expressionStatement: JKExpressionStatement) = visitStatement(expressionStatement, null)
override fun visitExpressionStatement(expressionStatement: JKExpressionStatement, data: Nothing?) = visitExpressionStatement(expressionStatement)
fun visitDeclarationStatement(declarationStatement: JKDeclarationStatement) = visitStatement(declarationStatement, null)
override fun visitDeclarationStatement(declarationStatement: JKDeclarationStatement, data: Nothing?) = visitDeclarationStatement(declarationStatement)
fun visitBinaryExpression(binaryExpression: JKBinaryExpression) = visitExpression(binaryExpression, null)
override fun visitBinaryExpression(binaryExpression: JKBinaryExpression, data: Nothing?) = visitBinaryExpression(binaryExpression)
fun visitUnaryExpression(unaryExpression: JKUnaryExpression) = visitExpression(unaryExpression, null)
@@ -65,6 +69,8 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
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 visitStubExpression(stubExpression: JKStubExpression) = visitExpression(stubExpression, null)
override fun visitStubExpression(stubExpression: JKStubExpression, data: Nothing?) = visitStubExpression(stubExpression)
fun visitJavaField(javaField: JKJavaField) = visitField(javaField, null)
override fun visitJavaField(javaField: JKJavaField, data: Nothing?) = visitJavaField(javaField)
fun visitJavaMethod(javaMethod: JKJavaMethod) = visitMethod(javaMethod, null)