From 6e766634c15ae98c3add8c7b752b1e324780da0a Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 15 Aug 2017 18:48:22 +0700 Subject: [PATCH] Add location parameter to ResolutionScope::definitelyDoesNotContainName It should be used to record lookups in case of fast paths in resolution --- .../jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt | 7 ++++--- .../jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt | 2 +- .../src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt | 5 +++-- .../kotlin/resolve/scopes/InnerClassesScopeWrapper.kt | 2 +- .../org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt | 2 +- .../jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt | 2 +- .../src/org/jetbrains/kotlin/types/ErrorUtils.java | 4 ++-- .../deserialization/MetadataPackageFragmentProvider.kt | 3 ++- 8 files changed, 15 insertions(+), 12 deletions(-) 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 83c9f7ab97c..9b135248bdd 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 @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.resolve.calls.tower +import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind @@ -131,7 +132,7 @@ class TowerResolver { val localLevels = lexicalScope.parentsWithSelf. - filterIsInstance().filter { it.kind.withLocalDescriptors && it.mayFitForName(name) }. + filterIsInstance().filter { it.kind.withLocalDescriptors && it.mayFitForName(name, location) }. map { ScopeBasedTowerLevel(this@run, it) }.toList() // local non-extensions or extension for explicit receiver @@ -186,8 +187,8 @@ class TowerResolver { return resultCollector.getFinalCandidates() } - private fun ResolutionScope.mayFitForName(name: Name) = - !definitelyDoesNotContainName(name) || !definitelyDoesNotContainName(OperatorNameConventions.INVOKE) + private fun ResolutionScope.mayFitForName(name: Name, location: LookupLocation) = + !definitelyDoesNotContainName(name, location) || !definitelyDoesNotContainName(OperatorNameConventions.INVOKE, location) fun runWithEmptyTowerData( processor: ScopeTowerProcessor, diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt index f2e67b63155..d0955181caf 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt @@ -125,6 +125,6 @@ abstract class LexicalScopeStorage( return result } - override fun definitelyDoesNotContainName(name: Name) = + override fun definitelyDoesNotContainName(name: Name, location: LookupLocation) = functionsByName?.get(name) == null && variablesAndClassifiersByName?.get(name) == null } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt index a4f04b0e0b1..abe76348ff5 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt @@ -55,7 +55,7 @@ interface LexicalScope : HierarchicalScope { override val kind: LexicalScopeKind get() = LexicalScopeKind.EMPTY - override fun definitelyDoesNotContainName(name: Name) = true + override fun definitelyDoesNotContainName(name: Name, location: LookupLocation) = true override fun printStructure(p: Printer) { p.println("Base lexical scope with owner = $ownerDescriptor and parent = $parent") @@ -128,8 +128,9 @@ interface ImportingScope : HierarchicalScope { p.println("ImportingScope.Empty") } - override fun definitelyDoesNotContainName(name: Name) = true override fun computeImportedNames() = emptySet() + + override fun definitelyDoesNotContainName(name: Name, location: LookupLocation) = true } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt index 10f0011be3d..e9bec2bbe08 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt @@ -44,7 +44,7 @@ class InnerClassesScopeWrapper(val workerScope: MemberScope) : MemberScopeImpl() override fun getVariableNames() = workerScope.getVariableNames() override fun getClassifierNames() = workerScope.getClassifierNames() - override fun definitelyDoesNotContainName(name: Name) = workerScope.definitelyDoesNotContainName(name) + override fun definitelyDoesNotContainName(name: Name, location: LookupLocation) = workerScope.definitelyDoesNotContainName(name, location) override fun toString() = "Classes from $workerScope" } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt index c5e993f1532..8540d49894f 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt @@ -40,5 +40,5 @@ interface ResolutionScope { nameFilter: (Name) -> Boolean = MemberScope.ALL_NAME_FILTER ): Collection - fun definitelyDoesNotContainName(name: Name): Boolean = false + fun definitelyDoesNotContainName(name: Name, location: LookupLocation): Boolean = false } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt index d4cae2f38cb..f4e94ab06d7 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt @@ -83,7 +83,7 @@ class SubstitutingScope(private val workerScope: MemberScope, givenSubstitutor: override fun getVariableNames() = workerScope.getVariableNames() override fun getClassifierNames() = workerScope.getClassifierNames() - override fun definitelyDoesNotContainName(name: Name) = workerScope.definitelyDoesNotContainName(name) + override fun definitelyDoesNotContainName(name: Name, location: LookupLocation) = workerScope.definitelyDoesNotContainName(name, location) override fun printScopeStructure(p: Printer) { p.println(this::class.java.simpleName, " {") diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java index 5edb0059cc1..6dc861785bd 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java @@ -226,7 +226,7 @@ public class ErrorUtils { } @Override - public boolean definitelyDoesNotContainName(@NotNull Name name) { + public boolean definitelyDoesNotContainName(@NotNull Name name, @NotNull LookupLocation location) { return false; } @@ -296,7 +296,7 @@ public class ErrorUtils { } @Override - public boolean definitelyDoesNotContainName(@NotNull Name name) { + public boolean definitelyDoesNotContainName(@NotNull Name name, @NotNull LookupLocation location) { return false; } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt index f473c75eeaf..fbe1e3b3e71 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.descriptors.PackagePartProvider import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.descriptors.deserialization.AdditionalClassPartsProvider import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentDeclarationFilter +import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName @@ -106,7 +107,7 @@ class MetadataPackageFragment( containerSource = null, components = components, classNames = { emptyList() } ) { override fun hasClass(name: Name): Boolean = hasTopLevelClass(name) - override fun definitelyDoesNotContainName(name: Name) = false + override fun definitelyDoesNotContainName(name: Name, location: LookupLocation) = false override fun getClassifierNames(): Set? = null })