Chromium Code Reviews| Index: sdk/lib/_internal/compiler/implementation/scanner/string_scanner.dart |
| diff --git a/sdk/lib/_internal/compiler/implementation/scanner/string_scanner.dart b/sdk/lib/_internal/compiler/implementation/scanner/string_scanner.dart |
| index 623838849222f7d566d7f51ec7022e8d2225c493..2dd92f9115fe66b8491a6ebd4f9f5fb1cf43967c 100644 |
| --- a/sdk/lib/_internal/compiler/implementation/scanner/string_scanner.dart |
| +++ b/sdk/lib/_internal/compiler/implementation/scanner/string_scanner.dart |
| @@ -8,48 +8,48 @@ part of scanner; |
| * Scanner that reads from a String and creates tokens that points to |
| * substrings. |
| */ |
| -class StringScanner extends ArrayBasedScanner<SourceString> { |
| - final String string; |
| +class StringScanner extends ArrayBasedScanner { |
| + /** The file content. */ |
| + String string; |
| - StringScanner(String this.string, {bool includeComments: false}) |
| - : super(includeComments); |
| + /** The current offset in [string]. */ |
| + int scanOffset = -1; |
| - int nextByte() => charAt(++byteOffset); |
| - |
| - int peek() => charAt(byteOffset + 1); |
| - |
| - int charAt(index) |
| - => (string.length > index) ? string.codeUnitAt(index) : $EOF; |
| - |
| - SourceString asciiString(int start, int offset) { |
| - return new SourceString.fromSubstring(string, start, byteOffset + offset); |
| + StringScanner(SourceFile file, {bool includeComments: false}) |
| + : string = file.slowText(), |
| + super(file, includeComments) { |
| + ensureZeroTermination(); |
| } |
| - SourceString utf8String(int start, int offset) { |
| - return new SourceString.fromSubstring( |
| - string, start, byteOffset + offset + 1); |
| + StringScanner.fromString(this.string, {bool includeComments: false}) |
| + : super(null, includeComments) { |
| + ensureZeroTermination(); |
| } |
| - void appendByteStringToken(PrecedenceInfo info, SourceString value) { |
| - // assert(kind != $a || keywords.get(value) == null); |
| - tail.next = new StringToken.fromSource(info, value, tokenStart); |
| - tail = tail.next; |
| + void ensureZeroTermination() { |
| + if (string.isEmpty || string.codeUnitAt(string.length - 1) != 0) { |
| + // TODO(lry): abort instead of copying the array, or warn? |
| + string = string + '\x00'; |
| + } |
| } |
| - void unmatchedBeginGroup(BeginGroupToken begin) { |
| - SourceString error = new SourceString('unmatched "${begin.stringValue}"'); |
| - Token close = |
| - new StringToken.fromSource(BAD_INPUT_INFO, error, begin.charOffset); |
| - // We want to ensure that unmatched BeginGroupTokens are reported |
| - // as errors. However, the rest of the parser assume the groups |
| - // are well-balanced and will never look at the endGroup |
| - // token. This is a nice property that allows us to skip quickly |
| - // over correct code. By inserting an additional error token in |
| - // the stream, we can keep ignoring endGroup tokens. |
| - Token next = |
| - new StringToken.fromSource(BAD_INPUT_INFO, error, begin.charOffset); |
| - begin.endGroup = close; |
| - close.next = next; |
| - next.next = begin.next; |
| + int advance() => string.codeUnitAt(++scanOffset); |
| + int peek() => string.codeUnitAt(scanOffset + 1); |
| + |
| + int get stringOffset => scanOffset; |
| + |
| + int currentAsUnicode(int next) => next; |
| + |
| + void handleUnicode(int startScanOffset) { } |
| + |
| + |
|
ngeoffray
2013/10/18 10:19:37
Extra line.
lukas
2013/10/24 16:48:36
Done.
|
| + Token firstToken() => tokens.next; |
| + Token previousToken() => tail; |
| + |
| + void appendSubstringToken(PrecedenceInfo info, int start, |
| + bool asciiOnly, [int extraOffset = 0]) { |
| + tail.next = new StringToken.fromSubstring(info, string, start, |
| + scanOffset + extraOffset, tokenStart, true); |
| + tail = tail.next; |
| } |
| } |