| 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..b58041d161e71e4431225cccbdfe7e6e0d8f6309 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;
|
| + 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);
|
| + }
|
| +}
|
|
|