From 913b55174d8d67f8c2d0e9ac54ef36f95f1b2e83 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 26 Apr 2023 17:35:59 +0300 Subject: [PATCH] [FIR] Correctly determine primary constructor parameters scope for class initialization section ^KT-58135 Fixed --- ...CompilerTestFE10TestdataTestGenerated.java | 6 ++++ ...sticCompilerFE10TestDataTestGenerated.java | 6 ++++ ...eeOldFrontendDiagnosticsTestGenerated.java | 6 ++++ ...siOldFrontendDiagnosticsTestGenerated.java | 6 ++++ .../body/resolve/BodyResolveContext.kt | 13 +++----- ...etersVsPropertiesFromPrimaryConstructor.kt | 31 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++ 7 files changed, 65 insertions(+), 9 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/constructorConsistency/parametersVsPropertiesFromPrimaryConstructor.kt 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 777f2088202..faa913e718c 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 @@ -5770,6 +5770,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/constructorConsistency/outer.kt"); } + @Test + @TestMetadata("parametersVsPropertiesFromPrimaryConstructor.kt") + public void testParametersVsPropertiesFromPrimaryConstructor() throws Exception { + runTest("compiler/testData/diagnostics/tests/constructorConsistency/parametersVsPropertiesFromPrimaryConstructor.kt"); + } + @Test @TestMetadata("property.kt") public void testProperty() 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 78f2370e0d2..d937de1db78 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 @@ -5770,6 +5770,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/constructorConsistency/outer.kt"); } + @Test + @TestMetadata("parametersVsPropertiesFromPrimaryConstructor.kt") + public void testParametersVsPropertiesFromPrimaryConstructor() throws Exception { + runTest("compiler/testData/diagnostics/tests/constructorConsistency/parametersVsPropertiesFromPrimaryConstructor.kt"); + } + @Test @TestMetadata("property.kt") public void testProperty() 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 477fa11ea11..7d3033562d8 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 @@ -5770,6 +5770,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/constructorConsistency/outer.kt"); } + @Test + @TestMetadata("parametersVsPropertiesFromPrimaryConstructor.kt") + public void testParametersVsPropertiesFromPrimaryConstructor() throws Exception { + runTest("compiler/testData/diagnostics/tests/constructorConsistency/parametersVsPropertiesFromPrimaryConstructor.kt"); + } + @Test @TestMetadata("property.kt") public void testProperty() 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 aa5c69d2406..d96699a0572 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 @@ -5776,6 +5776,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/constructorConsistency/outer.kt"); } + @Test + @TestMetadata("parametersVsPropertiesFromPrimaryConstructor.kt") + public void testParametersVsPropertiesFromPrimaryConstructor() throws Exception { + runTest("compiler/testData/diagnostics/tests/constructorConsistency/parametersVsPropertiesFromPrimaryConstructor.kt"); + } + @Test @TestMetadata("property.kt") public void testProperty() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt index 395ca3b73d0..159da702cbb 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt @@ -5,10 +5,10 @@ package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve -import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.PrivateForInline +import org.jetbrains.kotlin.fir.correspondingProperty import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor import org.jetbrains.kotlin.fir.declarations.utils.isCompanion @@ -464,7 +464,7 @@ class BodyResolveContext( val constructor = (owner as? FirRegularClass)?.declarations?.firstOrNull { it is FirConstructor } as? FirConstructor val (primaryConstructorPureParametersScope, primaryConstructorAllParametersScope) = if (constructor?.isPrimary == true) { - constructor.scopesWithPrimaryConstructorParameters(owner, holder.session) + constructor.scopesWithPrimaryConstructorParameters(holder.session) } else { null to null } @@ -551,17 +551,12 @@ class BodyResolveContext( } } - private fun FirConstructor.scopesWithPrimaryConstructorParameters( - ownerClass: FirClass, - session: FirSession - ): Pair { + private fun FirConstructor.scopesWithPrimaryConstructorParameters(session: FirSession): Pair { var parameterScope = FirLocalScope(session) var allScope = FirLocalScope(session) - val properties = ownerClass.declarations.filterIsInstance().associateBy { it.name } for (parameter in valueParameters) { allScope = allScope.storeVariable(parameter, session) - val property = properties[parameter.name] - if (property?.source?.kind != KtFakeSourceElementKind.PropertyFromParameter) { + if (parameter.correspondingProperty == null) { parameterScope = parameterScope.storeVariable(parameter, session) } } diff --git a/compiler/testData/diagnostics/tests/constructorConsistency/parametersVsPropertiesFromPrimaryConstructor.kt b/compiler/testData/diagnostics/tests/constructorConsistency/parametersVsPropertiesFromPrimaryConstructor.kt new file mode 100644 index 00000000000..c641d1fca81 --- /dev/null +++ b/compiler/testData/diagnostics/tests/constructorConsistency/parametersVsPropertiesFromPrimaryConstructor.kt @@ -0,0 +1,31 @@ +// FIR_IDENTICAL +// ISSUE: KT-58135 + +class Test( + val x: Int, // (1) + y: Int // (2) +) { + val String.x: String get() = this // (3) + val String.y: String get() = this // (4) + + val y: Int = y // (5) + + fun test(s: String) { + with(s) { + x.length // (3) + y.length // (4) + } + } + + val test = with("hello") { + x.length // (3) + y.inc() // (2) + } + + init { + with("hello") { + x.length // (3) + y.inc() // (2) + } + } +} 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 9690ba9f7d5..9f15204df44 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 @@ -5776,6 +5776,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/constructorConsistency/outer.kt"); } + @Test + @TestMetadata("parametersVsPropertiesFromPrimaryConstructor.kt") + public void testParametersVsPropertiesFromPrimaryConstructor() throws Exception { + runTest("compiler/testData/diagnostics/tests/constructorConsistency/parametersVsPropertiesFromPrimaryConstructor.kt"); + } + @Test @TestMetadata("property.kt") public void testProperty() throws Exception {