From f18d600dc8149ef7493296e91677d9883ac7aa91 Mon Sep 17 00:00:00 2001 From: aleksandrina-streltsova Date: Fri, 8 Sep 2023 07:25:36 +0000 Subject: [PATCH] [LL FIR] Return class as structure element for super type reference ^KT-61755 Fixed --- ...ModuleCollectDiagnosticsTestGenerated.java | 6 ++++++ ...ModuleCollectDiagnosticsTestGenerated.java | 6 ++++++ ...ModuleCollectDiagnosticsTestGenerated.java | 6 ++++++ .../unresolvedSuperConstructorCall.kt | 3 +++ .../unresolvedSuperConstructorCall.txt | 4 ++++ .../api/fir/file/structure/FileStructure.kt | 13 +++++++++--- .../testdata/getOrBuildFir/types/superType.kt | 4 ++++ .../getOrBuildFir/types/superType.txt | 21 +++++++++++++++++++ ...ContentRootGetOrBuildFirTestGenerated.java | 6 ++++++ .../fir/SourceGetOrBuildFirTestGenerated.java | 6 ++++++ 10 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/unresolvedSuperConstructorCall.kt create mode 100644 analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/unresolvedSuperConstructorCall.txt create mode 100644 analysis/low-level-api-fir/testdata/getOrBuildFir/types/superType.kt create mode 100644 analysis/low-level-api-fir/testdata/getOrBuildFir/types/superType.txt diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/diagnosticProvider/Fe10IdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/diagnosticProvider/Fe10IdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java index 08a09191704..2f8d6790d04 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/diagnosticProvider/Fe10IdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/diagnosticProvider/Fe10IdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java @@ -70,6 +70,12 @@ public class Fe10IdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated ex runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/unresolved.kt"); } + @Test + @TestMetadata("unresolvedSuperConstructorCall.kt") + public void testUnresolvedSuperConstructorCall() throws Exception { + runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/unresolvedSuperConstructorCall.kt"); + } + @Test @TestMetadata("unusedDestructuring.kt") public void testUnusedDestructuring() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/diagnosticProvider/FirIdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/diagnosticProvider/FirIdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java index 4121d388fd8..1f7891664b9 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/diagnosticProvider/FirIdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/diagnosticProvider/FirIdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java @@ -70,6 +70,12 @@ public class FirIdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated ext runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/unresolved.kt"); } + @Test + @TestMetadata("unresolvedSuperConstructorCall.kt") + public void testUnresolvedSuperConstructorCall() throws Exception { + runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/unresolvedSuperConstructorCall.kt"); + } + @Test @TestMetadata("unusedDestructuring.kt") public void testUnusedDestructuring() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/diagnosticProvider/FirStandaloneNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/diagnosticProvider/FirStandaloneNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java index 9752e0da976..98766f0fbeb 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/diagnosticProvider/FirStandaloneNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/diagnosticProvider/FirStandaloneNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java @@ -70,6 +70,12 @@ public class FirStandaloneNormalAnalysisSourceModuleCollectDiagnosticsTestGenera runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/unresolved.kt"); } + @Test + @TestMetadata("unresolvedSuperConstructorCall.kt") + public void testUnresolvedSuperConstructorCall() throws Exception { + runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/unresolvedSuperConstructorCall.kt"); + } + @Test @TestMetadata("unusedDestructuring.kt") public void testUnusedDestructuring() throws Exception { diff --git a/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/unresolvedSuperConstructorCall.kt b/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/unresolvedSuperConstructorCall.kt new file mode 100644 index 00000000000..607c0f7afbc --- /dev/null +++ b/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/unresolvedSuperConstructorCall.kt @@ -0,0 +1,3 @@ +package test + +class B(): A() \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/unresolvedSuperConstructorCall.txt b/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/unresolvedSuperConstructorCall.txt new file mode 100644 index 00000000000..ef9594bc529 --- /dev/null +++ b/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/unresolvedSuperConstructorCall.txt @@ -0,0 +1,4 @@ +Diagnostics from elements: + for PSI element of type KtNameReferenceExpression at (3,12-13) + UNRESOLVED_REFERENCE text ranges: [(25,26)] + PSI: KtNameReferenceExpression at (3,12-13) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructure.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructure.kt index ddacfc7fa23..0f94f07af18 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructure.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructure.kt @@ -89,7 +89,7 @@ internal class FileStructure private constructor( } val resultedContainer = when { - container is KtClassOrObject && container.isInsideSuperClassCall(element) -> { + container is KtClassOrObject && container.isPartOfSuperClassCall(element) -> { container.primaryConstructor } else -> null @@ -98,9 +98,16 @@ internal class FileStructure private constructor( return resultedContainer ?: container } - private fun KtClassOrObject.isInsideSuperClassCall(element: KtElement): Boolean { + private fun KtClassOrObject.isPartOfSuperClassCall(element: KtElement): Boolean { for (entry in superTypeListEntries) { - if (entry is KtSuperTypeCallEntry && entry.isAncestor(element, strict = false)) return true + if (entry !is KtSuperTypeCallEntry) continue + + // the structure element for `KtTypeReference` inside super class call is class declaration and not primary constructor + val typeReferenceIsAncestor = entry.calleeExpression.typeReference?.isAncestor(element, strict = false) == true + if (typeReferenceIsAncestor) return false + + // the structure element for `KtSuperTypeCallEntry` is primary constructor + if (entry.isAncestor(element, strict = false)) return true } return false diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/types/superType.kt b/analysis/low-level-api-fir/testdata/getOrBuildFir/types/superType.kt new file mode 100644 index 00000000000..fcbfa5eae0a --- /dev/null +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/types/superType.kt @@ -0,0 +1,4 @@ +// LOOK_UP_FOR_ELEMENT_OF_TYPE: org.jetbrains.kotlin.psi.KtTypeReference +open class A + +class B(): A() \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/types/superType.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/types/superType.txt new file mode 100644 index 00000000000..c732eec1f16 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/types/superType.txt @@ -0,0 +1,21 @@ +KT element: KtTypeReference +FIR element: FirResolvedTypeRefImpl +FIR source kind: KtRealSourceElementKind + +FIR element rendered: +R|A| + +FIR FILE: +FILE: [ResolvedTo(IMPORTS)] superType.kt + public open [ResolvedTo(STATUS)] class A : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=A] constructor(): R|A| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class B : R|A| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=B] constructor(): R|B| { + super() + } + + } \ No newline at end of file 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 2cff3baf06d..f516c620398 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 @@ -1087,6 +1087,12 @@ public class OutOfContentRootGetOrBuildFirTestGenerated extends AbstractOutOfCon runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/types/receiverType.kt"); } + @Test + @TestMetadata("superType.kt") + public void testSuperType() throws Exception { + runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/types/superType.kt"); + } + @Test @TestMetadata("typeArgument.kt") public void testTypeArgument() 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 7df419920f7..25426a2f21f 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 @@ -1087,6 +1087,12 @@ public class SourceGetOrBuildFirTestGenerated extends AbstractSourceGetOrBuildFi runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/types/receiverType.kt"); } + @Test + @TestMetadata("superType.kt") + public void testSuperType() throws Exception { + runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/types/superType.kt"); + } + @Test @TestMetadata("typeArgument.kt") public void testTypeArgument() throws Exception {