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
@@ -66,7 +66,9 @@ class CodegenAnnotatingVisitor extends JetVisitorVoid {
Collections.singleton((funDescriptor.getReceiverParameter() != null
? KotlinBuiltIns.getInstance().getExtensionFunction(arity)
: KotlinBuiltIns.getInstance().getFunction(arity)).getDefaultType()), JetScope.EMPTY,
Collections.<ConstructorDescriptor>emptySet(), null);
Collections.<ConstructorDescriptor>emptySet(),
null,
false);
assert PsiCodegenPredictor.checkPredictedClassNameForFun(bindingContext, funDescriptor, classDescriptor);
bindingTrace.record(CLASS_FOR_FUNCTION, funDescriptor, classDescriptor);
@@ -124,7 +124,8 @@ public class CodegenBinding {
Collections.singletonList(KotlinBuiltIns.getInstance().getAnyType()),
JetScope.EMPTY,
Collections.<ConstructorDescriptor>emptySet(),
null);
null,
false);
recordClosure(bindingTrace, null, classDescriptor, null, className, false);
@@ -36,9 +36,10 @@ public class ClassDescriptorFromJvmBytecode extends MutableClassDescriptorLite {
public ClassDescriptorFromJvmBytecode(
@NotNull DeclarationDescriptor containingDeclaration,
@NotNull ClassKind kind
@NotNull ClassKind kind,
boolean isInner
) {
super(containingDeclaration, kind);
super(containingDeclaration, kind, isInner);
}
@@ -106,7 +106,7 @@ public final class JavaClassObjectResolver {
FqName fqName = new FqName(qualifiedName);
ClassPsiDeclarationProvider classObjectData = semanticServices.getPsiDeclarationProviderFactory().createBinaryClassData(classObjectPsiClass);
ClassDescriptorFromJvmBytecode classObjectDescriptor
= new ClassDescriptorFromJvmBytecode(containing, ClassKind.CLASS_OBJECT);
= new ClassDescriptorFromJvmBytecode(containing, ClassKind.CLASS_OBJECT, false);
classObjectDescriptor.setSupertypes(supertypesResolver.getSupertypes(classObjectDescriptor,
new PsiClassWrapper(classObjectPsiClass),
classObjectData,
@@ -143,7 +143,8 @@ public final class JavaClassObjectResolver {
@NotNull PsiClass psiClass
) {
FqNameUnsafe fqName = DescriptorResolverUtils.getFqNameForClassObject(psiClass);
ClassDescriptorFromJvmBytecode classObjectDescriptor = new ClassDescriptorFromJvmBytecode(containing, ClassKind.CLASS_OBJECT);
ClassDescriptorFromJvmBytecode classObjectDescriptor =
new ClassDescriptorFromJvmBytecode(containing, ClassKind.CLASS_OBJECT, false);
ClassPsiDeclarationProvider data = semanticServices.getPsiDeclarationProviderFactory().createSyntheticClassObjectClassData(psiClass);
setUpClassObjectDescriptor(classObjectDescriptor, containing, fqName, data, getClassObjectName(containing.getName().getName()));
return classObjectDescriptor;
@@ -219,7 +219,8 @@ public final class JavaClassResolver {
JetClassAnnotation jetClassAnnotation = JetClassAnnotation.get(psiClass);
ClassKind kind = getClassKind(psiClass, jetClassAnnotation);
ClassPsiDeclarationProvider classData = semanticServices.getPsiDeclarationProviderFactory().createBinaryClassData(psiClass);
ClassDescriptorFromJvmBytecode classDescriptor = new ClassDescriptorFromJvmBytecode(containingDeclaration, kind);
ClassDescriptorFromJvmBytecode classDescriptor = new ClassDescriptorFromJvmBytecode(containingDeclaration, kind,
isInnerClass(psiClass));
cache(javaClassToKotlinFqName(fqName), classDescriptor);
classDescriptor.setName(Name.identifier(psiClass.getName()));
@@ -338,6 +339,10 @@ public final class JavaClassResolver {
return psiClass.getContainingClass() != null;
}
private static boolean isInnerClass(@NotNull PsiClass psiClass) {
return isContainedInClass(psiClass) && !psiClass.hasModifierProperty(PsiModifier.STATIC);
}
@NotNull
private ClassOrNamespaceDescriptor resolveParentClass(@NotNull PsiClass psiClass) {
PsiClass containingClass = psiClass.getContainingClass();
@@ -201,7 +201,8 @@ public final class JavaPropertyResolver {
true,
Collections.<TypeParameterDescriptor>emptyList(),
Collections.<JetType>emptyList(), JetScope.EMPTY,
Collections.<ConstructorDescriptor>emptySet(), null);
Collections.<ConstructorDescriptor>emptySet(), null,
false);
trace.record(BindingContext.OBJECT_DECLARATION_CLASS, propertyDescriptor, dummyClassDescriptorForEnumEntryObject);
}
@@ -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) {
@@ -92,7 +92,7 @@ public class JetDefaultModalityModifiersTest extends JetLiteFixture {
}
private MutableClassDescriptor createClassDescriptor(ClassKind kind, JetClass aClass) {
MutableClassDescriptor classDescriptor = new MutableClassDescriptor(root, scope, kind, Name.identifier(aClass.getName()));
MutableClassDescriptor classDescriptor = new MutableClassDescriptor(root, scope, kind, false, Name.identifier(aClass.getName()));
descriptorResolver.resolveMutableClassDescriptor(aClass, classDescriptor, JetTestUtils.DUMMY_TRACE);
return classDescriptor;
}