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 {