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)
LiteralConversion().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.modality
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,6 @@ class NewCodeBuilder {
JKClass.ClassKind.INTERFACE -> "interface"
}
private fun operatorString(operator: JKOperator): String {
return (operator.token as? KtSingleValueToken)?.value ?: "TODO: $operator"
}
inner class Visitor : JKVisitorVoid {
override fun visitTreeElement(treeElement: JKTreeElement) {
printer.print("/* !!! Hit visitElement for element type: ${treeElement::class} !!! */")
@@ -144,23 +138,23 @@ class NewCodeBuilder {
override fun visitBinaryExpression(binaryExpression: JKBinaryExpression) {
binaryExpression.left.accept(this)
printer.printWithNoIndent(" ")
printer.printWithNoIndent(operatorString(binaryExpression.operator))
printer.printWithNoIndent(binaryExpression.operator.operatorText)
printer.printWithNoIndent(" ")
binaryExpression.right.accept(this)
}
override fun visitKtLiteralExpression(ktLiteralExpression: JKKtLiteralExpression) {
printer.printWithNoIndent(ktLiteralExpression.literal)
override fun visitLiteralExpression(literalExpression: JKLiteralExpression) {
printer.printWithNoIndent(literalExpression.literal)
}
override fun visitPrefixExpression(prefixExpression: JKPrefixExpression) {
printer.printWithNoIndent(operatorString(prefixExpression.operator))
printer.printWithNoIndent(prefixExpression.operator.operatorText)
prefixExpression.expression.accept(this)
}
override fun visitPostfixExpression(postfixExpression: JKPostfixExpression) {
postfixExpression.expression.accept(this)
printer.printWithNoIndent(operatorString(postfixExpression.operator))
printer.printWithNoIndent(postfixExpression.operator.operatorText)
}
override fun visitQualifiedExpression(qualifiedExpression: JKQualifiedExpression) {
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.j2k.tree.JKTreeElement
import org.jetbrains.kotlin.j2k.tree.impl.JKKtOperatorImpl
class BinaryExpressionConverter : RecursiveApplicableConversionBase() {
class BinaryExpressionConversion : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement {
return if (element is JKBinaryExpression) element.also {
element.operator = JKKtOperatorImpl.javaToKotlinOperator[element.operator] ?: element.operator
@@ -103,5 +103,4 @@ class LiteralConversion : RecursiveApplicableConversionBase() {
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)
}
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 {
val tokenToOperator = OPERATION_BIT_SET.types.associate {
it to JKJavaOperatorImpl(it)
@@ -192,6 +192,8 @@ class JKBooleanLiteral(val value: Boolean) : JKLiteralExpression, JKElementBase(
get() = value.toString()
override val type: LiteralType
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) :
@@ -17,9 +17,9 @@
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
import org.jetbrains.kotlin.lexer.KtSingleValueToken
import org.jetbrains.kotlin.lexer.KtTokens
class JKKtPropertyImpl(
@@ -82,10 +82,13 @@ class JKKtLiteralExpressionImpl(
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 {
val tokenToOperator = KtTokens.OPERATIONS.types.associate {
it to JKKtOperatorImpl(it)
val tokenToOperator = KtTokens.OPERATIONS.types.filter { it is KtSingleValueToken }.associate {
it to JKKtOperatorImpl(it as KtSingleValueToken)
}
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.OROR]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.OROR]!!
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.GE]!!] = JKKtOperatorImpl.tokenToOperator[KtTokens.GTEQ]!!
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() {
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
import com.intellij.psi.tree.IElementType
import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.j2k.tree.impl.JKSymbol
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
interface JKOperator {
val token: IElementType
val operatorText: String
}
interface JKQualifier