Use EnumClassObjectDescriptor in lazy resolution
This commit is contained in:
@@ -59,7 +59,6 @@ import static org.jetbrains.jet.lang.resolve.DescriptorUtils.*;
|
||||
import static org.jetbrains.jet.lang.resolve.ModifiersChecker.*;
|
||||
import static org.jetbrains.jet.lexer.JetTokens.OVERRIDE_KEYWORD;
|
||||
import static org.jetbrains.jet.lexer.JetTokens.VARARG_KEYWORD;
|
||||
import static org.jetbrains.jet.storage.LockBasedStorageManager.NO_LOCKS;
|
||||
|
||||
public class DescriptorResolver {
|
||||
public static final Name COPY_METHOD_NAME = Name.identifier("copy");
|
||||
@@ -1375,39 +1374,6 @@ public class DescriptorResolver {
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static SimpleFunctionDescriptor createEnumClassObjectValuesMethod(
|
||||
@NotNull ClassDescriptor classObject,
|
||||
@NotNull BindingTrace trace
|
||||
) {
|
||||
final ClassDescriptor enumClassDescriptor = (ClassDescriptor) classObject.getContainingDeclaration();
|
||||
assert DescriptorUtils.isEnumClass(enumClassDescriptor) : "values should be created in enum class: " + enumClassDescriptor;
|
||||
return DescriptorFactory
|
||||
.createEnumClassObjectValuesMethod(classObject, DeferredType.create(NO_LOCKS, trace, new Function0<JetType>() {
|
||||
@Override
|
||||
public JetType invoke() {
|
||||
return KotlinBuiltIns.getInstance().getArrayType(enumClassDescriptor.getDefaultType());
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
|
||||
@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 DescriptorFactory
|
||||
.createEnumClassObjectValueOfMethod(classObject, DeferredType.create(NO_LOCKS, trace, new Function0<JetType>() {
|
||||
@Override
|
||||
public JetType invoke() {
|
||||
return enumClassDescriptor.getDefaultType();
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
public static boolean checkHasOuterClassInstance(
|
||||
@NotNull JetScope scope,
|
||||
@NotNull BindingTrace trace,
|
||||
|
||||
+13
-9
@@ -31,6 +31,7 @@ import org.jetbrains.annotations.ReadOnly;
|
||||
import org.jetbrains.jet.lang.descriptors.*;
|
||||
import org.jetbrains.jet.lang.descriptors.annotations.Annotations;
|
||||
import org.jetbrains.jet.lang.descriptors.impl.ClassDescriptorBase;
|
||||
import org.jetbrains.jet.lang.descriptors.impl.EnumClassObjectDescriptor;
|
||||
import org.jetbrains.jet.lang.psi.*;
|
||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||
@@ -82,8 +83,8 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
|
||||
private final boolean isInner;
|
||||
|
||||
private final Annotations annotations;
|
||||
private final NullableLazyValue<ClassDescriptorWithResolutionScopes> classObjectDescriptor;
|
||||
private final MemoizedFunctionToNotNull<JetClassObject, ClassDescriptorWithResolutionScopes> extraClassObjectDescriptors;
|
||||
private final NullableLazyValue<ClassDescriptor> classObjectDescriptor;
|
||||
private final MemoizedFunctionToNotNull<JetClassObject, ClassDescriptor> extraClassObjectDescriptors;
|
||||
|
||||
private final LazyClassMemberScope unsubstitutedMemberScope;
|
||||
|
||||
@@ -154,15 +155,15 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
|
||||
this.annotations = Annotations.EMPTY;
|
||||
}
|
||||
|
||||
this.classObjectDescriptor = storageManager.createNullableLazyValue(new Function0<ClassDescriptorWithResolutionScopes>() {
|
||||
this.classObjectDescriptor = storageManager.createNullableLazyValue(new Function0<ClassDescriptor>() {
|
||||
@Override
|
||||
public ClassDescriptorWithResolutionScopes invoke() {
|
||||
public ClassDescriptor invoke() {
|
||||
return computeClassObjectDescriptor(declarationProvider.getOwnerInfo().getClassObject());
|
||||
}
|
||||
});
|
||||
this.extraClassObjectDescriptors = storageManager.createMemoizedFunction(new Function1<JetClassObject, ClassDescriptorWithResolutionScopes>() {
|
||||
this.extraClassObjectDescriptors = storageManager.createMemoizedFunction(new Function1<JetClassObject, ClassDescriptor>() {
|
||||
@Override
|
||||
public ClassDescriptorWithResolutionScopes invoke(JetClassObject classObject) {
|
||||
public ClassDescriptor invoke(JetClassObject classObject) {
|
||||
return computeClassObjectDescriptor(classObject);
|
||||
}
|
||||
});
|
||||
@@ -313,7 +314,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClassDescriptorWithResolutionScopes getClassObjectDescriptor() {
|
||||
public ClassDescriptor getClassObjectDescriptor() {
|
||||
return classObjectDescriptor.invoke();
|
||||
}
|
||||
|
||||
@@ -340,7 +341,10 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private ClassDescriptorWithResolutionScopes computeClassObjectDescriptor(@Nullable JetClassObject classObject) {
|
||||
private ClassDescriptor computeClassObjectDescriptor(@Nullable JetClassObject classObject) {
|
||||
if (getKind() == ClassKind.ENUM_CLASS) {
|
||||
return new EnumClassObjectDescriptor(resolveSession.getStorageManager(), this);
|
||||
}
|
||||
JetClassLikeInfo classObjectInfo = getClassObjectInfo(classObject);
|
||||
if (classObjectInfo != null) {
|
||||
return new LazyClassDescriptor(resolveSession, this, getClassObjectName(getName()), classObjectInfo);
|
||||
@@ -358,7 +362,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
|
||||
JetObjectDeclaration objectDeclaration = classObject.getObjectDeclaration();
|
||||
return JetClassInfoUtil.createClassLikeInfo(objectDeclaration);
|
||||
}
|
||||
else if (getKind() == ClassKind.OBJECT || getKind() == ClassKind.ENUM_ENTRY || getKind() == ClassKind.ENUM_CLASS) {
|
||||
else if (getKind() == ClassKind.OBJECT || getKind() == ClassKind.ENUM_ENTRY) {
|
||||
return new SyntheticClassObjectInfo(originalClassInfo, this);
|
||||
}
|
||||
|
||||
|
||||
-19
@@ -148,7 +148,6 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
|
||||
fromSupertypes.addAll(supertype.getMemberScope().getFunctions(name));
|
||||
}
|
||||
result.addAll(generateDelegatingDescriptors(name, MemberExtractor.EXTRACT_FUNCTIONS, result));
|
||||
generateEnumClassObjectMethods(result, name);
|
||||
generateDataClassMethods(result, name);
|
||||
generateFakeOverrides(name, fromSupertypes, result, FunctionDescriptor.class);
|
||||
}
|
||||
@@ -185,21 +184,6 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
|
||||
}
|
||||
}
|
||||
|
||||
private void generateEnumClassObjectMethods(@NotNull Collection<? super FunctionDescriptor> result, @NotNull Name name) {
|
||||
if (!DescriptorUtils.isEnumClassObject(thisDescriptor)) return;
|
||||
|
||||
if (name.equals(DescriptorFactory.VALUES_METHOD_NAME)) {
|
||||
SimpleFunctionDescriptor valuesMethod = DescriptorResolver
|
||||
.createEnumClassObjectValuesMethod(thisDescriptor, trace);
|
||||
result.add(valuesMethod);
|
||||
}
|
||||
else if (name.equals(DescriptorFactory.VALUE_OF_METHOD_NAME)) {
|
||||
SimpleFunctionDescriptor valueOfMethod = DescriptorResolver
|
||||
.createEnumClassObjectValueOfMethod(thisDescriptor, trace);
|
||||
result.add(valueOfMethod);
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
@@ -311,9 +295,6 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
|
||||
}
|
||||
}
|
||||
|
||||
result.addAll(getFunctions(DescriptorFactory.VALUES_METHOD_NAME));
|
||||
result.addAll(getFunctions(DescriptorFactory.VALUE_OF_METHOD_NAME));
|
||||
|
||||
addDataClassMethods(result);
|
||||
|
||||
result.trimToSize();
|
||||
|
||||
Reference in New Issue
Block a user