From 6740cdabacb50fc42680926605b44816b04ceaaf Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 11 Mar 2019 18:38:53 +0300 Subject: [PATCH] Get rid of ConeAbbreviatedType::directExpansion It becomes necessary after extracting supertypes resolution into a separate phase. But also it looks reasonable because direct expansion actually depends on the module we are looking from. --- .../org/jetbrains/kotlin/fir/types/ConeTypes.kt | 2 -- .../org/jetbrains/kotlin/fir/types/impl/Impl.kt | 1 - .../fir/deserialization/FirTypeDeserializer.kt | 2 +- .../jetbrains/kotlin/fir/resolve/ResolveUtils.kt | 7 ++++++- .../FirAbstractTreeTransformerWithSuperTypes.kt | 16 +++++++++------- .../fir/scopes/impl/FirClassSubstitutionScope.kt | 1 - .../kotlin/fir/types/ConeTypeContext.kt | 4 +--- .../testData/resolve/NestedOfAliasedType.txt | 4 ++-- .../resolve/multifile/TypeAliasExpansion.txt | 4 ++-- .../resolve/testData/resolve/simpleTypeAlias.txt | 2 +- .../testData/resolve/typeAliasWithGeneric.txt | 2 +- .../src/org/jetbrains/kotlin/fir/FirRenderer.kt | 3 --- 12 files changed, 23 insertions(+), 25 deletions(-) diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypes.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypes.kt index 3b3520caf9b..f2479a4cf1c 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypes.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypes.kt @@ -104,8 +104,6 @@ abstract class ConeClassType : ConeClassLikeType() abstract class ConeAbbreviatedType : ConeClassLikeType() { abstract val abbreviationLookupTag: ConeClassLikeLookupTag - - abstract val directExpansion: ConeClassLikeType } abstract class ConeTypeParameterType : ConeLookupTagBasedType() { diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/impl/Impl.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/impl/Impl.kt index bd8177fc225..9039dc33e25 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/impl/Impl.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/impl/Impl.kt @@ -20,7 +20,6 @@ open class ConeClassTypeImpl( class ConeAbbreviatedTypeImpl( override val abbreviationLookupTag: ConeClassLikeLookupTag, override val typeArguments: Array, - override val directExpansion: ConeClassLikeType, isNullable: Boolean ) : ConeAbbreviatedType() { override val lookupTag: ConeClassLikeLookupTag diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt index 3cb0826620e..1aada507fc9 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt @@ -98,7 +98,7 @@ class FirTypeDeserializer( val abbreviatedTypeProto = proto.abbreviatedType(typeTable) ?: return simpleType - return ConeAbbreviatedTypeImpl(typeSymbol(abbreviatedTypeProto) as ConeClassLikeLookupTag, arguments, simpleType, isNullable = false) + return ConeAbbreviatedTypeImpl(typeSymbol(abbreviatedTypeProto) as ConeClassLikeLookupTag, arguments, isNullable = false) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt index 79f9551fa41..cf2b0cdbadb 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.types.impl.ConeAbbreviatedTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl import org.jetbrains.kotlin.types.Variance +import org.jetbrains.kotlin.utils.addToStdlib.safeAs inline fun MutableMap.getOrPut(key: K, defaultValue: (K) -> VA, postCompute: (VA) -> Unit): V { val value = get(key) @@ -31,6 +32,11 @@ inline fun MutableMap.getOrPut(key: K, defaultValue: (K) -> fun ConeClassLikeLookupTag.toSymbol(useSiteSession: FirSession): ConeClassifierSymbol? = useSiteSession.getService(FirSymbolProvider::class).getSymbolByLookupTag(this) +fun ConeAbbreviatedType.directExpansionType(useSiteSession: FirSession): ConeClassLikeType? = + abbreviationLookupTag + .toSymbol(useSiteSession) + ?.safeAs()?.fir?.expandedConeType + fun ConeClassifierLookupTag.toSymbol(useSiteSession: FirSession): ConeClassifierSymbol? = when (this) { is ConeClassLikeLookupTag -> toSymbol(useSiteSession) @@ -51,7 +57,6 @@ fun ConeClassifierSymbol.constructType(typeArguments: Array directExpansion.takeIf { it !is ConeClassErrorType }?.computePartialExpansion() - else -> return this + is ConeAbbreviatedType -> directExpansionType(useSiteSession)?.computePartialExpansion(useSiteSession) + else -> this } } @@ -62,7 +64,7 @@ abstract class FirAbstractTreeTransformerWithSuperTypes(reversedScopePriority: B is FirClassSymbol -> { val superClassType = fir.superConeTypes - .map { it.computePartialExpansion() } + .map { it.computePartialExpansion(useSiteSession) } .firstOrNull { it !is ConeClassErrorType && (it?.lookupTag?.toSymbol(useSiteSession) as? FirClassSymbol)?.fir?.classKind == ClassKind.CLASS @@ -71,7 +73,7 @@ abstract class FirAbstractTreeTransformerWithSuperTypes(reversedScopePriority: B superClassType.lookupTag.toSymbol(useSiteSession)?.collectSuperClasses(list, useSiteSession) } is FirTypeAliasSymbol -> { - val expansion = fir.expandedConeType?.computePartialExpansion() ?: return + val expansion = fir.expandedConeType?.computePartialExpansion(useSiteSession) ?: return expansion.lookupTag.toSymbol(useSiteSession)?.collectSuperClasses(list, useSiteSession) } else -> error("?!id:1") @@ -86,7 +88,7 @@ abstract class FirAbstractTreeTransformerWithSuperTypes(reversedScopePriority: B when (this) { is FirClassSymbol -> { val superClassTypes = - fir.superConeTypes.mapNotNull { it.computePartialExpansion() } + fir.superConeTypes.mapNotNull { it.computePartialExpansion(useSiteSession) } list += superClassTypes if (deep) superClassTypes.forEach { @@ -96,7 +98,7 @@ abstract class FirAbstractTreeTransformerWithSuperTypes(reversedScopePriority: B } } is FirTypeAliasSymbol -> { - val expansion = fir.expandedConeType?.computePartialExpansion() ?: return + val expansion = fir.expandedConeType?.computePartialExpansion(useSiteSession) ?: return expansion.lookupTag.toSymbol(useSiteSession)?.collectSuperTypes(list, deep, useSiteSession) } else -> error("?!id:1") diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt index a02186cdd0f..f1564cafc9d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt @@ -71,7 +71,6 @@ class FirClassSubstitutionScope( is ConeAbbreviatedTypeImpl -> ConeAbbreviatedTypeImpl( abbreviationLookupTag, newArguments as Array, - directExpansion.substitute() as? ConeClassLikeType ?: directExpansion, nullability.isNullable ) is ConeFunctionType -> TODO("Substitute function type properly") diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt index 72e30487853..f8cc6388e4f 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.expandedConeType import org.jetbrains.kotlin.fir.declarations.superConeTypes import org.jetbrains.kotlin.fir.resolve.toSymbol -import org.jetbrains.kotlin.fir.service import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol import org.jetbrains.kotlin.fir.symbols.ConeClassSymbol import org.jetbrains.kotlin.fir.symbols.ConeSymbol @@ -93,7 +92,6 @@ interface ConeTypeContext : TypeSystemContext, TypeSystemOptimizationContext { is ConeAbbreviatedType -> ConeAbbreviatedTypeImpl( lookupTag, typeArguments, - directExpansion, nullable ) is ConeFunctionType -> ConeFunctionTypeImpl( @@ -267,4 +265,4 @@ interface ConeTypeContext : TypeSystemContext, TypeSystemOptimizationContext { override fun SimpleTypeMarker.isSingleClassifierType(): Boolean { TODO("not implemented") } -} \ No newline at end of file +} diff --git a/compiler/fir/resolve/testData/resolve/NestedOfAliasedType.txt b/compiler/fir/resolve/testData/resolve/NestedOfAliasedType.txt index eb24b3b87d3..9003e59001f 100644 --- a/compiler/fir/resolve/testData/resolve/NestedOfAliasedType.txt +++ b/compiler/fir/resolve/testData/resolve/NestedOfAliasedType.txt @@ -9,8 +9,8 @@ FILE: NestedOfAliasedType.kt } public final typealias TA = R|A| - public final class B : R|TA = A| { - public constructor(): super() + public final class B : R|TA| { + public constructor(): super() public final class NestedInB : R|A.Nested| { public constructor(): super() diff --git a/compiler/fir/resolve/testData/resolve/multifile/TypeAliasExpansion.txt b/compiler/fir/resolve/testData/resolve/multifile/TypeAliasExpansion.txt index 9490d6d4f41..26a8e0d2e06 100644 --- a/compiler/fir/resolve/testData/resolve/multifile/TypeAliasExpansion.txt +++ b/compiler/fir/resolve/testData/resolve/multifile/TypeAliasExpansion.txt @@ -1,5 +1,5 @@ FILE: TypeAliasExpansion.kt - public final class MyClass : R|b/TA = b/A| { - public constructor(): super() + public final class MyClass : R|b/TA| { + public constructor(): super() } diff --git a/compiler/fir/resolve/testData/resolve/simpleTypeAlias.txt b/compiler/fir/resolve/testData/resolve/simpleTypeAlias.txt index 79f58e1a21f..2c5b03aef1a 100644 --- a/compiler/fir/resolve/testData/resolve/simpleTypeAlias.txt +++ b/compiler/fir/resolve/testData/resolve/simpleTypeAlias.txt @@ -2,7 +2,7 @@ FILE: simpleTypeAlias.kt public abstract interface B { } public final typealias C = R|B| - public final class D : R|C = B| { + public final class D : R|C| { public constructor(): super() } diff --git a/compiler/fir/resolve/testData/resolve/typeAliasWithGeneric.txt b/compiler/fir/resolve/testData/resolve/typeAliasWithGeneric.txt index b2df61cf9d8..f6bbf53d801 100644 --- a/compiler/fir/resolve/testData/resolve/typeAliasWithGeneric.txt +++ b/compiler/fir/resolve/testData/resolve/typeAliasWithGeneric.txt @@ -5,7 +5,7 @@ FILE: typeAliasWithGeneric.kt } public abstract interface B { } - public final class D : R|C = B| { + public final class D : R|C| { public constructor(): super() } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index f34e7a7d06b..c8c4131fe28 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -636,9 +636,6 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { } }) } - if (this is ConeAbbreviatedType) { - sb.append(" = ${this.directExpansion.asString()}") - } sb.toString() } is ConeTypeParameterType -> {