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

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

Issue 2981343002: improve fasta closing brace recovery (Closed)
Patch Set: rebase Created 3 years, 5 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 file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 import 'package:front_end/src/base/errors.dart'; 5 import 'package:front_end/src/base/errors.dart';
6 import 'package:front_end/src/base/jenkins_smi_hash.dart'; 6 import 'package:front_end/src/base/jenkins_smi_hash.dart';
7 import 'package:front_end/src/scanner/errors.dart'; 7 import 'package:front_end/src/scanner/errors.dart';
8 import 'package:front_end/src/scanner/reader.dart'; 8 import 'package:front_end/src/scanner/reader.dart';
9 import 'package:front_end/src/scanner/scanner.dart'; 9 import 'package:front_end/src/scanner/scanner.dart';
10 import 'package:front_end/src/scanner/token.dart'; 10 import 'package:front_end/src/scanner/token.dart';
(...skipping 761 matching lines...) Expand 10 before | Expand all | Expand 10 after
772 772
773 void test_minus_eq() { 773 void test_minus_eq() {
774 _assertToken(TokenType.MINUS_EQ, "-="); 774 _assertToken(TokenType.MINUS_EQ, "-=");
775 } 775 }
776 776
777 void test_minus_minus() { 777 void test_minus_minus() {
778 _assertToken(TokenType.MINUS_MINUS, "--"); 778 _assertToken(TokenType.MINUS_MINUS, "--");
779 } 779 }
780 780
781 void test_mismatched_closer() { 781 void test_mismatched_closer() {
782 // When openers and closers are mismatched, analyzer favors considering the 782 // Normally when openers and closers are mismatched
783 // closer to be mismatched, which means that `(])` parses as a pair of 783 // fasta favors considering the opener to be mismatched,
784 // matched parentheses with an unmatched closing bracket between them. 784 // and inserts synthetic closers as needed.
785 // In this particular case, fasta cannot find an opener for ']'
786 // and thus marks ']' as an error and moves on.
785 ErrorListener listener = new ErrorListener(); 787 ErrorListener listener = new ErrorListener();
786 BeginToken openParen = scanWithListener('(])', listener); 788 BeginToken openParen = scanWithListener('(])', listener);
789 var closeBracket = openParen.next;
790 var closeParen = closeBracket.next;
791 expect(closeParen.next.type, TokenType.EOF);
792 expect(openParen.endToken, same(closeParen));
793 listener.assertNoErrors();
794 }
795
796 void test_mismatched_closer2() {
797 // When openers and closers are mismatched, analyzer favors considering the
798 // closer to be mismatched, which means that `[(])` parses as a pair of
799 // matched parenthesis with an unmatched open bracket before them
800 // and an unmatched closing bracket between them.
801 ErrorListener listener = new ErrorListener();
802 BeginToken openBracket = scanWithListener('[(])', listener);
803 BeginToken openParen = openBracket.next;
787 if (usingFasta) { 804 if (usingFasta) {
788 // When openers and closers are mismatched, 805 // When openers and closers are mismatched
789 // fasta favors considering the opener to be mismatched, 806 // fasta favors considering the opener to be mismatched,
790 // and inserts synthetic closers as needed. 807 // and inserts synthetic closers as needed.
791 // `(])` is parsed as `()])` where the first `)` is synthetic 808 // `[(])` is parsed as `[()])` where the first `)` is synthetic
792 // and the trailing `])` are unmatched. 809 // and the trailing `)` is unmatched.
793 var closeParen = openParen.next; 810 var closeParen = openParen.next;
794 expect(closeParen.isSynthetic, isTrue); 811 expect(closeParen.isSynthetic, isTrue);
795 var closeBracket = closeParen.next; 812 var closeBracket = closeParen.next;
796 expect(closeBracket.isSynthetic, isFalse); 813 expect(closeBracket.isSynthetic, isFalse);
797 var closeParen2 = closeBracket.next; 814 var closeParen2 = closeBracket.next;
798 expect(closeParen2.isSynthetic, isFalse); 815 expect(closeParen2.isSynthetic, isFalse);
799 expect(closeParen2.next.type, TokenType.EOF); 816 expect(closeParen2.next.type, TokenType.EOF);
817 expect(openBracket.endToken, same(closeBracket));
800 expect(openParen.endToken, same(closeParen)); 818 expect(openParen.endToken, same(closeParen));
801 listener.assertErrors([ 819 listener.assertErrors([
802 new TestError(0, ScannerErrorCode.EXPECTED_TOKEN, [')']), 820 new TestError(1, ScannerErrorCode.EXPECTED_TOKEN, [')']),
803 ]); 821 ]);
804 } else { 822 } else {
805 var closeBracket = openParen.next; 823 var closeBracket = openParen.next;
806 var closeParen = closeBracket.next; 824 var closeParen = closeBracket.next;
807 expect(closeParen.next.type, TokenType.EOF); 825 expect(closeParen.next.type, TokenType.EOF);
826 expect(openBracket.endToken, isNull);
808 expect(openParen.endToken, same(closeParen)); 827 expect(openParen.endToken, same(closeParen));
809 listener.assertNoErrors(); 828 listener.assertNoErrors();
810 } 829 }
811 } 830 }
812 831
813 void test_mismatched_opener() { 832 void test_mismatched_opener() {
814 // When openers and closers are mismatched, analyzer favors considering the 833 // When openers and closers are mismatched, analyzer favors considering the
815 // closer to be mismatched, which means that `([)` parses as three unmatched 834 // closer to be mismatched, which means that `([)` parses as three unmatched
816 // tokens. 835 // tokens.
817 ErrorListener listener = new ErrorListener(); 836 ErrorListener listener = new ErrorListener();
(...skipping 901 matching lines...) Expand 10 before | Expand all | Expand 10 after
1719 _TestScanner(CharacterReader reader, [this.listener]) : super.create(reader); 1738 _TestScanner(CharacterReader reader, [this.listener]) : super.create(reader);
1720 1739
1721 @override 1740 @override
1722 void reportError( 1741 void reportError(
1723 ScannerErrorCode errorCode, int offset, List<Object> arguments) { 1742 ScannerErrorCode errorCode, int offset, List<Object> arguments) {
1724 if (listener != null) { 1743 if (listener != null) {
1725 listener.errors.add(new TestError(offset, errorCode, arguments)); 1744 listener.errors.add(new TestError(offset, errorCode, arguments));
1726 } 1745 }
1727 } 1746 }
1728 } 1747 }
OLDNEW
« no previous file with comments | « pkg/front_end/lib/src/fasta/scanner/array_based_scanner.dart ('k') | tests/compiler/dart2js/error_token_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698