New J2K: handle null Java type

This commit is contained in:
Ilya Kirillov
2020-03-26 18:11:05 +03:00
parent 113561f5f5
commit 78d2aaa021
6 changed files with 48 additions and 10 deletions
@@ -94,8 +94,7 @@ class JKTypeFactory(val symbolProvider: JKSymbolProvider) {
} }
} }
is PsiArrayType -> JKJavaArrayType(fromPsiType(type.componentType)) is PsiArrayType -> JKJavaArrayType(fromPsiType(type.componentType))
is PsiPrimitiveType -> JKJavaPrimitiveType.KEYWORD_TO_INSTANCE[type.presentableText] is PsiPrimitiveType -> JKJavaPrimitiveType.fromPsi(type)
?: error("Invalid primitive type ${type.presentableText}")
is PsiDisjunctionType -> is PsiDisjunctionType ->
JKJavaDisjunctionType(type.disjunctions.map { fromPsiType(it) }) JKJavaDisjunctionType(type.disjunctions.map { fromPsiType(it) })
is PsiWildcardType -> is PsiWildcardType ->
@@ -5,6 +5,9 @@
package org.jetbrains.kotlin.nj2k.types package org.jetbrains.kotlin.nj2k.types
import com.intellij.lang.jvm.types.JvmPrimitiveTypeKind
import com.intellij.psi.PsiPrimitiveType
import com.intellij.psi.PsiType
import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.nj2k.symbols.JKClassSymbol import org.jetbrains.kotlin.nj2k.symbols.JKClassSymbol
import org.jetbrains.kotlin.nj2k.symbols.JKTypeParameterSymbol import org.jetbrains.kotlin.nj2k.symbols.JKTypeParameterSymbol
@@ -65,7 +68,17 @@ data class JKCapturedType(
override val nullability: Nullability = Nullability.Default override val nullability: Nullability = Nullability.Default
) : JKType ) : JKType
class JKJavaPrimitiveType(val jvmPrimitiveType: JvmPrimitiveType) : JKType {
sealed class JKJavaPrimitiveTypeBase : JKType {
abstract val jvmPrimitiveType: JvmPrimitiveType?
}
private object JKJavaNullPrimitiveType : JKJavaPrimitiveTypeBase() {
override val jvmPrimitiveType: JvmPrimitiveType? = null
override val nullability: Nullability = Nullability.Nullable
}
class JKJavaPrimitiveType private constructor(override val jvmPrimitiveType: JvmPrimitiveType) : JKJavaPrimitiveTypeBase() {
override val nullability: Nullability override val nullability: Nullability
get() = Nullability.NotNull get() = Nullability.NotNull
@@ -79,10 +92,20 @@ class JKJavaPrimitiveType(val jvmPrimitiveType: JvmPrimitiveType) : JKType {
val LONG = JKJavaPrimitiveType(JvmPrimitiveType.LONG) val LONG = JKJavaPrimitiveType(JvmPrimitiveType.LONG)
val DOUBLE = JKJavaPrimitiveType(JvmPrimitiveType.DOUBLE) val DOUBLE = JKJavaPrimitiveType(JvmPrimitiveType.DOUBLE)
val KEYWORD_TO_INSTANCE = listOf( val ALL = listOf(BOOLEAN, CHAR, BYTE, SHORT, INT, FLOAT, LONG, DOUBLE)
BOOLEAN, CHAR, BYTE, SHORT, INT, FLOAT, LONG, DOUBLE
).associateBy { it.jvmPrimitiveType.javaKeywordName } + ("void" to JKJavaVoidType) @Suppress("UnstableApiUsage")
private val psiKindToJK =
ALL.associateBy { JvmPrimitiveTypeKind.getKindByName(it.jvmPrimitiveType.javaKeywordName) }
@Suppress("UnstableApiUsage")
fun fromPsi(psi: PsiPrimitiveType) = when (psi) {
PsiType.VOID -> JKJavaVoidType
PsiType.NULL -> JKJavaNullPrimitiveType
else -> psiKindToJK[psi.kind] ?: error("Invalid PSI type ${psi.presentableText}")
}
} }
} }
data class JKJavaArrayType( data class JKJavaArrayType(
@@ -172,10 +172,11 @@ fun JKType.arrayFqName(): String =
fun JKClassSymbol.isArrayType(): Boolean = fun JKClassSymbol.isArrayType(): Boolean =
fqName in arrayFqNames fqName in arrayFqNames
private val arrayFqNames = JKJavaPrimitiveType.KEYWORD_TO_INSTANCE.values @OptIn(ExperimentalStdlibApi::class)
.filterIsInstance<JKJavaPrimitiveType>() private val arrayFqNames = buildList {
.map { PrimitiveType.valueOf(it.jvmPrimitiveType.name).arrayTypeFqName.asString() } + JKJavaPrimitiveType.ALL.mapTo(this) { PrimitiveType.valueOf(it.jvmPrimitiveType.name).arrayTypeFqName.asString() }
KotlinBuiltIns.FQ_NAMES.array.asString() add(KotlinBuiltIns.FQ_NAMES.array.asString())
}
fun JKType.isArrayType() = fun JKType.isArrayType() =
when (this) { when (this) {
+5
View File
@@ -0,0 +1,5 @@
public class A {
void foo() {
Object x = true ? null : null;
}
}
+5
View File
@@ -0,0 +1,5 @@
class A {
fun foo() {
val x: Any? = if (true) null else null
}
}
@@ -5212,6 +5212,11 @@ public class NewJavaToKotlinConverterSingleFileTestGenerated extends AbstractNew
runTest("nj2k/testData/newJ2k/types/capturedWildcardTypeAsLambdaParameter.java"); runTest("nj2k/testData/newJ2k/types/capturedWildcardTypeAsLambdaParameter.java");
} }
@TestMetadata("nullType.java")
public void testNullType() throws Exception {
runTest("nj2k/testData/newJ2k/types/nullType.java");
}
@TestMetadata("recursiveType.java") @TestMetadata("recursiveType.java")
public void testRecursiveType() throws Exception { public void testRecursiveType() throws Exception {
runTest("nj2k/testData/newJ2k/types/recursiveType.java"); runTest("nj2k/testData/newJ2k/types/recursiveType.java");