Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(115)

Side by Side Diff: pkg/front_end/lib/src/fasta/scanner.dart

Issue 2767083002: fasta scanner recovery and error code translation improvements (Closed)
Patch Set: revert address comments and fix for token_stream_rewriter test Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE.md file. 3 // BSD-style license that can be found in the LICENSE.md file.
4 4
5 library fasta.scanner; 5 library fasta.scanner;
6 6
7 import 'dart:convert' show UNICODE_REPLACEMENT_CHARACTER_RUNE; 7 import 'dart:convert' show UNICODE_REPLACEMENT_CHARACTER_RUNE;
8 8
9 import 'scanner/token.dart' show Token; 9 import 'scanner/token.dart' show Token;
10 10
11 import 'scanner/string_scanner.dart' show StringScanner;
12
11 import 'scanner/utf8_bytes_scanner.dart' show Utf8BytesScanner; 13 import 'scanner/utf8_bytes_scanner.dart' show Utf8BytesScanner;
12 14
13 import 'scanner/recover.dart' show defaultRecoveryStrategy; 15 import 'scanner/recover.dart' show defaultRecoveryStrategy;
14 16
15 export 'scanner/token.dart' 17 export 'scanner/token.dart'
16 show 18 show
17 BeginGroupToken, 19 BeginGroupToken,
18 KeywordToken, 20 KeywordToken,
19 StringToken, 21 StringToken,
20 SymbolToken, 22 SymbolToken,
(...skipping 24 matching lines...) Expand all
45 bool get hasErrors; 47 bool get hasErrors;
46 48
47 List<int> get lineStarts; 49 List<int> get lineStarts;
48 50
49 Token tokenize(); 51 Token tokenize();
50 } 52 }
51 53
52 class ScannerResult { 54 class ScannerResult {
53 final Token tokens; 55 final Token tokens;
54 final List<int> lineStarts; 56 final List<int> lineStarts;
57 final bool hasErrors;
55 58
56 ScannerResult(this.tokens, this.lineStarts); 59 ScannerResult(this.tokens, this.lineStarts, this.hasErrors);
57 } 60 }
58 61
62 /// Scan/tokenize the given UTF8 [bytes].
63 /// If [recover] is null, then the [defaultRecoveryStrategy] is used.
59 ScannerResult scan(List<int> bytes, 64 ScannerResult scan(List<int> bytes,
60 {bool includeComments: false, Recover recover}) { 65 {bool includeComments: false, Recover recover}) {
61 if (bytes.last != 0) { 66 if (bytes.last != 0) {
62 throw new ArgumentError("[bytes]: the last byte must be null."); 67 throw new ArgumentError("[bytes]: the last byte must be null.");
63 } 68 }
64 Scanner scanner = 69 Scanner scanner =
65 new Utf8BytesScanner(bytes, includeComments: includeComments); 70 new Utf8BytesScanner(bytes, includeComments: includeComments);
71 return _tokenizeAndRecover(scanner, recover, bytes);
72 }
73
74 /// Scan/tokenize the given [source].
75 /// If [recover] is null, then the [defaultRecoveryStrategy] is used.
76 ScannerResult scanString(String source,
77 {bool includeComments: false, Recover recover}) {
78 assert(source != null, 'source must not be null');
79 StringScanner scanner =
80 new StringScanner(source, includeComments: includeComments);
81 // TODO(danrubel): what should be passed for the "bytes" argument?
82 // does the Recover API need to be adjusted for a String source?
83 return _tokenizeAndRecover(scanner, recover, null);
84 }
85
86 ScannerResult _tokenizeAndRecover(
87 Scanner scanner, Recover recover, List<int> bytes) {
66 Token tokens = scanner.tokenize(); 88 Token tokens = scanner.tokenize();
67 if (scanner.hasErrors) { 89 if (scanner.hasErrors) {
68 recover ??= defaultRecoveryStrategy; 90 recover ??= defaultRecoveryStrategy;
69 tokens = recover(bytes, tokens, scanner.lineStarts); 91 tokens = recover(bytes, tokens, scanner.lineStarts);
70 } 92 }
71 return new ScannerResult(tokens, scanner.lineStarts); 93 return new ScannerResult(tokens, scanner.lineStarts, scanner.hasErrors);
72 } 94 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698