Use EnumClassObjectDescriptor in lazy resolution

This commit is contained in:
Alexander Udalov
2014-07-06 15:37:58 +04:00
parent db3e5ed678
commit 7773375019
3 changed files with 13 additions and 62 deletions
@@ -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,
@@ -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);
}
@@ -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();