From 03442e1cee7c3bbaf628ea91daa45a33b9c54f8a Mon Sep 17 00:00:00 2001 From: Vladimir Sukharev Date: Fri, 22 Sep 2023 17:41:35 +0200 Subject: [PATCH] [FIR] Implement FirGenericArrayClassLiteralSupport platform feature ^KT-59931 Fixed --- .../expression/FirClassLiteralChecker.kt | 21 ++++++++++++++++++- .../fir/session/ComponentsContainers.kt | 3 +++ .../diagnostics/nativeTests/arrays_after.kt | 10 +++++++++ .../DiagnosticsNativeTestGenerated.java | 6 ++++++ ...rontendNativeDiagnosticsTestGenerated.java | 6 ++++++ ...rontendNativeDiagnosticsTestGenerated.java | 6 ++++++ 6 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/nativeTests/arrays_after.kt diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirClassLiteralChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirClassLiteralChecker.kt index ebb6796056f..3fb13cd7db0 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirClassLiteralChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirClassLiteralChecker.kt @@ -9,6 +9,8 @@ import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.FirSessionComponent import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.getChild @@ -118,7 +120,10 @@ object FirClassLiteralChecker : FirGetClassCallChecker() { private fun ConeKotlinType.isAllowedInClassLiteral(context: CheckerContext): Boolean = when (this) { is ConeClassLikeType -> { - if (isNonPrimitiveArray && !context.languageVersionSettings.supportsFeature(LanguageFeature.ProhibitGenericArrayClassLiteral)) { + val isPlatformThatAllowsNonPrimitiveArrays = context.session.firGenericArrayClassLiteralSupport.isEnabled + val isOldVersionThatAllowsNonPrimitiveArrays = + !context.languageVersionSettings.supportsFeature(LanguageFeature.ProhibitGenericArrayClassLiteral) + if (isNonPrimitiveArray && (isPlatformThatAllowsNonPrimitiveArrays || isOldVersionThatAllowsNonPrimitiveArrays)) { typeArguments.none { typeArgument -> when (typeArgument) { is ConeStarProjection -> true @@ -132,3 +137,17 @@ object FirClassLiteralChecker : FirGetClassCallChecker() { else -> false } } + +interface FirGenericArrayClassLiteralSupport : FirSessionComponent { + val isEnabled: Boolean + + object Enabled : FirGenericArrayClassLiteralSupport { + override val isEnabled: Boolean = true + } + + object Disabled : FirGenericArrayClassLiteralSupport { + override val isEnabled: Boolean = false + } +} + +val FirSession.firGenericArrayClassLiteralSupport: FirGenericArrayClassLiteralSupport by FirSession.sessionComponentAccessor() diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt index 6c26746f5c3..6be546dd2de 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.analysis.FirOverridesBackwardCompatibilityHelper import org.jetbrains.kotlin.fir.analysis.checkers.FirInlineCheckerPlatformSpecificComponent import org.jetbrains.kotlin.fir.analysis.checkers.FirPrimaryConstructorSuperTypeCheckerPlatformComponent import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirNameConflictsTracker +import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirGenericArrayClassLiteralSupport import org.jetbrains.kotlin.fir.analysis.jvm.FirJvmOverridesBackwardCompatibilityHelper import org.jetbrains.kotlin.fir.analysis.jvm.checkers.FirJvmAnnotationsPlatformSpecificSupportComponent import org.jetbrains.kotlin.fir.analysis.jvm.checkers.FirJvmInlineCheckerComponent @@ -89,6 +90,7 @@ fun FirSession.registerCommonComponents(languageVersionSettings: LanguageVersion register(FirDeclarationOverloadabilityHelper::class, FirDeclarationOverloadabilityHelperImpl(this)) register(FirAnnotationsPlatformSpecificSupportComponent::class, FirAnnotationsPlatformSpecificSupportComponent.Default) register(FirPrimaryConstructorSuperTypeCheckerPlatformComponent::class, FirPrimaryConstructorSuperTypeCheckerPlatformComponent.Default) + register(FirGenericArrayClassLiteralSupport::class, FirGenericArrayClassLiteralSupport.Disabled) } @OptIn(SessionConfiguration::class) @@ -156,6 +158,7 @@ fun FirSession.registerJavaComponents( register(FirSyntheticNamesProvider::class, FirJavaSyntheticNamesProvider) register(FirOverridesBackwardCompatibilityHelper::class, FirJvmOverridesBackwardCompatibilityHelper) register(FirInlineCheckerPlatformSpecificComponent::class, FirJvmInlineCheckerComponent()) + register(FirGenericArrayClassLiteralSupport::class, FirGenericArrayClassLiteralSupport.Enabled) } // -------------------------- Resolve components -------------------------- diff --git a/compiler/testData/diagnostics/nativeTests/arrays_after.kt b/compiler/testData/diagnostics/nativeTests/arrays_after.kt new file mode 100644 index 00000000000..fcd84947af6 --- /dev/null +++ b/compiler/testData/diagnostics/nativeTests/arrays_after.kt @@ -0,0 +1,10 @@ +// FIR_IDENTICAL +// !LANGUAGE: +BareArrayClassLiteral + +val a01 = Array::class +val a02 = Array<Array>::class +val a03 = Array::class +val a04 = Array?>::class +val a05 = Array::class +val a06 = kotlin.Array::class +val a07 = kotlin.Array::class diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/DiagnosticsNativeTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/DiagnosticsNativeTestGenerated.java index fd7f4426917..47f86635dd2 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/DiagnosticsNativeTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/DiagnosticsNativeTestGenerated.java @@ -24,6 +24,12 @@ public class DiagnosticsNativeTestGenerated extends AbstractDiagnosticsNativeTes KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/nativeTests"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), true); } + @Test + @TestMetadata("arrays_after.kt") + public void testArrays_after() throws Exception { + runTest("compiler/testData/diagnostics/nativeTests/arrays_after.kt"); + } + @Test @TestMetadata("cloneableInNative.kt") public void testCloneableInNative() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/FirLightTreeOldFrontendNativeDiagnosticsTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/FirLightTreeOldFrontendNativeDiagnosticsTestGenerated.java index 643bd744df4..48af6bad902 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/FirLightTreeOldFrontendNativeDiagnosticsTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/FirLightTreeOldFrontendNativeDiagnosticsTestGenerated.java @@ -28,6 +28,12 @@ public class FirLightTreeOldFrontendNativeDiagnosticsTestGenerated extends Abstr KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/nativeTests"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), true); } + @Test + @TestMetadata("arrays_after.kt") + public void testArrays_after() throws Exception { + runTest("compiler/testData/diagnostics/nativeTests/arrays_after.kt"); + } + @Test @TestMetadata("cloneableInNative.kt") public void testCloneableInNative() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/FirPsiOldFrontendNativeDiagnosticsTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/FirPsiOldFrontendNativeDiagnosticsTestGenerated.java index 1d995156783..23725dfed79 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/FirPsiOldFrontendNativeDiagnosticsTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/FirPsiOldFrontendNativeDiagnosticsTestGenerated.java @@ -28,6 +28,12 @@ public class FirPsiOldFrontendNativeDiagnosticsTestGenerated extends AbstractFir KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/nativeTests"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), true); } + @Test + @TestMetadata("arrays_after.kt") + public void testArrays_after() throws Exception { + runTest("compiler/testData/diagnostics/nativeTests/arrays_after.kt"); + } + @Test @TestMetadata("cloneableInNative.kt") public void testCloneableInNative() throws Exception {