From c7d5819ef2453056f27fc6c550bb82d0c7d53f5a Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 21 Nov 2013 17:47:02 +0400 Subject: [PATCH] Pull up getThisAsReceiverParameter() --- .../DeserializedClassDescriptor.java | 32 ----------- .../lazy/descriptors/LazyClassDescriptor.java | 14 ----- .../impl/AbstractClassDescriptor.java | 18 ++++-- .../descriptors/impl/ClassDescriptorImpl.java | 17 ------ .../LazyClassReceiverParameterDescriptor.java | 57 +++++++++++++++++++ .../impl/MutableClassDescriptorLite.java | 10 ---- .../jet/lang/resolve/DescriptorFactory.java | 36 ------------ 7 files changed, 71 insertions(+), 113 deletions(-) create mode 100644 core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/LazyClassReceiverParameterDescriptor.java diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java index a2ed714c4d4..115e39330d8 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java @@ -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 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 computeSuperTypes() { List supertypes = new ArrayList(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; - } - } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java index 6321d379ee1..4c496bbf729 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java @@ -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 thisAsReceiverParameter; private final NotNullLazyValue> annotations; private final NullableLazyValue 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() { - @Override - public ReceiverParameterDescriptor invoke() { - return DescriptorFactory.createLazyReceiverParameterDescriptor(LazyClassDescriptor.this); - } - }); this.annotations = storageManager.createLazyValue(new Function0>() { @Override public List 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 getAnnotations() { diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/AbstractClassDescriptor.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/AbstractClassDescriptor.java index 380e6387c87..f7c9ea2f35a 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/AbstractClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/AbstractClassDescriptor.java @@ -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 defaultType; private final NotNullLazyValue unsubstitutedInnerClassesScope; + private final NotNullLazyValue 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() { + @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 typeArguments) { diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/ClassDescriptorImpl.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/ClassDescriptorImpl.java index 78c79058727..31c7752bc2f 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/ClassDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/ClassDescriptorImpl.java @@ -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 thisAsReceiverParameter; private JetScope scopeForMemberLookup; private Set constructors; @@ -55,13 +51,6 @@ public class ClassDescriptorImpl extends ClassDescriptorBase { this.typeConstructor = new TypeConstructorImpl(this, Collections.emptyList(), false, getName().asString(), Collections.emptyList(), supertypes); - - this.thisAsReceiverParameter = LockBasedStorageManager.NO_LOCKS.createLazyValue(new Function0() { - @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(); diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/LazyClassReceiverParameterDescriptor.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/LazyClassReceiverParameterDescriptor.java new file mode 100644 index 00000000000..2919f9b9c03 --- /dev/null +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/LazyClassReceiverParameterDescriptor.java @@ -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"; + } +} diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptorLite.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptorLite.java index 6a8e16d51cc..ce14c5549ba 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptorLite.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptorLite.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.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 { diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/DescriptorFactory.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/DescriptorFactory.java index ae3bba4f0d0..efe8d0e4253 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/DescriptorFactory.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/DescriptorFactory.java @@ -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"; - } - }; - } }