diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/types/JKTypeFactory.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/types/JKTypeFactory.kt index 9c58376ecc9..fef5d49291d 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/types/JKTypeFactory.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/types/JKTypeFactory.kt @@ -94,8 +94,7 @@ class JKTypeFactory(val symbolProvider: JKSymbolProvider) { } } is PsiArrayType -> JKJavaArrayType(fromPsiType(type.componentType)) - is PsiPrimitiveType -> JKJavaPrimitiveType.KEYWORD_TO_INSTANCE[type.presentableText] - ?: error("Invalid primitive type ${type.presentableText}") + is PsiPrimitiveType -> JKJavaPrimitiveType.fromPsi(type) is PsiDisjunctionType -> JKJavaDisjunctionType(type.disjunctions.map { fromPsiType(it) }) is PsiWildcardType -> diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/types/types.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/types/types.kt index 1e9670b786a..52088a18690 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/types/types.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/types/types.kt @@ -5,6 +5,9 @@ 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.nj2k.symbols.JKClassSymbol import org.jetbrains.kotlin.nj2k.symbols.JKTypeParameterSymbol @@ -65,7 +68,17 @@ data class JKCapturedType( override val nullability: Nullability = Nullability.Default ) : 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 get() = Nullability.NotNull @@ -79,10 +92,20 @@ class JKJavaPrimitiveType(val jvmPrimitiveType: JvmPrimitiveType) : JKType { val LONG = JKJavaPrimitiveType(JvmPrimitiveType.LONG) val DOUBLE = JKJavaPrimitiveType(JvmPrimitiveType.DOUBLE) - val KEYWORD_TO_INSTANCE = listOf( - BOOLEAN, CHAR, BYTE, SHORT, INT, FLOAT, LONG, DOUBLE - ).associateBy { it.jvmPrimitiveType.javaKeywordName } + ("void" to JKJavaVoidType) + val ALL = listOf(BOOLEAN, CHAR, BYTE, SHORT, INT, FLOAT, LONG, DOUBLE) + + @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( diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/types/typesUtils.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/types/typesUtils.kt index 10faa8ad422..a62b8200b13 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/types/typesUtils.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/types/typesUtils.kt @@ -172,10 +172,11 @@ fun JKType.arrayFqName(): String = fun JKClassSymbol.isArrayType(): Boolean = fqName in arrayFqNames -private val arrayFqNames = JKJavaPrimitiveType.KEYWORD_TO_INSTANCE.values - .filterIsInstance() - .map { PrimitiveType.valueOf(it.jvmPrimitiveType.name).arrayTypeFqName.asString() } + - KotlinBuiltIns.FQ_NAMES.array.asString() +@OptIn(ExperimentalStdlibApi::class) +private val arrayFqNames = buildList { + JKJavaPrimitiveType.ALL.mapTo(this) { PrimitiveType.valueOf(it.jvmPrimitiveType.name).arrayTypeFqName.asString() } + add(KotlinBuiltIns.FQ_NAMES.array.asString()) +} fun JKType.isArrayType() = when (this) { diff --git a/nj2k/testData/newJ2k/types/nullType.java b/nj2k/testData/newJ2k/types/nullType.java new file mode 100644 index 00000000000..74a94b27035 --- /dev/null +++ b/nj2k/testData/newJ2k/types/nullType.java @@ -0,0 +1,5 @@ +public class A { + void foo() { + Object x = true ? null : null; + } +} diff --git a/nj2k/testData/newJ2k/types/nullType.kt b/nj2k/testData/newJ2k/types/nullType.kt new file mode 100644 index 00000000000..184215b1e48 --- /dev/null +++ b/nj2k/testData/newJ2k/types/nullType.kt @@ -0,0 +1,5 @@ +class A { + fun foo() { + val x: Any? = if (true) null else null + } +} diff --git a/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java b/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java index c3ed07702b0..b915573bea7 100644 --- a/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java +++ b/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java @@ -5212,6 +5212,11 @@ public class NewJavaToKotlinConverterSingleFileTestGenerated extends AbstractNew 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") public void testRecursiveType() throws Exception { runTest("nj2k/testData/newJ2k/types/recursiveType.java");