From a6c7d4c0c6e1cae5dc4d5336129f97cb016d4fbf Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 20 Sep 2022 11:28:34 +0300 Subject: [PATCH] [FIR] Analyze bodies of non delegated property accessors without expected type ^KT-53349 Fixed --- .../DiagnosisCompilerFirTestdataTestGenerated.java | 6 ++++++ ...IsNotTouchedTilContractsPhaseTestGenerated.java | 5 +++++ .../properties/getterWithEarlyReturn.fir.txt | 14 ++++++++++++++ .../resolve/properties/getterWithEarlyReturn.kt | 11 +++++++++++ .../test/runners/FirDiagnosticTestGenerated.java | 6 ++++++ .../FirDiagnosticsWithLightTreeTestGenerated.java | 6 ++++++ .../resolve/FirDeclarationsResolveTransformer.kt | 2 +- 7 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 compiler/fir/analysis-tests/testData/resolve/properties/getterWithEarlyReturn.fir.txt create mode 100644 compiler/fir/analysis-tests/testData/resolve/properties/getterWithEarlyReturn.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java index a8100adbcd4..5997ba426be 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java @@ -3437,6 +3437,12 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/properties"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @Test + @TestMetadata("getterWithEarlyReturn.kt") + public void testGetterWithEarlyReturn() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/properties/getterWithEarlyReturn.kt"); + } + @Test @TestMetadata("javaAccessorConversion.kt") public void testJavaAccessorConversion() throws Exception { diff --git a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java index bfec22a293c..e32ebbe8403 100644 --- a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java +++ b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java @@ -3030,6 +3030,11 @@ public class LazyBodyIsNotTouchedTilContractsPhaseTestGenerated extends Abstract KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/properties"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @TestMetadata("getterWithEarlyReturn.kt") + public void testGetterWithEarlyReturn() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/properties/getterWithEarlyReturn.kt"); + } + @TestMetadata("javaAccessorConversion.kt") public void testJavaAccessorConversion() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/properties/javaAccessorConversion.kt"); diff --git a/compiler/fir/analysis-tests/testData/resolve/properties/getterWithEarlyReturn.fir.txt b/compiler/fir/analysis-tests/testData/resolve/properties/getterWithEarlyReturn.fir.txt new file mode 100644 index 00000000000..57d79c0439e --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/properties/getterWithEarlyReturn.fir.txt @@ -0,0 +1,14 @@ +FILE: getterWithEarlyReturn.kt + public final class SomeClass : R|kotlin/Any| { + public constructor(): R|SomeClass| { + super() + } + + } + public final val R|SomeClass|.lore: R|kotlin/collections/List| + public get(): R|kotlin/collections/List| { + this@R|/lore|.R|kotlin/apply|( = apply@fun R|SomeClass|.(): R|kotlin/Unit| { + ^ R|kotlin/collections/emptyList|() + } + ) + } diff --git a/compiler/fir/analysis-tests/testData/resolve/properties/getterWithEarlyReturn.kt b/compiler/fir/analysis-tests/testData/resolve/properties/getterWithEarlyReturn.kt new file mode 100644 index 00000000000..5b4fadd6c27 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/properties/getterWithEarlyReturn.kt @@ -0,0 +1,11 @@ +// WITH_STDLIB +// ISSUE: KT-53349 + +class SomeClass + +val SomeClass.lore: List + get() { + apply { + return emptyList() + } + } diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java index 41cf20aa31b..8319e2d4f4a 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java @@ -3437,6 +3437,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/properties"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @Test + @TestMetadata("getterWithEarlyReturn.kt") + public void testGetterWithEarlyReturn() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/properties/getterWithEarlyReturn.kt"); + } + @Test @TestMetadata("javaAccessorConversion.kt") public void testJavaAccessorConversion() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java index 651c979a372..918d389fbd4 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java @@ -3437,6 +3437,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/properties"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @Test + @TestMetadata("getterWithEarlyReturn.kt") + public void testGetterWithEarlyReturn() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/properties/getterWithEarlyReturn.kt"); + } + @Test @TestMetadata("javaAccessorConversion.kt") public void testJavaAccessorConversion() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt index 681b6fac074..7e15eb3a41a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt @@ -459,7 +459,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor } else { returnTypeRef } - val resolutionMode = if (expectedReturnTypeRef.coneTypeSafe() == session.builtinTypes.unitType.type) { + val resolutionMode = if (owner.delegate == null || expectedReturnTypeRef.coneTypeSafe()?.isUnit == true) { ResolutionMode.ContextIndependent } else { withExpectedType(expectedReturnTypeRef)