diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index 9652a21e97d..c7d368f361d 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -43118,6 +43118,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimental.kt"); } + @Test + @TestMetadata("wasExperimentalCombined.kt") + public void testWasExperimentalCombined() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimentalCombined.kt"); + } + @Test @TestMetadata("wrongTargetsWithoutExplicitTarget.kt") public void testWrongTargetsWithoutExplicitTarget() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index e27760ec17c..15d15a6ffff 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -43118,6 +43118,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimental.kt"); } + @Test + @TestMetadata("wasExperimentalCombined.kt") + public void testWasExperimentalCombined() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimentalCombined.kt"); + } + @Test @TestMetadata("wrongTargetsWithoutExplicitTarget.kt") public void testWrongTargetsWithoutExplicitTarget() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index 5a099f9ccb6..c7f4e67c395 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -40998,6 +40998,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimental.kt"); } + @Test + @TestMetadata("wasExperimentalCombined.kt") + public void testWasExperimentalCombined() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimentalCombined.kt"); + } + @Test @TestMetadata("wrongTargetsWithoutExplicitTarget.kt") public void testWrongTargetsWithoutExplicitTarget() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index 7ed673451e7..4bfc83de546 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -41118,6 +41118,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimental.kt"); } + @Test + @TestMetadata("wasExperimentalCombined.kt") + public void testWasExperimentalCombined() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimentalCombined.kt"); + } + @Test @TestMetadata("wrongTargetsWithoutExplicitTarget.kt") public void testWrongTargetsWithoutExplicitTarget() throws Exception { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirSinceKotlinHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirSinceKotlinHelpers.kt index 0a7a2d749df..f7aea707dca 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirSinceKotlinHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirSinceKotlinHelpers.kt @@ -68,7 +68,6 @@ private fun FirDeclaration.getOwnSinceKotlinVersion(session: FirSession): FirSin ) val apiVersion = ((sinceKotlinSingleArgument as? FirConstExpression<*>)?.value as? String)?.let(ApiVersion.Companion::parse) if (apiVersion != null) { - // TODO, KT-59825: combine wasExperimentalMarkerClasses in case of several associated declarations with the same maximal API version if (result == null || apiVersion > result!!.apiVersion) { result = FirSinceKotlinValue(apiVersion, loadWasExperimentalMarkerClasses(session)) } diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimentalCombined.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimentalCombined.fir.kt new file mode 100644 index 00000000000..4879351e0e0 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimentalCombined.fir.kt @@ -0,0 +1,52 @@ +// API_VERSION: 1.8 +// !DIAGNOSTICS: -INVISIBLE_MEMBER -INVISIBLE_REFERENCE + +@RequiresOptIn +@Retention(AnnotationRetention.BINARY) +annotation class ClassMarker + +@RequiresOptIn +@Retention(AnnotationRetention.BINARY) +annotation class ConstructorMarker + +@RequiresOptIn +@Retention(AnnotationRetention.BINARY) +annotation class TypeAliasMarker + +@SinceKotlin("1.9") +@WasExperimental(ClassMarker::class) +class C { + @SinceKotlin("1.9") + @WasExperimental(ConstructorMarker::class) + constructor() {} +} + +@SinceKotlin("1.9") +@WasExperimental(TypeAliasMarker::class) +typealias T = C + +@ClassMarker +fun test1() { + C() +} + +@ConstructorMarker +fun test2() { + C() +} + +@ClassMarker +@ConstructorMarker +fun test3() { + C() +} + +@ClassMarker +fun test4(t: T) {} + +@TypeAliasMarker +fun test5(t: T) {} + +@ClassMarker +@TypeAliasMarker +fun test6(t: T) {} diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimentalCombined.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimentalCombined.kt new file mode 100644 index 00000000000..eb2cfa69757 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimentalCombined.kt @@ -0,0 +1,52 @@ +// API_VERSION: 1.8 +// !DIAGNOSTICS: -INVISIBLE_MEMBER -INVISIBLE_REFERENCE + +@RequiresOptIn +@Retention(AnnotationRetention.BINARY) +annotation class ClassMarker + +@RequiresOptIn +@Retention(AnnotationRetention.BINARY) +annotation class ConstructorMarker + +@RequiresOptIn +@Retention(AnnotationRetention.BINARY) +annotation class TypeAliasMarker + +@SinceKotlin("1.9") +@WasExperimental(ClassMarker::class) +class C { + @SinceKotlin("1.9") + @WasExperimental(ConstructorMarker::class) + constructor() {} +} + +@SinceKotlin("1.9") +@WasExperimental(TypeAliasMarker::class) +typealias T = C + +@ClassMarker +fun test1() { + C() +} + +@ConstructorMarker +fun test2() { + C() +} + +@ClassMarker +@ConstructorMarker +fun test3() { + C() +} + +@ClassMarker +fun test4(t: T) {} + +@TypeAliasMarker +fun test5(t: T) {} + +@ClassMarker +@TypeAliasMarker +fun test6(t: T) {} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 6dc9e4e9d40..4695a5cd1cc 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -43112,6 +43112,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimental.kt"); } + @Test + @TestMetadata("wasExperimentalCombined.kt") + public void testWasExperimentalCombined() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimentalCombined.kt"); + } + @Test @TestMetadata("wrongTargetsWithoutExplicitTarget.kt") public void testWrongTargetsWithoutExplicitTarget() throws Exception {