diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index d07d89a63d5..5c7f796b490 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -797,7 +797,7 @@ public class ExpressionCodegen extends JetVisitor { isInterface = psiElement.isInterface(); } else - isInterface = !(containingDeclaration instanceof ClassDescriptor && ((ClassDescriptor) containingDeclaration).isObject()); + isInterface = !(containingDeclaration instanceof ClassDescriptor && ((ClassDescriptor) containingDeclaration).getKind() == ClassKind.OBJECT); } v.visitMethodInsn(isStatic ? Opcodes.INVOKESTATIC : isInterface ? Opcodes.INVOKEINTERFACE : Opcodes.INVOKEVIRTUAL, owner, functionDescriptor.getName(), typeMapper.mapSignature(functionDescriptor.getName(),functionDescriptor).getDescriptor()); @@ -832,7 +832,7 @@ public class ExpressionCodegen extends JetVisitor { } else { owner = typeMapper.getOwner(propertyDescriptor, OwnerKind.INTERFACE); - isInterface = !(containingDeclaration instanceof ClassDescriptor && ((ClassDescriptor) containingDeclaration).isObject()); + isInterface = !(containingDeclaration instanceof ClassDescriptor && ((ClassDescriptor) containingDeclaration).getKind() == ClassKind.OBJECT); } return StackValue.property(propertyDescriptor.getName(), owner, typeMapper.mapType(propertyDescriptor.getOutType()), isStatic, isInterface, getter, setter); diff --git a/idea/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/idea/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 8ed05984cf2..08b87629ebc 100644 --- a/idea/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -196,7 +196,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } final ClassDescriptor outerDescriptor = getOuterClassDescriptor(); - if (outerDescriptor != null && !outerDescriptor.isObject()) { + if (outerDescriptor != null && outerDescriptor.getKind() != ClassKind.OBJECT) { final Type type = JetTypeMapper.jetImplementationType(outerDescriptor); String interfaceDesc = type.getDescriptor(); final String fieldName = "this$0"; diff --git a/idea/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/idea/src/org/jetbrains/jet/codegen/JetTypeMapper.java index e2ddd632193..911d22435d0 100644 --- a/idea/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/idea/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -204,7 +204,7 @@ public class JetTypeMapper { } private static String jetJvmName(ClassDescriptor jetClass, OwnerKind kind) { - if (jetClass.isObject()) { + if (jetClass.getKind() == ClassKind.OBJECT) { return jvmNameForImplementation(jetClass); } if (kind == OwnerKind.INTERFACE) { @@ -272,7 +272,7 @@ public class JetTypeMapper { if (kind instanceof OwnerKind.DelegateKind) { kind = OwnerKind.INTERFACE; } - else if (classDescriptor.isObject()) { + else if (classDescriptor.getKind() == ClassKind.OBJECT) { kind = OwnerKind.IMPLEMENTATION; } owner = jvmName(classDescriptor, kind); diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptor.java index d900377c2a5..7f5008c9376 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptor.java @@ -48,8 +48,9 @@ public interface ClassDescriptor extends ClassifierDescriptor { @Nullable JetType getClassObjectType(); - boolean isObject(); + @NotNull + ClassKind getKind(); @NotNull - ClassModifiers getModifiers(); + Modality getModality(); } diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java b/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java index f11b14c38c4..2e3c73ce671 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java @@ -120,9 +120,10 @@ public class ClassDescriptorImpl extends DeclarationDescriptorImpl implements Cl return null; } + @NotNull @Override - public boolean isObject() { - return false; + public ClassKind getKind() { + return ClassKind.CLASS; } @Override @@ -147,7 +148,7 @@ public class ClassDescriptorImpl extends DeclarationDescriptorImpl implements Cl @Override @NotNull - public ClassModifiers getModifiers() { - return ClassModifiers.DEFAULT_MODIFIERS; + public Modality getModality() { + return Modality.FINAL; } } diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/ClassKind.java b/idea/src/org/jetbrains/jet/lang/descriptors/ClassKind.java new file mode 100644 index 00000000000..344a7db0646 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/descriptors/ClassKind.java @@ -0,0 +1,12 @@ +package org.jetbrains.jet.lang.descriptors; + +/** + * @author abreslav + */ +public enum ClassKind { + CLASS, + TRAIT, + ENUM_CLASS, + ANNOTATION_CLASS, + OBJECT +} diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/ClassModifiers.java b/idea/src/org/jetbrains/jet/lang/descriptors/ClassModifiers.java deleted file mode 100644 index a7012d36788..00000000000 --- a/idea/src/org/jetbrains/jet/lang/descriptors/ClassModifiers.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.jetbrains.jet.lang.descriptors; - -/** - * @author svtk - */ -public class ClassModifiers extends Modifiers { - public static final ClassModifiers DEFAULT_MODIFIERS = new ClassModifiers(false, false, false, false); - - private boolean open; - private boolean trait; - private boolean isEnum; - - public ClassModifiers(boolean anAbstract, boolean open, boolean trait, boolean isEnum) { - super(anAbstract); - this.open = open; - this.trait = trait; - this.isEnum = isEnum; - } - - public boolean isOpen() { - return open; - } - - public boolean isTrait() { - return trait; - } - - public boolean isEnum() { - return isEnum; - } -} diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/ConstructorDescriptorImpl.java b/idea/src/org/jetbrains/jet/lang/descriptors/ConstructorDescriptorImpl.java index 300c3836ff5..84353643830 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/ConstructorDescriptorImpl.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/ConstructorDescriptorImpl.java @@ -28,13 +28,13 @@ public class ConstructorDescriptorImpl extends FunctionDescriptorImpl implements @Override @Deprecated - public FunctionDescriptorImpl initialize(@Nullable JetType receiverType, @NotNull List typeParameters, @NotNull List unsubstitutedValueParameters, @Nullable JetType unsubstitutedReturnType, MemberModifiers modifiers) { + public FunctionDescriptorImpl initialize(@Nullable JetType receiverType, @NotNull List typeParameters, @NotNull List unsubstitutedValueParameters, @Nullable JetType unsubstitutedReturnType, Modality modality) { assert receiverType == null; - return super.initialize(null, typeParameters, unsubstitutedValueParameters, unsubstitutedReturnType, modifiers); + return super.initialize(null, typeParameters, unsubstitutedValueParameters, unsubstitutedReturnType, modality); } - public ConstructorDescriptorImpl initialize(@NotNull List typeParameters, @NotNull List unsubstitutedValueParameters, MemberModifiers modifiers) { - super.initialize(null, typeParameters, unsubstitutedValueParameters, null, modifiers); + public ConstructorDescriptorImpl initialize(@NotNull List typeParameters, @NotNull List unsubstitutedValueParameters, Modality modality) { + super.initialize(null, typeParameters, unsubstitutedValueParameters, null, modality); return this; } diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java b/idea/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java index 8a2f4413fdd..7d30f10eb1d 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java @@ -23,7 +23,7 @@ public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements private JetType unsubstitutedReturnType; private JetType receiverType; - private MemberModifiers modifiers; + private Modality modality; private final Set overriddenFunctions = Sets.newLinkedHashSet(); private final FunctionDescriptor original; @@ -48,12 +48,12 @@ public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements @NotNull List typeParameters, @NotNull List unsubstitutedValueParameters, @Nullable JetType unsubstitutedReturnType, - @Nullable MemberModifiers modifiers) { + @Nullable Modality modality) { this.receiverType = receiverType; this.typeParameters = typeParameters; this.unsubstitutedValueParameters = unsubstitutedValueParameters; this.unsubstitutedReturnType = unsubstitutedReturnType; - this.modifiers = modifiers; + this.modality = modality; return this; } @@ -74,8 +74,8 @@ public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements @NotNull @Override - public MemberModifiers getModifiers() { - return modifiers; + public Modality getModality() { + return modality; } public void addOverriddenFunction(@NotNull FunctionDescriptor overriddenFunction) { @@ -140,7 +140,7 @@ public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements substitutedTypeParameters, substitutedValueParameters, substitutedReturnType, - modifiers + modality ); return substitutedDescriptor; } diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java index 771bc702f6c..7db18637f16 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java @@ -144,15 +144,16 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor { return original.getClassObjectType(); } + @NotNull @Override - public boolean isObject() { - return original.isObject(); + public ClassKind getKind() { + return original.getKind(); } @Override @NotNull - public ClassModifiers getModifiers() { - return original.getModifiers(); + public Modality getModality() { + return original.getModality(); } @Override diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/MemberDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/MemberDescriptor.java index 97b8814acff..bc9c1ef7716 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/MemberDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/MemberDescriptor.java @@ -7,5 +7,5 @@ import org.jetbrains.annotations.NotNull; */ public interface MemberDescriptor { @NotNull - MemberModifiers getModifiers(); + Modality getModality(); } diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/MemberModifiers.java b/idea/src/org/jetbrains/jet/lang/descriptors/MemberModifiers.java deleted file mode 100644 index f0c74b90bf7..00000000000 --- a/idea/src/org/jetbrains/jet/lang/descriptors/MemberModifiers.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.jetbrains.jet.lang.descriptors; - -/** - * @author abreslav - */ -public class MemberModifiers extends Modifiers { - public static final MemberModifiers DEFAULT_MODIFIERS = new MemberModifiers(false, false, false); - - private final boolean isVirtual; - private final boolean isOverride; - - public MemberModifiers(boolean isAbstract, boolean isVirtual, boolean isOverride) { - super(isAbstract); - this.isVirtual = isVirtual; - this.isOverride = isOverride; - } - - - public boolean isVirtual() { - return isVirtual; - } - - public boolean isOverride() { - return isOverride; - } -} diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/Modality.java b/idea/src/org/jetbrains/jet/lang/descriptors/Modality.java new file mode 100644 index 00000000000..e836f719f34 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/descriptors/Modality.java @@ -0,0 +1,26 @@ +package org.jetbrains.jet.lang.descriptors; + +/** + * @author abreslav + */ +public enum Modality { + FINAL(false), + OPEN(true), + ABSTRACT(true); + + private final boolean open; + + private Modality(boolean open) { + this.open = open; + } + + public boolean isOpen() { + return open; + } + + public static Modality convertFromFlags(boolean _abstract, boolean open) { + if (_abstract) return ABSTRACT; + if (open) return OPEN; + return FINAL; + } +} diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java index e9e057881ae..6dab128813c 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java @@ -22,7 +22,7 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme private List typeParameters = Lists.newArrayList(); private Collection supertypes = Lists.newArrayList(); - private ClassModifiers classModifiers; + private Modality modality; private TypeConstructor typeConstructor; private final WritableScope scopeForMemberResolution; private final WritableScope scopeForMemberLookup; @@ -31,19 +31,19 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme private MutableClassDescriptor classObjectDescriptor; private JetType classObjectType; private JetType defaultType; - private final boolean isObject; + private final ClassKind kind; private JetType superclassType; public MutableClassDescriptor(@NotNull BindingTrace trace, @NotNull DeclarationDescriptor containingDeclaration, @NotNull JetScope outerScope) { - this(trace, containingDeclaration, outerScope, false); + this(trace, containingDeclaration, outerScope, ClassKind.CLASS); } - public MutableClassDescriptor(@NotNull BindingTrace trace, @NotNull DeclarationDescriptor containingDeclaration, @NotNull JetScope outerScope, boolean isObject) { + public MutableClassDescriptor(@NotNull BindingTrace trace, @NotNull DeclarationDescriptor containingDeclaration, @NotNull JetScope outerScope, ClassKind kind) { super(containingDeclaration); this.scopeForMemberLookup = new WritableScopeImpl(JetScope.EMPTY, this, trace.getErrorHandler()).setDebugName("MemberLookup"); this.scopeForSupertypeResolution = new WritableScopeImpl(outerScope, this, trace.getErrorHandler()).setDebugName("SupertypeResolution"); this.scopeForMemberResolution = new WritableScopeImpl(new ChainedScope(this, scopeForMemberLookup, scopeForSupertypeResolution), this, trace.getErrorHandler()).setDebugName("MemberResolution"); - this.isObject = isObject; + this.kind = kind; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -51,7 +51,7 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme @Override public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptor classObjectDescriptor) { if (this.classObjectDescriptor != null) return ClassObjectStatus.DUPLICATE; - assert classObjectDescriptor.isObject(); + assert classObjectDescriptor.getKind() == ClassKind.OBJECT; this.classObjectDescriptor = classObjectDescriptor; return ClassObjectStatus.OK; } @@ -153,7 +153,7 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme this.typeConstructor = new TypeConstructorImpl( this, Collections.emptyList(), // TODO : pass annotations from the class? - !classModifiers.isOpen(), + !modality.isOpen(), getName(), typeParameters, supertypes); @@ -244,9 +244,10 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme return !constructors.isEmpty(); } + @NotNull @Override - public boolean isObject() { - return isObject; + public ClassKind getKind() { + return kind; } @NotNull @@ -260,14 +261,14 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme } - public void setClassModifiers(ClassModifiers classModifiers) { - this.classModifiers = classModifiers; + public void setModality(Modality modality) { + this.modality = modality; } @Override @NotNull - public ClassModifiers getModifiers() { - return classModifiers; + public Modality getModality() { + return modality; } @Override diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/PropertyAccessorDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/PropertyAccessorDescriptor.java index 7192db55745..8ed128622d4 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/PropertyAccessorDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/PropertyAccessorDescriptor.java @@ -14,17 +14,17 @@ public abstract class PropertyAccessorDescriptor extends DeclarationDescriptorIm private final boolean hasBody; private final boolean isDefault; - private final MemberModifiers modifiers; + private final Modality modality; protected PropertyAccessorDescriptor( - @NotNull MemberModifiers modifiers, + @NotNull Modality modality, @NotNull PropertyDescriptor correspondingProperty, @NotNull List annotations, @NotNull String name, boolean hasBody, boolean isDefault) { super(correspondingProperty.getContainingDeclaration(), annotations, name); - this.modifiers = modifiers; + this.modality = modality; this.hasBody = hasBody; this.isDefault = isDefault; } @@ -57,7 +57,7 @@ public abstract class PropertyAccessorDescriptor extends DeclarationDescriptorIm @NotNull @Override - public MemberModifiers getModifiers() { - return modifiers; + public Modality getModality() { + return modality; } } diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/PropertyDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/PropertyDescriptor.java index 3461fb5a82a..a8b134f1032 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/PropertyDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/PropertyDescriptor.java @@ -15,7 +15,7 @@ import java.util.List; */ public class PropertyDescriptor extends VariableDescriptorImpl implements MemberDescriptor { - private final MemberModifiers memberModifiers; + private final Modality modality; private final boolean isVar; private final JetType receiverType; private final List typeParemeters = Lists.newArrayListWithCapacity(0); @@ -27,7 +27,7 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Member @Nullable PropertyDescriptor original, @NotNull DeclarationDescriptor containingDeclaration, @NotNull List annotations, - @NotNull MemberModifiers memberModifiers, + @NotNull Modality modality, boolean isVar, @Nullable JetType receiverType, @NotNull String name, @@ -37,7 +37,7 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Member assert !isVar || inType != null; // assert outType != null; this.isVar = isVar; - this.memberModifiers = memberModifiers; + this.modality = modality; this.receiverType = receiverType; this.original = original == null ? this : original.getOriginal(); } @@ -45,13 +45,13 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Member public PropertyDescriptor( @NotNull DeclarationDescriptor containingDeclaration, @NotNull List annotations, - @NotNull MemberModifiers memberModifiers, + @NotNull Modality modality, boolean isVar, @Nullable JetType receiverType, @NotNull String name, @Nullable JetType inType, @NotNull JetType outType) { - this(null, containingDeclaration, annotations, memberModifiers, isVar, receiverType, name, inType, outType); + this(null, containingDeclaration, annotations, modality, isVar, receiverType, name, inType, outType); } private PropertyDescriptor( @@ -63,7 +63,7 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Member original, original.getContainingDeclaration(), original.getAnnotations(), // TODO : substitute? - original.getModifiers(), + original.getModality(), original.isVar, receiverType, original.getName(), @@ -101,8 +101,8 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Member @NotNull @Override - public MemberModifiers getModifiers() { - return memberModifiers; + public Modality getModality() { + return modality; } @Nullable diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/PropertyGetterDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/PropertyGetterDescriptor.java index 9b11796a206..7034626fe50 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/PropertyGetterDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/PropertyGetterDescriptor.java @@ -17,8 +17,8 @@ public class PropertyGetterDescriptor extends PropertyAccessorDescriptor { private final Set overriddenGetters = Sets.newHashSet(); private JetType returnType; - public PropertyGetterDescriptor(@NotNull MemberModifiers modifiers, @NotNull PropertyDescriptor correspondingProperty, @NotNull List annotations, @Nullable JetType returnType, boolean hasBody, boolean isDefault) { - super(modifiers, correspondingProperty, annotations, "get-" + correspondingProperty.getName(), hasBody, isDefault); + public PropertyGetterDescriptor(@NotNull Modality modality, @NotNull PropertyDescriptor correspondingProperty, @NotNull List annotations, @Nullable JetType returnType, boolean hasBody, boolean isDefault) { + super(modality, correspondingProperty, annotations, "get-" + correspondingProperty.getName(), hasBody, isDefault); this.returnType = returnType == null ? correspondingProperty.getOutType() : returnType; } diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/PropertySetterDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/PropertySetterDescriptor.java index c641b12e7d7..94a3774ff74 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/PropertySetterDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/PropertySetterDescriptor.java @@ -18,8 +18,8 @@ public class PropertySetterDescriptor extends PropertyAccessorDescriptor { private MutableValueParameterDescriptor parameter; private final Set overriddenSetters = Sets.newHashSet(); - public PropertySetterDescriptor(@NotNull MemberModifiers modifiers, @NotNull PropertyDescriptor correspondingProperty, @NotNull List annotations, boolean hasBody, boolean isDefault) { - super(modifiers, correspondingProperty, annotations, "set-" + correspondingProperty.getName(), hasBody, isDefault); + public PropertySetterDescriptor(@NotNull Modality modality, @NotNull PropertyDescriptor correspondingProperty, @NotNull List annotations, boolean hasBody, boolean isDefault) { + super(modality, correspondingProperty, annotations, "set-" + correspondingProperty.getName(), hasBody, isDefault); } public void initialize(@NotNull MutableValueParameterDescriptor parameter) { diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/VariableAsFunctionDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/VariableAsFunctionDescriptor.java index 57ed3275e0b..dadf04cad21 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/VariableAsFunctionDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/VariableAsFunctionDescriptor.java @@ -16,7 +16,7 @@ public class VariableAsFunctionDescriptor extends FunctionDescriptorImpl { assert outType != null; assert JetStandardClasses.isFunctionType(outType); VariableAsFunctionDescriptor result = new VariableAsFunctionDescriptor(variableDescriptor); - result.initialize(JetStandardClasses.getReceiverType(outType), Collections.emptyList(), JetStandardClasses.getValueParameters(result, outType), JetStandardClasses.getReturnType(outType), MemberModifiers.DEFAULT_MODIFIERS); + result.initialize(JetStandardClasses.getReceiverType(outType), Collections.emptyList(), JetStandardClasses.getValueParameters(result, outType), JetStandardClasses.getReturnType(outType), Modality.FINAL); return result; } diff --git a/idea/src/org/jetbrains/jet/lang/resolve/BindingContext.java b/idea/src/org/jetbrains/jet/lang/resolve/BindingContext.java index 206ca3cd8df..0628cf1eb20 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/BindingContext.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/BindingContext.java @@ -47,7 +47,7 @@ public interface BindingContext { return jetParameter.getValOrVarNode() != null || backingFieldRequired; } - if (propertyDescriptor.getModifiers().isAbstract()) return false; + if (propertyDescriptor.getModality() == Modality.ABSTRACT) return false; PropertyGetterDescriptor getter = propertyDescriptor.getGetter(); PropertySetterDescriptor setter = propertyDescriptor.getSetter(); if (getter == null) { @@ -56,10 +56,10 @@ public interface BindingContext { else if (propertyDescriptor.isVar() && setter == null) { return true; } - else if (setter != null && !setter.hasBody() && !setter.getModifiers().isAbstract()) { + else if (setter != null && !setter.hasBody() && setter.getModality() != Modality.ABSTRACT) { return true; } - else if (!getter.hasBody() && !getter.getModifiers().isAbstract()) { + else if (!getter.hasBody() && getter.getModality() != Modality.ABSTRACT) { return true; } return backingFieldRequired; diff --git a/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java b/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java index cb6d9b99f1a..0829a8045e7 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java @@ -141,7 +141,8 @@ public class ClassDescriptorResolver { index++; } descriptor.setTypeParameterDescriptors(typeParameters); - descriptor.setClassModifiers(resolveClassModifiers(classElement.getModifierList())); + Modality defaultModality = descriptor.getKind() == ClassKind.TRAIT ? Modality.ABSTRACT : Modality.FINAL; + descriptor.setModality(resolveModalityFromModifiers(classElement.getModifierList(), defaultModality)); trace.record(BindingContext.CLASS, classElement, descriptor); } @@ -221,21 +222,21 @@ public class ClassDescriptorResolver { returnType = ErrorUtils.createErrorType("No type, no body"); } } - MemberModifiers defaultModifiers; + Modality defaultModality; if (containingDescriptor instanceof ClassDescriptor) { - boolean isDefinitelyAbstract = ((ClassDescriptor) containingDescriptor).getModifiers().isTrait() && function.getBodyExpression() == null; - defaultModifiers = new MemberModifiers(isDefinitelyAbstract, isDefinitelyAbstract, false); + boolean isDefinitelyAbstract = ((ClassDescriptor) containingDescriptor).getKind() == ClassKind.TRAIT && function.getBodyExpression() == null; + defaultModality = isDefinitelyAbstract ? Modality.ABSTRACT : Modality.FINAL; } else { - defaultModifiers = MemberModifiers.DEFAULT_MODIFIERS; + defaultModality = Modality.FINAL; } - MemberModifiers memberModifiers = resolveMemberModifiers(function.getModifierList(), defaultModifiers); + Modality modality = resolveModalityFromModifiers(function.getModifierList(), defaultModality); functionDescriptor.initialize( receiverType, typeParameterDescriptors, valueParameterDescriptors, returnType, - memberModifiers); + modality); trace.record(BindingContext.FUNCTION, function, functionDescriptor); return functionDescriptor; @@ -468,7 +469,7 @@ public class ClassDescriptorResolver { PropertyDescriptor propertyDescriptor = new PropertyDescriptor( containingDeclaration, annotationResolver.createAnnotationStubs(modifierList), - resolveMemberModifiers(modifierList), // TODO : default modifiers differ in different contexts + resolveModalityFromModifiers(modifierList), // TODO : default modifiers differ in different contexts false, null, JetPsiUtil.safeName(objectDeclaration.getName()), @@ -518,7 +519,7 @@ public class ClassDescriptorResolver { PropertyDescriptor propertyDescriptor = new PropertyDescriptor( containingDeclaration, annotationResolver.resolveAnnotations(scope, modifierList), - resolveMemberModifiers(modifierList), // TODO : default modifiers differ in different contexts + resolveModalityFromModifiers(modifierList), // TODO : default modifiers differ in different contexts isVar, receiverType, JetPsiUtil.safeName(property.getName()), @@ -564,39 +565,30 @@ public class ClassDescriptorResolver { return typeResolver.resolveType(scope, propertyTypeRef); } } - - private static ClassModifiers resolveClassModifiers(@Nullable JetModifierList modifierList) { - if (modifierList == null) return ClassModifiers.DEFAULT_MODIFIERS; - boolean abstractModifier = modifierList.hasModifier(JetTokens.ABSTRACT_KEYWORD); - boolean traitModifier = modifierList.hasModifier(JetTokens.TRAIT_KEYWORD); - boolean enumModifier = modifierList.hasModifier(JetTokens.ENUM_KEYWORD); - boolean openModifier = modifierList.hasModifier(JetTokens.OPEN_KEYWORD); - return new ClassModifiers( - abstractModifier || traitModifier, - openModifier || abstractModifier || traitModifier, - traitModifier, - enumModifier - ); - } - + @NotNull - private MemberModifiers resolveMemberModifiers(@Nullable JetModifierList modifierList, @NotNull MemberModifiers defaultModifiers) { - if (modifierList == null) return defaultModifiers; - boolean abstractModifier = modifierList.hasModifier(JetTokens.ABSTRACT_KEYWORD); - boolean virtualModifier = modifierList.hasModifier(JetTokens.VIRTUAL_KEYWORD); - boolean overrideModifier = modifierList.hasModifier(JetTokens.OVERRIDE_KEYWORD); - return new MemberModifiers( - abstractModifier || defaultModifiers.isAbstract(), - virtualModifier || abstractModifier || overrideModifier || defaultModifiers.isVirtual(), - overrideModifier || defaultModifiers.isOverride() - ); - } - - @NotNull - private MemberModifiers resolveMemberModifiers(@Nullable JetModifierList modifierList) { - return resolveMemberModifiers(modifierList, MemberModifiers.DEFAULT_MODIFIERS); + private Modality resolveModalityFromModifiers(@Nullable JetModifierList modifierList) { + return resolveModalityFromModifiers(modifierList, Modality.FINAL); } + @NotNull + private Modality resolveModalityFromModifiers(@Nullable JetModifierList modifierList, @NotNull Modality defaultModality) { + if (modifierList == null) return defaultModality; + if (modifierList.hasModifier(JetTokens.ABSTRACT_KEYWORD)) { + return Modality.ABSTRACT; + } + if (modifierList.hasModifier(JetTokens.OPEN_KEYWORD)) { + return Modality.OPEN; + } + if (modifierList.hasModifier(JetTokens.OVERRIDE_KEYWORD)) { + return Modality.OPEN; + } + if (modifierList.hasModifier(JetTokens.FINAL_KEYWORD)) { + return Modality.FINAL; + } + return defaultModality; + } + @Nullable private PropertySetterDescriptor resolvePropertySetterDescriptor(@NotNull JetScope scope, @NotNull JetProperty property, @NotNull PropertyDescriptor propertyDescriptor) { JetPropertyAccessor setter = property.getSetter(); @@ -606,7 +598,7 @@ public class ClassDescriptorResolver { JetParameter parameter = setter.getParameter(); setterDescriptor = new PropertySetterDescriptor( - resolveMemberModifiers(setter.getModifierList()), // TODO : default modifiers differ in different contexts + resolveModalityFromModifiers(setter.getModifierList()), // TODO : default modifiers differ in different contexts propertyDescriptor, annotations, setter.getBodyExpression() != null, false); if (parameter != null) { if (parameter.isRef()) { @@ -644,7 +636,7 @@ public class ClassDescriptorResolver { } else if (property.isVar()) { setterDescriptor = new PropertySetterDescriptor( - propertyDescriptor.getModifiers(), + propertyDescriptor.getModality(), propertyDescriptor, Collections.emptyList(), false, true); } @@ -670,13 +662,13 @@ public class ClassDescriptorResolver { } getterDescriptor = new PropertyGetterDescriptor( - resolveMemberModifiers(getter.getModifierList()), // TODO : default modifiers differ in different contexts + resolveModalityFromModifiers(getter.getModifierList()), // TODO : default modifiers differ in different contexts propertyDescriptor, annotations, returnType, getter.getBodyExpression() != null, false); trace.record(BindingContext.PROPERTY_ACCESSOR, getter, getterDescriptor); } else { getterDescriptor = new PropertyGetterDescriptor( - propertyDescriptor.getModifiers(), + propertyDescriptor.getModality(), propertyDescriptor, Collections.emptyList(), propertyDescriptor.getOutType(), false, true); } return getterDescriptor; @@ -710,7 +702,7 @@ public class ClassDescriptorResolver { constructorDescriptor, new WritableScopeImpl(scope, classDescriptor, trace.getErrorHandler()).setDebugName("Scope with value parameters of a constructor"), valueParameters), - MemberModifiers.DEFAULT_MODIFIERS); + Modality.FINAL); } @Nullable @@ -745,7 +737,7 @@ public class ClassDescriptorResolver { PropertyDescriptor propertyDescriptor = new PropertyDescriptor( classDescriptor, annotationResolver.resolveAnnotations(scope, modifierList), - resolveMemberModifiers(modifierList), + resolveModalityFromModifiers(modifierList), isMutable, null, name == null ? "" : name, diff --git a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index e4102b77ff3..20c39e71474 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -170,9 +170,9 @@ public class TopDownAnalyzer { MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor(trace, owner, outerScope); if (klass.hasModifier(JetTokens.ENUM_KEYWORD)) { - MutableClassDescriptor classObjectDescriptor = new MutableClassDescriptor(trace, mutableClassDescriptor, outerScope, true); + MutableClassDescriptor classObjectDescriptor = new MutableClassDescriptor(trace, mutableClassDescriptor, outerScope, ClassKind.OBJECT); classObjectDescriptor.setName("class-object-for-" + klass.getName()); - classObjectDescriptor.setClassModifiers(ClassModifiers.DEFAULT_MODIFIERS); + classObjectDescriptor.setModality(Modality.FINAL); classObjectDescriptor.createTypeConstructor(); createPrimaryConstructor(classObjectDescriptor); mutableClassDescriptor.setClassObjectDescriptor(classObjectDescriptor); @@ -213,7 +213,7 @@ public class TopDownAnalyzer { } private MutableClassDescriptor createClassDescriptorForObject(@NotNull JetClassOrObject declaration, @NotNull NamespaceLike owner) { - MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor(trace, owner, outerScope, true) { + MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor(trace, owner, outerScope, ClassKind.OBJECT) { @Override public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptor classObjectDescriptor) { return ClassObjectStatus.NOT_ALLOWED; @@ -228,7 +228,7 @@ public class TopDownAnalyzer { private void createPrimaryConstructor(MutableClassDescriptor mutableClassDescriptor) { ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(mutableClassDescriptor, Collections.emptyList(), true); constructorDescriptor.initialize(Collections.emptyList(), Collections.emptyList(), - MemberModifiers.DEFAULT_MODIFIERS); + Modality.FINAL); // TODO : make the constructor private? mutableClassDescriptor.setPrimaryConstructor(constructorDescriptor); } @@ -331,7 +331,7 @@ public class TopDownAnalyzer { } for (Map.Entry entry : objects.entrySet()) { MutableClassDescriptor descriptor = entry.getValue(); - descriptor.setClassModifiers(ClassModifiers.DEFAULT_MODIFIERS); + descriptor.setModality(Modality.FINAL); descriptor.createTypeConstructor(); } } @@ -487,7 +487,7 @@ public class TopDownAnalyzer { private void processPrimaryConstructor(MutableClassDescriptor classDescriptor, JetClass klass) { if (!klass.hasPrimaryConstructor()) return; - if (classDescriptor.getModifiers().isTrait()) { + if (classDescriptor.getKind() == ClassKind.TRAIT) { trace.getErrorHandler().genericError(klass.getPrimaryConstructorParameterList().getNode(), "A trait may not have a constructor"); } @@ -509,7 +509,7 @@ public class TopDownAnalyzer { } private void processSecondaryConstructor(MutableClassDescriptor classDescriptor, JetConstructor constructor) { - if (classDescriptor.getModifiers().isTrait()) { + if (classDescriptor.getKind() == ClassKind.TRAIT) { trace.getErrorHandler().genericError(constructor.getNameNode(), "A trait may not have a constructor"); } ConstructorDescriptor constructorDescriptor = classDescriptorResolver.resolveSecondaryConstructorDescriptor( @@ -559,7 +559,7 @@ public class TopDownAnalyzer { for (JetType supertype : classDescriptor.getTypeConstructor().getSupertypes()) { FunctionDescriptor overridden = findFunctionOverridableBy(declaredFunction, supertype); if (overridden != null) { - if (hasOverrideModifier && !overridden.getModifiers().isVirtual() && !foundError) { + if (hasOverrideModifier && !overridden.getModality().isOpen() && !foundError) { trace.getErrorHandler().genericError(overrideNode, "Method " + overridden.getName() + " in " + overridden.getContainingDeclaration().getName() + " is final and can not be overridden"); foundError = true; } @@ -635,7 +635,7 @@ public class TopDownAnalyzer { @Override public void visitDelegationByExpressionSpecifier(JetDelegatorByExpressionSpecifier specifier) { - if (descriptor.getModifiers().isTrait()) { + if (descriptor.getKind() == ClassKind.TRAIT) { trace.getErrorHandler().genericError(specifier.getNode(), "Traits can not use delegation"); } JetType supertype = trace.getBindingContext().get(BindingContext.TYPE, specifier.getTypeReference()); @@ -656,7 +656,7 @@ public class TopDownAnalyzer { public void visitDelegationToSuperCallSpecifier(JetDelegatorToSuperCall call) { JetValueArgumentList valueArgumentList = call.getValueArgumentList(); ASTNode node = valueArgumentList == null ? call.getNode() : valueArgumentList.getNode(); - if (descriptor.getModifiers().isTrait()) { + if (descriptor.getKind() == ClassKind.TRAIT) { trace.getErrorHandler().genericError(node, "Traits can not initialize supertypes"); } JetTypeReference typeReference = call.getTypeReference(); @@ -667,7 +667,7 @@ public class TopDownAnalyzer { recordSupertype(typeReference, supertype); ClassDescriptor classDescriptor = TypeUtils.getClassDescriptor(supertype); if (classDescriptor != null) { - if (classDescriptor.getModifiers().isTrait()) { + if (classDescriptor.getKind() == ClassKind.TRAIT) { trace.getErrorHandler().genericError(node, "A trait may not have a constructor"); } } @@ -676,7 +676,7 @@ public class TopDownAnalyzer { recordSupertype(typeReference, trace.getBindingContext().get(BindingContext.TYPE, typeReference)); } } - else if (!descriptor.getModifiers().isTrait()) { + else if (descriptor.getKind() != ClassKind.TRAIT) { JetType supertype = trace.getBindingContext().get(BindingContext.TYPE, typeReference); recordSupertype(typeReference, supertype); @@ -695,8 +695,8 @@ public class TopDownAnalyzer { if (supertype != null) { ClassDescriptor classDescriptor = TypeUtils.getClassDescriptor(supertype); if (classDescriptor != null) { - if (!descriptor.getModifiers().isTrait()) { - if (classDescriptor.hasConstructors() && !ErrorUtils.isError(classDescriptor.getTypeConstructor()) && !classDescriptor.getModifiers().isTrait()) { + if (descriptor.getKind() != ClassKind.TRAIT) { + if (classDescriptor.hasConstructors() && !ErrorUtils.isError(classDescriptor.getTypeConstructor()) && classDescriptor.getKind() != ClassKind.TRAIT) { trace.getErrorHandler().genericError(specifier.getNode(), "This type has a constructor, and thus must be initialized here"); } } @@ -738,7 +738,7 @@ public class TopDownAnalyzer { ClassDescriptor classDescriptor = TypeUtils.getClassDescriptor(supertype); if (classDescriptor != null) { - if (!classDescriptor.getModifiers().isTrait()) { + if (classDescriptor.getKind() != ClassKind.TRAIT) { if (classAppeared) { trace.getErrorHandler().genericError(typeReference.getNode(), "Only one class may appear in a supertype list"); } @@ -984,13 +984,13 @@ public class TopDownAnalyzer { JetPropertyAccessor setter = property.getSetter(); PsiElement nameIdentifier = property.getNameIdentifier(); ASTNode nameNode = nameIdentifier == null ? property.getNode() : nameIdentifier.getNode(); - if (propertyDescriptor.getModifiers().isAbstract()) { + if (propertyDescriptor.getModality() == Modality.ABSTRACT) { if (classDescriptor == null) { trace.getErrorHandler().genericError(property.getModifierList().getModifierNode(JetTokens.ABSTRACT_KEYWORD), "Global property can not be abstract"); return; } - if (!classDescriptor.getModifiers().isAbstract()) { + if (classDescriptor.getModality() != Modality.ABSTRACT) { trace.getErrorHandler().genericError(property.getModifierList().getModifierNode(JetTokens.ABSTRACT_KEYWORD), "Abstract property " + property.getName() + " in non-abstract class " + classDescriptor.getName()); return; @@ -1011,7 +1011,7 @@ public class TopDownAnalyzer { if (initializer == null && !trace.getBindingContext().get(BindingContext.IS_INITIALIZED, propertyDescriptor)) { if (classDescriptor == null || (getter != null && getter.getBodyExpression() != null) || (setter != null && setter.getBodyExpression() != null)) { trace.getErrorHandler().genericError(nameNode, "Property must be initialized"); - } else if (!classDescriptor.getModifiers().isTrait()) { + } else if (classDescriptor.getKind() != ClassKind.TRAIT) { trace.getErrorHandler().genericError(nameNode, "Property must be initialized or be abstract"); } } @@ -1030,9 +1030,9 @@ public class TopDownAnalyzer { boolean hasAbstractModifier = abstractNode != null; if (containingDescriptor instanceof ClassDescriptor) { ClassDescriptor classDescriptor = (ClassDescriptor) containingDescriptor; - boolean inTrait = classDescriptor.getModifiers().isTrait(); - boolean inEnum = classDescriptor.getModifiers().isEnum(); - boolean inAbstractClass = classDescriptor.getModifiers().isAbstract(); + boolean inTrait = classDescriptor.getKind() == ClassKind.TRAIT; + boolean inEnum = classDescriptor.getKind() == ClassKind.ENUM_CLASS; + boolean inAbstractClass = classDescriptor.getModality() == Modality.ABSTRACT; if (hasAbstractModifier && !inAbstractClass && !inTrait && !inEnum) { trace.getErrorHandler().genericError(abstractNode, "Abstract method " + function.getName() + " in non-abstract class " + classDescriptor.getName()); } diff --git a/idea/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java b/idea/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java index f7e2e41d497..6440ad0fef3 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java @@ -101,8 +101,8 @@ public class CallResolver { @Override public boolean performAdvancedChecks(D descriptor, BindingTrace trace, TracingStrategy tracing) { if (descriptor instanceof ConstructorDescriptor) { - ClassModifiers modifiers = ((ConstructorDescriptor) descriptor).getContainingDeclaration().getModifiers(); - if (modifiers.isAbstract()) { + Modality modality = ((ConstructorDescriptor) descriptor).getContainingDeclaration().getModality(); + if (modality == Modality.ABSTRACT) { tracing.reportOverallResolutionError(trace, "Can not create an instance of an abstract class"); return false; } diff --git a/idea/src/org/jetbrains/jet/lang/resolve/java/JavaClassDescriptor.java b/idea/src/org/jetbrains/jet/lang/resolve/java/JavaClassDescriptor.java index 840d47ce0a0..4d0ae312517 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/java/JavaClassDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/java/JavaClassDescriptor.java @@ -20,20 +20,22 @@ public class JavaClassDescriptor extends MutableDeclarationDescriptor implements private JavaClassMembersScope unsubstitutedMemberScope; private JetType classObjectType; private final WritableFunctionGroup constructors = new WritableFunctionGroup(""); - private ClassModifiers modifiers; + private Modality modality; private JetType superclassType; + private final ClassKind kind; - public JavaClassDescriptor(DeclarationDescriptor containingDeclaration) { + public JavaClassDescriptor(DeclarationDescriptor containingDeclaration, @NotNull ClassKind kind) { super(containingDeclaration); + this.kind = kind; } public void setTypeConstructor(TypeConstructor typeConstructor) { this.typeConstructor = typeConstructor; } - public void setModifiers(boolean isAbstract, boolean isOpen, boolean isTrait, boolean isEnum) { - this.modifiers = new ClassModifiers(isAbstract, isOpen, isTrait, isEnum); + public void setModality(Modality modality) { + this.modality = modality; } public void setUnsubstitutedMemberScope(JavaClassMembersScope memberScope) { @@ -132,15 +134,16 @@ public class JavaClassDescriptor extends MutableDeclarationDescriptor implements return false; } + @NotNull @Override - public boolean isObject() { - return false; + public ClassKind getKind() { + return kind; } @Override @NotNull - public ClassModifiers getModifiers() { - return modifiers; + public Modality getModality() { + return modality; } @Override diff --git a/idea/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/idea/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 8948f8e9be6..5b875998ccb 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -90,7 +90,7 @@ public class JavaDescriptorResolver { String name = psiClass.getName(); JavaClassDescriptor classDescriptor = new JavaClassDescriptor( - JAVA_ROOT + JAVA_ROOT, psiClass.isInterface() ? ClassKind.TRAIT : ClassKind.CLASS ); classDescriptor.setName(name); @@ -106,11 +106,9 @@ public class JavaDescriptorResolver { supertypes )); - classDescriptor.setModifiers( - psiClass.hasModifierProperty(PsiModifier.ABSTRACT), - !psiClass.hasModifierProperty(PsiModifier.FINAL), - psiClass.isInterface(), - psiClass.isEnum() + classDescriptor.setModality(Modality.convertFromFlags( + psiClass.hasModifierProperty(PsiModifier.ABSTRACT) || psiClass.isInterface(), + !psiClass.hasModifierProperty(PsiModifier.FINAL)) ); classDescriptorCache.put(psiClass.getQualifiedName(), classDescriptor); classDescriptor.setUnsubstitutedMemberScope(new JavaClassMembersScope(classDescriptor, psiClass, semanticServices, false)); @@ -137,7 +135,7 @@ public class JavaDescriptorResolver { classDescriptor, Collections.emptyList(), false); - constructorDescriptor.initialize(typeParameters, Collections.emptyList(), MemberModifiers.DEFAULT_MODIFIERS); + constructorDescriptor.initialize(typeParameters, Collections.emptyList(), Modality.FINAL); constructorDescriptor.setReturnType(classDescriptor.getDefaultType()); classDescriptor.addConstructor(constructorDescriptor); semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor); @@ -149,7 +147,7 @@ public class JavaDescriptorResolver { classDescriptor, Collections.emptyList(), // TODO false); - constructorDescriptor.initialize(typeParameters, resolveParameterDescriptors(constructorDescriptor, constructor.getParameterList().getParameters()), MemberModifiers.DEFAULT_MODIFIERS); + constructorDescriptor.initialize(typeParameters, resolveParameterDescriptors(constructorDescriptor, constructor.getParameterList().getParameters()), Modality.FINAL); constructorDescriptor.setReturnType(classDescriptor.getDefaultType()); classDescriptor.addConstructor(constructorDescriptor); semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, constructor, constructorDescriptor); @@ -292,7 +290,7 @@ public class JavaDescriptorResolver { PropertyDescriptor propertyDescriptor = new PropertyDescriptor( containingDeclaration, Collections.emptyList(), - new MemberModifiers(false, false, false), + Modality.FINAL, !isFinal, null, field.getName(), @@ -361,7 +359,7 @@ public class JavaDescriptorResolver { resolveTypeParameters(functionDescriptorImpl, method.getTypeParameters()), semanticServices.getDescriptorResolver().resolveParameterDescriptors(functionDescriptorImpl, parameters), semanticServices.getTypeTransformer().transformToType(returnType), - new MemberModifiers(method.hasModifierProperty(PsiModifier.ABSTRACT), !method.hasModifierProperty(PsiModifier.FINAL), false) + Modality.convertFromFlags(method.hasModifierProperty(PsiModifier.ABSTRACT), !method.hasModifierProperty(PsiModifier.FINAL)) ); semanticServices.getTrace().record(BindingContext.FUNCTION, method, functionDescriptorImpl); FunctionDescriptor substitutedFunctionDescriptor = functionDescriptorImpl; diff --git a/idea/src/org/jetbrains/jet/lang/types/ErrorUtils.java b/idea/src/org/jetbrains/jet/lang/types/ErrorUtils.java index 6ec2c4f5440..8c23eb4103f 100644 --- a/idea/src/org/jetbrains/jet/lang/types/ErrorUtils.java +++ b/idea/src/org/jetbrains/jet/lang/types/ErrorUtils.java @@ -111,7 +111,7 @@ public class ErrorUtils { private static final VariableDescriptor ERROR_PROPERTY = new PropertyDescriptor( ERROR_CLASS, Collections.emptyList(), - new MemberModifiers(false, false, false), + Modality.OPEN, true, null, "", @@ -124,7 +124,7 @@ public class ErrorUtils { typeParameters, getValueParameters(functionDescriptor, positionedValueArgumentTypes), createErrorType(""), - MemberModifiers.DEFAULT_MODIFIERS + Modality.OPEN ); } @@ -134,7 +134,7 @@ public class ErrorUtils { Collections.emptyList(), // TODO Collections.emptyList(), // TODO createErrorType(""), - MemberModifiers.DEFAULT_MODIFIERS + Modality.OPEN ); } diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index b8755a8cf80..be5fbe04c40 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -932,7 +932,7 @@ public class JetTypeInferrer { else { effectiveReceiverType = receiverType; } - functionDescriptor.initialize(effectiveReceiverType, Collections.emptyList(), valueParameterDescriptors, null, MemberModifiers.DEFAULT_MODIFIERS); + functionDescriptor.initialize(effectiveReceiverType, Collections.emptyList(), valueParameterDescriptors, null, Modality.FINAL); context.trace.record(BindingContext.FUNCTION, expression, functionDescriptor); JetType returnType = NO_EXPECTED_TYPE; diff --git a/idea/src/org/jetbrains/jet/lexer/JetTokens.java b/idea/src/org/jetbrains/jet/lexer/JetTokens.java index f6651c2c4c2..ace4d6c4c1b 100644 --- a/idea/src/org/jetbrains/jet/lexer/JetTokens.java +++ b/idea/src/org/jetbrains/jet/lexer/JetTokens.java @@ -56,6 +56,7 @@ public interface JetTokens { JetKeywordToken WHILE_KEYWORD = JetKeywordToken.keyword("while"); JetKeywordToken DO_KEYWORD = JetKeywordToken.keyword("do"); JetKeywordToken WHEN_KEYWORD = JetKeywordToken.keyword("when"); + JetKeywordToken TRAIT_KEYWORD = JetKeywordToken.keyword("trait"); // TODO: Discuss "This" keyword JetKeywordToken CAPITALIZED_THIS_KEYWORD = JetKeywordToken.keyword("This"); @@ -136,9 +137,9 @@ public interface JetTokens { JetKeywordToken PROTECTED_KEYWORD = JetKeywordToken.softKeyword("protected"); JetKeywordToken CATCH_KEYWORD = JetKeywordToken.softKeyword("catch"); JetKeywordToken OUT_KEYWORD = JetKeywordToken.softKeyword("out"); - JetKeywordToken TRAIT_KEYWORD = JetKeywordToken.softKeyword("trait"); JetKeywordToken FINALLY_KEYWORD = JetKeywordToken.softKeyword("finally"); + JetKeywordToken FINAL_KEYWORD = JetKeywordToken.softKeyword("final"); // TODO: support this as an annotation on arguments. Then, they it probably can not be a soft keyword JetKeywordToken REF_KEYWORD = JetKeywordToken.softKeyword("ref"); @@ -149,18 +150,18 @@ public interface JetTokens { TRUE_KEYWORD, FALSE_KEYWORD, IS_KEYWORD, IN_KEYWORD, THROW_KEYWORD, RETURN_KEYWORD, BREAK_KEYWORD, CONTINUE_KEYWORD, OBJECT_KEYWORD, IF_KEYWORD, ELSE_KEYWORD, WHILE_KEYWORD, DO_KEYWORD, TRY_KEYWORD, WHEN_KEYWORD, - NOT_IN, NOT_IS, CAPITALIZED_THIS_KEYWORD, AS_SAFE + NOT_IN, NOT_IS, CAPITALIZED_THIS_KEYWORD, AS_SAFE, TRAIT_KEYWORD ); TokenSet SOFT_KEYWORDS = TokenSet.create(WRAPS_KEYWORD, IMPORT_KEYWORD, WHERE_KEYWORD, BY_KEYWORD, GET_KEYWORD, SET_KEYWORD, ABSTRACT_KEYWORD, VIRTUAL_KEYWORD, ENUM_KEYWORD, OPEN_KEYWORD, ATTRIBUTE_KEYWORD, OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, - CATCH_KEYWORD, FINALLY_KEYWORD, REF_KEYWORD, OUT_KEYWORD, TRAIT_KEYWORD + CATCH_KEYWORD, FINALLY_KEYWORD, REF_KEYWORD, OUT_KEYWORD, FINAL_KEYWORD ); TokenSet MODIFIER_KEYWORDS = TokenSet.create(ABSTRACT_KEYWORD, VIRTUAL_KEYWORD, ENUM_KEYWORD, OPEN_KEYWORD, ATTRIBUTE_KEYWORD, OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, - PROTECTED_KEYWORD, REF_KEYWORD, OUT_KEYWORD, IN_KEYWORD, TRAIT_KEYWORD + PROTECTED_KEYWORD, REF_KEYWORD, OUT_KEYWORD, IN_KEYWORD, FINAL_KEYWORD ); TokenSet WHITE_SPACE_OR_COMMENT_BIT_SET = TokenSet.create(WHITE_SPACE, BLOCK_COMMENT, EOL_COMMENT, DOC_COMMENT); TokenSet WHITESPACES = TokenSet.create(TokenType.WHITE_SPACE); diff --git a/idea/src/org/jetbrains/jet/resolve/DescriptorRenderer.java b/idea/src/org/jetbrains/jet/resolve/DescriptorRenderer.java index 4d00ec6281a..f66fc6773e9 100644 --- a/idea/src/org/jetbrains/jet/resolve/DescriptorRenderer.java +++ b/idea/src/org/jetbrains/jet/resolve/DescriptorRenderer.java @@ -251,7 +251,7 @@ public class DescriptorRenderer { @Override public Void visitClassDescriptor(ClassDescriptor descriptor, StringBuilder builder) { - String keyword = descriptor.getModifiers().isTrait() ? "trait class" : "class"; + String keyword = descriptor.getKind() == ClassKind.TRAIT ? "trait class" : "class"; renderClassDescriptor(descriptor, builder, keyword); return super.visitClassDescriptor(descriptor, builder); }