Chromium Code Reviews| 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 |
| 11 import 'package:html5lib/dom.dart' show Document, Element, Text; | 11 import 'package:html5lib/dom.dart' show Document, Element, Text; |
| 12 import 'package:html5lib/dom_parsing.dart'; | 12 import 'package:html5lib/dom_parsing.dart'; |
| 13 import 'package:html5lib/parser.dart' show parseFragment; | 13 import 'package:html5lib/parser.dart' show parseFragment; |
| 14 import 'package:analyzer/src/generated/ast.dart'; | 14 import 'package:analyzer/src/generated/ast.dart'; |
| 15 import 'package:analyzer/src/generated/element.dart' hide Element; | 15 import 'package:analyzer/src/generated/element.dart' hide Element; |
| 16 import 'package:analyzer/src/generated/element.dart' as analyzer show Element; | 16 import 'package:analyzer/src/generated/element.dart' as analyzer show Element; |
| 17 import 'package:barback/barback.dart'; | 17 import 'package:barback/barback.dart'; |
| 18 import 'package:path/path.dart' as path; | 18 import 'package:path/path.dart' as path; |
| 19 import 'package:source_maps/span.dart' show SourceFile; | 19 import 'package:source_maps/span.dart' show SourceFile, Span; |
| 20 import 'package:smoke/codegen/generator.dart'; | 20 import 'package:smoke/codegen/generator.dart'; |
| 21 import 'package:smoke/codegen/recorder.dart'; | 21 import 'package:smoke/codegen/recorder.dart'; |
| 22 import 'package:code_transformers/resolver.dart'; | 22 import 'package:code_transformers/resolver.dart'; |
| 23 import 'package:code_transformers/src/dart_sdk.dart'; | 23 import 'package:code_transformers/src/dart_sdk.dart'; |
| 24 import 'package:template_binding/src/mustache_tokens.dart' show MustacheTokens; | 24 import 'package:template_binding/src/mustache_tokens.dart' show MustacheTokens; |
| 25 | 25 |
| 26 import 'package:polymer_expressions/expression.dart' as pe; | 26 import 'package:polymer_expressions/expression.dart' as pe; |
| 27 import 'package:polymer_expressions/parser.dart' as pe; | 27 import 'package:polymer_expressions/parser.dart' as pe; |
| 28 import 'package:polymer_expressions/visitor.dart' as pe; | 28 import 'package:polymer_expressions/visitor.dart' as pe; |
| 29 | 29 |
| (...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 483 /// will be needed to evaluate them at runtime. | 483 /// will be needed to evaluate them at runtime. |
| 484 /// * extracts all attributes declared in the `attribute` attributes of | 484 /// * extracts all attributes declared in the `attribute` attributes of |
| 485 /// polymer elements. | 485 /// polymer elements. |
| 486 class _HtmlExtractor extends TreeVisitor { | 486 class _HtmlExtractor extends TreeVisitor { |
| 487 final Map<String, List<String>> publishedAttributes; | 487 final Map<String, List<String>> publishedAttributes; |
| 488 final SmokeCodeGenerator generator; | 488 final SmokeCodeGenerator generator; |
| 489 final _SubExpressionVisitor visitor; | 489 final _SubExpressionVisitor visitor; |
| 490 final TransformLogger logger; | 490 final TransformLogger logger; |
| 491 bool _inTemplate = false; | 491 bool _inTemplate = false; |
| 492 | 492 |
| 493 _HtmlExtractor(this.logger, SmokeCodeGenerator generator, | 493 _HtmlExtractor(TransformLogger logger, SmokeCodeGenerator generator, |
| 494 this.publishedAttributes) | 494 this.publishedAttributes) |
| 495 : generator = generator, | 495 : logger = logger, generator = generator, |
| 496 visitor = new _SubExpressionVisitor(generator); | 496 visitor = new _SubExpressionVisitor(generator, logger); |
| 497 | 497 |
| 498 void visitElement(Element node) { | 498 void visitElement(Element node) { |
| 499 if (_inTemplate) _processNormalElement(node); | 499 if (_inTemplate) _processNormalElement(node); |
| 500 if (node.localName == 'polymer-element') { | 500 if (node.localName == 'polymer-element') { |
| 501 _processPolymerElement(node); | 501 _processPolymerElement(node); |
| 502 _processNormalElement(node); | 502 _processNormalElement(node); |
| 503 } | 503 } |
| 504 | 504 |
| 505 if (node.localName == 'template') { | 505 if (node.localName == 'template') { |
| 506 var last = _inTemplate; | 506 var last = _inTemplate; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 551 tag == 'select' && (name == 'selectedindex' || name == 'value') || | 551 tag == 'select' && (name == 'selectedindex' || name == 'value') || |
| 552 tag == 'textarea' && name == 'value'); | 552 tag == 'textarea' && name == 'value'); |
| 553 } | 553 } |
| 554 for (var exp in bindings.expressions) { | 554 for (var exp in bindings.expressions) { |
| 555 _addExpression(exp, isEvent, isTwoWay, node.sourceSpan); | 555 _addExpression(exp, isEvent, isTwoWay, node.sourceSpan); |
| 556 } | 556 } |
| 557 }); | 557 }); |
| 558 } | 558 } |
| 559 | 559 |
| 560 void _addExpression(String stringExpression, bool inEvent, bool isTwoWay, | 560 void _addExpression(String stringExpression, bool inEvent, bool isTwoWay, |
| 561 span) { | 561 Span span) { |
| 562 | 562 |
| 563 if (inEvent) { | 563 if (inEvent) { |
| 564 if (stringExpression.startsWith('@')) { | 564 if (stringExpression.startsWith('@')) { |
| 565 logger.warning('event bindings with @ are no longer supported', | 565 logger.warning('event bindings with @ are no longer supported', |
| 566 span: span); | 566 span: span); |
| 567 return; | 567 return; |
| 568 } | 568 } |
| 569 | 569 |
| 570 if (stringExpression == '') return; | 570 if (stringExpression == '') return; |
| 571 if (stringExpression.startsWith('_')) { | |
| 572 logger.warning('private symbols cannot be used in event handlers', | |
| 573 span: span); | |
| 574 return; | |
| 575 } | |
| 571 generator.addGetter(stringExpression); | 576 generator.addGetter(stringExpression); |
| 572 generator.addSymbol(stringExpression); | 577 generator.addSymbol(stringExpression); |
| 573 } | 578 } |
| 574 visitor.run(pe.parse(stringExpression), isTwoWay); | 579 visitor.run(pe.parse(stringExpression), isTwoWay, span); |
| 575 } | 580 } |
| 576 } | 581 } |
| 577 | 582 |
| 578 /// A polymer-expression visitor that records every getter and setter that will | 583 /// A polymer-expression visitor that records every getter and setter that will |
| 579 /// be needed to evaluate a single expression at runtime. | 584 /// be needed to evaluate a single expression at runtime. |
| 580 class _SubExpressionVisitor extends pe.RecursiveVisitor { | 585 class _SubExpressionVisitor extends pe.RecursiveVisitor { |
| 581 final SmokeCodeGenerator generator; | 586 final SmokeCodeGenerator generator; |
| 587 final TransformLogger logger; | |
| 582 bool _includeSetter; | 588 bool _includeSetter; |
| 589 Span _currentSpan; | |
| 583 | 590 |
| 584 _SubExpressionVisitor(this.generator); | 591 _SubExpressionVisitor(this.generator, this.logger); |
| 585 | 592 |
| 586 /// Visit [exp], and record getters and setters that are needed in order to | 593 /// Visit [exp], and record getters and setters that are needed in order to |
| 587 /// evaluate it at runtime. [includeSetter] is only true if this expression | 594 /// evaluate it at runtime. [includeSetter] is only true if this expression |
| 588 /// occured in a context where it could be updated, for example in two-way | 595 /// occured in a context where it could be updated, for example in two-way |
| 589 /// bindings such as `<input value={{exp}}>`. | 596 /// bindings such as `<input value={{exp}}>`. |
| 590 void run(pe.Expression exp, bool includeSetter) { | 597 void run(pe.Expression exp, bool includeSetter, span) { |
| 598 _currentSpan = span; | |
| 591 _includeSetter = includeSetter; | 599 _includeSetter = includeSetter; |
| 592 visit(exp); | 600 visit(exp); |
| 593 } | 601 } |
| 594 | 602 |
| 595 /// Adds a getter and symbol for [name], and optionally a setter. | 603 /// Adds a getter and symbol for [name], and optionally a setter. |
| 596 _add(String name) { | 604 _add(String name) { |
| 605 if (name.startsWith('_')) { | |
| 606 logger.warning('private symbols are not supported', span: _currentSpan); | |
| 607 return; | |
| 608 } | |
| 597 generator.addGetter(name); | 609 generator.addGetter(name); |
|
Siggi Cherem (dart-lang)
2014/06/24 00:58:13
these APIs will cause a later failure if they are
| |
| 598 generator.addSymbol(name); | 610 generator.addSymbol(name); |
| 599 if (_includeSetter) generator.addSetter(name); | 611 if (_includeSetter) generator.addSetter(name); |
| 600 } | 612 } |
| 601 | 613 |
| 602 void preVisitExpression(e) { | 614 void preVisitExpression(e) { |
| 603 // For two-way bindings the outermost expression may be updated, so we need | 615 // For two-way bindings the outermost expression may be updated, so we need |
| 604 // both the getter and the setter, but we only need the getter for | 616 // both the getter and the setter, but we only need the getter for |
| 605 // subexpressions. We exclude setters as soon as we go deeper in the tree, | 617 // subexpressions. We exclude setters as soon as we go deeper in the tree, |
| 606 // except when we see a filter (that can potentially be a two-way | 618 // except when we see a filter (that can potentially be a two-way |
| 607 // transformer). | 619 // transformer). |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 770 for (var c in combinators) { | 782 for (var c in combinators) { |
| 771 if (c is ShowElementCombinator) { | 783 if (c is ShowElementCombinator) { |
| 772 var show = c.shownNames.toSet(); | 784 var show = c.shownNames.toSet(); |
| 773 elements.retainWhere((e) => show.contains(e.displayName)); | 785 elements.retainWhere((e) => show.contains(e.displayName)); |
| 774 } else if (c is HideElementCombinator) { | 786 } else if (c is HideElementCombinator) { |
| 775 var hide = c.hiddenNames.toSet(); | 787 var hide = c.hiddenNames.toSet(); |
| 776 elements.removeWhere((e) => hide.contains(e.displayName)); | 788 elements.removeWhere((e) => hide.contains(e.displayName)); |
| 777 } | 789 } |
| 778 } | 790 } |
| 779 } | 791 } |
| OLD | NEW |