Chromium Code Reviews| Index: lib/compiler/implementation/resolver.dart |
| diff --git a/lib/compiler/implementation/resolver.dart b/lib/compiler/implementation/resolver.dart |
| index 4b6a8f49fdbe5ed61d7e91227689569694408830..09c19413dc4227ad7b6c6cb032b9a416d5b20e12 100644 |
| --- a/lib/compiler/implementation/resolver.dart |
| +++ b/lib/compiler/implementation/resolver.dart |
| @@ -990,8 +990,8 @@ class ResolverVisitor extends CommonResolverVisitor<Element> { |
| TargetElement element = mapping[statement]; |
| if (element === null) { |
| element = new TargetElement(statement, |
| - statementScope.nestingLevel, |
| - enclosingElement); |
| + statementScope.nestingLevel, |
| + enclosingElement); |
| mapping[statement] = element; |
| } |
| return element; |
| @@ -1009,6 +1009,12 @@ class ResolverVisitor extends CommonResolverVisitor<Element> { |
| inStaticContext(() => visit(node)); |
| } |
| + ErroneousElement warnAndCreateErroneousElement(Node node, MessageKind kind) { |
| + ResolutionWarning warning = new ResolutionWarning(kind, [node]); |
| + compiler.reportWarning(node, warning); |
| + return new ErroneousElement(warning.message, enclosingElement); |
| + } |
| + |
| Element visitIdentifier(Identifier node) { |
| if (node.isThis()) { |
| if (!inInstanceContext) { |
| @@ -1024,7 +1030,10 @@ class ResolverVisitor extends CommonResolverVisitor<Element> { |
| } else { |
| Element element = lookup(node, node.source); |
| if (element === null) { |
| - if (!inInstanceContext) error(node, MessageKind.CANNOT_RESOLVE, [node]); |
| + if (!inInstanceContext) { |
| + element = |
| + warnAndCreateErroneousElement(node, MessageKind.CANNOT_RESOLVE); |
| + } |
| } else { |
| if ((element.kind.category & allowedCategory) == 0) { |
| // TODO(ahe): Improve error message. Need UX input. |
| @@ -1336,9 +1345,10 @@ class ResolverVisitor extends CommonResolverVisitor<Element> { |
| && target.kind == ElementKind.ABSTRACT_FIELD) { |
| AbstractFieldElement field = target; |
| target = field.getter; |
| - if (Element.isInvalid(target) && !inInstanceContext) { |
| - // TODO(karlklose): make this a runtime error. |
| - error(node.selector, MessageKind.CANNOT_RESOLVE_GETTER); |
| + if (target == null && !inInstanceContext) { |
| + target = |
| + warnAndCreateErroneousElement(node.selector, |
|
ngeoffray
2012/09/05 11:46:45
Move warnAndcreateErroneouselement one up, and put
karlklose
2012/09/05 14:53:42
This change is reverted.
|
| + MessageKind.CANNOT_RESOLVE_GETTER); |
| } |
| } |
| @@ -1402,17 +1412,20 @@ class ResolverVisitor extends CommonResolverVisitor<Element> { |
| Element getter = target; |
| String source = node.assignmentOperator.source.stringValue; |
| bool isComplex = source !== '='; |
| - if (target != null && target.kind == ElementKind.ABSTRACT_FIELD) { |
| + if (!Element.isInvalid(target) |
| + && target.kind == ElementKind.ABSTRACT_FIELD) { |
| AbstractFieldElement field = target; |
| setter = field.setter; |
| getter = field.getter; |
| - if (Element.isInvalid(setter) && !inInstanceContext) { |
| - // TODO(karlklose): make this a runtime error. |
| - error(node.selector, MessageKind.CANNOT_RESOLVE_SETTER); |
| - } |
| - if (isComplex && Element.isInvalid(getter) && !inInstanceContext) { |
| - // TODO(karlklose): make this a runtime error. |
| - error(node.selector, MessageKind.CANNOT_RESOLVE_GETTER); |
| + if (setter == null && !inInstanceContext) { |
| + setter = |
| + warnAndCreateErroneousElement(node.selector, |
| + MessageKind.CANNOT_RESOLVE_GETTER); |
|
ngeoffray
2012/09/05 11:46:45
ditto
karlklose
2012/09/05 14:53:42
ditto.
|
| + } |
| + if (isComplex && getter == null && !inInstanceContext) { |
| + getter = |
| + warnAndCreateErroneousElement(node.selector, |
| + MessageKind.CANNOT_RESOLVE_GETTER); |
| } |
| } |