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 /// Transfomer that combines multiple dart script tags into a single one. | 5 /// Transfomer that combines multiple dart script tags into a single one. |
6 library polymer.src.build.script_compactor; | 6 library polymer.src.build.script_compactor; |
7 | 7 |
8 import 'dart:async'; | 8 import 'dart:async'; |
9 import 'dart:convert'; | 9 import 'dart:convert'; |
10 | 10 |
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
499 var isTwoWay = false; | 499 var isTwoWay = false; |
500 if (name is String) { | 500 if (name is String) { |
501 name = name.toLowerCase(); | 501 name = name.toLowerCase(); |
502 isEvent = name.startsWith('on-'); | 502 isEvent = name.startsWith('on-'); |
503 isTwoWay = !isEvent && bindings.isWhole && (isCustomTag || | 503 isTwoWay = !isEvent && bindings.isWhole && (isCustomTag || |
504 tag == 'input' && (name == 'value' || name =='checked') || | 504 tag == 'input' && (name == 'value' || name =='checked') || |
505 tag == 'select' && (name == 'selectedindex' || name == 'value') || | 505 tag == 'select' && (name == 'selectedindex' || name == 'value') || |
506 tag == 'textarea' && name == 'value'); | 506 tag == 'textarea' && name == 'value'); |
507 } | 507 } |
508 for (var exp in bindings.expressions) { | 508 for (var exp in bindings.expressions) { |
509 _addExpression(exp, isEvent, isTwoWay); | 509 _addExpression(exp, isEvent, isTwoWay, node.sourceSpan); |
510 } | 510 } |
511 }); | 511 }); |
512 } | 512 } |
513 | 513 |
514 void _addExpression(String stringExpression, bool inEvent, bool isTwoWay) { | 514 void _addExpression(String stringExpression, bool inEvent, bool isTwoWay, |
| 515 SourceSpan span) { |
| 516 |
515 if (inEvent) { | 517 if (inEvent) { |
516 if (!stringExpression.startsWith("@")) { | 518 if (stringExpression.startsWith('@')) { |
517 if (stringExpression == '') return; | 519 logger.warning('event bindings with @ are no longer supported', |
518 generator.addGetter(stringExpression); | 520 span: span); |
519 generator.addSymbol(stringExpression); | |
520 return; | 521 return; |
521 } | 522 } |
522 stringExpression = stringExpression.substring(1); | 523 |
| 524 if (stringExpression == '') return; |
| 525 generator.addGetter(stringExpression); |
| 526 generator.addSymbol(stringExpression); |
523 } | 527 } |
524 visitor.run(pe.parse(stringExpression), isTwoWay); | 528 visitor.run(pe.parse(stringExpression), isTwoWay); |
525 } | 529 } |
526 } | 530 } |
527 | 531 |
528 /// A polymer-expression visitor that records every getter and setter that will | 532 /// A polymer-expression visitor that records every getter and setter that will |
529 /// be needed to evaluate a single expression at runtime. | 533 /// be needed to evaluate a single expression at runtime. |
530 class _SubExpressionVisitor extends pe.RecursiveVisitor { | 534 class _SubExpressionVisitor extends pe.RecursiveVisitor { |
531 final SmokeCodeGenerator generator; | 535 final SmokeCodeGenerator generator; |
532 bool _includeSetter; | 536 bool _includeSetter; |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
694 for (var e in lib.exports) { | 698 for (var e in lib.exports) { |
695 var exported = e.exportedLibrary.units.expand((u) => u.types).toList(); | 699 var exported = e.exportedLibrary.units.expand((u) => u.types).toList(); |
696 _filter(exported, e.combinators); | 700 _filter(exported, e.combinators); |
697 result.addAll(exported); | 701 result.addAll(exported); |
698 } | 702 } |
699 return result; | 703 return result; |
700 } | 704 } |
701 | 705 |
702 /// Retrieves all top-level methods that are visible if you were to import | 706 /// Retrieves all top-level methods that are visible if you were to import |
703 /// [lib]. This includes exported methods from other libraries too. | 707 /// [lib]. This includes exported methods from other libraries too. |
704 List<ClassElement> _visibleTopLevelMethodsOf(LibraryElement lib) { | 708 List<FunctionElement> _visibleTopLevelMethodsOf(LibraryElement lib) { |
705 var result = []; | 709 var result = []; |
706 result.addAll(lib.units.expand((u) => u.functions)); | 710 result.addAll(lib.units.expand((u) => u.functions)); |
707 for (var e in lib.exports) { | 711 for (var e in lib.exports) { |
708 var exported = e.exportedLibrary.units | 712 var exported = e.exportedLibrary.units |
709 .expand((u) => u.functions).toList(); | 713 .expand((u) => u.functions).toList(); |
710 _filter(exported, e.combinators); | 714 _filter(exported, e.combinators); |
711 result.addAll(exported); | 715 result.addAll(exported); |
712 } | 716 } |
713 return result; | 717 return result; |
714 } | 718 } |
715 | 719 |
716 /// Filters [elements] that come from an export, according to its show/hide | 720 /// Filters [elements] that come from an export, according to its show/hide |
717 /// combinators. This modifies [elements] in place. | 721 /// combinators. This modifies [elements] in place. |
718 void _filter(List<analyzer.Element> elements, | 722 void _filter(List<analyzer.Element> elements, |
719 List<NamespaceCombinator> combinators) { | 723 List<NamespaceCombinator> combinators) { |
720 for (var c in combinators) { | 724 for (var c in combinators) { |
721 if (c is ShowElementCombinator) { | 725 if (c is ShowElementCombinator) { |
722 var show = c.shownNames.toSet(); | 726 var show = c.shownNames.toSet(); |
723 elements.retainWhere((e) => show.contains(e.displayName)); | 727 elements.retainWhere((e) => show.contains(e.displayName)); |
724 } else if (c is HideElementCombinator) { | 728 } else if (c is HideElementCombinator) { |
725 var hide = c.hiddenNames.toSet(); | 729 var hide = c.hiddenNames.toSet(); |
726 elements.removeWhere((e) => hide.contains(e.displayName)); | 730 elements.removeWhere((e) => hide.contains(e.displayName)); |
727 } | 731 } |
728 } | 732 } |
729 } | 733 } |
OLD | NEW |