From 94356e891b957dd46da3aa8ff5c6461e9b513a2d Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 15 Aug 2017 12:27:21 +0700 Subject: [PATCH] Introduce ResolutionScope::definitelyDoesNotContainName Also add some obvious implementations This method might be used in resolution to filter out inapplicable scopes --- .../kotlin/resolve/scopes/LexicalScopeStorage.kt | 3 +++ .../src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt | 4 ++++ .../kotlin/resolve/scopes/InnerClassesScopeWrapper.kt | 2 ++ .../jetbrains/kotlin/resolve/scopes/ResolutionScope.kt | 7 ++++++- .../kotlin/resolve/scopes/SubstitutingScope.kt | 2 ++ .../src/org/jetbrains/kotlin/types/ErrorUtils.java | 10 ++++++++++ .../deserialization/MetadataPackageFragmentProvider.kt | 1 + 7 files changed, 28 insertions(+), 1 deletion(-) 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 c4102719b4c..f2e67b63155 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt @@ -124,4 +124,7 @@ abstract class LexicalScopeStorage( } while (rest != null) return result } + + override fun definitelyDoesNotContainName(name: Name) = + 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 2c4ed9ece15..dbeae8096ee 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt @@ -55,6 +55,8 @@ interface LexicalScope : HierarchicalScope { override val kind: LexicalScopeKind get() = LexicalScopeKind.EMPTY + override fun definitelyDoesNotContainName(name: Name) = true + override fun printStructure(p: Printer) { p.println("Base lexical scope with owner = $ownerDescriptor and parent = $parent") } @@ -123,6 +125,8 @@ interface ImportingScope : HierarchicalScope { override fun printStructure(p: Printer) { p.println("ImportingScope.Empty") } + + override fun definitelyDoesNotContainName(name: Name) = 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 23f5fcc7c6a..c0add4fc0dc 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt @@ -40,5 +40,7 @@ class InnerClassesScopeWrapper(val workerScope: MemberScope) : MemberScopeImpl() workerScope.printScopeStructure(p) } + override fun definitelyDoesNotContainName(name: Name) = workerScope.definitelyDoesNotContainName(name) + 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 8c7fcf3f24d..c5e993f1532 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt @@ -16,7 +16,10 @@ package org.jetbrains.kotlin.resolve.scopes -import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.ClassifierDescriptor +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.name.Name @@ -36,4 +39,6 @@ interface ResolutionScope { kindFilter: DescriptorKindFilter = DescriptorKindFilter.ALL, nameFilter: (Name) -> Boolean = MemberScope.ALL_NAME_FILTER ): Collection + + fun definitelyDoesNotContainName(name: Name): 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 83de7362900..28ede538058 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt @@ -82,6 +82,8 @@ class SubstitutingScope(private val workerScope: MemberScope, givenSubstitutor: override fun getFunctionNames() = workerScope.getFunctionNames() override fun getVariableNames() = workerScope.getVariableNames() + override fun definitelyDoesNotContainName(name: Name) = workerScope.definitelyDoesNotContainName(name) + override fun printScopeStructure(p: Printer) { p.println(this::class.java.simpleName, " {") p.pushIndent() diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java index a6d3856fae6..a80682a6186 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java @@ -219,6 +219,11 @@ public class ErrorUtils { return Collections.emptyList(); } + @Override + public boolean definitelyDoesNotContainName(@NotNull Name name) { + return false; + } + @Override public String toString() { return "ErrorScope{" + debugMessage + '}'; @@ -279,6 +284,11 @@ public class ErrorUtils { throw new IllegalStateException(); } + @Override + public boolean definitelyDoesNotContainName(@NotNull Name name) { + return false; + } + @Override public String toString() { return "ThrowingScope{" + debugMessage + '}'; 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 71ee450c4e8..e0aff441439 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt @@ -106,6 +106,7 @@ class MetadataPackageFragment( containerSource = null, components = components, classNames = { emptyList() } ) { override fun hasClass(name: Name): Boolean = hasTopLevelClass(name) + override fun definitelyDoesNotContainName(name: Name) = false }) return ChainedMemberScope.create("Metadata scope", scopes)