Index: pkg/compiler/lib/src/js/js.dart |
diff --git a/pkg/compiler/lib/src/js/js.dart b/pkg/compiler/lib/src/js/js.dart |
index 2d208a6940a14714429d5c817bc0c1c5c5d0731e..e65fa7aa9e6a9a89a4eb6e468c073a634eb149bf 100644 |
--- a/pkg/compiler/lib/src/js/js.dart |
+++ b/pkg/compiler/lib/src/js/js.dart |
@@ -16,11 +16,14 @@ import '../dump_info.dart' show DumpInfoTask; |
CodeBuffer prettyPrint(Node node, leg.Compiler compiler, |
{DumpInfoTask monitor, |
- bool allowVariableMinification: true}) { |
+ bool allowVariableMinification: true, |
+ Renamer renamerForNames: |
+ JavaScriptPrintingOptions.identityRenamer}) { |
JavaScriptPrintingOptions options = new JavaScriptPrintingOptions( |
shouldCompressOutput: compiler.enableMinification, |
minifyLocalVariables: allowVariableMinification, |
- preferSemicolonToNewlineInMinifiedOutput: USE_NEW_EMITTER); |
+ preferSemicolonToNewlineInMinifiedOutput: USE_NEW_EMITTER, |
+ renamerForNames: renamerForNames); |
Dart2JSJavaScriptPrintingContext context = |
new Dart2JSJavaScriptPrintingContext(compiler, monitor); |
Printer printer = new Printer(options, context); |
@@ -85,3 +88,83 @@ class Dart2JSJavaScriptPrintingContext implements JavaScriptPrintingContext { |
} |
} |
} |
+ |
+/// Interface for ast nodes that encapsulate an ast that needs to be |
+/// traversed when counting tokens. |
+abstract class AstContainer implements Node { |
+ Iterable<Node> get containedNodes; |
+} |
+ |
+/// Interface for tasks in the compiler that need to finalize tokens after |
+/// counting them. |
+abstract class TokenFinalizer { |
+ void finalizeTokens(); |
+} |
+ |
+/// Implements reference counting for instances of [ReferenceCountedAstNode] |
+class TokenCounter extends BaseVisitor { |
+ @override |
+ visitNode(Node node) { |
+ if (node is AstContainer) { |
+ for (Node element in node.containedNodes) { |
+ element.accept(this); |
+ } |
+ } else if (node is ReferenceCountedAstNode) { |
+ node.markSeen(this); |
+ } else { |
+ super.visitNode(node); |
+ } |
+ } |
+ |
+ void countTokens(Node node) => node.accept(this); |
+} |
+ |
+abstract class ReferenceCountedAstNode implements Node { |
+ markSeen(TokenCounter visitor); |
+} |
+ |
+/// Represents the LiteralString resulting from unparsing [expression]. The |
+/// actual unparsing is done on demand when requesting the [value] of this |
+/// node. |
+/// |
+/// This is used when generated code needs to be represented as a string, |
+/// for example by the lazy emitter or when generating code generators. |
+class UnparsedNode extends DeferredString |
+ implements AstContainer { |
+ @override |
+ final Node tree; |
+ final leg.Compiler _compiler; |
+ final bool _protectForEval; |
+ LiteralString _cachedLiteral; |
+ |
+ Iterable<Node> get containedNodes => [tree]; |
+ |
+ /// A [js.Literal] that represents the string result of unparsing [ast]. |
+ /// |
+ /// When its string [value] is requested, the node pretty-prints the given |
+ /// [ast] and, if [protectForEval] is true, wraps the resulting |
+ /// string in parenthesis. The result is also escaped. |
+ UnparsedNode(this.tree, this._compiler, this._protectForEval); |
+ |
+ LiteralString get _literal { |
+ if (_cachedLiteral == null) { |
+ String text = prettyPrint(tree, _compiler).getText(); |
+ if (_protectForEval) { |
+ if (tree is Fun) text = '($text)'; |
+ if (tree is LiteralExpression) { |
+ LiteralExpression literalExpression = tree; |
+ String template = literalExpression.template; |
+ if (template.startsWith("function ") || |
+ template.startsWith("{")) { |
+ text = '($text)'; |
+ } |
+ } |
+ } |
+ _cachedLiteral = js.escapedString(text); |
+ } |
+ return _cachedLiteral; |
+ } |
+ |
+ @override |
+ String get value => _literal.value; |
+} |