| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library polymer_expressions.eval; | 5 library polymer_expressions.eval; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:collection'; | 8 import 'dart:collection'; |
| 9 | 9 |
| 10 @MirrorsUsed(metaTargets: const [Reflectable, ObservableProperty], | 10 @MirrorsUsed(metaTargets: const [Reflectable, ObservableProperty], |
| (...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 413 : super(value); | 413 : super(value); |
| 414 | 414 |
| 415 accept(Visitor v) => v.visitMapLiteralEntry(this); | 415 accept(Visitor v) => v.visitMapLiteralEntry(this); |
| 416 } | 416 } |
| 417 | 417 |
| 418 class IdentifierObserver extends ExpressionObserver<Identifier> | 418 class IdentifierObserver extends ExpressionObserver<Identifier> |
| 419 implements Identifier { | 419 implements Identifier { |
| 420 | 420 |
| 421 IdentifierObserver(Identifier value) : super(value); | 421 IdentifierObserver(Identifier value) : super(value); |
| 422 | 422 |
| 423 dynamic get value => _expr.value; | 423 String get value => (_expr as Identifier).value; |
| 424 | 424 |
| 425 _updateSelf(Scope scope) { | 425 _updateSelf(Scope scope) { |
| 426 _value = scope[_expr.value]; | 426 _value = scope[value]; |
| 427 | 427 |
| 428 var owner = scope.ownerOf(_expr.value); | 428 var owner = scope.ownerOf(value); |
| 429 if (owner is Observable) { | 429 if (owner is Observable) { |
| 430 _subscription = (owner as Observable).changes.listen( | 430 var symbol = new Symbol(value); |
| 431 (List<ChangeRecord> changes) { | 431 _subscription = (owner as Observable).changes.listen((changes) { |
| 432 var symbol = new Symbol(_expr.value); | 432 if (changes.any( |
| 433 if (changes.any((c) => c.changes(symbol))) { | 433 (c) => c is PropertyChangeRecord && c.name == symbol)) { |
| 434 _invalidate(scope); | 434 _invalidate(scope); |
| 435 } | 435 } |
| 436 }); | 436 }); |
| 437 } | 437 } |
| 438 } | 438 } |
| 439 | 439 |
| 440 accept(Visitor v) => v.visitIdentifier(this); | 440 accept(Visitor v) => v.visitIdentifier(this); |
| 441 } | 441 } |
| 442 | 442 |
| 443 class ParenthesizedObserver extends ExpressionObserver<ParenthesizedExpression> | 443 class ParenthesizedObserver extends ExpressionObserver<ParenthesizedExpression> |
| 444 implements ParenthesizedExpression { | 444 implements ParenthesizedExpression { |
| 445 final ExpressionObserver child; | 445 final ExpressionObserver child; |
| 446 | 446 |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 538 // special case [] because we don't need mirrors | 538 // special case [] because we don't need mirrors |
| 539 if (_expr.method == '[]') { | 539 if (_expr.method == '[]') { |
| 540 assert(args.length == 1); | 540 assert(args.length == 1); |
| 541 var key = args[0]; | 541 var key = args[0]; |
| 542 _value = receiverValue[key]; | 542 _value = receiverValue[key]; |
| 543 | 543 |
| 544 if (receiverValue is Observable) { | 544 if (receiverValue is Observable) { |
| 545 _subscription = (receiverValue as Observable).changes.listen( | 545 _subscription = (receiverValue as Observable).changes.listen( |
| 546 (List<ChangeRecord> changes) { | 546 (List<ChangeRecord> changes) { |
| 547 if (changes.any((c) => | 547 if (changes.any((c) => |
| 548 c is MapChangeRecord && c.changes(key))) { | 548 c is MapChangeRecord && c.key == key)) { |
| 549 _invalidate(scope); | 549 _invalidate(scope); |
| 550 } | 550 } |
| 551 }); | 551 }); |
| 552 } | 552 } |
| 553 } else { | 553 } else { |
| 554 var mirror = reflect(receiverValue); | 554 var mirror = reflect(receiverValue); |
| 555 var symbol = new Symbol(_expr.method); | 555 var symbol = new Symbol(_expr.method); |
| 556 _value = (_expr.isGetter) | 556 _value = (_expr.isGetter) |
| 557 ? mirror.getField(symbol).reflectee | 557 ? mirror.getField(symbol).reflectee |
| 558 : mirror.invoke(symbol, args, null).reflectee; | 558 : mirror.invoke(symbol, args, null).reflectee; |
| 559 | 559 |
| 560 if (receiverValue is Observable) { | 560 if (receiverValue is Observable) { |
| 561 _subscription = (receiverValue as Observable).changes.listen( | 561 _subscription = (receiverValue as Observable).changes.listen( |
| 562 (List<ChangeRecord> changes) { | 562 (List<ChangeRecord> changes) { |
| 563 if (changes.any((c) => c.changes(symbol))) { | 563 if (changes.any( |
| 564 (c) => c is PropertyChangeRecord && c.name == symbol)) { |
| 564 _invalidate(scope); | 565 _invalidate(scope); |
| 565 } | 566 } |
| 566 }); | 567 }); |
| 567 } | 568 } |
| 568 } | 569 } |
| 569 } | 570 } |
| 570 } | 571 } |
| 571 | 572 |
| 572 accept(Visitor v) => v.visitInvoke(this); | 573 accept(Visitor v) => v.visitInvoke(this); |
| 573 } | 574 } |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 644 * This does not work for calls that need to pass more than one argument. | 645 * This does not work for calls that need to pass more than one argument. |
| 645 */ | 646 */ |
| 646 call(arg0) => mirror.invoke(symbol, [arg0], null).reflectee; | 647 call(arg0) => mirror.invoke(symbol, [arg0], null).reflectee; |
| 647 } | 648 } |
| 648 | 649 |
| 649 class EvalException implements Exception { | 650 class EvalException implements Exception { |
| 650 final String message; | 651 final String message; |
| 651 EvalException(this.message); | 652 EvalException(this.message); |
| 652 String toString() => "EvalException: $message"; | 653 String toString() => "EvalException: $message"; |
| 653 } | 654 } |
| OLD | NEW |