diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/ClassModifiers.java b/idea/src/org/jetbrains/jet/lang/descriptors/ClassModifiers.java index ddb1897ebfd..3fe650310d7 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/ClassModifiers.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/ClassModifiers.java @@ -1,10 +1,5 @@ package org.jetbrains.jet.lang.descriptors; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.psi.JetModifierList; -import org.jetbrains.jet.lexer.JetTokens; - /** * @author svtk */ @@ -28,13 +23,5 @@ public class ClassModifiers extends Modifiers { return trait; } - public static ClassModifiers resolveModifiers(@Nullable JetModifierList modifierList) { - if (modifierList == null) return DEFAULT_MODIFIERS; - return new ClassModifiers( - modifierList.hasModifier(JetTokens.ABSTRACT_KEYWORD), - modifierList.hasModifier(JetTokens.OPEN_KEYWORD) || modifierList.hasModifier(JetTokens.ABSTRACT_KEYWORD), - modifierList.hasModifier(JetTokens.TRAIT_KEYWORD) - ); - } } diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/MemberModifiers.java b/idea/src/org/jetbrains/jet/lang/descriptors/MemberModifiers.java index c3e9fe29e4c..4558f9652d5 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/MemberModifiers.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/MemberModifiers.java @@ -1,10 +1,5 @@ package org.jetbrains.jet.lang.descriptors; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.psi.JetModifierList; -import org.jetbrains.jet.lexer.JetTokens; - /** * @author abreslav */ @@ -32,19 +27,4 @@ public class MemberModifiers extends Modifiers { public boolean isOverridable() { return isAbstract() || isVirtual() || isOverride(); } - - @NotNull - public static MemberModifiers resolveModifiers(@Nullable JetModifierList modifierList) { - return resolveModifiers(modifierList, DEFAULT_MODIFIERS); - } - - @NotNull - public static MemberModifiers resolveModifiers(@Nullable JetModifierList modifierList, @NotNull MemberModifiers defaultModifiers) { - if (modifierList == null) return defaultModifiers; - return new MemberModifiers( - modifierList.hasModifier(JetTokens.ABSTRACT_KEYWORD), - modifierList.hasModifier(JetTokens.VIRTUAL_KEYWORD), - modifierList.hasModifier(JetTokens.OVERRIDE_KEYWORD) - ); - } } diff --git a/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java b/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java index d7294d192f7..01f7e99e683 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java @@ -25,9 +25,6 @@ import java.util.*; * @author abreslav */ public class ClassDescriptorResolver { - -// private static final MemberModifiers DEFAULT_MODIFIERS = new MemberModifiers(false, false, false); - private final JetSemanticServices semanticServices; private final TypeResolver typeResolver; private final TypeResolver typeResolverNotCheckingBounds; @@ -144,7 +141,7 @@ public class ClassDescriptorResolver { index++; } descriptor.setTypeParameterDescriptors(typeParameters); - descriptor.setClassModifiers(ClassModifiers.resolveModifiers(classElement.getModifierList())); + descriptor.setClassModifiers(resolveClassModifiers(classElement.getModifierList())); trace.record(BindingContext.CLASS, classElement, descriptor); } @@ -230,7 +227,7 @@ public class ClassDescriptorResolver { typeParameterDescriptors, valueParameterDescriptors, returnType, - MemberModifiers.resolveModifiers(function.getModifierList())); + resolveMemberModifiers(function.getModifierList())); trace.record(BindingContext.FUNCTION, function, functionDescriptor); return functionDescriptor; @@ -463,7 +460,7 @@ public class ClassDescriptorResolver { PropertyDescriptor propertyDescriptor = new PropertyDescriptor( containingDeclaration, annotationResolver.createAnnotationStubs(modifierList), - MemberModifiers.resolveModifiers(modifierList), // TODO : default modifiers differ in different contexts + resolveMemberModifiers(modifierList), // TODO : default modifiers differ in different contexts false, null, JetPsiUtil.safeName(objectDeclaration.getName()), @@ -513,7 +510,7 @@ public class ClassDescriptorResolver { PropertyDescriptor propertyDescriptor = new PropertyDescriptor( containingDeclaration, annotationResolver.resolveAnnotations(scope, modifierList), - MemberModifiers.resolveModifiers(modifierList), // TODO : default modifiers differ in different contexts + resolveMemberModifiers(modifierList), // TODO : default modifiers differ in different contexts isVar, receiverType, JetPsiUtil.safeName(property.getName()), @@ -559,6 +556,30 @@ public class ClassDescriptorResolver { return typeResolver.resolveType(scope, propertyTypeRef); } } + + private static ClassModifiers resolveClassModifiers(@Nullable JetModifierList modifierList) { + if (modifierList == null) return ClassModifiers.DEFAULT_MODIFIERS; + return new ClassModifiers( + modifierList.hasModifier(JetTokens.ABSTRACT_KEYWORD), + modifierList.hasModifier(JetTokens.OPEN_KEYWORD) || modifierList.hasModifier(JetTokens.ABSTRACT_KEYWORD), + modifierList.hasModifier(JetTokens.TRAIT_KEYWORD) + ); + } + + @NotNull + private MemberModifiers resolveMemberModifiers(@Nullable JetModifierList modifierList, @NotNull MemberModifiers defaultModifiers) { + if (modifierList == null) return defaultModifiers; + return new MemberModifiers( + modifierList.hasModifier(JetTokens.ABSTRACT_KEYWORD), + modifierList.hasModifier(JetTokens.VIRTUAL_KEYWORD), + modifierList.hasModifier(JetTokens.OVERRIDE_KEYWORD) + ); + } + + @NotNull + private MemberModifiers resolveMemberModifiers(@Nullable JetModifierList modifierList) { + return resolveMemberModifiers(modifierList, MemberModifiers.DEFAULT_MODIFIERS); + } @Nullable private PropertySetterDescriptor resolvePropertySetterDescriptor(@NotNull JetScope scope, @NotNull JetProperty property, @NotNull PropertyDescriptor propertyDescriptor) { @@ -569,7 +590,7 @@ public class ClassDescriptorResolver { JetParameter parameter = setter.getParameter(); setterDescriptor = new PropertySetterDescriptor( - MemberModifiers.resolveModifiers(setter.getModifierList()), // TODO : default modifiers differ in different contexts + resolveMemberModifiers(setter.getModifierList()), // TODO : default modifiers differ in different contexts propertyDescriptor, annotations, setter.getBodyExpression() != null, false); if (parameter != null) { if (parameter.isRef()) { @@ -633,7 +654,7 @@ public class ClassDescriptorResolver { } getterDescriptor = new PropertyGetterDescriptor( - MemberModifiers.resolveModifiers(getter.getModifierList()), // TODO : default modifiers differ in different contexts + resolveMemberModifiers(getter.getModifierList()), // TODO : default modifiers differ in different contexts propertyDescriptor, annotations, returnType, getter.getBodyExpression() != null, false); trace.record(BindingContext.PROPERTY_ACCESSOR, getter, getterDescriptor); } @@ -708,7 +729,7 @@ public class ClassDescriptorResolver { PropertyDescriptor propertyDescriptor = new PropertyDescriptor( classDescriptor, annotationResolver.resolveAnnotations(scope, modifierList), - MemberModifiers.resolveModifiers(modifierList), + resolveMemberModifiers(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 f746751f90c..468eb5242be 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -451,7 +451,7 @@ public class TopDownAnalyzer { @Override public void visitNamedFunction(JetNamedFunction function) { FunctionDescriptorImpl functionDescriptor = classDescriptorResolver.resolveFunctionDescriptor(namespaceLike, scope, function); - checkFunctionCorrectness(function, functionDescriptor, namespaceLike); + checkFunction(function, functionDescriptor, namespaceLike); namespaceLike.addFunctionDescriptor(functionDescriptor); functions.put(function, functionDescriptor); declaringScopes.put(function, scope); @@ -550,14 +550,31 @@ public class TopDownAnalyzer { private void bindOverridesInAClass(MutableClassDescriptor classDescriptor) { for (FunctionDescriptor declaredFunction : classDescriptor.getFunctions()) { +// JetFunction function = (JetFunction) trace.get(BindingContext.DESCRIPTOR_TO_DECLARATION, declaredFunction); +// boolean isOverride = declaredFunction.getModifiers().isOverride(); for (JetType supertype : classDescriptor.getTypeConstructor().getSupertypes()) { FunctionDescriptor overridden = findFunctionOverridableBy(declaredFunction, supertype); if (overridden != null) { +// if (isOverride && !overridden.getModifiers().isOverridable()) { +// trace.getErrorHandler().genericError(function.getModifierList().getModifierNode(JetTokens.OVERRIDE_KEYWORD), +// "Method " + overridden.getName() + " in " + overridden.getContainingDeclaration().getName() + " is final and can not be overridden"); +// isOverride = false; +// } ((FunctionDescriptorImpl) declaredFunction).addOverriddenFunction(overridden); } } - } - } +// if (declaredFunction.getModifiers().isOverride() && declaredFunction.getOverriddenDescriptors().size() == 0) { +// trace.getErrorHandler().genericError(function.getModifierList().getModifierNode(JetTokens.OVERRIDE_KEYWORD), +// "Method " + declaredFunction.getName() + " overrides nothing"); + } +// if (!declaredFunction.getModifiers().isOverride() && declaredFunction.getOverriddenDescriptors().size() > 0) { +// FunctionDescriptor overriddenMethod = declaredFunction.getOverriddenDescriptors().iterator().next(); +// trace.getErrorHandler().genericError(function.getNameIdentifier().getNode(), +// "Method " + declaredFunction.getName() + " overrides method " + overriddenMethod.getName() + " in class " + +// overriddenMethod.getContainingDeclaration().getName() + " and needs 'override' modifier"); + } +// } +// } @Nullable private FunctionDescriptor findFunctionOverridableBy(@NotNull FunctionDescriptor declaredFunction, @NotNull JetType supertype) { @@ -916,11 +933,6 @@ public class TopDownAnalyzer { if (setter != null && setterDescriptor != null) { resolveFunctionBody(fieldAccessTrackingTrace, setter, setterDescriptor, accessorScope); } - -// JetExpression initializer = property.getInitializer(); -// if (!property.isVar() && initializer != null && !trace.getBindingContext().get(BindingContext.BACKING_FIELD_REQUIRED, propertyDescriptor)) { -// trace.getErrorHandler().genericError(initializer.getNode(), "Initializer is not allowed here because this property has no setter and no backing field either"); -// } } protected void checkProperty(JetProperty property, PropertyDescriptor propertyDescriptor, @Nullable ClassDescriptor classDescriptor) { @@ -968,7 +980,7 @@ public class TopDownAnalyzer { } } - protected void checkFunctionCorrectness(JetNamedFunction function, FunctionDescriptor functionDescriptor, DeclarationDescriptor containingDescriptor) { + protected void checkFunction(JetNamedFunction function, FunctionDescriptor functionDescriptor, DeclarationDescriptor containingDescriptor) { PsiElement nameIdentifier = function.getNameIdentifier(); if (containingDescriptor instanceof ClassDescriptor) { ClassDescriptor classDescriptor = (ClassDescriptor) containingDescriptor; diff --git a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzerForStandardLibrary.java b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzerForStandardLibrary.java index f0250ba86b9..69cbe16bf95 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzerForStandardLibrary.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzerForStandardLibrary.java @@ -27,5 +27,5 @@ public class TopDownAnalyzerForStandardLibrary extends TopDownAnalyzer { @Override - protected void checkFunctionCorrectness(JetNamedFunction function, FunctionDescriptor functionDescriptor, DeclarationDescriptor containingDescriptor) {} + protected void checkFunction(JetNamedFunction function, FunctionDescriptor functionDescriptor, DeclarationDescriptor containingDescriptor) {} }