[FIR] Rewrite casts to reduce performance dispersion

This commit is contained in:
simon.ogorodnik
2020-03-05 19:55:07 +03:00
parent 426f498e87
commit bfa371ea73
2 changed files with 22 additions and 9 deletions
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.cast
interface TowerScopeLevel { interface TowerScopeLevel {
sealed class Token<out T : AbstractFirBasedSymbol<*>> { sealed class Token<out T : AbstractFirBasedSymbol<*>> {
object Properties : Token<FirPropertySymbol>() object Properties : Token<FirVariableSymbol<*>>()
object Functions : Token<FirFunctionSymbol<*>>() object Functions : Token<FirFunctionSymbol<*>>()
object Objects : Token<AbstractFirBasedSymbol<*>>() object Objects : Token<AbstractFirBasedSymbol<*>>()
@@ -121,17 +121,30 @@ class MemberScopeTowerLevel(
return ProcessorAction.NEXT return ProcessorAction.NEXT
} }
return when (token) { return when (token) {
TowerScopeLevel.Token.Properties -> processMembers(processor) { symbol -> is TowerScopeLevel.Token.Properties -> processMembers(processor) { consumer ->
this.processPropertiesByName(name, symbol.cast()) this.processPropertiesByName(name) {
// WARNING, DO NOT CAST FUNCTIONAL TYPE ITSELF
@Suppress("UNCHECKED_CAST")
consumer(it as T)
}
} }
TowerScopeLevel.Token.Functions -> processMembers(processor) { symbol -> TowerScopeLevel.Token.Functions -> processMembers(processor) { consumer ->
this.processFunctionsAndConstructorsByName( this.processFunctionsAndConstructorsByName(
name, session, bodyResolveComponents, name, session, bodyResolveComponents,
noInnerConstructors = false, processor = symbol.cast() noInnerConstructors = false,
processor = {
// WARNING, DO NOT CAST FUNCTIONAL TYPE ITSELF
@Suppress("UNCHECKED_CAST")
consumer(it as T)
}
) )
} }
TowerScopeLevel.Token.Objects -> processMembers(processor) { symbol -> TowerScopeLevel.Token.Objects -> processMembers(processor) { consumer ->
this.processClassifiersByName(name, symbol.cast()) this.processClassifiersByName(name) {
// WARNING, DO NOT CAST FUNCTIONAL TYPE ITSELF
@Suppress("UNCHECKED_CAST")
consumer(it as T)
}
} }
} }
} }
@@ -55,11 +55,11 @@ abstract class FirAbstractImportingScope(
when (token) { when (token) {
TowerScopeLevel.Token.Functions -> scope.processFunctionsByName( TowerScopeLevel.Token.Functions -> scope.processFunctionsByName(
callableId.callableName, callableId.callableName,
processor.cast() processor
) )
TowerScopeLevel.Token.Properties -> scope.processPropertiesByName( TowerScopeLevel.Token.Properties -> scope.processPropertiesByName(
callableId.callableName, callableId.callableName,
processor.cast() processor
) )
} }
} else if (name.isSpecial || name.identifier.isNotEmpty()) { } else if (name.isSpecial || name.identifier.isNotEmpty()) {