OLD | NEW |
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 import 'package:analyzer/dart/ast/ast.dart'; | 5 import 'package:analyzer/dart/ast/ast.dart'; |
6 import 'package:analyzer/dart/ast/standard_ast_factory.dart'; | 6 import 'package:analyzer/dart/ast/standard_ast_factory.dart'; |
7 import 'package:analyzer/dart/ast/token.dart'; | 7 import 'package:analyzer/dart/ast/token.dart'; |
8 import 'package:analyzer/dart/ast/visitor.dart'; | 8 import 'package:analyzer/dart/ast/visitor.dart'; |
9 import 'package:analyzer/error/error.dart'; | 9 import 'package:analyzer/error/error.dart'; |
10 import 'package:analyzer/error/listener.dart'; | 10 import 'package:analyzer/error/listener.dart'; |
(...skipping 2046 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2057 } | 2057 } |
2058 } | 2058 } |
2059 | 2059 |
2060 /** | 2060 /** |
2061 * The class `ErrorParserTest` defines parser tests that test the parsing | 2061 * The class `ErrorParserTest` defines parser tests that test the parsing |
2062 * of code to ensure that errors are correctly reported, | 2062 * of code to ensure that errors are correctly reported, |
2063 * and in some cases, not reported. | 2063 * and in some cases, not reported. |
2064 */ | 2064 */ |
2065 @reflectiveTest | 2065 @reflectiveTest |
2066 class ErrorParserTest extends ParserTestCase with ErrorParserTestMixin { | 2066 class ErrorParserTest extends ParserTestCase with ErrorParserTestMixin { |
| 2067 void test_missingIdentifier_number() { |
| 2068 createParser('1'); |
| 2069 SimpleIdentifier expression = parser.parseSimpleIdentifier(); |
| 2070 expectNotNullIfNoErrors(expression); |
| 2071 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); |
| 2072 expect(expression.isSynthetic, isTrue); |
| 2073 } |
| 2074 |
2067 void test_nullableTypeInExtends() { | 2075 void test_nullableTypeInExtends() { |
2068 enableNnbd = true; | 2076 enableNnbd = true; |
2069 createParser('extends B?'); | 2077 createParser('extends B?'); |
2070 ExtendsClause clause = parser.parseExtendsClause(); | 2078 ExtendsClause clause = parser.parseExtendsClause(); |
2071 expectNotNullIfNoErrors(clause); | 2079 expectNotNullIfNoErrors(clause); |
2072 listener.assertErrorsWithCodes([ParserErrorCode.NULLABLE_TYPE_IN_EXTENDS]); | 2080 listener.assertErrorsWithCodes([ParserErrorCode.NULLABLE_TYPE_IN_EXTENDS]); |
2073 } | 2081 } |
2074 | 2082 |
2075 void test_nullableTypeInImplements() { | 2083 void test_nullableTypeInImplements() { |
2076 enableNnbd = true; | 2084 enableNnbd = true; |
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2510 } | 2518 } |
2511 | 2519 |
2512 void test_duplicatedModifier_var() { | 2520 void test_duplicatedModifier_var() { |
2513 createParser('var var m;'); | 2521 createParser('var var m;'); |
2514 ClassMember member = parser.parseClassMember('C'); | 2522 ClassMember member = parser.parseClassMember('C'); |
2515 expectNotNullIfNoErrors(member); | 2523 expectNotNullIfNoErrors(member); |
2516 listener.assertErrorsWithCodes([ParserErrorCode.DUPLICATED_MODIFIER]); | 2524 listener.assertErrorsWithCodes([ParserErrorCode.DUPLICATED_MODIFIER]); |
2517 } | 2525 } |
2518 | 2526 |
2519 void test_duplicateLabelInSwitchStatement() { | 2527 void test_duplicateLabelInSwitchStatement() { |
2520 createParser('switch (e) {l1: case 0: break; l1: case 1: break;}'); | 2528 SwitchStatement statement = |
2521 SwitchStatement statement = parser.parseSwitchStatement(); | 2529 parseStatement('switch (e) {l1: case 0: break; l1: case 1: break;}'); |
2522 expectNotNullIfNoErrors(statement); | 2530 expectNotNullIfNoErrors(statement); |
2523 listener.assertErrorsWithCodes( | 2531 listener.assertErrorsWithCodes( |
2524 [ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT]); | 2532 [ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT]); |
2525 } | 2533 } |
2526 | 2534 |
2527 void test_emptyEnumBody() { | 2535 void test_emptyEnumBody() { |
2528 createParser('enum E {}'); | 2536 createParser('enum E {}'); |
2529 EnumDeclaration declaration = parseFullCompilationUnitMember(); | 2537 EnumDeclaration declaration = parseFullCompilationUnitMember(); |
2530 expectNotNullIfNoErrors(declaration); | 2538 expectNotNullIfNoErrors(declaration); |
2531 listener.assertErrorsWithCodes([ParserErrorCode.EMPTY_ENUM_BODY]); | 2539 listener.assertErrorsWithCodes([ParserErrorCode.EMPTY_ENUM_BODY]); |
(...skipping 18 matching lines...) Expand all Loading... |
2550 parseExpression( | 2558 parseExpression( |
2551 "1 == 2 != 3", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]); | 2559 "1 == 2 != 3", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]); |
2552 } | 2560 } |
2553 | 2561 |
2554 void test_equalityCannotBeEqualityOperand_neq_eq() { | 2562 void test_equalityCannotBeEqualityOperand_neq_eq() { |
2555 parseExpression( | 2563 parseExpression( |
2556 "1 != 2 == 3", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]); | 2564 "1 != 2 == 3", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]); |
2557 } | 2565 } |
2558 | 2566 |
2559 void test_expectedCaseOrDefault() { | 2567 void test_expectedCaseOrDefault() { |
2560 createParser('switch (e) {break;}'); | 2568 SwitchStatement statement = parseStatement('switch (e) {break;}'); |
2561 SwitchStatement statement = parser.parseSwitchStatement(); | |
2562 expectNotNullIfNoErrors(statement); | 2569 expectNotNullIfNoErrors(statement); |
2563 listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_CASE_OR_DEFAULT]); | 2570 listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_CASE_OR_DEFAULT]); |
2564 } | 2571 } |
2565 | 2572 |
2566 void test_expectedClassMember_inClass_afterType() { | 2573 void test_expectedClassMember_inClass_afterType() { |
2567 createParser('heart 2 heart'); | 2574 createParser('heart 2 heart'); |
2568 ClassMember member = parser.parseClassMember('C'); | 2575 ClassMember member = parser.parseClassMember('C'); |
2569 expectNotNullIfNoErrors(member); | 2576 expectNotNullIfNoErrors(member); |
2570 listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_CLASS_MEMBER]); | 2577 listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_CLASS_MEMBER]); |
2571 } | 2578 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2607 | 2614 |
2608 void test_expectedExecutable_topLevel_eof() { | 2615 void test_expectedExecutable_topLevel_eof() { |
2609 createParser('x'); | 2616 createParser('x'); |
2610 CompilationUnitMember member = parseFullCompilationUnitMember(); | 2617 CompilationUnitMember member = parseFullCompilationUnitMember(); |
2611 expectNotNullIfNoErrors(member); | 2618 expectNotNullIfNoErrors(member); |
2612 listener.assertErrors( | 2619 listener.assertErrors( |
2613 [new AnalysisError(null, 0, 1, ParserErrorCode.EXPECTED_EXECUTABLE)]); | 2620 [new AnalysisError(null, 0, 1, ParserErrorCode.EXPECTED_EXECUTABLE)]); |
2614 } | 2621 } |
2615 | 2622 |
2616 void test_expectedInterpolationIdentifier() { | 2623 void test_expectedInterpolationIdentifier() { |
2617 createParser("'\$x\$'"); | 2624 StringLiteral literal = parseExpression("'\$x\$'", [ |
2618 StringLiteral literal = parser.parseStringLiteral(); | |
2619 expectNotNullIfNoErrors(literal); | |
2620 listener.assertErrorsWithCodes([ | |
2621 fe.Scanner.useFasta | 2625 fe.Scanner.useFasta |
2622 ? ScannerErrorCode.MISSING_IDENTIFIER | 2626 ? ScannerErrorCode.MISSING_IDENTIFIER |
2623 : ParserErrorCode.MISSING_IDENTIFIER | 2627 : ParserErrorCode.MISSING_IDENTIFIER |
2624 ]); | 2628 ]); |
| 2629 expectNotNullIfNoErrors(literal); |
2625 } | 2630 } |
2626 | 2631 |
2627 void test_expectedInterpolationIdentifier_emptyString() { | 2632 void test_expectedInterpolationIdentifier_emptyString() { |
2628 // The scanner inserts an empty string token between the two $'s; we need to | 2633 // The scanner inserts an empty string token between the two $'s; we need to |
2629 // make sure that the MISSING_IDENTIFIER error that is generated has a | 2634 // make sure that the MISSING_IDENTIFIER error that is generated has a |
2630 // nonzero width so that it will show up in the editor UI. | 2635 // nonzero width so that it will show up in the editor UI. |
2631 createParser("'\$\$foo'"); | 2636 StringLiteral literal = parseExpression( |
2632 StringLiteral literal = parser.parseStringLiteral(); | 2637 "'\$\$foo'", |
| 2638 fe.Scanner.useFasta |
| 2639 ? [ScannerErrorCode.MISSING_IDENTIFIER] |
| 2640 : [ParserErrorCode.MISSING_IDENTIFIER]); |
2633 expectNotNullIfNoErrors(literal); | 2641 expectNotNullIfNoErrors(literal); |
2634 listener.assertErrors(fe.Scanner.useFasta | |
2635 ? [new AnalysisError(null, 2, 1, ScannerErrorCode.MISSING_IDENTIFIER)] | |
2636 : [new AnalysisError(null, 2, 1, ParserErrorCode.MISSING_IDENTIFIER)]); | |
2637 } | 2642 } |
2638 | 2643 |
2639 @failingTest | 2644 @failingTest |
2640 void test_expectedListOrMapLiteral() { | 2645 void test_expectedListOrMapLiteral() { |
2641 // It isn't clear that this test can ever pass. The parser is currently | 2646 // It isn't clear that this test can ever pass. The parser is currently |
2642 // create a synthetic list literal in this case, but isSynthetic() isn't | 2647 // create a synthetic list literal in this case, but isSynthetic() isn't |
2643 // overridden for ListLiteral. The problem is that the synthetic list | 2648 // overridden for ListLiteral. The problem is that the synthetic list |
2644 // literals that are being created are not always zero length (because they | 2649 // literals that are being created are not always zero length (because they |
2645 // could have type parameters), which violates the contract of | 2650 // could have type parameters), which violates the contract of |
2646 // isSynthetic(). | 2651 // isSynthetic(). |
2647 TypedLiteral literal = parseListOrMapLiteral(null, '1'); | 2652 TypedLiteral literal = parseListOrMapLiteral(null, '1'); |
2648 expectNotNullIfNoErrors(literal); | 2653 expectNotNullIfNoErrors(literal); |
2649 listener | 2654 listener |
2650 .assertErrorsWithCodes([ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL]); | 2655 .assertErrorsWithCodes([ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL]); |
2651 expect(literal.isSynthetic, isTrue); | 2656 expect(literal.isSynthetic, isTrue); |
2652 } | 2657 } |
2653 | 2658 |
2654 void test_expectedStringLiteral() { | 2659 void test_expectedStringLiteral() { |
2655 createParser('1'); | 2660 StringLiteral literal = parseStringLiteral('1'); |
2656 StringLiteral literal = parser.parseStringLiteral(); | |
2657 expectNotNullIfNoErrors(literal); | 2661 expectNotNullIfNoErrors(literal); |
2658 listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_STRING_LITERAL]); | 2662 listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_STRING_LITERAL]); |
2659 expect(literal.isSynthetic, isTrue); | 2663 expect(literal.isSynthetic, isTrue); |
2660 } | 2664 } |
2661 | 2665 |
2662 void test_expectedToken_commaMissingInArgumentList() { | 2666 void test_expectedToken_commaMissingInArgumentList() { |
2663 createParser('(x, y z)'); | 2667 createParser('(x, y z)'); |
2664 ArgumentList list = parser.parseArgumentList(); | 2668 ArgumentList list = parser.parseArgumentList(); |
2665 expectNotNullIfNoErrors(list); | 2669 expectNotNullIfNoErrors(list); |
2666 listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_TOKEN]); | 2670 listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_TOKEN]); |
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3096 parseCompilationUnit("class A extends B implements C with D {}", | 3100 parseCompilationUnit("class A extends B implements C with D {}", |
3097 [ParserErrorCode.IMPLEMENTS_BEFORE_WITH]); | 3101 [ParserErrorCode.IMPLEMENTS_BEFORE_WITH]); |
3098 } | 3102 } |
3099 | 3103 |
3100 void test_importDirectiveAfterPartDirective() { | 3104 void test_importDirectiveAfterPartDirective() { |
3101 parseCompilationUnit("part 'a.dart'; import 'b.dart';", | 3105 parseCompilationUnit("part 'a.dart'; import 'b.dart';", |
3102 [ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE]); | 3106 [ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE]); |
3103 } | 3107 } |
3104 | 3108 |
3105 void test_initializedVariableInForEach() { | 3109 void test_initializedVariableInForEach() { |
3106 createParser('for (int a = 0 in foo) {}'); | 3110 Statement statement = parseStatement('for (int a = 0 in foo) {}'); |
3107 Statement statement = parser.parseForStatement(); | |
3108 expectNotNullIfNoErrors(statement); | 3111 expectNotNullIfNoErrors(statement); |
3109 listener.assertErrorsWithCodes( | 3112 listener.assertErrorsWithCodes( |
3110 [ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH]); | 3113 [ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH]); |
3111 } | 3114 } |
3112 | 3115 |
3113 void test_invalidAwaitInFor() { | 3116 void test_invalidAwaitInFor() { |
3114 createParser('await for (; ;) {}'); | 3117 Statement statement = parseStatement('await for (; ;) {}'); |
3115 Statement statement = parser.parseForStatement(); | |
3116 expectNotNullIfNoErrors(statement); | 3118 expectNotNullIfNoErrors(statement); |
3117 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_AWAIT_IN_FOR]); | 3119 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_AWAIT_IN_FOR]); |
3118 } | 3120 } |
3119 | 3121 |
3120 void test_invalidCodePoint() { | 3122 void test_invalidCodePoint() { |
3121 createParser("'\\u{110000}'"); | 3123 StringLiteral literal = |
3122 StringLiteral literal = parser.parseStringLiteral(); | 3124 parseExpression("'\\u{110000}'", [ParserErrorCode.INVALID_CODE_POINT]); |
3123 expectNotNullIfNoErrors(literal); | 3125 expectNotNullIfNoErrors(literal); |
3124 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_CODE_POINT]); | |
3125 } | 3126 } |
3126 | 3127 |
3127 @failingTest | 3128 @failingTest |
3128 void test_invalidCommentReference__new_nonIdentifier() { | 3129 void test_invalidCommentReference__new_nonIdentifier() { |
3129 // This test fails because the method parseCommentReference returns null. | 3130 // This test fails because the method parseCommentReference returns null. |
3130 createParser(''); | 3131 createParser(''); |
3131 CommentReference reference = parser.parseCommentReference('new 42', 0); | 3132 CommentReference reference = parser.parseCommentReference('new 42', 0); |
3132 expectNotNullIfNoErrors(reference); | 3133 expectNotNullIfNoErrors(reference); |
3133 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_COMMENT_REFERENCE]); | 3134 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_COMMENT_REFERENCE]); |
3134 } | 3135 } |
(...skipping 24 matching lines...) Expand all Loading... |
3159 } | 3160 } |
3160 | 3161 |
3161 void test_invalidConstructorName_with() { | 3162 void test_invalidConstructorName_with() { |
3162 createParser("C.with();"); | 3163 createParser("C.with();"); |
3163 ClassMember member = parser.parseClassMember('C'); | 3164 ClassMember member = parser.parseClassMember('C'); |
3164 expectNotNullIfNoErrors(member); | 3165 expectNotNullIfNoErrors(member); |
3165 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_CONSTRUCTOR_NAME]); | 3166 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_CONSTRUCTOR_NAME]); |
3166 } | 3167 } |
3167 | 3168 |
3168 void test_invalidHexEscape_invalidDigit() { | 3169 void test_invalidHexEscape_invalidDigit() { |
3169 createParser("'\\x0 a'"); | 3170 StringLiteral literal = |
3170 StringLiteral literal = parser.parseStringLiteral(); | 3171 parseExpression("'\\x0 a'", [ParserErrorCode.INVALID_HEX_ESCAPE]); |
3171 expectNotNullIfNoErrors(literal); | 3172 expectNotNullIfNoErrors(literal); |
3172 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_HEX_ESCAPE]); | |
3173 } | 3173 } |
3174 | 3174 |
3175 void test_invalidHexEscape_tooFewDigits() { | 3175 void test_invalidHexEscape_tooFewDigits() { |
3176 createParser("'\\x0'"); | 3176 StringLiteral literal = |
3177 StringLiteral literal = parser.parseStringLiteral(); | 3177 parseExpression("'\\x0'", [ParserErrorCode.INVALID_HEX_ESCAPE]); |
3178 expectNotNullIfNoErrors(literal); | 3178 expectNotNullIfNoErrors(literal); |
3179 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_HEX_ESCAPE]); | |
3180 } | 3179 } |
3181 | 3180 |
3182 void test_invalidInterpolationIdentifier_startWithDigit() { | 3181 void test_invalidInterpolationIdentifier_startWithDigit() { |
3183 createParser("'\$1'"); | 3182 StringLiteral literal = parseExpression("'\$1'", [ |
3184 StringLiteral literal = parser.parseStringLiteral(); | |
3185 expectNotNullIfNoErrors(literal); | |
3186 listener.assertErrorsWithCodes([ | |
3187 fe.Scanner.useFasta | 3183 fe.Scanner.useFasta |
3188 ? ScannerErrorCode.MISSING_IDENTIFIER | 3184 ? ScannerErrorCode.MISSING_IDENTIFIER |
3189 : ParserErrorCode.MISSING_IDENTIFIER | 3185 : ParserErrorCode.MISSING_IDENTIFIER |
3190 ]); | 3186 ]); |
| 3187 expectNotNullIfNoErrors(literal); |
3191 } | 3188 } |
3192 | 3189 |
3193 void test_invalidLiteralInConfiguration() { | 3190 void test_invalidLiteralInConfiguration() { |
3194 createParser("if (a == 'x \$y z') 'a.dart'"); | 3191 createParser("if (a == 'x \$y z') 'a.dart'"); |
3195 Configuration configuration = parser.parseConfiguration(); | 3192 Configuration configuration = parser.parseConfiguration(); |
3196 expectNotNullIfNoErrors(configuration); | 3193 expectNotNullIfNoErrors(configuration); |
3197 listener.assertErrorsWithCodes( | 3194 listener.assertErrorsWithCodes( |
3198 [ParserErrorCode.INVALID_LITERAL_IN_CONFIGURATION]); | 3195 [ParserErrorCode.INVALID_LITERAL_IN_CONFIGURATION]); |
3199 } | 3196 } |
3200 | 3197 |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3431 | 3428 |
3432 void test_missingAssignableSelector_prefix_plusPlus_literal() { | 3429 void test_missingAssignableSelector_prefix_plusPlus_literal() { |
3433 parseExpression("++0", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]); | 3430 parseExpression("++0", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]); |
3434 } | 3431 } |
3435 | 3432 |
3436 void test_missingAssignableSelector_selector() { | 3433 void test_missingAssignableSelector_selector() { |
3437 parseExpression("x(y)(z).a++"); | 3434 parseExpression("x(y)(z).a++"); |
3438 } | 3435 } |
3439 | 3436 |
3440 void test_missingAssignableSelector_superPrimaryExpression() { | 3437 void test_missingAssignableSelector_superPrimaryExpression() { |
3441 createParser('super'); | 3438 Expression expression = |
3442 Expression expression = parser.parsePrimaryExpression(); | 3439 parseExpression('super', [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]); |
3443 expectNotNullIfNoErrors(expression); | 3440 expectNotNullIfNoErrors(expression); |
3444 listener | |
3445 .assertErrorsWithCodes([ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]); | |
3446 expect(expression, new isInstanceOf<SuperExpression>()); | 3441 expect(expression, new isInstanceOf<SuperExpression>()); |
3447 SuperExpression superExpression = expression; | 3442 SuperExpression superExpression = expression; |
3448 expect(superExpression.superKeyword, isNotNull); | 3443 expect(superExpression.superKeyword, isNotNull); |
3449 } | 3444 } |
3450 | 3445 |
3451 void test_missingAssignableSelector_superPropertyAccessAssigned() { | 3446 void test_missingAssignableSelector_superPropertyAccessAssigned() { |
3452 parseExpression("super.x = x;"); | 3447 parseExpression("super.x = x;"); |
3453 } | 3448 } |
3454 | 3449 |
3455 void test_missingCatchOrFinally() { | 3450 void test_missingCatchOrFinally() { |
3456 createParser('try {}'); | 3451 TryStatement statement = parseStatement('try {}'); |
3457 TryStatement statement = parser.parseTryStatement(); | |
3458 expectNotNullIfNoErrors(statement); | 3452 expectNotNullIfNoErrors(statement); |
3459 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_CATCH_OR_FINALLY]); | 3453 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_CATCH_OR_FINALLY]); |
3460 expect(statement, isNotNull); | 3454 expect(statement, isNotNull); |
3461 } | 3455 } |
3462 | 3456 |
3463 void test_missingClassBody() { | 3457 void test_missingClassBody() { |
3464 parseCompilationUnit( | 3458 parseCompilationUnit( |
3465 "class A class B {}", [ParserErrorCode.MISSING_CLASS_BODY]); | 3459 "class A class B {}", [ParserErrorCode.MISSING_CLASS_BODY]); |
3466 } | 3460 } |
3467 | 3461 |
(...skipping 25 matching lines...) Expand all Loading... |
3493 [ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]); | 3487 [ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]); |
3494 } | 3488 } |
3495 | 3489 |
3496 void test_missingEnumBody() { | 3490 void test_missingEnumBody() { |
3497 createParser('enum E;'); | 3491 createParser('enum E;'); |
3498 EnumDeclaration declaration = parseFullCompilationUnitMember(); | 3492 EnumDeclaration declaration = parseFullCompilationUnitMember(); |
3499 expectNotNullIfNoErrors(declaration); | 3493 expectNotNullIfNoErrors(declaration); |
3500 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_ENUM_BODY]); | 3494 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_ENUM_BODY]); |
3501 } | 3495 } |
3502 | 3496 |
3503 void test_missingExpressionInThrow_withCascade() { | 3497 void test_missingExpressionInThrow() { |
3504 createParser('throw;'); | 3498 ThrowExpression expression = |
3505 ThrowExpression expression = parser.parseThrowExpression(); | 3499 (parseStatement('throw;') as ExpressionStatement).expression; |
3506 expectNotNullIfNoErrors(expression); | 3500 expectNotNullIfNoErrors(expression); |
3507 listener | 3501 listener |
3508 .assertErrorsWithCodes([ParserErrorCode.MISSING_EXPRESSION_IN_THROW]); | 3502 .assertErrorsWithCodes([ParserErrorCode.MISSING_EXPRESSION_IN_THROW]); |
3509 } | |
3510 | |
3511 void test_missingExpressionInThrow_withoutCascade() { | |
3512 createParser('throw;'); | |
3513 ThrowExpression expression = parser.parseThrowExpressionWithoutCascade(); | |
3514 expectNotNullIfNoErrors(expression); | |
3515 listener | |
3516 .assertErrorsWithCodes([ParserErrorCode.MISSING_EXPRESSION_IN_THROW]); | |
3517 } | 3503 } |
3518 | 3504 |
3519 void test_missingFunctionBody_emptyNotAllowed() { | 3505 void test_missingFunctionBody_emptyNotAllowed() { |
3520 createParser(';'); | 3506 createParser(';'); |
3521 FunctionBody functionBody = parser.parseFunctionBody( | 3507 FunctionBody functionBody = parser.parseFunctionBody( |
3522 false, ParserErrorCode.MISSING_FUNCTION_BODY, false); | 3508 false, ParserErrorCode.MISSING_FUNCTION_BODY, false); |
3523 expectNotNullIfNoErrors(functionBody); | 3509 expectNotNullIfNoErrors(functionBody); |
3524 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_FUNCTION_BODY]); | 3510 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_FUNCTION_BODY]); |
3525 } | 3511 } |
3526 | 3512 |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3611 expectNotNullIfNoErrors(literal); | 3597 expectNotNullIfNoErrors(literal); |
3612 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); | 3598 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); |
3613 } | 3599 } |
3614 | 3600 |
3615 void test_missingIdentifier_inSymbol_first() { | 3601 void test_missingIdentifier_inSymbol_first() { |
3616 SymbolLiteral literal = parseSymbolLiteral('#'); | 3602 SymbolLiteral literal = parseSymbolLiteral('#'); |
3617 expectNotNullIfNoErrors(literal); | 3603 expectNotNullIfNoErrors(literal); |
3618 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); | 3604 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); |
3619 } | 3605 } |
3620 | 3606 |
3621 void test_missingIdentifier_number() { | |
3622 createParser('1'); | |
3623 SimpleIdentifier expression = parser.parseSimpleIdentifier(); | |
3624 expectNotNullIfNoErrors(expression); | |
3625 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); | |
3626 expect(expression.isSynthetic, isTrue); | |
3627 } | |
3628 | |
3629 void test_missingIdentifierForParameterGroup() { | 3607 void test_missingIdentifierForParameterGroup() { |
3630 createParser('(,)'); | 3608 createParser('(,)'); |
3631 FormalParameterList list = parser.parseFormalParameterList(); | 3609 FormalParameterList list = parser.parseFormalParameterList(); |
3632 expectNotNullIfNoErrors(list); | 3610 expectNotNullIfNoErrors(list); |
3633 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); | 3611 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); |
3634 } | 3612 } |
3635 | 3613 |
3636 void test_missingKeywordOperator() { | 3614 void test_missingKeywordOperator() { |
3637 createParser('+(x) {}'); | 3615 createParser('+(x) {}'); |
3638 MethodDeclaration method = parser.parseClassMember('C'); | 3616 MethodDeclaration method = parser.parseClassMember('C'); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3672 } | 3650 } |
3673 | 3651 |
3674 void test_missingMethodParameters_void_expression() { | 3652 void test_missingMethodParameters_void_expression() { |
3675 createParser('void m => null; }'); | 3653 createParser('void m => null; }'); |
3676 ClassMember member = parser.parseClassMember('C'); | 3654 ClassMember member = parser.parseClassMember('C'); |
3677 expectNotNullIfNoErrors(member); | 3655 expectNotNullIfNoErrors(member); |
3678 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_METHOD_PARAMETERS]); | 3656 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_METHOD_PARAMETERS]); |
3679 } | 3657 } |
3680 | 3658 |
3681 void test_missingNameForNamedParameter_colon() { | 3659 void test_missingNameForNamedParameter_colon() { |
3682 createParser('int : 0'); | 3660 createParser('({int : 0})'); |
3683 FormalParameter parameter = | 3661 FormalParameter parameter = |
3684 parser.parseFormalParameter(ParameterKind.NAMED, inFunctionType: true); | 3662 parser.parseFormalParameterList(inFunctionType: true).parameters[0]; |
3685 expectNotNullIfNoErrors(parameter); | 3663 expectNotNullIfNoErrors(parameter); |
3686 listener.assertErrorsWithCodes([ | 3664 listener.assertErrorsWithCodes([ |
3687 ParserErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE, | 3665 ParserErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE, |
3688 ParserErrorCode.MISSING_NAME_FOR_NAMED_PARAMETER | 3666 ParserErrorCode.MISSING_NAME_FOR_NAMED_PARAMETER |
3689 ]); | 3667 ]); |
3690 expect(parameter.identifier, isNotNull); | 3668 expect(parameter.identifier, isNotNull); |
3691 } | 3669 } |
3692 | 3670 |
3693 void test_missingNameForNamedParameter_equals() { | 3671 void test_missingNameForNamedParameter_equals() { |
3694 createParser('int = 0'); | 3672 createParser('({int = 0})'); |
3695 FormalParameter parameter = | 3673 FormalParameter parameter = |
3696 parser.parseFormalParameter(ParameterKind.NAMED, inFunctionType: true); | 3674 parser.parseFormalParameterList(inFunctionType: true).parameters[0]; |
3697 expectNotNullIfNoErrors(parameter); | 3675 expectNotNullIfNoErrors(parameter); |
3698 listener.assertErrorsWithCodes([ | 3676 listener.assertErrorsWithCodes([ |
3699 ParserErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE, | 3677 ParserErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE, |
3700 ParserErrorCode.MISSING_NAME_FOR_NAMED_PARAMETER | 3678 ParserErrorCode.MISSING_NAME_FOR_NAMED_PARAMETER |
3701 ]); | 3679 ]); |
3702 expect(parameter.identifier, isNotNull); | 3680 expect(parameter.identifier, isNotNull); |
3703 } | 3681 } |
3704 | 3682 |
3705 void test_missingNameForNamedParameter_noDefault() { | 3683 void test_missingNameForNamedParameter_noDefault() { |
3706 createParser('int'); | 3684 createParser('({int})'); |
3707 FormalParameter parameter = | 3685 FormalParameter parameter = |
3708 parser.parseFormalParameter(ParameterKind.NAMED, inFunctionType: true); | 3686 parser.parseFormalParameterList(inFunctionType: true).parameters[0]; |
3709 expectNotNullIfNoErrors(parameter); | 3687 expectNotNullIfNoErrors(parameter); |
3710 listener.assertErrorsWithCodes( | 3688 listener.assertErrorsWithCodes( |
3711 [ParserErrorCode.MISSING_NAME_FOR_NAMED_PARAMETER]); | 3689 [ParserErrorCode.MISSING_NAME_FOR_NAMED_PARAMETER]); |
3712 expect(parameter.identifier, isNotNull); | 3690 expect(parameter.identifier, isNotNull); |
3713 } | 3691 } |
3714 | 3692 |
3715 void test_missingNameInLibraryDirective() { | 3693 void test_missingNameInLibraryDirective() { |
3716 CompilationUnit unit = parseCompilationUnit( | 3694 CompilationUnit unit = parseCompilationUnit( |
3717 "library;", [ParserErrorCode.MISSING_NAME_IN_LIBRARY_DIRECTIVE]); | 3695 "library;", [ParserErrorCode.MISSING_NAME_IN_LIBRARY_DIRECTIVE]); |
3718 expect(unit, isNotNull); | 3696 expect(unit, isNotNull); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3777 parseCompilationUnit( | 3755 parseCompilationUnit( |
3778 "typedef F<E>;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]); | 3756 "typedef F<E>;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]); |
3779 } | 3757 } |
3780 | 3758 |
3781 void test_missingTypedefParameters_void() { | 3759 void test_missingTypedefParameters_void() { |
3782 parseCompilationUnit( | 3760 parseCompilationUnit( |
3783 "typedef void F;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]); | 3761 "typedef void F;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]); |
3784 } | 3762 } |
3785 | 3763 |
3786 void test_missingVariableInForEach() { | 3764 void test_missingVariableInForEach() { |
3787 createParser('for (a < b in foo) {}'); | 3765 Statement statement = parseStatement('for (a < b in foo) {}'); |
3788 Statement statement = parser.parseForStatement(); | |
3789 expectNotNullIfNoErrors(statement); | 3766 expectNotNullIfNoErrors(statement); |
3790 listener | 3767 listener |
3791 .assertErrorsWithCodes([ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH]); | 3768 .assertErrorsWithCodes([ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH]); |
3792 } | 3769 } |
3793 | 3770 |
3794 void test_mixedParameterGroups_namedPositional() { | 3771 void test_mixedParameterGroups_namedPositional() { |
3795 createParser('(a, {b}, [c])'); | 3772 createParser('(a, {b}, [c])'); |
3796 FormalParameterList list = parser.parseFormalParameterList(); | 3773 FormalParameterList list = parser.parseFormalParameterList(); |
3797 expectNotNullIfNoErrors(list); | 3774 expectNotNullIfNoErrors(list); |
3798 listener.assertErrorsWithCodes([ParserErrorCode.MIXED_PARAMETER_GROUPS]); | 3775 listener.assertErrorsWithCodes([ParserErrorCode.MIXED_PARAMETER_GROUPS]); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3839 | 3816 |
3840 void test_multiplePositionalParameterGroups() { | 3817 void test_multiplePositionalParameterGroups() { |
3841 createParser('(a, [b], [c])'); | 3818 createParser('(a, [b], [c])'); |
3842 FormalParameterList list = parser.parseFormalParameterList(); | 3819 FormalParameterList list = parser.parseFormalParameterList(); |
3843 expectNotNullIfNoErrors(list); | 3820 expectNotNullIfNoErrors(list); |
3844 listener.assertErrorsWithCodes( | 3821 listener.assertErrorsWithCodes( |
3845 [ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS]); | 3822 [ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS]); |
3846 } | 3823 } |
3847 | 3824 |
3848 void test_multipleVariablesInForEach() { | 3825 void test_multipleVariablesInForEach() { |
3849 createParser('for (int a, b in foo) {}'); | 3826 Statement statement = parseStatement('for (int a, b in foo) {}'); |
3850 Statement statement = parser.parseForStatement(); | |
3851 expectNotNullIfNoErrors(statement); | 3827 expectNotNullIfNoErrors(statement); |
3852 listener.assertErrorsWithCodes( | 3828 listener.assertErrorsWithCodes( |
3853 [ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH]); | 3829 [ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH]); |
3854 } | 3830 } |
3855 | 3831 |
3856 void test_multipleWithClauses() { | 3832 void test_multipleWithClauses() { |
3857 parseCompilationUnit("class A extends B with C with D {}", | 3833 parseCompilationUnit("class A extends B with C with D {}", |
3858 [ParserErrorCode.MULTIPLE_WITH_CLAUSES]); | 3834 [ParserErrorCode.MULTIPLE_WITH_CLAUSES]); |
3859 } | 3835 } |
3860 | 3836 |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4114 ParserErrorCode.EXPECTED_TOKEN, | 4090 ParserErrorCode.EXPECTED_TOKEN, |
4115 ParserErrorCode.EXPECTED_TOKEN, | 4091 ParserErrorCode.EXPECTED_TOKEN, |
4116 ParserErrorCode.EXPECTED_TOKEN, | 4092 ParserErrorCode.EXPECTED_TOKEN, |
4117 ParserErrorCode.EXPECTED_TOKEN, | 4093 ParserErrorCode.EXPECTED_TOKEN, |
4118 ParserErrorCode.EXPECTED_TOKEN, | 4094 ParserErrorCode.EXPECTED_TOKEN, |
4119 ParserErrorCode.EXPECTED_TOKEN, | 4095 ParserErrorCode.EXPECTED_TOKEN, |
4120 ]); | 4096 ]); |
4121 } | 4097 } |
4122 | 4098 |
4123 void test_switchHasCaseAfterDefaultCase() { | 4099 void test_switchHasCaseAfterDefaultCase() { |
4124 createParser('switch (a) {default: return 0; case 1: return 1;}'); | 4100 SwitchStatement statement = |
4125 SwitchStatement statement = parser.parseSwitchStatement(); | 4101 parseStatement('switch (a) {default: return 0; case 1: return 1;}'); |
4126 expectNotNullIfNoErrors(statement); | 4102 expectNotNullIfNoErrors(statement); |
4127 listener.assertErrorsWithCodes( | 4103 listener.assertErrorsWithCodes( |
4128 [ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE]); | 4104 [ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE]); |
4129 } | 4105 } |
4130 | 4106 |
4131 void test_switchHasCaseAfterDefaultCase_repeated() { | 4107 void test_switchHasCaseAfterDefaultCase_repeated() { |
4132 createParser( | 4108 SwitchStatement statement = parseStatement( |
4133 'switch (a) {default: return 0; case 1: return 1; case 2: return 2;}'); | 4109 'switch (a) {default: return 0; case 1: return 1; case 2: return 2;}'); |
4134 SwitchStatement statement = parser.parseSwitchStatement(); | |
4135 expectNotNullIfNoErrors(statement); | 4110 expectNotNullIfNoErrors(statement); |
4136 listener.assertErrorsWithCodes([ | 4111 listener.assertErrorsWithCodes([ |
4137 ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE, | 4112 ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE, |
4138 ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE | 4113 ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE |
4139 ]); | 4114 ]); |
4140 } | 4115 } |
4141 | 4116 |
4142 void test_switchHasMultipleDefaultCases() { | 4117 void test_switchHasMultipleDefaultCases() { |
4143 createParser('switch (a) {default: return 0; default: return 1;}'); | 4118 SwitchStatement statement = |
4144 SwitchStatement statement = parser.parseSwitchStatement(); | 4119 parseStatement('switch (a) {default: return 0; default: return 1;}'); |
4145 expectNotNullIfNoErrors(statement); | 4120 expectNotNullIfNoErrors(statement); |
4146 listener.assertErrorsWithCodes( | 4121 listener.assertErrorsWithCodes( |
4147 [ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES]); | 4122 [ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES]); |
4148 } | 4123 } |
4149 | 4124 |
4150 void test_switchHasMultipleDefaultCases_repeated() { | 4125 void test_switchHasMultipleDefaultCases_repeated() { |
4151 createParser( | 4126 SwitchStatement statement = parseStatement( |
4152 'switch (a) {default: return 0; default: return 1; default: return 2;}')
; | 4127 'switch (a) {default: return 0; default: return 1; default: return 2;}')
; |
4153 SwitchStatement statement = parser.parseSwitchStatement(); | |
4154 expectNotNullIfNoErrors(statement); | 4128 expectNotNullIfNoErrors(statement); |
4155 listener.assertErrorsWithCodes([ | 4129 listener.assertErrorsWithCodes([ |
4156 ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES, | 4130 ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES, |
4157 ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES | 4131 ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES |
4158 ]); | 4132 ]); |
4159 } | 4133 } |
4160 | 4134 |
4161 void test_topLevel_getter() { | 4135 void test_topLevel_getter() { |
4162 createParser('get x => 7;'); | 4136 createParser('get x => 7;'); |
4163 CompilationUnitMember member = parseFullCompilationUnitMember(); | 4137 CompilationUnitMember member = parseFullCompilationUnitMember(); |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4404 ClassMember member = parser.parseClassMember('C'); | 4378 ClassMember member = parser.parseClassMember('C'); |
4405 expectNotNullIfNoErrors(member); | 4379 expectNotNullIfNoErrors(member); |
4406 listener.assertErrorsWithCodes([ParserErrorCode.VAR_RETURN_TYPE]); | 4380 listener.assertErrorsWithCodes([ParserErrorCode.VAR_RETURN_TYPE]); |
4407 } | 4381 } |
4408 | 4382 |
4409 void test_varTypedef() { | 4383 void test_varTypedef() { |
4410 parseCompilationUnit("var typedef F();", [ParserErrorCode.VAR_TYPEDEF]); | 4384 parseCompilationUnit("var typedef F();", [ParserErrorCode.VAR_TYPEDEF]); |
4411 } | 4385 } |
4412 | 4386 |
4413 void test_voidParameter() { | 4387 void test_voidParameter() { |
4414 createParser('void a)'); | 4388 NormalFormalParameter parameter = |
4415 NormalFormalParameter parameter = parser.parseNormalFormalParameter(); | 4389 parseFormalParameterList('(void a)').parameters[0]; |
4416 expectNotNullIfNoErrors(parameter); | 4390 expectNotNullIfNoErrors(parameter); |
4417 listener.assertNoErrors(); | 4391 listener.assertNoErrors(); |
4418 } | 4392 } |
4419 | 4393 |
4420 void test_voidVariable_parseClassMember_initializer() { | 4394 void test_voidVariable_parseClassMember_initializer() { |
4421 createParser('void x = 0;'); | 4395 createParser('void x = 0;'); |
4422 ClassMember member = parser.parseClassMember('C'); | 4396 ClassMember member = parser.parseClassMember('C'); |
4423 expectNotNullIfNoErrors(member); | 4397 expectNotNullIfNoErrors(member); |
4424 listener.assertNoErrors(); | 4398 listener.assertNoErrors(); |
4425 } | 4399 } |
(...skipping 10992 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15418 expectCommentText(typeVariable.documentationComment, '/// Doc'); | 15392 expectCommentText(typeVariable.documentationComment, '/// Doc'); |
15419 } | 15393 } |
15420 | 15394 |
15421 /** | 15395 /** |
15422 * Assert that the given [name] is in declaration context. | 15396 * Assert that the given [name] is in declaration context. |
15423 */ | 15397 */ |
15424 void _assertIsDeclarationName(SimpleIdentifier name) { | 15398 void _assertIsDeclarationName(SimpleIdentifier name) { |
15425 expect(name.inDeclarationContext(), isTrue); | 15399 expect(name.inDeclarationContext(), isTrue); |
15426 } | 15400 } |
15427 } | 15401 } |
OLD | NEW |