From 164cbc9968bdc0ec53c5dd8deb6cc182577f3f9f Mon Sep 17 00:00:00 2001 From: Pavel Mikhailovskii Date: Fri, 10 Mar 2023 11:03:45 +0000 Subject: [PATCH] KTIJ-24768 Fix IllegalArgumentException in KtType.isPrimitiveBacked --- .../components/KtFe10JvmTypeMapper.kt | 5 +++++ .../utils/KtFe10JvmTypeMapperContext.kt | 3 +++ .../api/fir/components/KtFirJvmTypeMapper.kt | 4 ++++ .../analysis/api/components/KtJvmTypeMapper.kt | 7 +++++++ .../api/components/KtTypeInfoProvider.kt | 11 ----------- ...htClassesByFqNameForLibraryTestGenerated.java | 6 ++++++ ...sEqualityByFqNameForLibraryTestGenerated.java | 6 ++++++ ...ParentingByFqNameForLibraryTestGenerated.java | 6 ++++++ ...ghtClassesByFqNameForSourceTestGenerated.java | 6 ++++++ ...esEqualityByFqNameForSourceTestGenerated.java | 6 ++++++ ...sParentingByFqNameForSourceTestGenerated.java | 6 ++++++ .../jetbrains/kotlin/types/AbstractTypeMapper.kt | 11 ++++++++++- .../kotlin/fir/backend/jvm/FirJvmTypeMapper.kt | 3 +++ .../ImplicitArrayWithFlexibleParameterTypes.java | 4 ++++ .../ImplicitArrayWithFlexibleParameterTypes.kt | 16 ++++++++++++++++ .../asJava/CompilerLightClassTestGenerated.java | 5 +++++ 16 files changed, 93 insertions(+), 12 deletions(-) create mode 100644 compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/ImplicitArrayWithFlexibleParameterTypes.java create mode 100644 compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/ImplicitArrayWithFlexibleParameterTypes.kt diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10JvmTypeMapper.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10JvmTypeMapper.kt index 55b8a147894..87088b5922e 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10JvmTypeMapper.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10JvmTypeMapper.kt @@ -27,4 +27,9 @@ internal class KtFe10JvmTypeMapper( val kotlinType = (type as KtFe10Type).fe10Type return typeMapper.mapType(kotlinType, mode) } + + override fun isPrimitiveBacked(type: KtType): Boolean { + val kotlinType = (type as KtFe10Type).fe10Type + return typeMapper.isPrimitiveBacked(kotlinType) + } } \ No newline at end of file diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/utils/KtFe10JvmTypeMapperContext.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/utils/KtFe10JvmTypeMapperContext.kt index 57a740e1298..4499f5f913a 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/utils/KtFe10JvmTypeMapperContext.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/utils/KtFe10JvmTypeMapperContext.kt @@ -57,6 +57,9 @@ internal class KtFe10JvmTypeMapperContext(private val resolveSession: ResolveSes return AbstractTypeMapper.mapType(this, type, mode, sw) } + fun isPrimitiveBacked(type: KotlinType): Boolean = + AbstractTypeMapper.isPrimitiveBacked(this, type) + override fun getClassInternalName(typeConstructor: TypeConstructorMarker): String { require(typeConstructor is TypeConstructor) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirJvmTypeMapper.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirJvmTypeMapper.kt index db275e32b3b..cab3636218f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirJvmTypeMapper.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirJvmTypeMapper.kt @@ -21,4 +21,8 @@ internal class KtFirJvmTypeMapper( override fun mapTypeToJvmType(type: KtType, mode: TypeMappingMode): Type { return analysisSession.useSiteSession.jvmTypeMapper.mapType(type.coneType, mode, sw = null, unresolvedQualifierRemapper = null) } + + override fun isPrimitiveBacked(type: KtType): Boolean { + return analysisSession.useSiteSession.jvmTypeMapper.isPrimitiveBacked(type.coneType) + } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtJvmTypeMapper.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtJvmTypeMapper.kt index fdb7d5cfa3e..26e00efdeca 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtJvmTypeMapper.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtJvmTypeMapper.kt @@ -12,6 +12,7 @@ import org.jetbrains.org.objectweb.asm.Type public abstract class KtJvmTypeMapper : KtAnalysisSessionComponent() { public abstract fun mapTypeToJvmType(type: KtType, mode: TypeMappingMode): Type + public abstract fun isPrimitiveBacked(type: KtType): Boolean } public interface KtJvmTypeMapperMixIn : KtAnalysisSessionMixIn { @@ -22,4 +23,10 @@ public interface KtJvmTypeMapperMixIn : KtAnalysisSessionMixIn { */ public fun KtType.mapTypeToJvmType(mode: TypeMappingMode = TypeMappingMode.DEFAULT): Type = withValidityAssertion { analysisSession.jvmTypeMapper.mapTypeToJvmType(this, mode) } + + /** + * Returns true if the type is backed by a single JVM primitive type + */ + public val KtType.isPrimitiveBacked: Boolean + get() = withValidityAssertion { analysisSession.jvmTypeMapper.isPrimitiveBacked(this) } } 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 600f2743450..e3d4d4cddbb 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,7 +15,6 @@ 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 @@ -144,16 +143,6 @@ 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/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 91128d75b68..732bacdaa74 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 @@ -453,6 +453,12 @@ public class SymbolLightClassesByFqNameForLibraryTestGenerated extends AbstractS runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/Generic.kt"); } + @Test + @TestMetadata("ImplicitArrayWithFlexibleParameterTypes.kt") + public void testImplicitArrayWithFlexibleParameterTypes() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/ImplicitArrayWithFlexibleParameterTypes.kt"); + } + @Test @TestMetadata("IntOverridesAny.kt") public void testIntOverridesAny() throws Exception { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByFqNameForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByFqNameForLibraryTestGenerated.java index f6d5f9a8ae5..b8e7ba69f1f 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByFqNameForLibraryTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByFqNameForLibraryTestGenerated.java @@ -453,6 +453,12 @@ public class SymbolLightClassesEqualityByFqNameForLibraryTestGenerated extends A runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/Generic.kt"); } + @Test + @TestMetadata("ImplicitArrayWithFlexibleParameterTypes.kt") + public void testImplicitArrayWithFlexibleParameterTypes() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/ImplicitArrayWithFlexibleParameterTypes.kt"); + } + @Test @TestMetadata("IntOverridesAny.kt") public void testIntOverridesAny() throws Exception { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByFqNameForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByFqNameForLibraryTestGenerated.java index e796ccff262..fb604526af2 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByFqNameForLibraryTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByFqNameForLibraryTestGenerated.java @@ -453,6 +453,12 @@ public class SymbolLightClassesParentingByFqNameForLibraryTestGenerated extends runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/Generic.kt"); } + @Test + @TestMetadata("ImplicitArrayWithFlexibleParameterTypes.kt") + public void testImplicitArrayWithFlexibleParameterTypes() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/ImplicitArrayWithFlexibleParameterTypes.kt"); + } + @Test @TestMetadata("IntOverridesAny.kt") public void testIntOverridesAny() 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 5b20ad2c081..fafadaada81 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 @@ -595,6 +595,12 @@ public class SymbolLightClassesByFqNameForSourceTestGenerated extends AbstractSy runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/Generic.kt"); } + @Test + @TestMetadata("ImplicitArrayWithFlexibleParameterTypes.kt") + public void testImplicitArrayWithFlexibleParameterTypes() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/ImplicitArrayWithFlexibleParameterTypes.kt"); + } + @Test @TestMetadata("IntOverridesAny.kt") public void testIntOverridesAny() throws Exception { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByFqNameForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByFqNameForSourceTestGenerated.java index ad3e2b353f2..5dbd8ece488 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByFqNameForSourceTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByFqNameForSourceTestGenerated.java @@ -595,6 +595,12 @@ public class SymbolLightClassesEqualityByFqNameForSourceTestGenerated extends Ab runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/Generic.kt"); } + @Test + @TestMetadata("ImplicitArrayWithFlexibleParameterTypes.kt") + public void testImplicitArrayWithFlexibleParameterTypes() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/ImplicitArrayWithFlexibleParameterTypes.kt"); + } + @Test @TestMetadata("IntOverridesAny.kt") public void testIntOverridesAny() throws Exception { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByFqNameForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByFqNameForSourceTestGenerated.java index 44e047b6830..9c5a5fceedc 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByFqNameForSourceTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByFqNameForSourceTestGenerated.java @@ -595,6 +595,12 @@ public class SymbolLightClassesParentingByFqNameForSourceTestGenerated extends A runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/Generic.kt"); } + @Test + @TestMetadata("ImplicitArrayWithFlexibleParameterTypes.kt") + public void testImplicitArrayWithFlexibleParameterTypes() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/ImplicitArrayWithFlexibleParameterTypes.kt"); + } + @Test @TestMetadata("IntOverridesAny.kt") public void testIntOverridesAny() throws Exception { diff --git a/compiler/backend.common.jvm/src/org/jetbrains/kotlin/types/AbstractTypeMapper.kt b/compiler/backend.common.jvm/src/org/jetbrains/kotlin/types/AbstractTypeMapper.kt index f51bfda654d..a244a89afbb 100644 --- a/compiler/backend.common.jvm/src/org/jetbrains/kotlin/types/AbstractTypeMapper.kt +++ b/compiler/backend.common.jvm/src/org/jetbrains/kotlin/types/AbstractTypeMapper.kt @@ -155,7 +155,6 @@ object AbstractTypeMapper { typeArgument.isStarProjection() -> Variance.OUT_VARIANCE to nullableAnyType() else -> typeArgument.getVariance().toVariance() to typeArgument.getType() } - require(memberType is SimpleTypeMarker) val arrayElementType: Type sw?.writeArrayType() @@ -202,4 +201,14 @@ object AbstractTypeMapper { TypeVariance.OUT -> Variance.OUT_VARIANCE TypeVariance.INV -> Variance.INVARIANT } + + fun > isPrimitiveBacked( + context: TypeMappingContext, + type: KotlinTypeMarker + ): Boolean = context.typeContext.isPrimitiveBacked(type) + + private fun TypeSystemCommonBackendContext.isPrimitiveBacked(type: KotlinTypeMarker): Boolean = + !type.isNullableType() && + (type is SimpleTypeMarker && type.isPrimitiveType() || + type.typeConstructor().getValueClassProperties()?.singleOrNull()?.let { isPrimitiveBacked(it.second) } == true) } diff --git a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmTypeMapper.kt b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmTypeMapper.kt index 8b14393acff..25bc52c2eb3 100644 --- a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmTypeMapper.kt +++ b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmTypeMapper.kt @@ -65,6 +65,9 @@ class FirJvmTypeMapper(val session: FirSession) : FirSessionComponent { return AbstractTypeMapper.mapType(context, type, mode, sw) } + fun isPrimitiveBacked(type: ConeKotlinType): Boolean = + AbstractTypeMapper.isPrimitiveBacked(defaultContext, type) + private val defaultContext = Context { null } val typeContext: TypeSystemCommonBackendContext get() = defaultContext.typeContext diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/ImplicitArrayWithFlexibleParameterTypes.java b/compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/ImplicitArrayWithFlexibleParameterTypes.java new file mode 100644 index 00000000000..7dc735b6b96 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/ImplicitArrayWithFlexibleParameterTypes.java @@ -0,0 +1,4 @@ +public final class ImplicitArrayWithFlexibleParameterTypesKt /* ImplicitArrayWithFlexibleParameterTypesKt*/ { + @org.jetbrains.annotations.NotNull() + public static final java.lang.Integer[] getArrayOfFlexibleInts();// getArrayOfFlexibleInts() +} diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/ImplicitArrayWithFlexibleParameterTypes.kt b/compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/ImplicitArrayWithFlexibleParameterTypes.kt new file mode 100644 index 00000000000..0f43de07a54 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/ImplicitArrayWithFlexibleParameterTypes.kt @@ -0,0 +1,16 @@ +// ImplicitArrayWithFlexibleParameterTypesKt +// WITH_STDLIB +// FILE: ImplicitArrayWithFlexibleParameterTypes.kt + +fun getArrayOfFlexibleInts() /* : Array */ = arrayOf(JavaClass.getJavaInt()) + + +// FILE: JavaClass.java + +public class JavaClass { + public static Integer getJavaInt() { + return 10; + } +} + +// 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 d31c5be31e0..e9cbeb0eb99 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java @@ -475,6 +475,11 @@ public class CompilerLightClassTestGenerated extends AbstractCompilerLightClassT runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/Generic.kt"); } + @TestMetadata("ImplicitArrayWithFlexibleParameterTypes.kt") + public void testImplicitArrayWithFlexibleParameterTypes() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/ImplicitArrayWithFlexibleParameterTypes.kt"); + } + @TestMetadata("IntOverridesAny.kt") public void testIntOverridesAny() throws Exception { runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/nullabilityAnnotations/IntOverridesAny.kt");