[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 ->