From 1eeb72e0737218da668e0073d4da16def463fd45 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 18 Feb 2016 22:04:34 +0300 Subject: [PATCH] Do not create empty static scope instances for non-enum classes --- .../lazy/descriptors/LazyClassDescriptor.java | 4 ++-- .../functions/FunctionClassDescriptor.kt | 8 +++---- .../descriptors/impl/ClassDescriptorImpl.java | 4 +--- .../EnumEntrySyntheticClassDescriptor.java | 4 +--- ...inClass.kt => StaticScopeForKotlinEnum.kt} | 22 ++++++------------- .../DeserializedClassDescriptor.kt | 4 ++-- 6 files changed, 16 insertions(+), 30 deletions(-) rename core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/{StaticScopeForKotlinClass.kt => StaticScopeForKotlinEnum.kt} (78%) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java index 7c311b6e095..a251b202aac 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java @@ -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(); diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionClassDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionClassDescriptor.kt index 5bf015c3d44..31da1430618 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionClassDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionClassDescriptor.kt @@ -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) } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassDescriptorImpl.java index f8057c68de7..99b6307f831 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassDescriptorImpl.java @@ -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 constructors; @@ -108,7 +106,7 @@ public class ClassDescriptorImpl extends ClassDescriptorBase { @NotNull @Override public MemberScope getStaticScope() { - return staticScope; + return MemberScope.Empty.INSTANCE; } @Nullable diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/EnumEntrySyntheticClassDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/EnumEntrySyntheticClassDescriptor.java index c11ae870b4c..b02222aac96 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/EnumEntrySyntheticClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/EnumEntrySyntheticClassDescriptor.java @@ -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> 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 diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/StaticScopeForKotlinClass.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/StaticScopeForKotlinEnum.kt similarity index 78% rename from core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/StaticScopeForKotlinClass.kt rename to core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/StaticScopeForKotlinEnum.kt index 63a81630e57..9a05f24c610 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/StaticScopeForKotlinClass.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/StaticScopeForKotlinEnum.kt @@ -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 by lazy { - if (containingClass.kind != ClassKind.ENUM_CLASS) { - listOf() - } - else { - listOf(createEnumValueOfMethod(containingClass), createEnumValuesMethod(containingClass)) - } + listOf(createEnumValueOfMethod(containingClass), createEnumValuesMethod(containingClass)) } private val properties: List by lazy { - if (containingClass.kind != ClassKind.ENUM_CLASS) { - listOf() - } - else { - listOf(createEnumValuesProperty(containingClass)) - } + listOf(createEnumValuesProperty(containingClass)) } override fun getContributedDescriptors(kindFilter: DescriptorKindFilter, diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt index 0d3f73e7151..3f7f6687323 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt @@ -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()