diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolutionOldInference.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolutionOldInference.kt index c77c915b6f1..04c6335af46 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolutionOldInference.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolutionOldInference.kt @@ -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 diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt index 29ffa2eabb9..c56fac85fa6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt @@ -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 diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/ImplicitScopeTower.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/ImplicitScopeTower.kt index 95fb5b712e9..67f0a02a25e 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/ImplicitScopeTower.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/ImplicitScopeTower.kt @@ -53,6 +53,8 @@ interface ImplicitScopeTower { val isNewInferenceEnabled: Boolean + val areContextReceiversEnabled: Boolean + val languageVersionSettings: LanguageVersionSettings val typeApproximator: TypeApproximator diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt index 8fbce129828..17922c544d8 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt @@ -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>() var firstImportingScopeIndex = 0 for ((i, scope) in parentScopes.withIndex()) { @@ -224,18 +232,20 @@ class TowerResolver { val contextReceiversGroups = mutableListOf>() fun processLexicalScope(scope: LexicalScope, resolveExtensionsForImplicitReceiver: Boolean): Collection? { - 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, resolveExtensionsForImplicitReceiver: (HierarchicalScope) -> Boolean ): Collection? { + 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) {