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