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