New J2K: Assignment conversion second part.
This commit is contained in:
@@ -28,6 +28,8 @@ object ConversionsRunner {
|
||||
FieldToPropertyConversion().runConversion(it, context)
|
||||
TypeMappingConversion(context).runConversion(it, context)
|
||||
AssignmentAsExpressionToAlsoConversion(context).runConversion(it, context)
|
||||
AssignmentStatementValCreationConversion(context).runConversion(it, context)
|
||||
AssignmentStatementOperatorConversion().runConversion(it, context)
|
||||
JavaMethodToKotlinFunctionConversion().runConversion(it, context)
|
||||
LiteralConversion().runConversion(it, context)
|
||||
ModifiersConversion().runConversion(it, context)
|
||||
|
||||
@@ -227,7 +227,6 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
|
||||
else -> throw Exception("Invalid PSI")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private inner class DeclarationMapper(val expressionTreeMapper: ExpressionTreeMapper) {
|
||||
|
||||
@@ -301,6 +301,33 @@ class NewCodeBuilder {
|
||||
arrayAccessExpression.indexExpression.accept(this)
|
||||
printer.printWithNoIndent("]")
|
||||
}
|
||||
|
||||
override fun visitLambdaExpression(lambdaExpression: JKLambdaExpression) {
|
||||
printer.printWithNoIndent("{")
|
||||
lambdaExpression.parameters.firstOrNull()?.accept(this)
|
||||
lambdaExpression.parameters.asSequence().drop(1).forEach { printer.printWithNoIndent(", "); it.accept(this) }
|
||||
printer.printWithNoIndent(" -> ")
|
||||
lambdaExpression.statement.accept(this)
|
||||
printer.printWithNoIndent("}")
|
||||
}
|
||||
|
||||
override fun visitBlockStatement(blockStatement: JKBlockStatement) {
|
||||
printer.printWithNoIndent("{ ")
|
||||
blockStatement.block.accept(this)
|
||||
printer.printWithNoIndent(" }")
|
||||
}
|
||||
|
||||
override fun visitParameter(parameter: JKParameter) {
|
||||
printer.printWithNoIndent(parameter.name.value)
|
||||
}
|
||||
|
||||
override fun visitKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement) {
|
||||
ktAssignmentStatement.field.accept(this)
|
||||
printer.printWithNoIndent(" ")
|
||||
printer.printWithNoIndent(ktAssignmentStatement.operator.operatorText)
|
||||
printer.printWithNoIndent(" ")
|
||||
ktAssignmentStatement.expression.accept(this)
|
||||
}
|
||||
}
|
||||
|
||||
fun printCodeOut(root: JKTreeElement): String {
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.j2k
|
||||
|
||||
import org.jetbrains.kotlin.j2k.tree.JKArrayAccessExpression
|
||||
import org.jetbrains.kotlin.j2k.tree.JKElement
|
||||
import org.jetbrains.kotlin.j2k.tree.JKKtFieldAccessExpression
|
||||
import org.jetbrains.kotlin.j2k.tree.impl.JKArrayAccessExpressionImpl
|
||||
import org.jetbrains.kotlin.j2k.tree.impl.JKKtFieldAccessExpressionImpl
|
||||
|
||||
fun <T : JKElement> T.copyTree(): T {
|
||||
return when (this) {
|
||||
is JKKtFieldAccessExpression -> JKKtFieldAccessExpressionImpl(identifier)
|
||||
is JKArrayAccessExpression -> JKArrayAccessExpressionImpl(expression.copyTree(), indexExpression.copyTree())
|
||||
else -> TODO("Not supported+$this.toString()")
|
||||
} as T
|
||||
}
|
||||
+11
-7
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.j2k.ConversionContext
|
||||
import org.jetbrains.kotlin.j2k.tree.*
|
||||
import org.jetbrains.kotlin.j2k.tree.impl.*
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.cast
|
||||
|
||||
class AssignmentAsExpressionToAlsoConversion(val context: ConversionContext) : RecursiveApplicableConversionBase() {
|
||||
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
||||
@@ -19,18 +20,21 @@ class AssignmentAsExpressionToAlsoConversion(val context: ConversionContext) : R
|
||||
) as JKMethodSymbol
|
||||
|
||||
val alsoExpression = JKKtAlsoCallExpressionImpl(
|
||||
JKKtAssignmentStatementImpl(element.field, JKStubExpressionImpl(), element.operator), alsoSymbol
|
||||
JKBlockStatementImpl(
|
||||
JKBlockImpl(listOf(JKKtAssignmentStatementImpl(element.field, JKStubExpressionImpl(), element.operator)))
|
||||
), alsoSymbol
|
||||
).also {
|
||||
(it.statement as JKKtAssignmentStatement).expression =
|
||||
it.statement.cast<JKBlockStatement>().block.statements.first().cast<JKKtAssignmentStatement>().expression =
|
||||
JKKtFieldAccessExpressionImpl(context.symbolProvider.provideUniverseSymbol(it.parameter))
|
||||
}
|
||||
element.invalidate()
|
||||
|
||||
return JKQualifiedExpressionImpl(
|
||||
element.expression,
|
||||
JKKtQualifierImpl.DOT,
|
||||
alsoExpression
|
||||
return recurse(
|
||||
JKQualifiedExpressionImpl(
|
||||
element.expression,
|
||||
JKKtQualifierImpl.DOT,
|
||||
alsoExpression
|
||||
)
|
||||
)
|
||||
|
||||
}
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.j2k.conversions
|
||||
|
||||
import org.jetbrains.kotlin.j2k.copyTree
|
||||
import org.jetbrains.kotlin.j2k.tree.JKKtAssignmentStatement
|
||||
import org.jetbrains.kotlin.j2k.tree.JKTreeElement
|
||||
import org.jetbrains.kotlin.j2k.tree.impl.JKBinaryExpressionImpl
|
||||
import org.jetbrains.kotlin.j2k.tree.impl.JKKtOperatorImpl
|
||||
import org.jetbrains.kotlin.j2k.tree.impl.JKKtWordOperatorImpl
|
||||
import org.jetbrains.kotlin.j2k.tree.impl.JKStubExpressionImpl
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
|
||||
class AssignmentStatementOperatorConversion : RecursiveApplicableConversionBase() {
|
||||
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
||||
if (element !is JKKtAssignmentStatement) return recurse(element)
|
||||
val newOperator = JKKtOperatorImpl.javaToKotlinOperator[element.operator] ?: return recurse(element)
|
||||
if (newOperator is JKKtWordOperatorImpl) {
|
||||
element.operator = JKKtOperatorImpl.tokenToOperator[KtTokens.EQ] ?: return recurse(element)
|
||||
val expr = element.expression
|
||||
element.expression = JKStubExpressionImpl()
|
||||
element.expression = JKBinaryExpressionImpl(expr, element.field.copyTree(), newOperator)
|
||||
} else {
|
||||
element.operator = newOperator
|
||||
}
|
||||
return recurse(element)
|
||||
}
|
||||
}
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.j2k.conversions
|
||||
|
||||
import org.jetbrains.kotlin.j2k.ConversionContext
|
||||
import org.jetbrains.kotlin.j2k.tree.*
|
||||
import org.jetbrains.kotlin.j2k.tree.impl.*
|
||||
|
||||
class AssignmentStatementValCreationConversion(val context: ConversionContext) : RecursiveApplicableConversionBase() {
|
||||
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
||||
if (element !is JKKtAlsoCallExpression) return recurse(element)
|
||||
val codeBlock = (element.statement as? JKBlockStatement)?.block ?: return recurse(element)
|
||||
val assignableExpr = (codeBlock.statements.first() as? JKKtAssignmentStatement)?.field ?: return recurse(element)
|
||||
when (assignableExpr) {
|
||||
is JKArrayAccessExpression -> {
|
||||
val ex1 = assignableExpr.expression
|
||||
val ex2 = assignableExpr.indexExpression
|
||||
assignableExpr.expression = JKStubExpressionImpl()
|
||||
assignableExpr.indexExpression = JKStubExpressionImpl()
|
||||
codeBlock.statements = listOf(
|
||||
JKDeclarationStatementImpl(
|
||||
listOf(
|
||||
JKLocalVariableImpl(
|
||||
JKModifierListImpl(JKModalityModifierImpl(JKModalityModifier.Modality.FINAL)),
|
||||
JKTypeElementImpl(JKJavaVoidType/*TODO*/),
|
||||
JKNameIdentifierImpl("arr"),
|
||||
ex1
|
||||
).also {
|
||||
assignableExpr.expression = JKKtFieldAccessExpressionImpl(context.symbolProvider.provideUniverseSymbol(it))
|
||||
}, JKLocalVariableImpl(
|
||||
JKModifierListImpl(JKModalityModifierImpl(JKModalityModifier.Modality.FINAL)),
|
||||
JKTypeElementImpl(JKJavaVoidType/*TODO*/),
|
||||
JKNameIdentifierImpl("i"),
|
||||
ex2
|
||||
).also {
|
||||
assignableExpr.indexExpression =
|
||||
JKKtFieldAccessExpressionImpl(context.symbolProvider.provideUniverseSymbol(it))
|
||||
}
|
||||
)
|
||||
)
|
||||
) + codeBlock.statements
|
||||
}
|
||||
is JKQualifiedExpression -> {
|
||||
val ex = assignableExpr.receiver
|
||||
assignableExpr.receiver = JKStubExpressionImpl()
|
||||
codeBlock.statements = listOf(
|
||||
JKDeclarationStatementImpl(
|
||||
listOf(
|
||||
JKLocalVariableImpl(
|
||||
JKModifierListImpl(JKModalityModifierImpl(JKModalityModifier.Modality.FINAL)),
|
||||
JKTypeElementImpl(JKJavaVoidType/*TODO*/),
|
||||
JKNameIdentifierImpl("arg"),
|
||||
ex
|
||||
).also {
|
||||
assignableExpr.receiver = JKKtFieldAccessExpressionImpl(context.symbolProvider.provideUniverseSymbol(it))
|
||||
}
|
||||
)
|
||||
)
|
||||
) + codeBlock.statements
|
||||
}
|
||||
}
|
||||
return recurse(element)
|
||||
}
|
||||
}
|
||||
@@ -12,9 +12,8 @@ import org.jetbrains.kotlin.j2k.tree.impl.JKKtOperatorImpl
|
||||
|
||||
class BinaryExpressionConversion : RecursiveApplicableConversionBase() {
|
||||
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
||||
if (element is JKBinaryExpression) element.also {
|
||||
if (element is JKBinaryExpression)
|
||||
element.operator = JKKtOperatorImpl.javaToKotlinOperator[element.operator] ?: element.operator
|
||||
}
|
||||
return recurse(element)
|
||||
}
|
||||
}
|
||||
@@ -48,6 +48,8 @@ class JKNameIdentifierImpl(override val value: String) : JKNameIdentifier, JKEle
|
||||
class JKModifierListImpl(
|
||||
modifiers: List<JKModifier> = emptyList()
|
||||
) : JKModifierList, JKBranchElementBase() {
|
||||
constructor(vararg modifiers: JKModifier) : this(modifiers.asList())
|
||||
|
||||
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitModifierList(this, data)
|
||||
|
||||
override var modifiers: List<JKModifier> by children(modifiers)
|
||||
|
||||
@@ -109,12 +109,20 @@ class JKKtOperatorImpl private constructor(val token: KtSingleValueToken) : JKOp
|
||||
this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.LT]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.LT]!!
|
||||
this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.LE]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.LTEQ]!!
|
||||
this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.PERC]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.PERC]!!
|
||||
|
||||
this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.EQ]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.EQ]!!
|
||||
this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.PLUSEQ]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.PLUSEQ]!!
|
||||
this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.MINUSEQ]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.MINUSEQ]!!
|
||||
|
||||
this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.AND]!!] = JKKtWordOperatorImpl("and")
|
||||
this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.OR]!!] = JKKtWordOperatorImpl("or")
|
||||
this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.XOR]!!] = JKKtWordOperatorImpl("xor")
|
||||
this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.GTGTGT]!!] = JKKtWordOperatorImpl("ushr")
|
||||
this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.GTGT]!!] = JKKtWordOperatorImpl("shr")
|
||||
this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.LTLT]!!] = JKKtWordOperatorImpl("shl")
|
||||
|
||||
this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.OREQ]!!] = JKKtWordOperatorImpl("or")
|
||||
this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.ANDEQ]!!] = JKKtWordOperatorImpl("and")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -132,9 +132,9 @@ interface JKPrefixExpression : JKUnaryExpression
|
||||
interface JKPostfixExpression : JKUnaryExpression
|
||||
|
||||
interface JKQualifiedExpression : JKExpression, JKAssignableExpression {
|
||||
val receiver: JKExpression
|
||||
val operator: JKQualifier
|
||||
val selector: JKExpression
|
||||
var receiver: JKExpression
|
||||
var operator: JKQualifier
|
||||
var selector: JKExpression
|
||||
}
|
||||
|
||||
interface JKMethodCallExpression : JKExpression {
|
||||
@@ -151,8 +151,8 @@ interface JKClassAccessExpression : JKExpression {
|
||||
}
|
||||
|
||||
interface JKArrayAccessExpression : JKAssignableExpression {
|
||||
val expression: JKExpression
|
||||
val indexExpression: JKExpression
|
||||
var expression: JKExpression
|
||||
var indexExpression: JKExpression
|
||||
}
|
||||
|
||||
interface JKParenthesizedExpression : JKExpression {
|
||||
|
||||
Reference in New Issue
Block a user