From 485f5c7e3714ffb9ac55f9a582307173996048fc Mon Sep 17 00:00:00 2001 From: Dimach Date: Sat, 9 Jun 2018 16:12:37 +0300 Subject: [PATCH] New J2K: Binary expression conversion --- .../jetbrains/kotlin/j2k/ConversionsRunner.kt | 1 + .../jetbrains/kotlin/j2k/NewCodeBuilder.kt | 17 ++++++------- .../conversions/BinaryExpressionConverter.kt | 19 +++++++++++++++ .../org/jetbrains/kotlin/j2k/tree/impl/k.kt | 24 +++++++++++++++---- 4 files changed, 46 insertions(+), 15 deletions(-) create mode 100644 j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BinaryExpressionConverter.kt diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt index c452e342492..f1622304e33 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt @@ -30,6 +30,7 @@ object ConversionsRunner { JavaMethodToKotlinFunctionConversion().runConversion(it, context) LiteralConversion().runConversion(it, context) ModifiersConversion().runConversion(it, context) + BinaryExpressionConverter().runConversion(it, context) } } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index 7907d5a1b4c..0ea53cd154c 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -16,13 +16,12 @@ package org.jetbrains.kotlin.j2k -import com.intellij.psi.JavaTokenType -import com.intellij.psi.tree.IElementType import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.impl.JKBodyStub import org.jetbrains.kotlin.j2k.tree.impl.JKClassSymbol import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitorVoid +import org.jetbrains.kotlin.lexer.KtSingleValueToken import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.utils.Printer @@ -39,11 +38,9 @@ class NewCodeBuilder { JKClass.ClassKind.INTERFACE -> "interface" } - private fun operatorString(operator: IElementType): String { - return when (operator) { - JavaTokenType.DIV -> "/" - else -> "TODO: $operator" - } + private fun operatorString(operator: JKOperator): String { + return (operator.token as? KtSingleValueToken)?.value ?: "TODO: $operator" + } inner class Visitor : JKVisitorVoid { @@ -120,7 +117,7 @@ class NewCodeBuilder { override fun visitBinaryExpression(binaryExpression: JKBinaryExpression) { binaryExpression.left.accept(this) printer.printWithNoIndent(" ") - printer.printWithNoIndent(operatorString(binaryExpression.operator.token)) + printer.printWithNoIndent(operatorString(binaryExpression.operator)) printer.printWithNoIndent(" ") binaryExpression.right.accept(this) } @@ -130,13 +127,13 @@ class NewCodeBuilder { } override fun visitPrefixExpression(prefixExpression: JKPrefixExpression) { - printer.printWithNoIndent(operatorString(prefixExpression.operator.token)) + printer.printWithNoIndent(operatorString(prefixExpression.operator)) prefixExpression.expression.accept(this) } override fun visitPostfixExpression(postfixExpression: JKPostfixExpression) { postfixExpression.expression.accept(this) - printer.printWithNoIndent(operatorString(postfixExpression.operator.token)) + printer.printWithNoIndent(operatorString(postfixExpression.operator)) } override fun visitQualifiedExpression(qualifiedExpression: JKQualifiedExpression) { diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BinaryExpressionConverter.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BinaryExpressionConverter.kt new file mode 100644 index 00000000000..b37bc520421 --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BinaryExpressionConverter.kt @@ -0,0 +1,19 @@ +/* + * 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.tree.JKBinaryExpression +import org.jetbrains.kotlin.j2k.tree.JKTreeElement +import org.jetbrains.kotlin.j2k.tree.impl.JKKtOperatorImpl + + +class BinaryExpressionConverter : RecursiveApplicableConversionBase() { + override fun applyToElement(element: JKTreeElement): JKTreeElement { + return if (element is JKBinaryExpression) element.also { + element.operator = JKKtOperatorImpl.javaToKotlinOperator[element.operator] ?: element.operator + } else recurse(element) + } +} \ No newline at end of file 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 ac52bfeea7d..f5fef8dfbbf 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.j2k.tree.impl +import com.intellij.psi.JavaTokenType import com.intellij.psi.tree.IElementType import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor @@ -81,11 +82,24 @@ class JKKtLiteralExpressionImpl( override fun accept(visitor: JKVisitor, data: D): R = visitor.visitKtLiteralExpression(this, data) } -sealed class JKKtOperatorImpl(override val token: IElementType) : JKOperator, JKElementBase() { - object PLUS : JKKtOperatorImpl(KtTokens.PLUS) - object MINUS : JKKtOperatorImpl(KtTokens.MINUS) - object EQEQ : JKKtOperatorImpl(KtTokens.EQEQ) - object NE : JKKtOperatorImpl(KtTokens.NOT_IS) +class JKKtOperatorImpl private constructor(override val token: IElementType) : JKOperator, JKElementBase() { + companion object { + val tokenToOperator = KtTokens.OPERATIONS.types.associate { + it to JKKtOperatorImpl(it) + } + + val javaToKotlinOperator = mutableMapOf() + + init { + javaToKotlinOperator.apply { + this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.DIV]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.DIV]!! + this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.MINUS]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.MINUS]!! + this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.ANDAND]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.ANDAND]!! + this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.OROR]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.OROR]!! + this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.PLUS]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.PLUS]!! + } + } + } } class JKKtModifierImpl(override val type: JKKtModifier.KtModifierType) : JKKtModifier, JKElementBase() {