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

Side by Side Diff: pkg/analyzer/test/generated/parser_test.dart

Issue 2362873002: Add some errors related to nnbd (Closed)
Patch Set: fixed error range Created 4 years, 3 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) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 library analyzer.test.generated.parser_test; 5 library analyzer.test.generated.parser_test;
6 6
7 import 'package:analyzer/dart/ast/ast.dart'; 7 import 'package:analyzer/dart/ast/ast.dart';
8 import 'package:analyzer/dart/ast/token.dart'; 8 import 'package:analyzer/dart/ast/token.dart';
9 import 'package:analyzer/dart/ast/visitor.dart'; 9 import 'package:analyzer/dart/ast/visitor.dart';
10 import 'package:analyzer/error/error.dart'; 10 import 'package:analyzer/error/error.dart';
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, 329 EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
330 BinaryExpression, expression.condition); 330 BinaryExpression, expression.condition);
331 } 331 }
332 332
333 void test_conditionalExpression_precedence_logicalOrExpression() { 333 void test_conditionalExpression_precedence_logicalOrExpression() {
334 ConditionalExpression expression = parseExpression("a | b ? y : z"); 334 ConditionalExpression expression = parseExpression("a | b ? y : z");
335 EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, 335 EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
336 BinaryExpression, expression.condition); 336 BinaryExpression, expression.condition);
337 } 337 }
338 338
339 void test_conditionalExpression_precedence_nullableType() { 339 void test_conditionalExpression_precedence_nullableType_as() {
340 enableNnbd = true;
341 Expression expression = parseExpression('x as String ? (x + y) : z');
342 expect(expression, isNotNull);
343 expect(expression, new isInstanceOf<ConditionalExpression>());
344 ConditionalExpression conditional = expression;
345 Expression condition = conditional.condition;
346 expect(condition, new isInstanceOf<AsExpression>());
347 Expression thenExpression = conditional.thenExpression;
348 expect(thenExpression, new isInstanceOf<ParenthesizedExpression>());
349 Expression elseExpression = conditional.elseExpression;
350 expect(elseExpression, new isInstanceOf<SimpleIdentifier>());
351 }
352
353 void test_conditionalExpression_precedence_nullableType_is() {
340 enableNnbd = true; 354 enableNnbd = true;
341 Expression expression = parseExpression('x is String ? (x + y) : z'); 355 Expression expression = parseExpression('x is String ? (x + y) : z');
342 expect(expression, isNotNull); 356 expect(expression, isNotNull);
343 expect(expression, new isInstanceOf<ConditionalExpression>()); 357 expect(expression, new isInstanceOf<ConditionalExpression>());
344 ConditionalExpression conditional = expression; 358 ConditionalExpression conditional = expression;
345 Expression condition = conditional.condition; 359 Expression condition = conditional.condition;
346 expect(condition, new isInstanceOf<IsExpression>()); 360 expect(condition, new isInstanceOf<IsExpression>());
347 Expression thenExpression = conditional.thenExpression; 361 Expression thenExpression = conditional.thenExpression;
348 expect(thenExpression, new isInstanceOf<ParenthesizedExpression>()); 362 expect(thenExpression, new isInstanceOf<ParenthesizedExpression>());
349 Expression elseExpression = conditional.elseExpression; 363 Expression elseExpression = conditional.elseExpression;
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
566 expect(argumentList4.arguments, hasLength(1)); 580 expect(argumentList4.arguments, hasLength(1));
567 } 581 }
568 } 582 }
569 583
570 /** 584 /**
571 * The class `ErrorParserTest` defines parser tests that test the parsing of cod e to ensure 585 * The class `ErrorParserTest` defines parser tests that test the parsing of cod e to ensure
572 * that errors are correctly reported, and in some cases, not reported. 586 * that errors are correctly reported, and in some cases, not reported.
573 */ 587 */
574 @reflectiveTest 588 @reflectiveTest
575 class ErrorParserTest extends ParserTestCase { 589 class ErrorParserTest extends ParserTestCase {
576 void fail_expectedListOrMapLiteral() {
577 // It isn't clear that this test can ever pass. The parser is currently
578 // create a synthetic list literal in this case, but isSynthetic() isn't
579 // overridden for ListLiteral. The problem is that the synthetic list
580 // literals that are being created are not always zero length (because they
581 // could have type parameters), which violates the contract of
582 // isSynthetic().
583 createParser('1');
584 TypedLiteral literal = parser.parseListOrMapLiteral(null);
585 expectNotNullIfNoErrors(literal);
586 listener
587 .assertErrorsWithCodes([ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL]);
588 expect(literal.isSynthetic, isTrue);
589 }
590
591 void fail_illegalAssignmentToNonAssignable_superAssigned() {
592 // TODO(brianwilkerson) When this test starts to pass, remove the test
593 // test_illegalAssignmentToNonAssignable_superAssigned.
594 parseExpression(
595 "super = x;", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
596 }
597
598 void fail_invalidCommentReference__new_nonIdentifier() {
599 // This test fails because the method parseCommentReference returns null.
600 createParser('');
601 CommentReference reference = parser.parseCommentReference('new 42', 0);
602 expectNotNullIfNoErrors(reference);
603 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_COMMENT_REFERENCE]);
604 }
605
606 void fail_invalidCommentReference__new_tooMuch() {
607 createParser('');
608 CommentReference reference = parser.parseCommentReference('new a.b.c.d', 0);
609 expectNotNullIfNoErrors(reference);
610 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_COMMENT_REFERENCE]);
611 }
612
613 void fail_invalidCommentReference__nonNew_nonIdentifier() {
614 // This test fails because the method parseCommentReference returns null.
615 createParser('');
616 CommentReference reference = parser.parseCommentReference('42', 0);
617 expectNotNullIfNoErrors(reference);
618 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_COMMENT_REFERENCE]);
619 }
620
621 void fail_invalidCommentReference__nonNew_tooMuch() {
622 createParser('');
623 CommentReference reference = parser.parseCommentReference('a.b.c.d', 0);
624 expectNotNullIfNoErrors(reference);
625 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_COMMENT_REFERENCE]);
626 }
627
628 void fail_missingClosingParenthesis() {
629 // It is possible that it is not possible to generate this error (that it's
630 // being reported in code that cannot actually be reached), but that hasn't
631 // been proven yet.
632 createParser('(int a, int b ;');
633 FormalParameterList list = parser.parseFormalParameterList();
634 expectNotNullIfNoErrors(list);
635 listener
636 .assertErrorsWithCodes([ParserErrorCode.MISSING_CLOSING_PARENTHESIS]);
637 }
638
639 void fail_missingFunctionParameters_local_nonVoid_block() {
640 // The parser does not recognize this as a function declaration, so it tries
641 // to parse it as an expression statement. It isn't clear what the best
642 // error message is in this case.
643 ParserTestCase.parseStatement(
644 "int f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
645 }
646
647 void fail_missingFunctionParameters_local_nonVoid_expression() {
648 // The parser does not recognize this as a function declaration, so it tries
649 // to parse it as an expression statement. It isn't clear what the best
650 // error message is in this case.
651 ParserTestCase.parseStatement(
652 "int f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
653 }
654
655 void fail_namedFunctionExpression() {
656 createParser('f() {}');
657 Expression expression = parser.parsePrimaryExpression();
658 expectNotNullIfNoErrors(expression);
659 listener.assertErrorsWithCodes([ParserErrorCode.NAMED_FUNCTION_EXPRESSION]);
660 expect(expression, new isInstanceOf<FunctionExpression>());
661 }
662
663 void fail_unexpectedToken_invalidPostfixExpression() {
664 // Note: this might not be the right error to produce, but some error should
665 // be produced
666 parseExpression("f()++", [ParserErrorCode.UNEXPECTED_TOKEN]);
667 }
668
669 void fail_varAndType_local() {
670 // This is currently reporting EXPECTED_TOKEN for a missing semicolon, but
671 // this would be a better error message.
672 ParserTestCase.parseStatement("var int x;", [ParserErrorCode.VAR_AND_TYPE]);
673 }
674
675 void fail_varAndType_parameter() {
676 // This is currently reporting EXPECTED_TOKEN for a missing semicolon, but
677 // this would be a better error message.
678 createParser('(var int x)');
679 FormalParameterList list = parser.parseFormalParameterList();
680 expectNotNullIfNoErrors(list);
681 listener.assertErrorsWithCodes([ParserErrorCode.VAR_AND_TYPE]);
682 }
683
684 void test_abstractClassMember_constructor() { 590 void test_abstractClassMember_constructor() {
685 createParser('abstract C.c();'); 591 createParser('abstract C.c();');
686 ClassMember member = parser.parseClassMember('C'); 592 ClassMember member = parser.parseClassMember('C');
687 expectNotNullIfNoErrors(member); 593 expectNotNullIfNoErrors(member);
688 listener.assertErrorsWithCodes([ParserErrorCode.ABSTRACT_CLASS_MEMBER]); 594 listener.assertErrorsWithCodes([ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
689 } 595 }
690 596
691 void test_abstractClassMember_field() { 597 void test_abstractClassMember_field() {
692 createParser('abstract C f;'); 598 createParser('abstract C f;');
693 ClassMember member = parser.parseClassMember('C'); 599 ClassMember member = parser.parseClassMember('C');
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after
1140 // The scanner inserts an empty string token between the two $'s; we need to 1046 // The scanner inserts an empty string token between the two $'s; we need to
1141 // make sure that the MISSING_IDENTIFIER error that is generated has a 1047 // make sure that the MISSING_IDENTIFIER error that is generated has a
1142 // nonzero width so that it will show up in the editor UI. 1048 // nonzero width so that it will show up in the editor UI.
1143 createParser("'\$\$foo'"); 1049 createParser("'\$\$foo'");
1144 StringLiteral literal = parser.parseStringLiteral(); 1050 StringLiteral literal = parser.parseStringLiteral();
1145 expectNotNullIfNoErrors(literal); 1051 expectNotNullIfNoErrors(literal);
1146 listener.assertErrors( 1052 listener.assertErrors(
1147 [new AnalysisError(null, 2, 1, ParserErrorCode.MISSING_IDENTIFIER)]); 1053 [new AnalysisError(null, 2, 1, ParserErrorCode.MISSING_IDENTIFIER)]);
1148 } 1054 }
1149 1055
1056 @failingTest
1057 void test_expectedListOrMapLiteral() {
1058 // It isn't clear that this test can ever pass. The parser is currently
1059 // create a synthetic list literal in this case, but isSynthetic() isn't
1060 // overridden for ListLiteral. The problem is that the synthetic list
1061 // literals that are being created are not always zero length (because they
1062 // could have type parameters), which violates the contract of
1063 // isSynthetic().
1064 createParser('1');
1065 TypedLiteral literal = parser.parseListOrMapLiteral(null);
1066 expectNotNullIfNoErrors(literal);
1067 listener
1068 .assertErrorsWithCodes([ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL]);
1069 expect(literal.isSynthetic, isTrue);
1070 }
1071
1150 void test_expectedStringLiteral() { 1072 void test_expectedStringLiteral() {
1151 createParser('1'); 1073 createParser('1');
1152 StringLiteral literal = parser.parseStringLiteral(); 1074 StringLiteral literal = parser.parseStringLiteral();
1153 expectNotNullIfNoErrors(literal); 1075 expectNotNullIfNoErrors(literal);
1154 listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_STRING_LITERAL]); 1076 listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_STRING_LITERAL]);
1155 expect(literal.isSynthetic, isTrue); 1077 expect(literal.isSynthetic, isTrue);
1156 } 1078 }
1157 1079
1158 void test_expectedToken_commaMissingInArgumentList() { 1080 void test_expectedToken_commaMissingInArgumentList() {
1159 createParser('(x, y z)'); 1081 createParser('(x, y z)');
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
1489 "(x)++", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]); 1411 "(x)++", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
1490 } 1412 }
1491 1413
1492 void test_illegalAssignmentToNonAssignable_primarySelectorPostfix() { 1414 void test_illegalAssignmentToNonAssignable_primarySelectorPostfix() {
1493 parseExpression( 1415 parseExpression(
1494 "x(y)(z)++", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]); 1416 "x(y)(z)++", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
1495 } 1417 }
1496 1418
1497 void test_illegalAssignmentToNonAssignable_superAssigned() { 1419 void test_illegalAssignmentToNonAssignable_superAssigned() {
1498 // TODO(brianwilkerson) When the test 1420 // TODO(brianwilkerson) When the test
1499 // fail_illegalAssignmentToNonAssignable_superAssigned starts to pass, 1421 // test_illegalAssignmentToNonAssignable_superAssigned_failing starts to pas s,
1500 // remove this test (there should only be one error generated, but we're 1422 // remove this test (there should only be one error generated, but we're
1501 // keeping this test until that time so that we can catch other forms of 1423 // keeping this test until that time so that we can catch other forms of
1502 // regressions). 1424 // regressions).
1503 parseExpression("super = x;", [ 1425 parseExpression("super = x;", [
1504 ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, 1426 ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR,
1505 ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE 1427 ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE
1506 ]); 1428 ]);
1507 } 1429 }
1508 1430
1431 @failingTest
1432 void test_illegalAssignmentToNonAssignable_superAssigned_failing() {
1433 // TODO(brianwilkerson) When this test starts to pass, remove the test
1434 // test_illegalAssignmentToNonAssignable_superAssigned.
1435 parseExpression(
1436 "super = x;", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
1437 }
1438
1509 void test_implementsBeforeExtends() { 1439 void test_implementsBeforeExtends() {
1510 ParserTestCase.parseCompilationUnit("class A implements B extends C {}", 1440 ParserTestCase.parseCompilationUnit("class A implements B extends C {}",
1511 [ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS]); 1441 [ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS]);
1512 } 1442 }
1513 1443
1514 void test_implementsBeforeWith() { 1444 void test_implementsBeforeWith() {
1515 ParserTestCase.parseCompilationUnit( 1445 ParserTestCase.parseCompilationUnit(
1516 "class A extends B implements C with D {}", 1446 "class A extends B implements C with D {}",
1517 [ParserErrorCode.IMPLEMENTS_BEFORE_WITH]); 1447 [ParserErrorCode.IMPLEMENTS_BEFORE_WITH]);
1518 } 1448 }
(...skipping 18 matching lines...) Expand all
1537 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_AWAIT_IN_FOR]); 1467 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_AWAIT_IN_FOR]);
1538 } 1468 }
1539 1469
1540 void test_invalidCodePoint() { 1470 void test_invalidCodePoint() {
1541 createParser("'\\uD900'"); 1471 createParser("'\\uD900'");
1542 StringLiteral literal = parser.parseStringLiteral(); 1472 StringLiteral literal = parser.parseStringLiteral();
1543 expectNotNullIfNoErrors(literal); 1473 expectNotNullIfNoErrors(literal);
1544 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_CODE_POINT]); 1474 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_CODE_POINT]);
1545 } 1475 }
1546 1476
1477 @failingTest
1478 void test_invalidCommentReference__new_nonIdentifier() {
1479 // This test fails because the method parseCommentReference returns null.
1480 createParser('');
1481 CommentReference reference = parser.parseCommentReference('new 42', 0);
1482 expectNotNullIfNoErrors(reference);
1483 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_COMMENT_REFERENCE]);
1484 }
1485
1486 @failingTest
1487 void test_invalidCommentReference__new_tooMuch() {
1488 createParser('');
1489 CommentReference reference = parser.parseCommentReference('new a.b.c.d', 0);
1490 expectNotNullIfNoErrors(reference);
1491 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_COMMENT_REFERENCE]);
1492 }
1493
1494 @failingTest
1495 void test_invalidCommentReference__nonNew_nonIdentifier() {
1496 // This test fails because the method parseCommentReference returns null.
1497 createParser('');
1498 CommentReference reference = parser.parseCommentReference('42', 0);
1499 expectNotNullIfNoErrors(reference);
1500 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_COMMENT_REFERENCE]);
1501 }
1502
1503 @failingTest
1504 void test_invalidCommentReference__nonNew_tooMuch() {
1505 createParser('');
1506 CommentReference reference = parser.parseCommentReference('a.b.c.d', 0);
1507 expectNotNullIfNoErrors(reference);
1508 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_COMMENT_REFERENCE]);
1509 }
1510
1547 void test_invalidHexEscape_invalidDigit() { 1511 void test_invalidHexEscape_invalidDigit() {
1548 createParser("'\\x0 a'"); 1512 createParser("'\\x0 a'");
1549 StringLiteral literal = parser.parseStringLiteral(); 1513 StringLiteral literal = parser.parseStringLiteral();
1550 expectNotNullIfNoErrors(literal); 1514 expectNotNullIfNoErrors(literal);
1551 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_HEX_ESCAPE]); 1515 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_HEX_ESCAPE]);
1552 } 1516 }
1553 1517
1554 void test_invalidHexEscape_tooFewDigits() { 1518 void test_invalidHexEscape_tooFewDigits() {
1555 createParser("'\\x0'"); 1519 createParser("'\\x0'");
1556 StringLiteral literal = parser.parseStringLiteral(); 1520 StringLiteral literal = parser.parseStringLiteral();
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
1817 expectNotNullIfNoErrors(statement); 1781 expectNotNullIfNoErrors(statement);
1818 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_CATCH_OR_FINALLY]); 1782 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_CATCH_OR_FINALLY]);
1819 expect(statement, isNotNull); 1783 expect(statement, isNotNull);
1820 } 1784 }
1821 1785
1822 void test_missingClassBody() { 1786 void test_missingClassBody() {
1823 ParserTestCase.parseCompilationUnit( 1787 ParserTestCase.parseCompilationUnit(
1824 "class A class B {}", [ParserErrorCode.MISSING_CLASS_BODY]); 1788 "class A class B {}", [ParserErrorCode.MISSING_CLASS_BODY]);
1825 } 1789 }
1826 1790
1791 @failingTest
1792 void test_missingClosingParenthesis() {
1793 // It is possible that it is not possible to generate this error (that it's
1794 // being reported in code that cannot actually be reached), but that hasn't
1795 // been proven yet.
1796 createParser('(int a, int b ;');
1797 FormalParameterList list = parser.parseFormalParameterList();
1798 expectNotNullIfNoErrors(list);
1799 listener
1800 .assertErrorsWithCodes([ParserErrorCode.MISSING_CLOSING_PARENTHESIS]);
1801 }
1802
1827 void test_missingConstFinalVarOrType_static() { 1803 void test_missingConstFinalVarOrType_static() {
1828 ParserTestCase.parseCompilationUnit("class A { static f; }", 1804 ParserTestCase.parseCompilationUnit("class A { static f; }",
1829 [ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]); 1805 [ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]);
1830 } 1806 }
1831 1807
1832 void test_missingConstFinalVarOrType_topLevel() { 1808 void test_missingConstFinalVarOrType_topLevel() {
1833 createParser('a;'); 1809 createParser('a;');
1834 FinalConstVarOrType result = parser.parseFinalConstVarOrType(false); 1810 FinalConstVarOrType result = parser.parseFinalConstVarOrType(false);
1835 expectNotNullIfNoErrors(result); 1811 expectNotNullIfNoErrors(result);
1836 listener.assertErrorsWithCodes( 1812 listener.assertErrorsWithCodes(
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1870 } 1846 }
1871 1847
1872 void test_missingFunctionBody_invalid() { 1848 void test_missingFunctionBody_invalid() {
1873 createParser('return 0;'); 1849 createParser('return 0;');
1874 FunctionBody functionBody = parser.parseFunctionBody( 1850 FunctionBody functionBody = parser.parseFunctionBody(
1875 false, ParserErrorCode.MISSING_FUNCTION_BODY, false); 1851 false, ParserErrorCode.MISSING_FUNCTION_BODY, false);
1876 expectNotNullIfNoErrors(functionBody); 1852 expectNotNullIfNoErrors(functionBody);
1877 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_FUNCTION_BODY]); 1853 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_FUNCTION_BODY]);
1878 } 1854 }
1879 1855
1856 @failingTest
1857 void test_missingFunctionParameters_local_nonVoid_block() {
1858 // The parser does not recognize this as a function declaration, so it tries
1859 // to parse it as an expression statement. It isn't clear what the best
1860 // error message is in this case.
1861 ParserTestCase.parseStatement(
1862 "int f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
1863 }
1864
1865 @failingTest
1866 void test_missingFunctionParameters_local_nonVoid_expression() {
1867 // The parser does not recognize this as a function declaration, so it tries
1868 // to parse it as an expression statement. It isn't clear what the best
1869 // error message is in this case.
1870 ParserTestCase.parseStatement(
1871 "int f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
1872 }
1873
1880 void test_missingFunctionParameters_local_void_block() { 1874 void test_missingFunctionParameters_local_void_block() {
1881 ParserTestCase.parseStatement( 1875 ParserTestCase.parseStatement(
1882 "void f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]); 1876 "void f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
1883 } 1877 }
1884 1878
1885 void test_missingFunctionParameters_local_void_expression() { 1879 void test_missingFunctionParameters_local_void_expression() {
1886 ParserTestCase.parseStatement( 1880 ParserTestCase.parseStatement(
1887 "void f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]); 1881 "void f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
1888 } 1882 }
1889 1883
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
2148 expectNotNullIfNoErrors(statement); 2142 expectNotNullIfNoErrors(statement);
2149 listener.assertErrorsWithCodes( 2143 listener.assertErrorsWithCodes(
2150 [ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH]); 2144 [ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH]);
2151 } 2145 }
2152 2146
2153 void test_multipleWithClauses() { 2147 void test_multipleWithClauses() {
2154 ParserTestCase.parseCompilationUnit("class A extends B with C with D {}", 2148 ParserTestCase.parseCompilationUnit("class A extends B with C with D {}",
2155 [ParserErrorCode.MULTIPLE_WITH_CLAUSES]); 2149 [ParserErrorCode.MULTIPLE_WITH_CLAUSES]);
2156 } 2150 }
2157 2151
2152 @failingTest
2153 void test_namedFunctionExpression() {
2154 createParser('f() {}');
2155 Expression expression = parser.parsePrimaryExpression();
2156 expectNotNullIfNoErrors(expression);
2157 listener.assertErrorsWithCodes([ParserErrorCode.NAMED_FUNCTION_EXPRESSION]);
2158 expect(expression, new isInstanceOf<FunctionExpression>());
2159 }
2160
2158 void test_namedParameterOutsideGroup() { 2161 void test_namedParameterOutsideGroup() {
2159 createParser('(a, b : 0)'); 2162 createParser('(a, b : 0)');
2160 FormalParameterList list = parser.parseFormalParameterList(); 2163 FormalParameterList list = parser.parseFormalParameterList();
2161 expectNotNullIfNoErrors(list); 2164 expectNotNullIfNoErrors(list);
2162 listener 2165 listener
2163 .assertErrorsWithCodes([ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP]); 2166 .assertErrorsWithCodes([ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP]);
2164 } 2167 }
2165 2168
2166 void test_nonConstructorFactory_field() { 2169 void test_nonConstructorFactory_field() {
2167 createParser('factory int x;'); 2170 createParser('factory int x;');
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2200 } 2203 }
2201 2204
2202 void test_nonUserDefinableOperator() { 2205 void test_nonUserDefinableOperator() {
2203 createParser('operator +=(int x) => x + 1;'); 2206 createParser('operator +=(int x) => x + 1;');
2204 ClassMember member = parser.parseClassMember('C'); 2207 ClassMember member = parser.parseClassMember('C');
2205 expectNotNullIfNoErrors(member); 2208 expectNotNullIfNoErrors(member);
2206 listener 2209 listener
2207 .assertErrorsWithCodes([ParserErrorCode.NON_USER_DEFINABLE_OPERATOR]); 2210 .assertErrorsWithCodes([ParserErrorCode.NON_USER_DEFINABLE_OPERATOR]);
2208 } 2211 }
2209 2212
2213 void test_nullableTypeInExtends() {
2214 enableNnbd = true;
2215 createParser('extends B?');
2216 ExtendsClause clause = parser.parseExtendsClause();
2217 expectNotNullIfNoErrors(clause);
2218 listener.assertErrorsWithCodes([ParserErrorCode.NULLABLE_TYPE_IN_EXTENDS]);
2219 }
2220
2221 void test_nullableTypeInImplements() {
2222 enableNnbd = true;
2223 createParser('implements I?');
2224 ImplementsClause clause = parser.parseImplementsClause();
2225 expectNotNullIfNoErrors(clause);
2226 listener
2227 .assertErrorsWithCodes([ParserErrorCode.NULLABLE_TYPE_IN_IMPLEMENTS]);
2228 }
2229
2230 void test_nullableTypeInWith() {
2231 enableNnbd = true;
2232 createParser('with M?');
2233 WithClause clause = parser.parseWithClause();
2234 expectNotNullIfNoErrors(clause);
2235 listener.assertErrorsWithCodes([ParserErrorCode.NULLABLE_TYPE_IN_WITH]);
2236 }
2237
2238 void test_nullableTypeParameter() {
2239 enableNnbd = true;
2240 createParser('T?');
2241 TypeParameter parameter = parser.parseTypeParameter();
2242 expectNotNullIfNoErrors(parameter);
2243 listener.assertErrorsWithCodes([ParserErrorCode.NULLABLE_TYPE_PARAMETER]);
2244 }
2245
2210 void test_optionalAfterNormalParameters_named() { 2246 void test_optionalAfterNormalParameters_named() {
2211 ParserTestCase.parseCompilationUnit( 2247 ParserTestCase.parseCompilationUnit(
2212 "f({a}, b) {}", [ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS]); 2248 "f({a}, b) {}", [ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS]);
2213 } 2249 }
2214 2250
2215 void test_optionalAfterNormalParameters_positional() { 2251 void test_optionalAfterNormalParameters_positional() {
2216 ParserTestCase.parseCompilationUnit( 2252 ParserTestCase.parseCompilationUnit(
2217 "f([a], b) {}", [ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS]); 2253 "f([a], b) {}", [ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS]);
2218 } 2254 }
2219 2255
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
2491 expectNotNullIfNoErrors(list); 2527 expectNotNullIfNoErrors(list);
2492 listener.assertErrorsWithCodes( 2528 listener.assertErrorsWithCodes(
2493 [ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP]); 2529 [ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP]);
2494 } 2530 }
2495 2531
2496 void test_unexpectedToken_endOfFieldDeclarationStatement() { 2532 void test_unexpectedToken_endOfFieldDeclarationStatement() {
2497 ParserTestCase.parseStatement( 2533 ParserTestCase.parseStatement(
2498 "String s = (null));", [ParserErrorCode.UNEXPECTED_TOKEN]); 2534 "String s = (null));", [ParserErrorCode.UNEXPECTED_TOKEN]);
2499 } 2535 }
2500 2536
2537 @failingTest
2538 void test_unexpectedToken_invalidPostfixExpression() {
2539 // Note: this might not be the right error to produce, but some error should
2540 // be produced
2541 parseExpression("f()++", [ParserErrorCode.UNEXPECTED_TOKEN]);
2542 }
2543
2501 void test_unexpectedToken_returnInExpressionFuntionBody() { 2544 void test_unexpectedToken_returnInExpressionFuntionBody() {
2502 ParserTestCase.parseCompilationUnit( 2545 ParserTestCase.parseCompilationUnit(
2503 "f() => return null;", [ParserErrorCode.UNEXPECTED_TOKEN]); 2546 "f() => return null;", [ParserErrorCode.UNEXPECTED_TOKEN]);
2504 } 2547 }
2505 2548
2506 void test_unexpectedToken_semicolonBetweenClassMembers() { 2549 void test_unexpectedToken_semicolonBetweenClassMembers() {
2507 createParser('class C { int x; ; int y;}'); 2550 createParser('class C { int x; ; int y;}');
2508 ClassDeclaration declaration = 2551 ClassDeclaration declaration =
2509 parser.parseClassDeclaration(emptyCommentAndMetadata(), null); 2552 parser.parseClassDeclaration(emptyCommentAndMetadata(), null);
2510 expectNotNullIfNoErrors(declaration); 2553 expectNotNullIfNoErrors(declaration);
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
2598 expect(expression, new isInstanceOf<SimpleIdentifier>()); 2641 expect(expression, new isInstanceOf<SimpleIdentifier>());
2599 SimpleIdentifier identifier = expression; 2642 SimpleIdentifier identifier = expression;
2600 expect(identifier.isSynthetic, isTrue); 2643 expect(identifier.isSynthetic, isTrue);
2601 } 2644 }
2602 2645
2603 void test_varAndType_field() { 2646 void test_varAndType_field() {
2604 ParserTestCase.parseCompilationUnit( 2647 ParserTestCase.parseCompilationUnit(
2605 "class C { var int x; }", [ParserErrorCode.VAR_AND_TYPE]); 2648 "class C { var int x; }", [ParserErrorCode.VAR_AND_TYPE]);
2606 } 2649 }
2607 2650
2651 @failingTest
2652 void test_varAndType_local() {
2653 // This is currently reporting EXPECTED_TOKEN for a missing semicolon, but
2654 // this would be a better error message.
2655 ParserTestCase.parseStatement("var int x;", [ParserErrorCode.VAR_AND_TYPE]);
2656 }
2657
2658 @failingTest
2659 void test_varAndType_parameter() {
2660 // This is currently reporting EXPECTED_TOKEN for a missing semicolon, but
2661 // this would be a better error message.
2662 createParser('(var int x)');
2663 FormalParameterList list = parser.parseFormalParameterList();
2664 expectNotNullIfNoErrors(list);
2665 listener.assertErrorsWithCodes([ParserErrorCode.VAR_AND_TYPE]);
2666 }
2667
2608 void test_varAndType_topLevelVariable() { 2668 void test_varAndType_topLevelVariable() {
2609 ParserTestCase 2669 ParserTestCase
2610 .parseCompilationUnit("var int x;", [ParserErrorCode.VAR_AND_TYPE]); 2670 .parseCompilationUnit("var int x;", [ParserErrorCode.VAR_AND_TYPE]);
2611 } 2671 }
2612 2672
2613 void test_varAsTypeName_as() { 2673 void test_varAsTypeName_as() {
2614 parseExpression("x as var", [ParserErrorCode.VAR_AS_TYPE_NAME]); 2674 parseExpression("x as var", [ParserErrorCode.VAR_AS_TYPE_NAME]);
2615 } 2675 }
2616 2676
2617 void test_varClass() { 2677 void test_varClass() {
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
2845 Scanner scanner = new Scanner(source, reader, listener); 2905 Scanner scanner = new Scanner(source, reader, listener);
2846 scanner.scanGenericMethodComments = enableGenericMethodComments; 2906 scanner.scanGenericMethodComments = enableGenericMethodComments;
2847 scanner.scanLazyAssignmentOperators = enableLazyAssignmentOperators; 2907 scanner.scanLazyAssignmentOperators = enableLazyAssignmentOperators;
2848 Token tokenStream = scanner.tokenize(); 2908 Token tokenStream = scanner.tokenize();
2849 listener.setLineInfo(source, scanner.lineStarts); 2909 listener.setLineInfo(source, scanner.lineStarts);
2850 // 2910 //
2851 // Create and initialize the parser. 2911 // Create and initialize the parser.
2852 // 2912 //
2853 parser = new Parser(source, listener); 2913 parser = new Parser(source, listener);
2854 parser.enableAssertInitializer = enableAssertInitializer; 2914 parser.enableAssertInitializer = enableAssertInitializer;
2855 parser.parseAsync = parseAsync;
2856 parser.parseGenericMethods = enableGenericMethods; 2915 parser.parseGenericMethods = enableGenericMethods;
2857 parser.parseGenericMethodComments = enableGenericMethodComments; 2916 parser.parseGenericMethodComments = enableGenericMethodComments;
2858 parser.parseFunctionBodies = parseFunctionBodies; 2917 parser.parseFunctionBodies = parseFunctionBodies;
2859 parser.enableNnbd = enableNnbd; 2918 parser.enableNnbd = enableNnbd;
2860 parser.currentToken = tokenStream; 2919 parser.currentToken = tokenStream;
2861 } 2920 }
2862 2921
2863 /** 2922 /**
2864 * Return an empty CommentAndMetadata object that can be used for testing. 2923 * Return an empty CommentAndMetadata object that can be used for testing.
2865 * 2924 *
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
2982 return statements; 3041 return statements;
2983 } 3042 }
2984 } 3043 }
2985 3044
2986 /** 3045 /**
2987 * The class `RecoveryParserTest` defines parser tests that test the parsing of invalid code 3046 * The class `RecoveryParserTest` defines parser tests that test the parsing of invalid code
2988 * sequences to ensure that the correct recovery steps are taken in the parser. 3047 * sequences to ensure that the correct recovery steps are taken in the parser.
2989 */ 3048 */
2990 @reflectiveTest 3049 @reflectiveTest
2991 class RecoveryParserTest extends ParserTestCase { 3050 class RecoveryParserTest extends ParserTestCase {
2992 void fail_incomplete_returnType() {
2993 ParserTestCase.parseCompilationUnit(r'''
2994 Map<Symbol, convertStringToSymbolMap(Map<String, dynamic> map) {
2995 if (map == null) return null;
2996 Map<Symbol, dynamic> result = new Map<Symbol, dynamic>();
2997 map.forEach((name, value) {
2998 result[new Symbol(name)] = value;
2999 });
3000 return result;
3001 }''');
3002 }
3003
3004 void test_additiveExpression_missing_LHS() { 3051 void test_additiveExpression_missing_LHS() {
3005 BinaryExpression expression = 3052 BinaryExpression expression =
3006 parseExpression("+ y", [ParserErrorCode.MISSING_IDENTIFIER]); 3053 parseExpression("+ y", [ParserErrorCode.MISSING_IDENTIFIER]);
3007 EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, 3054 EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
3008 SimpleIdentifier, expression.leftOperand); 3055 SimpleIdentifier, expression.leftOperand);
3009 expect(expression.leftOperand.isSynthetic, isTrue); 3056 expect(expression.leftOperand.isSynthetic, isTrue);
3010 } 3057 }
3011 3058
3012 void test_additiveExpression_missing_LHS_RHS() { 3059 void test_additiveExpression_missing_LHS_RHS() {
3013 BinaryExpression expression = parseExpression("+", [ 3060 BinaryExpression expression = parseExpression("+", [
(...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after
3534 } 3581 }
3535 3582
3536 void test_incomplete_constructorInitializers_variable() { 3583 void test_incomplete_constructorInitializers_variable() {
3537 createParser('C() : x {}'); 3584 createParser('C() : x {}');
3538 ClassMember member = parser.parseClassMember('C'); 3585 ClassMember member = parser.parseClassMember('C');
3539 expectNotNullIfNoErrors(member); 3586 expectNotNullIfNoErrors(member);
3540 listener.assertErrorsWithCodes( 3587 listener.assertErrorsWithCodes(
3541 [ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER]); 3588 [ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER]);
3542 } 3589 }
3543 3590
3591 @failingTest
3592 void test_incomplete_returnType() {
3593 ParserTestCase.parseCompilationUnit(r'''
3594 Map<Symbol, convertStringToSymbolMap(Map<String, dynamic> map) {
3595 if (map == null) return null;
3596 Map<Symbol, dynamic> result = new Map<Symbol, dynamic>();
3597 map.forEach((name, value) {
3598 result[new Symbol(name)] = value;
3599 });
3600 return result;
3601 }''');
3602 }
3603
3544 void test_incomplete_topLevelFunction() { 3604 void test_incomplete_topLevelFunction() {
3545 ParserTestCase.parseCompilationUnit( 3605 ParserTestCase.parseCompilationUnit(
3546 "foo();", [ParserErrorCode.MISSING_FUNCTION_BODY]); 3606 "foo();", [ParserErrorCode.MISSING_FUNCTION_BODY]);
3547 } 3607 }
3548 3608
3549 void test_incomplete_topLevelVariable() { 3609 void test_incomplete_topLevelVariable() {
3550 CompilationUnit unit = ParserTestCase 3610 CompilationUnit unit = ParserTestCase
3551 .parseCompilationUnit("String", [ParserErrorCode.EXPECTED_EXECUTABLE]); 3611 .parseCompilationUnit("String", [ParserErrorCode.EXPECTED_EXECUTABLE]);
3552 NodeList<CompilationUnitMember> declarations = unit.declarations; 3612 NodeList<CompilationUnitMember> declarations = unit.declarations;
3553 expect(declarations, hasLength(1)); 3613 expect(declarations, hasLength(1));
(...skipping 631 matching lines...) Expand 10 before | Expand all | Expand 10 after
4185 4245
4186 /** 4246 /**
4187 * The class `SimpleParserTest` defines parser tests that test individual parsin g method. The 4247 * The class `SimpleParserTest` defines parser tests that test individual parsin g method. The
4188 * code fragments should be as minimal as possible in order to test the method, but should not test 4248 * code fragments should be as minimal as possible in order to test the method, but should not test
4189 * the interactions between the method under test and other methods. 4249 * the interactions between the method under test and other methods.
4190 * 4250 *
4191 * More complex tests should be defined in the class [ComplexParserTest]. 4251 * More complex tests should be defined in the class [ComplexParserTest].
4192 */ 4252 */
4193 @reflectiveTest 4253 @reflectiveTest
4194 class SimpleParserTest extends ParserTestCase { 4254 class SimpleParserTest extends ParserTestCase {
4195 void fail_parseAwaitExpression_inSync() {
4196 // This test requires better error recovery than we currently have. In
4197 // particular, we need to be able to distinguish between an await expression
4198 // in the wrong context, and the use of 'await' as an identifier.
4199 createParser('m() { return await x + await y; }');
4200 MethodDeclaration method = parser.parseClassMember('C');
4201 expectNotNullIfNoErrors(method);
4202 listener.assertNoErrors();
4203 FunctionBody body = method.body;
4204 EngineTestCase.assertInstanceOf(
4205 (obj) => obj is BlockFunctionBody, BlockFunctionBody, body);
4206 Statement statement = (body as BlockFunctionBody).block.statements[0];
4207 EngineTestCase.assertInstanceOf(
4208 (obj) => obj is ReturnStatement, ReturnStatement, statement);
4209 Expression expression = (statement as ReturnStatement).expression;
4210 EngineTestCase.assertInstanceOf(
4211 (obj) => obj is BinaryExpression, BinaryExpression, expression);
4212 EngineTestCase.assertInstanceOf((obj) => obj is AwaitExpression,
4213 AwaitExpression, (expression as BinaryExpression).leftOperand);
4214 EngineTestCase.assertInstanceOf((obj) => obj is AwaitExpression,
4215 AwaitExpression, (expression as BinaryExpression).rightOperand);
4216 }
4217
4218 void fail_parseCommentReference_this() {
4219 // This fails because we are returning null from the method and asserting
4220 // that the return value is not null.
4221 createParser('');
4222 CommentReference reference = parser.parseCommentReference('this', 5);
4223 expectNotNullIfNoErrors(reference);
4224 listener.assertNoErrors();
4225 SimpleIdentifier identifier = EngineTestCase.assertInstanceOf(
4226 (obj) => obj is SimpleIdentifier,
4227 SimpleIdentifier,
4228 reference.identifier);
4229 expect(identifier.token, isNotNull);
4230 expect(identifier.name, "a");
4231 expect(identifier.offset, 5);
4232 }
4233
4234 void fail_parseStatement_functionDeclaration_noReturnType_typeParameters() {
4235 enableGenericMethods = true;
4236 createParser('f<E>(a, b) {};');
4237 Statement statement = parser.parseStatement2();
4238 expectNotNullIfNoErrors(statement);
4239 listener.assertNoErrors();
4240 expect(statement, new isInstanceOf<FunctionDeclarationStatement>());
4241 FunctionDeclarationStatement declaration = statement;
4242 expect(declaration.functionDeclaration, isNotNull);
4243 }
4244
4245 void test_computeStringValue_emptyInterpolationPrefix() { 4255 void test_computeStringValue_emptyInterpolationPrefix() {
4246 expect(_computeStringValue("'''", true, false), ""); 4256 expect(_computeStringValue("'''", true, false), "");
4247 } 4257 }
4248 4258
4249 void test_computeStringValue_escape_b() { 4259 void test_computeStringValue_escape_b() {
4250 expect(_computeStringValue("'\\b'", true, true), "\b"); 4260 expect(_computeStringValue("'\\b'", true, true), "\b");
4251 } 4261 }
4252 4262
4253 void test_computeStringValue_escape_f() { 4263 void test_computeStringValue_escape_f() {
4254 expect(_computeStringValue("'\\f'", true, true), "\f"); 4264 expect(_computeStringValue("'\\f'", true, true), "\f");
(...skipping 854 matching lines...) Expand 10 before | Expand all | Expand 10 after
5109 FunctionBody body = method.body; 5119 FunctionBody body = method.body;
5110 EngineTestCase.assertInstanceOf( 5120 EngineTestCase.assertInstanceOf(
5111 (obj) => obj is BlockFunctionBody, BlockFunctionBody, body); 5121 (obj) => obj is BlockFunctionBody, BlockFunctionBody, body);
5112 Statement statement = (body as BlockFunctionBody).block.statements[0]; 5122 Statement statement = (body as BlockFunctionBody).block.statements[0];
5113 EngineTestCase.assertInstanceOf( 5123 EngineTestCase.assertInstanceOf(
5114 (obj) => obj is VariableDeclarationStatement, 5124 (obj) => obj is VariableDeclarationStatement,
5115 VariableDeclarationStatement, 5125 VariableDeclarationStatement,
5116 statement); 5126 statement);
5117 } 5127 }
5118 5128
5129 @failingTest
5130 void test_parseAwaitExpression_inSync() {
5131 // This test requires better error recovery than we currently have. In
5132 // particular, we need to be able to distinguish between an await expression
5133 // in the wrong context, and the use of 'await' as an identifier.
5134 createParser('m() { return await x + await y; }');
5135 MethodDeclaration method = parser.parseClassMember('C');
5136 expectNotNullIfNoErrors(method);
5137 listener.assertNoErrors();
5138 FunctionBody body = method.body;
5139 EngineTestCase.assertInstanceOf(
5140 (obj) => obj is BlockFunctionBody, BlockFunctionBody, body);
5141 Statement statement = (body as BlockFunctionBody).block.statements[0];
5142 EngineTestCase.assertInstanceOf(
5143 (obj) => obj is ReturnStatement, ReturnStatement, statement);
5144 Expression expression = (statement as ReturnStatement).expression;
5145 EngineTestCase.assertInstanceOf(
5146 (obj) => obj is BinaryExpression, BinaryExpression, expression);
5147 EngineTestCase.assertInstanceOf((obj) => obj is AwaitExpression,
5148 AwaitExpression, (expression as BinaryExpression).leftOperand);
5149 EngineTestCase.assertInstanceOf((obj) => obj is AwaitExpression,
5150 AwaitExpression, (expression as BinaryExpression).rightOperand);
5151 }
5152
5119 void test_parseBitwiseAndExpression_normal() { 5153 void test_parseBitwiseAndExpression_normal() {
5120 createParser('x & y'); 5154 createParser('x & y');
5121 Expression expression = parser.parseBitwiseAndExpression(); 5155 Expression expression = parser.parseBitwiseAndExpression();
5122 expectNotNullIfNoErrors(expression); 5156 expectNotNullIfNoErrors(expression);
5123 listener.assertNoErrors(); 5157 listener.assertNoErrors();
5124 expect(expression, new isInstanceOf<BinaryExpression>()); 5158 expect(expression, new isInstanceOf<BinaryExpression>());
5125 BinaryExpression binaryExpression = expression; 5159 BinaryExpression binaryExpression = expression;
5126 expect(binaryExpression.leftOperand, isNotNull); 5160 expect(binaryExpression.leftOperand, isNotNull);
5127 expect(binaryExpression.operator, isNotNull); 5161 expect(binaryExpression.operator, isNotNull);
5128 expect(binaryExpression.operator.type, TokenType.AMPERSAND); 5162 expect(binaryExpression.operator.type, TokenType.AMPERSAND);
(...skipping 1650 matching lines...) Expand 10 before | Expand all | Expand 10 after
6779 expect(identifier.isSynthetic, isTrue); 6813 expect(identifier.isSynthetic, isTrue);
6780 expect(identifier.token, isNotNull); 6814 expect(identifier.token, isNotNull);
6781 expect(identifier.name, ""); 6815 expect(identifier.name, "");
6782 expect(identifier.offset, 5); 6816 expect(identifier.offset, 5);
6783 // Should end with EOF token. 6817 // Should end with EOF token.
6784 Token nextToken = identifier.token.next; 6818 Token nextToken = identifier.token.next;
6785 expect(nextToken, isNotNull); 6819 expect(nextToken, isNotNull);
6786 expect(nextToken.type, TokenType.EOF); 6820 expect(nextToken.type, TokenType.EOF);
6787 } 6821 }
6788 6822
6823 @failingTest
6824 void test_parseCommentReference_this() {
6825 // This fails because we are returning null from the method and asserting
6826 // that the return value is not null.
6827 createParser('');
6828 CommentReference reference = parser.parseCommentReference('this', 5);
6829 expectNotNullIfNoErrors(reference);
6830 listener.assertNoErrors();
6831 SimpleIdentifier identifier = EngineTestCase.assertInstanceOf(
6832 (obj) => obj is SimpleIdentifier,
6833 SimpleIdentifier,
6834 reference.identifier);
6835 expect(identifier.token, isNotNull);
6836 expect(identifier.name, "a");
6837 expect(identifier.offset, 5);
6838 }
6839
6789 void test_parseCommentReferences_multiLine() { 6840 void test_parseCommentReferences_multiLine() {
6790 DocumentationCommentToken token = new DocumentationCommentToken( 6841 DocumentationCommentToken token = new DocumentationCommentToken(
6791 TokenType.MULTI_LINE_COMMENT, "/** xxx [a] yyy [bb] zzz */", 3); 6842 TokenType.MULTI_LINE_COMMENT, "/** xxx [a] yyy [bb] zzz */", 3);
6792 List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[token]; 6843 List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[token];
6793 createParser(''); 6844 createParser('');
6794 List<CommentReference> references = parser.parseCommentReferences(tokens); 6845 List<CommentReference> references = parser.parseCommentReferences(tokens);
6795 expectNotNullIfNoErrors(references); 6846 expectNotNullIfNoErrors(references);
6796 listener.assertNoErrors(); 6847 listener.assertNoErrors();
6797 List<Token> tokenReferences = token.references; 6848 List<Token> tokenReferences = token.references;
6798 expect(references, hasLength(2)); 6849 expect(references, hasLength(2));
(...skipping 3273 matching lines...) Expand 10 before | Expand all | Expand 10 after
10072 ConstructorName name = expression.constructorName; 10123 ConstructorName name = expression.constructorName;
10073 expect(name, isNotNull); 10124 expect(name, isNotNull);
10074 TypeName type = name.type; 10125 TypeName type = name.type;
10075 expect(type, isNotNull); 10126 expect(type, isNotNull);
10076 expect(type.typeArguments.arguments, hasLength(1)); 10127 expect(type.typeArguments.arguments, hasLength(1));
10077 expect(name.period, isNull); 10128 expect(name.period, isNull);
10078 expect(name.name, isNull); 10129 expect(name.name, isNull);
10079 expect(expression.argumentList, isNotNull); 10130 expect(expression.argumentList, isNotNull);
10080 } 10131 }
10081 10132
10133 void test_parseInstanceCreationExpression_type_typeParameters_nullable() {
10134 enableNnbd = true;
10135 Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
10136 createParser('A<B?>()');
10137 InstanceCreationExpression expression =
10138 parser.parseInstanceCreationExpression(token);
10139 expectNotNullIfNoErrors(expression);
10140 listener.assertNoErrors();
10141 expect(expression.keyword, token);
10142 ConstructorName name = expression.constructorName;
10143 expect(name, isNotNull);
10144 TypeName type = name.type;
10145 expect(type, isNotNull);
10146 expect(name.period, isNull);
10147 expect(name.name, isNull);
10148 expect(expression.argumentList, isNotNull);
10149 NodeList<TypeName> arguments = type.typeArguments.arguments;
10150 expect(arguments, hasLength(1));
10151 expect(arguments[0].question, isNotNull);
10152 }
10153
10082 void test_parseLibraryDirective() { 10154 void test_parseLibraryDirective() {
10083 createParser('library l;'); 10155 createParser('library l;');
10084 LibraryDirective directive = 10156 LibraryDirective directive =
10085 parser.parseLibraryDirective(emptyCommentAndMetadata()); 10157 parser.parseLibraryDirective(emptyCommentAndMetadata());
10086 expectNotNullIfNoErrors(directive); 10158 expectNotNullIfNoErrors(directive);
10087 listener.assertNoErrors(); 10159 listener.assertNoErrors();
10088 expect(directive.libraryKeyword, isNotNull); 10160 expect(directive.libraryKeyword, isNotNull);
10089 expect(directive.name, isNotNull); 10161 expect(directive.name, isNotNull);
10090 expect(directive.semicolon, isNotNull); 10162 expect(directive.semicolon, isNotNull);
10091 } 10163 }
(...skipping 1427 matching lines...) Expand 10 before | Expand all | Expand 10 after
11519 Expression expression = parser.parseRelationalExpression(); 11591 Expression expression = parser.parseRelationalExpression();
11520 expectNotNullIfNoErrors(expression); 11592 expectNotNullIfNoErrors(expression);
11521 listener.assertNoErrors(); 11593 listener.assertNoErrors();
11522 expect(expression, new isInstanceOf<AsExpression>()); 11594 expect(expression, new isInstanceOf<AsExpression>());
11523 AsExpression asExpression = expression; 11595 AsExpression asExpression = expression;
11524 expect(asExpression.expression, isNotNull); 11596 expect(asExpression.expression, isNotNull);
11525 expect(asExpression.asOperator, isNotNull); 11597 expect(asExpression.asOperator, isNotNull);
11526 expect(asExpression.type, isNotNull); 11598 expect(asExpression.type, isNotNull);
11527 } 11599 }
11528 11600
11601 void test_parseRelationalExpression_as_nullable() {
11602 enableNnbd = true;
11603 createParser('x as Y?)');
11604 Expression expression = parser.parseRelationalExpression();
11605 expectNotNullIfNoErrors(expression);
11606 listener.assertNoErrors();
11607 expect(expression, new isInstanceOf<AsExpression>());
11608 AsExpression asExpression = expression;
11609 expect(asExpression.expression, isNotNull);
11610 expect(asExpression.asOperator, isNotNull);
11611 expect(asExpression.type, isNotNull);
11612 }
11613
11529 void test_parseRelationalExpression_is() { 11614 void test_parseRelationalExpression_is() {
11530 createParser('x is y'); 11615 createParser('x is y');
11531 Expression expression = parser.parseRelationalExpression(); 11616 Expression expression = parser.parseRelationalExpression();
11532 expectNotNullIfNoErrors(expression); 11617 expectNotNullIfNoErrors(expression);
11533 listener.assertNoErrors(); 11618 listener.assertNoErrors();
11534 expect(expression, new isInstanceOf<IsExpression>()); 11619 expect(expression, new isInstanceOf<IsExpression>());
11535 IsExpression isExpression = expression; 11620 IsExpression isExpression = expression;
11536 expect(isExpression.expression, isNotNull); 11621 expect(isExpression.expression, isNotNull);
11537 expect(isExpression.isOperator, isNotNull); 11622 expect(isExpression.isOperator, isNotNull);
11538 expect(isExpression.notOperator, isNull); 11623 expect(isExpression.notOperator, isNull);
11539 expect(isExpression.type, isNotNull); 11624 expect(isExpression.type, isNotNull);
11540 } 11625 }
11541 11626
11627 void test_parseRelationalExpression_is_nullable() {
11628 enableNnbd = true;
11629 createParser('x is y?)');
11630 Expression expression = parser.parseRelationalExpression();
11631 expectNotNullIfNoErrors(expression);
11632 listener.assertNoErrors();
11633 expect(expression, new isInstanceOf<IsExpression>());
11634 IsExpression isExpression = expression;
11635 expect(isExpression.expression, isNotNull);
11636 expect(isExpression.isOperator, isNotNull);
11637 expect(isExpression.notOperator, isNull);
11638 expect(isExpression.type, isNotNull);
11639 }
11640
11542 void test_parseRelationalExpression_isNot() { 11641 void test_parseRelationalExpression_isNot() {
11543 createParser('x is! y'); 11642 createParser('x is! y');
11544 Expression expression = parser.parseRelationalExpression(); 11643 Expression expression = parser.parseRelationalExpression();
11545 expectNotNullIfNoErrors(expression); 11644 expectNotNullIfNoErrors(expression);
11546 listener.assertNoErrors(); 11645 listener.assertNoErrors();
11547 expect(expression, new isInstanceOf<IsExpression>()); 11646 expect(expression, new isInstanceOf<IsExpression>());
11548 IsExpression isExpression = expression; 11647 IsExpression isExpression = expression;
11549 expect(isExpression.expression, isNotNull); 11648 expect(isExpression.expression, isNotNull);
11550 expect(isExpression.isOperator, isNotNull); 11649 expect(isExpression.isOperator, isNotNull);
11551 expect(isExpression.notOperator, isNotNull); 11650 expect(isExpression.notOperator, isNotNull);
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
11744 Statement statement = parser.parseStatement2(); 11843 Statement statement = parser.parseStatement2();
11745 expectNotNullIfNoErrors(statement); 11844 expectNotNullIfNoErrors(statement);
11746 listener.assertNoErrors(); 11845 listener.assertNoErrors();
11747 expect(statement, new isInstanceOf<FunctionDeclarationStatement>()); 11846 expect(statement, new isInstanceOf<FunctionDeclarationStatement>());
11748 FunctionDeclarationStatement declaration = statement; 11847 FunctionDeclarationStatement declaration = statement;
11749 expect(declaration.functionDeclaration, isNotNull); 11848 expect(declaration.functionDeclaration, isNotNull);
11750 expect(declaration.functionDeclaration.functionExpression.typeParameters, 11849 expect(declaration.functionDeclaration.functionExpression.typeParameters,
11751 isNotNull); 11850 isNotNull);
11752 } 11851 }
11753 11852
11853 @failingTest
11854 void test_parseStatement_functionDeclaration_noReturnType_typeParameters() {
11855 enableGenericMethods = true;
11856 createParser('f<E>(a, b) {};');
11857 Statement statement = parser.parseStatement2();
11858 expectNotNullIfNoErrors(statement);
11859 listener.assertNoErrors();
11860 expect(statement, new isInstanceOf<FunctionDeclarationStatement>());
11861 FunctionDeclarationStatement declaration = statement;
11862 expect(declaration.functionDeclaration, isNotNull);
11863 }
11864
11754 void test_parseStatement_functionDeclaration_returnType() { 11865 void test_parseStatement_functionDeclaration_returnType() {
11755 // TODO(brianwilkerson) Implement more tests for this method. 11866 // TODO(brianwilkerson) Implement more tests for this method.
11756 createParser('int f(a, b) {};'); 11867 createParser('int f(a, b) {};');
11757 Statement statement = parser.parseStatement2(); 11868 Statement statement = parser.parseStatement2();
11758 expectNotNullIfNoErrors(statement); 11869 expectNotNullIfNoErrors(statement);
11759 listener.assertNoErrors(); 11870 listener.assertNoErrors();
11760 expect(statement, new isInstanceOf<FunctionDeclarationStatement>()); 11871 expect(statement, new isInstanceOf<FunctionDeclarationStatement>());
11761 FunctionDeclarationStatement declaration = statement; 11872 FunctionDeclarationStatement declaration = statement;
11762 expect(declaration.functionDeclaration, isNotNull); 11873 expect(declaration.functionDeclaration, isNotNull);
11763 } 11874 }
(...skipping 886 matching lines...) Expand 10 before | Expand all | Expand 10 after
12650 void test_parseTypeParameter_bounded() { 12761 void test_parseTypeParameter_bounded() {
12651 createParser('A extends B'); 12762 createParser('A extends B');
12652 TypeParameter parameter = parser.parseTypeParameter(); 12763 TypeParameter parameter = parser.parseTypeParameter();
12653 expectNotNullIfNoErrors(parameter); 12764 expectNotNullIfNoErrors(parameter);
12654 listener.assertNoErrors(); 12765 listener.assertNoErrors();
12655 expect(parameter.bound, isNotNull); 12766 expect(parameter.bound, isNotNull);
12656 expect(parameter.extendsKeyword, isNotNull); 12767 expect(parameter.extendsKeyword, isNotNull);
12657 expect(parameter.name, isNotNull); 12768 expect(parameter.name, isNotNull);
12658 } 12769 }
12659 12770
12771 void test_parseTypeParameter_bounded_nullable() {
12772 enableNnbd = true;
12773 createParser('A extends B?');
12774 TypeParameter parameter = parser.parseTypeParameter();
12775 expectNotNullIfNoErrors(parameter);
12776 listener.assertNoErrors();
12777 expect(parameter.bound, isNotNull);
12778 expect(parameter.extendsKeyword, isNotNull);
12779 expect(parameter.name, isNotNull);
12780 TypeName bound = parameter.bound;
12781 expect(bound, isNotNull);
12782 expect(bound.question, isNotNull);
12783 }
12784
12660 void test_parseTypeParameter_simple() { 12785 void test_parseTypeParameter_simple() {
12661 createParser('A'); 12786 createParser('A');
12662 TypeParameter parameter = parser.parseTypeParameter(); 12787 TypeParameter parameter = parser.parseTypeParameter();
12663 expectNotNullIfNoErrors(parameter); 12788 expectNotNullIfNoErrors(parameter);
12664 listener.assertNoErrors(); 12789 listener.assertNoErrors();
12665 expect(parameter.bound, isNull); 12790 expect(parameter.bound, isNull);
12666 expect(parameter.extendsKeyword, isNull); 12791 expect(parameter.extendsKeyword, isNull);
12667 expect(parameter.name, isNotNull); 12792 expect(parameter.name, isNotNull);
12668 } 12793 }
12669 12794
(...skipping 647 matching lines...) Expand 10 before | Expand all | Expand 10 after
13317 CompilationUnit _parseDirectives(String source, 13442 CompilationUnit _parseDirectives(String source,
13318 [List<ErrorCode> errorCodes = ErrorCode.EMPTY_LIST]) { 13443 [List<ErrorCode> errorCodes = ErrorCode.EMPTY_LIST]) {
13319 createParser(source); 13444 createParser(source);
13320 CompilationUnit unit = parser.parseDirectives2(); 13445 CompilationUnit unit = parser.parseDirectives2();
13321 expect(unit, isNotNull); 13446 expect(unit, isNotNull);
13322 expect(unit.declarations, hasLength(0)); 13447 expect(unit.declarations, hasLength(0));
13323 listener.assertErrorsWithCodes(errorCodes); 13448 listener.assertErrorsWithCodes(errorCodes);
13324 return unit; 13449 return unit;
13325 } 13450 }
13326 } 13451 }
OLDNEW
« pkg/analyzer/lib/src/generated/parser.dart ('K') | « pkg/analyzer/lib/src/generated/parser.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698