diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirSuperTypeScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirSuperTypeScope.kt index 77df7caecbc..eb9b6f614c1 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirSuperTypeScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirSuperTypeScope.kt @@ -27,43 +27,30 @@ class FirSuperTypeScope private constructor( private val absentClassifiers = mutableSetOf() override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> ProcessorAction): ProcessorAction { - if (name in absentFunctions) { - return ProcessorAction.NEXT - } - val accepted = HashSet>() - val pending = mutableListOf>() - var empty = true - for (scope in scopes) { - if (scope.processFunctionsByName(name) { functionSymbol -> - empty = false - if (functionSymbol !in accepted && functionSymbol.getOverridden(accepted) == null) { - pending += functionSymbol - processor(functionSymbol) - } else { - ProcessorAction.NEXT - } - }.stop() - ) { - return ProcessorAction.STOP - } - accepted += pending - pending.clear() - } - if (empty) { - absentFunctions += name - } + processCallablesByName(name, processor, absentFunctions, FirScope::processFunctionsByName)?.let { return it } return super.processFunctionsByName(name, processor) } override fun processPropertiesByName(name: Name, processor: (FirCallableSymbol<*>) -> ProcessorAction): ProcessorAction { - if (name in absentProperties) { + processCallablesByName(name, processor, absentProperties, FirScope::processPropertiesByName)?.let { return it } + return super.processPropertiesByName(name, processor) + } + + private inline fun > processCallablesByName( + name: Name, + noinline processor: (D) -> ProcessorAction, + absentNames: MutableSet, + processCallables: FirScope.(Name, (D) -> ProcessorAction) -> ProcessorAction + ): ProcessorAction? { + if (name in absentNames) { return ProcessorAction.NEXT } + val accepted = HashSet>() val pending = mutableListOf>() var empty = true for (scope in scopes) { - if (scope.processPropertiesByName(name) { + if (scope.processCallables(name) { empty = false if (it !in accepted && it.getOverridden(accepted) == null) { pending += it @@ -79,9 +66,10 @@ class FirSuperTypeScope private constructor( pending.clear() } if (empty) { - absentProperties += name + absentNames += name } - return super.processPropertiesByName(name, processor) + + return null } override fun processClassifiersByName(name: Name, processor: (FirClassifierSymbol<*>) -> ProcessorAction): ProcessorAction {