New J2K: More binary expressions support and boolean literals.

This commit is contained in:
Dimach
2018-06-21 04:55:26 +03:00
committed by Ilya Kirillov
parent d183285a75
commit 15ad2af268
8 changed files with 33 additions and 21 deletions
@@ -31,7 +31,7 @@ object ConversionsRunner {
JavaMethodToKotlinFunctionConversion().runConversion(it, context) JavaMethodToKotlinFunctionConversion().runConversion(it, context)
LiteralConversion().runConversion(it, context) LiteralConversion().runConversion(it, context)
ModifiersConversion().runConversion(it, context) ModifiersConversion().runConversion(it, context)
BinaryExpressionConverter().runConversion(it, context) BinaryExpressionConversion().runConversion(it, context)
} }
} }
@@ -22,7 +22,6 @@ import org.jetbrains.kotlin.j2k.tree.impl.JKBodyStub
import org.jetbrains.kotlin.j2k.tree.impl.JKClassSymbol import org.jetbrains.kotlin.j2k.tree.impl.JKClassSymbol
import org.jetbrains.kotlin.j2k.tree.impl.modality import org.jetbrains.kotlin.j2k.tree.impl.modality
import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitorVoid import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitorVoid
import org.jetbrains.kotlin.lexer.KtSingleValueToken
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.utils.Printer import org.jetbrains.kotlin.utils.Printer
@@ -39,11 +38,6 @@ class NewCodeBuilder {
JKClass.ClassKind.INTERFACE -> "interface" JKClass.ClassKind.INTERFACE -> "interface"
} }
private fun operatorString(operator: JKOperator): String {
return (operator.token as? KtSingleValueToken)?.value ?: "TODO: $operator"
}
inner class Visitor : JKVisitorVoid { inner class Visitor : JKVisitorVoid {
override fun visitTreeElement(treeElement: JKTreeElement) { override fun visitTreeElement(treeElement: JKTreeElement) {
printer.print("/* !!! Hit visitElement for element type: ${treeElement::class} !!! */") printer.print("/* !!! Hit visitElement for element type: ${treeElement::class} !!! */")
@@ -144,23 +138,23 @@ class NewCodeBuilder {
override fun visitBinaryExpression(binaryExpression: JKBinaryExpression) { override fun visitBinaryExpression(binaryExpression: JKBinaryExpression) {
binaryExpression.left.accept(this) binaryExpression.left.accept(this)
printer.printWithNoIndent(" ") printer.printWithNoIndent(" ")
printer.printWithNoIndent(operatorString(binaryExpression.operator)) printer.printWithNoIndent(binaryExpression.operator.operatorText)
printer.printWithNoIndent(" ") printer.printWithNoIndent(" ")
binaryExpression.right.accept(this) binaryExpression.right.accept(this)
} }
override fun visitKtLiteralExpression(ktLiteralExpression: JKKtLiteralExpression) { override fun visitLiteralExpression(literalExpression: JKLiteralExpression) {
printer.printWithNoIndent(ktLiteralExpression.literal) printer.printWithNoIndent(literalExpression.literal)
} }
override fun visitPrefixExpression(prefixExpression: JKPrefixExpression) { override fun visitPrefixExpression(prefixExpression: JKPrefixExpression) {
printer.printWithNoIndent(operatorString(prefixExpression.operator)) printer.printWithNoIndent(prefixExpression.operator.operatorText)
prefixExpression.expression.accept(this) prefixExpression.expression.accept(this)
} }
override fun visitPostfixExpression(postfixExpression: JKPostfixExpression) { override fun visitPostfixExpression(postfixExpression: JKPostfixExpression) {
postfixExpression.expression.accept(this) postfixExpression.expression.accept(this)
printer.printWithNoIndent(operatorString(postfixExpression.operator)) printer.printWithNoIndent(postfixExpression.operator.operatorText)
} }
override fun visitQualifiedExpression(qualifiedExpression: JKQualifiedExpression) { override fun visitQualifiedExpression(qualifiedExpression: JKQualifiedExpression) {
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.j2k.tree.JKTreeElement
import org.jetbrains.kotlin.j2k.tree.impl.JKKtOperatorImpl import org.jetbrains.kotlin.j2k.tree.impl.JKKtOperatorImpl
class BinaryExpressionConverter : RecursiveApplicableConversionBase() { class BinaryExpressionConversion : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
return if (element is JKBinaryExpression) element.also { return if (element is JKBinaryExpression) element.also {
element.operator = JKKtOperatorImpl.javaToKotlinOperator[element.operator] ?: element.operator element.operator = JKKtOperatorImpl.javaToKotlinOperator[element.operator] ?: element.operator
@@ -103,5 +103,4 @@ class LiteralConversion : RecursiveApplicableConversionBase() {
element.type element.type
) )
} }
} }
@@ -62,7 +62,10 @@ class JKJavaModifierImpl(override val type: JKJavaModifier.JavaModifierType) : J
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaModifier(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaModifier(this, data)
} }
class JKJavaOperatorImpl private constructor(override val token: IElementType) : JKOperator { class JKJavaOperatorImpl private constructor(val token: IElementType) : JKOperator {
override val operatorText: String
get() = TODO(token.toString())
companion object { companion object {
val tokenToOperator = OPERATION_BIT_SET.types.associate { val tokenToOperator = OPERATION_BIT_SET.types.associate {
it to JKJavaOperatorImpl(it) it to JKJavaOperatorImpl(it)
@@ -192,6 +192,8 @@ class JKBooleanLiteral(val value: Boolean) : JKLiteralExpression, JKElementBase(
get() = value.toString() get() = value.toString()
override val type: LiteralType override val type: LiteralType
get() = BOOLEAN get() = BOOLEAN
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitLiteralExpression(this, data)
} }
class JKLocalVariableImpl(modifierList: JKModifierList, type: JKTypeElement, name: JKNameIdentifier, initializer: JKExpression) : class JKLocalVariableImpl(modifierList: JKModifierList, type: JKTypeElement, name: JKNameIdentifier, initializer: JKExpression) :
@@ -17,9 +17,9 @@
package org.jetbrains.kotlin.j2k.tree.impl package org.jetbrains.kotlin.j2k.tree.impl
import com.intellij.psi.JavaTokenType import com.intellij.psi.JavaTokenType
import com.intellij.psi.tree.IElementType
import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor
import org.jetbrains.kotlin.lexer.KtSingleValueToken
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
class JKKtPropertyImpl( class JKKtPropertyImpl(
@@ -82,10 +82,13 @@ class JKKtLiteralExpressionImpl(
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtLiteralExpression(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtLiteralExpression(this, data)
} }
class JKKtOperatorImpl private constructor(override val token: IElementType) : JKOperator, JKElementBase() { class JKKtOperatorImpl private constructor(val token: KtSingleValueToken) : JKOperator, JKElementBase() {
override val operatorText: String
get() = token.value
companion object { companion object {
val tokenToOperator = KtTokens.OPERATIONS.types.associate { val tokenToOperator = KtTokens.OPERATIONS.types.filter { it is KtSingleValueToken }.associate {
it to JKKtOperatorImpl(it) it to JKKtOperatorImpl(it as KtSingleValueToken)
} }
val javaToKotlinOperator = mutableMapOf<JKOperator, JKOperator>() val javaToKotlinOperator = mutableMapOf<JKOperator, JKOperator>()
@@ -97,13 +100,25 @@ class JKKtOperatorImpl private constructor(override val token: IElementType) : J
this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.ANDAND]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.ANDAND]!! this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.ANDAND]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.ANDAND]!!
this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.OROR]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.OROR]!! this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.OROR]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.OROR]!!
this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.PLUS]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.PLUS]!! this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.PLUS]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.PLUS]!!
this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.ASTERISK]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.MUL]!!
this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.GT]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.GT]!! this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.GT]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.GT]!!
this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.GE]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.GTEQ]!!
this[JKJavaOperatorImpl.tokenToOperator[JavaTokenType.LT]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.LT]!! 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.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")
} }
} }
} }
} }
class JKKtWordOperatorImpl constructor(override val operatorText: String) : JKOperator, JKElementBase()
class JKKtModifierImpl(override val type: JKKtModifier.KtModifierType) : JKKtModifier, JKElementBase() { class JKKtModifierImpl(override val type: JKKtModifier.KtModifierType) : JKKtModifier, JKElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtModifier(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtModifier(this, data)
} }
@@ -16,13 +16,12 @@
package org.jetbrains.kotlin.j2k.tree package org.jetbrains.kotlin.j2k.tree
import com.intellij.psi.tree.IElementType
import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.j2k.tree.impl.JKSymbol import org.jetbrains.kotlin.j2k.tree.impl.JKSymbol
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
interface JKOperator { interface JKOperator {
val token: IElementType val operatorText: String
} }
interface JKQualifier interface JKQualifier