Lazy receiver parameter declarations for class descriptors

This commit is contained in:
Andrey Breslav
2012-10-30 21:05:20 +04:00
parent a91a99e5be
commit c079625f5b
4 changed files with 46 additions and 10 deletions
@@ -19,10 +19,10 @@ package org.jetbrains.jet.lang.descriptors;
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.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.SubstitutingScope;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver;
import org.jetbrains.jet.lang.types.*;
import java.util.Collection;
@@ -172,7 +172,7 @@ public class ClassDescriptorImpl extends DeclarationDescriptorNonRootImpl implem
@Override
public ReceiverParameterDescriptor getThisAsReceiverParameter() {
if (thisAsReceiverParameter == null) {
thisAsReceiverParameter = new ReceiverParameterDescriptorImpl(this, getDefaultType(), new ClassReceiver(this));
thisAsReceiverParameter = DescriptorResolver.createLazyReceiverParameterDescriptor(this);
}
return thisAsReceiverParameter;
}
@@ -20,11 +20,11 @@ import com.google.common.collect.Lists;
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.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.InnerClassesScopeWrapper;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver;
import org.jetbrains.jet.lang.types.*;
import org.jetbrains.jet.resolve.DescriptorRenderer;
@@ -232,7 +232,7 @@ public abstract class MutableClassDescriptorLite extends ClassDescriptorBase {
@Override
public ReceiverParameterDescriptor getThisAsReceiverParameter() {
if (implicitReceiver == null) {
implicitReceiver = new ReceiverParameterDescriptorImpl(this, getDefaultType(), new ClassReceiver(this));
implicitReceiver = DescriptorResolver.createLazyReceiverParameterDescriptor(this);
}
return implicitReceiver;
}
@@ -33,6 +33,7 @@ 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;
@@ -1285,4 +1286,43 @@ public class DescriptorResolver {
Visibilities.PUBLIC, false);
return values;
}
public static ReceiverParameterDescriptor createLazyReceiverParameterDescriptor(@NotNull final ClassDescriptor classDescriptor) {
return new AbstractReceiverParameterDescriptor() {
private ClassReceiver value;
@NotNull
@Override
public JetType getType() {
// This must be lazy, thus the inner class
return classDescriptor.getDefaultType();
}
@NotNull
@Override
public ReceiverDescriptor getValue() {
if (value == null) {
value = new ClassReceiver(classDescriptor);
}
return value;
}
@NotNull
@Override
public DeclarationDescriptor getContainingDeclaration() {
return classDescriptor;
}
@Override
public boolean exists() {
return true;
}
@Override
public String toString() {
return "class " + classDescriptor.getName() + "::this";
}
};
}
}
@@ -26,16 +26,12 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.AnnotationResolver;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.ModifiersChecker;
import org.jetbrains.jet.lang.resolve.*;
import org.jetbrains.jet.lang.resolve.lazy.data.FilteringClassLikeInfo;
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 +269,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyDesc
@Override
public ReceiverParameterDescriptor getThisAsReceiverParameter() {
if (thisAsReceiverParameter == null) {
thisAsReceiverParameter = new ReceiverParameterDescriptorImpl(this, getDefaultType(), new ClassReceiver(this));
thisAsReceiverParameter = DescriptorResolver.createLazyReceiverParameterDescriptor(this);
}
return thisAsReceiverParameter;
}