FIR: Use attribute instead of overriddenSymbol for synthetic type alias constructor

This commit is contained in:
Denis Zharkov
2020-10-30 12:37:04 +03:00
parent 4282e27d73
commit 8a949b0dcf
2 changed files with 12 additions and 2 deletions
@@ -225,6 +225,11 @@ internal tailrec fun FirCallableSymbol<*>.unwrapSubstitutionAndIntersectionOverr
}
internal tailrec fun FirCallableSymbol<*>.unwrapCallRepresentative(root: FirCallableSymbol<*> = this): FirCallableSymbol<*> {
val fir = fir
if (fir is FirConstructor) {
val originalForTypeAlias = fir.originalConstructorIfTypeAlias
if (originalForTypeAlias != null) return originalForTypeAlias.symbol.unwrapCallRepresentative(this)
}
if (fir.isIntersectionOverride) return this
val overriddenSymbol = fir.originalForSubstitutionOverride?.takeIf {
@@ -232,7 +232,7 @@ private fun prepareSubstitutingScopeForTypeAliasConstructors(
typeAliasSymbol: FirTypeAliasSymbol,
session: FirSession,
delegatingScope: FirScope
): FirScope? {
): FirScope {
val copyFactory2: ConstructorCopyFactory<FirConstructor> = factory@{ newReturnType, newParameterTypes, newTypeParameters ->
buildConstructor {
source = this@factory.source
@@ -329,7 +329,9 @@ private fun prepareCopyConstructorForTypealiasNestedClass(
val extCopy = buildConstructorCopy(originalSymbol.fir) {
origin = FirDeclarationOrigin.Synthetic
receiverTypeRef = innerTypeRef.withReplacedConeType(outerType)
symbol = FirConstructorSymbol(originalSymbol.callableId, overriddenSymbol = originalSymbol)
symbol = FirConstructorSymbol(originalSymbol.callableId)
}.apply {
originalConstructorIfTypeAlias = originalSymbol.fir
}
return extCopy.symbol
}
@@ -337,3 +339,6 @@ private fun prepareCopyConstructorForTypealiasNestedClass(
}
return null
}
private object TypeAliasConstructorKey : FirDeclarationDataKey()
var FirConstructor.originalConstructorIfTypeAlias: FirConstructor? by FirDeclarationDataRegistry.data(TypeAliasConstructorKey)