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

Side by Side Diff: pkg/front_end/lib/src/fasta/scanner/recover.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) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, 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 licenset hat can be found in the LICENSE file. 3 // BSD-style licenset hat can be found in the LICENSE file.
4 4
5 library fasta.scanner.recover; 5 library fasta.scanner.recover;
6 6
7 import 'token.dart' show StringToken, Token; 7 import 'token.dart' show StringToken, SymbolToken, Token;
8 8
9 import 'error_token.dart' show NonAsciiIdentifierToken, ErrorKind, ErrorToken; 9 import 'error_token.dart' show NonAsciiIdentifierToken, ErrorKind, ErrorToken;
10 10
11 import 'precedence.dart' as Precedence; 11 import 'precedence.dart' as Precedence;
12 12
13 import 'precedence.dart' show PrecedenceInfo; 13 import 'precedence.dart' show PrecedenceInfo;
14 14
15 /// Recover from errors in [tokens]. The original sources are provided as 15 /// Recover from errors in [tokens]. The original sources are provided as
16 /// [bytes]. [lineStarts] are the beginning character offsets of lines, and 16 /// [bytes]. [lineStarts] are the beginning character offsets of lines, and
17 /// must be updated if recovery is performed rewriting the original source 17 /// must be updated if recovery is performed rewriting the original source
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 if (current is ErrorToken) { 148 if (current is ErrorToken) {
149 ErrorToken first = current; 149 ErrorToken first = current;
150 Token next = current; 150 Token next = current;
151 bool treatAsWhitespace = false; 151 bool treatAsWhitespace = false;
152 do { 152 do {
153 current = next; 153 current = next;
154 if (errorTail == null) { 154 if (errorTail == null) {
155 error = next; 155 error = next;
156 } else { 156 } else {
157 errorTail.next = next; 157 errorTail.next = next;
158 next.previousToken = errorTail;
158 } 159 }
159 errorTail = next; 160 errorTail = next;
160 next = next.next; 161 next = next.next;
161 } while (next is ErrorToken && first.errorCode == next.errorCode); 162 } while (next is ErrorToken && first.errorCode == next.errorCode);
162 163
163 switch (first.errorCode) { 164 switch (first.errorCode) {
164 case ErrorKind.Encoding: 165 case ErrorKind.Encoding:
165 case ErrorKind.NonAsciiWhitespace: 166 case ErrorKind.NonAsciiWhitespace:
166 case ErrorKind.AsciiControlCharacter: 167 case ErrorKind.AsciiControlCharacter:
167 treatAsWhitespace = true; 168 treatAsWhitespace = true;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 default: 207 default:
207 treatAsWhitespace = true; 208 treatAsWhitespace = true;
208 break; 209 break;
209 } 210 }
210 if (treatAsWhitespace) continue; 211 if (treatAsWhitespace) continue;
211 } 212 }
212 if (goodTail == null) { 213 if (goodTail == null) {
213 good = current; 214 good = current;
214 } else { 215 } else {
215 goodTail.next = current; 216 goodTail.next = current;
217 current.previousToken = goodTail;
216 } 218 }
217 beforeGoodTail = goodTail; 219 beforeGoodTail = goodTail;
218 goodTail = current; 220 goodTail = current;
219 } 221 }
220 222
221 errorTail.next = good; 223 error.previousToken = new SymbolToken.eof(-1)..next = error;
224 Token tail;
225 if (good != null) {
226 errorTail.next = good;
227 good.previousToken = errorTail;
228 tail = goodTail;
229 } else {
230 tail = errorTail;
231 }
232 if (!tail.isEof)
233 tail.next = new SymbolToken.eof(tail.end)..previousToken = tail;
222 return error; 234 return error;
223 } 235 }
224 236
225 Token synthesizeToken(int charOffset, String value, PrecedenceInfo info) { 237 Token synthesizeToken(int charOffset, String value, PrecedenceInfo info) {
226 return new StringToken.fromString(info, value, charOffset); 238 return new StringToken.fromString(info, value, charOffset);
227 } 239 }
228 240
229 Token skipToEof(Token token) { 241 Token skipToEof(Token token) {
230 while (!token.isEof) { 242 while (!token.isEof) {
231 token = token.next; 243 token = token.next;
232 } 244 }
233 return token; 245 return token;
234 } 246 }
235 247
236 String closeBraceFor(String openBrace) { 248 String closeBraceFor(String openBrace) {
237 return const { 249 return const {
238 '(': ')', 250 '(': ')',
239 '[': ']', 251 '[': ']',
240 '{': '}', 252 '{': '}',
241 '<': '>', 253 '<': '>',
242 r'${': '}', 254 r'${': '}',
243 }[openBrace]; 255 }[openBrace];
244 } 256 }
OLDNEW
« no previous file with comments | « pkg/front_end/lib/src/fasta/scanner/array_based_scanner.dart ('k') | pkg/front_end/lib/src/fasta/scanner/token.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698