[FE] Protect resolution from context receivers calculations
This commit is contained in:
committed by
TeamCityServer
parent
add2ca1d11
commit
083e718efd
+3
@@ -381,6 +381,9 @@ class NewResolutionOldInference(
|
|||||||
override val isNewInferenceEnabled: Boolean
|
override val isNewInferenceEnabled: Boolean
|
||||||
get() = resolutionContext.languageVersionSettings.supportsFeature(LanguageFeature.NewInference)
|
get() = resolutionContext.languageVersionSettings.supportsFeature(LanguageFeature.NewInference)
|
||||||
|
|
||||||
|
override val areContextReceiversEnabled: Boolean
|
||||||
|
get() = resolutionContext.languageVersionSettings.supportsFeature(LanguageFeature.ContextReceivers)
|
||||||
|
|
||||||
override val languageVersionSettings: LanguageVersionSettings
|
override val languageVersionSettings: LanguageVersionSettings
|
||||||
get() = resolutionContext.languageVersionSettings
|
get() = resolutionContext.languageVersionSettings
|
||||||
|
|
||||||
|
|||||||
@@ -394,6 +394,7 @@ class PSICallResolver(
|
|||||||
override val syntheticScopes: SyntheticScopes get() = this@PSICallResolver.syntheticScopes
|
override val syntheticScopes: SyntheticScopes get() = this@PSICallResolver.syntheticScopes
|
||||||
override val isDebuggerContext: Boolean get() = context.isDebuggerContext
|
override val isDebuggerContext: Boolean get() = context.isDebuggerContext
|
||||||
override val isNewInferenceEnabled: Boolean get() = context.languageVersionSettings.supportsFeature(LanguageFeature.NewInference)
|
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 languageVersionSettings: LanguageVersionSettings get() = context.languageVersionSettings
|
||||||
override val lexicalScope: LexicalScope get() = context.scope
|
override val lexicalScope: LexicalScope get() = context.scope
|
||||||
override val typeApproximator: TypeApproximator get() = this@PSICallResolver.typeApproximator
|
override val typeApproximator: TypeApproximator get() = this@PSICallResolver.typeApproximator
|
||||||
|
|||||||
@@ -53,6 +53,8 @@ interface ImplicitScopeTower {
|
|||||||
|
|
||||||
val isNewInferenceEnabled: Boolean
|
val isNewInferenceEnabled: Boolean
|
||||||
|
|
||||||
|
val areContextReceiversEnabled: Boolean
|
||||||
|
|
||||||
val languageVersionSettings: LanguageVersionSettings
|
val languageVersionSettings: LanguageVersionSettings
|
||||||
|
|
||||||
val typeApproximator: TypeApproximator
|
val typeApproximator: TypeApproximator
|
||||||
|
|||||||
@@ -173,7 +173,15 @@ class TowerResolver {
|
|||||||
scope.mayFitForName(name)
|
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 parentScopes = lexicalScope.parentsWithSelf.toList()
|
||||||
|
|
||||||
val contextReceiversGroups = mutableListOf<List<ReceiverValueWithSmartCastInfo>>()
|
val contextReceiversGroups = mutableListOf<List<ReceiverValueWithSmartCastInfo>>()
|
||||||
var firstImportingScopeIndex = 0
|
var firstImportingScopeIndex = 0
|
||||||
for ((i, scope) in parentScopes.withIndex()) {
|
for ((i, scope) in parentScopes.withIndex()) {
|
||||||
@@ -224,18 +232,20 @@ class TowerResolver {
|
|||||||
val contextReceiversGroups = mutableListOf<List<ReceiverValueWithSmartCastInfo>>()
|
val contextReceiversGroups = mutableListOf<List<ReceiverValueWithSmartCastInfo>>()
|
||||||
|
|
||||||
fun processLexicalScope(scope: LexicalScope, resolveExtensionsForImplicitReceiver: Boolean): Collection<C>? {
|
fun processLexicalScope(scope: LexicalScope, resolveExtensionsForImplicitReceiver: Boolean): Collection<C>? {
|
||||||
val contextReceiversGroup = implicitScopeTower.getContextReceivers(scope)
|
if (implicitScopeTower.areContextReceiversEnabled) {
|
||||||
if (contextReceiversGroup.isNotEmpty()) {
|
val contextReceiversGroup = implicitScopeTower.getContextReceivers(scope)
|
||||||
contextReceiversGroups.add(contextReceiversGroup)
|
if (contextReceiversGroup.isNotEmpty()) {
|
||||||
|
contextReceiversGroups.add(contextReceiversGroup)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!scope.kind.withLocalDescriptors) {
|
if (!scope.kind.withLocalDescriptors) {
|
||||||
TowerData.TowerLevel(ScopeBasedTowerLevel(implicitScopeTower, scope))
|
TowerData.TowerLevel(ScopeBasedTowerLevel(implicitScopeTower, scope))
|
||||||
.process(scope.mayFitForName(name))?.let { return it }
|
.process(scope.mayFitForName(name))?.let { return it }
|
||||||
}
|
}
|
||||||
implicitScopeTower.getImplicitReceiver(scope)?.let { rv ->
|
implicitScopeTower.getImplicitReceiver(scope)
|
||||||
processImplicitReceiver(rv, resolveExtensionsForImplicitReceiver)?.let { return it }
|
?.let { processImplicitReceiver(it, resolveExtensionsForImplicitReceiver) }
|
||||||
}
|
?.let { return it }
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,6 +271,16 @@ class TowerResolver {
|
|||||||
scopes: Sequence<HierarchicalScope>,
|
scopes: Sequence<HierarchicalScope>,
|
||||||
resolveExtensionsForImplicitReceiver: (HierarchicalScope) -> Boolean
|
resolveExtensionsForImplicitReceiver: (HierarchicalScope) -> Boolean
|
||||||
): Collection<C>? {
|
): 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
|
var firstImportingScopePassed = false
|
||||||
for (scope in scopes) {
|
for (scope in scopes) {
|
||||||
if (scope is LexicalScope) {
|
if (scope is LexicalScope) {
|
||||||
|
|||||||
Reference in New Issue
Block a user