Make FirTowerLevel an abstract class

This commit is contained in:
Mikhail Glukhikh
2020-12-09 22:14:49 +03:00
parent 34d7a7c184
commit 6d545fc281
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.util.OperatorNameConventions
interface TowerScopeLevel { abstract class TowerScopeLevel {
sealed class Token<out T : AbstractFirBasedSymbol<*>> { sealed class Token<out T : AbstractFirBasedSymbol<*>> {
object Properties : Token<FirVariableSymbol<*>>() object Properties : Token<FirVariableSymbol<*>>()
@@ -31,11 +31,11 @@ interface TowerScopeLevel {
object Objects : Token<AbstractFirBasedSymbol<*>>() object Objects : Token<AbstractFirBasedSymbol<*>>()
} }
fun processFunctionsByName(name: Name, processor: TowerScopeLevelProcessor<FirFunctionSymbol<*>>): ProcessorAction abstract fun processFunctionsByName(name: Name, processor: TowerScopeLevelProcessor<FirFunctionSymbol<*>>): ProcessorAction
fun processPropertiesByName(name: Name, processor: TowerScopeLevelProcessor<FirVariableSymbol<*>>): ProcessorAction abstract fun processPropertiesByName(name: Name, processor: TowerScopeLevelProcessor<FirVariableSymbol<*>>): ProcessorAction
fun processObjectsByName(name: Name, processor: TowerScopeLevelProcessor<AbstractFirBasedSymbol<*>>): ProcessorAction abstract fun processObjectsByName(name: Name, processor: TowerScopeLevelProcessor<AbstractFirBasedSymbol<*>>): ProcessorAction
interface TowerScopeLevelProcessor<in T : AbstractFirBasedSymbol<*>> { interface TowerScopeLevelProcessor<in T : AbstractFirBasedSymbol<*>> {
fun consumeCandidate( fun consumeCandidate(
@@ -48,7 +48,7 @@ interface TowerScopeLevel {
} }
} }
abstract class SessionBasedTowerLevel(val session: FirSession) : TowerScopeLevel { abstract class SessionBasedTowerLevel(val session: FirSession) : TowerScopeLevel() {
protected fun FirCallableSymbol<*>.hasConsistentExtensionReceiver(extensionReceiver: Receiver?): Boolean { protected fun FirCallableSymbol<*>.hasConsistentExtensionReceiver(extensionReceiver: Receiver?): Boolean {
return (extensionReceiver != null) == hasExtensionReceiver() return (extensionReceiver != null) == hasExtensionReceiver()
} }
@@ -71,7 +71,7 @@ class MemberScopeTowerLevel(
private val scopeSession: ScopeSession private val scopeSession: ScopeSession
) : SessionBasedTowerLevel(session) { ) : SessionBasedTowerLevel(session) {
private fun <T : AbstractFirBasedSymbol<*>> processMembers( private fun <T : AbstractFirBasedSymbol<*>> processMembers(
output: TowerScopeLevel.TowerScopeLevelProcessor<T>, output: TowerScopeLevelProcessor<T>,
processScopeMembers: FirScope.(processor: (T) -> Unit) -> Unit processScopeMembers: FirScope.(processor: (T) -> Unit) -> Unit
): ProcessorAction { ): ProcessorAction {
var empty = true var empty = true
@@ -117,7 +117,7 @@ class MemberScopeTowerLevel(
override fun processFunctionsByName( override fun processFunctionsByName(
name: Name, name: Name,
processor: TowerScopeLevel.TowerScopeLevelProcessor<FirFunctionSymbol<*>> processor: TowerScopeLevelProcessor<FirFunctionSymbol<*>>
): ProcessorAction { ): ProcessorAction {
val isInvoke = name == OperatorNameConventions.INVOKE val isInvoke = name == OperatorNameConventions.INVOKE
if (implicitExtensionInvokeMode && !isInvoke) { if (implicitExtensionInvokeMode && !isInvoke) {
@@ -138,7 +138,7 @@ class MemberScopeTowerLevel(
override fun processPropertiesByName( override fun processPropertiesByName(
name: Name, name: Name,
processor: TowerScopeLevel.TowerScopeLevelProcessor<FirVariableSymbol<*>> processor: TowerScopeLevelProcessor<FirVariableSymbol<*>>
): ProcessorAction { ): ProcessorAction {
return processMembers(processor) { consumer -> return processMembers(processor) { consumer ->
this.processPropertiesByName(name) { this.processPropertiesByName(name) {
@@ -151,7 +151,7 @@ class MemberScopeTowerLevel(
override fun processObjectsByName( override fun processObjectsByName(
name: Name, name: Name,
processor: TowerScopeLevel.TowerScopeLevelProcessor<AbstractFirBasedSymbol<*>> processor: TowerScopeLevelProcessor<AbstractFirBasedSymbol<*>>
): ProcessorAction { ): ProcessorAction {
return ProcessorAction.NEXT return ProcessorAction.NEXT
} }
@@ -217,7 +217,7 @@ class ScopeTowerLevel(
private fun <T : AbstractFirBasedSymbol<*>> consumeCallableCandidate( private fun <T : AbstractFirBasedSymbol<*>> consumeCallableCandidate(
candidate: FirCallableSymbol<*>, candidate: FirCallableSymbol<*>,
processor: TowerScopeLevel.TowerScopeLevelProcessor<T> processor: TowerScopeLevelProcessor<T>
) { ) {
if (candidate.hasConsistentReceivers(extensionReceiver)) { if (candidate.hasConsistentReceivers(extensionReceiver)) {
val dispatchReceiverValue = dispatchReceiverValue(candidate) val dispatchReceiverValue = dispatchReceiverValue(candidate)
@@ -233,7 +233,7 @@ class ScopeTowerLevel(
override fun processFunctionsByName( override fun processFunctionsByName(
name: Name, name: Name,
processor: TowerScopeLevel.TowerScopeLevelProcessor<FirFunctionSymbol<*>> processor: TowerScopeLevelProcessor<FirFunctionSymbol<*>>
): ProcessorAction { ): ProcessorAction {
var empty = true var empty = true
scope.processFunctionsAndConstructorsByName( scope.processFunctionsAndConstructorsByName(
@@ -250,7 +250,7 @@ class ScopeTowerLevel(
override fun processPropertiesByName( override fun processPropertiesByName(
name: Name, name: Name,
processor: TowerScopeLevel.TowerScopeLevelProcessor<FirVariableSymbol<*>> processor: TowerScopeLevelProcessor<FirVariableSymbol<*>>
): ProcessorAction { ): ProcessorAction {
var empty = true var empty = true
scope.processPropertiesByName(name) { candidate -> scope.processPropertiesByName(name) { candidate ->
@@ -262,7 +262,7 @@ class ScopeTowerLevel(
override fun processObjectsByName( override fun processObjectsByName(
name: Name, name: Name,
processor: TowerScopeLevel.TowerScopeLevelProcessor<AbstractFirBasedSymbol<*>> processor: TowerScopeLevelProcessor<AbstractFirBasedSymbol<*>>
): ProcessorAction { ): ProcessorAction {
var empty = true var empty = true
scope.processClassifiersByName(name) { scope.processClassifiersByName(name) {