Use FirNamedFunctionSymbol around processOverriddenFunctions
This commit is contained in:
committed by
TeamCityServer
parent
8fedfd2d2a
commit
15021f30ff
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-13
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-1
@@ -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) {
|
||||||
|
|||||||
+5
-2
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-6
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
+12
-12
@@ -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,
|
||||||
|
|||||||
+2
-2
@@ -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
|
||||||
|
|||||||
+2
-2
@@ -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
|
||||||
|
|||||||
+2
-2
@@ -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)
|
||||||
|
|||||||
+2
-2
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user