FIR: Remove FirCallableSymbol::overriddenSymbol

This commit is contained in:
Denis Zharkov
2020-11-05 13:40:30 +03:00
parent 78b374ec88
commit 7b48625b58
13 changed files with 66 additions and 57 deletions
@@ -84,7 +84,7 @@ class FakeOverrideGenerator(
declarationStorage::getCachedIrFunction,
declarationStorage::createIrFunction,
createFakeOverrideSymbol = { firFunction, callableSymbol ->
FirFakeOverrideGenerator.createFakeOverrideFunction(
FirFakeOverrideGenerator.createSubstitutionOverrideFunction(
session, firFunction, callableSymbol,
newDispatchReceiverType = klass.defaultType(),
derivedClassId = klass.symbol.classId,
@@ -108,7 +108,7 @@ class FakeOverrideGenerator(
declarationStorage::getCachedIrProperty,
declarationStorage::createIrProperty,
createFakeOverrideSymbol = { firProperty, callableSymbol ->
FirFakeOverrideGenerator.createFakeOverrideProperty(
FirFakeOverrideGenerator.createSubstitutionOverrideProperty(
session, firProperty, callableSymbol,
newDispatchReceiverType = klass.defaultType(),
derivedClassId = klass.symbol.classId,
@@ -133,7 +133,7 @@ private fun FirTypeAliasSymbol.findSAMConstructorForTypeAlias(
if (newReturnType == null && newParameterTypes.all { it == null }) return samConstructorForClass
return FirFakeOverrideGenerator.createFakeOverrideFunction(
return FirFakeOverrideGenerator.createSubstitutionOverrideFunction(
session, samConstructorForClass, namedSymbol,
newDispatchReceiverType = null,
newReceiverType = null,
@@ -29,15 +29,15 @@ class FirClassSubstitutionScope(
private val makeExpect: Boolean = false
) : FirTypeScope() {
private val fakeOverrideFunctions = mutableMapOf<FirFunctionSymbol<*>, FirFunctionSymbol<*>>()
private val fakeOverrideConstructors = mutableMapOf<FirConstructorSymbol, FirConstructorSymbol>()
private val fakeOverrideVariables = mutableMapOf<FirVariableSymbol<*>, FirVariableSymbol<*>>()
private val substitutionOverrideFunctions = mutableMapOf<FirFunctionSymbol<*>, FirFunctionSymbol<*>>()
private val substitutionOverrideConstructors = mutableMapOf<FirConstructorSymbol, FirConstructorSymbol>()
private val substitutionOverrideVariables = mutableMapOf<FirVariableSymbol<*>, FirVariableSymbol<*>>()
private val newOwnerClassId = dispatchReceiverTypeForSubstitutedMembers.lookupTag.classId
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) {
useSiteMemberScope.processFunctionsByName(name) process@{ original ->
val function = fakeOverrideFunctions.getOrPut(original) { createFakeOverrideFunction(original) }
val function = substitutionOverrideFunctions.getOrPut(original) { createSubstitutionOverrideFunction(original) }
processor(function)
}
@@ -49,7 +49,7 @@ class FirClassSubstitutionScope(
processor: (FirFunctionSymbol<*>, FirTypeScope) -> ProcessorAction
): ProcessorAction =
processDirectOverriddenWithBaseScope(
functionSymbol, processor, FirTypeScope::processDirectOverriddenFunctionsWithBaseScope, fakeOverrideFunctions
functionSymbol, processor, FirTypeScope::processDirectOverriddenFunctionsWithBaseScope, substitutionOverrideFunctions
)
private inline fun <reified D : FirCallableSymbol<*>> processDirectOverriddenWithBaseScope(
@@ -70,15 +70,15 @@ class FirClassSubstitutionScope(
return useSiteMemberScope.processPropertiesByName(name) process@{ original ->
when (original) {
is FirPropertySymbol -> {
val property = fakeOverrideVariables.getOrPut(original) { createFakeOverrideProperty(original) }
val property = substitutionOverrideVariables.getOrPut(original) { createSubstitutionOverrideProperty(original) }
processor(property)
}
is FirFieldSymbol -> {
val field = fakeOverrideVariables.getOrPut(original) { createFakeOverrideField(original) }
val field = substitutionOverrideVariables.getOrPut(original) { createSubstitutionOverrideField(original) }
processor(field)
}
is FirAccessorSymbol -> {
val accessor = fakeOverrideVariables.getOrPut(original) { createFakeOverrideAccessor(original) }
val accessor = substitutionOverrideVariables.getOrPut(original) { createSubstitutionOverrideAccessor(original) }
processor(accessor)
}
else -> {
@@ -94,7 +94,7 @@ class FirClassSubstitutionScope(
): ProcessorAction =
processDirectOverriddenWithBaseScope(
propertySymbol, processor, FirTypeScope::processDirectOverriddenPropertiesWithBaseScope,
fakeOverrideVariables
substitutionOverrideVariables
)
override fun processClassifiersByNameWithSubstitution(name: Name, processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit) {
@@ -111,7 +111,7 @@ class FirClassSubstitutionScope(
return substitutor.substituteOrNull(this)
}
private fun createFakeOverrideFunction(original: FirFunctionSymbol<*>): FirFunctionSymbol<*> {
private fun createSubstitutionOverrideFunction(original: FirFunctionSymbol<*>): FirFunctionSymbol<*> {
if (substitutor == ConeSubstitutor.Empty) return original
val member = when (original) {
is FirNamedFunctionSymbol -> original.fir
@@ -135,7 +135,7 @@ class FirClassSubstitutionScope(
* it's safe to cast newTypeParameters to List<FirTypeParameter>
*/
@Suppress("UNCHECKED_CAST")
return FirFakeOverrideGenerator.createFakeOverrideFunction(
return FirFakeOverrideGenerator.createSubstitutionOverrideFunction(
session,
member,
original,
@@ -150,7 +150,7 @@ class FirClassSubstitutionScope(
)
}
private fun createFakeOverrideConstructor(original: FirConstructorSymbol): FirConstructorSymbol {
private fun createSubstitutionOverrideConstructor(original: FirConstructorSymbol): FirConstructorSymbol {
if (substitutor == ConeSubstitutor.Empty) return original
val constructor = original.fir
@@ -162,14 +162,14 @@ class FirClassSubstitutionScope(
if (newReturnType == null && newParameterTypes.all { it == null } && newTypeParameters === constructor.typeParameters) {
return original
}
return FirFakeOverrideGenerator.createFakeOverrideConstructor(
FirConstructorSymbol(original.callableId, overriddenSymbol = original),
return FirFakeOverrideGenerator.createSubstitutionOverrideConstructor(
FirConstructorSymbol(original.callableId),
session, constructor, dispatchReceiverTypeForSubstitutedMembers,
newReturnType, newParameterTypes, newTypeParameters, makeExpect, fakeOverrideSubstitution
).symbol
}
private fun createFakeOverrideProperty(original: FirPropertySymbol): FirPropertySymbol {
private fun createSubstitutionOverrideProperty(original: FirPropertySymbol): FirPropertySymbol {
if (substitutor == ConeSubstitutor.Empty) return original
val member = original.fir
if (skipPrivateMembers && member.visibility == Visibilities.Private) return original
@@ -182,7 +182,7 @@ class FirClassSubstitutionScope(
}
@Suppress("UNCHECKED_CAST")
return FirFakeOverrideGenerator.createFakeOverrideProperty(
return FirFakeOverrideGenerator.createSubstitutionOverrideProperty(
session,
member,
original,
@@ -220,7 +220,7 @@ class FirClassSubstitutionScope(
return SubstitutedData(newTypeParameters, newReceiverType, newReturnType, substitutor, fakeOverrideSubstitution)
}
private fun createFakeOverrideField(original: FirFieldSymbol): FirFieldSymbol {
private fun createSubstitutionOverrideField(original: FirFieldSymbol): FirFieldSymbol {
if (substitutor == ConeSubstitutor.Empty) return original
val member = original.fir
if (skipPrivateMembers && member.visibility == Visibilities.Private) return original
@@ -229,10 +229,10 @@ class FirClassSubstitutionScope(
// TODO: do we have fields with implicit type?
val newReturnType = returnType?.substitute() ?: return original
return FirFakeOverrideGenerator.createFakeOverrideField(session, member, original, newReturnType, newOwnerClassId)
return FirFakeOverrideGenerator.createSubstitutionOverrideField(session, member, original, newReturnType, newOwnerClassId)
}
private fun createFakeOverrideAccessor(original: FirAccessorSymbol): FirAccessorSymbol {
private fun createSubstitutionOverrideAccessor(original: FirAccessorSymbol): FirAccessorSymbol {
if (substitutor == ConeSubstitutor.Empty) return original
val member = original.fir as FirSyntheticProperty
if (skipPrivateMembers && member.visibility == Visibilities.Private) return original
@@ -262,7 +262,7 @@ class FirClassSubstitutionScope(
override fun processDeclaredConstructors(processor: (FirConstructorSymbol) -> Unit) {
useSiteMemberScope.processDeclaredConstructors process@{ original ->
val constructor = fakeOverrideConstructors.getOrPut(original) { createFakeOverrideConstructor(original) }
val constructor = substitutionOverrideConstructors.getOrPut(original) { createSubstitutionOverrideConstructor(original) }
processor(constructor)
}
}
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.builder.*
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty
import org.jetbrains.kotlin.fir.originalForSubstitutionOverrideAttr
import org.jetbrains.kotlin.fir.resolve.substitution.ChainedSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
@@ -28,7 +29,7 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.utils.addToStdlib.runIf
object FirFakeOverrideGenerator {
fun createFakeOverrideFunction(
fun createSubstitutionOverrideFunction(
session: FirSession,
baseFunction: FirSimpleFunction,
baseSymbol: FirNamedFunctionSymbol,
@@ -42,17 +43,16 @@ object FirFakeOverrideGenerator {
fakeOverrideSubstitution: FakeOverrideSubstitution? = null
): FirNamedFunctionSymbol {
val symbol = FirNamedFunctionSymbol(
CallableId(derivedClassId ?: baseSymbol.callableId.classId!!, baseFunction.name),
overriddenSymbol = baseSymbol
CallableId(derivedClassId ?: baseSymbol.callableId.classId!!, baseFunction.name)
)
createFakeOverrideFunction(
createSubstitutionOverrideFunction(
symbol, session, baseFunction, newDispatchReceiverType, newReceiverType, newReturnType,
newParameterTypes, newTypeParameters, isExpect, fakeOverrideSubstitution
)
return symbol
}
private fun createFakeOverrideFunction(
private fun createSubstitutionOverrideFunction(
fakeOverrideSymbol: FirFunctionSymbol<FirSimpleFunction>,
session: FirSession,
baseFunction: FirSimpleFunction,
@@ -78,7 +78,9 @@ object FirFakeOverrideGenerator {
newReceiverType,
newReturnType,
fakeOverrideSubstitution = fakeOverrideSubstitution
)
).apply {
originalForSubstitutionOverrideAttr = baseFunction
}
}
fun createCopyForFirFunction(
@@ -113,7 +115,7 @@ object FirFakeOverrideGenerator {
}
}
fun createFakeOverrideConstructor(
fun createSubstitutionOverrideConstructor(
fakeOverrideSymbol: FirConstructorSymbol,
session: FirSession,
baseConstructor: FirConstructor,
@@ -142,6 +144,8 @@ object FirFakeOverrideGenerator {
resolvePhase = baseConstructor.resolvePhase
source = baseConstructor.source
attributes = baseConstructor.attributes.copy()
}.apply {
originalForSubstitutionOverrideAttr = baseConstructor
}
}
@@ -236,7 +240,7 @@ object FirFakeOverrideGenerator {
}
}
fun createFakeOverrideProperty(
fun createSubstitutionOverrideProperty(
session: FirSession,
baseProperty: FirProperty,
baseSymbol: FirPropertySymbol,
@@ -249,14 +253,15 @@ object FirFakeOverrideGenerator {
fakeOverrideSubstitution: FakeOverrideSubstitution? = null
): FirPropertySymbol {
val symbol = FirPropertySymbol(
CallableId(derivedClassId ?: baseSymbol.callableId.classId!!, baseProperty.name),
overriddenSymbol = baseSymbol
CallableId(derivedClassId ?: baseSymbol.callableId.classId!!, baseProperty.name)
)
createCopyForFirProperty(
symbol, baseProperty, session, FirDeclarationOrigin.SubstitutionOverride, isExpect,
newDispatchReceiverType, newTypeParameters, newReceiverType, newReturnType,
fakeOverrideSubstitution = fakeOverrideSubstitution
)
).apply {
originalForSubstitutionOverrideAttr = baseProperty
}
return symbol
}
@@ -372,7 +377,7 @@ object FirFakeOverrideGenerator {
receiverTypeRef = baseProperty.receiverTypeRef?.withReplacedConeType(newReceiverType)
}
fun createFakeOverrideField(
fun createSubstitutionOverrideField(
session: FirSession,
baseField: FirField,
baseSymbol: FirFieldSymbol,
@@ -397,6 +402,8 @@ object FirFakeOverrideGenerator {
annotations += baseField.annotations
attributes = baseField.attributes.copy()
dispatchReceiverType = baseField.dispatchReceiverType
}.apply {
originalForSubstitutionOverrideAttr = baseField
}
return symbol
}
@@ -411,7 +418,7 @@ object FirFakeOverrideGenerator {
fakeOverrideSubstitution: FakeOverrideSubstitution?
): FirAccessorSymbol {
val functionSymbol = FirNamedFunctionSymbol(baseSymbol.accessorId)
val function = createFakeOverrideFunction(
val function = createSubstitutionOverrideFunction(
functionSymbol,
session,
baseProperty.getter.delegate,
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull
import org.jetbrains.kotlin.fir.originalForIntersectionOverrideAttr
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.scopes.*
import org.jetbrains.kotlin.fir.symbols.CallableId
@@ -263,8 +264,7 @@ class FirTypeIntersectionScope private constructor(
CallableId(
dispatchReceiverType.classId ?: mostSpecific.dispatchReceiverClassOrNull()?.classId!!,
mostSpecific.fir.name
),
mostSpecific
)
)
val mostSpecificFunction = mostSpecific.fir
FirFakeOverrideGenerator.createCopyForFirFunction(
@@ -274,7 +274,9 @@ class FirTypeIntersectionScope private constructor(
newDispatchReceiverType = dispatchReceiverType,
newModality = newModality,
newVisibility = newVisibility,
)
).apply {
originalForIntersectionOverrideAttr = mostSpecific.fir
}
return newSymbol
}
@@ -283,14 +285,16 @@ class FirTypeIntersectionScope private constructor(
newModality: Modality,
newVisibility: Visibility,
): FirPropertySymbol {
val newSymbol = FirPropertySymbol(mostSpecific.callableId, mostSpecific)
val newSymbol = FirPropertySymbol(mostSpecific.callableId)
val mostSpecificProperty = mostSpecific.fir
FirFakeOverrideGenerator.createCopyForFirProperty(
newSymbol, mostSpecificProperty, mostSpecificProperty.session, FirDeclarationOrigin.IntersectionOverride,
newModality = newModality,
newVisibility = newVisibility,
newDispatchReceiverType = dispatchReceiverType,
)
).apply {
originalForIntersectionOverrideAttr = mostSpecific.fir
}
return newSymbol
}
@@ -34,13 +34,13 @@ val FirCallableDeclaration<*>.isIntersectionOverride get() = origin == FirDeclar
val FirCallableDeclaration<*>.isSubstitutionOverride get() = origin == FirDeclarationOrigin.SubstitutionOverride
inline val <reified D : FirCallableDeclaration<*>> D.originalForSubstitutionOverride: D?
get() = if (isSubstitutionOverride) symbol.overriddenSymbol?.fir as D? else null
get() = if (isSubstitutionOverride) originalForSubstitutionOverrideAttr else null
inline val <reified S : FirCallableSymbol<*>> S.originalForSubstitutionOverride: S?
get() = fir.originalForSubstitutionOverride?.symbol as S?
inline val <reified D : FirCallableDeclaration<*>> D.baseForIntersectionOverride: D?
get() = if (isIntersectionOverride) symbol.overriddenSymbol?.fir as D? else null
get() = if (isIntersectionOverride) originalForIntersectionOverrideAttr else null
inline val <reified S : FirCallableSymbol<*>> S.baseForIntersectionOverride: S?
get() = fir.baseForIntersectionOverride?.symbol as S?
@@ -61,3 +61,11 @@ inline fun <reified D : FirCallableDeclaration<*>> D.unwrapFakeOverrides(): D {
}
inline fun <reified S : FirCallableSymbol<*>> S.unwrapFakeOverrides(): S = fir.unwrapFakeOverrides().symbol as S
private object SubstitutedOverrideOriginalKey : FirDeclarationDataKey()
var <D : FirCallableDeclaration<*>>
D.originalForSubstitutionOverrideAttr: D? by FirDeclarationDataRegistry.data(SubstitutedOverrideOriginalKey)
private object IntersectionOverrideOriginalKey : FirDeclarationDataKey()
var <D : FirCallableDeclaration<*>>
D.originalForIntersectionOverrideAttr: D? by FirDeclarationDataRegistry.data(IntersectionOverrideOriginalKey)
@@ -8,6 +8,4 @@ package org.jetbrains.kotlin.fir.symbols
import org.jetbrains.kotlin.fir.FirSymbolOwner
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
interface PossiblyFirFakeOverrideSymbol<E, S : FirBasedSymbol<E>> : FirBasedSymbol<E> where E : FirSymbolOwner<E>, E : FirDeclaration {
val overriddenSymbol: S?
}
interface PossiblyFirFakeOverrideSymbol<E, S : FirBasedSymbol<E>> : FirBasedSymbol<E> where E : FirSymbolOwner<E>, E : FirDeclaration
@@ -14,9 +14,6 @@ import org.jetbrains.kotlin.fir.symbols.CallableId
abstract class FirCallableSymbol<D : FirCallableDeclaration<D>> : AbstractFirBasedSymbol<D>() {
abstract val callableId: CallableId
open val overriddenSymbol: FirCallableSymbol<D>?
get() = null
}
val FirCallableSymbol<*>.isStatic: Boolean get() = (fir as? FirMemberDeclaration)?.status?.isStatic == true
@@ -24,12 +24,10 @@ sealed class FirFunctionSymbol<D : FirFunction<D>>(
open class FirNamedFunctionSymbol(
callableId: CallableId,
override val overriddenSymbol: FirNamedFunctionSymbol? = null,
) : FirFunctionSymbol<FirSimpleFunction>(callableId), PossiblyFirFakeOverrideSymbol<FirSimpleFunction, FirNamedFunctionSymbol>
class FirConstructorSymbol(
callableId: CallableId,
override val overriddenSymbol: FirConstructorSymbol? = null
callableId: CallableId
) : FirFunctionSymbol<FirConstructor>(callableId)
open class FirAccessorSymbol(
@@ -23,7 +23,6 @@ open class FirVariableSymbol<D : FirVariable<D>>(override val callableId: Callab
open class FirPropertySymbol(
callableId: CallableId,
override val overriddenSymbol: FirPropertySymbol? = null,
) : FirVariableSymbol<FirProperty>(callableId), PossiblyFirFakeOverrideSymbol<FirProperty, FirPropertySymbol> {
// TODO: should we use this constructor for local variables?
constructor(name: Name) : this(CallableId(name))
@@ -1,6 +1,5 @@
// KOTLIN_CONFIGURATION_FLAGS: +JVM.EMIT_JVM_TYPE_ANNOTATIONS
// TARGET_BACKEND: JVM
// IGNORE_BACKEND_FIR: JVM_IR
// JVM_TARGET: 1.8
// FULL_JDK
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM
// FILE: Test.java
@@ -9,7 +9,7 @@ FILE fqName:<root> fileName:/smartCastOnFieldReceiverOfGenericType.kt
TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit
TYPE_OP type=kotlin.String origin=CAST typeOperand=kotlin.String
GET_VAR 'b: kotlin.Any declared in <root>.testSetField' type=kotlin.Any origin=null
SET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:value type:kotlin.String? visibility:public' type=kotlin.Unit origin=EQ
SET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:value type:T of <root>.JCell? visibility:public' type=kotlin.Unit origin=EQ
receiver: TYPE_OP type=<root>.JCell<kotlin.String> origin=IMPLICIT_CAST typeOperand=<root>.JCell<kotlin.String>
GET_VAR 'a: kotlin.Any declared in <root>.testSetField' type=kotlin.Any origin=null
value: TYPE_OP type=kotlin.String origin=IMPLICIT_CAST typeOperand=kotlin.String
@@ -21,6 +21,6 @@ FILE fqName:<root> fileName:/smartCastOnFieldReceiverOfGenericType.kt
TYPE_OP type=<root>.JCell<kotlin.String> origin=CAST typeOperand=<root>.JCell<kotlin.String>
GET_VAR 'a: kotlin.Any declared in <root>.testGetField' type=kotlin.Any origin=null
RETURN type=kotlin.Nothing from='public final fun testGetField (a: kotlin.Any): kotlin.String declared in <root>'
GET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:value type:kotlin.String? visibility:public' type=kotlin.String? origin=GET_PROPERTY
GET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:value type:T of <root>.JCell? visibility:public' type=kotlin.String? origin=GET_PROPERTY
receiver: TYPE_OP type=<root>.JCell<kotlin.String> origin=IMPLICIT_CAST typeOperand=<root>.JCell<kotlin.String>
GET_VAR 'a: kotlin.Any declared in <root>.testGetField' type=kotlin.Any origin=null