From fe180138f390bffa48e543f730c80beb6a4405f0 Mon Sep 17 00:00:00 2001 From: Dimach Date: Sun, 22 Jul 2018 17:56:57 +0300 Subject: [PATCH] New J2K: Assignment conversion second part. --- .../jetbrains/kotlin/j2k/ConversionsRunner.kt | 2 + .../kotlin/j2k/JavaToJKTreeBuilder.kt | 1 - .../jetbrains/kotlin/j2k/NewCodeBuilder.kt | 27 ++++++++ .../org/jetbrains/kotlin/j2k/TreeCopy.kt | 20 ++++++ .../AssignmentAsExpressionToAlsoConversion.kt | 18 +++-- .../AssignmentStatementOperatorConversion.kt | 31 +++++++++ ...ssignmentStatementValCreationConversion.kt | 67 +++++++++++++++++++ .../conversions/BinaryExpressionConversion.kt | 3 +- .../org/jetbrains/kotlin/j2k/tree/impl/jk.kt | 2 + .../org/jetbrains/kotlin/j2k/tree/impl/k.kt | 8 +++ .../org/jetbrains/kotlin/j2k/tree/jk.kt | 10 +-- 11 files changed, 174 insertions(+), 15 deletions(-) create mode 100644 j2k/newSrc/org/jetbrains/kotlin/j2k/TreeCopy.kt create mode 100644 j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/AssignmentStatementOperatorConversion.kt create mode 100644 j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/AssignmentStatementValCreationConversion.kt diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt index 214767d6857..9f357c63b12 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt @@ -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) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index 6cefd90e9a5..7c3bbbbd654 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -227,7 +227,6 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) { else -> throw Exception("Invalid PSI") } } - } private inner class DeclarationMapper(val expressionTreeMapper: ExpressionTreeMapper) { diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index c10d0d1d183..8fa49f22c41 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -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 { diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/TreeCopy.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/TreeCopy.kt new file mode 100644 index 00000000000..578210f5d0d --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/TreeCopy.kt @@ -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.copyTree(): T { + return when (this) { + is JKKtFieldAccessExpression -> JKKtFieldAccessExpressionImpl(identifier) + is JKArrayAccessExpression -> JKArrayAccessExpressionImpl(expression.copyTree(), indexExpression.copyTree()) + else -> TODO("Not supported+$this.toString()") + } as T +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/AssignmentAsExpressionToAlsoConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/AssignmentAsExpressionToAlsoConversion.kt index b8b3abccdef..d87f8518d97 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/AssignmentAsExpressionToAlsoConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/AssignmentAsExpressionToAlsoConversion.kt @@ -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().block.statements.first().cast().expression = JKKtFieldAccessExpressionImpl(context.symbolProvider.provideUniverseSymbol(it.parameter)) } element.invalidate() - return JKQualifiedExpressionImpl( - element.expression, - JKKtQualifierImpl.DOT, - alsoExpression + return recurse( + JKQualifiedExpressionImpl( + element.expression, + JKKtQualifierImpl.DOT, + alsoExpression + ) ) - } } \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/AssignmentStatementOperatorConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/AssignmentStatementOperatorConversion.kt new file mode 100644 index 00000000000..538856ef8d7 --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/AssignmentStatementOperatorConversion.kt @@ -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) + } +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/AssignmentStatementValCreationConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/AssignmentStatementValCreationConversion.kt new file mode 100644 index 00000000000..fc3029622a0 --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/AssignmentStatementValCreationConversion.kt @@ -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) + } +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BinaryExpressionConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BinaryExpressionConversion.kt index 1fd18189f79..83be06c8ab2 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BinaryExpressionConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BinaryExpressionConversion.kt @@ -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) } } \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt index 497cf864a29..572ec0b720b 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -48,6 +48,8 @@ class JKNameIdentifierImpl(override val value: String) : JKNameIdentifier, JKEle class JKModifierListImpl( modifiers: List = emptyList() ) : JKModifierList, JKBranchElementBase() { + constructor(vararg modifiers: JKModifier) : this(modifiers.asList()) + override fun accept(visitor: JKVisitor, data: D): R = visitor.visitModifierList(this, data) override var modifiers: List by children(modifiers) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt index 24c8ac22c9f..902a58c3357 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt @@ -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") } } } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt index 064835c8726..3b24efb62cd 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt @@ -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 {