Use FirNamedFunctionSymbol around processOverriddenFunctions

This commit is contained in:
Mikhail Glukhikh
2020-12-02 17:22:18 +03:00
committed by TeamCityServer
parent 8fedfd2d2a
commit 15021f30ff
17 changed files with 97 additions and 99 deletions
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.processOverriddenFunctions import org.jetbrains.kotlin.fir.scopes.processOverriddenFunctions
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
@@ -152,7 +153,7 @@ fun FirSymbolOwner<*>.getContainingClass(context: CheckerContext): FirClassLikeD
* Returns the FirClassLikeDeclaration the type alias is pointing * Returns the FirClassLikeDeclaration the type alias is pointing
* to provided `this` is a FirTypeAlias. Returns this otherwise. * to provided `this` is a FirTypeAlias. Returns this otherwise.
*/ */
fun FirClassLikeDeclaration<*>.followAlias(session: FirSession): FirClassLikeDeclaration<*>? { fun FirClassLikeDeclaration<*>.followAlias(session: FirSession): FirClassLikeDeclaration<*> {
return this.safeAs<FirTypeAlias>() return this.safeAs<FirTypeAlias>()
?.expandedTypeRef ?.expandedTypeRef
?.firClassLike(session) ?.firClassLike(session)
@@ -199,6 +200,7 @@ fun FirSimpleFunction.overriddenFunctions(
containingClass: FirClass<*>, containingClass: FirClass<*>,
context: CheckerContext context: CheckerContext
): List<FirFunctionSymbol<*>> { ): List<FirFunctionSymbol<*>> {
val symbol = symbol as? FirNamedFunctionSymbol ?: return emptyList()
val firTypeScope = containingClass.unsubstitutedScope( val firTypeScope = containingClass.unsubstitutedScope(
context.sessionHolder.session, context.sessionHolder.session,
context.sessionHolder.scopeSession, context.sessionHolder.scopeSession,
@@ -140,26 +140,27 @@ fun FirReference.toSymbolForCall(
} }
} }
private fun FirCallableSymbol<*>.toSymbolForCall(declarationStorage: Fir2IrDeclarationStorage, preferGetter: Boolean): IrSymbol? = when (this) { private fun FirCallableSymbol<*>.toSymbolForCall(declarationStorage: Fir2IrDeclarationStorage, preferGetter: Boolean): IrSymbol? =
is FirFunctionSymbol<*> -> declarationStorage.getIrFunctionSymbol(this) when (this) {
is SyntheticPropertySymbol -> { is FirFunctionSymbol<*> -> declarationStorage.getIrFunctionSymbol(this)
(fir as? FirSyntheticProperty)?.let { syntheticProperty -> is SyntheticPropertySymbol -> {
val delegateSymbol = if (preferGetter) { (fir as? FirSyntheticProperty)?.let { syntheticProperty ->
syntheticProperty.getter.delegate.symbol val delegateSymbol = if (preferGetter) {
} else { syntheticProperty.getter.delegate.symbol
syntheticProperty.setter?.delegate?.symbol } else {
?: throw AssertionError("Written synthetic property must have a setter") syntheticProperty.setter?.delegate?.symbol
} ?: throw AssertionError("Written synthetic property must have a setter")
delegateSymbol.unwrapCallRepresentative().toSymbolForCall(declarationStorage, preferGetter) }
} ?: declarationStorage.getIrPropertySymbol(this) delegateSymbol.unwrapCallRepresentative().toSymbolForCall(declarationStorage, preferGetter)
} ?: declarationStorage.getIrPropertySymbol(this)
}
is FirPropertySymbol -> declarationStorage.getIrPropertySymbol(this)
is FirFieldSymbol -> declarationStorage.getIrFieldSymbol(this)
is FirBackingFieldSymbol -> declarationStorage.getIrBackingFieldSymbol(this)
is FirDelegateFieldSymbol<*> -> declarationStorage.getIrBackingFieldSymbol(this)
is FirVariableSymbol<*> -> declarationStorage.getIrValueSymbol(this)
else -> null
} }
is FirPropertySymbol -> declarationStorage.getIrPropertySymbol(this)
is FirFieldSymbol -> declarationStorage.getIrFieldSymbol(this)
is FirBackingFieldSymbol -> declarationStorage.getIrBackingFieldSymbol(this)
is FirDelegateFieldSymbol<*> -> declarationStorage.getIrBackingFieldSymbol(this)
is FirVariableSymbol<*> -> declarationStorage.getIrValueSymbol(this)
else -> null
}
fun FirConstExpression<*>.getIrConstKind(): IrConstKind<*> = when (kind) { fun FirConstExpression<*>.getIrConstKind(): IrConstKind<*> = when (kind) {
FirConstKind.IntegerLiteral -> { FirConstKind.IntegerLiteral -> {
@@ -249,8 +250,9 @@ internal fun FirSimpleFunction.generateOverriddenFunctionSymbols(
val scope = containingClass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true) val scope = containingClass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true)
scope.processFunctionsByName(name) {} scope.processFunctionsByName(name) {}
val overriddenSet = mutableSetOf<IrSimpleFunctionSymbol>() val overriddenSet = mutableSetOf<IrSimpleFunctionSymbol>()
val symbol = symbol as? FirNamedFunctionSymbol ?: return emptyList()
scope.processDirectlyOverriddenFunctions(symbol) { scope.processDirectlyOverriddenFunctions(symbol) {
if ((it.fir as FirSimpleFunction).visibility == Visibilities.Private) { if (it.fir.visibility == Visibilities.Private) {
return@processDirectlyOverriddenFunctions ProcessorAction.NEXT return@processDirectlyOverriddenFunctions ProcessorAction.NEXT
} }
@@ -55,8 +55,8 @@ class JavaAnnotationSyntheticPropertiesScope(
} }
override fun processDirectOverriddenFunctionsWithBaseScope( override fun processDirectOverriddenFunctionsWithBaseScope(
functionSymbol: FirFunctionSymbol<*>, functionSymbol: FirNamedFunctionSymbol,
processor: (FirFunctionSymbol<*>, FirTypeScope) -> ProcessorAction processor: (FirNamedFunctionSymbol, FirTypeScope) -> ProcessorAction
): ProcessorAction { ): ProcessorAction {
return ProcessorAction.NONE return ProcessorAction.NONE
} }
@@ -36,7 +36,7 @@ class JavaClassMembersEnhancementScope(
private val owner: FirRegularClassSymbol, private val owner: FirRegularClassSymbol,
private val useSiteMemberScope: JavaClassUseSiteMemberScope, private val useSiteMemberScope: JavaClassUseSiteMemberScope,
) : FirTypeScope() { ) : FirTypeScope() {
private val overriddenFunctions = mutableMapOf<FirFunctionSymbol<*>, Collection<FirFunctionSymbol<*>>>() private val overriddenFunctions = mutableMapOf<FirNamedFunctionSymbol, Collection<FirNamedFunctionSymbol>>()
private val overriddenProperties = mutableMapOf<FirPropertySymbol, Collection<FirPropertySymbol>>() private val overriddenProperties = mutableMapOf<FirPropertySymbol, Collection<FirPropertySymbol>>()
private val overrideBindCache = mutableMapOf<Name, Map<FirCallableSymbol<*>?, List<FirCallableSymbol<*>>>>() private val overrideBindCache = mutableMapOf<Name, Map<FirCallableSymbol<*>?, List<FirCallableSymbol<*>>>>()
@@ -149,16 +149,11 @@ class JavaClassMembersEnhancementScope(
val enhancedFunction = (symbol.fir as? FirSimpleFunction)?.changeSignatureIfErasedValueParameter() val enhancedFunction = (symbol.fir as? FirSimpleFunction)?.changeSignatureIfErasedValueParameter()
val enhancedFunctionSymbol = enhancedFunction?.symbol ?: symbol val enhancedFunctionSymbol = enhancedFunction?.symbol ?: symbol
val originalFunction = original.fir as? FirSimpleFunction if (enhancedFunctionSymbol is FirNamedFunctionSymbol && original is FirNamedFunctionSymbol) {
overriddenFunctions[enhancedFunctionSymbol] = original.fir
overriddenFunctions[enhancedFunctionSymbol] = .overriddenMembers(enhancedFunctionSymbol.fir.name)
if (enhancedFunction != null && originalFunction != null) .mapNotNull { it.symbol as? FirNamedFunctionSymbol }
originalFunction }
.overriddenMembers(enhancedFunction.name)
.mapNotNull { it.symbol as? FirFunctionSymbol<*> }
else
emptyList()
processor(enhancedFunctionSymbol) processor(enhancedFunctionSymbol)
} }
@@ -188,8 +183,8 @@ class JavaClassMembersEnhancementScope(
} }
override fun processDirectOverriddenFunctionsWithBaseScope( override fun processDirectOverriddenFunctionsWithBaseScope(
functionSymbol: FirFunctionSymbol<*>, functionSymbol: FirNamedFunctionSymbol,
processor: (FirFunctionSymbol<*>, FirTypeScope) -> ProcessorAction processor: (FirNamedFunctionSymbol, FirTypeScope) -> ProcessorAction
): ProcessorAction = ): ProcessorAction =
doProcessDirectOverriddenCallables( doProcessDirectOverriddenCallables(
functionSymbol, processor, overriddenFunctions, useSiteMemberScope, functionSymbol, processor, overriddenFunctions, useSiteMemberScope,
@@ -42,8 +42,8 @@ class JvmMappedScope(
} }
override fun processDirectOverriddenFunctionsWithBaseScope( override fun processDirectOverriddenFunctionsWithBaseScope(
functionSymbol: FirFunctionSymbol<*>, functionSymbol: FirNamedFunctionSymbol,
processor: (FirFunctionSymbol<*>, FirTypeScope) -> ProcessorAction processor: (FirNamedFunctionSymbol, FirTypeScope) -> ProcessorAction
) = ProcessorAction.NONE ) = ProcessorAction.NONE
override fun processDeclaredConstructors(processor: (FirConstructorSymbol) -> Unit) { override fun processDeclaredConstructors(processor: (FirConstructorSymbol) -> Unit) {
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.resolve.inference.inferenceComponents
import org.jetbrains.kotlin.fir.scopes.ProcessorAction import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.processOverriddenFunctions import org.jetbrains.kotlin.fir.scopes.processOverriddenFunctions
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.types.ConeInferenceContext import org.jetbrains.kotlin.fir.types.ConeInferenceContext
import org.jetbrains.kotlin.fir.types.ConeTypeCheckerContext import org.jetbrains.kotlin.fir.types.ConeTypeCheckerContext
@@ -29,6 +30,7 @@ fun FirSimpleFunction.lowestVisibilityAmongOverrides(
session: FirSession, session: FirSession,
scopeSession: ScopeSession scopeSession: ScopeSession
): Visibility { ): Visibility {
val symbol = symbol as? FirNamedFunctionSymbol ?: return visibility
val firTypeScope = containingClass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = false) val firTypeScope = containingClass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = false)
var visibility = visibility var visibility = visibility
@@ -37,16 +39,7 @@ fun FirSimpleFunction.lowestVisibilityAmongOverrides(
firTypeScope.processFunctionsByName(symbol.fir.name) { } firTypeScope.processFunctionsByName(symbol.fir.name) { }
firTypeScope.processOverriddenFunctions(symbol) { firTypeScope.processOverriddenFunctions(symbol) {
val overriddenVisibility = when (val fir = it.fir) { visibility = it.fir.visibility
is FirMemberDeclaration -> fir.visibility
is FirPropertyAccessor -> fir.visibility
else -> null
}
overriddenVisibility?.let { that ->
visibility = that
}
ProcessorAction.NEXT ProcessorAction.NEXT
} }
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.FirTypeScope import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.processOverriddenFunctions import org.jetbrains.kotlin.fir.scopes.processOverriddenFunctions
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
class FirDefaultParametersResolver : FirSessionComponent { class FirDefaultParametersResolver : FirSessionComponent {
fun declaresDefaultValue( fun declaresDefaultValue(
@@ -23,9 +24,10 @@ class FirDefaultParametersResolver : FirSessionComponent {
): Boolean { ): Boolean {
if (valueParameter.defaultValue != null) return true if (valueParameter.defaultValue != null) return true
if (originScope !is FirTypeScope) return false if (originScope !is FirTypeScope) return false
val symbol = function.symbol as? FirNamedFunctionSymbol ?: return false
var result = false var result = false
originScope.processOverriddenFunctions(function.symbol) { overridden -> originScope.processOverriddenFunctions(symbol) { overridden ->
if (overridden.fir.valueParameters[index].defaultValue != null) { if (overridden.fir.valueParameters[index].defaultValue != null) {
result = true result = true
return@processOverriddenFunctions ProcessorAction.STOP return@processOverriddenFunctions ProcessorAction.STOP
@@ -56,7 +56,8 @@ class FirSyntheticPropertiesScope(
getterSymbol: FirFunctionSymbol<*>, getterSymbol: FirFunctionSymbol<*>,
processor: (FirVariableSymbol<*>) -> Unit processor: (FirVariableSymbol<*>) -> Unit
) { ) {
val getter = getterSymbol.fir as? FirSimpleFunction ?: return if (getterSymbol !is FirNamedFunctionSymbol) return
val getter = getterSymbol.fir
if (getter.typeParameters.isNotEmpty()) return if (getter.typeParameters.isNotEmpty()) return
if (getter.valueParameters.isNotEmpty()) return if (getter.valueParameters.isNotEmpty()) return
@@ -121,7 +122,7 @@ class FirSyntheticPropertiesScope(
processor(property.symbol) processor(property.symbol)
} }
private fun FirFunctionSymbol<*>.hasJavaOverridden(): Boolean { private fun FirNamedFunctionSymbol.hasJavaOverridden(): Boolean {
var result = false var result = false
baseScope.processOverriddenFunctionsAndSelf(this) { baseScope.processOverriddenFunctionsAndSelf(this) {
if (it.unwrapFakeOverrides().fir.origin == FirDeclarationOrigin.Enhancement) { if (it.unwrapFakeOverrides().fir.origin == FirDeclarationOrigin.Enhancement) {
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.symbols.StandardClassIds
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.typeContext import org.jetbrains.kotlin.fir.typeContext
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
@@ -125,9 +126,11 @@ fun ConeKotlinType.findContributedInvokeSymbol(
FakeOverrideTypeCalculator.DoNothing FakeOverrideTypeCalculator.DoNothing
} }
val scope = scope(session, scopeSession, fakeOverrideTypeCalculator) ?: return null val scope = scope(session, scopeSession, fakeOverrideTypeCalculator) ?: return null
var declaredInvoke: FirFunctionSymbol<*>? = null var declaredInvoke: FirNamedFunctionSymbol? = null
scope.processFunctionsByName(OperatorNameConventions.INVOKE) { functionSymbol -> scope.processFunctionsByName(OperatorNameConventions.INVOKE) { functionSymbol ->
if (functionSymbol.fir.valueParameters.size == baseInvokeSymbol.fir.valueParameters.size) { if (functionSymbol is FirNamedFunctionSymbol &&
functionSymbol.fir.valueParameters.size == baseInvokeSymbol.fir.valueParameters.size
) {
declaredInvoke = functionSymbol declaredInvoke = functionSymbol
return@processFunctionsByName return@processFunctionsByName
} }
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.scopes.ProcessorAction import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
class FirStatusResolver( class FirStatusResolver(
val session: FirSession, val session: FirSession,
@@ -73,14 +74,14 @@ class FirStatusResolver(
@Suppress("RemoveExplicitTypeArguments") // Workaround for KT-42175 @Suppress("RemoveExplicitTypeArguments") // Workaround for KT-42175
buildList<FirCallableMemberDeclaration<*>> { buildList<FirCallableMemberDeclaration<*>> {
val scope = containingClass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = false) val scope = containingClass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = false)
scope.processFunctionsByName(function.name) {} val symbol = function.symbol
scope if (symbol is FirNamedFunctionSymbol) {
.processDirectOverriddenFunctionsWithBaseScope(function.symbol) { symbol, _ -> scope.processFunctionsByName(function.name) {}
(symbol.fir as? FirCallableMemberDeclaration<*>)?.let { scope.processDirectOverriddenFunctionsWithBaseScope(symbol) { overriddenSymbol, _ ->
this += it this += overriddenSymbol.fir
}
ProcessorAction.NEXT ProcessorAction.NEXT
} }
}
}.mapNotNull { }.mapNotNull {
it.status as? FirResolvedDeclarationStatus it.status as? FirResolvedDeclarationStatus
} }
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.fir.scopes.impl package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.scopes.*
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
@@ -20,7 +19,7 @@ abstract class AbstractFirUseSiteMemberScope(
) : AbstractFirOverrideScope(session, overrideChecker) { ) : AbstractFirOverrideScope(session, overrideChecker) {
private val functions = hashMapOf<Name, Collection<FirFunctionSymbol<*>>>() private val functions = hashMapOf<Name, Collection<FirFunctionSymbol<*>>>()
private val directOverriddenFunctions = hashMapOf<FirFunctionSymbol<*>, Collection<FirFunctionSymbol<*>>>() private val directOverriddenFunctions = hashMapOf<FirNamedFunctionSymbol, Collection<FirNamedFunctionSymbol>>()
protected val directOverriddenProperties = hashMapOf<FirPropertySymbol, MutableList<FirPropertySymbol>>() protected val directOverriddenProperties = hashMapOf<FirPropertySymbol, MutableList<FirPropertySymbol>>()
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) { override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) {
@@ -37,8 +36,10 @@ abstract class AbstractFirUseSiteMemberScope(
val overrideCandidates = mutableSetOf<FirFunctionSymbol<*>>() val overrideCandidates = mutableSetOf<FirFunctionSymbol<*>>()
declaredMemberScope.processFunctionsByName(name) { symbol -> declaredMemberScope.processFunctionsByName(name) { symbol ->
if (symbol.isStatic) return@processFunctionsByName if (symbol.isStatic) return@processFunctionsByName
val directOverridden = computeDirectOverridden(symbol) if (symbol is FirNamedFunctionSymbol) {
this@AbstractFirUseSiteMemberScope.directOverriddenFunctions[symbol] = directOverridden val directOverridden = computeDirectOverridden(symbol)
this@AbstractFirUseSiteMemberScope.directOverriddenFunctions[symbol] = directOverridden
}
overrideCandidates += symbol overrideCandidates += symbol
add(symbol) add(symbol)
} }
@@ -53,13 +54,12 @@ abstract class AbstractFirUseSiteMemberScope(
} }
} }
private fun computeDirectOverridden(symbol: FirFunctionSymbol<*>): Collection<FirFunctionSymbol<*>> { private fun computeDirectOverridden(symbol: FirNamedFunctionSymbol): Collection<FirNamedFunctionSymbol> {
val result = mutableListOf<FirFunctionSymbol<*>>() val result = mutableListOf<FirNamedFunctionSymbol>()
val firSimpleFunction = symbol.fir as? FirSimpleFunction ?: return emptyList() val firSimpleFunction = symbol.fir
superTypesScope.processFunctionsByName(symbol.callableId.callableName) { superSymbol -> superTypesScope.processFunctionsByName(symbol.callableId.callableName) { superSymbol ->
val superFunctionFir = superSymbol.fir if (superSymbol is FirNamedFunctionSymbol &&
if (superFunctionFir is FirSimpleFunction && overrideChecker.isOverriddenFunction(firSimpleFunction, superSymbol.fir)
overrideChecker.isOverriddenFunction(firSimpleFunction, superFunctionFir)
) { ) {
result.add(superSymbol) result.add(superSymbol)
} }
@@ -69,8 +69,8 @@ abstract class AbstractFirUseSiteMemberScope(
} }
override fun processDirectOverriddenFunctionsWithBaseScope( override fun processDirectOverriddenFunctionsWithBaseScope(
functionSymbol: FirFunctionSymbol<*>, functionSymbol: FirNamedFunctionSymbol,
processor: (FirFunctionSymbol<*>, FirTypeScope) -> ProcessorAction processor: (FirNamedFunctionSymbol, FirTypeScope) -> ProcessorAction
): ProcessorAction = ): ProcessorAction =
doProcessDirectOverriddenCallables( doProcessDirectOverriddenCallables(
functionSymbol, processor, directOverriddenFunctions, superTypesScope, functionSymbol, processor, directOverriddenFunctions, superTypesScope,
@@ -44,8 +44,8 @@ class FirClassSubstitutionScope(
} }
override fun processDirectOverriddenFunctionsWithBaseScope( override fun processDirectOverriddenFunctionsWithBaseScope(
functionSymbol: FirFunctionSymbol<*>, functionSymbol: FirNamedFunctionSymbol,
processor: (FirFunctionSymbol<*>, FirTypeScope) -> ProcessorAction processor: (FirNamedFunctionSymbol, FirTypeScope) -> ProcessorAction
): ProcessorAction = ): ProcessorAction =
processDirectOverriddenWithBaseScope( processDirectOverriddenWithBaseScope(
functionSymbol, processor, FirTypeScope::processDirectOverriddenFunctionsWithBaseScope, substitutionOverrideFunctions functionSymbol, processor, FirTypeScope::processDirectOverriddenFunctionsWithBaseScope, substitutionOverrideFunctions
@@ -108,8 +108,8 @@ class FirDelegatedMemberScope(
} }
override fun processDirectOverriddenFunctionsWithBaseScope( override fun processDirectOverriddenFunctionsWithBaseScope(
functionSymbol: FirFunctionSymbol<*>, functionSymbol: FirNamedFunctionSymbol,
processor: (FirFunctionSymbol<*>, FirTypeScope) -> ProcessorAction processor: (FirNamedFunctionSymbol, FirTypeScope) -> ProcessorAction
): ProcessorAction { ): ProcessorAction {
return processDirectOverriddenWithBaseScope( return processDirectOverriddenWithBaseScope(
functionSymbol, processor, FirTypeScope::processDirectOverriddenFunctionsWithBaseScope functionSymbol, processor, FirTypeScope::processDirectOverriddenFunctionsWithBaseScope
@@ -47,8 +47,8 @@ class FirScopeWithFakeOverrideTypeCalculator(
} }
override fun processDirectOverriddenFunctionsWithBaseScope( override fun processDirectOverriddenFunctionsWithBaseScope(
functionSymbol: FirFunctionSymbol<*>, functionSymbol: FirNamedFunctionSymbol,
processor: (FirFunctionSymbol<*>, FirTypeScope) -> ProcessorAction processor: (FirNamedFunctionSymbol, FirTypeScope) -> ProcessorAction
): ProcessorAction { ): ProcessorAction {
return delegate.processDirectOverriddenFunctionsWithBaseScope(functionSymbol) { symbol, scope -> return delegate.processDirectOverriddenFunctionsWithBaseScope(functionSymbol) { symbol, scope ->
updateReturnType(symbol.fir) updateReturnType(symbol.fir)
@@ -444,8 +444,8 @@ class FirTypeIntersectionScope private constructor(
} }
override fun processDirectOverriddenFunctionsWithBaseScope( override fun processDirectOverriddenFunctionsWithBaseScope(
functionSymbol: FirFunctionSymbol<*>, functionSymbol: FirNamedFunctionSymbol,
processor: (FirFunctionSymbol<*>, FirTypeScope) -> ProcessorAction processor: (FirNamedFunctionSymbol, FirTypeScope) -> ProcessorAction
): ProcessorAction = ): ProcessorAction =
processDirectOverriddenCallablesWithBaseScope( processDirectOverriddenCallablesWithBaseScope(
functionSymbol, processor, functionSymbol, processor,
@@ -6,31 +6,32 @@
package org.jetbrains.kotlin.fir.scopes package org.jetbrains.kotlin.fir.scopes
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
abstract class FirScope { abstract class FirScope {
open fun processClassifiersByNameWithSubstitution( open fun processClassifiersByNameWithSubstitution(
name: Name, name: Name,
processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit
) {} ) {
}
open fun processFunctionsByName( open fun processFunctionsByName(
name: Name, name: Name,
processor: (FirFunctionSymbol<*>) -> Unit processor: (FirFunctionSymbol<*>) -> Unit
) {} ) {
}
open fun processPropertiesByName( open fun processPropertiesByName(
name: Name, name: Name,
processor: (FirVariableSymbol<*>) -> Unit processor: (FirVariableSymbol<*>) -> Unit
) {} ) {
}
open fun processDeclaredConstructors( open fun processDeclaredConstructors(
processor: (FirConstructorSymbol) -> Unit processor: (FirConstructorSymbol) -> Unit
) {} ) {
}
open fun mayContainName(name: Name) = true open fun mayContainName(name: Name) = true
} }
@@ -52,8 +53,8 @@ fun FirScope.getDeclaredConstructors(): List<FirConstructorSymbol> = mutableList
} }
fun FirTypeScope.processOverriddenFunctionsAndSelf( fun FirTypeScope.processOverriddenFunctionsAndSelf(
functionSymbol: FirFunctionSymbol<*>, functionSymbol: FirNamedFunctionSymbol,
processor: (FirFunctionSymbol<*>) -> ProcessorAction processor: (FirNamedFunctionSymbol) -> ProcessorAction
): ProcessorAction { ): ProcessorAction {
if (!processor(functionSymbol)) return ProcessorAction.STOP if (!processor(functionSymbol)) return ProcessorAction.STOP
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.fir.scopes
import org.jetbrains.kotlin.fir.isIntersectionOverride import org.jetbrains.kotlin.fir.isIntersectionOverride
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol 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.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -29,8 +28,8 @@ abstract class FirTypeScope : FirScope(), FirContainingNamesAwareScope {
// - It may silently do nothing on symbols originated from different scope instance // - It may silently do nothing on symbols originated from different scope instance
// - It may return the same overridden symbols more then once in case of substitution // - It may return the same overridden symbols more then once in case of substitution
abstract fun processDirectOverriddenFunctionsWithBaseScope( abstract fun processDirectOverriddenFunctionsWithBaseScope(
functionSymbol: FirFunctionSymbol<*>, functionSymbol: FirNamedFunctionSymbol,
processor: (FirFunctionSymbol<*>, FirTypeScope) -> ProcessorAction processor: (FirNamedFunctionSymbol, FirTypeScope) -> ProcessorAction
): ProcessorAction ): ProcessorAction
// ------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------
@@ -44,8 +43,8 @@ abstract class FirTypeScope : FirScope(), FirContainingNamesAwareScope {
object Empty : FirTypeScope() { object Empty : FirTypeScope() {
override fun processDirectOverriddenFunctionsWithBaseScope( override fun processDirectOverriddenFunctionsWithBaseScope(
functionSymbol: FirFunctionSymbol<*>, functionSymbol: FirNamedFunctionSymbol,
processor: (FirFunctionSymbol<*>, FirTypeScope) -> ProcessorAction processor: (FirNamedFunctionSymbol, FirTypeScope) -> ProcessorAction
): ProcessorAction = ProcessorAction.NEXT ): ProcessorAction = ProcessorAction.NEXT
override fun processDirectOverriddenPropertiesWithBaseScope( override fun processDirectOverriddenPropertiesWithBaseScope(
@@ -84,8 +83,8 @@ abstract class FirTypeScope : FirScope(), FirContainingNamesAwareScope {
typealias ProcessOverriddenWithBaseScope<D> = FirTypeScope.(D, (D, FirTypeScope) -> ProcessorAction) -> ProcessorAction typealias ProcessOverriddenWithBaseScope<D> = FirTypeScope.(D, (D, FirTypeScope) -> ProcessorAction) -> ProcessorAction
fun FirTypeScope.processOverriddenFunctions( fun FirTypeScope.processOverriddenFunctions(
functionSymbol: FirFunctionSymbol<*>, functionSymbol: FirNamedFunctionSymbol,
processor: (FirFunctionSymbol<*>) -> ProcessorAction processor: (FirNamedFunctionSymbol) -> ProcessorAction
): ProcessorAction = ): ProcessorAction =
doProcessAllOverriddenCallables( doProcessAllOverriddenCallables(
functionSymbol, functionSymbol,
@@ -128,8 +127,8 @@ private fun <S : FirCallableSymbol<*>> FirTypeScope.doProcessAllOverriddenCallab
doProcessAllOverriddenCallables(callableSymbol, { s, _ -> processor(s) }, processDirectOverriddenCallablesWithBaseScope, visited) doProcessAllOverriddenCallables(callableSymbol, { s, _ -> processor(s) }, processDirectOverriddenCallablesWithBaseScope, visited)
inline fun FirTypeScope.processDirectlyOverriddenFunctions( inline fun FirTypeScope.processDirectlyOverriddenFunctions(
functionSymbol: FirFunctionSymbol<*>, functionSymbol: FirNamedFunctionSymbol,
crossinline processor: (FirFunctionSymbol<*>) -> ProcessorAction crossinline processor: (FirNamedFunctionSymbol) -> ProcessorAction
): ProcessorAction = processDirectOverriddenFunctionsWithBaseScope(functionSymbol) { overridden, _ -> ): ProcessorAction = processDirectOverriddenFunctionsWithBaseScope(functionSymbol) { overridden, _ ->
processor(overridden) processor(overridden)
} }
@@ -145,7 +144,6 @@ fun FirTypeScope.getDirectOverriddenFunctions(function: FirNamedFunctionSymbol):
val overriddenFunctions = mutableSetOf<FirNamedFunctionSymbol>() val overriddenFunctions = mutableSetOf<FirNamedFunctionSymbol>()
processDirectlyOverriddenFunctions(function) { processDirectlyOverriddenFunctions(function) {
if (it !is FirNamedFunctionSymbol) return@processDirectlyOverriddenFunctions ProcessorAction.NEXT
overriddenFunctions.add(it) overriddenFunctions.add(it)
ProcessorAction.NEXT ProcessorAction.NEXT
} }