From 75a29434bd87a97f97d77a4d2d3cbc2eee718b0f Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 28 Sep 2022 15:22:44 +0200 Subject: [PATCH] K2: add reproducer of KT-54212 --- ...nosisCompilerFirTestdataTestGenerated.java | 6 + .../problems/AbstractToolConfig.fir.txt | 118 ++++++++++++++++++ .../problems/AbstractToolConfig.kt | 68 ++++++++++ .../runners/FirDiagnosticTestGenerated.java | 6 + ...DiagnosticsWithLightTreeTestGenerated.java | 6 + 5 files changed, 204 insertions(+) create mode 100644 compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/AbstractToolConfig.fir.txt create mode 100644 compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/AbstractToolConfig.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 55d09dc5e2e..a8100adbcd4 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 @@ -6002,6 +6002,12 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis @TestMetadata("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems") @TestDataPath("$PROJECT_ROOT") public class Problems { + @Test + @TestMetadata("AbstractToolConfig.kt") + public void testAbstractToolConfig() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/AbstractToolConfig.kt"); + } + @Test public void testAllFilesPresentInProblems() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems"), Pattern.compile("^([^.]+)\\.kt$"), null, true); diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/AbstractToolConfig.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/AbstractToolConfig.fir.txt new file mode 100644 index 00000000000..bd9f336c3e0 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/AbstractToolConfig.fir.txt @@ -0,0 +1,118 @@ +FILE: AbstractToolConfig.kt + public abstract class AbstractToolConfig : R|kotlin/Any| { + public constructor(): R|AbstractToolConfig| { + super() + } + + private final val platformManager: R|PlatformManager| = this@R|/AbstractToolConfig|.R|/AbstractToolConfig.platformManager|() + private get(): R|PlatformManager| + + private final val targetManager: R|TargetManager| = this@R|/AbstractToolConfig|.R|/AbstractToolConfig.platformManager|.R|/PlatformManager.targetManager|() + private get(): R|TargetManager| + + public final val target: R|KonanTarget| = this@R|/AbstractToolConfig|.R|/AbstractToolConfig.targetManager|.R|/TargetManager.target| + public get(): R|KonanTarget| + + protected final val platform: R|Platform| = this@R|/AbstractToolConfig|.R|/AbstractToolConfig.platformManager|.R|/PlatformManager.platform|(this@R|/AbstractToolConfig|.R|/AbstractToolConfig.target|) + protected get(): R|Platform| + + public final val llvmHome: R|ERROR CLASS: Cannot calculate return type (local class/object?)| = this@R|/AbstractToolConfig|.R|/AbstractToolConfig.platform|.R|/Configurables.absoluteLlvmHome| + public get(): R|ERROR CLASS: Cannot calculate return type (local class/object?)| + + public abstract fun platformManager(): R|PlatformManager| + + } +FILE: Platform.kt + public final class Platform : R|Configurables| { + public constructor(configurables: R|Configurables|): R|Platform| { + super() + } + + local final field <$$delegate_0>: R|Configurables| = R|/configurables| + + public final val configurables: R|Configurables| = R|/configurables| + public get(): R|Configurables| + + } + public abstract class PlatformManager : R|HostManager| { + public constructor(): R|PlatformManager| { + super() + } + + private final val loaders: R|kotlin/collections/Map| = this@R|/PlatformManager|.R|/HostManager.enabled|.R|kotlin/collections/map||>( = map@fun (it: R|KonanTarget|): R|kotlin/Pair| { + ^ R|/it|.R|kotlin/to|(this@R|/PlatformManager|.R|/PlatformManager.loadConfigurables|(R|/it|)) + } + ).R|kotlin/collections/toMap|() + private get(): R|kotlin/collections/Map| + + private final val platforms: R|kotlin/collections/Map| = this@R|/PlatformManager|.R|/PlatformManager.loaders|.R|kotlin/collections/map||>( = map@fun (it: R|kotlin/collections/Map.Entry|): R|kotlin/Pair| { + ^ R|/it|.R|SubstitutionOverride|.R|kotlin/to|(R|/Platform.Platform|(R|/it|.R|SubstitutionOverride|)) + } + ).R|kotlin/collections/toMap|() + private get(): R|kotlin/collections/Map| + + public abstract fun targetManager(userRequest: R|kotlin/String?| = Null(null)): R|TargetManager| + + public final fun platform(target: R|KonanTarget|): R|Platform| { + ^platform this@R|/PlatformManager|.R|/PlatformManager.platforms|.R|kotlin/collections/getValue|(R|/target|) + } + + public abstract fun loadConfigurables(target: R|KonanTarget|): R|Configurables| + + } +FILE: HostManager.kt + public open class HostManager : R|kotlin/Any| { + public constructor(): R|HostManager| { + super() + } + + public final val enabled: R|kotlin/collections/List| + public get(): R|kotlin/collections/List| { + ^ R|kotlin/collections/emptyList|() + } + + } +FILE: Configurables.kt + public abstract interface Configurables : R|kotlin/Any| { + public open val llvmHome: R|kotlin/String?| + public get(): R|kotlin/String?| { + ^ this@R|/Configurables|.R|/Configurables.hostString|(String(llvmHome)) + } + + public open val absoluteLlvmHome: R|kotlin/String| + public get(): R|kotlin/String| { + ^ this@R|/Configurables|.R|/Configurables.absolute|(this@R|/Configurables|.R|/Configurables.llvmHome|) + } + + public abstract fun absolute(value: R|kotlin/String?|): R|kotlin/String| + + public abstract fun hostString(key: R|kotlin/String|): R|kotlin/String?| + + } +FILE: KonanTarget.kt + public sealed class KonanTarget : R|kotlin/Any| { + protected constructor(): R|KonanTarget| { + super() + } + + public final object ANDROID : R|KonanTarget| { + private constructor(): R|KonanTarget.ANDROID| { + super() + } + + } + + public final object IOS : R|KonanTarget| { + private constructor(): R|KonanTarget.IOS| { + super() + } + + } + + } +FILE: TargetManager.kt + public abstract interface TargetManager : R|kotlin/Any| { + public abstract val target: R|KonanTarget| + public get(): R|KonanTarget| + + } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/AbstractToolConfig.kt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/AbstractToolConfig.kt new file mode 100644 index 00000000000..5df2feb67fb --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/AbstractToolConfig.kt @@ -0,0 +1,68 @@ +// FILE: AbstractToolConfig.kt + +abstract class AbstractToolConfig { + private val platformManager = platformManager() + private val targetManager = platformManager.targetManager() + val target = targetManager.target + + protected val platform = platformManager.platform(target) + + val llvmHome = platform.absoluteLlvmHome + + abstract fun platformManager(): PlatformManager +} + +// FILE: Platform.kt + +class Platform(val configurables: Configurables) : Configurables by configurables + +abstract class PlatformManager : HostManager() { + private val loaders = enabled.map { + it to loadConfigurables(it) + }.toMap() + + private val platforms = loaders.map { + it.key to Platform(it.value) + }.toMap() + + abstract fun targetManager(userRequest: String? = null): TargetManager + fun platform(target: KonanTarget) = platforms.getValue(target) + + abstract fun loadConfigurables(target: KonanTarget): Configurables +} + +// FILE: HostManager.kt + +open class HostManager { + val enabled: List + get() = emptyList() +} + +// FILE: Configurables.kt + +interface Configurables { + + val llvmHome get() = hostString("llvmHome") + + val absoluteLlvmHome get() = absolute(llvmHome) + + fun absolute(value: String?): String + + fun hostString(key: String): String? +} + +// FILE: KonanTarget.kt + +sealed class KonanTarget { + object ANDROID : KonanTarget() + + object IOS : KonanTarget() +} + +// FILE: TargetManager.kt + +interface TargetManager { + val target: KonanTarget +} + + 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 7e3b5ae0b84..41cf20aa31b 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 @@ -6002,6 +6002,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest { @TestMetadata("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems") @TestDataPath("$PROJECT_ROOT") public class Problems { + @Test + @TestMetadata("AbstractToolConfig.kt") + public void testAbstractToolConfig() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/AbstractToolConfig.kt"); + } + @Test public void testAllFilesPresentInProblems() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems"), Pattern.compile("^([^.]+)\\.kt$"), null, true); 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 b9752132a10..651c979a372 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 @@ -6002,6 +6002,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos @TestMetadata("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems") @TestDataPath("$PROJECT_ROOT") public class Problems { + @Test + @TestMetadata("AbstractToolConfig.kt") + public void testAbstractToolConfig() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/AbstractToolConfig.kt"); + } + @Test public void testAllFilesPresentInProblems() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems"), Pattern.compile("^([^.]+)\\.kt$"), null, true);