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