New J2K: handle null Java type
This commit is contained in:
@@ -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 ->
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -172,10 +172,11 @@ fun JKType.arrayFqName(): String =
|
||||
fun JKClassSymbol.isArrayType(): Boolean =
|
||||
fqName in arrayFqNames
|
||||
|
||||
private val arrayFqNames = JKJavaPrimitiveType.KEYWORD_TO_INSTANCE.values
|
||||
.filterIsInstance<JKJavaPrimitiveType>()
|
||||
.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) {
|
||||
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
public class A {
|
||||
void foo() {
|
||||
Object x = true ? null : null;
|
||||
}
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
class A {
|
||||
fun foo() {
|
||||
val x: Any? = if (true) null else null
|
||||
}
|
||||
}
|
||||
+5
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user