New J2K: Assignment conversion second part.

This commit is contained in:
Dimach
2018-07-22 17:56:57 +03:00
committed by Ilya Kirillov
parent 3a2b2d9e97
commit fe180138f3
11 changed files with 174 additions and 15 deletions
@@ -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
}
@@ -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
)
)
}
}
@@ -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)
}
}
@@ -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 {