From 555ac07b558d513dda8900af7a39a2d15d80b279 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 30 Oct 2012 18:38:08 +0400 Subject: [PATCH] Migrating scopes onto ReceierParameterDescriptor Getting rid of getImplicitReceiver() in JetScope --- .../jet/cli/jvm/compiler/TipsManager.java | 13 +++++----- .../descriptors/MutableClassDescriptor.java | 13 ++++------ .../lang/resolve/AbstractScopeAdapter.java | 10 +------- .../jet/lang/resolve/DescriptorResolver.java | 8 +++--- .../resolve/calls/tasks/TaskPrioritizer.java | 11 ++++---- .../resolve/lazy/AbstractLazyMemberScope.java | 8 +++--- .../resolve/lazy/LazyClassDescriptor.java | 3 +-- .../resolve/lazy/LazyClassMemberScope.java | 3 +-- .../resolve/lazy/LazyPackageMemberScope.java | 10 +++----- .../jet/lang/resolve/scopes/ChainedScope.java | 15 +---------- .../scopes/InnerClassesScopeWrapper.java | 10 ++------ .../jet/lang/resolve/scopes/JetScope.java | 10 +------- .../jet/lang/resolve/scopes/JetScopeImpl.java | 9 +------ .../lang/resolve/scopes/JetScopeUtils.java | 21 ++++++++++++++-- .../resolve/scopes/SubstitutingScope.java | 9 +------ .../lang/resolve/scopes/WritableScope.java | 3 +-- .../resolve/scopes/WritableScopeImpl.java | 18 +++---------- .../scopes/WritableScopeWithImports.java | 8 ++---- .../resolve/scopes/WriteThroughScope.java | 11 +------- .../jetbrains/jet/lang/types/ErrorUtils.java | 9 +------ .../BasicExpressionTypingVisitor.java | 25 ++++++++++--------- .../jet/types/JetTypeCheckerTest.java | 10 +++++--- 22 files changed, 83 insertions(+), 154 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 1e6f4e894a2..7801866a8eb 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 @@ -25,6 +25,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; +import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor; import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetImportDirective; import org.jetbrains.jet.lang.psi.JetNamespaceHeader; @@ -104,10 +105,9 @@ public final class TipsManager { else { Collection descriptorsSet = Sets.newHashSet(); - List result = new ArrayList(); - resolutionScope.getImplicitReceiversHierarchy(result); + List result = JetScopeUtils.getImplicitReceiversHierarchy(resolutionScope); - for (ReceiverDescriptor receiverDescriptor : result) { + for (ReceiverParameterDescriptor receiverDescriptor : result) { JetType receiverType = receiverDescriptor.getType(); descriptorsSet.addAll(receiverType.getMemberScope().getAllDescriptors()); } @@ -153,8 +153,7 @@ public final class TipsManager { ) { final Set descriptorsSet = Sets.newHashSet(descriptors); - final List result = new ArrayList(); - scope.getImplicitReceiversHierarchy(result); + final List result = JetScopeUtils.getImplicitReceiversHierarchy(scope); descriptorsSet.removeAll( Collections2.filter(JetScopeUtils.getAllExtensions(scope), new Predicate() { @@ -163,8 +162,8 @@ public final class TipsManager { if (!callableDescriptor.getReceiverParameter().exists()) { return false; } - for (ReceiverDescriptor receiverDescriptor : result) { - if (ExpressionTypingUtils.checkIsExtensionCallable(receiverDescriptor, callableDescriptor)) { + for (ReceiverParameterDescriptor receiverDescriptor : result) { + if (ExpressionTypingUtils.checkIsExtensionCallable(receiverDescriptor.getValue(), callableDescriptor)) { return false; } } 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 3f3a2786da2..19889c05947 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java @@ -28,8 +28,6 @@ import org.jetbrains.jet.lang.resolve.scopes.JetScope; 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 org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver; -import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import java.util.List; import java.util.Set; @@ -155,7 +153,7 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite implement for (FunctionDescriptor functionDescriptor : getConstructors()) { ((ConstructorDescriptorImpl) functionDescriptor).setReturnType(getDefaultType()); } - scopeForMemberResolution.setImplicitReceiver(new ClassReceiver(this)); + scopeForMemberResolution.setImplicitReceiver(getThisAsReceiverParameter()); } @NotNull @@ -245,13 +243,12 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite implement return classObjectDescriptor.getDefaultType().getMemberScope(); } - @NotNull @Override - public ReceiverDescriptor getImplicitReceiver() { - return classObjectDescriptor.getThisAsReceiverParameter(); + public void getImplicitReceiversHierarchy(@NotNull List result) { + super.getImplicitReceiversHierarchy(result); + result.add(0, classObjectDescriptor.getThisAsReceiverParameter()); } - } - ); + }); return ClassObjectStatus.OK; } 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 25373dab6d9..09c7ed77ac2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AbstractScopeAdapter.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AbstractScopeAdapter.java @@ -21,11 +21,9 @@ import org.jetbrains.jet.lang.descriptors.*; 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.receivers.ReceiverDescriptor; import java.util.Collection; import java.util.List; -import java.util.Set; /** * Introduces a simple wrapper for internal scope. @@ -36,14 +34,8 @@ public abstract class AbstractScopeAdapter implements JetScope { @NotNull protected abstract JetScope getWorkerScope(); - @NotNull @Override - public ReceiverDescriptor getImplicitReceiver() { - return getWorkerScope().getImplicitReceiver(); - } - - @Override - public void getImplicitReceiversHierarchy(@NotNull List result) { + public void getImplicitReceiversHierarchy(@NotNull List result) { getWorkerScope().getImplicitReceiversHierarchy(result); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java index ad975667bb3..4a8d9aed109 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java @@ -33,7 +33,6 @@ import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver; import org.jetbrains.jet.lang.resolve.scopes.receivers.ExtensionReceiver; -import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices; @@ -742,7 +741,8 @@ public class DescriptorResolver { JetType type = getVariableType(scope, variable, dataFlowInfo, false, trace); // For a local variable the type must not be deferred - propertyDescriptor.setType(type, Collections.emptyList(), NO_RECEIVER_PARAMETER, (JetType) null); + ReceiverParameterDescriptor receiverParameter = ((ScriptDescriptor) containingDeclaration).getThisAsReceiverParameter(); + propertyDescriptor.setType(type, Collections.emptyList(), receiverParameter, (JetType) null); trace.record(BindingContext.VARIABLE, variable, propertyDescriptor); return propertyDescriptor; } @@ -839,7 +839,7 @@ public class DescriptorResolver { public JetScope getPropertyDeclarationInnerScope( @NotNull JetScope outerScope, @NotNull List typeParameters, - @NotNull ReceiverDescriptor receiver, BindingTrace trace + @NotNull ReceiverParameterDescriptor receiver, BindingTrace trace ) { WritableScopeImpl result = new WritableScopeImpl( outerScope, outerScope.getContainingDeclaration(), new TraceBasedRedeclarationHandler(trace), @@ -908,7 +908,7 @@ public class DescriptorResolver { ReceiverParameterDescriptor receiverDescriptor = resolveReceiverParameterFor(propertyDescriptor, receiverType); - JetScope propertyScope = getPropertyDeclarationInnerScope(scope, typeParameterDescriptors, ReceiverDescriptor.NO_RECEIVER, trace); + JetScope propertyScope = getPropertyDeclarationInnerScope(scope, typeParameterDescriptors, NO_RECEIVER_PARAMETER, trace); JetType type = getVariableType(propertyScope, property, DataFlowInfo.EMPTY, true, trace); 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 728d08a0840..2e4bb5e21ba 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 @@ -30,6 +30,7 @@ import org.jetbrains.jet.lang.resolve.calls.BasicResolutionContext; import org.jetbrains.jet.lang.resolve.calls.autocasts.AutoCastServiceImpl; 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.receivers.ClassReceiver; import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; @@ -114,8 +115,7 @@ public abstract class TaskPrioritizer { ProgressIndicatorProvider.checkCanceled(); AutoCastServiceImpl autoCastService = new AutoCastServiceImpl(context.dataFlowInfo, context.trace.getBindingContext()); - List implicitReceivers = Lists.newArrayList(); - scope.getImplicitReceiversHierarchy(implicitReceivers); + List implicitReceivers = JetScopeUtils.getImplicitReceiversHierarchyValues(scope); boolean hasExplicitThisObject = context.call.getThisObject().exists(); if (hasExplicitThisObject) { implicitReceivers.add(context.call.getThisObject()); @@ -226,12 +226,11 @@ 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 = Lists.newArrayList(); - scope.getImplicitReceiversHierarchy(receivers); - for (ReceiverDescriptor receiver : receivers) { + List receivers = JetScopeUtils.getImplicitReceiversHierarchy(scope); + for (ReceiverParameterDescriptor receiver : receivers) { if (JetTypeChecker.INSTANCE.isSubtypeOf(receiver.getType(), expectedThisObject.getType())) { // TODO : Autocasts & nullability - candidate.setThisObject(expectedThisObject); + candidate.setThisObject(expectedThisObject.getValue()); return true; } } 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 72f11b40b0e..651fea1d55d 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 @@ -27,7 +27,6 @@ import org.jetbrains.jet.lang.resolve.lazy.data.JetClassInfoUtil; 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.receivers.ReceiverDescriptor; import java.util.*; @@ -262,13 +261,16 @@ public abstract class AbstractLazyMemberScope result) { - ReceiverDescriptor receiver = getImplicitReceiver(); + public void getImplicitReceiversHierarchy(@NotNull List result) { + ReceiverParameterDescriptor receiver = getImplicitReceiver(); if (receiver.exists()) { result.add(receiver); } } + @NotNull + protected abstract ReceiverParameterDescriptor getImplicitReceiver(); + // Do not change this, override in concrete subclasses: // it is very easy to compromise laziness of this class, and fail all the debugging // a generic implementation can't do this properly diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java index 462ea839689..5b6e2f684bb 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java @@ -152,8 +152,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyDesc scope.addLabeledDeclaration(this); scope.changeLockLevel(WritableScope.LockLevel.READING); - scopeForMemberDeclarationResolution = new ChainedScope(this, getScopeForMemberLookup().getImplicitReceiver(), - scope, getScopeForMemberLookup(), getScopeForClassHeaderResolution()); + scopeForMemberDeclarationResolution = new ChainedScope(this, scope, getScopeForMemberLookup(), getScopeForClassHeaderResolution()); } return scopeForMemberDeclarationResolution; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassMemberScope.java index aa2a36e13c8..7caa2bf51d3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassMemberScope.java @@ -27,7 +27,6 @@ import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; -import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.types.DeferredType; import org.jetbrains.jet.lang.types.ErrorUtils; import org.jetbrains.jet.lang.types.JetType; @@ -323,7 +322,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope allDescriptors; public ChainedScope(DeclarationDescriptor containingDeclaration, JetScope... scopes) { - this(containingDeclaration, ReceiverDescriptor.NO_RECEIVER, scopes); - } - - public ChainedScope(DeclarationDescriptor containingDeclaration, ReceiverDescriptor implicitReceiver, JetScope... scopes) { this.containingDeclaration = containingDeclaration; - this.implicitReceiver = implicitReceiver; scopeChain = scopes.clone(); } @@ -121,14 +114,8 @@ public class ChainedScope implements JetScope { return result; } - @NotNull @Override - public ReceiverDescriptor getImplicitReceiver() { - return implicitReceiver; - } - - @Override - public void getImplicitReceiversHierarchy(@NotNull List result) { + public void getImplicitReceiversHierarchy(@NotNull List result) { for (JetScope jetScope : scopeChain) { jetScope.getImplicitReceiversHierarchy(result); } 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 079b89c058c..9b76a908911 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 @@ -23,10 +23,10 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor; import org.jetbrains.jet.lang.resolve.AbstractScopeAdapter; import org.jetbrains.jet.lang.resolve.name.LabelName; import org.jetbrains.jet.lang.resolve.name.Name; -import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import java.util.Collection; import java.util.List; @@ -82,14 +82,8 @@ public class InnerClassesScopeWrapper extends AbstractScopeAdapter { }); } - @NotNull @Override - public ReceiverDescriptor getImplicitReceiver() { - return ReceiverDescriptor.NO_RECEIVER; - } - - @Override - public void getImplicitReceiversHierarchy(@NotNull List result) { + public void getImplicitReceiversHierarchy(@NotNull List result) { // Do nothing } 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 b3f9ca55935..76f22081de0 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 @@ -21,11 +21,9 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.resolve.name.LabelName; import org.jetbrains.jet.lang.resolve.name.Name; -import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import java.util.Collection; import java.util.List; -import java.util.Set; /** * @author abreslav @@ -86,17 +84,11 @@ public interface JetScope { @NotNull Collection getAllDescriptors(); - /** - * @return EFFECTIVE implicit receiver at this point (may be corresponding to an outer scope) - */ - @NotNull - ReceiverDescriptor getImplicitReceiver(); - /** * 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); + void getImplicitReceiversHierarchy(@NotNull List result); @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 7c26307ecd9..4c2ff88e85a 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 @@ -20,7 +20,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.resolve.name.LabelName; import org.jetbrains.jet.lang.resolve.name.Name; -import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import java.util.Collection; import java.util.Collections; @@ -63,12 +62,6 @@ public abstract class JetScopeImpl implements JetScope { return null; } - @NotNull - @Override - public ReceiverDescriptor getImplicitReceiver() { - return ReceiverDescriptor.NO_RECEIVER; - } - @NotNull @Override public Collection getFunctions(@NotNull Name name) { @@ -93,7 +86,7 @@ public abstract class JetScopeImpl implements JetScope { } @Override - public void getImplicitReceiversHierarchy(@NotNull List result) { + public void getImplicitReceiversHierarchy(@NotNull List result) { } @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 e62052e741f..63ec8545999 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 @@ -16,11 +16,14 @@ package org.jetbrains.jet.lang.resolve.scopes; +import com.google.common.base.Function; +import com.google.common.collect.Collections2; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import java.util.Collection; @@ -41,12 +44,26 @@ public final class JetScopeUtils { * @return receivers hierarchy. */ @NotNull - public static Collection getImplicitReceiversHierarchy(@NotNull JetScope scope) { - List descriptors = Lists.newArrayList(); + 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); + + return Lists.newArrayList( + Collections2.transform(hierarchy, + new Function() { + @Override + public ReceiverDescriptor apply(ReceiverParameterDescriptor receiverParameterDescriptor) { + return receiverParameterDescriptor.getValue(); + } + }) + ); + } + /** * Get all extension descriptors among visible descriptors for current scope. * 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 6353a7d0665..ab532a65a39 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 @@ -23,7 +23,6 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.resolve.name.LabelName; import org.jetbrains.jet.lang.resolve.name.Name; -import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.types.TypeSubstitutor; import java.util.Collection; @@ -119,14 +118,8 @@ public class SubstitutingScope implements JetScope { return workerScope.getNamespace(name); // TODO } - @NotNull @Override - public ReceiverDescriptor getImplicitReceiver() { - throw new UnsupportedOperationException(); // TODO - } - - @Override - public void getImplicitReceiversHierarchy(@NotNull List result) { + public void getImplicitReceiversHierarchy(@NotNull List result) { throw new UnsupportedOperationException(); // TODO } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScope.java index 9b4655eca5b..e9bf09324eb 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScope.java @@ -21,7 +21,6 @@ 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 org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; /** * @author abreslav @@ -66,7 +65,7 @@ public interface WritableScope extends JetScope { void importScope(@NotNull JetScope imported); - void setImplicitReceiver(@NotNull ReceiverDescriptor implicitReceiver); + void setImplicitReceiver(@NotNull ReceiverParameterDescriptor implicitReceiver); void importClassifierAlias(@NotNull Name importedClassifierName, @NotNull ClassifierDescriptor classifierDescriptor); 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 b0e09874ccb..ea952e0fd14 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 @@ -22,7 +22,6 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.resolve.name.LabelName; import org.jetbrains.jet.lang.resolve.name.Name; -import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.util.CommonSuppliers; @@ -63,7 +62,7 @@ public class WritableScopeImpl extends WritableScopeWithImports { private Map objectDescriptors; @Nullable - private ReceiverDescriptor implicitReceiver; + private ReceiverParameterDescriptor implicitReceiver; public WritableScopeImpl(@NotNull JetScope scope, @NotNull DeclarationDescriptor owner, @NotNull RedeclarationHandler redeclarationHandler, @NotNull String debugName) { @@ -452,19 +451,8 @@ public class WritableScopeImpl extends WritableScopeWithImports { return super.getNamespace(name); } - @NotNull @Override - public ReceiverDescriptor getImplicitReceiver() { - checkMayRead(); - - if (implicitReceiver == null) { - return super.getImplicitReceiver(); - } - return implicitReceiver; - } - - @Override - public void setImplicitReceiver(@NotNull ReceiverDescriptor implicitReceiver) { + public void setImplicitReceiver(@NotNull ReceiverParameterDescriptor implicitReceiver) { checkMayWrite(); if (this.implicitReceiver != null) { @@ -474,7 +462,7 @@ public class WritableScopeImpl extends WritableScopeWithImports { } @Override - public void getImplicitReceiversHierarchy(@NotNull List result) { + public void getImplicitReceiversHierarchy(@NotNull List result) { checkMayRead(); super.getImplicitReceiversHierarchy(result); 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 043d502f1c0..d9efb25ab24 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 @@ -21,7 +21,6 @@ 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 org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import java.util.ArrayList; import java.util.Collection; @@ -103,7 +102,7 @@ public abstract class WritableScopeWithImports extends JetScopeAdapter implement } @Override - public void getImplicitReceiversHierarchy(@NotNull List result) { + public void getImplicitReceiversHierarchy(@NotNull List result) { checkMayRead(); super.getImplicitReceiversHierarchy(result); @@ -111,10 +110,7 @@ public abstract class WritableScopeWithImports extends JetScopeAdapter implement // 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()) { - ReceiverDescriptor definedReceiver = scope.getImplicitReceiver(); - if (definedReceiver.exists()) { - result.add(0, definedReceiver); - } + scope.getImplicitReceiversHierarchy(result); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WriteThroughScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WriteThroughScope.java index 1528dd3f0c8..baed49cef78 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WriteThroughScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WriteThroughScope.java @@ -24,7 +24,6 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.resolve.name.LabelName; import org.jetbrains.jet.lang.resolve.name.Name; -import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import java.util.Collection; import java.util.Set; @@ -66,14 +65,6 @@ public class WriteThroughScope extends WritableScopeWithImports { return writableWorker.getContainingDeclaration(); } - @Override - @NotNull - public ReceiverDescriptor getImplicitReceiver() { - checkMayRead(); - - return writableWorker.getImplicitReceiver(); - } - @Override @NotNull public Collection getFunctions(@NotNull Name name) { @@ -275,7 +266,7 @@ public class WriteThroughScope extends WritableScopeWithImports { } @Override - public void setImplicitReceiver(@NotNull ReceiverDescriptor implicitReceiver) { + public void setImplicitReceiver(@NotNull ReceiverParameterDescriptor implicitReceiver) { checkMayWrite(); writableWorker.setImplicitReceiver(implicitReceiver); 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 4d1c97a5536..2dbf6d37ac8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java @@ -23,7 +23,6 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; 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.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.types.error.ErrorSimpleFunctionDescriptorImpl; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; @@ -77,14 +76,8 @@ public class ErrorUtils { return null; // TODO : review } - @NotNull @Override - public ReceiverDescriptor getImplicitReceiver() { - return ReceiverDescriptor.NO_RECEIVER; - } - - @Override - public void getImplicitReceiversHierarchy(@NotNull List result) { + public void getImplicitReceiversHierarchy(@NotNull List result) { } @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 1edaae668ea..56d03813199 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,11 +42,10 @@ 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.ClassReceiver; import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; -import org.jetbrains.jet.lang.resolve.scopes.receivers.ThisReceiverDescriptor; import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; @@ -400,7 +399,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { @Override public JetTypeInfo visitThisExpression(JetThisExpression expression, ExpressionTypingContext context) { JetType result = null; - ReceiverDescriptor thisReceiver = resolveToReceiver(expression, context, false); + ReceiverParameterDescriptor thisReceiver = resolveToReceiver(expression, context, false); if (thisReceiver != null) { if (!thisReceiver.exists()) { @@ -422,7 +421,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { } JetType result = null; - ReceiverDescriptor thisReceiver = resolveToReceiver(expression, context, true); + ReceiverParameterDescriptor thisReceiver = resolveToReceiver(expression, context, true); if (thisReceiver == null) return JetTypeInfo.create(null, context.dataFlowInfo); if (!thisReceiver.exists()) { @@ -512,21 +511,23 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { expression.getInstanceReference(), expression.getTargetLabel(), context, thisReceiver, new LabelName(labelName)); } else { + List receivers = JetScopeUtils.getImplicitReceiversHierarchy(context.scope); if (onlyClassReceivers) { - List receivers = Lists.newArrayList(); - context.scope.getImplicitReceiversHierarchy(receivers); - for (ReceiverDescriptor receiver : receivers) { - if (receiver instanceof ClassReceiver) { + for (ReceiverParameterDescriptor receiver : receivers) { + if (receiver.getContainingDeclaration() instanceof ClassDescriptor) { thisReceiver = receiver; break; } } } - else { - thisReceiver = context.scope.getImplicitReceiver(); + else if (!receivers.isEmpty()) { + thisReceiver = receivers.get(0); } - if (thisReceiver instanceof ThisReceiverDescriptor) { - context.trace.record(REFERENCE_TARGET, expression.getInstanceReference(), ((ThisReceiverDescriptor) thisReceiver).getDeclarationDescriptor()); + else { + thisReceiver = ReceiverParameterDescriptor.NO_RECEIVER_PARAMETER; + } + if (thisReceiver != null && thisReceiver.exists()) { + context.trace.record(REFERENCE_TARGET, expression.getInstanceReference(), thisReceiver.getContainingDeclaration()); } } return thisReceiver; diff --git a/compiler/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java b/compiler/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java index 5c5f4d4f62d..9f901afc174 100644 --- a/compiler/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java +++ b/compiler/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java @@ -37,7 +37,6 @@ import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.*; import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver; -import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.types.CommonSupertypes; import org.jetbrains.jet.lang.types.ErrorUtils; import org.jetbrains.jet.lang.types.JetType; @@ -572,10 +571,13 @@ 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 ReceiverDescriptor getImplicitReceiver() { - return new ExpressionReceiver(JetPsiFactory.createExpression(getProject(), expression), thisType); + public void getImplicitReceiversHierarchy(@NotNull List result) { + result.add(new ReceiverParameterDescriptorImpl( + classDefinitions.BASIC_SCOPE.getContainingDeclaration(), + thisType, + new ExpressionReceiver(JetPsiFactory.createExpression(getProject(), expression), thisType) + )); } }; assertType(scope, expression, expectedType);