Do not add error supertypes

If we add them, error functions and such will be in the member scope + the type checker will be confused when an ambivalent type will appear in this position
This commit is contained in:
Andrey Breslav
2012-07-04 19:08:39 +04:00
parent e443698dc1
commit e42f91a7de
@@ -18,6 +18,7 @@ package org.jetbrains.jet.lang.resolve.lazy;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.base.Predicates; import com.google.common.base.Predicates;
import com.google.common.collect.Collections2;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
@@ -32,10 +33,15 @@ import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.*; import org.jetbrains.jet.lang.resolve.scopes.*;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver; import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
import org.jetbrains.jet.lang.types.ErrorUtils;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeConstructor; import org.jetbrains.jet.lang.types.TypeConstructor;
import org.jetbrains.jet.lang.types.TypeUtils;
import java.util.*; import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/** /**
* @author abreslav * @author abreslav
@@ -43,6 +49,12 @@ import java.util.*;
public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDescriptorFromSource { public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDescriptorFromSource {
private static final Predicate<Object> ONLY_ENUM_ENTIRES = Predicates.instanceOf(JetEnumEntry.class); private static final Predicate<Object> ONLY_ENUM_ENTIRES = Predicates.instanceOf(JetEnumEntry.class);
private static final Predicate<JetType> VALID_SUPERTYPE = new Predicate<JetType>() {
@Override
public boolean apply(JetType type) {
return !ErrorUtils.isErrorType(type) && (TypeUtils.getClassDescriptor(type) != null);
}
};
private final ResolveSession resolveSession; private final ResolveSession resolveSession;
private final JetClassLikeInfo originalClassInfo; private final JetClassLikeInfo originalClassInfo;
private final ClassMemberDeclarationProvider declarationProvider; private final ClassMemberDeclarationProvider declarationProvider;
@@ -285,10 +297,11 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
this.supertypes = Collections.emptyList(); this.supertypes = Collections.emptyList();
} }
else { else {
this.supertypes = resolveSession.getInjector().getDescriptorResolver() List<JetType> allSupertypes = resolveSession.getInjector().getDescriptorResolver()
.resolveSupertypes(getScopeForClassHeaderResolution(), .resolveSupertypes(getScopeForClassHeaderResolution(),
classOrObject, classOrObject,
resolveSession.getTrace()); resolveSession.getTrace());
this.supertypes = Collections2.filter(allSupertypes, VALID_SUPERTYPE);
} }
} }
} }