diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt index 04d5f5beb8b..c46f847f99f 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt @@ -55,6 +55,28 @@ class FirSignatureEnhancement( FirJavaEnhancementContext(session) { null }.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, jsr305State, owner.annotations) private val enhancements = mutableMapOf, FirCallableSymbol<*>>() + private val overriddenFunctions = mutableMapOf, Collection>>() + + override fun processPropertiesByName(name: Name, processor: (FirVariableSymbol<*>) -> Unit) { + useSiteMemberScope.processPropertiesByName(name) process@{ original -> + + val field = enhancements.getOrPut(original) { enhance(original, name) } + processor(field as FirVariableSymbol<*>) + } + + return super.processPropertiesByName(name, processor) + } + + override fun getCallableNames(): Set { + return useSiteMemberScope.getCallableNames() + super.getCallableNames() + } + + override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) { + useSiteMemberScope.processFunctionsByName(name) process@{ original -> + + val function = enhancements.getOrPut(original) { enhance(original, name) } + processor(function as FirFunctionSymbol<*>) + } fun enhancedFunction( function: FirFunctionSymbol<*>, 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 c173ca89b4e..fedef6d6801 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 @@ -45,6 +45,10 @@ class JavaClassUseSiteMemberScope( } } + override fun getCallableNames(): Set { + return declaredMemberScope.getCallableNames() + superTypesScope.getCallableNames() + } + private fun generateAccessorSymbol( functionSymbol: FirFunctionSymbol<*>, syntheticPropertyName: Name, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt index 701dd1620a5..db9f5846f88 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt @@ -130,4 +130,8 @@ abstract class AbstractFirUseSiteMemberScope( override fun processDeclaredConstructors(processor: (FirConstructorSymbol) -> Unit) { declaredMemberScope.processDeclaredConstructors(processor) } + + override fun getCallableNames(): Set { + return declaredMemberScope.getCallableNames() + superTypesScope.getCallableNames() + } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassDeclaredMemberScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassDeclaredMemberScope.kt index 45f96a38b36..c9e57661b13 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassDeclaredMemberScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassDeclaredMemberScope.kt @@ -76,6 +76,10 @@ class FirClassDeclaredMemberScope( ) { nestedClassifierScope?.processClassifiersByNameWithSubstitution(name, processor) } + + override fun getCallableNames(): Set { + return callablesIndex.keys + } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt index 2c8ac8770a3..2242d6381aa 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt @@ -341,6 +341,10 @@ class FirTypeIntersectionScope private constructor( return ProcessorAction.NEXT } + override fun getCallableNames(): Set { + return scopes.flatMapTo(mutableSetOf()) { it.getCallableNames() } + } + companion object { fun prepareIntersectionScope( session: FirSession, diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirCompositeScope.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirCompositeScope.kt index 5a59764cc61..e35b4e02cf8 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirCompositeScope.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirCompositeScope.kt @@ -44,4 +44,8 @@ class FirCompositeScope(private val scopes: Iterable) : FirScope() { override fun processPropertiesByName(name: Name, processor: (FirVariableSymbol<*>) -> Unit) { return processComposite(FirScope::processPropertiesByName, name, processor) } + + override fun getCallableNames(): Set { + return scopes.flatMapTo(mutableSetOf()) { it.getCallableNames() } + } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirScope.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirScope.kt index a4b3da3f979..651af6b1150 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirScope.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirScope.kt @@ -34,6 +34,7 @@ abstract class FirScope { open fun mayContainName(name: Name) = true + open fun getCallableNames(): Set = emptySet() } fun FirTypeScope.processOverriddenFunctionsAndSelf(