Add ClassDescriptor.isInner()

Implement in resolve & lazy resolve; place a stub in resolve-java

 #KT-1174 In Progress
This commit is contained in:
Alexander Udalov
2012-12-04 22:23:56 +04:00
parent 84e4611d2b
commit e76abcb625
17 changed files with 77 additions and 26 deletions
@@ -70,6 +70,11 @@ public interface ClassDescriptor extends ClassifierDescriptor, MemberDescriptor,
@NotNull
Visibility getVisibility();
/**
* @return <code>true</code> if this class contains a reference to its outer class (as opposed to static nested class)
*/
boolean isInner();
@NotNull
ReceiverParameterDescriptor getThisAsReceiverParameter();
@@ -40,6 +40,7 @@ public class ClassDescriptorImpl extends DeclarationDescriptorNonRootImpl implem
private final Modality modality;
private ClassDescriptor classObjectDescriptor;
private final ClassKind kind;
private boolean isInner;
public ClassDescriptorImpl(
@NotNull DeclarationDescriptor containingDeclaration,
@@ -68,13 +69,14 @@ public class ClassDescriptorImpl extends DeclarationDescriptorNonRootImpl implem
@NotNull Collection<JetType> supertypes,
@NotNull JetScope memberDeclarations,
@NotNull Set<ConstructorDescriptor> constructors,
@Nullable ConstructorDescriptor primaryConstructor
@Nullable ConstructorDescriptor primaryConstructor,
boolean isInner
) {
this.typeConstructor = new TypeConstructorImpl(this, getAnnotations(), sealed, getName().getName(), typeParameters, supertypes);
this.memberDeclarations = memberDeclarations;
this.constructors = constructors;
this.primaryConstructor = primaryConstructor;
this.classObjectDescriptor = classObjectDescriptor;
this.isInner = isInner;
return this;
}
@@ -165,6 +167,11 @@ public class ClassDescriptorImpl extends DeclarationDescriptorNonRootImpl implem
return Visibilities.PUBLIC;
}
@Override
public boolean isInner() {
return isInner;
}
@NotNull
@Override
public ReceiverParameterDescriptor getThisAsReceiverParameter() {
@@ -174,6 +174,11 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor {
return original.getVisibility();
}
@Override
public boolean isInner() {
return original.isInner();
}
@Override
public boolean isClassObjectAValue() {
return original.isClassObjectAValue();
@@ -48,8 +48,8 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite {
private WritableScope scopeForInitializers = null; //contains members + primary constructor value parameters + map for backing fields
public MutableClassDescriptor(@NotNull DeclarationDescriptor containingDeclaration,
@NotNull JetScope outerScope, ClassKind kind, Name name) {
super(containingDeclaration, kind);
@NotNull JetScope outerScope, ClassKind kind, boolean isInner, Name name) {
super(containingDeclaration, kind, isInner);
RedeclarationHandler redeclarationHandler = RedeclarationHandler.DO_NOTHING;
@@ -45,6 +45,8 @@ public abstract class MutableClassDescriptorLite extends ClassDescriptorBase {
private Modality modality;
private Visibility visibility;
private final boolean isInner;
private MutableClassDescriptorLite classObjectDescriptor;
private JetType classObjectType;
private final ClassKind kind;
@@ -58,9 +60,12 @@ public abstract class MutableClassDescriptorLite extends ClassDescriptorBase {
private final DeclarationDescriptor containingDeclaration;
public MutableClassDescriptorLite(@NotNull DeclarationDescriptor containingDeclaration,
@NotNull ClassKind kind) {
@NotNull ClassKind kind,
boolean isInner
) {
this.containingDeclaration = containingDeclaration;
this.kind = kind;
this.isInner = isInner;
}
@NotNull
@@ -176,6 +181,11 @@ public abstract class MutableClassDescriptorLite extends ClassDescriptorBase {
return visibility;
}
@Override
public boolean isInner() {
return isInner;
}
public Collection<JetType> getSupertypes() {
return supertypes;
}
@@ -77,7 +77,8 @@ public class ScriptDescriptor extends DeclarationDescriptorNonRootImpl {
Collections.singletonList(KotlinBuiltIns.getInstance().getAnyType()),
classScope,
new HashSet<ConstructorDescriptor>(),
null);
null,
false);
}
public void initialize(@NotNull JetType returnType, JetScript declaration, BindingContext bindingContext) {
@@ -192,6 +192,10 @@ public class ModifiersChecker {
return defaultVisibility;
}
public static boolean isInnerClass(@Nullable JetModifierList modifierList) {
return modifierList != null && modifierList.hasModifier(INNER_KEYWORD);
}
@NotNull
public static Visibility getDefaultClassVisibility(@NotNull ClassDescriptor descriptor) {
ClassKind kind = descriptor.getKind();
@@ -585,7 +585,7 @@ public class TypeHierarchyResolver {
@NotNull Visibility visibility
) {
MutableClassDescriptor classObjectDescriptor = new MutableClassDescriptor(
classDescriptor, outerScope, ClassKind.CLASS_OBJECT, getClassObjectName(classDescriptor.getName()));
classDescriptor, outerScope, ClassKind.CLASS_OBJECT, false, getClassObjectName(classDescriptor.getName()));
classObjectDescriptor.setModality(Modality.FINAL);
classObjectDescriptor.setVisibility(visibility);
classObjectDescriptor.setTypeParameterDescriptors(new ArrayList<TypeParameterDescriptor>(0));
@@ -600,8 +600,12 @@ public class TypeHierarchyResolver {
@NotNull JetClass klass,
@NotNull DeclarationDescriptor containingDeclaration
) {
ClassKind kind = getClassKind(klass);
// Kind check is needed in order to not consider enums as inner in any case
// (otherwise it would be impossible to create a class object in the enum)
boolean isInner = kind == ClassKind.CLASS && klass.isInner();
MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor(
containingDeclaration, outerScope, getClassKind(klass), JetPsiUtil.safeName(klass.getName()));
containingDeclaration, outerScope, kind, isInner, JetPsiUtil.safeName(klass.getName()));
context.getClasses().put(klass, mutableClassDescriptor);
trace.record(FQNAME_TO_CLASS_DESCRIPTOR, JetPsiUtil.getFQName(klass), mutableClassDescriptor);
@@ -620,7 +624,7 @@ public class TypeHierarchyResolver {
@NotNull JetScope scope, @NotNull Name name, @NotNull ClassKind kind
) {
MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor(
owner.getOwnerForChildren(), scope, kind, name);
owner.getOwnerForChildren(), scope, kind, false, name);
context.getObjects().put(declaration, mutableClassDescriptor);
JetScope classScope = mutableClassDescriptor.getScopeForMemberResolution();
@@ -638,7 +642,7 @@ public class TypeHierarchyResolver {
) {
MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor(
owner.getOwnerForChildren(), getStaticScope(declaration, owner), ClassKind.ENUM_ENTRY,
JetPsiUtil.safeName(declaration.getName()));
false, JetPsiUtil.safeName(declaration.getName()));
context.getClasses().put(declaration, mutableClassDescriptor);
prepareForDeferredCall(mutableClassDescriptor.getScopeForMemberResolution(), mutableClassDescriptor, declaration);
@@ -26,10 +26,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.AnnotationResolver;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.DescriptorResolver;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.*;
import org.jetbrains.jet.lang.resolve.lazy.data.FilteringClassLikeInfo;
import org.jetbrains.jet.lang.resolve.lazy.data.JetClassInfoUtil;
import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo;
@@ -65,6 +62,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyDesc
private final Modality modality;
private final Visibility visibility;
private final ClassKind kind;
private final boolean isInner;
private ReceiverParameterDescriptor thisAsReceiverParameter;
private List<AnnotationDescriptor> annotations;
@@ -102,17 +100,17 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyDesc
this.typeConstructor = new LazyClassTypeConstructor();
JetModifierList modifierList = classLikeInfo.getModifierList();
this.kind = classLikeInfo.getClassKind();
if (kind.isObject()) {
this.modality = Modality.FINAL;
}
else {
Modality defaultModality = kind == ClassKind.TRAIT ? Modality.ABSTRACT : Modality.FINAL;
JetModifierList modifierList = classLikeInfo.getModifierList();
this.modality = resolveModalityFromModifiers(modifierList, defaultModality);
}
JetModifierList modifierList = classLikeInfo.getModifierList();
this.visibility = resolveVisibilityFromModifiers(modifierList, getDefaultClassVisibility(this));
this.isInner = isInnerClass(modifierList);
}
@Override
@@ -266,6 +264,11 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyDesc
return visibility;
}
@Override
public boolean isInner() {
return isInner;
}
@NotNull
@Override
public ReceiverParameterDescriptor getThisAsReceiverParameter() {
@@ -140,7 +140,8 @@ public class ErrorUtils {
static {
ERROR_CLASS.initialize(
true, Collections.<TypeParameterDescriptor>emptyList(), Collections.<JetType>emptyList(), createErrorScope("ERROR_CLASS"), ERROR_CONSTRUCTOR_GROUP, ERROR_CONSTRUCTOR);
true, Collections.<TypeParameterDescriptor>emptyList(), Collections.<JetType>emptyList(), createErrorScope("ERROR_CLASS"), ERROR_CONSTRUCTOR_GROUP,
ERROR_CONSTRUCTOR, false);
}
public static JetScope createErrorScope(String debugMessage) {