From a91a99e5be2217ad61f295e76e6d6a5fb63ab66d Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 31 Oct 2012 23:06:57 +0400 Subject: [PATCH] getImplicitReceiverHierarchy() returns a List --- .../jet/cli/jvm/compiler/TipsManager.java | 4 ++-- .../descriptors/MutableClassDescriptor.java | 7 +++--- .../lang/resolve/AbstractScopeAdapter.java | 5 ++-- .../resolve/calls/tasks/TaskPrioritizer.java | 2 +- .../resolve/lazy/AbstractLazyMemberScope.java | 6 +++-- .../jet/lang/resolve/scopes/ChainedScope.java | 13 +++++++--- .../scopes/InnerClassesScopeWrapper.java | 6 +++-- .../jet/lang/resolve/scopes/JetScope.java | 4 ++-- .../jet/lang/resolve/scopes/JetScopeImpl.java | 4 +++- .../lang/resolve/scopes/JetScopeUtils.java | 16 +------------ .../resolve/scopes/SubstitutingScope.java | 3 ++- .../resolve/scopes/WritableScopeImpl.java | 11 ++++----- .../scopes/WritableScopeWithImports.java | 24 ++++++++++++------- .../jetbrains/jet/lang/types/ErrorUtils.java | 4 +++- .../BasicExpressionTypingVisitor.java | 3 +-- .../jet/types/JetTypeCheckerTest.java | 9 ++++--- 16 files changed, 67 insertions(+), 54 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/cli/jvm/compiler/TipsManager.java b/compiler/backend/src/org/jetbrains/jet/cli/jvm/compiler/TipsManager.java index 7801866a8eb..2748f6b6132 100644 --- a/compiler/backend/src/org/jetbrains/jet/cli/jvm/compiler/TipsManager.java +++ b/compiler/backend/src/org/jetbrains/jet/cli/jvm/compiler/TipsManager.java @@ -105,7 +105,7 @@ public final class TipsManager { else { Collection descriptorsSet = Sets.newHashSet(); - List result = JetScopeUtils.getImplicitReceiversHierarchy(resolutionScope); + List result = resolutionScope.getImplicitReceiversHierarchy(); for (ReceiverParameterDescriptor receiverDescriptor : result) { JetType receiverType = receiverDescriptor.getType(); @@ -153,7 +153,7 @@ public final class TipsManager { ) { final Set descriptorsSet = Sets.newHashSet(descriptors); - final List result = JetScopeUtils.getImplicitReceiversHierarchy(scope); + final List result = scope.getImplicitReceiversHierarchy(); descriptorsSet.removeAll( Collections2.filter(JetScopeUtils.getAllExtensions(scope), new Predicate() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java index 19889c05947..7e131e04fed 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java @@ -29,6 +29,7 @@ import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler; import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; +import java.util.Collections; import java.util.List; import java.util.Set; @@ -243,10 +244,10 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite implement return classObjectDescriptor.getDefaultType().getMemberScope(); } + @NotNull @Override - public void getImplicitReceiversHierarchy(@NotNull List result) { - super.getImplicitReceiversHierarchy(result); - result.add(0, classObjectDescriptor.getThisAsReceiverParameter()); + public List getImplicitReceiversHierarchy() { + return Collections.singletonList(classObjectDescriptor.getThisAsReceiverParameter()); } }); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AbstractScopeAdapter.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AbstractScopeAdapter.java index 09c7ed77ac2..54b8cb246b8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AbstractScopeAdapter.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AbstractScopeAdapter.java @@ -34,9 +34,10 @@ public abstract class AbstractScopeAdapter implements JetScope { @NotNull protected abstract JetScope getWorkerScope(); + @NotNull @Override - public void getImplicitReceiversHierarchy(@NotNull List result) { - getWorkerScope().getImplicitReceiversHierarchy(result); + public List getImplicitReceiversHierarchy() { + return getWorkerScope().getImplicitReceiversHierarchy(); } @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TaskPrioritizer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TaskPrioritizer.java index 2e4bb5e21ba..65529d55577 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TaskPrioritizer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TaskPrioritizer.java @@ -226,7 +226,7 @@ public abstract class TaskPrioritizer { private static boolean setImpliedThis(@NotNull JetScope scope, ResolutionCandidate candidate) { ReceiverParameterDescriptor expectedThisObject = candidate.getDescriptor().getExpectedThisObject(); if (!expectedThisObject.exists()) return true; - List receivers = JetScopeUtils.getImplicitReceiversHierarchy(scope); + List receivers = scope.getImplicitReceiversHierarchy(); for (ReceiverParameterDescriptor receiver : receivers) { if (JetTypeChecker.INSTANCE.isSubtypeOf(receiver.getType(), expectedThisObject.getType())) { // TODO : Autocasts & nullability diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyMemberScope.java index 651fea1d55d..96da0b4fa4a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyMemberScope.java @@ -260,12 +260,14 @@ public abstract class AbstractLazyMemberScope result) { + public List getImplicitReceiversHierarchy() { ReceiverParameterDescriptor receiver = getImplicitReceiver(); if (receiver.exists()) { - result.add(receiver); + return Collections.singletonList(receiver); } + return Collections.emptyList(); } @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/ChainedScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/ChainedScope.java index f4a196f0a18..20a37db89c6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/ChainedScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/ChainedScope.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.lang.resolve.scopes; +import com.google.common.collect.Lists; import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.*; @@ -34,6 +35,7 @@ public class ChainedScope implements JetScope { private final DeclarationDescriptor containingDeclaration; private final JetScope[] scopeChain; private Collection allDescriptors; + private List implicitReceiverHierarchy; public ChainedScope(DeclarationDescriptor containingDeclaration, JetScope... scopes) { this.containingDeclaration = containingDeclaration; @@ -114,11 +116,16 @@ public class ChainedScope implements JetScope { return result; } + @NotNull @Override - public void getImplicitReceiversHierarchy(@NotNull List result) { - for (JetScope jetScope : scopeChain) { - jetScope.getImplicitReceiversHierarchy(result); + public List getImplicitReceiversHierarchy() { + if (implicitReceiverHierarchy == null) { + implicitReceiverHierarchy = Lists.newArrayList(); + for (JetScope jetScope : scopeChain) { + implicitReceiverHierarchy.addAll(jetScope.getImplicitReceiversHierarchy()); + } } + return implicitReceiverHierarchy; } @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/InnerClassesScopeWrapper.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/InnerClassesScopeWrapper.java index 9b76a908911..fa7c2c50431 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/InnerClassesScopeWrapper.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/InnerClassesScopeWrapper.java @@ -29,6 +29,7 @@ import org.jetbrains.jet.lang.resolve.name.LabelName; import org.jetbrains.jet.lang.resolve.name.Name; import java.util.Collection; +import java.util.Collections; import java.util.List; /** @@ -82,9 +83,10 @@ public class InnerClassesScopeWrapper extends AbstractScopeAdapter { }); } + @NotNull @Override - public void getImplicitReceiversHierarchy(@NotNull List result) { - // Do nothing + public List getImplicitReceiversHierarchy() { + return Collections.emptyList(); } @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.java index 76f22081de0..13219382e39 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.java @@ -86,9 +86,9 @@ public interface JetScope { /** * Adds receivers to the list in order of locality, so that the closest (the most local) receiver goes first - * @param result */ - void getImplicitReceiversHierarchy(@NotNull List result); + @NotNull + List getImplicitReceiversHierarchy(); @NotNull Collection getOwnDeclaredDescriptors(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeImpl.java index 4c2ff88e85a..e093aaec6d7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeImpl.java @@ -85,8 +85,10 @@ public abstract class JetScopeImpl implements JetScope { return Collections.emptyList(); } + @NotNull @Override - public void getImplicitReceiversHierarchy(@NotNull List result) { + public List getImplicitReceiversHierarchy() { + return Collections.emptyList(); } @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeUtils.java index 63ec8545999..7b53801f5f9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeUtils.java @@ -36,22 +36,8 @@ import java.util.Set; public final class JetScopeUtils { private JetScopeUtils() {} - /** - * Get receivers in order of locality, so that the closest (the most local) receiver goes first - * A wrapper for {@link JetScope#getImplicitReceiversHierarchy(List)} - * - * @param scope Scope for getting receivers hierarchy. - * @return receivers hierarchy. - */ - @NotNull - public static List getImplicitReceiversHierarchy(@NotNull JetScope scope) { - List descriptors = Lists.newArrayList(); - scope.getImplicitReceiversHierarchy(descriptors); - return descriptors; - } - public static List getImplicitReceiversHierarchyValues(@NotNull JetScope scope) { - Collection hierarchy = getImplicitReceiversHierarchy(scope); + Collection hierarchy = scope.getImplicitReceiversHierarchy(); return Lists.newArrayList( Collections2.transform(hierarchy, diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.java index ab532a65a39..c4f7488e184 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.java @@ -118,8 +118,9 @@ public class SubstitutingScope implements JetScope { return workerScope.getNamespace(name); // TODO } + @NotNull @Override - public void getImplicitReceiversHierarchy(@NotNull List result) { + public List getImplicitReceiversHierarchy() { throw new UnsupportedOperationException(); // TODO } 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 ea952e0fd14..f2c59d5118c 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 @@ -462,14 +462,13 @@ public class WritableScopeImpl extends WritableScopeWithImports { } @Override - public void getImplicitReceiversHierarchy(@NotNull List result) { - checkMayRead(); - - super.getImplicitReceiversHierarchy(result); - + protected List computeImplicitReceiversHierarchy() { + List implicitReceiverHierarchy = Lists.newArrayList(); if (implicitReceiver != null && implicitReceiver.exists()) { - result.add(0, implicitReceiver); + implicitReceiverHierarchy.add(implicitReceiver); } + implicitReceiverHierarchy.addAll(super.computeImplicitReceiversHierarchy()); + return implicitReceiverHierarchy; } // @SuppressWarnings({"NullableProblems"}) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeWithImports.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeWithImports.java index d9efb25ab24..8a50115ab6e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeWithImports.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeWithImports.java @@ -16,17 +16,14 @@ package org.jetbrains.jet.lang.resolve.scopes; +import com.google.common.collect.Lists; import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.resolve.name.Name; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Set; +import java.util.*; /** * @author abreslav @@ -40,6 +37,7 @@ public abstract class WritableScopeWithImports extends JetScopeAdapter implement private List imports; private WritableScope currentIndividualImportScope; protected final RedeclarationHandler redeclarationHandler; + private List implicitReceiverHierarchy; public WritableScopeWithImports(@NotNull JetScope scope, @NotNull RedeclarationHandler redeclarationHandler, @NotNull String debugName) { super(scope); @@ -101,17 +99,27 @@ public abstract class WritableScopeWithImports extends JetScopeAdapter implement currentIndividualImportScope = null; } + @NotNull @Override - public void getImplicitReceiversHierarchy(@NotNull List result) { + public List getImplicitReceiversHierarchy() { checkMayRead(); - super.getImplicitReceiversHierarchy(result); + if (implicitReceiverHierarchy == null) { + implicitReceiverHierarchy = computeImplicitReceiversHierarchy(); + } + return implicitReceiverHierarchy; + } + + protected List computeImplicitReceiversHierarchy() { + List implicitReceiverHierarchy = Lists.newArrayList(); // Imported scopes come with their receivers // Example: class member resolution scope imports a scope of it's class object // members of the class object must be able to find it as an implicit receiver for (JetScope scope : getImports()) { - scope.getImplicitReceiversHierarchy(result); + implicitReceiverHierarchy.addAll(scope.getImplicitReceiversHierarchy()); } + implicitReceiverHierarchy.addAll(super.getImplicitReceiversHierarchy()); + return implicitReceiverHierarchy; } @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java index 2dbf6d37ac8..47d96f453c1 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java @@ -76,8 +76,10 @@ public class ErrorUtils { return null; // TODO : review } + @NotNull @Override - public void getImplicitReceiversHierarchy(@NotNull List result) { + public List getImplicitReceiversHierarchy() { + return Collections.emptyList(); } @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java index 56d03813199..4c5ecef567b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java @@ -42,7 +42,6 @@ import org.jetbrains.jet.lang.resolve.constants.StringValue; import org.jetbrains.jet.lang.resolve.name.LabelName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; -import org.jetbrains.jet.lang.resolve.scopes.JetScopeUtils; import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; @@ -511,7 +510,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { expression.getInstanceReference(), expression.getTargetLabel(), context, thisReceiver, new LabelName(labelName)); } else { - List receivers = JetScopeUtils.getImplicitReceiversHierarchy(context.scope); + List receivers = context.scope.getImplicitReceiversHierarchy(); if (onlyClassReceivers) { for (ReceiverParameterDescriptor receiver : receivers) { if (receiver.getContainingDeclaration() instanceof ClassDescriptor) { diff --git a/compiler/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java b/compiler/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java index 9f901afc174..beaba96fef2 100644 --- a/compiler/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java +++ b/compiler/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.types; +import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; @@ -32,7 +33,8 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo; -import org.jetbrains.jet.lang.resolve.java.*; +import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule; +import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.*; @@ -571,9 +573,10 @@ public class JetTypeCheckerTest extends JetLiteFixture { private void assertType(String contextType, final String expression, String expectedType) { final JetType thisType = makeType(contextType); JetScope scope = new JetScopeAdapter(classDefinitions.BASIC_SCOPE) { + @NotNull @Override - public void getImplicitReceiversHierarchy(@NotNull List result) { - result.add(new ReceiverParameterDescriptorImpl( + public List getImplicitReceiversHierarchy() { + return Lists.newArrayList(new ReceiverParameterDescriptorImpl( classDefinitions.BASIC_SCOPE.getContainingDeclaration(), thisType, new ExpressionReceiver(JetPsiFactory.createExpression(getProject(), expression), thisType)