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 86aace4664b..85e24ea16d2 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 @@ -40512,6 +40512,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.kt"); } + @Test + @TestMetadata("diffrentModules.kt") + public void testDiffrentModules() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/diffrentModules.kt"); + } + @Test @TestMetadata("duration.kt") public void testDuration() 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 3040a6db04c..84d09798ce4 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 @@ -40512,6 +40512,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.kt"); } + @Test + @TestMetadata("diffrentModules.kt") + public void testDiffrentModules() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/diffrentModules.kt"); + } + @Test @TestMetadata("duration.kt") public void testDuration() 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 30986852855..2d89e90a029 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 @@ -40512,6 +40512,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.kt"); } + @Test + @TestMetadata("diffrentModules.kt") + public void testDiffrentModules() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/diffrentModules.kt"); + } + @Test @TestMetadata("duration.kt") public void testDuration() 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 c165ddc56af..32b37961c8b 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 @@ -40626,6 +40626,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.kt"); } + @Test + @TestMetadata("diffrentModules.kt") + public void testDiffrentModules() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/diffrentModules.kt"); + } + @Test @TestMetadata("duration.kt") public void testDuration() throws Exception { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt index ae434077424..dcb9a10b477 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt @@ -7,14 +7,18 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.config.AnalysisFlags +import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.analysis.checkers.* import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.declaration.primaryConstructorSymbol import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.correspondingValueParameterFromPrimaryConstructor +import org.jetbrains.kotlin.fir.declarations.utils.isData +import org.jetbrains.kotlin.fir.declarations.utils.nameOrSpecialName import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.references.resolved @@ -32,6 +36,7 @@ import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.resolve.DataClassResolver import org.jetbrains.kotlin.resolve.checkers.OptInNames import org.jetbrains.kotlin.utils.SmartSet import org.jetbrains.kotlin.utils.addIfNotNull @@ -207,6 +212,16 @@ object FirOptInUsageBaseChecker { valueParameters.forEach { it.returnTypeRef.coneType.addExperimentalities(context, result, visited) } + + // Handling data class 'componentN' function + if (parentClassSymbol?.isData == true && DataClassResolver.isComponentLike(this.nameOrSpecialName) && parentClassSymbol.classKind == ClassKind.CLASS) { + val componentNIndex = DataClassResolver.getComponentIndex(this.nameOrSpecialName.identifier) + val valueParameters = parentClassSymbol.primaryConstructorSymbol(context.session)?.valueParameterSymbols + val valueParameter = valueParameters?.getOrNull(componentNIndex - 1) + val properties = parentClassSymbol.declarationSymbols.filterIsInstance() + val property = properties.firstOrNull { it.name == valueParameter?.name } + property?.loadExperimentalities(context, result, visited, fromSetter = false, dispatchReceiverType, fromSupertype = false) + } } if (fromSetter && symbol is FirPropertySymbol) { diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/diffrentModules.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/diffrentModules.fir.kt new file mode 100644 index 00000000000..a89b7fbc11e --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/diffrentModules.fir.kt @@ -0,0 +1,19 @@ +// !OPT_IN: kotlin.RequiresOptIn +// FILE: api.kt + + +// MODULE: A +package main + +@kotlin.RequiresOptIn +annotation class Marker + +data class DataClass(@property:Marker val x: Int) + +// MODULE: B(A) +package main + +fun test(d: DataClass) { + val (x) = d + val c = d.component1() +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/diffrentModules.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/diffrentModules.kt new file mode 100644 index 00000000000..755dde91d1d --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/diffrentModules.kt @@ -0,0 +1,19 @@ +// !OPT_IN: kotlin.RequiresOptIn +// FILE: api.kt + + +// MODULE: A +package main + +@kotlin.RequiresOptIn +annotation class Marker + +data class DataClass(@property:Marker val x: Int) + +// MODULE: B(A) +package main + +fun test(d: DataClass) { + val (x) = d + val c = d.component1() +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/implicitUsages.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/implicitUsages.fir.kt index c72e41844b0..a8c769b2775 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/implicitUsages.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/implicitUsages.fir.kt @@ -27,7 +27,7 @@ data class DataClass(@property:Marker val x: Int) fun useDataClass(d: DataClass) { // Should have error in both d.x - val (x) = d + val (x) = d } typealias My = Some diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/implicitUsagesFuture.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/implicitUsagesFuture.fir.kt index 1d32289ec02..e37bf0c204b 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/implicitUsagesFuture.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/implicitUsagesFuture.fir.kt @@ -27,7 +27,7 @@ data class DataClass(@property:Marker val x: Int) fun useDataClass(d: DataClass) { // Should have error in both d.x - val (x) = d + val (x) = d } typealias My = Some 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 a454b670af4..c39e5ec4a94 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 @@ -42548,6 +42548,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.kt"); } + @Test + @TestMetadata("diffrentModules.kt") + public void testDiffrentModules() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/diffrentModules.kt"); + } + @Test @TestMetadata("duration.kt") public void testDuration() throws Exception {