From 7fc19520a5443dadbeed7b8e82db680b7e058a3c Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 18 Oct 2021 19:21:02 +0300 Subject: [PATCH] FIR: substitute super type during tower building properly #KT-49301 Fixed --- ...nosisCompilerFirTestdataTestGenerated.java | 6 ++ .../intellij/baseIntrospector.fir.txt | 67 +++++++++++++++++++ .../intellij/baseIntrospector.kt | 39 +++++++++++ .../runners/FirDiagnosticTestGenerated.java | 6 ++ ...DiagnosticsWithLightTreeTestGenerated.java | 6 ++ .../fir/declarations/ImplicitReceiverUtils.kt | 2 +- 6 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/baseIntrospector.fir.txt create mode 100644 compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/baseIntrospector.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 c383aa21a98..7c72cdcab06 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 @@ -5063,6 +5063,12 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/arrayOfImports.kt"); } + @Test + @TestMetadata("baseIntrospector.kt") + public void testBaseIntrospector() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/baseIntrospector.kt"); + } + @Test @TestMetadata("DailyAggregatedDoubleFactor.kt") public void testDailyAggregatedDoubleFactor() throws Exception { diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/baseIntrospector.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/baseIntrospector.fir.txt new file mode 100644 index 00000000000..803d9ba7d7f --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/baseIntrospector.fir.txt @@ -0,0 +1,67 @@ +Module: m1 +FILE: m1.kt + package m1 + + public abstract interface BasicDatabase : R|kotlin/Any| { + } + public abstract interface BasicSchema : R|kotlin/Any| { + } + public abstract class BaseIntrospector : R|kotlin/Any| { + public constructor(): R|m1/BaseIntrospector| { + super() + } + + protected abstract fun createDatabaseRetriever(database: R|D|): R|m1/BaseIntrospector.AbstractDatabaseRetriever| + + protected abstract inner class AbstractDatabaseRetriever : R|m1/BaseIntrospector.AbstractRetriever| { + protected m1/BaseIntrospector.constructor(database: R|D|): R|m1/BaseIntrospector.AbstractDatabaseRetriever| { + this@R|m1/BaseIntrospector|.super|>() + } + + protected final val database: R|D| = R|/database| + protected get(): R|D| + + } + + protected abstract inner class AbstractRetriever : R|kotlin/Any| { + public m1/BaseIntrospector.constructor(): R|m1/BaseIntrospector.AbstractRetriever| { + super() + } + + } + + } + public abstract interface BasicSingleDatabase : R|m1/BasicDatabase| { + } + public abstract interface BasicModSchema : R|m1/BasicSchema| { + } + public abstract class BaseSingleDatabaseIntrospector : R|m1/BaseIntrospector| { + protected constructor(): R|m1/BaseSingleDatabaseIntrospector| { + super|>() + } + + } +Module: m2 +FILE: m2.kt + package m2 + + public abstract interface SqliteRoot : R|m1/BasicSingleDatabase| { + } + public abstract interface SqliteSchema : R|m1/BasicModSchema| { + } + public final class SqliteIntrospector : R|m1/BaseSingleDatabaseIntrospector| { + public constructor(): R|m2/SqliteIntrospector| { + super|>() + } + + protected final override fun createDatabaseRetriever(database: R|m2/SqliteRoot|): R|m1/BaseIntrospector.AbstractDatabaseRetriever| { + ^createDatabaseRetriever object : R|m1/BaseIntrospector.AbstractDatabaseRetriever| { + private constructor(): R|| { + this@R|m2/SqliteIntrospector|.super|>(R|/database|) + } + + } + + } + + } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/baseIntrospector.kt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/baseIntrospector.kt new file mode 100644 index 00000000000..ef9358549c6 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/baseIntrospector.kt @@ -0,0 +1,39 @@ +// MODULE: m1 +// FILE: m1.kt + +package m1 + +interface BasicDatabase +interface BasicSchema + +abstract class BaseIntrospector { + protected abstract fun createDatabaseRetriever(database: D): AbstractDatabaseRetriever + + protected abstract inner class AbstractDatabaseRetriever + protected constructor(protected val database: D) + : AbstractRetriever() + + protected abstract inner class AbstractRetriever +} + +interface BasicSingleDatabase : BasicDatabase +interface BasicModSchema : BasicSchema + +abstract class BaseSingleDatabaseIntrospector +protected constructor() : BaseIntrospector() + +// MODULE: m2(m1) +// FILE: m2.kt + +package m2 + +import m1.* + +interface SqliteRoot : BasicSingleDatabase +interface SqliteSchema : BasicModSchema + +class SqliteIntrospector : BaseSingleDatabaseIntrospector() { + override fun createDatabaseRetriever(database: SqliteRoot) = + object : AbstractDatabaseRetriever(database) { + } +} 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 427e4bf2a61..12d42e888ab 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 @@ -5063,6 +5063,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest { runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/arrayOfImports.kt"); } + @Test + @TestMetadata("baseIntrospector.kt") + public void testBaseIntrospector() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/baseIntrospector.kt"); + } + @Test @TestMetadata("DailyAggregatedDoubleFactor.kt") public void testDailyAggregatedDoubleFactor() 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 0480149d413..cd56c378ab9 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 @@ -5063,6 +5063,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/arrayOfImports.kt"); } + @Test + @TestMetadata("baseIntrospector.kt") + public void testBaseIntrospector() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/baseIntrospector.kt"); + } + @Test @TestMetadata("DailyAggregatedDoubleFactor.kt") public void testDailyAggregatedDoubleFactor() throws Exception { diff --git a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/declarations/ImplicitReceiverUtils.kt b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/declarations/ImplicitReceiverUtils.kt index a2611429fb7..270c2cbab11 100644 --- a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/declarations/ImplicitReceiverUtils.kt +++ b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/declarations/ImplicitReceiverUtils.kt @@ -63,7 +63,7 @@ fun SessionHolder.collectTowerDataElementsForClass(owner: FirClass, defaultType: allImplicitCompanionValues.addIfNotNull(companionReceiver) val superClassesStaticsAndCompanionReceivers = mutableListOf() - for (superType in lookupSuperTypes(owner, lookupInterfaces = false, deep = true, useSiteSession = session)) { + for (superType in lookupSuperTypes(owner, lookupInterfaces = false, deep = true, useSiteSession = session, substituteTypes = true)) { val expandedType = superType.fullyExpandedType(session) val superClass = expandedType.lookupTag.toSymbol(session)?.fir as? FirRegularClass ?: continue