Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(21)

Side by Side Diff: pkg/polymer_expressions/lib/eval.dart

Issue 27618002: package:observe fix various api issues (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/polymer_expressions/example/person.dart ('k') | pkg/polymer_expressions/lib/polymer_expressions.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698