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'; |
11 import 'package:analyzer/src/dart/ast/token.dart'; | 11 import 'package:analyzer/src/dart/ast/token.dart'; |
12 import 'package:analyzer/src/dart/scanner/reader.dart'; | 12 import 'package:analyzer/src/dart/scanner/reader.dart'; |
13 import 'package:analyzer/src/dart/scanner/scanner.dart'; | 13 import 'package:analyzer/src/dart/scanner/scanner.dart'; |
14 import 'package:analyzer/src/generated/parser.dart'; | 14 import 'package:analyzer/src/generated/parser.dart'; |
15 import 'package:analyzer/src/generated/source.dart'; | 15 import 'package:analyzer/src/generated/source.dart'; |
16 import 'package:analyzer/src/generated/testing/token_factory.dart'; | 16 import 'package:analyzer/src/generated/testing/token_factory.dart'; |
17 import 'package:analyzer/src/generated/utilities_dart.dart'; | 17 import 'package:analyzer/src/generated/utilities_dart.dart'; |
| 18 import 'package:front_end/src/scanner/scanner.dart' as fe; |
18 import 'package:test/test.dart'; | 19 import 'package:test/test.dart'; |
19 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 20 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
20 | 21 |
21 import 'test_support.dart'; | 22 import 'test_support.dart'; |
22 | 23 |
23 main() { | 24 main() { |
24 defineReflectiveSuite(() { | 25 defineReflectiveSuite(() { |
25 defineReflectiveTests(ClassMemberParserTest); | 26 defineReflectiveTests(ClassMemberParserTest); |
26 defineReflectiveTests(ComplexParserTest); | 27 defineReflectiveTests(ComplexParserTest); |
27 defineReflectiveTests(ErrorParserTest); | 28 defineReflectiveTests(ErrorParserTest); |
(...skipping 2487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2515 CompilationUnitMember member = parseFullCompilationUnitMember(); | 2516 CompilationUnitMember member = parseFullCompilationUnitMember(); |
2516 expectNotNullIfNoErrors(member); | 2517 expectNotNullIfNoErrors(member); |
2517 listener.assertErrors( | 2518 listener.assertErrors( |
2518 [new AnalysisError(null, 0, 1, ParserErrorCode.EXPECTED_EXECUTABLE)]); | 2519 [new AnalysisError(null, 0, 1, ParserErrorCode.EXPECTED_EXECUTABLE)]); |
2519 } | 2520 } |
2520 | 2521 |
2521 void test_expectedInterpolationIdentifier() { | 2522 void test_expectedInterpolationIdentifier() { |
2522 createParser("'\$x\$'"); | 2523 createParser("'\$x\$'"); |
2523 StringLiteral literal = parser.parseStringLiteral(); | 2524 StringLiteral literal = parser.parseStringLiteral(); |
2524 expectNotNullIfNoErrors(literal); | 2525 expectNotNullIfNoErrors(literal); |
2525 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); | 2526 listener.assertErrorsWithCodes([ |
| 2527 fe.Scanner.useFasta |
| 2528 ? ScannerErrorCode.MISSING_IDENTIFIER |
| 2529 : ParserErrorCode.MISSING_IDENTIFIER |
| 2530 ]); |
2526 } | 2531 } |
2527 | 2532 |
2528 void test_expectedInterpolationIdentifier_emptyString() { | 2533 void test_expectedInterpolationIdentifier_emptyString() { |
2529 // The scanner inserts an empty string token between the two $'s; we need to | 2534 // The scanner inserts an empty string token between the two $'s; we need to |
2530 // make sure that the MISSING_IDENTIFIER error that is generated has a | 2535 // make sure that the MISSING_IDENTIFIER error that is generated has a |
2531 // nonzero width so that it will show up in the editor UI. | 2536 // nonzero width so that it will show up in the editor UI. |
2532 createParser("'\$\$foo'"); | 2537 createParser("'\$\$foo'"); |
2533 StringLiteral literal = parser.parseStringLiteral(); | 2538 StringLiteral literal = parser.parseStringLiteral(); |
2534 expectNotNullIfNoErrors(literal); | 2539 expectNotNullIfNoErrors(literal); |
2535 listener.assertErrors( | 2540 listener.assertErrors(fe.Scanner.useFasta |
2536 [new AnalysisError(null, 2, 1, ParserErrorCode.MISSING_IDENTIFIER)]); | 2541 ? [new AnalysisError(null, 2, 1, ScannerErrorCode.MISSING_IDENTIFIER)] |
| 2542 : [new AnalysisError(null, 2, 1, ParserErrorCode.MISSING_IDENTIFIER)]); |
2537 } | 2543 } |
2538 | 2544 |
2539 @failingTest | 2545 @failingTest |
2540 void test_expectedListOrMapLiteral() { | 2546 void test_expectedListOrMapLiteral() { |
2541 // It isn't clear that this test can ever pass. The parser is currently | 2547 // It isn't clear that this test can ever pass. The parser is currently |
2542 // create a synthetic list literal in this case, but isSynthetic() isn't | 2548 // create a synthetic list literal in this case, but isSynthetic() isn't |
2543 // overridden for ListLiteral. The problem is that the synthetic list | 2549 // overridden for ListLiteral. The problem is that the synthetic list |
2544 // literals that are being created are not always zero length (because they | 2550 // literals that are being created are not always zero length (because they |
2545 // could have type parameters), which violates the contract of | 2551 // could have type parameters), which violates the contract of |
2546 // isSynthetic(). | 2552 // isSynthetic(). |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2854 "void f(const x()) {}", [ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR]); | 2860 "void f(const x()) {}", [ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR]); |
2855 } | 2861 } |
2856 | 2862 |
2857 void test_functionTypedParameter_final() { | 2863 void test_functionTypedParameter_final() { |
2858 parseCompilationUnit( | 2864 parseCompilationUnit( |
2859 "void f(final x()) {}", [ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR]); | 2865 "void f(final x()) {}", [ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR]); |
2860 } | 2866 } |
2861 | 2867 |
2862 void test_functionTypedParameter_incomplete1() { | 2868 void test_functionTypedParameter_incomplete1() { |
2863 // This caused an exception at one point. | 2869 // This caused an exception at one point. |
2864 parseCompilationUnit("void f(int Function(", [ | 2870 parseCompilationUnit( |
2865 ParserErrorCode.MISSING_FUNCTION_BODY, | 2871 "void f(int Function(", |
2866 ParserErrorCode.MISSING_CLOSING_PARENTHESIS, | 2872 fe.Scanner.useFasta |
2867 ParserErrorCode.EXPECTED_EXECUTABLE, | 2873 ? [ |
2868 ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, | 2874 ScannerErrorCode.EXPECTED_TOKEN, |
2869 ParserErrorCode.EXPECTED_TOKEN, | 2875 ScannerErrorCode.EXPECTED_TOKEN, |
2870 ParserErrorCode.EXPECTED_TOKEN | 2876 ParserErrorCode.MISSING_FUNCTION_BODY, |
2871 ]); | 2877 ParserErrorCode.MISSING_IDENTIFIER, |
| 2878 ] |
| 2879 : [ |
| 2880 ParserErrorCode.MISSING_FUNCTION_BODY, |
| 2881 ParserErrorCode.MISSING_CLOSING_PARENTHESIS, |
| 2882 ParserErrorCode.EXPECTED_EXECUTABLE, |
| 2883 ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, |
| 2884 ParserErrorCode.EXPECTED_TOKEN, |
| 2885 ParserErrorCode.EXPECTED_TOKEN |
| 2886 ]); |
2872 } | 2887 } |
2873 | 2888 |
2874 void test_functionTypedParameter_var() { | 2889 void test_functionTypedParameter_var() { |
2875 parseCompilationUnit( | 2890 parseCompilationUnit( |
2876 "void f(var x()) {}", [ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR]); | 2891 "void f(var x()) {}", [ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR]); |
2877 } | 2892 } |
2878 | 2893 |
2879 void test_getterInFunction_block_noReturnType() { | 2894 void test_getterInFunction_block_noReturnType() { |
2880 FunctionDeclarationStatement statement = | 2895 FunctionDeclarationStatement statement = |
2881 parseStatement("get x { return _x; }"); | 2896 parseStatement("get x { return _x; }"); |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3034 createParser("'\\x0'"); | 3049 createParser("'\\x0'"); |
3035 StringLiteral literal = parser.parseStringLiteral(); | 3050 StringLiteral literal = parser.parseStringLiteral(); |
3036 expectNotNullIfNoErrors(literal); | 3051 expectNotNullIfNoErrors(literal); |
3037 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_HEX_ESCAPE]); | 3052 listener.assertErrorsWithCodes([ParserErrorCode.INVALID_HEX_ESCAPE]); |
3038 } | 3053 } |
3039 | 3054 |
3040 void test_invalidInterpolationIdentifier_startWithDigit() { | 3055 void test_invalidInterpolationIdentifier_startWithDigit() { |
3041 createParser("'\$1'"); | 3056 createParser("'\$1'"); |
3042 StringLiteral literal = parser.parseStringLiteral(); | 3057 StringLiteral literal = parser.parseStringLiteral(); |
3043 expectNotNullIfNoErrors(literal); | 3058 expectNotNullIfNoErrors(literal); |
3044 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); | 3059 listener.assertErrorsWithCodes([ |
| 3060 fe.Scanner.useFasta |
| 3061 ? ScannerErrorCode.MISSING_IDENTIFIER |
| 3062 : ParserErrorCode.MISSING_IDENTIFIER |
| 3063 ]); |
3045 } | 3064 } |
3046 | 3065 |
3047 void test_invalidLiteralInConfiguration() { | 3066 void test_invalidLiteralInConfiguration() { |
3048 createParser("if (a == 'x \$y z') 'a.dart'"); | 3067 createParser("if (a == 'x \$y z') 'a.dart'"); |
3049 Configuration configuration = parser.parseConfiguration(); | 3068 Configuration configuration = parser.parseConfiguration(); |
3050 expectNotNullIfNoErrors(configuration); | 3069 expectNotNullIfNoErrors(configuration); |
3051 listener.assertErrorsWithCodes( | 3070 listener.assertErrorsWithCodes( |
3052 [ParserErrorCode.INVALID_LITERAL_IN_CONFIGURATION]); | 3071 [ParserErrorCode.INVALID_LITERAL_IN_CONFIGURATION]); |
3053 } | 3072 } |
3054 | 3073 |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3297 } | 3316 } |
3298 | 3317 |
3299 @failingTest | 3318 @failingTest |
3300 void test_missingClosingParenthesis() { | 3319 void test_missingClosingParenthesis() { |
3301 // It is possible that it is not possible to generate this error (that it's | 3320 // It is possible that it is not possible to generate this error (that it's |
3302 // being reported in code that cannot actually be reached), but that hasn't | 3321 // being reported in code that cannot actually be reached), but that hasn't |
3303 // been proven yet. | 3322 // been proven yet. |
3304 createParser('(int a, int b ;'); | 3323 createParser('(int a, int b ;'); |
3305 FormalParameterList list = parser.parseFormalParameterList(); | 3324 FormalParameterList list = parser.parseFormalParameterList(); |
3306 expectNotNullIfNoErrors(list); | 3325 expectNotNullIfNoErrors(list); |
3307 listener | 3326 listener.assertErrorsWithCodes([ |
3308 .assertErrorsWithCodes([ParserErrorCode.MISSING_CLOSING_PARENTHESIS]); | 3327 fe.Scanner.useFasta |
| 3328 ? ScannerErrorCode.EXPECTED_TOKEN |
| 3329 : ParserErrorCode.MISSING_CLOSING_PARENTHESIS |
| 3330 ]); |
3309 } | 3331 } |
3310 | 3332 |
3311 void test_missingConstFinalVarOrType_static() { | 3333 void test_missingConstFinalVarOrType_static() { |
3312 parseCompilationUnit("class A { static f; }", | 3334 parseCompilationUnit("class A { static f; }", |
3313 [ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]); | 3335 [ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]); |
3314 } | 3336 } |
3315 | 3337 |
3316 void test_missingConstFinalVarOrType_topLevel() { | 3338 void test_missingConstFinalVarOrType_topLevel() { |
3317 createParser('a;'); | 3339 createParser('a;'); |
3318 FinalConstVarOrType result = parser.parseFinalConstVarOrType(false); | 3340 FinalConstVarOrType result = parser.parseFinalConstVarOrType(false); |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3571 | 3593 |
3572 void test_missingStatement_afterVoid() { | 3594 void test_missingStatement_afterVoid() { |
3573 parseStatement("void;"); | 3595 parseStatement("void;"); |
3574 assertErrorsWithCodes([ParserErrorCode.MISSING_STATEMENT]); | 3596 assertErrorsWithCodes([ParserErrorCode.MISSING_STATEMENT]); |
3575 } | 3597 } |
3576 | 3598 |
3577 void test_missingTerminatorForParameterGroup_named() { | 3599 void test_missingTerminatorForParameterGroup_named() { |
3578 createParser('(a, {b: 0)'); | 3600 createParser('(a, {b: 0)'); |
3579 FormalParameterList list = parser.parseFormalParameterList(); | 3601 FormalParameterList list = parser.parseFormalParameterList(); |
3580 expectNotNullIfNoErrors(list); | 3602 expectNotNullIfNoErrors(list); |
3581 listener.assertErrorsWithCodes( | 3603 listener.assertErrorsWithCodes([ |
3582 [ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP]); | 3604 fe.Scanner.useFasta |
| 3605 ? ScannerErrorCode.EXPECTED_TOKEN |
| 3606 : ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP |
| 3607 ]); |
3583 } | 3608 } |
3584 | 3609 |
3585 void test_missingTerminatorForParameterGroup_optional() { | 3610 void test_missingTerminatorForParameterGroup_optional() { |
3586 createParser('(a, [b = 0)'); | 3611 createParser('(a, [b = 0)'); |
3587 FormalParameterList list = parser.parseFormalParameterList(); | 3612 FormalParameterList list = parser.parseFormalParameterList(); |
3588 expectNotNullIfNoErrors(list); | 3613 expectNotNullIfNoErrors(list); |
3589 listener.assertErrorsWithCodes( | 3614 listener.assertErrorsWithCodes([ |
3590 [ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP]); | 3615 fe.Scanner.useFasta |
| 3616 ? ScannerErrorCode.EXPECTED_TOKEN |
| 3617 : ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP |
| 3618 ]); |
3591 } | 3619 } |
3592 | 3620 |
3593 void test_missingTypedefParameters_nonVoid() { | 3621 void test_missingTypedefParameters_nonVoid() { |
3594 parseCompilationUnit( | 3622 parseCompilationUnit( |
3595 "typedef int F;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]); | 3623 "typedef int F;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]); |
3596 } | 3624 } |
3597 | 3625 |
3598 void test_missingTypedefParameters_typeParameters() { | 3626 void test_missingTypedefParameters_typeParameters() { |
3599 parseCompilationUnit( | 3627 parseCompilationUnit( |
3600 "typedef F<E>;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]); | 3628 "typedef F<E>;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]); |
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3944 "static var x;", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]); | 3972 "static var x;", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]); |
3945 } | 3973 } |
3946 | 3974 |
3947 void test_string_unterminated_interpolation_block() { | 3975 void test_string_unterminated_interpolation_block() { |
3948 parseCompilationUnit( | 3976 parseCompilationUnit( |
3949 r''' | 3977 r''' |
3950 m() { | 3978 m() { |
3951 { | 3979 { |
3952 '${${ | 3980 '${${ |
3953 ''', | 3981 ''', |
3954 [ | 3982 fe.Scanner.useFasta |
3955 ScannerErrorCode.UNTERMINATED_STRING_LITERAL, | 3983 ? [ |
3956 ParserErrorCode.EXPECTED_TOKEN, | 3984 ScannerErrorCode.UNTERMINATED_STRING_LITERAL, |
3957 ParserErrorCode.EXPECTED_TOKEN, | 3985 ScannerErrorCode.EXPECTED_TOKEN, |
3958 ParserErrorCode.EXPECTED_TOKEN, | 3986 ScannerErrorCode.EXPECTED_TOKEN, |
3959 ParserErrorCode.EXPECTED_TOKEN, | 3987 ScannerErrorCode.EXPECTED_TOKEN, |
3960 ParserErrorCode.EXPECTED_TOKEN, | 3988 ScannerErrorCode.EXPECTED_TOKEN, |
3961 ParserErrorCode.EXPECTED_TOKEN, | 3989 ParserErrorCode.EXPECTED_TOKEN, |
3962 ]); | 3990 ParserErrorCode.EXPECTED_TOKEN, |
| 3991 ParserErrorCode.EXPECTED_TOKEN, |
| 3992 ParserErrorCode.UNEXPECTED_TOKEN, |
| 3993 ParserErrorCode.EXPECTED_EXECUTABLE, |
| 3994 ] |
| 3995 : [ |
| 3996 ScannerErrorCode.UNTERMINATED_STRING_LITERAL, |
| 3997 ParserErrorCode.EXPECTED_TOKEN, |
| 3998 ParserErrorCode.EXPECTED_TOKEN, |
| 3999 ParserErrorCode.EXPECTED_TOKEN, |
| 4000 ParserErrorCode.EXPECTED_TOKEN, |
| 4001 ParserErrorCode.EXPECTED_TOKEN, |
| 4002 ParserErrorCode.EXPECTED_TOKEN, |
| 4003 ]); |
3963 } | 4004 } |
3964 | 4005 |
3965 void test_switchHasCaseAfterDefaultCase() { | 4006 void test_switchHasCaseAfterDefaultCase() { |
3966 createParser('switch (a) {default: return 0; case 1: return 1;}'); | 4007 createParser('switch (a) {default: return 0; case 1: return 1;}'); |
3967 SwitchStatement statement = parser.parseSwitchStatement(); | 4008 SwitchStatement statement = parser.parseSwitchStatement(); |
3968 expectNotNullIfNoErrors(statement); | 4009 expectNotNullIfNoErrors(statement); |
3969 listener.assertErrorsWithCodes( | 4010 listener.assertErrorsWithCodes( |
3970 [ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE]); | 4011 [ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE]); |
3971 } | 4012 } |
3972 | 4013 |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4076 | 4117 |
4077 void test_typedefInClass_withReturnType() { | 4118 void test_typedefInClass_withReturnType() { |
4078 parseCompilationUnit("class C { typedef int F(int x); }", | 4119 parseCompilationUnit("class C { typedef int F(int x); }", |
4079 [ParserErrorCode.TYPEDEF_IN_CLASS]); | 4120 [ParserErrorCode.TYPEDEF_IN_CLASS]); |
4080 } | 4121 } |
4081 | 4122 |
4082 void test_unexpectedTerminatorForParameterGroup_named() { | 4123 void test_unexpectedTerminatorForParameterGroup_named() { |
4083 createParser('(a, b})'); | 4124 createParser('(a, b})'); |
4084 FormalParameterList list = parser.parseFormalParameterList(); | 4125 FormalParameterList list = parser.parseFormalParameterList(); |
4085 expectNotNullIfNoErrors(list); | 4126 expectNotNullIfNoErrors(list); |
4086 listener.assertErrorsWithCodes( | 4127 listener.assertErrorsWithCodes(fe.Scanner.useFasta |
4087 [ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP]); | 4128 ? [ScannerErrorCode.EXPECTED_TOKEN] |
| 4129 : [ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP]); |
4088 } | 4130 } |
4089 | 4131 |
4090 void test_unexpectedTerminatorForParameterGroup_optional() { | 4132 void test_unexpectedTerminatorForParameterGroup_optional() { |
4091 createParser('(a, b])'); | 4133 createParser('(a, b])'); |
4092 FormalParameterList list = parser.parseFormalParameterList(); | 4134 FormalParameterList list = parser.parseFormalParameterList(); |
4093 expectNotNullIfNoErrors(list); | 4135 expectNotNullIfNoErrors(list); |
4094 listener.assertErrorsWithCodes( | 4136 listener.assertErrorsWithCodes(fe.Scanner.useFasta |
4095 [ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP]); | 4137 ? [ScannerErrorCode.EXPECTED_TOKEN] |
| 4138 : [ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP]); |
4096 } | 4139 } |
4097 | 4140 |
4098 void test_unexpectedToken_endOfFieldDeclarationStatement() { | 4141 void test_unexpectedToken_endOfFieldDeclarationStatement() { |
4099 parseStatement("String s = (null));"); | 4142 parseStatement("String s = (null));"); |
4100 assertErrorsWithCodes([ParserErrorCode.UNEXPECTED_TOKEN]); | 4143 assertErrorsWithCodes([ParserErrorCode.UNEXPECTED_TOKEN]); |
4101 } | 4144 } |
4102 | 4145 |
4103 @failingTest | 4146 @failingTest |
4104 void test_unexpectedToken_invalidPostfixExpression() { | 4147 void test_unexpectedToken_invalidPostfixExpression() { |
4105 // Note: this might not be the right error to produce, but some error should | 4148 // Note: this might not be the right error to produce, but some error should |
(...skipping 20 matching lines...) Expand all Loading... |
4126 void test_unterminatedString_at_eof() { | 4169 void test_unterminatedString_at_eof() { |
4127 // Although the "unterminated string" error message is produced by the | 4170 // Although the "unterminated string" error message is produced by the |
4128 // scanner, we need to verify that the parser can handle the tokens | 4171 // scanner, we need to verify that the parser can handle the tokens |
4129 // produced by the scanner when an unterminated string is encountered. | 4172 // produced by the scanner when an unterminated string is encountered. |
4130 parseCompilationUnit( | 4173 parseCompilationUnit( |
4131 r''' | 4174 r''' |
4132 void main() { | 4175 void main() { |
4133 var x = "''', | 4176 var x = "''', |
4134 [ | 4177 [ |
4135 ScannerErrorCode.UNTERMINATED_STRING_LITERAL, | 4178 ScannerErrorCode.UNTERMINATED_STRING_LITERAL, |
4136 ParserErrorCode.EXPECTED_TOKEN, | 4179 fe.Scanner.useFasta |
| 4180 ? ScannerErrorCode.EXPECTED_TOKEN |
| 4181 : ParserErrorCode.EXPECTED_TOKEN, |
4137 ParserErrorCode.EXPECTED_TOKEN | 4182 ParserErrorCode.EXPECTED_TOKEN |
4138 ]); | 4183 ]); |
4139 } | 4184 } |
4140 | 4185 |
4141 void test_unterminatedString_at_eol() { | 4186 void test_unterminatedString_at_eol() { |
4142 // Although the "unterminated string" error message is produced by the | 4187 // Although the "unterminated string" error message is produced by the |
4143 // scanner, we need to verify that the parser can handle the tokens | 4188 // scanner, we need to verify that the parser can handle the tokens |
4144 // produced by the scanner when an unterminated string is encountered. | 4189 // produced by the scanner when an unterminated string is encountered. |
4145 parseCompilationUnit( | 4190 parseCompilationUnit( |
4146 r''' | 4191 r''' |
4147 void main() { | 4192 void main() { |
4148 var x = " | 4193 var x = " |
4149 ; | 4194 ; |
4150 } | 4195 } |
4151 ''', | 4196 ''', |
4152 [ScannerErrorCode.UNTERMINATED_STRING_LITERAL]); | 4197 [ScannerErrorCode.UNTERMINATED_STRING_LITERAL]); |
4153 } | 4198 } |
4154 | 4199 |
4155 void test_unterminatedString_multiline_at_eof_3_quotes() { | 4200 void test_unterminatedString_multiline_at_eof_3_quotes() { |
4156 // Although the "unterminated string" error message is produced by the | 4201 // Although the "unterminated string" error message is produced by the |
4157 // scanner, we need to verify that the parser can handle the tokens | 4202 // scanner, we need to verify that the parser can handle the tokens |
4158 // produced by the scanner when an unterminated string is encountered. | 4203 // produced by the scanner when an unterminated string is encountered. |
4159 parseCompilationUnit( | 4204 parseCompilationUnit( |
4160 r''' | 4205 r''' |
4161 void main() { | 4206 void main() { |
4162 var x = """''', | 4207 var x = """''', |
4163 [ | 4208 [ |
4164 ScannerErrorCode.UNTERMINATED_STRING_LITERAL, | 4209 ScannerErrorCode.UNTERMINATED_STRING_LITERAL, |
4165 ParserErrorCode.EXPECTED_TOKEN, | 4210 fe.Scanner.useFasta |
| 4211 ? ScannerErrorCode.EXPECTED_TOKEN |
| 4212 : ParserErrorCode.EXPECTED_TOKEN, |
4166 ParserErrorCode.EXPECTED_TOKEN | 4213 ParserErrorCode.EXPECTED_TOKEN |
4167 ]); | 4214 ]); |
4168 } | 4215 } |
4169 | 4216 |
4170 void test_unterminatedString_multiline_at_eof_4_quotes() { | 4217 void test_unterminatedString_multiline_at_eof_4_quotes() { |
4171 // Although the "unterminated string" error message is produced by the | 4218 // Although the "unterminated string" error message is produced by the |
4172 // scanner, we need to verify that the parser can handle the tokens | 4219 // scanner, we need to verify that the parser can handle the tokens |
4173 // produced by the scanner when an unterminated string is encountered. | 4220 // produced by the scanner when an unterminated string is encountered. |
4174 parseCompilationUnit( | 4221 parseCompilationUnit( |
4175 r''' | 4222 r''' |
4176 void main() { | 4223 void main() { |
4177 var x = """"''', | 4224 var x = """"''', |
4178 [ | 4225 [ |
4179 ScannerErrorCode.UNTERMINATED_STRING_LITERAL, | 4226 ScannerErrorCode.UNTERMINATED_STRING_LITERAL, |
4180 ParserErrorCode.EXPECTED_TOKEN, | 4227 fe.Scanner.useFasta |
| 4228 ? ScannerErrorCode.EXPECTED_TOKEN |
| 4229 : ParserErrorCode.EXPECTED_TOKEN, |
4181 ParserErrorCode.EXPECTED_TOKEN | 4230 ParserErrorCode.EXPECTED_TOKEN |
4182 ]); | 4231 ]); |
4183 } | 4232 } |
4184 | 4233 |
4185 void test_unterminatedString_multiline_at_eof_5_quotes() { | 4234 void test_unterminatedString_multiline_at_eof_5_quotes() { |
4186 // Although the "unterminated string" error message is produced by the | 4235 // Although the "unterminated string" error message is produced by the |
4187 // scanner, we need to verify that the parser can handle the tokens | 4236 // scanner, we need to verify that the parser can handle the tokens |
4188 // produced by the scanner when an unterminated string is encountered. | 4237 // produced by the scanner when an unterminated string is encountered. |
4189 parseCompilationUnit( | 4238 parseCompilationUnit( |
4190 r''' | 4239 r''' |
4191 void main() { | 4240 void main() { |
4192 var x = """""''', | 4241 var x = """""''', |
4193 [ | 4242 [ |
4194 ScannerErrorCode.UNTERMINATED_STRING_LITERAL, | 4243 ScannerErrorCode.UNTERMINATED_STRING_LITERAL, |
4195 ParserErrorCode.EXPECTED_TOKEN, | 4244 fe.Scanner.useFasta |
| 4245 ? ScannerErrorCode.EXPECTED_TOKEN |
| 4246 : ParserErrorCode.EXPECTED_TOKEN, |
4196 ParserErrorCode.EXPECTED_TOKEN | 4247 ParserErrorCode.EXPECTED_TOKEN |
4197 ]); | 4248 ]); |
4198 } | 4249 } |
4199 | 4250 |
4200 void test_useOfUnaryPlusOperator() { | 4251 void test_useOfUnaryPlusOperator() { |
4201 createParser('+x'); | 4252 createParser('+x'); |
4202 Expression expression = parser.parseUnaryExpression(); | 4253 Expression expression = parser.parseUnaryExpression(); |
4203 expectNotNullIfNoErrors(expression); | 4254 expectNotNullIfNoErrors(expression); |
4204 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); | 4255 listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]); |
4205 var identifier = expression as SimpleIdentifier; | 4256 var identifier = expression as SimpleIdentifier; |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4326 FormalParameterList list = parser.parseFormalParameterList(); | 4377 FormalParameterList list = parser.parseFormalParameterList(); |
4327 expectNotNullIfNoErrors(list); | 4378 expectNotNullIfNoErrors(list); |
4328 listener.assertErrorsWithCodes( | 4379 listener.assertErrorsWithCodes( |
4329 [ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER]); | 4380 [ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER]); |
4330 } | 4381 } |
4331 | 4382 |
4332 void test_wrongTerminatorForParameterGroup_named() { | 4383 void test_wrongTerminatorForParameterGroup_named() { |
4333 createParser('(a, {b, c])'); | 4384 createParser('(a, {b, c])'); |
4334 FormalParameterList list = parser.parseFormalParameterList(); | 4385 FormalParameterList list = parser.parseFormalParameterList(); |
4335 expectNotNullIfNoErrors(list); | 4386 expectNotNullIfNoErrors(list); |
4336 listener.assertErrorsWithCodes( | 4387 listener.assertErrorsWithCodes(fe.Scanner.useFasta |
4337 [ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP]); | 4388 ? [ScannerErrorCode.EXPECTED_TOKEN, ScannerErrorCode.EXPECTED_TOKEN] |
| 4389 : [ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP]); |
4338 } | 4390 } |
4339 | 4391 |
4340 void test_wrongTerminatorForParameterGroup_optional() { | 4392 void test_wrongTerminatorForParameterGroup_optional() { |
4341 createParser('(a, [b, c})'); | 4393 createParser('(a, [b, c})'); |
4342 FormalParameterList list = parser.parseFormalParameterList(); | 4394 FormalParameterList list = parser.parseFormalParameterList(); |
4343 expectNotNullIfNoErrors(list); | 4395 expectNotNullIfNoErrors(list); |
4344 listener.assertErrorsWithCodes( | 4396 listener.assertErrorsWithCodes(fe.Scanner.useFasta |
4345 [ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP]); | 4397 ? [ScannerErrorCode.EXPECTED_TOKEN, ScannerErrorCode.EXPECTED_TOKEN] |
| 4398 : [ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP]); |
4346 } | 4399 } |
4347 } | 4400 } |
4348 | 4401 |
4349 @reflectiveTest | 4402 @reflectiveTest |
4350 class ExpressionParserTest extends ParserTestCase | 4403 class ExpressionParserTest extends ParserTestCase |
4351 with ExpressionParserTestMixin {} | 4404 with ExpressionParserTestMixin {} |
4352 | 4405 |
4353 abstract class ExpressionParserTestMixin implements AbstractParserTestCase { | 4406 abstract class ExpressionParserTestMixin implements AbstractParserTestCase { |
4354 void test_namedArgument() { | 4407 void test_namedArgument() { |
4355 var invocation = parseExpression('m(a: 1, b: 2)') as MethodInvocation; | 4408 var invocation = parseExpression('m(a: 1, b: 2)') as MethodInvocation; |
(...skipping 6900 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11256 expectNotNullIfNoErrors(functionBody); | 11309 expectNotNullIfNoErrors(functionBody); |
11257 listener.assertNoErrors(); | 11310 listener.assertNoErrors(); |
11258 expect(functionBody, new isInstanceOf<EmptyFunctionBody>()); | 11311 expect(functionBody, new isInstanceOf<EmptyFunctionBody>()); |
11259 } | 11312 } |
11260 | 11313 |
11261 void test_parseFunctionBody_skip_block_invalid() { | 11314 void test_parseFunctionBody_skip_block_invalid() { |
11262 ParserTestCase.parseFunctionBodies = false; | 11315 ParserTestCase.parseFunctionBodies = false; |
11263 createParser('{'); | 11316 createParser('{'); |
11264 FunctionBody functionBody = parser.parseFunctionBody(false, null, false); | 11317 FunctionBody functionBody = parser.parseFunctionBody(false, null, false); |
11265 expectNotNullIfNoErrors(functionBody); | 11318 expectNotNullIfNoErrors(functionBody); |
11266 listener.assertErrorsWithCodes([ParserErrorCode.EXPECTED_TOKEN]); | 11319 listener.assertErrorsWithCodes([ |
| 11320 fe.Scanner.useFasta |
| 11321 ? ScannerErrorCode.EXPECTED_TOKEN |
| 11322 : ParserErrorCode.EXPECTED_TOKEN |
| 11323 ]); |
11267 expect(functionBody, new isInstanceOf<EmptyFunctionBody>()); | 11324 expect(functionBody, new isInstanceOf<EmptyFunctionBody>()); |
11268 } | 11325 } |
11269 | 11326 |
11270 void test_parseFunctionBody_skip_blocks() { | 11327 void test_parseFunctionBody_skip_blocks() { |
11271 ParserTestCase.parseFunctionBodies = false; | 11328 ParserTestCase.parseFunctionBodies = false; |
11272 createParser('{ {} }'); | 11329 createParser('{ {} }'); |
11273 FunctionBody functionBody = parser.parseFunctionBody(false, null, false); | 11330 FunctionBody functionBody = parser.parseFunctionBody(false, null, false); |
11274 expectNotNullIfNoErrors(functionBody); | 11331 expectNotNullIfNoErrors(functionBody); |
11275 listener.assertNoErrors(); | 11332 listener.assertNoErrors(); |
11276 expect(functionBody, new isInstanceOf<EmptyFunctionBody>()); | 11333 expect(functionBody, new isInstanceOf<EmptyFunctionBody>()); |
(...skipping 3810 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15087 expectCommentText(typeVariable.documentationComment, '/// Doc'); | 15144 expectCommentText(typeVariable.documentationComment, '/// Doc'); |
15088 } | 15145 } |
15089 | 15146 |
15090 /** | 15147 /** |
15091 * Assert that the given [name] is in declaration context. | 15148 * Assert that the given [name] is in declaration context. |
15092 */ | 15149 */ |
15093 void _assertIsDeclarationName(SimpleIdentifier name) { | 15150 void _assertIsDeclarationName(SimpleIdentifier name) { |
15094 expect(name.inDeclarationContext(), isTrue); | 15151 expect(name.inDeclarationContext(), isTrue); |
15095 } | 15152 } |
15096 } | 15153 } |
OLD | NEW |