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 {
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,