FIR: introduce synthetic property symbol hierarchy
This commit is contained in:
committed by
TeamCityServer
parent
c673c4cc91
commit
79b98f9173
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isStatic
|
||||
import org.jetbrains.kotlin.fir.scopes.*
|
||||
import org.jetbrains.kotlin.fir.symbols.SyntheticSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAccessorSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
@@ -27,10 +27,18 @@ import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.name.StandardClassIds
|
||||
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||
|
||||
class FirSyntheticPropertySymbol(
|
||||
/**
|
||||
* This symbol is bound to a synthetic property based on Java getter/setter call
|
||||
*
|
||||
* See details about such properties here: https://kotlinlang.org/docs/java-interop.html#getters-and-setters).
|
||||
* Frontend IR creates this kind of symbol each time when x.foo should be resolved to x.getFoo() or x.setFoo().
|
||||
*/
|
||||
class FirSimpleSyntheticPropertySymbol(
|
||||
propertyId: CallableId,
|
||||
getterId: CallableId
|
||||
) : FirAccessorSymbol(propertyId, getterId), SyntheticSymbol
|
||||
) : FirSyntheticPropertySymbol(propertyId, getterId), SyntheticSymbol {
|
||||
override fun copy(): FirSyntheticPropertySymbol = FirSimpleSyntheticPropertySymbol(callableId, getterId)
|
||||
}
|
||||
|
||||
class FirSyntheticFunctionSymbol(
|
||||
callableId: CallableId
|
||||
@@ -113,7 +121,7 @@ class FirSyntheticPropertiesScope(
|
||||
val property = buildSyntheticProperty {
|
||||
moduleData = session.moduleData
|
||||
name = propertyName
|
||||
symbol = FirSyntheticPropertySymbol(
|
||||
symbol = FirSimpleSyntheticPropertySymbol(
|
||||
getterId = getterSymbol.callableId,
|
||||
propertyId = CallableId(packageName, className, propertyName)
|
||||
)
|
||||
|
||||
+4
-4
@@ -43,7 +43,7 @@ class FirClassSubstitutionScope(
|
||||
get() = when (this) {
|
||||
is FirPropertySymbol,
|
||||
is FirFieldSymbol,
|
||||
is FirAccessorSymbol -> true
|
||||
is FirSyntheticPropertySymbol -> true
|
||||
else -> false
|
||||
}
|
||||
}
|
||||
@@ -294,7 +294,7 @@ class FirClassSubstitutionScope(
|
||||
return FirFakeOverrideGenerator.createSubstitutionOverrideField(session, member, original, newReturnType, newOwnerClassId)
|
||||
}
|
||||
|
||||
fun createSubstitutionOverrideAccessor(original: FirAccessorSymbol): FirAccessorSymbol {
|
||||
fun createSubstitutionOverrideSyntheticProperty(original: FirSyntheticPropertySymbol): FirSyntheticPropertySymbol {
|
||||
if (substitutor == ConeSubstitutor.Empty) return original
|
||||
val member = original.fir as FirSyntheticProperty
|
||||
if (skipPrivateMembers && member.visibility == Visibilities.Private) return original
|
||||
@@ -319,7 +319,7 @@ class FirClassSubstitutionScope(
|
||||
return original
|
||||
}
|
||||
|
||||
return FirFakeOverrideGenerator.createSubstitutionOverrideAccessor(
|
||||
return FirFakeOverrideGenerator.createSubstitutionOverrideSyntheticProperty(
|
||||
session,
|
||||
member,
|
||||
original,
|
||||
@@ -363,7 +363,7 @@ class FirSubstitutionOverrideStorage(val session: FirSession) : FirSessionCompon
|
||||
when (original) {
|
||||
is FirPropertySymbol -> scope.createSubstitutionOverrideProperty(original)
|
||||
is FirFieldSymbol -> scope.createSubstitutionOverrideField(original)
|
||||
is FirAccessorSymbol -> scope.createSubstitutionOverrideAccessor(original)
|
||||
is FirSyntheticPropertySymbol -> scope.createSubstitutionOverrideSyntheticProperty(original)
|
||||
else -> error("symbol $original is not overridable")
|
||||
}
|
||||
}
|
||||
|
||||
+4
-4
@@ -425,16 +425,16 @@ object FirFakeOverrideGenerator {
|
||||
return symbol
|
||||
}
|
||||
|
||||
fun createSubstitutionOverrideAccessor(
|
||||
fun createSubstitutionOverrideSyntheticProperty(
|
||||
session: FirSession,
|
||||
baseProperty: FirSyntheticProperty,
|
||||
baseSymbol: FirAccessorSymbol,
|
||||
baseSymbol: FirSyntheticPropertySymbol,
|
||||
newDispatchReceiverType: ConeKotlinType?,
|
||||
newReturnType: ConeKotlinType?,
|
||||
newGetterParameterTypes: List<ConeKotlinType?>?,
|
||||
newSetterParameterTypes: List<ConeKotlinType?>?,
|
||||
fakeOverrideSubstitution: FakeOverrideSubstitution?
|
||||
): FirAccessorSymbol {
|
||||
): FirSyntheticPropertySymbol {
|
||||
val getterSymbol = FirNamedFunctionSymbol(baseSymbol.getterId)
|
||||
val getter = createSubstitutionOverrideFunction(
|
||||
getterSymbol,
|
||||
@@ -463,7 +463,7 @@ object FirFakeOverrideGenerator {
|
||||
return buildSyntheticProperty {
|
||||
moduleData = session.moduleData
|
||||
name = baseProperty.name
|
||||
symbol = FirAccessorSymbol(baseSymbol.callableId, baseSymbol.getterId)
|
||||
symbol = baseSymbol.copy()
|
||||
delegateGetter = getter
|
||||
delegateSetter = setter
|
||||
status = baseProperty.status
|
||||
|
||||
Reference in New Issue
Block a user