From fb43e53ca35e63081f0bb3e3b111979d416dff01 Mon Sep 17 00:00:00 2001 From: Marco Pennekamp Date: Thu, 9 Feb 2023 15:18:29 +0100 Subject: [PATCH] [LL FIR] KTIJ-24574 Fix containing declaration finder for init blocks - KTIJ-24574 occurred because a local destructuring declaration was erroneously returned as the non-local containing declaration of an element by `getNonLocalContainingOrThisDeclaration`. This occurred in `init` blocks. KTIJ-24574 fixed --- ...ceModuleReferenceResolveTestGenerated.java | 6 ++++ ...ceModuleReferenceResolveTestGenerated.java | 6 ++++ ...ceModuleReferenceResolveTestGenerated.java | 6 ++++ ...ceModuleReferenceResolveTestGenerated.java | 6 ++++ ...ceModuleReferenceResolveTestGenerated.java | 6 ++++ .../DestructuringDeclarationInInit.kt | 11 +++++++ .../DestructuringDeclarationInInit.txt | 2 ++ .../fir/element/builder/FirElementBuilder.kt | 33 +++++++++++-------- ...ingFileUtils.kt => containingFileUtils.kt} | 0 9 files changed, 62 insertions(+), 14 deletions(-) create mode 100644 analysis/analysis-api/testData/referenceResolve/DestructuringDeclarationInInit.kt create mode 100644 analysis/analysis-api/testData/referenceResolve/DestructuringDeclarationInInit.txt rename analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/{contrainingFileUtils.kt => containingFileUtils.kt} (100%) diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java index 379eb5a4871..2fc8569413e 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -166,6 +166,12 @@ public class Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated exte runTest("analysis/analysis-api/testData/referenceResolve/Deprecated.kt"); } + @Test + @TestMetadata("DestructuringDeclarationInInit.kt") + public void testDestructuringDeclarationInInit() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/DestructuringDeclarationInInit.kt"); + } + @Test @TestMetadata("EnumValues.kt") public void testEnumValues() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java index c793c0a3099..5dfbbb2c93e 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -166,6 +166,12 @@ public class FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated ex runTest("analysis/analysis-api/testData/referenceResolve/Deprecated.kt"); } + @Test + @TestMetadata("DestructuringDeclarationInInit.kt") + public void testDestructuringDeclarationInInit() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/DestructuringDeclarationInInit.kt"); + } + @Test @TestMetadata("EnumValues.kt") public void testEnumValues() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java index 9b41a4a6e87..000c41d0c43 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java @@ -166,6 +166,12 @@ public class FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerate runTest("analysis/analysis-api/testData/referenceResolve/Deprecated.kt"); } + @Test + @TestMetadata("DestructuringDeclarationInInit.kt") + public void testDestructuringDeclarationInInit() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/DestructuringDeclarationInInit.kt"); + } + @Test @TestMetadata("EnumValues.kt") public void testEnumValues() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java index d6f90b03d9e..bb681eb9bf1 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -166,6 +166,12 @@ public class FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated exten runTest("analysis/analysis-api/testData/referenceResolve/Deprecated.kt"); } + @Test + @TestMetadata("DestructuringDeclarationInInit.kt") + public void testDestructuringDeclarationInInit() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/DestructuringDeclarationInInit.kt"); + } + @Test @TestMetadata("EnumValues.kt") public void testEnumValues() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java index a983b483d8b..884453f34ff 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -166,6 +166,12 @@ public class FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerate runTest("analysis/analysis-api/testData/referenceResolve/Deprecated.kt"); } + @Test + @TestMetadata("DestructuringDeclarationInInit.kt") + public void testDestructuringDeclarationInInit() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/DestructuringDeclarationInInit.kt"); + } + @Test @TestMetadata("EnumValues.kt") public void testEnumValues() throws Exception { diff --git a/analysis/analysis-api/testData/referenceResolve/DestructuringDeclarationInInit.kt b/analysis/analysis-api/testData/referenceResolve/DestructuringDeclarationInInit.kt new file mode 100644 index 00000000000..df9d1708f64 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/DestructuringDeclarationInInit.kt @@ -0,0 +1,11 @@ +var x: Any = 2 + +class Test { + init { + val (type, entityName) = when { + x is Int -> Int::class.java to "Int" + x is String -> String::class.java to "String" + else -> null to null + } + } +} diff --git a/analysis/analysis-api/testData/referenceResolve/DestructuringDeclarationInInit.txt b/analysis/analysis-api/testData/referenceResolve/DestructuringDeclarationInInit.txt new file mode 100644 index 00000000000..6d26aa91ee7 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/DestructuringDeclarationInInit.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in ROOT) var x: kotlin.Any diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt index 9dc8a902d56..aa5efe5ce6e 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt @@ -18,7 +18,9 @@ import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.* +import org.jetbrains.kotlin.psi.psiUtil.isAncestor +import org.jetbrains.kotlin.psi.psiUtil.isObjectLiteral +import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf import org.jetbrains.kotlin.psi2ir.deparenthesize @@ -107,24 +109,27 @@ internal fun PsiElement.getNonLocalContainingOrThisDeclaration(predicate: (KtDec for (parent in parentsWithSelf) { if (candidate != null) { - if (parent is KtEnumEntry || parent is KtCallableDeclaration) { - // Candidate turned to be local. Let's find another one + if (parent is KtEnumEntry || parent is KtCallableDeclaration || parent is KtClassInitializer) { + // Candidate turned out to be local. Let's find another one. candidate = null } } - when (parent) { - is KtScript -> propose(parent) - is KtDestructuringDeclaration -> propose(parent) - is KtNamedDeclaration -> { - val isKindApplicable = when (parent) { - is KtClassOrObject -> !parent.isObjectLiteral() - is KtDeclarationWithBody, is KtProperty, is KtTypeAlias -> true - else -> false - } + // A new candidate only needs to be proposed when `candidate` is null. + if (candidate == null) { + when (parent) { + is KtScript -> propose(parent) + is KtDestructuringDeclaration -> propose(parent) + is KtNamedDeclaration -> { + val isKindApplicable = when (parent) { + is KtClassOrObject -> !parent.isObjectLiteral() + is KtDeclarationWithBody, is KtProperty, is KtTypeAlias -> true + else -> false + } - if (isKindApplicable && declarationCanBeLazilyResolved(parent) && predicate(parent)) { - propose(parent) + if (isKindApplicable && declarationCanBeLazilyResolved(parent) && predicate(parent)) { + propose(parent) + } } } } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/contrainingFileUtils.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/containingFileUtils.kt similarity index 100% rename from analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/contrainingFileUtils.kt rename to analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/containingFileUtils.kt