Chromium Code Reviews| Index: lib/compiler/implementation/resolver.dart |
| diff --git a/lib/compiler/implementation/resolver.dart b/lib/compiler/implementation/resolver.dart |
| index 246a546edf7ae8b40d13e80b57ae7a63b3775156..b0e1e474d685ce335bbf39cacd89887357800bd7 100644 |
| --- a/lib/compiler/implementation/resolver.dart |
| +++ b/lib/compiler/implementation/resolver.dart |
| @@ -254,20 +254,38 @@ class ResolverTask extends CompilerTask { |
| } |
| void checkAbstractField(Element member) { |
| - if (member is !AbstractFieldElement) return; |
| - if (member.getter === null) return; |
| - if (member.setter === null) return; |
| - int getterFlags = member.getter.modifiers.flags | Modifiers.FLAG_ABSTRACT; |
| - int setterFlags = member.setter.modifiers.flags | Modifiers.FLAG_ABSTRACT; |
| + // Only check for getters. The test can only fail if there is both a setter |
| + // and a getter with the same name, and we only need to check each abstract |
| + // field once, so we just ignore setters. |
| + if (!member.isGetter()) return; |
| + |
| + // Find the associated abstract field. |
| + AbstractFieldElement field; |
| + ClassElement outerClass = member.getEnclosingClass(); |
| + if (outerClass != null) { |
| + Element element = outerClass.lookupLocalMember(member.name); |
| + // This is wrong, but can currently happen. See, e.g., the test |
| + // language/field2_negative_test where we are OK on failing. |
| + if (element.kind !== ElementKind.ABSTRACT_FIELD) return; |
|
Anders Johnsen
2012/08/07 13:02:30
Returning here looks wrong, turn comment into TODO
ahe
2012/08/10 11:21:46
Please report the error. You have fixed a bug in d
Lasse Reichstein Nielsen
2012/08/13 13:37:51
Perhaps. It seems we continue compiling even if we
ahe
2012/08/13 16:20:27
Could please provide an example that illustrates w
Lasse Reichstein Nielsen
2012/08/14 11:41:07
Should happen for, e.g.:
class A {
extern
|
| + field = element; |
| + } else { |
| + LibraryElement library = member.getLibrary(); |
| + field = library.findLocal(member.name); |
| + } |
|
Anders Johnsen
2012/08/07 13:02:30
assert field !== null?
ahe
2012/08/10 11:21:46
Better to use internalErrorOnElement.
Lasse Reichstein Nielsen
2012/08/13 13:37:51
Done.
|
| + |
| + if (field.getter === null) return; |
| + if (field.setter === null) return; |
| + int getterFlags = field.getter.modifiers.flags | Modifiers.FLAG_ABSTRACT; |
| + int setterFlags = field.setter.modifiers.flags | Modifiers.FLAG_ABSTRACT; |
| if (getterFlags !== setterFlags) { |
| final mismatchedFlags = |
| new Modifiers.withFlags(null, getterFlags ^ setterFlags); |
| compiler.reportMessage( |
| - compiler.spanFromElement(member.getter), |
| + compiler.spanFromElement(field.getter), |
| MessageKind.GETTER_MISMATCH.error([mismatchedFlags]), |
| api.Diagnostic.ERROR); |
| compiler.reportMessage( |
| - compiler.spanFromElement(member.setter), |
| + compiler.spanFromElement(field.setter), |
| MessageKind.SETTER_MISMATCH.error([mismatchedFlags]), |
| api.Diagnostic.ERROR); |
| } |