diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtTypeInfoProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtTypeInfoProvider.kt index e3d4d4cddbb..600f2743450 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtTypeInfoProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtTypeInfoProvider.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.org.objectweb.asm.Type public abstract class KtTypeInfoProvider : KtAnalysisSessionComponent() { public abstract fun isFunctionalInterfaceType(type: KtType): Boolean @@ -143,6 +144,16 @@ public interface KtTypeInfoProviderMixIn : KtAnalysisSessionMixIn { return this.classId in DefaultTypeClassIds.PRIMITIVES } + context(KtJvmTypeMapperMixIn) + public val KtType.isPrimitiveBacked: Boolean + get() = withValidityAssertion { + if (this !is KtNonErrorClassType) return false + return when (this.mapTypeToJvmType().sort) { + Type.BOOLEAN, Type.CHAR, Type.BYTE, Type.SHORT, Type.INT, Type.FLOAT, Type.LONG, Type.DOUBLE -> true + else -> false + } + } + public val KtType.defaultInitializer: String? get() = withValidityAssertion { when { diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForProperty.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForProperty.kt index 3f44f0919d9..10b8afc096b 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForProperty.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForProperty.kt @@ -188,7 +188,7 @@ internal class SymbolLightFieldForProperty private constructor( // NB: not as?, since _initializerValue already checks that (propertySymbol as KtKotlinPropertySymbol).isConst && // javac rejects all non-primitive and non String constants - (propertySymbol.returnType.isPrimitive || propertySymbol.returnType.isString) + (propertySymbol.returnType.isPrimitiveBacked || propertySymbol.returnType.isString) } } } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt index a0232ca4da0..fd0c093ba3c 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt @@ -126,28 +126,18 @@ internal fun KtAnalysisSession.getTypeNullability(ktType: KtType): NullabilityTy if (ktType.isUnit) return NullabilityType.NotNull + if (ktType.isPrimitiveBacked) return NullabilityType.Unknown + if (ktType is KtTypeParameterType) { if (ktType.isMarkedNullable) return NullabilityType.Nullable val subtypeOfNullableSuperType = ktType.symbol.upperBounds.all { upperBound -> upperBound.canBeNull } return if (!subtypeOfNullableSuperType) NullabilityType.NotNull else NullabilityType.Unknown } - if (ktType !is KtClassType) return NullabilityType.NotNull - - if (!ktType.isPrimitive) { - return ktType.nullabilityType - } - if (ktType !is KtNonErrorClassType) return NullabilityType.NotNull if (ktType.ownTypeArguments.any { it.type is KtClassErrorType }) return NullabilityType.NotNull if (ktType.classId.shortClassName.asString() == SpecialNames.ANONYMOUS_STRING) return NullabilityType.NotNull - val canonicalSignature = ktType.mapTypeToJvmType().descriptor - - if (canonicalSignature == "[L;") return NullabilityType.NotNull - - val isNotPrimitiveType = canonicalSignature.startsWith("L") || canonicalSignature.startsWith("[") - - return if (isNotPrimitiveType) NullabilityType.NotNull else NullabilityType.Unknown + return ktType.nullabilityType } internal val KtType.isUnit get() = isClassTypeWithClassId(DefaultTypeClassIds.UNIT) diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByFqNameForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByFqNameForLibraryTestGenerated.java index ef4a9b301d5..91128d75b68 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByFqNameForLibraryTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByFqNameForLibraryTestGenerated.java @@ -483,6 +483,12 @@ public class SymbolLightClassesByFqNameForLibraryTestGenerated extends AbstractS runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/PlatformTypes.kt"); } + @Test + @TestMetadata("PrimitiveBackedInlineClasses.kt") + public void testPrimitiveBackedInlineClasses() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/PrimitiveBackedInlineClasses.kt"); + } + @Test @TestMetadata("Primitives.kt") public void testPrimitives() throws Exception { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingForLibraryTestGenerated.java index b6bef14bd53..19e462fd85b 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingForLibraryTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingForLibraryTestGenerated.java @@ -483,6 +483,12 @@ public class SymbolLightClassesParentingForLibraryTestGenerated extends Abstract runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/PlatformTypes.kt"); } + @Test + @TestMetadata("PrimitiveBackedInlineClasses.kt") + public void testPrimitiveBackedInlineClasses() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/PrimitiveBackedInlineClasses.kt"); + } + @Test @TestMetadata("Primitives.kt") public void testPrimitives() throws Exception { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByFqNameForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByFqNameForSourceTestGenerated.java index 184f77ea585..5b20ad2c081 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByFqNameForSourceTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByFqNameForSourceTestGenerated.java @@ -625,6 +625,12 @@ public class SymbolLightClassesByFqNameForSourceTestGenerated extends AbstractSy runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/PlatformTypes.kt"); } + @Test + @TestMetadata("PrimitiveBackedInlineClasses.kt") + public void testPrimitiveBackedInlineClasses() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/PrimitiveBackedInlineClasses.kt"); + } + @Test @TestMetadata("Primitives.kt") public void testPrimitives() throws Exception { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingForSourceTestGenerated.java index 5a9555c7a2f..54f98084010 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingForSourceTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingForSourceTestGenerated.java @@ -625,6 +625,12 @@ public class SymbolLightClassesParentingForSourceTestGenerated extends AbstractS runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/PlatformTypes.kt"); } + @Test + @TestMetadata("PrimitiveBackedInlineClasses.kt") + public void testPrimitiveBackedInlineClasses() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/PrimitiveBackedInlineClasses.kt"); + } + @Test @TestMetadata("Primitives.kt") public void testPrimitives() throws Exception { diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/PrimitiveBackedInlineClasses.java b/compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/PrimitiveBackedInlineClasses.java new file mode 100644 index 00000000000..fdac834ca09 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/PrimitiveBackedInlineClasses.java @@ -0,0 +1,15 @@ +public final class PrimitiveBackedInlineClassesKt /* PrimitiveBackedInlineClassesKt*/ { + @kotlin.jvm.JvmName(name = "getInlineClass") + public static final int getInlineClass();// getInlineClass() + + @kotlin.jvm.JvmName(name = "getNullableInlineClass") + @org.jetbrains.annotations.Nullable() + public static final InlineClass getNullableInlineClass();// getNullableInlineClass() + + @kotlin.jvm.JvmName(name = "getNullableUInt") + @org.jetbrains.annotations.Nullable() + public static final kotlin.UInt getNullableUInt();// getNullableUInt() + + @kotlin.jvm.JvmName(name = "getUInt") + public static final int getUInt();// getUInt() +} diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/PrimitiveBackedInlineClasses.kt b/compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/PrimitiveBackedInlineClasses.kt new file mode 100644 index 00000000000..7aabaa29fbf --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/PrimitiveBackedInlineClasses.kt @@ -0,0 +1,13 @@ +// PrimitiveBackedInlineClassesKt +// WITH_STDLIB + +@JvmName("getUInt") fun geUInt(): UInt = 42U +@JvmName("getNullableUInt") fun getNullableUInt(): UInt? = null +@JvmName("getInlineClass") fun getInlineClass(): InlineClass = InlineClass(42) +@JvmName("getNullableInlineClass") fun getNullableUInlineClass(): InlineClass? = null + + +@JvmInline value class InlineClass(val data: Int) + + +// FIR_COMPARISON \ No newline at end of file diff --git a/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java index f7b14c4d37e..d31c5be31e0 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java @@ -500,6 +500,11 @@ public class CompilerLightClassTestGenerated extends AbstractCompilerLightClassT runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/PlatformTypes.kt"); } + @TestMetadata("PrimitiveBackedInlineClasses.kt") + public void testPrimitiveBackedInlineClasses() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/PrimitiveBackedInlineClasses.kt"); + } + @TestMetadata("Primitives.kt") public void testPrimitives() throws Exception { runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/Primitives.kt");