From 4d229144cf370c5f547a71e7f2d310aa5803c467 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Sat, 16 Jun 2012 06:44:15 +0400 Subject: [PATCH] smarter WritableScopeImpl.getAllDescriptors --- .../resolve/scopes/WritableScopeImpl.java | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeImpl.java index d2f2b18ed81..fb0d02d18c2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeImpl.java @@ -124,21 +124,49 @@ public class WritableScopeImpl extends WritableScopeWithImports { super.clearImports(); } + @NotNull + private Collection getInheritedDescriptors(@NotNull DescriptorPredicate predicate) { + Collection r = Lists.newArrayList(); + r.addAll(getWorkerScope().getAllDescriptors(predicate)); + for (JetScope imported : getImports()) { + r.addAll(imported.getAllDescriptors(predicate)); + } + return r; + } + + @NotNull + private static Collection concat(@NotNull Collection c1, @NotNull Collection c2) { + if (c1.isEmpty()) { + return c2; + } + else if (c2.isEmpty()) { + return c1; + } + else { + Collection r = Lists.newArrayListWithCapacity(c1.size() + c2.size()); + r.addAll(c1); + r.addAll(c2); + return r; + } + } + @NotNull @Override public Collection getAllDescriptors(@NotNull DescriptorPredicate predicate) { checkMayRead(); if (!allDescriptorsDone) { + if (!predicate.includeAll()) { + // super-optimized version + return concat(allDescriptors, getInheritedDescriptors(predicate)); + } + allDescriptorsDone = true; // make sure no descriptors added to allDescriptors collection changeLockLevel(LockLevel.READING); - allDescriptors.addAll(getWorkerScope().getAllDescriptors(DescriptorPredicate.all())); - for (JetScope imported : getImports()) { - allDescriptors.addAll(imported.getAllDescriptors(DescriptorPredicate.all())); - } + allDescriptors.addAll(getInheritedDescriptors(DescriptorPredicate.all())); } return DescriptorPredicateUtils.filter(allDescriptors, predicate); }