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