Extract enum method utilities from DescriptorResolver

Create overloaded versions which accept JetType as a parameter to use them in
JDR where there's no deferred types
This commit is contained in:
Alexander Udalov
2013-08-08 16:51:11 +04:00
parent d34a6d85e7
commit 640b05cfe9
2 changed files with 57 additions and 37 deletions
@@ -1423,47 +1423,59 @@ public class DescriptorResolver {
}
}
@NotNull
public static SimpleFunctionDescriptor createEnumClassObjectValuesMethod(
@NotNull ClassDescriptor classObjectDescriptor,
BindingTrace trace
@NotNull ClassDescriptor classObject,
@NotNull BindingTrace trace
) {
final ClassDescriptor enumClassDescriptor = (ClassDescriptor) classObjectDescriptor.getContainingDeclaration();
assert enumClassDescriptor.getKind() == ClassKind.ENUM_CLASS;
List<AnnotationDescriptor> annotations = Collections.<AnnotationDescriptor>emptyList();
SimpleFunctionDescriptorImpl values =
new SimpleFunctionDescriptorImpl(classObjectDescriptor, annotations,
VALUES_METHOD_NAME,
CallableMemberDescriptor.Kind.DECLARATION);
JetType type = DeferredType.create(trace, new RecursionIntolerantLazyValue<JetType>() {
final ClassDescriptor enumClassDescriptor = (ClassDescriptor) classObject.getContainingDeclaration();
assert DescriptorUtils.isEnumClass(enumClassDescriptor) : "values should be created in enum class: " + enumClassDescriptor;
return createEnumClassObjectValuesMethod(classObject, DeferredType.create(trace, new RecursionIntolerantLazyValue<JetType>() {
@Override
protected JetType compute() {
return KotlinBuiltIns.getInstance().getArrayType(enumClassDescriptor.getDefaultType());
}
});
values.initialize(null, classObjectDescriptor.getThisAsReceiverParameter(), Collections.<TypeParameterDescriptor>emptyList(),
Collections.<ValueParameterDescriptor>emptyList(),
type, Modality.FINAL,
Visibilities.PUBLIC, false);
return values;
}));
}
public static SimpleFunctionDescriptor createEnumClassObjectValueOfMethod(
@NotNull ClassDescriptor classObjectDescriptor,
BindingTrace trace
@NotNull
public static SimpleFunctionDescriptor createEnumClassObjectValuesMethod(
@NotNull ClassDescriptor classObject,
@NotNull JetType returnType
) {
final ClassDescriptor enumClassDescriptor = (ClassDescriptor) classObjectDescriptor.getContainingDeclaration();
assert enumClassDescriptor.getKind() == ClassKind.ENUM_CLASS;
List<AnnotationDescriptor> annotations = Collections.<AnnotationDescriptor>emptyList();
SimpleFunctionDescriptorImpl values =
new SimpleFunctionDescriptorImpl(classObjectDescriptor, annotations,
VALUE_OF_METHOD_NAME,
new SimpleFunctionDescriptorImpl(classObject, Collections.<AnnotationDescriptor>emptyList(), VALUES_METHOD_NAME,
CallableMemberDescriptor.Kind.DECLARATION);
JetType type = DeferredType.create(trace, new RecursionIntolerantLazyValue<JetType>() {
return values.initialize(null, classObject.getThisAsReceiverParameter(), Collections.<TypeParameterDescriptor>emptyList(),
Collections.<ValueParameterDescriptor>emptyList(),
returnType, Modality.FINAL,
Visibilities.PUBLIC, false);
}
@NotNull
public static SimpleFunctionDescriptor createEnumClassObjectValueOfMethod(
@NotNull ClassDescriptor classObject,
@NotNull BindingTrace trace
) {
final ClassDescriptor enumClassDescriptor = (ClassDescriptor) classObject.getContainingDeclaration();
assert DescriptorUtils.isEnumClass(enumClassDescriptor) : "valueOf should be created in enum class: " + enumClassDescriptor;
return createEnumClassObjectValueOfMethod(classObject, DeferredType.create(trace, new RecursionIntolerantLazyValue<JetType>() {
@Override
protected JetType compute() {
return enumClassDescriptor.getDefaultType();
}
});
}));
}
@NotNull
public static SimpleFunctionDescriptor createEnumClassObjectValueOfMethod(
@NotNull ClassDescriptor classObject,
@NotNull JetType returnType
) {
SimpleFunctionDescriptorImpl values =
new SimpleFunctionDescriptorImpl(classObject, Collections.<AnnotationDescriptor>emptyList(), VALUE_OF_METHOD_NAME,
CallableMemberDescriptor.Kind.DECLARATION);
ValueParameterDescriptor parameterDescriptor = new ValueParameterDescriptorImpl(
values,
0,
@@ -1472,12 +1484,11 @@ public class DescriptorResolver {
KotlinBuiltIns.getInstance().getStringType(),
false,
null);
values.initialize(null, classObjectDescriptor.getThisAsReceiverParameter(),
Collections.<TypeParameterDescriptor>emptyList(),
Collections.singletonList(parameterDescriptor),
type, Modality.FINAL,
Visibilities.PUBLIC, false);
return values;
return values.initialize(null, classObject.getThisAsReceiverParameter(),
Collections.<TypeParameterDescriptor>emptyList(),
Collections.singletonList(parameterDescriptor),
returnType, Modality.FINAL,
Visibilities.PUBLIC, false);
}
public static ReceiverParameterDescriptor createLazyReceiverParameterDescriptor(@NotNull final ClassDescriptor classDescriptor) {