| Index: sdk/lib/_internal/compiler/implementation/tree/dartstring.dart
|
| diff --git a/sdk/lib/_internal/compiler/implementation/tree/dartstring.dart b/sdk/lib/_internal/compiler/implementation/tree/dartstring.dart
|
| index 08ed05ac67967bddb1daf5b18a924bd05a8241f2..5a3494d6e906e04323a80917f984fd2baa648a82 100644
|
| --- a/sdk/lib/_internal/compiler/implementation/tree/dartstring.dart
|
| +++ b/sdk/lib/_internal/compiler/implementation/tree/dartstring.dart
|
| @@ -11,7 +11,7 @@ part of tree;
|
| * representing its content after removing quotes and resolving escapes in
|
| * its source.
|
| */
|
| -abstract class DartString implements Iterable<int> {
|
| +abstract class DartString extends Iterable<int> {
|
| factory DartString.empty() => const LiteralDartString("");
|
| // This is a convenience constructor. If you need a const literal DartString,
|
| // use [const LiteralDartString(string)] directly.
|
| @@ -28,17 +28,18 @@ abstract class DartString implements Iterable<int> {
|
| const DartString();
|
| int get length;
|
| bool get isEmpty => length == 0;
|
| - Iterator<int> iterator();
|
| + Iterator<int> get iterator;
|
| String slowToString();
|
|
|
| bool operator ==(var other) {
|
| if (other is !DartString) return false;
|
| DartString otherString = other;
|
| if (length != otherString.length) return false;
|
| - Iterator it1 = iterator();
|
| - Iterator it2 = otherString.iterator();
|
| - while (it1.hasNext) {
|
| - if (it1.next() != it2.next()) return false;
|
| + Iterator it1 = iterator;
|
| + Iterator it2 = otherString.iterator;
|
| + while (it1.moveNext()) {
|
| + if (!it2.moveNext()) return false;
|
| + if (it1.current != it2.current) return false;
|
| }
|
| return true;
|
| }
|
| @@ -54,7 +55,7 @@ class LiteralDartString extends DartString {
|
| final String string;
|
| const LiteralDartString(this.string);
|
| int get length => string.length;
|
| - Iterator<int> iterator() => new StringCodeIterator(string);
|
| + Iterator<int> get iterator => new StringCodeIterator(string);
|
| String slowToString() => string;
|
| SourceString get source => new StringWrapper(string);
|
| }
|
| @@ -67,7 +68,7 @@ abstract class SourceBasedDartString extends DartString {
|
| final SourceString source;
|
| final int length;
|
| SourceBasedDartString(this.source, this.length);
|
| - Iterator<int> iterator();
|
| + Iterator<int> get iterator;
|
| }
|
|
|
| /**
|
| @@ -76,7 +77,7 @@ abstract class SourceBasedDartString extends DartString {
|
| */
|
| class RawSourceDartString extends SourceBasedDartString {
|
| RawSourceDartString(source, length) : super(source, length);
|
| - Iterator<int> iterator() => source.iterator();
|
| + Iterator<int> get iterator => source.iterator;
|
| String slowToString() {
|
| if (toStringCache != null) return toStringCache;
|
| toStringCache = source.slowToString();
|
| @@ -90,7 +91,7 @@ class RawSourceDartString extends SourceBasedDartString {
|
| */
|
| class EscapedSourceDartString extends SourceBasedDartString {
|
| EscapedSourceDartString(source, length) : super(source, length);
|
| - Iterator<int> iterator() {
|
| + Iterator<int> get iterator {
|
| if (toStringCache != null) return new StringCodeIterator(toStringCache);
|
| return new StringEscapeIterator(source);
|
| }
|
| @@ -98,8 +99,8 @@ class EscapedSourceDartString extends SourceBasedDartString {
|
| if (toStringCache != null) return toStringCache;
|
| StringBuffer buffer = new StringBuffer();
|
| StringEscapeIterator it = new StringEscapeIterator(source);
|
| - while (it.hasNext) {
|
| - buffer.addCharCode(it.next());
|
| + while (it.moveNext()) {
|
| + buffer.addCharCode(it.current);
|
| }
|
| toStringCache = buffer.toString();
|
| return toStringCache;
|
| @@ -119,7 +120,7 @@ class ConsDartString extends DartString {
|
| this.right = right,
|
| length = left.length + right.length;
|
|
|
| - Iterator<int> iterator() => new ConsDartStringIterator(this);
|
| + Iterator<int> get iterator => new ConsDartStringIterator(this);
|
|
|
| String slowToString() {
|
| if (toStringCache != null) return toStringCache;
|
| @@ -130,34 +131,39 @@ class ConsDartString extends DartString {
|
| }
|
|
|
| class ConsDartStringIterator implements Iterator<int> {
|
| - Iterator<int> current;
|
| + HasNextIterator<int> currentIterator;
|
| DartString right;
|
| bool hasNextLookAhead;
|
| + int _current = null;
|
| +
|
| ConsDartStringIterator(ConsDartString cons)
|
| - : current = cons.left.iterator(),
|
| + : currentIterator = new HasNextIterator<int>(cons.left.iterator),
|
| right = cons.right {
|
| - hasNextLookAhead = current.hasNext;
|
| + hasNextLookAhead = currentIterator.hasNext;
|
| if (!hasNextLookAhead) {
|
| nextPart();
|
| }
|
| }
|
| - bool get hasNext {
|
| - return hasNextLookAhead;
|
| - }
|
| - int next() {
|
| - assert(hasNextLookAhead);
|
| - int result = current.next();
|
| - hasNextLookAhead = current.hasNext;
|
| +
|
| + int get current => _current;
|
| +
|
| + bool moveNext() {
|
| + if (!hasNextLookAhead) {
|
| + _current = null;
|
| + return false;
|
| + }
|
| + _current = currentIterator.next();
|
| + hasNextLookAhead = currentIterator.hasNext;
|
| if (!hasNextLookAhead) {
|
| nextPart();
|
| }
|
| - return result;
|
| + return true;
|
| }
|
| void nextPart() {
|
| if (right != null) {
|
| - current = right.iterator();
|
| + currentIterator = new HasNextIterator<int>(right.iterator);
|
| right = null;
|
| - hasNextLookAhead = current.hasNext;
|
| + hasNextLookAhead = currentIterator.hasNext;
|
| }
|
| }
|
| }
|
| @@ -167,45 +173,63 @@ class ConsDartStringIterator implements Iterator<int> {
|
| */
|
| class StringEscapeIterator implements Iterator<int>{
|
| final Iterator<int> source;
|
| - StringEscapeIterator(SourceString source) : this.source = source.iterator();
|
| - bool get hasNext => source.hasNext;
|
| - int next() {
|
| - int code = source.next();
|
| - if (!identical(code, $BACKSLASH)) {
|
| - return code;
|
| + int _current = null;
|
| +
|
| + StringEscapeIterator(SourceString source) : this.source = source.iterator;
|
| +
|
| + int get current => _current;
|
| +
|
| + bool moveNext() {
|
| + if (!source.moveNext()) {
|
| + _current = null;
|
| + return false;
|
| }
|
| - code = source.next();
|
| - if (identical(code, $n)) return $LF;
|
| - if (identical(code, $r)) return $CR;
|
| - if (identical(code, $t)) return $TAB;
|
| - if (identical(code, $b)) return $BS;
|
| - if (identical(code, $f)) return $FF;
|
| - if (identical(code, $v)) return $VTAB;
|
| - if (identical(code, $x)) {
|
| - int value = hexDigitValue(source.next());
|
| - value = value * 16 + hexDigitValue(source.next());
|
| - return value;
|
| + int code = source.current;
|
| + if (code != $BACKSLASH) {
|
| + _current = code;
|
| + return true;
|
| }
|
| - if (identical(code, $u)) {
|
| - int value = 0;
|
| - code = source.next();
|
| - if (identical(code, $OPEN_CURLY_BRACKET)) {
|
| - for (code = source.next();
|
| - code != $CLOSE_CURLY_BRACKET;
|
| - code = source.next()) {
|
| - value = value * 16 + hexDigitValue(code);
|
| + source.moveNext();
|
| + code = source.current;
|
| + switch (code) {
|
| + case $n: _current = $LF; break;
|
| + case $r: _current = $CR; break;
|
| + case $t: _current = $TAB; break;
|
| + case $b: _current = $BS; break;
|
| + case $f: _current = $FF; break;
|
| + case $v: _current = $VTAB; break;
|
| + case $x:
|
| + source.moveNext();
|
| + int value = hexDigitValue(source.current);
|
| + source.moveNext();
|
| + value = value * 16 + hexDigitValue(source.current);
|
| + _current = value;
|
| + break;
|
| + case $u:
|
| + int value = 0;
|
| + source.moveNext();
|
| + code = source.current;
|
| + if (code == $OPEN_CURLY_BRACKET) {
|
| + source.moveNext();
|
| + while (source.current != $CLOSE_CURLY_BRACKET) {
|
| + value = value * 16 + hexDigitValue(source.current);
|
| + source.moveNext();
|
| + }
|
| + _current = value;
|
| + break;
|
| + }
|
| + // Four digit hex value.
|
| + value = hexDigitValue(code);
|
| + for (int i = 0; i < 3; i++) {
|
| + source.moveNext();
|
| + value = value * 16 + hexDigitValue(source.current);
|
| }
|
| - return value;
|
| - }
|
| - // Four digit hex value.
|
| - value = hexDigitValue(code);
|
| - for (int i = 0; i < 3; i++) {
|
| - code = source.next();
|
| - value = value * 16 + hexDigitValue(code);
|
| - }
|
| - return value;
|
| + _current = value;
|
| + break;
|
| + default:
|
| + _current = code;
|
| }
|
| - return code;
|
| + return true;
|
| }
|
| }
|
|
|
|
|