From 32337c82558b1299bf975501896647252e007573 Mon Sep 17 00:00:00 2001 From: Marco Pennekamp Date: Wed, 13 Mar 2024 18:04:05 +0100 Subject: [PATCH] [AA] Render types in sealed inheritors tests as fully expanded types - This avoids discrepancies between Standalone and IDE mode for sealed inheritor tests with type aliases from libraries, because in Standalone mode, libraries are deserialized with fully expanded types, while in IDE mode, libraries are deserialized from stubs, where type aliases are currently not expanded. ^KT-66013 --- .../AbstractSealedInheritorsTest.kt | 28 ++++++++++++++++++- .../sealedClassTypeAliasedFromDependency.txt | 4 +-- .../sealedClassTypeAliasedSameModule.txt | 4 +-- ...aledInterfaceTypeAliasedFromDependency.txt | 4 +-- .../sealedInterfaceTypeAliasedSameModule.txt | 4 +-- 5 files changed, 35 insertions(+), 9 deletions(-) diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/inheritorsProvider/AbstractSealedInheritorsTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/inheritorsProvider/AbstractSealedInheritorsTest.kt index 7b8e9bd57be..1d70b3ec32f 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/inheritorsProvider/AbstractSealedInheritorsTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/inheritorsProvider/AbstractSealedInheritorsTest.kt @@ -6,6 +6,9 @@ package org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.inheritorsProvider import org.jetbrains.kotlin.analysis.api.impl.base.test.SymbolByFqName +import org.jetbrains.kotlin.analysis.api.renderer.declarations.impl.KtDeclarationRendererForSource +import org.jetbrains.kotlin.analysis.api.renderer.types.impl.KtTypeRendererForSource +import org.jetbrains.kotlin.analysis.api.renderer.types.renderers.KtUsualClassTypeRenderer import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiBasedTest import org.jetbrains.kotlin.psi.KtFile @@ -21,7 +24,30 @@ abstract class AbstractSealedInheritorsTest : AbstractAnalysisApiBasedTest() { ?: error("Expected a single named class to be specified.") classSymbol.getSealedClassInheritors().joinToString("\n\n") { inheritor -> - "${inheritor.classIdIfNonLocal!!}\n${inheritor.render()}" + // Render sealed inheritor supertypes as fully expanded types to avoid discrepancies between Standalone and IDE mode. + // + // Assume the following code is compiled to a library: + // + // ``` + // open class C + // typealias T = C + // class A : T() + // ``` + // + // The supertype of `A` will be different in Standalone and IDE mode: + // + // - Standalone: The compiled library contains fully expanded types, so `A`'s supertype is `C`. + // - IDE: Symbols from libraries are deserialized from stubs, where type aliases are currently not fully expanded, so + // `A`'s supertype is `T`. + // + // We want to render `class A : C()` in both cases, so we need to expand the type alias. + val declarationRenderer = KtDeclarationRendererForSource.WITH_QUALIFIED_NAMES.with { + typeRenderer = KtTypeRendererForSource.WITH_QUALIFIED_NAMES.with { + usualClassTypeRenderer = KtUsualClassTypeRenderer.AS_FULLY_EXPANDED_CLASS_TYPE_WITH_TYPE_ARGUMENTS + } + } + + "${inheritor.classIdIfNonLocal!!}\n${inheritor.render(declarationRenderer)}" } } diff --git a/analysis/analysis-api/testData/components/inheritorsProvider/sealedInheritors/sealedClassTypeAliasedFromDependency.txt b/analysis/analysis-api/testData/components/inheritorsProvider/sealedInheritors/sealedClassTypeAliasedFromDependency.txt index 16828a2798d..8d8200839c3 100644 --- a/analysis/analysis-api/testData/components/inheritorsProvider/sealedInheritors/sealedClassTypeAliasedFromDependency.txt +++ b/analysis/analysis-api/testData/components/inheritorsProvider/sealedInheritors/sealedClassTypeAliasedFromDependency.txt @@ -2,7 +2,7 @@ foo/bar/OneSealedChild class OneSealedChild : foo.bar.MySealedClass() foo/bar/ThreeSealedChild -class ThreeSealedChild : foo.bar.T2() +class ThreeSealedChild : foo.bar.MySealedClass() foo/bar/TwoSealedChild -class TwoSealedChild : foo.bar.T1() +class TwoSealedChild : foo.bar.MySealedClass() diff --git a/analysis/analysis-api/testData/components/inheritorsProvider/sealedInheritors/sealedClassTypeAliasedSameModule.txt b/analysis/analysis-api/testData/components/inheritorsProvider/sealedInheritors/sealedClassTypeAliasedSameModule.txt index 16828a2798d..8d8200839c3 100644 --- a/analysis/analysis-api/testData/components/inheritorsProvider/sealedInheritors/sealedClassTypeAliasedSameModule.txt +++ b/analysis/analysis-api/testData/components/inheritorsProvider/sealedInheritors/sealedClassTypeAliasedSameModule.txt @@ -2,7 +2,7 @@ foo/bar/OneSealedChild class OneSealedChild : foo.bar.MySealedClass() foo/bar/ThreeSealedChild -class ThreeSealedChild : foo.bar.T2() +class ThreeSealedChild : foo.bar.MySealedClass() foo/bar/TwoSealedChild -class TwoSealedChild : foo.bar.T1() +class TwoSealedChild : foo.bar.MySealedClass() diff --git a/analysis/analysis-api/testData/components/inheritorsProvider/sealedInheritors/sealedInterfaceTypeAliasedFromDependency.txt b/analysis/analysis-api/testData/components/inheritorsProvider/sealedInheritors/sealedInterfaceTypeAliasedFromDependency.txt index 9b01fbc099d..3458ee1d46e 100644 --- a/analysis/analysis-api/testData/components/inheritorsProvider/sealedInheritors/sealedInterfaceTypeAliasedFromDependency.txt +++ b/analysis/analysis-api/testData/components/inheritorsProvider/sealedInheritors/sealedInterfaceTypeAliasedFromDependency.txt @@ -2,7 +2,7 @@ foo/bar/OneSealedChild class OneSealedChild : foo.bar.MySealedInterface foo/bar/ThreeSealedChild -class ThreeSealedChild : foo.bar.T2 +class ThreeSealedChild : foo.bar.MySealedInterface foo/bar/TwoSealedChild -class TwoSealedChild : foo.bar.T1 +class TwoSealedChild : foo.bar.MySealedInterface diff --git a/analysis/analysis-api/testData/components/inheritorsProvider/sealedInheritors/sealedInterfaceTypeAliasedSameModule.txt b/analysis/analysis-api/testData/components/inheritorsProvider/sealedInheritors/sealedInterfaceTypeAliasedSameModule.txt index 9b01fbc099d..3458ee1d46e 100644 --- a/analysis/analysis-api/testData/components/inheritorsProvider/sealedInheritors/sealedInterfaceTypeAliasedSameModule.txt +++ b/analysis/analysis-api/testData/components/inheritorsProvider/sealedInheritors/sealedInterfaceTypeAliasedSameModule.txt @@ -2,7 +2,7 @@ foo/bar/OneSealedChild class OneSealedChild : foo.bar.MySealedInterface foo/bar/ThreeSealedChild -class ThreeSealedChild : foo.bar.T2 +class ThreeSealedChild : foo.bar.MySealedInterface foo/bar/TwoSealedChild -class TwoSealedChild : foo.bar.T1 +class TwoSealedChild : foo.bar.MySealedInterface