Extract getEnumEntriesScope utility method

This commit is contained in:
Alexander Udalov
2013-08-28 18:00:02 +04:00
parent c0a30929c1
commit de062274e9
4 changed files with 20 additions and 22 deletions
@@ -16,7 +16,6 @@
package org.jetbrains.jet.lang.resolve.java.resolver;
import com.google.common.collect.Lists;
import com.intellij.psi.*;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
@@ -24,6 +23,7 @@ import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.constants.*;
import org.jetbrains.jet.lang.resolve.constants.StringValue;
import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils;
@@ -31,7 +31,6 @@ import org.jetbrains.jet.lang.resolve.name.FqName;
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.TypeProjection;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import javax.inject.Inject;
@@ -142,16 +141,9 @@ public final class JavaCompileTimeConstResolver {
return null;
}
JetScope scope;
ClassDescriptor classDescriptor = classResolver.resolveClass(new FqName(fqName), INCLUDE_KOTLIN_SOURCES, taskList);
if (classDescriptor == null) {
return null;
}
ClassDescriptor classObjectDescriptor = classDescriptor.getClassObjectDescriptor();
if (classObjectDescriptor == null) {
return null;
}
scope = classObjectDescriptor.getMemberScope(Lists.<TypeProjection>newArrayList());
if (classDescriptor == null) return null;
JetScope scope = DescriptorUtils.getEnumEntriesScope(classDescriptor);
Name identifier = Name.identifier(((PsiEnumConstant) resolveElement).getName());
Collection<VariableDescriptor> properties = scope.getProperties(identifier);
@@ -25,6 +25,7 @@ import org.jetbrains.jet.renderer.DescriptorRenderer;
import java.util.*;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getEnumEntriesScope;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isTopLevelOrInnerClass;
public class DescriptorSerializer {
@@ -127,9 +128,7 @@ public class DescriptorSerializer {
}
if (classDescriptor.getKind() == ClassKind.ENUM_CLASS) {
ClassDescriptor classObject = classDescriptor.getClassObjectDescriptor();
assert classObject != null : "Enum class object shouldn't be null: " + classDescriptor;
for (ClassDescriptor descriptor : classObject.getDefaultType().getMemberScope().getObjectDescriptors()) {
for (ClassDescriptor descriptor : getEnumEntriesScope(classDescriptor).getObjectDescriptors()) {
if (descriptor.getKind() == ClassKind.ENUM_ENTRY) {
builder.addEnumEntry(nameTable.getSimpleNameIndex(descriptor.getName()));
}
@@ -18,16 +18,18 @@ package org.jetbrains.jet.lang.cfg;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassKind;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.VariableDescriptorForObject;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeProjection;
import java.util.Collection;
import java.util.Collections;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getEnumEntriesScope;
public final class WhenChecker {
private WhenChecker() {
@@ -42,10 +44,7 @@ public final class WhenChecker {
if (!(declarationDescriptor instanceof ClassDescriptor)) return false;
ClassDescriptor classDescriptor = (ClassDescriptor) declarationDescriptor;
if (classDescriptor.getKind() != ClassKind.ENUM_CLASS || classDescriptor.getModality().isOverridable()) return false;
ClassDescriptor classObjectDescriptor = classDescriptor.getClassObjectDescriptor();
assert classObjectDescriptor != null : "Enum classes must have class object.";
JetScope memberScope = classObjectDescriptor.getMemberScope(Collections.<TypeProjection>emptyList());
Collection<ClassDescriptor> objectDescriptors = memberScope.getObjectDescriptors();
Collection<ClassDescriptor> objectDescriptors = getEnumEntriesScope(classDescriptor).getObjectDescriptors();
boolean isExhaust = true;
boolean notEmpty = false;
for (ClassDescriptor descriptor : objectDescriptors) {
@@ -575,4 +575,12 @@ public class DescriptorUtils {
return isTopLevelDeclaration(descriptor) ||
containing instanceof ClassDescriptor && isTopLevelOrInnerClass((ClassDescriptor) containing);
}
@NotNull
public static JetScope getEnumEntriesScope(@NotNull ClassDescriptor enumClass) {
assert enumClass.getKind() == ClassKind.ENUM_CLASS : "Only enum classes have enum entries: " + enumClass;
ClassDescriptor classObject = enumClass.getClassObjectDescriptor();
assert classObject != null : "Enum class should have a class object: " + enumClass;
return classObject.getDefaultType().getMemberScope();
}
}