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

Side by Side Diff: pkg/front_end/test/scanner_fasta_test.dart

Issue 2910583002: improve fasta interpolation recovery (Closed)
Patch Set: remove unnecessary label Created 3 years, 6 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 license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 import 'package:analyzer/src/fasta/token_utils.dart'; 5 import 'package:analyzer/src/fasta/token_utils.dart';
6 import 'package:front_end/src/fasta/fasta_codes.dart';
6 import 'package:front_end/src/fasta/scanner/error_token.dart' as fasta; 7 import 'package:front_end/src/fasta/scanner/error_token.dart' as fasta;
7 import 'package:front_end/src/fasta/scanner/string_scanner.dart' as fasta; 8 import 'package:front_end/src/fasta/scanner/string_scanner.dart' as fasta;
8 import 'package:front_end/src/fasta/scanner/token.dart' as fasta; 9 import 'package:front_end/src/fasta/scanner/token.dart' as fasta;
9 import 'package:front_end/src/fasta/scanner/token_constants.dart' as fasta; 10 import 'package:front_end/src/fasta/scanner/token_constants.dart' as fasta;
10 import 'package:front_end/src/scanner/errors.dart'; 11 import 'package:front_end/src/scanner/errors.dart';
11 import 'package:front_end/src/scanner/token.dart'; 12 import 'package:front_end/src/scanner/token.dart';
12 import 'package:test/test.dart'; 13 import 'package:test/test.dart';
13 import 'package:test_reflective_loader/test_reflective_loader.dart'; 14 import 'package:test_reflective_loader/test_reflective_loader.dart';
14 15
15 import 'scanner_test.dart'; 16 import 'scanner_test.dart';
16 17
17 main() { 18 main() {
18 defineReflectiveSuite(() { 19 defineReflectiveSuite(() {
19 defineReflectiveTests(ScannerTest_Fasta); 20 defineReflectiveTests(ScannerTest_Fasta);
20 defineReflectiveTests(ScannerTest_Fasta_Direct); 21 defineReflectiveTests(ScannerTest_Fasta_Direct);
21 }); 22 });
22 } 23 }
23 24
24 @reflectiveTest 25 @reflectiveTest
25 class ScannerTest_Fasta extends ScannerTestBase { 26 class ScannerTest_Fasta extends ScannerTestBase {
27 ScannerTest_Fasta() {
28 usingFasta = true;
29 }
30
26 @override 31 @override
27 Token scanWithListener(String source, ErrorListener listener, 32 Token scanWithListener(String source, ErrorListener listener,
28 {bool genericMethodComments: false, 33 {bool genericMethodComments: false,
29 bool lazyAssignmentOperators: false}) { 34 bool lazyAssignmentOperators: false}) {
30 var scanner = new fasta.StringScanner(source, 35 var scanner = new fasta.StringScanner(source,
31 includeComments: true, 36 includeComments: true,
32 scanGenericMethodComments: genericMethodComments); 37 scanGenericMethodComments: genericMethodComments);
33 var token = scanner.tokenize(); 38 var token = scanner.tokenize();
34 return new ToAnalyzerTokenStreamConverter_WithListener(listener) 39 return new ToAnalyzerTokenStreamConverter_WithListener(listener)
35 .convertTokens(token); 40 .convertTokens(token);
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 prepareTokens(); 177 prepareTokens();
173 c3.remove(); 178 c3.remove();
174 expect(token.precedingComments, c1); 179 expect(token.precedingComments, c1);
175 expect(c1.next, c2); 180 expect(c1.next, c2);
176 expect(c2.next, isNull); 181 expect(c2.next, isNull);
177 } 182 }
178 } 183 }
179 184
180 @override 185 @override
181 @failingTest 186 @failingTest
182 void test_incomplete_string_interpolation() {
183 // TODO(danrubel): fix ToAnalyzerTokenStreamConverter_WithListener
184 // to handle synthetic closers in token stream
185 super.test_incomplete_string_interpolation();
186 }
187
188 @override
189 @failingTest
190 void test_mismatched_closer() { 187 void test_mismatched_closer() {
191 // TODO(paulberry,ahe): Fasta and analyzer recover this error differently. 188 // TODO(paulberry,ahe): Fasta and analyzer recover this error differently.
192 // Figure out which recovery technique we want the front end to use. 189 // Figure out which recovery technique we want the front end to use.
193 super.test_mismatched_closer(); 190 super.test_mismatched_closer();
194 } 191 }
195 192
196 @override 193 @override
197 @failingTest 194 @failingTest
198 void test_mismatched_opener() { 195 void test_mismatched_opener() {
199 // TODO(paulberry,ahe): Fasta and analyzer recover this error differently. 196 // TODO(paulberry,ahe): Fasta and analyzer recover this error differently.
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 } 493 }
497 494
498 /// Scanner tests that exercise the Fasta scanner directly. 495 /// Scanner tests that exercise the Fasta scanner directly.
499 @reflectiveTest 496 @reflectiveTest
500 class ScannerTest_Fasta_Direct extends ScannerTest_Fasta_Base { 497 class ScannerTest_Fasta_Direct extends ScannerTest_Fasta_Base {
501 @override 498 @override
502 Token scan(String source) { 499 Token scan(String source) {
503 var scanner = new fasta.StringScanner(source, includeComments: true); 500 var scanner = new fasta.StringScanner(source, includeComments: true);
504 return scanner.tokenize(); 501 return scanner.tokenize();
505 } 502 }
503
504 test_unterminated_string_with_unterminated_interpolation() {
505 Token token = scan(r'"foo ${bar');
506 BeginToken interpolationStart = token.next;
507
508 Token previous;
509 while (token.kind != fasta.BAD_INPUT_TOKEN) {
510 expect(token.isEof, isFalse);
511 previous = token;
512 token = token.next;
513 }
514
515 // Expect interpolation to be terminated before string is closed
516
517 token = previous;
518 expect(token.isSynthetic, isTrue);
519 expect(token.length, 0);
520 expect(token.stringValue, '}');
521
522 token = token.next;
523 expect((token as fasta.ErrorToken).errorCode, same(codeUnmatchedToken));
524 expect((token as fasta.UnmatchedToken).begin, same(interpolationStart));
525
526 token = token.next;
527 expect((token as fasta.ErrorToken).errorCode, same(codeUnterminatedString));
528 }
506 } 529 }
507 530
508 /// Override of [ToAnalyzerTokenStreamConverter] that verifies that there are no 531 /// Override of [ToAnalyzerTokenStreamConverter] that verifies that there are no
509 /// errors. 532 /// errors.
510 class ToAnalyzerTokenStreamConverter_NoErrors 533 class ToAnalyzerTokenStreamConverter_NoErrors
511 extends ToAnalyzerTokenStreamConverter { 534 extends ToAnalyzerTokenStreamConverter {
512 @override 535 @override
513 void reportError( 536 void reportError(
514 ScannerErrorCode errorCode, int offset, List<Object> arguments) { 537 ScannerErrorCode errorCode, int offset, List<Object> arguments) {
515 fail('Unexpected error: $errorCode, $offset, $arguments'); 538 fail('Unexpected error: $errorCode, $offset, $arguments');
516 } 539 }
517 } 540 }
518 541
519 /// Override of [ToAnalyzerTokenStreamConverter] that records errors in an 542 /// Override of [ToAnalyzerTokenStreamConverter] that records errors in an
520 /// [ErrorListener]. 543 /// [ErrorListener].
521 class ToAnalyzerTokenStreamConverter_WithListener 544 class ToAnalyzerTokenStreamConverter_WithListener
522 extends ToAnalyzerTokenStreamConverter { 545 extends ToAnalyzerTokenStreamConverter {
523 final ErrorListener _listener; 546 final ErrorListener _listener;
524 547
525 ToAnalyzerTokenStreamConverter_WithListener(this._listener); 548 ToAnalyzerTokenStreamConverter_WithListener(this._listener);
526 549
527 @override 550 @override
528 void reportError( 551 void reportError(
529 ScannerErrorCode errorCode, int offset, List<Object> arguments) { 552 ScannerErrorCode errorCode, int offset, List<Object> arguments) {
530 _listener.errors.add(new TestError(offset, errorCode, arguments)); 553 _listener.errors.add(new TestError(offset, errorCode, arguments));
531 } 554 }
532 } 555 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698