[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.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
|
||||||
|
|||||||
+23
-23
@@ -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 ->
|
||||||
|
|||||||
+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.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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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 ------------------------
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user