FIR: optimize creation of scope by implicit receiver
This commit is contained in:
@@ -19,6 +19,9 @@ import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl
|
||||
|
||||
interface ReceiverValue {
|
||||
val type: ConeKotlinType
|
||||
|
||||
fun scope(useSiteSession: FirSession, scopeSession: ScopeSession): FirScope? =
|
||||
type.scope(useSiteSession, scopeSession)
|
||||
}
|
||||
|
||||
class ClassDispatchReceiverValue(val klassSymbol: FirClassSymbol) : ReceiverValue {
|
||||
@@ -44,6 +47,8 @@ abstract class ImplicitReceiverValue(
|
||||
scopeSession: ScopeSession
|
||||
) : ReceiverValue {
|
||||
val implicitScope: FirScope? = type.scope(useSiteSession, scopeSession)
|
||||
|
||||
override fun scope(useSiteSession: FirSession, scopeSession: ScopeSession): FirScope? = implicitScope
|
||||
}
|
||||
|
||||
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.resolve.FirSymbolProvider
|
||||
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.scopes.FirPosition
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
@@ -101,7 +100,7 @@ class MemberScopeTowerLevel(
|
||||
): ProcessorAction {
|
||||
if (implicitExtensionReceiver != null && explicitExtensionReceiver != null) return ProcessorAction.NEXT
|
||||
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 (candidate is FirCallableSymbol<*> && candidate.hasConsistentExtensionReceiver(extensionReceiver)) {
|
||||
// NB: we do not check dispatchReceiverValue != null here,
|
||||
|
||||
Reference in New Issue
Block a user