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 f244fad5c4fce5840497893743d0d6a0626c3ba2..9acbd6c705ffee74d8822ac937df90db66953fa5 100644 |
--- a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java |
+++ b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java |
@@ -1614,7 +1614,7 @@ public class TypeAnalyzer implements DartCompilationPhase { |
if (!node.getModifiers().isAbstract() && !unimplementedMembers.isEmpty() && |
(reportNoMemberWhenHasInterceptor || !Elements.handlesNoSuchMethod(type))) { |
StringBuilder sb = getUnimplementedMembersMessage(element, unimplementedMembers); |
- onError(node.getName(), TypeErrorCode.CONTRETE_CLASS_WITH_UNIMPLEMENTED_MEMBERS, |
+ onError(node.getName(), TypeErrorCode.CONCRETE_CLASS_WITH_UNIMPLEMENTED_MEMBERS, |
node.getName(), sb.toString()); |
} |
} |
@@ -3221,16 +3221,7 @@ public class TypeAnalyzer implements DartCompilationPhase { |
while (supertype != null) { |
ClassElement superclass = supertype.getElement(); |
for (Element member : superclass.getMembers()) { |
- String name = member.getName(); |
- if (!Elements.isAbstractElement(member)) { |
- superMembers.removeAll(name); |
- } |
- if (member instanceof FieldElement) { |
- FieldElement field = (FieldElement) member; |
- if (field.getSetter() != null) { |
- superMembers.removeAll("setter " + name); |
- } |
- } |
+ removeSuperMemberIfNotAbstract(member); |
} |
supertype = supertype.getElement().getSupertype(); |
} |
@@ -3241,16 +3232,7 @@ public class TypeAnalyzer implements DartCompilationPhase { |
for (InterfaceType mixType : currentClass.getElement().getMixins()) { |
ClassElement mixElement = mixType.getElement(); |
for (Element member : mixElement.getMembers()) { |
- String name = member.getName(); |
- if (!Elements.isAbstractElement(member)) { |
- superMembers.removeAll(name); |
- } |
- if (member instanceof FieldElement) { |
- FieldElement field = (FieldElement) member; |
- if (field.getSetter() != null) { |
- superMembers.removeAll("setter " + name); |
- } |
- } |
+ removeSuperMemberIfNotAbstract(member); |
} |
} |
@@ -3274,7 +3256,17 @@ public class TypeAnalyzer implements DartCompilationPhase { |
// add abstract members of current class |
for (Element member : currentClass.getElement().getMembers()) { |
- if (Elements.isAbstractElement(member)) { |
+ if (ElementKind.of(member) == ElementKind.FIELD && member.getModifiers().isAbstractField()) { |
+ FieldElement field = (FieldElement) member; |
+ MethodElement getter = field.getGetter(); |
+ MethodElement setter = field.getSetter(); |
+ if (getter != null && Elements.isAbstractElement(getter)) { |
+ unimplementedElements.add(getter); |
+ } |
+ if (setter != null && Elements.isAbstractElement(setter)) { |
+ unimplementedElements.add(setter); |
+ } |
+ } else if (Elements.isAbstractElement(member)) { |
unimplementedElements.add(member); |
} |
} |
@@ -3282,6 +3274,27 @@ public class TypeAnalyzer implements DartCompilationPhase { |
return null; |
} |
+ private void removeSuperMemberIfNotAbstract(Element member) { |
+ String name = member.getName(); |
+ if (ElementKind.of(member) == ElementKind.FIELD && member.getModifiers().isAbstractField()) { |
+ FieldElement field = (FieldElement) member; |
+ MethodElement getter = field.getGetter(); |
+ MethodElement setter = field.getSetter(); |
+ if (getter != null && !Elements.isAbstractElement(getter)) { |
+ superMembers.removeAll(name); |
+ } |
+ if (setter != null && !Elements.isAbstractElement(setter)) { |
+ if (!name.startsWith("setter ")) { |
+ superMembers.removeAll("setter " + name); |
+ } else { |
+ superMembers.removeAll(name); |
+ } |
+ } |
+ } else if (!Elements.isAbstractElement(member)) { |
+ superMembers.removeAll(name); |
+ } |
+ } |
+ |
@Override |
public Void visitFieldDefinition(DartFieldDefinition node) { |
this.visit(node.getFields()); |