Add ClassDescriptor.isInner()
Implement in resolve & lazy resolve; place a stub in resolve-java #KT-1174 In Progress
This commit is contained in:
@@ -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() {
|
||||
|
||||
+5
@@ -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();
|
||||
|
||||
+2
-2
@@ -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;
|
||||
|
||||
|
||||
+11
-1
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user