From 97759f5bb74b8bb3d986f84cdc50d5819e8ab265 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Wed, 15 Jan 2014 15:53:37 +0400 Subject: [PATCH] Add method for getting all classifiers with given name from the scope --- .../descriptors/DeserializedMemberScope.java | 7 +++++++ .../jet/lang/resolve/lazy/LazyImportScope.java | 6 ++++++ .../descriptors/AbstractLazyMemberScope.java | 18 ++++++++++++------ .../resolve/scopes/AbstractScopeAdapter.java | 6 ++++++ .../jet/lang/resolve/scopes/ChainedScope.java | 6 ++++++ .../lang/resolve/scopes/FilteringScope.java | 6 ++++++ .../jet/lang/resolve/scopes/JetScope.java | 4 ++++ .../jet/lang/resolve/scopes/JetScopeImpl.java | 6 ++++++ .../resolve/scopes/JetScopeSelectorUtil.java | 9 +++++++++ .../lang/resolve/scopes/SubstitutingScope.java | 6 ++++++ .../jetbrains/jet/lang/types/ErrorUtils.java | 13 +++++++++++++ 11 files changed, 81 insertions(+), 6 deletions(-) diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedMemberScope.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedMemberScope.java index 32bd5862579..541ebdd97b9 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedMemberScope.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedMemberScope.java @@ -160,6 +160,13 @@ public abstract class DeserializedMemberScope implements JetScope { return getClassDescriptor(name); } + @NotNull + @Override + public final Collection getClassifiers(@NotNull Name name) { + ClassifierDescriptor classifier = getClassifier(name); + return classifier != null ? Collections.singleton(classifier) : Collections.emptyList(); + } + @Nullable protected abstract ClassifierDescriptor getClassDescriptor(@NotNull Name name); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyImportScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyImportScope.java index a5bcc6ae95a..c7d2f33ea2f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyImportScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyImportScope.java @@ -244,6 +244,12 @@ public class LazyImportScope implements JetScope { return selectFirstFromImports(name, LookupMode.ONLY_CLASSES, JetScopeSelectorUtil.CLASSIFIER_DESCRIPTOR_SCOPE_SELECTOR); } + @NotNull + @Override + public Collection getClassifiers(@NotNull Name name) { + return collectFromImports(name, LookupMode.ONLY_CLASSES, JetScopeSelectorUtil.NAMED_CLASSIFIERS_SCOPE_SELECTOR); + } + @Nullable @Override public PackageViewDescriptor getPackage(@NotNull Name name) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java index 3e1e4fb9195..283af14f1f6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java @@ -46,7 +46,7 @@ public abstract class AbstractLazyMemberScope> classDescriptors; + private final MemoizedFunctionToNotNull> classDescriptors; private final MemoizedFunctionToNotNull> functionDescriptors; private final MemoizedFunctionToNotNull> propertyDescriptors; @@ -63,9 +63,9 @@ public abstract class AbstractLazyMemberScope>() { + this.classDescriptors = storageManager.createMemoizedFunction(new Function1>() { @Override - public List invoke(Name name) { + public List invoke(Name name) { return resolveClassDescriptor(name); } }); @@ -92,12 +92,12 @@ public abstract class AbstractLazyMemberScope resolveClassDescriptor(@NotNull final Name name) { + private List resolveClassDescriptor(@NotNull final Name name) { Collection classOrObjectDeclarations = declarationProvider.getClassOrObjectDeclarations(name); - return ContainerUtil.mapNotNull(classOrObjectDeclarations, new Function() { + return ContainerUtil.mapNotNull(classOrObjectDeclarations, new Function() { @Override - public ClassDescriptor fun(JetClassOrObject classOrObject) { + public ClassifierDescriptor fun(JetClassOrObject classOrObject) { return new LazyClassDescriptor(resolveSession, thisDescriptor, name, JetClassInfoUtil.createClassLikeInfo(classOrObject)); } }); @@ -108,6 +108,12 @@ public abstract class AbstractLazyMemberScope getClassifiers(@NotNull Name name) { + return classDescriptors.invoke(name); + } + private static T first(@NotNull List list) { if (list.isEmpty()) return null; return list.get(0); diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/AbstractScopeAdapter.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/AbstractScopeAdapter.java index 70b6fa454b4..3413362df54 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/AbstractScopeAdapter.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/AbstractScopeAdapter.java @@ -55,6 +55,12 @@ public abstract class AbstractScopeAdapter implements JetScope { return getWorkerScope().getClassifier(name); } + @NotNull + @Override + public Collection getClassifiers(@NotNull Name name) { + return getWorkerScope().getClassifiers(name); + } + @NotNull @Override public Collection getProperties(@NotNull Name name) { diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/ChainedScope.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/ChainedScope.java index e2fc24549f3..37967a438c5 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/ChainedScope.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/ChainedScope.java @@ -51,6 +51,12 @@ public class ChainedScope implements JetScope { return getFirstMatch(scopeChain, name, CLASSIFIER_DESCRIPTOR_SCOPE_SELECTOR); } + @NotNull + @Override + public Collection getClassifiers(@NotNull Name name) { + return getFromAllScopes(scopeChain, name, NAMED_CLASSIFIERS_SCOPE_SELECTOR); + } + @Override public PackageViewDescriptor getPackage(@NotNull Name name) { return getFirstMatch(scopeChain, name, PACKAGE_SCOPE_SELECTOR); diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/FilteringScope.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/FilteringScope.java index 1b036d4898a..61b40a80f9f 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/FilteringScope.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/FilteringScope.java @@ -66,6 +66,12 @@ public class FilteringScope implements JetScope { return filterDescriptor(workerScope.getClassifier(name)); } + @NotNull + @Override + public Collection getClassifiers(@NotNull Name name) { + return Collections2.filter(workerScope.getClassifiers(name), predicate); + } + @NotNull @Override public Collection getProperties(@NotNull Name name) { diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.java index 85b15eddbbe..11fd21aad5d 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.java @@ -53,6 +53,10 @@ public interface JetScope { @Nullable ClassifierDescriptor getClassifier(@NotNull Name name); + @NotNull + @ReadOnly + Collection getClassifiers(@NotNull Name name); + @Nullable PackageViewDescriptor getPackage(@NotNull Name name); diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeImpl.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeImpl.java index ed9512ff3ea..2cc74e9b032 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeImpl.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeImpl.java @@ -34,6 +34,12 @@ public abstract class JetScopeImpl implements JetScope { return null; } + @NotNull + @Override + public Collection getClassifiers(@NotNull Name name) { + return Collections.emptySet(); + } + @NotNull @Override public Collection getProperties(@NotNull Name name) { diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeSelectorUtil.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeSelectorUtil.java index 4dae9714be6..217b114682f 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeSelectorUtil.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeSelectorUtil.java @@ -112,6 +112,15 @@ public class JetScopeSelectorUtil { } }; + public static final ScopeByNameMultiSelector NAMED_CLASSIFIERS_SCOPE_SELECTOR = + new ScopeByNameMultiSelector() { + @NotNull + @Override + public Collection get(@NotNull JetScope scope, @NotNull Name name) { + return scope.getClassifiers(name); + } + }; + public static final ScopeDescriptorSelector ALL_DESCRIPTORS_SCOPE_SELECTOR = new ScopeDescriptorSelector() { @NotNull diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.java index 9a53bdbbf5d..5f7d74b1baa 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.java @@ -98,6 +98,12 @@ public class SubstitutingScope implements JetScope { return substitute(workerScope.getClassifier(name)); } + @NotNull + @Override + public Collection getClassifiers(@NotNull Name name) { + return substitute(workerScope.getClassifiers(name)); + } + @NotNull @Override public Collection getFunctions(@NotNull Name name) { diff --git a/core/descriptors/src/org/jetbrains/jet/lang/types/ErrorUtils.java b/core/descriptors/src/org/jetbrains/jet/lang/types/ErrorUtils.java index cf3e736b234..5727f463957 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/types/ErrorUtils.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/types/ErrorUtils.java @@ -85,6 +85,12 @@ public class ErrorUtils { return ERROR_CLASS; } + @NotNull + @Override + public Collection getClassifiers(@NotNull Name name) { + return ERROR_CLASSIFIER_GROUP; + } + @NotNull @Override public Set getProperties(@NotNull Name name) { @@ -161,6 +167,12 @@ public class ErrorUtils { throw new IllegalStateException(); } + @NotNull + @Override + public Collection getClassifiers(@NotNull Name name) { + throw new IllegalStateException(); + } + @Nullable @Override public PackageViewDescriptor getPackage(@NotNull Name name) { @@ -254,6 +266,7 @@ public class ErrorUtils { ERROR_PROPERTY_TYPE, CallableMemberDescriptor.Kind.DECLARATION); private static final Set ERROR_PROPERTY_GROUP = Collections.singleton(ERROR_PROPERTY); + private static final Set ERROR_CLASSIFIER_GROUP = Collections.singleton(ERROR_CLASS); @NotNull private static SimpleFunctionDescriptor createErrorFunction(@NotNull ErrorScope ownerScope) {