FIR: optimize creation of scope by implicit receiver

This commit is contained in:
Mikhail Glukhikh
2019-08-21 17:27:59 +03:00
parent 9c3821ddba
commit 23f662cfe2
2 changed files with 6 additions and 2 deletions
@@ -19,6 +19,9 @@ import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl
interface ReceiverValue { interface ReceiverValue {
val type: ConeKotlinType val type: ConeKotlinType
fun scope(useSiteSession: FirSession, scopeSession: ScopeSession): FirScope? =
type.scope(useSiteSession, scopeSession)
} }
class ClassDispatchReceiverValue(val klassSymbol: FirClassSymbol) : ReceiverValue { class ClassDispatchReceiverValue(val klassSymbol: FirClassSymbol) : ReceiverValue {
@@ -44,6 +47,8 @@ abstract class ImplicitReceiverValue(
scopeSession: ScopeSession scopeSession: ScopeSession
) : ReceiverValue { ) : ReceiverValue {
val implicitScope: FirScope? = type.scope(useSiteSession, scopeSession) val implicitScope: FirScope? = type.scope(useSiteSession, scopeSession)
override fun scope(useSiteSession: FirSession, scopeSession: ScopeSession): FirScope? = implicitScope
} }
class ImplicitDispatchReceiverValue( class ImplicitDispatchReceiverValue(
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.scope
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorWithJump import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorWithJump
import org.jetbrains.kotlin.fir.scopes.FirPosition import org.jetbrains.kotlin.fir.scopes.FirPosition
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
@@ -101,7 +100,7 @@ class MemberScopeTowerLevel(
): ProcessorAction { ): ProcessorAction {
if (implicitExtensionReceiver != null && explicitExtensionReceiver != null) return ProcessorAction.NEXT if (implicitExtensionReceiver != null && explicitExtensionReceiver != null) return ProcessorAction.NEXT
val extensionReceiver = implicitExtensionReceiver ?: explicitExtensionReceiver val extensionReceiver = implicitExtensionReceiver ?: explicitExtensionReceiver
val scope = dispatchReceiver.type.scope(session, scopeSession) ?: return ProcessorAction.NEXT val scope = dispatchReceiver.scope(session, scopeSession) ?: return ProcessorAction.NEXT
if (scope.processScopeMembers { candidate -> if (scope.processScopeMembers { candidate ->
if (candidate is FirCallableSymbol<*> && candidate.hasConsistentExtensionReceiver(extensionReceiver)) { if (candidate is FirCallableSymbol<*> && candidate.hasConsistentExtensionReceiver(extensionReceiver)) {
// NB: we do not check dispatchReceiverValue != null here, // NB: we do not check dispatchReceiverValue != null here,