Chromium Code Reviews| 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..842fcd70b39145e65c44acea4c6eb9016eb8ff28 100644 |
| --- a/pkg/js_ast/lib/src/builder.dart |
| +++ b/pkg/js_ast/lib/src/builder.dart |
| @@ -329,6 +329,28 @@ 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) { |
| + _parts = <Literal>[stringPart('"')] |
|
sra1
2015/05/27 20:30:15
This stringPart can be shared between begining and
herhut
2015/06/01 12:09:43
I share them locally for now.
|
| + ..addAll(parts) |
| + ..add(stringPart('"')); |
| + } 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 +371,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 +798,6 @@ class MiniJsParser { |
| } |
| Expression parseFunctionExpression() { |
| - String last = lastToken; |
| if (lastCategory == ALPHA || lastCategory == HASH) { |
| Declaration name = parseVariableDeclaration(); |
| return new NamedFunction(name, parseFun()); |
| @@ -1272,7 +1297,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 +1372,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); |
| + } |
| +} |