| 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 |