[FIR] Accessor symbol is now a property symbol, not a function symbol
This commit is contained in:
+13
-10
@@ -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
|
||||
|
||||
+23
-23
@@ -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 ->
|
||||
|
||||
+17
-9
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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 ------------------------
|
||||
|
||||
|
||||
Reference in New Issue
Block a user