Extract getEnumEntriesScope utility method
This commit is contained in:
+3
-11
@@ -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);
|
||||
|
||||
+2
-3
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user