[FIR] Add utility function for collecting overridden tree for debug purposes

This commit is contained in:
Dmitriy Novozhilov
2021-11-19 18:00:03 +03:00
parent 6edf191b7f
commit d72fcc92fe
@@ -5,13 +5,51 @@
package org.jetbrains.kotlin.fir.scopes
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
import org.jetbrains.kotlin.fir.resolve.scope
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.types.classId
import org.jetbrains.kotlin.name.ClassId
fun ConeClassLikeLookupTag.getNestedClassifierScope(session: FirSession, scopeSession: ScopeSession): FirContainingNamesAwareScope? {
val klass = toSymbol(session)?.fir as? FirRegularClass ?: return null
return klass.scopeProvider.getNestedClassifierScope(klass, session, scopeSession)
}
/**
* Use this function to collect direct overridden tree for debug purposes
*/
@TestOnly
fun debugCollectOverrides(symbol: FirCallableSymbol<*>, session: FirSession, scopeSession: ScopeSession): Map<Any, Any> {
val scope = symbol.dispatchReceiverType?.scope(session, scopeSession, FakeOverrideTypeCalculator.DoNothing) ?: return emptyMap()
return debugCollectOverrides(symbol, scope)
}
@TestOnly
fun debugCollectOverrides(symbol: FirCallableSymbol<*>, scope: FirTypeScope): Map<Any, Any> {
fun process(scope: FirTypeScope, symbol: FirCallableSymbol<*>): Map<Any, Any> {
val result = mutableMapOf<Any, Any>()
val resultList = mutableListOf<Any>()
when (symbol) {
is FirNamedFunctionSymbol -> scope.processDirectOverriddenFunctionsWithBaseScope(symbol) { baseSymbol, baseScope ->
resultList.add(process(baseScope, baseSymbol))
ProcessorAction.NEXT
}
is FirPropertySymbol -> scope.processDirectOverriddenPropertiesWithBaseScope(symbol) { baseSymbol, baseScope ->
resultList.add(process(baseScope, baseSymbol))
ProcessorAction.NEXT
}
}
result[symbol] = resultList
return result
}
return process(scope, symbol)
}