LR: values() and valueOf() created properly for enums' class objects

This commit is contained in:
Andrey Breslav
2012-08-15 13:34:51 +04:00
parent 24b83dd8f7
commit e7e7188da1
@@ -17,7 +17,6 @@
package org.jetbrains.jet.lang.resolve.lazy;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -139,26 +138,26 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
fromSupertypes.addAll(supertype.getMemberScope().getFunctions(name));
}
generateDelegatingDescriptors(name, MemberExtractor.EXTRACT_FUNCTIONS, result);
generateEnumClassObjectMethods(result, name);
generateFakeOverrides(name, fromSupertypes, result, FunctionDescriptor.class);
}
private void generateEnumClassObjectMethods() {
private void generateEnumClassObjectMethods(@NotNull Collection<? super FunctionDescriptor> result, @NotNull Name name) {
DeclarationDescriptor containingDeclaration = thisDescriptor.getContainingDeclaration();
if(containingDeclaration instanceof ClassDescriptor) {
ClassDescriptor classDescriptor = (ClassDescriptor) containingDeclaration;
if(classDescriptor.getKind() == ClassKind.ENUM_CLASS) {
if(classDescriptor.getClassObjectDescriptor() == thisDescriptor) {
SimpleFunctionDescriptor valuesMethod = DescriptorResolver
.createEnumClassObjectValuesMethod(classDescriptor, thisDescriptor, resolveSession.getTrace());
functionDescriptors.put(valuesMethod.getName(), Collections.<FunctionDescriptor>singleton(valuesMethod));
allDescriptors.add(valuesMethod);
SimpleFunctionDescriptor valueOfMethod = DescriptorResolver.createEnumClassObjectValueOfMethod(classDescriptor,
thisDescriptor,
resolveSession.getTrace());
functionDescriptors.put(valueOfMethod.getName(), Collections.<FunctionDescriptor>singleton(valueOfMethod));
allDescriptors.add(valueOfMethod);
}
}
if (!(containingDeclaration instanceof ClassDescriptor)) return;
ClassDescriptor classDescriptor = (ClassDescriptor) containingDeclaration;
if (classDescriptor.getClassObjectDescriptor() != thisDescriptor) return;
if (classDescriptor.getKind() != ClassKind.ENUM_CLASS) return;
if (name.equals(DescriptorResolver.VALUES_METHOD_NAME)) {
SimpleFunctionDescriptor valuesMethod = DescriptorResolver
.createEnumClassObjectValuesMethod(classDescriptor, resolveSession.getTrace());
result.add(valuesMethod);
}
else if (name.equals(DescriptorResolver.VALUE_OF_METHOD_NAME)) {
SimpleFunctionDescriptor valueOfMethod = DescriptorResolver.createEnumClassObjectValueOfMethod(classDescriptor,
resolveSession.getTrace());
result.add(valueOfMethod);
}
}
@@ -248,7 +247,8 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
}
}
generateEnumClassObjectMethods();
getFunctions(DescriptorResolver.VALUES_METHOD_NAME);
getFunctions(DescriptorResolver.VALUE_OF_METHOD_NAME);
}
@Override