| Index: pkg/front_end/test/scanner_test.dart
|
| diff --git a/pkg/front_end/test/scanner_test.dart b/pkg/front_end/test/scanner_test.dart
|
| index 18fb7c8102877913e763a7ff6c96ae1cc40a8d7d..d86f97eda21fb81e40eb257b5457a6d1f44121c8 100644
|
| --- a/pkg/front_end/test/scanner_test.dart
|
| +++ b/pkg/front_end/test/scanner_test.dart
|
| @@ -435,19 +435,27 @@ abstract class ScannerTestBase {
|
| new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 5),
|
| new StringToken(TokenType.IDENTIFIER, "bar", 7),
|
| ];
|
| + var expectedErrors = [
|
| + new TestError(9, ScannerErrorCode.UNTERMINATED_STRING_LITERAL, null),
|
| + ];
|
| if (usingFasta) {
|
| // fasta inserts synthetic closers
|
| expectedTokens.addAll([
|
| new SyntheticToken(TokenType.CLOSE_CURLY_BRACKET, 10),
|
| new SyntheticStringToken(TokenType.STRING, "\"", 10, 0),
|
| ]);
|
| + expectedErrors.addAll([
|
| + new TestError(5, ScannerErrorCode.EXPECTED_TOKEN, ['}']),
|
| + ]);
|
| } else {
|
| expectedTokens.addAll([
|
| new StringToken(TokenType.STRING, "", 10),
|
| ]);
|
| }
|
| - _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 9,
|
| - "\"foo \${bar", expectedTokens);
|
| + ErrorListener listener = new ErrorListener();
|
| + Token token = scanWithListener("\"foo \${bar", listener);
|
| + listener.assertErrors(expectedErrors);
|
| + _checkTokens(token, expectedTokens);
|
| }
|
|
|
| void test_index() {
|
| @@ -774,7 +782,8 @@ abstract class ScannerTestBase {
|
| // When openers and closers are mismatched, analyzer favors considering the
|
| // closer to be mismatched, which means that `(])` parses as a pair of
|
| // matched parentheses with an unmatched closing bracket between them.
|
| - var openParen = _scan('(])') as BeginToken;
|
| + ErrorListener listener = new ErrorListener();
|
| + var openParen = scanWithListener('(])', listener) as BeginToken;
|
| if (usingFasta) {
|
| // When openers and closers are mismatched,
|
| // fasta favors considering the opener to be mismatched,
|
| @@ -789,11 +798,15 @@ abstract class ScannerTestBase {
|
| expect(closeParen2.isSynthetic, isFalse);
|
| expect(closeParen2.next.type, TokenType.EOF);
|
| expect(openParen.endToken, same(closeParen));
|
| + listener.assertErrors([
|
| + new TestError(0, ScannerErrorCode.EXPECTED_TOKEN, [')']),
|
| + ]);
|
| } else {
|
| var closeBracket = openParen.next;
|
| var closeParen = closeBracket.next;
|
| expect(closeParen.next.type, TokenType.EOF);
|
| expect(openParen.endToken, same(closeParen));
|
| + listener.assertNoErrors();
|
| }
|
| }
|
|
|
| @@ -801,7 +814,8 @@ abstract class ScannerTestBase {
|
| // When openers and closers are mismatched, analyzer favors considering the
|
| // closer to be mismatched, which means that `([)` parses as three unmatched
|
| // tokens.
|
| - var openParen = _scan('([)') as BeginToken;
|
| + ErrorListener listener = new ErrorListener();
|
| + var openParen = scanWithListener('([)', listener) as BeginToken;
|
| var openBracket = openParen.next as BeginToken;
|
| if (usingFasta) {
|
| // When openers and closers are mismatched,
|
| @@ -815,11 +829,15 @@ abstract class ScannerTestBase {
|
| expect(closeParen.next.type, TokenType.EOF);
|
| expect(openBracket.endToken, closeBracket);
|
| expect(openParen.endToken, closeParen);
|
| + listener.assertErrors([
|
| + new TestError(1, ScannerErrorCode.EXPECTED_TOKEN, [']']),
|
| + ]);
|
| } else {
|
| var closeParen = openBracket.next;
|
| expect(closeParen.next.type, TokenType.EOF);
|
| expect(openParen.endToken, isNull);
|
| expect(openBracket.endToken, isNull);
|
| + listener.assertNoErrors();
|
| }
|
| }
|
|
|
| @@ -1042,19 +1060,27 @@ abstract class ScannerTestBase {
|
| new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 3),
|
| new StringToken(TokenType.IDENTIFIER, "name", 5),
|
| ];
|
| + var expectedErrors = [
|
| + new TestError(8, ScannerErrorCode.UNTERMINATED_STRING_LITERAL, null),
|
| + ];
|
| if (usingFasta) {
|
| // fasta inserts synthetic closers
|
| expectedTokens.addAll([
|
| new SyntheticToken(TokenType.CLOSE_CURLY_BRACKET, 9),
|
| new SyntheticStringToken(TokenType.STRING, "'''", 9, 0),
|
| ]);
|
| + expectedErrors.addAll([
|
| + new TestError(3, ScannerErrorCode.EXPECTED_TOKEN, ['}']),
|
| + ]);
|
| } else {
|
| expectedTokens.addAll([
|
| new StringToken(TokenType.STRING, "", 9),
|
| ]);
|
| }
|
| - _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8,
|
| - "'''\${name", expectedTokens);
|
| + ErrorListener listener = new ErrorListener();
|
| + Token token = scanWithListener("'''\${name", listener);
|
| + listener.assertErrors(expectedErrors);
|
| + _checkTokens(token, expectedTokens);
|
| }
|
|
|
| void test_string_multi_unterminated_interpolation_identifier() {
|
| @@ -1220,18 +1246,25 @@ abstract class ScannerTestBase {
|
| new StringToken(TokenType.STRING, "", 3),
|
| new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 3),
|
| ];
|
| + var expectedErrors = [];
|
| if (usingFasta) {
|
| // Fasta scanner inserts a synthetic identifier
|
| expectedTokens.addAll([
|
| new SyntheticStringToken(TokenType.IDENTIFIER, "", 4, 0),
|
| new StringToken(TokenType.STRING, "'", 4),
|
| ]);
|
| + expectedErrors.addAll([
|
| + new TestError(4, ScannerErrorCode.MISSING_IDENTIFIER, null),
|
| + ]);
|
| } else {
|
| expectedTokens.addAll([
|
| new StringToken(TokenType.STRING, "'", 4),
|
| ]);
|
| }
|
| - _assertTokens("'\$x\$'", expectedTokens);
|
| + ErrorListener listener = new ErrorListener();
|
| + Token token = scanWithListener("'\$x\$'", listener);
|
| + listener.assertErrors(expectedErrors);
|
| + _checkTokens(token, expectedTokens);
|
| }
|
|
|
| void test_string_simple_interpolation_nonIdentifier() {
|
| @@ -1239,15 +1272,22 @@ abstract class ScannerTestBase {
|
| new StringToken(TokenType.STRING, "'", 0),
|
| new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1),
|
| ];
|
| + var expectedErrors = [];
|
| if (usingFasta) {
|
| expectedTokens.addAll([
|
| new SyntheticStringToken(TokenType.IDENTIFIER, "", 2),
|
| ]);
|
| + expectedErrors.addAll([
|
| + new TestError(2, ScannerErrorCode.MISSING_IDENTIFIER, null),
|
| + ]);
|
| }
|
| expectedTokens.addAll([
|
| new StringToken(TokenType.STRING, "1'", 2),
|
| ]);
|
| - _assertTokens("'\$1'", expectedTokens);
|
| + ErrorListener listener = new ErrorListener();
|
| + Token token = scanWithListener("'\$1'", listener);
|
| + listener.assertErrors(expectedErrors);
|
| + _checkTokens(token, expectedTokens);
|
| }
|
|
|
| void test_string_simple_single() {
|
| @@ -1294,19 +1334,27 @@ abstract class ScannerTestBase {
|
| new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 1),
|
| new StringToken(TokenType.IDENTIFIER, "name", 3),
|
| ];
|
| + List<TestError> expectedErrors = [
|
| + new TestError(6, ScannerErrorCode.UNTERMINATED_STRING_LITERAL, null),
|
| + ];
|
| if (usingFasta) {
|
| // fasta inserts synthetic closers
|
| expectedTokens.addAll([
|
| new SyntheticToken(TokenType.CLOSE_CURLY_BRACKET, 7),
|
| new SyntheticStringToken(TokenType.STRING, "'", 7, 0),
|
| ]);
|
| + expectedErrors.addAll([
|
| + new TestError(1, ScannerErrorCode.EXPECTED_TOKEN, ['}']),
|
| + ]);
|
| } else {
|
| expectedTokens.addAll([
|
| new StringToken(TokenType.STRING, "", 7),
|
| ]);
|
| }
|
| - _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 6,
|
| - "'\${name", expectedTokens);
|
| + ErrorListener listener = new ErrorListener();
|
| + Token token = scanWithListener("'\${name", listener);
|
| + listener.assertErrors(expectedErrors);
|
| + _checkTokens(token, expectedTokens);
|
| }
|
|
|
| void test_string_simple_unterminated_interpolation_identifier() {
|
| @@ -1458,8 +1506,10 @@ abstract class ScannerTestBase {
|
| */
|
| Token _assertToken(TokenType expectedType, String source,
|
| {bool lazyAssignmentOperators: false}) {
|
| - Token originalToken =
|
| - _scan(source, lazyAssignmentOperators: lazyAssignmentOperators);
|
| + // Fasta generates errors for unmatched '{', '[', etc
|
| + Token originalToken = _scan(source,
|
| + lazyAssignmentOperators: lazyAssignmentOperators,
|
| + ignoreErrors: usingFasta);
|
| expect(originalToken, isNotNull);
|
| expect(originalToken.type, expectedType);
|
| expect(originalToken.offset, 0);
|
| @@ -1471,8 +1521,9 @@ abstract class ScannerTestBase {
|
| return originalToken;
|
| } else if (expectedType == TokenType.SINGLE_LINE_COMMENT) {
|
| // Adding space to an end-of-line comment changes the comment.
|
| - Token tokenWithSpaces =
|
| - _scan(" $source", lazyAssignmentOperators: lazyAssignmentOperators);
|
| + Token tokenWithSpaces = _scan(" $source",
|
| + lazyAssignmentOperators: lazyAssignmentOperators,
|
| + ignoreErrors: usingFasta);
|
| expect(tokenWithSpaces, isNotNull);
|
| expect(tokenWithSpaces.type, expectedType);
|
| expect(tokenWithSpaces.offset, 1);
|
| @@ -1481,23 +1532,26 @@ abstract class ScannerTestBase {
|
| return originalToken;
|
| } else if (expectedType == TokenType.INT ||
|
| expectedType == TokenType.DOUBLE) {
|
| - Token tokenWithLowerD =
|
| - _scan("${source}d", lazyAssignmentOperators: lazyAssignmentOperators);
|
| + Token tokenWithLowerD = _scan("${source}d",
|
| + lazyAssignmentOperators: lazyAssignmentOperators,
|
| + ignoreErrors: usingFasta);
|
| expect(tokenWithLowerD, isNotNull);
|
| expect(tokenWithLowerD.type, expectedType);
|
| expect(tokenWithLowerD.offset, 0);
|
| expect(tokenWithLowerD.length, source.length);
|
| expect(tokenWithLowerD.lexeme, source);
|
| - Token tokenWithUpperD =
|
| - _scan("${source}D", lazyAssignmentOperators: lazyAssignmentOperators);
|
| + Token tokenWithUpperD = _scan("${source}D",
|
| + lazyAssignmentOperators: lazyAssignmentOperators,
|
| + ignoreErrors: usingFasta);
|
| expect(tokenWithUpperD, isNotNull);
|
| expect(tokenWithUpperD.type, expectedType);
|
| expect(tokenWithUpperD.offset, 0);
|
| expect(tokenWithUpperD.length, source.length);
|
| expect(tokenWithUpperD.lexeme, source);
|
| }
|
| - Token tokenWithSpaces =
|
| - _scan(" $source ", lazyAssignmentOperators: lazyAssignmentOperators);
|
| + Token tokenWithSpaces = _scan(" $source ",
|
| + lazyAssignmentOperators: lazyAssignmentOperators,
|
| + ignoreErrors: usingFasta);
|
| expect(tokenWithSpaces, isNotNull);
|
| expect(tokenWithSpaces.type, expectedType);
|
| expect(tokenWithSpaces.offset, 1);
|
| @@ -1538,12 +1592,15 @@ abstract class ScannerTestBase {
|
|
|
| Token _scan(String source,
|
| {bool genericMethodComments: false,
|
| - bool lazyAssignmentOperators: false}) {
|
| + bool lazyAssignmentOperators: false,
|
| + bool ignoreErrors: false}) {
|
| ErrorListener listener = new ErrorListener();
|
| Token token = scanWithListener(source, listener,
|
| genericMethodComments: genericMethodComments,
|
| lazyAssignmentOperators: lazyAssignmentOperators);
|
| - listener.assertNoErrors();
|
| + if (!ignoreErrors) {
|
| + listener.assertNoErrors();
|
| + }
|
| return token;
|
| }
|
| }
|
|
|