Chromium Code Reviews| Index: compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java |
| diff --git a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java |
| index 05a662ff741349eb11f8672adb5b89d2a5383cc3..2d367b89840ade2eade806945e3d0305d7e66012 100644 |
| --- a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java |
| +++ b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java |
| @@ -1705,7 +1705,7 @@ public class TypeAnalyzer implements DartCompilationPhase { |
| typeError(parameterElement, TypeErrorCode.SETTER_TYPE_MUST_BE_ASSIGNABLE, |
| setterType.getElement().getName(), getterType.getElement().getName()); |
| } |
| - |
| + |
| // getter and setter should have same "static" flag |
| if (modifiers.isStatic() != getterElement.getModifiers().isStatic()) { |
| onError(node.getName(), ResolverErrorCode.FIELD_GETTER_SETTER_SAME_STATIC); |
| @@ -2659,20 +2659,23 @@ public class TypeAnalyzer implements DartCompilationPhase { |
| FieldElement field = node.getElement(); |
| String name = field.getName(); |
| Collection<Element> overridden = superMembers.removeAll(name); |
| - for (Element element : overridden) { |
| - if (canOverride(node.getName(), field.getModifiers(), element)) { |
| - switch (element.getKind()) { |
| - case FIELD: |
| - checkOverride(node.getName(), field, element); |
| - break; |
| - case METHOD: |
| - typeError(node.getName(), TypeErrorCode.SUPERTYPE_HAS_METHOD, name, |
| - element.getEnclosingElement().getName()); |
| - break; |
| - |
| - default: |
| - typeError(node, TypeErrorCode.INTERNAL_ERROR, element); |
| - break; |
| + for (Element superElement : overridden) { |
| + if (!(field.isStatic() && superElement.getModifiers().isStatic())) { |
| + if (canOverride(node.getName(), field.getModifiers(), superElement) |
| + && !superElement.getModifiers().isStatic()) { |
|
zundel
2012/06/27 21:30:58
A static member in the superclass isn't in the way
|
| + switch (superElement.getKind()) { |
| + case FIELD: |
| + checkOverride(node.getName(), field, superElement); |
| + break; |
| + case METHOD: |
| + typeError(node.getName(), TypeErrorCode.SUPERTYPE_HAS_METHOD, name, |
| + superElement.getEnclosingElement().getName()); |
| + break; |
| + |
| + default: |
| + typeError(node, TypeErrorCode.INTERNAL_ERROR, superElement); |
| + break; |
| + } |
| } |
| } |
| } |
| @@ -2692,21 +2695,25 @@ public class TypeAnalyzer implements DartCompilationPhase { |
| typeError(node.getName(), ResolverErrorCode.INVALID_OVERRIDE_METADATA); |
| } |
| // Check that override is valid. |
| - for (Element element : overridden) { |
| - if (canOverride(node.getName(), method.getModifiers(), element)) { |
| - switch (element.getKind()) { |
| - case METHOD: |
| - checkOverride(node.getName(), method, element); |
| - break; |
| - |
| - case FIELD: |
| - typeError(node.getName(), TypeErrorCode.SUPERTYPE_HAS_FIELD, element.getName(), |
| - element.getEnclosingElement().getName()); |
| - break; |
| - |
| - default: |
| - typeError(node, TypeErrorCode.INTERNAL_ERROR, element); |
| - break; |
| + for (Element superElement : overridden) { |
| + if (!(method.isStatic() && superElement.getModifiers().isStatic())) { |
| + if (canOverride(node.getName(), method.getModifiers(), superElement) |
| + && !superElement.getModifiers().isStatic()) { |
| + switch (superElement.getKind()) { |
| + case METHOD: |
| + checkOverride(node.getName(), method, superElement); |
| + break; |
| + |
| + case FIELD: |
| + typeError(node.getName(), TypeErrorCode.SUPERTYPE_HAS_FIELD, superElement.getName(), |
| + superElement.getEnclosingElement().getName()); |
| + |
| + break; |
| + |
| + default: |
| + typeError(node, TypeErrorCode.INTERNAL_ERROR, superElement); |
| + break; |
| + } |
| } |
| } |
| } |
| @@ -2715,18 +2722,20 @@ public class TypeAnalyzer implements DartCompilationPhase { |
| } |
| /** |
| - * Report a compile-time error if either modifiers or elements.getModifiers() is static. |
| + * Report a compile-time error if a static member tries to override an instance member |
| * @returns true if no compile-time error was reported |
| */ |
| - private boolean canOverride(HasSourceInfo errorTarget, Modifiers modifiers, Element element) { |
| - if (element.getModifiers().isStatic()) { |
| - onError(errorTarget, TypeErrorCode.OVERRIDING_INHERITED_STATIC_MEMBER, |
| - element.getName(), element.getEnclosingElement().getName()); |
| - return false; |
| - } else if (modifiers.isStatic()) { |
| + private boolean canOverride(HasSourceInfo errorTarget, Modifiers modifiers, |
| + Element superElement) { |
| + if (!superElement.getModifiers().isStatic() && modifiers.isStatic()) { |
| onError(errorTarget, ResolverErrorCode.CANNOT_OVERRIDE_INSTANCE_MEMBER, |
| - element.getName(), element.getEnclosingElement().getName()); |
| + superElement.getName(), superElement.getEnclosingElement().getName()); |
| return false; |
| + } else if (superElement.getModifiers().isStatic() && !modifiers.isStatic()) { |
| + onError(errorTarget, TypeErrorCode.OVERRIDING_INHERITED_STATIC_MEMBER, |
| + superElement.getName(), superElement.getEnclosingElement().getName()); |
| + // Although a warning, override is allowed anyway |
| + return true; |
| } |
| return true; |
| } |