| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |