Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(50)

Unified Diff: compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java

Issue 10701011: No compile-time error when overriding a static field or method (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerTestCase.java » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
}
« no previous file with comments | « no previous file | compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerTestCase.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698