From a7c1f53af888c112854cc4ef47d557a9bbac6afe Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Tue, 27 Jun 2023 09:54:01 +0000 Subject: [PATCH] [FIR] Correctly process invalid destructing declarations ^KTIJ-24730 fixed Merge-request: KT-MR-10712 Merged-by: Egor Kulikov --- ...isSourceModuleReferenceResolveTestGenerated.java | 6 ++++++ .../KtFirSymbolContainingDeclarationProvider.kt | 5 +++++ ...isSourceModuleReferenceResolveTestGenerated.java | 6 ++++++ ...isSourceModuleReferenceResolveTestGenerated.java | 6 ++++++ ...isSourceModuleReferenceResolveTestGenerated.java | 6 ++++++ .../withErrors/TopLevelDestructingDeclaration.kt | 9 +++++++++ .../fe10/KtFe10DestructuringDeclarationEntry.kt | 4 ---- .../KtDestructuringDeclarationReference.kt | 2 +- .../getOrBuildFir/declarations/ktij24730.kt | 7 +++++++ .../getOrBuildFir/declarations/ktij24730.txt | 13 +++++++++++++ .../OutOfContentRootGetOrBuildFirTestGenerated.java | 6 ++++++ .../api/fir/SourceGetOrBuildFirTestGenerated.java | 6 ++++++ 12 files changed, 71 insertions(+), 5 deletions(-) create mode 100644 analysis/analysis-api/testData/referenceResolve/withErrors/TopLevelDestructingDeclaration.kt create mode 100644 analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/ktij24730.kt create mode 100644 analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/ktij24730.txt 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 ddce384c4d2..1ae7a934934 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 @@ -2189,6 +2189,12 @@ public class Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated exte runTest("analysis/analysis-api/testData/referenceResolve/withErrors/TopLevelClassVsLocalClassQualifier.kt"); } + @Test + @TestMetadata("TopLevelDestructingDeclaration.kt") + public void testTopLevelDestructingDeclaration() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/withErrors/TopLevelDestructingDeclaration.kt"); + } + @Test @TestMetadata("TypeArgumentBeforeDot2.kt") public void testTypeArgumentBeforeDot2() throws Exception { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt index c1f8ce00d37..a5872dbc97d 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.KtRealSourceElementKind import org.jetbrains.kotlin.analysis.api.components.KtSymbolContainingDeclarationProvider import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession +import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirErrorVariableSymbol import org.jetbrains.kotlin.analysis.api.fir.utils.firSymbol import org.jetbrains.kotlin.analysis.api.fir.utils.getContainingKtModule import org.jetbrains.kotlin.analysis.api.fir.utils.withSymbolAttachment @@ -23,7 +24,9 @@ import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment import org.jetbrains.kotlin.analysis.utils.printer.parentOfType import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol +import org.jetbrains.kotlin.fir.diagnostics.ConeDestructuringDeclarationsOnTopLevel import org.jetbrains.kotlin.fir.resolve.providers.firProvider +import org.jetbrains.kotlin.fir.symbols.impl.FirErrorPropertySymbol import org.jetbrains.kotlin.psi import org.jetbrains.kotlin.psi.* @@ -38,6 +41,8 @@ internal class KtFirSymbolContainingDeclarationProvider( if (symbol !is KtDeclarationSymbol) return null if (symbol is KtSymbolWithKind && symbol.symbolKind == KtSymbolKind.TOP_LEVEL) return null + val firSymbol = symbol.firSymbol + if (firSymbol is FirErrorPropertySymbol && firSymbol.diagnostic is ConeDestructuringDeclarationsOnTopLevel) return null fun getParentSymbolByPsi() = getContainingPsi(symbol).let { with(analysisSession) { it.getSymbol() } } return when (symbol) { is KtPropertyAccessorSymbol -> firSymbolBuilder.buildSymbol(symbol.firSymbol.fir.propertySymbol) as? KtDeclarationSymbol 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 aab9acc878a..b7b65a9ed1e 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 @@ -2189,6 +2189,12 @@ public class FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated ex runTest("analysis/analysis-api/testData/referenceResolve/withErrors/TopLevelClassVsLocalClassQualifier.kt"); } + @Test + @TestMetadata("TopLevelDestructingDeclaration.kt") + public void testTopLevelDestructingDeclaration() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/withErrors/TopLevelDestructingDeclaration.kt"); + } + @Test @TestMetadata("TypeArgumentBeforeDot2.kt") public void testTypeArgumentBeforeDot2() 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 1b35c65d7d7..adcfefb5154 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 @@ -2189,6 +2189,12 @@ public class FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated exten runTest("analysis/analysis-api/testData/referenceResolve/withErrors/TopLevelClassVsLocalClassQualifier.kt"); } + @Test + @TestMetadata("TopLevelDestructingDeclaration.kt") + public void testTopLevelDestructingDeclaration() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/withErrors/TopLevelDestructingDeclaration.kt"); + } + @Test @TestMetadata("TypeArgumentBeforeDot2.kt") public void testTypeArgumentBeforeDot2() 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 b47d380d575..1495814ebe0 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 @@ -2189,6 +2189,12 @@ public class FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerate runTest("analysis/analysis-api/testData/referenceResolve/withErrors/TopLevelClassVsLocalClassQualifier.kt"); } + @Test + @TestMetadata("TopLevelDestructingDeclaration.kt") + public void testTopLevelDestructingDeclaration() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/withErrors/TopLevelDestructingDeclaration.kt"); + } + @Test @TestMetadata("TypeArgumentBeforeDot2.kt") public void testTypeArgumentBeforeDot2() throws Exception { diff --git a/analysis/analysis-api/testData/referenceResolve/withErrors/TopLevelDestructingDeclaration.kt b/analysis/analysis-api/testData/referenceResolve/withErrors/TopLevelDestructingDeclaration.kt new file mode 100644 index 00000000000..3c62a03dc4e --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/withErrors/TopLevelDestructingDeclaration.kt @@ -0,0 +1,9 @@ +// UNRESOLVED_REFERENCE + +fun createTuple(a: T, b: Z&Any): Pair { + return Pair(a, b) +} + +fun main() +var (val1, val2) = createTuple("a", 1) +} \ No newline at end of file diff --git a/analysis/kt-references/kt-references-fe10/src/org/jetbrains/kotlin/references/fe10/KtFe10DestructuringDeclarationEntry.kt b/analysis/kt-references/kt-references-fe10/src/org/jetbrains/kotlin/references/fe10/KtFe10DestructuringDeclarationEntry.kt index caa41fdb24d..faeb3815589 100644 --- a/analysis/kt-references/kt-references-fe10/src/org/jetbrains/kotlin/references/fe10/KtFe10DestructuringDeclarationEntry.kt +++ b/analysis/kt-references/kt-references-fe10/src/org/jetbrains/kotlin/references/fe10/KtFe10DestructuringDeclarationEntry.kt @@ -25,10 +25,6 @@ class KtFe10DestructuringDeclarationEntry( ) } - override fun resolve() = multiResolve(false).asSequence() - .map { it.element } - .firstOrNull { it is KtDestructuringDeclarationEntry } - override fun getRangeInElement() = TextRange(0, element.textLength) override fun isReferenceToImportAlias(alias: KtImportAlias): Boolean { diff --git a/analysis/kt-references/src/org/jetbrains/kotlin/idea/references/KtDestructuringDeclarationReference.kt b/analysis/kt-references/src/org/jetbrains/kotlin/idea/references/KtDestructuringDeclarationReference.kt index 1eda92ee2ba..c6de4307b66 100644 --- a/analysis/kt-references/src/org/jetbrains/kotlin/idea/references/KtDestructuringDeclarationReference.kt +++ b/analysis/kt-references/src/org/jetbrains/kotlin/idea/references/KtDestructuringDeclarationReference.kt @@ -21,7 +21,7 @@ abstract class KtDestructuringDeclarationReference( override fun resolve() = multiResolve(false).asSequence() .map { it.element } - .first { it is KtDestructuringDeclarationEntry } + .firstOrNull { it is KtDestructuringDeclarationEntry } override val resolvesByNames: Collection get() { diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/ktij24730.kt b/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/ktij24730.kt new file mode 100644 index 00000000000..6ec186a6705 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/ktij24730.kt @@ -0,0 +1,7 @@ +fun createTuple(a: T, b: Z&Any): Pair { + return Pair(a, b) +} + +fun main() + var (val1, val2) = createTuple("a", 1) +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/ktij24730.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/ktij24730.txt new file mode 100644 index 00000000000..a04177901f6 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/ktij24730.txt @@ -0,0 +1,13 @@ +KT element: KtDestructuringDeclarationEntry +FIR element: FirErrorPropertyImpl +FIR source kind: KtRealSourceElementKind + +FIR element rendered: + + +FIR FILE: +FILE: [ResolvedTo(IMPORTS)] ktij24730.kt + [ResolvedTo(BODY_RESOLVE)] annotations container + public? final? [ResolvedTo(RAW_FIR)] fun <[ResolvedTo(RAW_FIR)] T : Any, [ResolvedTo(RAW_FIR)] Z> createTuple([ResolvedTo(RAW_FIR)] a: T, [ResolvedTo(RAW_FIR)] b: ZAny): Pair { LAZY_BLOCK } + public? final? [ResolvedTo(RAW_FIR)] fun main(): R|kotlin/Unit| + diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/OutOfContentRootGetOrBuildFirTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/OutOfContentRootGetOrBuildFirTestGenerated.java index 403116ddcaf..dbcf52664b6 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/OutOfContentRootGetOrBuildFirTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/OutOfContentRootGetOrBuildFirTestGenerated.java @@ -507,6 +507,12 @@ public class OutOfContentRootGetOrBuildFirTestGenerated extends AbstractOutOfCon runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/ktij23263.kt"); } + @Test + @TestMetadata("ktij24730.kt") + public void testKtij24730() throws Exception { + runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/ktij24730.kt"); + } + @Test @TestMetadata("objectLiteral.kt") public void testObjectLiteral() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceGetOrBuildFirTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceGetOrBuildFirTestGenerated.java index ab980c98cd1..9a797e57550 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceGetOrBuildFirTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceGetOrBuildFirTestGenerated.java @@ -507,6 +507,12 @@ public class SourceGetOrBuildFirTestGenerated extends AbstractSourceGetOrBuildFi runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/ktij23263.kt"); } + @Test + @TestMetadata("ktij24730.kt") + public void testKtij24730() throws Exception { + runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/ktij24730.kt"); + } + @Test @TestMetadata("objectLiteral.kt") public void testObjectLiteral() throws Exception {