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 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
@@ -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");
|
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");
|
||||||
|
|||||||
Reference in New Issue
Block a user