Put enum entries into enum class in JDR
This commit is contained in:
+7
-10
@@ -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) {
|
||||
|
||||
+1
-1
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
+46
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+2
-40
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user