diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java index 862a6a46a5e..72a1dc7813a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java @@ -172,7 +172,7 @@ public class ClassDescriptorImpl extends DeclarationDescriptorNonRootImpl implem @Override public ReceiverParameterDescriptor getThisAsReceiverParameter() { if (thisAsReceiverParameter == null) { - thisAsReceiverParameter = new ReceiverParameterDescriptorImpl(this, getDefaultType()); + thisAsReceiverParameter = new ReceiverParameterDescriptorImpl(this, getDefaultType(), new ClassReceiver(this)); } return thisAsReceiverParameter; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java index 8c7848412a9..971badc6269 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java @@ -21,6 +21,7 @@ import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; +import org.jetbrains.jet.lang.resolve.DescriptorResolver; import org.jetbrains.jet.lang.resolve.OverridingUtil; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.DescriptorSubstitutor; @@ -31,8 +32,6 @@ import org.jetbrains.jet.lang.types.Variance; import java.util.List; import java.util.Set; -import static org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor.NO_RECEIVER_PARAMETER; - /** * @author abreslav */ @@ -84,7 +83,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo this.unsubstitutedReturnType = unsubstitutedReturnType; this.modality = modality; this.visibility = visibility; - this.receiverParameter = receiverParameterType == null ? NO_RECEIVER_PARAMETER : new ReceiverParameterDescriptorImpl(this, receiverParameterType); + this.receiverParameter = DescriptorResolver.resolveReceiverParameterFor(this, receiverParameterType); this.expectedThisObject = expectedThisObject; for (int i = 0; i < typeParameters.size(); ++i) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java index 458fae84f50..59ea8a08325 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java @@ -232,7 +232,7 @@ public abstract class MutableClassDescriptorLite extends ClassDescriptorBase { @Override public ReceiverParameterDescriptor getThisAsReceiverParameter() { if (implicitReceiver == null) { - implicitReceiver = new ReceiverParameterDescriptorImpl(this, getDefaultType()); + implicitReceiver = new ReceiverParameterDescriptorImpl(this, getDefaultType(), new ClassReceiver(this)); } return implicitReceiver; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyDescriptor.java index c1f0d06a9c2..ddee4b7816c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyDescriptor.java @@ -21,6 +21,7 @@ import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; +import org.jetbrains.jet.lang.resolve.DescriptorResolver; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.OverridingUtil; import org.jetbrains.jet.lang.resolve.name.Name; @@ -33,8 +34,6 @@ import java.util.Collections; import java.util.List; import java.util.Set; -import static org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor.NO_RECEIVER_PARAMETER; - /** * @author abreslav */ @@ -105,9 +104,7 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab @NotNull ReceiverParameterDescriptor expectedThisObject, @Nullable JetType receiverType ) { - ReceiverParameterDescriptor receiverParameter = receiverType == null - ? NO_RECEIVER_PARAMETER - : new ReceiverParameterDescriptorImpl(this, receiverType); + ReceiverParameterDescriptor receiverParameter = DescriptorResolver.resolveReceiverParameterFor(this, receiverType); setType(outType, typeParameters, expectedThisObject, receiverParameter); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ScriptDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ScriptDescriptor.java index d0e0f2a41aa..c6ed1f6df6d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ScriptDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ScriptDescriptor.java @@ -29,6 +29,7 @@ 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.ScriptReceiver; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.TypeSubstitutor; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; @@ -53,7 +54,8 @@ public class ScriptDescriptor extends DeclarationDescriptorNonRootImpl { // Putting Any here makes no sense, // it is simply copied from someplace else // during a refactoring - KotlinBuiltIns.getInstance().getAnyType()); + KotlinBuiltIns.getInstance().getAnyType(), + new ScriptReceiver(this)); private final ClassDescriptorImpl classDescriptor; 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 948e4eb3480..ad975667bb3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java @@ -32,6 +32,7 @@ import org.jetbrains.jet.lang.resolve.scopes.JetScope; 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; @@ -67,6 +68,12 @@ public class DescriptorResolver { @NotNull private ExpressionTypingServices expressionTypingServices; + public static ReceiverParameterDescriptor resolveReceiverParameterFor(@NotNull CallableDescriptor owner, @Nullable JetType receiverParameterType) { + return receiverParameterType == null + ? NO_RECEIVER_PARAMETER + : new ReceiverParameterDescriptorImpl(owner, receiverParameterType, new ExtensionReceiver(owner, receiverParameterType)); + } + @Inject public void setTypeResolver(@NotNull TypeResolver typeResolver) { this.typeResolver = typeResolver; @@ -899,9 +906,7 @@ public class DescriptorResolver { } } - ReceiverParameterDescriptor receiverDescriptor = receiverType == null - ? NO_RECEIVER_PARAMETER - : new ReceiverParameterDescriptorImpl(propertyDescriptor, receiverType); + ReceiverParameterDescriptor receiverDescriptor = resolveReceiverParameterFor(propertyDescriptor, receiverType); JetScope propertyScope = getPropertyDeclarationInnerScope(scope, typeParameterDescriptors, ReceiverDescriptor.NO_RECEIVER, trace); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/autocasts/DataFlowValueFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/autocasts/DataFlowValueFactory.java index f45cee59092..786c94530f9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/autocasts/DataFlowValueFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/autocasts/DataFlowValueFactory.java @@ -145,10 +145,10 @@ public class DataFlowValueFactory { JetThisExpression thisExpression = (JetThisExpression) expression; DeclarationDescriptor declarationDescriptor = bindingContext.get(REFERENCE_TARGET, thisExpression.getInstanceReference()); if (declarationDescriptor instanceof CallableDescriptor) { - return Pair.create((Object) ((CallableDescriptor) declarationDescriptor).getReceiverParameter(), true); + return Pair.create((Object) ((CallableDescriptor) declarationDescriptor).getReceiverParameter().getValue(), true); } if (declarationDescriptor instanceof ClassDescriptor) { - return Pair.create((Object) ((ClassDescriptor) declarationDescriptor).getThisAsReceiverParameter(), true); + return Pair.create((Object) ((ClassDescriptor) declarationDescriptor).getThisAsReceiverParameter().getValue(), true); } return Pair.create(null, true); } 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 e60e85ffbbf..728d08a0840 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 @@ -213,7 +213,7 @@ public abstract class TaskPrioritizer { } if (containingDeclaration != null && isClassObject(containingDeclaration)) { ResolutionCandidate candidate = ResolutionCandidate.create(descriptor); - candidate.setThisObject(new ClassReceiver((ClassDescriptor) containingDeclaration)); + candidate.setThisObject(((ClassDescriptor) containingDeclaration).getThisAsReceiverParameter().getValue()); candidate.setExplicitReceiverKind(ExplicitReceiverKind.NO_EXPLICIT_RECEIVER); result.add(candidate); } 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 7765c7bcb95..462ea839689 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 @@ -35,6 +35,7 @@ import org.jetbrains.jet.lang.resolve.lazy.data.JetClassInfoUtil; import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.*; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver; import org.jetbrains.jet.lang.types.ErrorUtils; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.TypeConstructor; @@ -273,7 +274,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyDesc @Override public ReceiverParameterDescriptor getThisAsReceiverParameter() { if (thisAsReceiverParameter == null) { - thisAsReceiverParameter = new ReceiverParameterDescriptorImpl(this, getDefaultType()); + thisAsReceiverParameter = new ReceiverParameterDescriptorImpl(this, getDefaultType(), new ClassReceiver(this)); } return thisAsReceiverParameter; }