New J2K: Add missing literals and cleanup literal handling in tree builder

This commit is contained in:
Simon Ogorodnik
2018-05-29 13:58:01 +03:00
committed by Ilya Kirillov
parent b7fd8e32cb
commit fd69efa4c2
4 changed files with 36 additions and 12 deletions
@@ -23,6 +23,7 @@ import com.intellij.psi.impl.source.tree.java.PsiLiteralExpressionImpl
import com.intellij.psi.impl.source.tree.java.PsiNewExpressionImpl
import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl
import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType.*
import org.jetbrains.kotlin.j2k.tree.impl.*
@@ -87,17 +88,20 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
}
fun PsiLiteralExpression.toJK(): JKLiteralExpression {
if (this !is PsiLiteralExpressionImpl) {
throw RuntimeException("Not supported")
require(this is PsiLiteralExpressionImpl)
return when (this.literalElementType) {
JavaTokenType.NULL_KEYWORD -> JKNullLiteral()
JavaTokenType.TRUE_KEYWORD -> JKBooleanLiteral(true)
JavaTokenType.FALSE_KEYWORD -> JKBooleanLiteral(false)
JavaTokenType.STRING_LITERAL -> JKJavaLiteralExpressionImpl(innerText!!, STRING)
JavaTokenType.CHARACTER_LITERAL -> JKJavaLiteralExpressionImpl(innerText!!, CHAR)
JavaTokenType.INTEGER_LITERAL -> JKJavaLiteralExpressionImpl(text, INT)
JavaTokenType.LONG_LITERAL -> JKJavaLiteralExpressionImpl(text, LONG)
JavaTokenType.FLOAT_LITERAL -> JKJavaLiteralExpressionImpl(text, FLOAT)
JavaTokenType.DOUBLE_LITERAL -> JKJavaLiteralExpressionImpl(text, DOUBLE)
else -> error("Unknown literal element type: ${this.literalElementType}")
}
return JKJavaLiteralExpressionImpl(
innerText!!, when (this.literalElementType) {
JavaTokenType.STRING_LITERAL -> JKLiteralExpression.LiteralType.STRING
JavaTokenType.TRUE_KEYWORD, JavaTokenType.FALSE_KEYWORD -> JKLiteralExpression.LiteralType.BOOLEAN
JavaTokenType.NULL_KEYWORD -> JKLiteralExpression.LiteralType.NULL
else -> throw RuntimeException("Not supported")
}
)
}
fun PsiJavaToken.toJK(): JKOperator = when (tokenType) {
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.j2k.tree.impl
import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType.*
import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
@@ -58,6 +59,10 @@ class JKJavaLiteralExpressionImpl(
override val type: JKLiteralExpression.LiteralType
) : JKJavaLiteralExpression, JKElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaLiteralExpression(this, data)
init {
require(type in setOf(STRING, CHAR, INT, LONG, FLOAT, DOUBLE))
}
}
@@ -18,6 +18,9 @@ package org.jetbrains.kotlin.j2k.tree.impl
import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType
import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType.BOOLEAN
import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType.NULL
import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor
class JKClassImpl(
@@ -135,4 +138,16 @@ class JKClassTypeImpl(
override val nullability: Nullability = Nullability.Default
) : JKClassType
class JKNullLiteral : JKExpression, JKElementBase()
class JKNullLiteral : JKLiteralExpression, JKElementBase() {
override val literal: String
get() = "null"
override val type: LiteralType
get() = NULL
}
class JKBooleanLiteral(val value: Boolean) : JKLiteralExpression, JKElementBase() {
override val literal: String
get() = value.toString()
override val type: LiteralType
get() = BOOLEAN
}
@@ -136,7 +136,7 @@ interface JKLiteralExpression : JKExpression {
val type: LiteralType
enum class LiteralType {
STRING, BOOLEAN, NULL
STRING, CHAR, BOOLEAN, NULL, INT, LONG, FLOAT, DOUBLE
}
}