Index: pkg/js_ast/lib/src/builder.dart |
diff --git a/pkg/js_ast/lib/src/builder.dart b/pkg/js_ast/lib/src/builder.dart |
index 12f204e79343dcd347822df75d6c615fbcd92a04..f03c67c154089a38d5134c121d9bd463ba6d4ee8 100644 |
--- a/pkg/js_ast/lib/src/builder.dart |
+++ b/pkg/js_ast/lib/src/builder.dart |
@@ -329,6 +329,29 @@ class JsBuilder { |
/// [escapedString]. |
LiteralString string(String value) => new LiteralString('"$value"'); |
+ /// Creates an instance of [LiteralString] from [value]. |
+ /// |
+ /// Does not add quotes or do any escaping. |
+ LiteralString stringPart(String value) => new LiteralString(value); |
+ |
+ StringConcatenation concatenateStrings(Iterable<Literal> parts, |
+ {addQuotes: false}) { |
+ List<Literal> _parts; |
+ if (addQuotes) { |
+ Literal quote = stringPart('"'); |
+ _parts = <Literal>[quote] |
+ ..addAll(parts) |
+ ..add(quote); |
+ } else { |
+ _parts = new List.from(parts, growable: false); |
+ } |
+ return new StringConcatenation(_parts); |
+ } |
+ |
+ Iterable<Literal> joinLiterals(Iterable<Literal> list, Literal separator) { |
+ return new _InterleaveIterable(list, separator); |
+ } |
+ |
LiteralNumber number(num value) => new LiteralNumber('$value'); |
LiteralBool boolean(bool value) => new LiteralBool(value); |
@@ -349,6 +372,10 @@ class JsBuilder { |
} |
LiteralString string(String value) => js.string(value); |
+LiteralString stringPart(String value) => js.stringPart(value); |
+Iterable<Literal> joinLiterals(Iterable<Literal> list, Literal separator) { |
+ return js.joinLiterals(list, separator); |
+} |
LiteralNumber number(num value) => js.number(value); |
ArrayInitializer numArray(Iterable<int> list) => js.numArray(list); |
ArrayInitializer stringArray(Iterable<String> list) => js.stringArray(list); |
@@ -772,7 +799,6 @@ class MiniJsParser { |
} |
Expression parseFunctionExpression() { |
- String last = lastToken; |
if (lastCategory == ALPHA || lastCategory == HASH) { |
Declaration name = parseVariableDeclaration(); |
return new NamedFunction(name, parseFun()); |
@@ -1272,7 +1298,6 @@ class MiniJsParser { |
Statement parseTry() { |
expectCategory(LBRACE); |
Block body = parseBlock(); |
- String token = lastToken; |
Catch catchPart = null; |
if (acceptString('catch')) catchPart = parseCatch(); |
Block finallyPart = null; |
@@ -1348,3 +1373,40 @@ class MiniJsParser { |
return new Catch(errorName, body); |
} |
} |
+ |
+class _InterleaveIterator implements Iterator<Node> { |
+ Iterator<Node> source; |
+ Node separator; |
+ bool isNextSeparator = false; |
+ bool isInitialized = false; |
+ |
+ _InterleaveIterator(this.source, this.separator); |
+ |
+ bool moveNext() { |
+ if (!isInitialized) { |
+ isInitialized = true; |
+ return source.moveNext(); |
+ } else if (isNextSeparator) { |
+ isNextSeparator = false; |
+ return true; |
+ } else { |
+ return isNextSeparator = source.moveNext(); |
+ } |
+ } |
+ |
+ Node get current { |
+ if (isNextSeparator) return separator._clone(); |
+ return source.current; |
+ } |
+} |
+ |
+class _InterleaveIterable extends IterableBase { |
+ Iterable<Node> source; |
+ Node separator; |
+ |
+ _InterleaveIterable(this.source, this.separator); |
+ |
+ Iterator<Node> get iterator { |
+ return new _InterleaveIterator(source.iterator, separator); |
+ } |
+} |