New J2K: Add all primitive types

This commit is contained in:
Simon Ogorodnik
2018-05-28 20:03:23 +03:00
committed by Ilya Kirillov
parent 77b6eca76e
commit 7c5e9cd669
5 changed files with 26 additions and 16 deletions
@@ -199,12 +199,8 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
parameters.map { it.toJK() } parameters.map { it.toJK() }
) )
is PsiArrayType -> JKJavaArrayTypeImpl(componentType.toJK()) is PsiArrayType -> JKJavaArrayTypeImpl(componentType.toJK())
is PsiPrimitiveType -> when (presentableText) { is PsiPrimitiveType -> JKJavaPrimitiveTypeImpl.KEYWORD_TO_INSTANCE[presentableText]
"int" -> JKJavaPrimitiveTypeImpl.INT ?: error("Invalid primitive type $presentableText")
"byte" -> JKJavaPrimitiveTypeImpl.BYTE
"boolean" -> JKJavaPrimitiveTypeImpl.BOOLEAN
else -> throw Exception("Invalid PSI")
}
else -> throw Exception("Invalid PSI") else -> throw Exception("Invalid PSI")
} }
} }
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.psi.KtPsiFactory
import org.jetbrains.kotlin.psi.analysisContext import org.jetbrains.kotlin.psi.analysisContext
import org.jetbrains.kotlin.psi.psiUtil.getChildOfType import org.jetbrains.kotlin.psi.psiUtil.getChildOfType
import org.jetbrains.kotlin.resolve.ImportPath import org.jetbrains.kotlin.resolve.ImportPath
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
class TypeMappingConversion(val context: ConversionContext) : MatchBasedConversion() { class TypeMappingConversion(val context: ConversionContext) : MatchBasedConversion() {
override fun onElementChanged(new: JKTreeElement, old: JKTreeElement) { override fun onElementChanged(new: JKTreeElement, old: JKTreeElement) {
@@ -71,7 +70,7 @@ class TypeMappingConversion(val context: ConversionContext) : MatchBasedConversi
return JKClassTypeImpl(context.symbolProvider.provideSymbol(newTarget) as JKClassSymbol, parameters, nullability) return JKClassTypeImpl(context.symbolProvider.provideSymbol(newTarget) as JKClassSymbol, parameters, nullability)
} }
fun mapClassType(type: JKClassType, typeElement: JKTypeElement): JKTypeElement { private fun mapClassType(type: JKClassType, typeElement: JKTypeElement): JKTypeElement {
val fqNameStr = (type.classReference as? JKClassSymbol)?.fqName ?: return typeElement val fqNameStr = (type.classReference as? JKClassSymbol)?.fqName ?: return typeElement
val newFqName = JavaToKotlinClassMap.mapJavaToKotlin(FqName(fqNameStr)) ?: return typeElement val newFqName = JavaToKotlinClassMap.mapJavaToKotlin(FqName(fqNameStr)) ?: return typeElement
@@ -81,8 +80,8 @@ class TypeMappingConversion(val context: ConversionContext) : MatchBasedConversi
} ?: typeElement } ?: typeElement
} }
fun mapPrimitiveType(type: JKJavaPrimitiveType, typeElement: JKTypeElement): JKTypeElement { private fun mapPrimitiveType(type: JKJavaPrimitiveType, typeElement: JKTypeElement): JKTypeElement {
val fqName = JvmPrimitiveType.get(type.name).primitiveType.typeFqName val fqName = type.jvmPrimitiveType.primitiveType.typeFqName
return classTypeByFqName(context.backAnnotator(typeElement), ClassId.topLevel(fqName), emptyList())?.let { JKTypeElementImpl(it) } return classTypeByFqName(context.backAnnotator(typeElement), ClassId.topLevel(fqName), emptyList())?.let { JKTypeElementImpl(it) }
?: typeElement ?: typeElement
@@ -82,7 +82,7 @@ private class DebugTreePrinter : JKVisitorVoid {
printer.println((type.classReference as? JKClassSymbol)?.fqName ?: type.classReference?.let { it::class } ?: "Unbound") printer.println((type.classReference as? JKClassSymbol)?.fqName ?: type.classReference?.let { it::class } ?: "Unbound")
} }
if (type is JKJavaPrimitiveType) { if (type is JKJavaPrimitiveType) {
printer.println(type.name) printer.println(type.jvmPrimitiveType.javaKeywordName)
} }
} }
printer.println("\"") printer.println("\"")
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.j2k.tree.impl
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.resolve.jvm.JvmPrimitiveType
class JKJavaFieldImpl( class JKJavaFieldImpl(
modifierList: JKModifierList, modifierList: JKModifierList,
@@ -111,12 +112,25 @@ class JKJavaNewArrayImpl(override var initializer: List<JKExpression>) : JKJavaN
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaNewArray(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaNewArray(this, data)
} }
sealed class JKJavaPrimitiveTypeImpl(override val name: String) : JKJavaPrimitiveType { sealed class JKJavaPrimitiveTypeImpl(override val jvmPrimitiveType: JvmPrimitiveType) : JKJavaPrimitiveType {
object BYTE : JKJavaPrimitiveTypeImpl("byte") object BOOLEAN : JKJavaPrimitiveTypeImpl(JvmPrimitiveType.BOOLEAN)
object BOOLEAN : JKJavaPrimitiveTypeImpl("boolean") object CHAR : JKJavaPrimitiveTypeImpl(JvmPrimitiveType.CHAR)
object INT : JKJavaPrimitiveTypeImpl("int") object BYTE : JKJavaPrimitiveTypeImpl(JvmPrimitiveType.BYTE)
object SHORT : JKJavaPrimitiveTypeImpl(JvmPrimitiveType.SHORT)
object INT : JKJavaPrimitiveTypeImpl(JvmPrimitiveType.INT)
object FLOAT : JKJavaPrimitiveTypeImpl(JvmPrimitiveType.FLOAT)
object LONG : JKJavaPrimitiveTypeImpl(JvmPrimitiveType.LONG)
object DOUBLE : JKJavaPrimitiveTypeImpl(JvmPrimitiveType.DOUBLE)
companion object {
val KEYWORD_TO_INSTANCE = listOf(
BOOLEAN, CHAR, BYTE, SHORT, INT, FLOAT, LONG, DOUBLE
).associate { it.jvmPrimitiveType.javaKeywordName to it } + ("void" to JKJavaVoidType)
}
} }
object JKJavaVoidType : JKType
class JKJavaArrayTypeImpl(override val type: JKType) : JKJavaArrayType class JKJavaArrayTypeImpl(override val type: JKType) : JKJavaArrayType
class JKReturnStatementImpl(expression: JKExpression) : JKBranchElementBase(), JKReturnStatement { class JKReturnStatementImpl(expression: JKExpression) : JKBranchElementBase(), JKReturnStatement {
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.j2k.tree
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
interface JKOperator interface JKOperator
@@ -52,7 +53,7 @@ interface JKClassType : JKType {
} }
interface JKJavaPrimitiveType : JKType { interface JKJavaPrimitiveType : JKType {
val name: String val jvmPrimitiveType: JvmPrimitiveType
} }
interface JKJavaArrayType : JKType { interface JKJavaArrayType : JKType {