FIR: introduce synthetic property symbol hierarchy

This commit is contained in:
Mikhail Glukhikh
2021-10-21 17:40:13 +03:00
committed by TeamCityServer
parent c673c4cc91
commit 79b98f9173
17 changed files with 92 additions and 39 deletions
@@ -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)
)
@@ -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")
}
}
@@ -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