[FIR] Accessor symbol is now a property symbol, not a function symbol

This commit is contained in:
Mikhail Glukhikh
2020-02-05 14:33:06 +03:00
parent 69809fef94
commit a7f9e3ab09
5 changed files with 55 additions and 44 deletions
@@ -13,7 +13,8 @@ import org.jetbrains.kotlin.fir.declarations.builder.FirConstructorBuilder
import org.jetbrains.kotlin.fir.declarations.builder.FirPrimaryConstructorBuilder
import org.jetbrains.kotlin.fir.declarations.builder.FirSimpleFunctionBuilder
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.*
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.expressions.FirConstKind
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression
@@ -104,11 +105,16 @@ class JavaClassEnhancementScope(
}
return symbol
}
is FirJavaMethod -> {
is FirSyntheticProperty -> {
original as FirAccessorSymbol
return enhanceMethod(
firElement, original.accessorId, original.accessorId.callableName, isAccessor = true, propertyId = original.callableId
) as FirAccessorSymbol
val enhancedFunctionSymbol = enhanceMethod(
firElement.getter.delegate, original.accessorId, original.accessorId.callableName
)
val enhancedProperty = FirSyntheticProperty(
session, name, FirAccessorSymbol(original.callableId, original.accessorId),
enhancedFunctionSymbol.fir as FirSimpleFunction
)
return enhancedProperty.symbol
}
else -> {
if (original is FirPropertySymbol || original is FirAccessorSymbol) return original
@@ -132,9 +138,7 @@ class JavaClassEnhancementScope(
private fun enhanceMethod(
firMethod: FirFunction<*>,
methodId: CallableId,
name: Name,
isAccessor: Boolean = false,
propertyId: CallableId? = null
name: Name
): FirFunctionSymbol<*> {
val memberContext = context.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, jsr305State, firMethod.annotations)
@@ -225,8 +229,7 @@ class JavaClassEnhancementScope(
receiverTypeRef = newReceiverTypeRef
this.name = name
status = firMethod.status
symbol = if (!isAccessor) FirNamedFunctionSymbol(methodId)
else FirAccessorSymbol(callableId = propertyId!!, accessorId = methodId)
symbol = FirNamedFunctionSymbol(methodId)
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
valueParameters += newValueParameters
typeParameters += firMethod.typeParameters
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.FirSimpleFunctionBuilder
import org.jetbrains.kotlin.fir.declarations.builder.FirValueParameterBuilder
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
import org.jetbrains.kotlin.fir.java.declarations.*
@@ -16,10 +17,7 @@ import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertiesScope
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.impl.AbstractFirUseSiteMemberScope
import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.impl.FirAccessorSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef
import org.jetbrains.kotlin.name.Name
@@ -51,30 +49,32 @@ class JavaClassUseSiteMemberScope(
syntheticPropertyName: Name,
overrideCandidates: MutableSet<FirCallableSymbol<*>>,
isGetter: Boolean
): FirAccessorSymbol? {
if (functionSymbol is FirNamedFunctionSymbol) {
val fir = functionSymbol.fir
if (fir.isStatic) {
): FirPropertySymbol? {
if (functionSymbol !is FirNamedFunctionSymbol) {
return null
}
val fir = functionSymbol.fir
if (fir.isStatic) {
return null
}
when (isGetter) {
true -> if (fir.valueParameters.isNotEmpty()) {
return null
}
when (isGetter) {
true -> if (fir.valueParameters.isNotEmpty()) {
return null
}
false -> if (fir.valueParameters.size != 1) {
return null
}
false -> if (fir.valueParameters.size != 1) {
return null
}
}
overrideCandidates += functionSymbol
val accessorSymbol = FirAccessorSymbol(
accessorId = functionSymbol.callableId,
callableId = CallableId(functionSymbol.callableId.packageName, functionSymbol.callableId.className, syntheticPropertyName)
val accessorProperty = FirSyntheticProperty(
session, syntheticPropertyName,
symbol = FirAccessorSymbol(
accessorId = functionSymbol.callableId,
callableId = CallableId(functionSymbol.callableId.packageName, functionSymbol.callableId.className, syntheticPropertyName)
),
delegateGetter = fir
)
if (functionSymbol is FirNamedFunctionSymbol) {
functionSymbol.fir.let { callableMember -> accessorSymbol.bind(callableMember) }
}
return accessorSymbol
return accessorProperty.symbol
}
private fun processAccessorFunctionsAndPropertiesByName(
@@ -82,7 +82,7 @@ class JavaClassUseSiteMemberScope(
getterNames: List<Name>,
setterName: Name?,
processor: (FirCallableSymbol<*>) -> Unit
): Unit {
) {
val overrideCandidates = mutableSetOf<FirCallableSymbol<*>>()
val klass = symbol.fir
declaredMemberScope.processPropertiesByName(propertyName) { variableSymbol ->
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.builder.*
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.substitution.ChainedSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
@@ -67,7 +68,9 @@ class FirClassSubstitutionScope(
processor(field)
}
is FirAccessorSymbol -> {
val accessor = fakeOverrideAccessors.getOrPut(original) { createFakeOverrideAccessor(original) }
val accessor = fakeOverrideAccessors.getOrPut(original) {
createFakeOverrideAccessor(original) as FirAccessorSymbol
}
processor(accessor)
}
else -> {
@@ -194,13 +197,13 @@ class FirClassSubstitutionScope(
return createFakeOverrideField(session, member, original, newReturnType)
}
private fun createFakeOverrideAccessor(original: FirAccessorSymbol): FirAccessorSymbol {
val member = original.fir
private fun createFakeOverrideAccessor(original: FirAccessorSymbol): FirPropertySymbol {
val member = original.fir as FirSyntheticProperty
val returnType = typeCalculator.tryCalculateReturnType(member).type
val newReturnType = returnType.substitute()
val newParameterTypes = member.valueParameters.map {
val newParameterTypes = member.getter.valueParameters.map {
it.returnTypeRef.coneTypeUnsafe<ConeKotlinType>().substitute()
}
@@ -323,14 +326,19 @@ class FirClassSubstitutionScope(
fun createFakeOverrideAccessor(
session: FirSession,
baseFunction: FirSimpleFunction,
baseProperty: FirSyntheticProperty,
baseSymbol: FirAccessorSymbol,
newReturnType: ConeKotlinType? = null,
newParameterTypes: List<ConeKotlinType?>? = null
): FirAccessorSymbol {
val symbol = FirAccessorSymbol(baseSymbol.callableId, baseSymbol.accessorId)
createFakeOverrideFunction(symbol, session, baseFunction, null, newReturnType, newParameterTypes)
return symbol
): FirPropertySymbol {
val functionSymbol = FirNamedFunctionSymbol(baseSymbol.accessorId)
val function = createFakeOverrideFunction(
functionSymbol, session, baseProperty.getter.delegate, null, newReturnType, newParameterTypes
)
val property = FirSyntheticProperty(
session, baseProperty.name, FirAccessorSymbol(baseSymbol.callableId, baseSymbol.accessorId), function
)
return property.symbol
}
}
}
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor
class FirSyntheticPropertyAccessor(
private val delegate: FirSimpleFunction,
val delegate: FirSimpleFunction,
override val isGetter: Boolean
) : FirPropertyAccessor() {
override val source: FirSourceElement?
@@ -36,7 +36,7 @@ class FirConstructorSymbol(
class FirAccessorSymbol(
callableId: CallableId,
override val accessorId: CallableId
) : FirFunctionSymbol<FirSimpleFunction>(callableId), AccessorSymbol
) : FirPropertySymbol(callableId), AccessorSymbol
// ------------------------ unnamed ------------------------