Pull up getThisAsReceiverParameter()

This commit is contained in:
Alexander Udalov
2013-11-21 17:47:02 +04:00
parent a77d6a006d
commit c7d5819ef2
7 changed files with 71 additions and 113 deletions
@@ -29,8 +29,6 @@ import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.OverridingUtil;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue;
import org.jetbrains.jet.lang.types.ErrorUtils;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeConstructor;
@@ -53,7 +51,6 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
private final TypeDeserializer typeDeserializer;
private final DescriptorDeserializer deserializer;
private final DeserializedMemberScope memberScope;
private final ReceiverParameterDescriptor thisAsReceiverParameter;
private final NullableLazyValue<ConstructorDescriptor> primaryConstructor;
@@ -104,7 +101,6 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
this.typeConstructor = new DeserializedClassTypeConstructor(typeParameters);
this.memberScope = new DeserializedClassMemberScope(storageManager, this);
this.thisAsReceiverParameter = new LazyClassReceiverParameterDescriptor();
int flags = classProto.getFlags();
this.modality = DescriptorDeserializer.modality(Flags.MODALITY.get(flags));
@@ -291,12 +287,6 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
return classObjectDescriptor.invoke();
}
@NotNull
@Override
public ReceiverParameterDescriptor getThisAsReceiverParameter() {
return thisAsReceiverParameter;
}
private Collection<JetType> computeSuperTypes() {
List<JetType> supertypes = new ArrayList<JetType>(classProto.getSupertypeCount());
for (ProtoBuf.Type supertype : classProto.getSupertypeList()) {
@@ -495,27 +485,5 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
return result;
}
}
private class LazyClassReceiverParameterDescriptor extends AbstractReceiverParameterDescriptor {
private final ClassReceiver classReceiver = new ClassReceiver(DeserializedClassDescriptor.this);
@NotNull
@Override
public JetType getType() {
return getDefaultType();
}
@NotNull
@Override
public ReceiverValue getValue() {
return classReceiver;
}
@NotNull
@Override
public DeclarationDescriptor getContainingDeclaration() {
return DeserializedClassDescriptor.this;
}
}
}
@@ -32,7 +32,6 @@ import org.jetbrains.jet.lang.descriptors.impl.ClassDescriptorBase;
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.DescriptorFactory;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.lazy.ForceResolveUtil;
import org.jetbrains.jet.lang.resolve.lazy.LazyDescriptor;
@@ -77,7 +76,6 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyDesc
private final ClassKind kind;
private final boolean isInner;
private final NotNullLazyValue<ReceiverParameterDescriptor> thisAsReceiverParameter;
private final NotNullLazyValue<List<AnnotationDescriptor>> annotations;
private final NullableLazyValue<ClassDescriptor> classObjectDescriptor;
@@ -126,12 +124,6 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyDesc
this.isInner = isInnerClass(modifierList);
StorageManager storageManager = resolveSession.getStorageManager();
this.thisAsReceiverParameter = storageManager.createLazyValue(new Function0<ReceiverParameterDescriptor>() {
@Override
public ReceiverParameterDescriptor invoke() {
return DescriptorFactory.createLazyReceiverParameterDescriptor(LazyClassDescriptor.this);
}
});
this.annotations = storageManager.createLazyValue(new Function0<List<AnnotationDescriptor>>() {
@Override
public List<AnnotationDescriptor> invoke() {
@@ -311,12 +303,6 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyDesc
return isInner;
}
@NotNull
@Override
public ReceiverParameterDescriptor getThisAsReceiverParameter() {
return thisAsReceiverParameter.invoke();
}
@NotNull
@Override
public List<AnnotationDescriptor> getAnnotations() {
@@ -19,10 +19,7 @@ package org.jetbrains.jet.lang.descriptors.impl;
import jet.Function0;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorVisitor;
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.InnerClassesScopeWrapper;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
@@ -38,6 +35,7 @@ public abstract class AbstractClassDescriptor implements ClassDescriptor {
private final Name name;
protected final NotNullLazyValue<JetType> defaultType;
private final NotNullLazyValue<JetScope> unsubstitutedInnerClassesScope;
private final NotNullLazyValue<ReceiverParameterDescriptor> thisAsReceiverParameter;
public AbstractClassDescriptor(@NotNull StorageManager storageManager, @NotNull Name name) {
this.name = name;
@@ -53,6 +51,12 @@ public abstract class AbstractClassDescriptor implements ClassDescriptor {
return new InnerClassesScopeWrapper(getScopeForMemberLookup());
}
});
this.thisAsReceiverParameter = storageManager.createLazyValue(new Function0<ReceiverParameterDescriptor>() {
@Override
public ReceiverParameterDescriptor invoke() {
return new LazyClassReceiverParameterDescriptor(AbstractClassDescriptor.this);
}
});
}
@NotNull
@@ -83,6 +87,12 @@ public abstract class AbstractClassDescriptor implements ClassDescriptor {
return unsubstitutedInnerClassesScope.invoke();
}
@NotNull
@Override
public ReceiverParameterDescriptor getThisAsReceiverParameter() {
return thisAsReceiverParameter.invoke();
}
@NotNull
@Override
public JetScope getMemberScope(List<? extends TypeProjection> typeArguments) {
@@ -16,19 +16,16 @@
package org.jetbrains.jet.lang.descriptors.impl;
import jet.Function0;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.resolve.DescriptorFactory;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeConstructor;
import org.jetbrains.jet.lang.types.TypeConstructorImpl;
import org.jetbrains.jet.storage.LockBasedStorageManager;
import org.jetbrains.jet.storage.NotNullLazyValue;
import java.util.Collection;
import java.util.Collections;
@@ -38,7 +35,6 @@ import java.util.Set;
public class ClassDescriptorImpl extends ClassDescriptorBase {
private final Modality modality;
private final TypeConstructor typeConstructor;
private final NotNullLazyValue<ReceiverParameterDescriptor> thisAsReceiverParameter;
private JetScope scopeForMemberLookup;
private Set<ConstructorDescriptor> constructors;
@@ -55,13 +51,6 @@ public class ClassDescriptorImpl extends ClassDescriptorBase {
this.typeConstructor = new TypeConstructorImpl(this, Collections.<AnnotationDescriptor>emptyList(), false, getName().asString(),
Collections.<TypeParameterDescriptor>emptyList(), supertypes);
this.thisAsReceiverParameter = LockBasedStorageManager.NO_LOCKS.createLazyValue(new Function0<ReceiverParameterDescriptor>() {
@Override
public ReceiverParameterDescriptor invoke() {
return DescriptorFactory.createLazyReceiverParameterDescriptor(ClassDescriptorImpl.this);
}
});
}
public final void initialize(
@@ -136,12 +125,6 @@ public class ClassDescriptorImpl extends ClassDescriptorBase {
return false;
}
@NotNull
@Override
public ReceiverParameterDescriptor getThisAsReceiverParameter() {
return thisAsReceiverParameter.invoke();
}
@Override
public String toString() {
return "class " + getName();
@@ -0,0 +1,57 @@
/*
* Copyright 2010-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.lang.descriptors.impl;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue;
import org.jetbrains.jet.lang.types.JetType;
public class LazyClassReceiverParameterDescriptor extends AbstractReceiverParameterDescriptor {
private final ClassDescriptor descriptor;
private final ClassReceiver receiverValue;
public LazyClassReceiverParameterDescriptor(@NotNull ClassDescriptor descriptor) {
this.descriptor = descriptor;
this.receiverValue = new ClassReceiver(descriptor);
}
@NotNull
@Override
public JetType getType() {
return descriptor.getDefaultType();
}
@NotNull
@Override
public ReceiverValue getValue() {
return receiverValue;
}
@NotNull
@Override
public DeclarationDescriptor getContainingDeclaration() {
return descriptor;
}
@Override
public String toString() {
return "class " + descriptor.getName() + "::this";
}
}
@@ -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.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.resolve.DescriptorFactory;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
@@ -171,15 +170,6 @@ public abstract class MutableClassDescriptorLite extends ClassDescriptorBase {
}
}
@NotNull
@Override
public ReceiverParameterDescriptor getThisAsReceiverParameter() {
if (implicitReceiver == null) {
implicitReceiver = DescriptorFactory.createLazyReceiverParameterDescriptor(this);
}
return implicitReceiver;
}
@Override
public String toString() {
try {
@@ -22,9 +22,7 @@ import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.*;
import org.jetbrains.jet.lang.resolve.name.Name;
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.ReceiverValue;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
@@ -124,38 +122,4 @@ public class DescriptorFactory {
? NO_RECEIVER_PARAMETER
: new ReceiverParameterDescriptorImpl(owner, receiverParameterType, new ExtensionReceiver(owner, receiverParameterType));
}
@NotNull
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 ReceiverValue getValue() {
if (value == null) {
value = new ClassReceiver(classDescriptor);
}
return value;
}
@NotNull
@Override
public DeclarationDescriptor getContainingDeclaration() {
return classDescriptor;
}
@Override
public String toString() {
return "class " + classDescriptor.getName() + "::this";
}
};
}
}