Do not create empty static scope instances for non-enum classes

This commit is contained in:
Alexander Udalov
2016-02-18 22:04:34 +03:00
parent 60fe64dcaa
commit 1eeb72e073
6 changed files with 16 additions and 30 deletions
@@ -50,7 +50,7 @@ import org.jetbrains.kotlin.resolve.lazy.data.KtObjectInfo;
import org.jetbrains.kotlin.resolve.lazy.declarations.ClassMemberDeclarationProvider;
import org.jetbrains.kotlin.resolve.scopes.LexicalScope;
import org.jetbrains.kotlin.resolve.scopes.MemberScope;
import org.jetbrains.kotlin.resolve.scopes.StaticScopeForKotlinClass;
import org.jetbrains.kotlin.resolve.scopes.StaticScopeForKotlinEnum;
import org.jetbrains.kotlin.resolve.source.KotlinSourceElementKt;
import org.jetbrains.kotlin.storage.MemoizedFunctionToNotNull;
import org.jetbrains.kotlin.storage.NotNullLazyValue;
@@ -128,7 +128,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
this.unsubstitutedMemberScope = createMemberScope(c, this.declarationProvider);
this.kind = classLikeInfo.getClassKind();
this.staticScope = new StaticScopeForKotlinClass(this);
this.staticScope = kind == ClassKind.ENUM_CLASS ? new StaticScopeForKotlinEnum(this) : MemberScope.Empty.INSTANCE;
this.typeConstructor = new LazyClassTypeConstructor();
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.builtins.functions
import org.jetbrains.kotlin.builtins.KOTLIN_REFLECT_FQ_NAME
import org.jetbrains.kotlin.builtins.KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor.Kind
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.impl.AbstractClassDescriptor
@@ -26,7 +25,7 @@ import org.jetbrains.kotlin.descriptors.impl.TypeParameterDescriptorImpl
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.scopes.StaticScopeForKotlinClass
import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.utils.toReadOnlyList
@@ -62,7 +61,6 @@ class FunctionClassDescriptor(
}
}
private val staticScope = StaticScopeForKotlinClass(this)
private val typeConstructor = FunctionTypeConstructor()
private val memberScope = FunctionClassScope(storageManager, this)
@@ -88,7 +86,7 @@ class FunctionClassDescriptor(
override fun getContainingDeclaration() = containingDeclaration
override fun getStaticScope() = staticScope
override fun getStaticScope() = MemberScope.Empty
override fun getTypeConstructor(): TypeConstructor = typeConstructor
@@ -120,7 +118,7 @@ class FunctionClassDescriptor(
val typeConstructor = descriptor.typeConstructor
// Substitute all type parameters of the super class with our last type parameters
val arguments = getParameters().takeLast(typeConstructor.parameters.size).map {
val arguments = parameters.takeLast(typeConstructor.parameters.size).map {
TypeProjectionImpl(it.defaultType)
}
@@ -22,7 +22,6 @@ import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.annotations.Annotations;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.resolve.scopes.MemberScope;
import org.jetbrains.kotlin.resolve.scopes.StaticScopeForKotlinClass;
import org.jetbrains.kotlin.storage.LockBasedStorageManager;
import org.jetbrains.kotlin.types.KotlinType;
import org.jetbrains.kotlin.types.TypeConstructor;
@@ -37,7 +36,6 @@ public class ClassDescriptorImpl extends ClassDescriptorBase {
private final Modality modality;
private final ClassKind kind;
private final TypeConstructor typeConstructor;
private final MemberScope staticScope = new StaticScopeForKotlinClass(this);
private MemberScope unsubstitutedMemberScope;
private Set<ConstructorDescriptor> constructors;
@@ -108,7 +106,7 @@ public class ClassDescriptorImpl extends ClassDescriptorBase {
@NotNull
@Override
public MemberScope getStaticScope() {
return staticScope;
return MemberScope.Empty.INSTANCE;
}
@Nullable
@@ -31,7 +31,6 @@ import org.jetbrains.kotlin.resolve.OverridingUtil;
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter;
import org.jetbrains.kotlin.resolve.scopes.MemberScope;
import org.jetbrains.kotlin.resolve.scopes.MemberScopeImpl;
import org.jetbrains.kotlin.resolve.scopes.StaticScopeForKotlinClass;
import org.jetbrains.kotlin.storage.MemoizedFunctionToNotNull;
import org.jetbrains.kotlin.storage.NotNullLazyValue;
import org.jetbrains.kotlin.storage.StorageManager;
@@ -46,7 +45,6 @@ public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase {
private final TypeConstructor typeConstructor;
private final ConstructorDescriptor primaryConstructor;
private final MemberScope scope;
private final MemberScope staticScope = new StaticScopeForKotlinClass(this);
private final NotNullLazyValue<Collection<Name>> enumMemberNames;
private final Annotations annotations;
@@ -102,7 +100,7 @@ public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase {
@NotNull
@Override
public MemberScope getStaticScope() {
return staticScope;
return MemberScope.Empty.INSTANCE;
}
@NotNull
@@ -27,27 +27,19 @@ import org.jetbrains.kotlin.utils.Printer
import java.util.*
// We don't need to track lookups here since this scope used only for introduce special Enum class members
class StaticScopeForKotlinClass(
private val containingClass: ClassDescriptor
) : MemberScopeImpl() {
class StaticScopeForKotlinEnum(private val containingClass: ClassDescriptor) : MemberScopeImpl() {
init {
assert(containingClass.kind == ClassKind.ENUM_CLASS) { "Class should be an enum: $containingClass" }
}
override fun getContributedClassifier(name: Name, location: LookupLocation) = null // TODO
private val functions: List<FunctionDescriptor> by lazy {
if (containingClass.kind != ClassKind.ENUM_CLASS) {
listOf<FunctionDescriptor>()
}
else {
listOf(createEnumValueOfMethod(containingClass), createEnumValuesMethod(containingClass))
}
listOf(createEnumValueOfMethod(containingClass), createEnumValuesMethod(containingClass))
}
private val properties: List<PropertyDescriptor> by lazy {
if (containingClass.kind != ClassKind.ENUM_CLASS) {
listOf<PropertyDescriptor>()
}
else {
listOf(createEnumValuesProperty(containingClass))
}
listOf(createEnumValuesProperty(containingClass))
}
override fun getContributedDescriptors(kindFilter: DescriptorKindFilter,
@@ -29,7 +29,7 @@ import org.jetbrains.kotlin.resolve.OverridingStrategy
import org.jetbrains.kotlin.resolve.OverridingUtil
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.resolve.scopes.StaticScopeForKotlinClass
import org.jetbrains.kotlin.resolve.scopes.StaticScopeForKotlinEnum
import org.jetbrains.kotlin.serialization.Flags
import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.serialization.deserialization.*
@@ -63,7 +63,7 @@ class DeserializedClassDescriptor(
private val classId = nameResolver.getClassId(classProto.fqName)
private val staticScope = StaticScopeForKotlinClass(this)
private val staticScope = if (kind == ClassKind.ENUM_CLASS) StaticScopeForKotlinEnum(this) else MemberScope.Empty
private val typeConstructor = DeserializedClassTypeConstructor()
private val memberScope = DeserializedClassMemberScope()
private val nestedClasses = NestedClassDescriptors()