| 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,
|
| + 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);
|
| + }
|
| + if (isComplex && getter == null && !inInstanceContext) {
|
| + getter =
|
| + warnAndCreateErroneousElement(node.selector,
|
| + MessageKind.CANNOT_RESOLVE_GETTER);
|
| }
|
| }
|
|
|
|
|