diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt index d6b11434c2b..92d4a72b6ca 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt @@ -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 diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt index 4790ce4db2a..be6408eb4a0 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt @@ -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>, 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, setterName: Name?, processor: (FirCallableSymbol<*>) -> Unit - ): Unit { + ) { val overrideCandidates = mutableSetOf>() val klass = symbol.fir declaredMemberScope.processPropertiesByName(propertyName) { variableSymbol -> diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt index c247e742ace..236a3998fbd 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt @@ -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().substitute() } @@ -323,14 +326,19 @@ class FirClassSubstitutionScope( fun createFakeOverrideAccessor( session: FirSession, - baseFunction: FirSimpleFunction, + baseProperty: FirSyntheticProperty, baseSymbol: FirAccessorSymbol, newReturnType: ConeKotlinType? = null, newParameterTypes: List? = 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 } } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticPropertyAccessor.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticPropertyAccessor.kt index 3a25df5c80d..763a9f3bf22 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticPropertyAccessor.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticPropertyAccessor.kt @@ -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? diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirFunctionSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirFunctionSymbol.kt index eaa5a3a74fd..8a385178461 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirFunctionSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirFunctionSymbol.kt @@ -36,7 +36,7 @@ class FirConstructorSymbol( class FirAccessorSymbol( callableId: CallableId, override val accessorId: CallableId -) : FirFunctionSymbol(callableId), AccessorSymbol +) : FirPropertySymbol(callableId), AccessorSymbol // ------------------------ unnamed ------------------------