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; package org.jetbrains.jet.lang.resolve.lazy;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -139,26 +138,26 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
fromSupertypes.addAll(supertype.getMemberScope().getFunctions(name)); fromSupertypes.addAll(supertype.getMemberScope().getFunctions(name));
} }
generateDelegatingDescriptors(name, MemberExtractor.EXTRACT_FUNCTIONS, result); generateDelegatingDescriptors(name, MemberExtractor.EXTRACT_FUNCTIONS, result);
generateEnumClassObjectMethods(result, name);
generateFakeOverrides(name, fromSupertypes, result, FunctionDescriptor.class); generateFakeOverrides(name, fromSupertypes, result, FunctionDescriptor.class);
} }
private void generateEnumClassObjectMethods() { private void generateEnumClassObjectMethods(@NotNull Collection<? super FunctionDescriptor> result, @NotNull Name name) {
DeclarationDescriptor containingDeclaration = thisDescriptor.getContainingDeclaration(); DeclarationDescriptor containingDeclaration = thisDescriptor.getContainingDeclaration();
if(containingDeclaration instanceof ClassDescriptor) { if (!(containingDeclaration instanceof ClassDescriptor)) return;
ClassDescriptor classDescriptor = (ClassDescriptor) containingDeclaration; ClassDescriptor classDescriptor = (ClassDescriptor) containingDeclaration;
if(classDescriptor.getKind() == ClassKind.ENUM_CLASS) { if (classDescriptor.getClassObjectDescriptor() != thisDescriptor) return;
if(classDescriptor.getClassObjectDescriptor() == thisDescriptor) { if (classDescriptor.getKind() != ClassKind.ENUM_CLASS) return;
SimpleFunctionDescriptor valuesMethod = DescriptorResolver
.createEnumClassObjectValuesMethod(classDescriptor, thisDescriptor, resolveSession.getTrace()); if (name.equals(DescriptorResolver.VALUES_METHOD_NAME)) {
functionDescriptors.put(valuesMethod.getName(), Collections.<FunctionDescriptor>singleton(valuesMethod)); SimpleFunctionDescriptor valuesMethod = DescriptorResolver
allDescriptors.add(valuesMethod); .createEnumClassObjectValuesMethod(classDescriptor, resolveSession.getTrace());
SimpleFunctionDescriptor valueOfMethod = DescriptorResolver.createEnumClassObjectValueOfMethod(classDescriptor, result.add(valuesMethod);
thisDescriptor, }
resolveSession.getTrace()); else if (name.equals(DescriptorResolver.VALUE_OF_METHOD_NAME)) {
functionDescriptors.put(valueOfMethod.getName(), Collections.<FunctionDescriptor>singleton(valueOfMethod)); SimpleFunctionDescriptor valueOfMethod = DescriptorResolver.createEnumClassObjectValueOfMethod(classDescriptor,
allDescriptors.add(valueOfMethod); 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 @Override