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