Put enum entries into enum class in JDR

This commit is contained in:
Alexander Udalov
2013-11-13 21:26:31 +04:00
parent 60e7722a82
commit 5a4cc1e2fe
15 changed files with 139 additions and 163 deletions
@@ -115,23 +115,20 @@ public final class DescriptorResolverUtils {
}
/**
* @return true if {@code member} is a static member of enum class, which is to be put into its class object (and not into the
* corresponding package). This applies to enum entries, values() and valueOf(String) methods
* @return true if {@code method} is a static method of enum class, which is to be put into its class object (and not into the
* corresponding package). This applies to values() and valueOf(String) methods
*/
public static boolean shouldBeInEnumClassObject(@NotNull JavaMember member) {
if (!member.getContainingClass().isEnum()) return false;
public static boolean shouldBeInEnumClassObject(@NotNull JavaMethod method) {
if (!method.getContainingClass().isEnum()) return false;
if (member instanceof JavaField && ((JavaField) member).isEnumEntry()) return true;
if (!(member instanceof JavaMethod)) return false;
String signature = JavaSignatureFormatter.getInstance().formatMethod((JavaMethod) member);
String signature = JavaSignatureFormatter.getInstance().formatMethod(method);
return "values()".equals(signature) ||
"valueOf(java.lang.String)".equals(signature);
}
public static boolean isCorrectOwnerForEnumMember(@NotNull ClassOrNamespaceDescriptor ownerDescriptor, @NotNull JavaMember member) {
return isEnumClassObject(ownerDescriptor) == shouldBeInEnumClassObject(member);
public static boolean isCorrectOwnerForEnumMethod(@NotNull ClassOrNamespaceDescriptor ownerDescriptor, @NotNull JavaMethod method) {
return isEnumClassObject(ownerDescriptor) == shouldBeInEnumClassObject(method);
}
public static boolean isObjectMethodInInterface(@NotNull JavaMember member) {
@@ -101,7 +101,7 @@ public final class JavaFunctionResolver {
@NotNull ClassOrNamespaceDescriptor ownerDescriptor,
boolean record
) {
if (!DescriptorResolverUtils.isCorrectOwnerForEnumMember(ownerDescriptor, method)) {
if (!DescriptorResolverUtils.isCorrectOwnerForEnumMethod(ownerDescriptor, method)) {
return null;
}
@@ -228,7 +228,7 @@ public final class JavaNamespaceResolver {
}
for (JavaField field : javaClass.getFields()) {
if (field.isStatic() && !DescriptorResolverUtils.shouldBeInEnumClassObject(field)) {
if (field.isStatic() && !field.isEnumEntry()) {
return true;
}
}
@@ -30,6 +30,7 @@ import org.jetbrains.jet.lang.types.TypeUtils;
import javax.inject.Inject;
import java.util.*;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isEnumClass;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isEnumClassObject;
import static org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils.resolveOverrides;
@@ -79,7 +80,7 @@ public final class JavaPropertyResolver {
assert fields.size() <= 1;
if (fields.size() == 1) {
JavaField field = fields.iterator().next();
if (DescriptorResolverUtils.isCorrectOwnerForEnumMember(owner, field)) {
if (!field.isEnumEntry()) {
propertiesFromCurrent.add(resolveProperty(owner, propertyName, field));
}
}
@@ -16,17 +16,26 @@
package org.jetbrains.jet.lang.resolve.java.scope;
import jet.Function0;
import jet.Function1;
import kotlin.KotlinPackage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.EnumEntrySyntheticClassDescriptor;
import org.jetbrains.jet.lang.resolve.java.resolver.JavaMemberResolver;
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
import org.jetbrains.jet.lang.resolve.java.structure.JavaField;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.storage.LockBasedStorageManager;
import org.jetbrains.jet.storage.NotNullLazyValue;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isEnumClass;
import static org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule.IGNORE_KOTLIN_SOURCES;
public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope {
@@ -58,6 +67,43 @@ public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope
for (JavaClass innerClass : innerClasses) {
result.add(resolveInnerClass(innerClass));
}
if (isEnumClass(descriptor)) {
result.addAll(computeEnumEntries());
}
return result;
}
private Collection<ClassDescriptor> computeEnumEntries() {
List<ClassDescriptor> result = new ArrayList<ClassDescriptor>();
final Collection<NamedMembers> enumNonStaticMembers = MembersProvider.forClass(javaClass, true).allMembers();
NotNullLazyValue<Collection<Name>> enumMemberNames =
LockBasedStorageManager.NO_LOCKS.createLazyValue(new Function0<Collection<Name>>() {
@Override
public Collection<Name> invoke() {
return KotlinPackage.map(enumNonStaticMembers, new Function1<NamedMembers, Name>() {
@Override
public Name invoke(@NotNull NamedMembers members) {
return members.getName();
}
});
}
});
for (NamedMembers members : enumNonStaticMembers) {
for (JavaField field : members.getFields()) {
if (field.isEnumEntry()) {
EnumEntrySyntheticClassDescriptor enumEntry = EnumEntrySyntheticClassDescriptor
.create(LockBasedStorageManager.NO_LOCKS, descriptor, members.getName(), enumMemberNames);
result.add(enumEntry);
break;
}
}
}
return result;
}
@@ -16,24 +16,14 @@
package org.jetbrains.jet.lang.resolve.java.scope;
import jet.Function0;
import jet.Function1;
import kotlin.KotlinPackage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassOrNamespaceDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.EnumEntrySyntheticClassDescriptor;
import org.jetbrains.jet.lang.resolve.java.resolver.JavaMemberResolver;
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
import org.jetbrains.jet.lang.resolve.java.structure.JavaField;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.storage.LockBasedStorageManager;
import org.jetbrains.jet.storage.NotNullLazyValue;
import org.jetbrains.jet.storage.StorageManager;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Collections;
public class JavaEnumClassObjectScope extends JavaClassMembersScope {
public JavaEnumClassObjectScope(
@@ -47,34 +37,6 @@ public class JavaEnumClassObjectScope extends JavaClassMembersScope {
@NotNull
@Override
protected Collection<ClassDescriptor> computeInnerClasses() {
List<ClassDescriptor> result = new ArrayList<ClassDescriptor>();
final Collection<NamedMembers> enumNonStaticMembers = membersProvider.allMembers();
NotNullLazyValue<Collection<Name>> enumMemberNames =
LockBasedStorageManager.NO_LOCKS.createLazyValue(new Function0<Collection<Name>>() {
@Override
public Collection<Name> invoke() {
return KotlinPackage.map(enumNonStaticMembers, new Function1<NamedMembers, Name>() {
@Override
public Name invoke(@NotNull NamedMembers members) {
return members.getName();
}
});
}
});
for (NamedMembers members : enumNonStaticMembers) {
for (JavaField field : members.getFields()) {
if (field.isEnumEntry()) {
EnumEntrySyntheticClassDescriptor enumEntry = EnumEntrySyntheticClassDescriptor
.create(LockBasedStorageManager.NO_LOCKS, (ClassDescriptor) descriptor, members.getName(), enumMemberNames);
result.add(enumEntry);
break;
}
}
}
return result;
return Collections.emptySet();
}
}