[FE] Protect resolution from context receivers calculations

This commit is contained in:
Anastasiya Shadrina
2021-10-22 01:50:54 +07:00
committed by TeamCityServer
parent add2ca1d11
commit 083e718efd
4 changed files with 32 additions and 6 deletions
@@ -381,6 +381,9 @@ class NewResolutionOldInference(
override val isNewInferenceEnabled: Boolean
get() = resolutionContext.languageVersionSettings.supportsFeature(LanguageFeature.NewInference)
override val areContextReceiversEnabled: Boolean
get() = resolutionContext.languageVersionSettings.supportsFeature(LanguageFeature.ContextReceivers)
override val languageVersionSettings: LanguageVersionSettings
get() = resolutionContext.languageVersionSettings
@@ -394,6 +394,7 @@ class PSICallResolver(
override val syntheticScopes: SyntheticScopes get() = this@PSICallResolver.syntheticScopes
override val isDebuggerContext: Boolean get() = context.isDebuggerContext
override val isNewInferenceEnabled: Boolean get() = context.languageVersionSettings.supportsFeature(LanguageFeature.NewInference)
override val areContextReceiversEnabled: Boolean get() = context.languageVersionSettings.supportsFeature(LanguageFeature.ContextReceivers)
override val languageVersionSettings: LanguageVersionSettings get() = context.languageVersionSettings
override val lexicalScope: LexicalScope get() = context.scope
override val typeApproximator: TypeApproximator get() = this@PSICallResolver.typeApproximator
@@ -53,6 +53,8 @@ interface ImplicitScopeTower {
val isNewInferenceEnabled: Boolean
val areContextReceiversEnabled: Boolean
val languageVersionSettings: LanguageVersionSettings
val typeApproximator: TypeApproximator
@@ -173,7 +173,15 @@ class TowerResolver {
scope.mayFitForName(name)
)
if (!areContextReceiversEnabled) {
lexicalScope.parentsWithSelf.forEach { scope ->
if (scope is LexicalScope) addLevelForLexicalScope(scope) else addLevelForImportingScope(scope)
}
return mainResult
}
val parentScopes = lexicalScope.parentsWithSelf.toList()
val contextReceiversGroups = mutableListOf<List<ReceiverValueWithSmartCastInfo>>()
var firstImportingScopeIndex = 0
for ((i, scope) in parentScopes.withIndex()) {
@@ -224,18 +232,20 @@ class TowerResolver {
val contextReceiversGroups = mutableListOf<List<ReceiverValueWithSmartCastInfo>>()
fun processLexicalScope(scope: LexicalScope, resolveExtensionsForImplicitReceiver: Boolean): Collection<C>? {
val contextReceiversGroup = implicitScopeTower.getContextReceivers(scope)
if (contextReceiversGroup.isNotEmpty()) {
contextReceiversGroups.add(contextReceiversGroup)
if (implicitScopeTower.areContextReceiversEnabled) {
val contextReceiversGroup = implicitScopeTower.getContextReceivers(scope)
if (contextReceiversGroup.isNotEmpty()) {
contextReceiversGroups.add(contextReceiversGroup)
}
}
if (!scope.kind.withLocalDescriptors) {
TowerData.TowerLevel(ScopeBasedTowerLevel(implicitScopeTower, scope))
.process(scope.mayFitForName(name))?.let { return it }
}
implicitScopeTower.getImplicitReceiver(scope)?.let { rv ->
processImplicitReceiver(rv, resolveExtensionsForImplicitReceiver)?.let { return it }
}
implicitScopeTower.getImplicitReceiver(scope)
?.let { processImplicitReceiver(it, resolveExtensionsForImplicitReceiver) }
?.let { return it }
return null
}
@@ -261,6 +271,16 @@ class TowerResolver {
scopes: Sequence<HierarchicalScope>,
resolveExtensionsForImplicitReceiver: (HierarchicalScope) -> Boolean
): Collection<C>? {
if (!implicitScopeTower.areContextReceiversEnabled) {
scopes.forEach { scope ->
if (scope is LexicalScope) {
processLexicalScope(scope, resolveExtensionsForImplicitReceiver(scope))?.let { return it }
} else {
processImportingScope(scope as ImportingScope)?.let { return it }
}
}
return null
}
var firstImportingScopePassed = false
for (scope in scopes) {
if (scope is LexicalScope) {