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 {
|
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,
|
||||||
|
|||||||
Reference in New Issue
Block a user