OLD | NEW |
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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/element/element.dart'; | 6 import 'package:analyzer/dart/element/element.dart'; |
7 import 'package:analyzer/error/error.dart'; | 7 import 'package:analyzer/error/error.dart'; |
8 import 'package:analyzer/src/generated/parser.dart' as analyzer; | 8 import 'package:analyzer/src/generated/parser.dart' as analyzer; |
9 import 'package:analyzer/src/generated/utilities_dart.dart'; | 9 import 'package:analyzer/src/generated/utilities_dart.dart'; |
10 import 'package:front_end/src/fasta/analyzer/ast_builder.dart'; | 10 import 'package:front_end/src/fasta/analyzer/ast_builder.dart'; |
11 import 'package:front_end/src/fasta/analyzer/element_store.dart'; | 11 import 'package:front_end/src/fasta/analyzer/element_store.dart'; |
12 import 'package:front_end/src/fasta/builder/scope.dart'; | 12 import 'package:front_end/src/fasta/builder/scope.dart'; |
13 import 'package:front_end/src/fasta/kernel/kernel_builder.dart'; | 13 import 'package:front_end/src/fasta/kernel/kernel_builder.dart'; |
14 import 'package:front_end/src/fasta/kernel/kernel_library_builder.dart'; | 14 import 'package:front_end/src/fasta/kernel/kernel_library_builder.dart'; |
15 import 'package:front_end/src/fasta/parser/parser.dart' as fasta; | 15 import 'package:front_end/src/fasta/parser/parser.dart' as fasta; |
| 16 import 'package:front_end/src/fasta/scanner/precedence.dart' as fasta; |
16 import 'package:front_end/src/fasta/scanner/string_scanner.dart'; | 17 import 'package:front_end/src/fasta/scanner/string_scanner.dart'; |
17 import 'package:front_end/src/fasta/scanner/token.dart' as fasta; | 18 import 'package:front_end/src/fasta/scanner/token.dart' as fasta; |
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 'parser_test.dart'; | 22 import 'parser_test.dart'; |
22 | 23 |
23 main() { | 24 main() { |
24 defineReflectiveSuite(() { | 25 defineReflectiveSuite(() { |
| 26 defineReflectiveTests(ClassMemberParserTest_Fasta); |
25 defineReflectiveTests(ComplexParserTest_Fasta); | 27 defineReflectiveTests(ComplexParserTest_Fasta); |
26 defineReflectiveTests(FormalParameterParserTest_Fasta); | 28 defineReflectiveTests(FormalParameterParserTest_Fasta); |
27 defineReflectiveTests(TopLevelParserTest_Fasta); | 29 defineReflectiveTests(TopLevelParserTest_Fasta); |
28 }); | 30 }); |
29 } | 31 } |
30 | 32 |
31 /** | 33 /** |
32 * Type of the "parse..." methods defined in the Fasta parser. | 34 * Type of the "parse..." methods defined in the Fasta parser. |
33 */ | 35 */ |
34 typedef fasta.Token ParseFunction(fasta.Token token); | 36 typedef fasta.Token ParseFunction(fasta.Token token); |
35 | 37 |
36 /** | 38 /** |
37 * Proxy implementation of [Builder] used by Fasta parser tests. | 39 * Proxy implementation of [Builder] used by Fasta parser tests. |
38 * | 40 * |
39 * All undeclared identifiers are presumed to resolve via an instance of this | 41 * All undeclared identifiers are presumed to resolve via an instance of this |
40 * class. | 42 * class. |
41 */ | 43 */ |
42 class BuilderProxy implements Builder { | 44 class BuilderProxy implements Builder { |
43 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | 45 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
44 } | 46 } |
45 | 47 |
| 48 @reflectiveTest |
| 49 class ClassMemberParserTest_Fasta extends FastaParserTestCase |
| 50 with ClassMemberParserTestMixin { |
| 51 @override |
| 52 @failingTest |
| 53 void test_constFactory() { |
| 54 // TODO(paulberry): Unhandled event: ConstructorReference |
| 55 super.test_constFactory(); |
| 56 } |
| 57 |
| 58 @override |
| 59 @failingTest |
| 60 void test_parseAwaitExpression_asStatement_inAsync() { |
| 61 // TODO(paulberry): Add support for async |
| 62 super.test_parseAwaitExpression_asStatement_inAsync(); |
| 63 } |
| 64 |
| 65 @override |
| 66 @failingTest |
| 67 void test_parseAwaitExpression_asStatement_inSync() { |
| 68 // TODO(paulberry): Add support for method declarations |
| 69 super.test_parseAwaitExpression_asStatement_inSync(); |
| 70 } |
| 71 |
| 72 @override |
| 73 @failingTest |
| 74 void test_parseClassMember_constructor_withInitializers() { |
| 75 // TODO(paulberry): 'this' can't be used here. |
| 76 super.test_parseClassMember_constructor_withInitializers(); |
| 77 } |
| 78 |
| 79 @override |
| 80 @failingTest |
| 81 void test_parseClassMember_field_covariant() { |
| 82 // TODO(paulberry): Unhandled event: Fields |
| 83 super.test_parseClassMember_field_covariant(); |
| 84 } |
| 85 |
| 86 @override |
| 87 @failingTest |
| 88 void test_parseClassMember_field_instance_prefixedType() { |
| 89 // TODO(paulberry): Unhandled event: Fields |
| 90 super.test_parseClassMember_field_instance_prefixedType(); |
| 91 } |
| 92 |
| 93 @override |
| 94 @failingTest |
| 95 void test_parseClassMember_field_namedGet() { |
| 96 // TODO(paulberry): Unhandled event: Fields |
| 97 super.test_parseClassMember_field_namedGet(); |
| 98 } |
| 99 |
| 100 @override |
| 101 @failingTest |
| 102 void test_parseClassMember_field_namedOperator() { |
| 103 // TODO(paulberry): Unhandled event: Fields |
| 104 super.test_parseClassMember_field_namedOperator(); |
| 105 } |
| 106 |
| 107 @override |
| 108 @failingTest |
| 109 void test_parseClassMember_field_namedOperator_withAssignment() { |
| 110 // TODO(paulberry): Unhandled event: Fields |
| 111 super.test_parseClassMember_field_namedOperator_withAssignment(); |
| 112 } |
| 113 |
| 114 @override |
| 115 @failingTest |
| 116 void test_parseClassMember_field_namedSet() { |
| 117 // TODO(paulberry): Unhandled event: Fields |
| 118 super.test_parseClassMember_field_namedSet(); |
| 119 } |
| 120 |
| 121 @override |
| 122 @failingTest |
| 123 void test_parseClassMember_field_static() { |
| 124 // TODO(paulberry): Unhandled event: Fields |
| 125 super.test_parseClassMember_field_static(); |
| 126 } |
| 127 |
| 128 @override |
| 129 @failingTest |
| 130 void test_parseClassMember_getter_functionType() { |
| 131 // TODO(paulberry): InputError: ErrorKind.ExpectedFunctionBody {actual: get} |
| 132 super.test_parseClassMember_getter_functionType(); |
| 133 } |
| 134 |
| 135 @override |
| 136 @failingTest |
| 137 void test_parseClassMember_getter_void() { |
| 138 // TODO(paulberry): Add support for method declarations |
| 139 super.test_parseClassMember_getter_void(); |
| 140 } |
| 141 |
| 142 @override |
| 143 @failingTest |
| 144 void test_parseClassMember_method_external() { |
| 145 // TODO(paulberry): Add support for method declarations |
| 146 super.test_parseClassMember_method_external(); |
| 147 } |
| 148 |
| 149 @override |
| 150 @failingTest |
| 151 void test_parseClassMember_method_external_withTypeAndArgs() { |
| 152 // TODO(paulberry): Add support for method declarations |
| 153 super.test_parseClassMember_method_external_withTypeAndArgs(); |
| 154 } |
| 155 |
| 156 @override |
| 157 @failingTest |
| 158 void test_parseClassMember_method_generic_comment_noReturnType() { |
| 159 // TODO(paulberry): Fasta doesn't support generic comment syntax |
| 160 super.test_parseClassMember_method_generic_comment_noReturnType(); |
| 161 } |
| 162 |
| 163 @override |
| 164 @failingTest |
| 165 void test_parseClassMember_method_generic_comment_returnType() { |
| 166 // TODO(paulberry): Fasta doesn't support generic comment syntax |
| 167 super.test_parseClassMember_method_generic_comment_returnType(); |
| 168 } |
| 169 |
| 170 @override |
| 171 @failingTest |
| 172 void test_parseClassMember_method_generic_comment_returnType_bound() { |
| 173 // TODO(paulberry): Fasta doesn't support generic comment syntax |
| 174 super.test_parseClassMember_method_generic_comment_returnType_bound(); |
| 175 } |
| 176 |
| 177 @override |
| 178 @failingTest |
| 179 void test_parseClassMember_method_generic_comment_void() { |
| 180 // TODO(paulberry): Fasta doesn't support generic comment syntax |
| 181 super.test_parseClassMember_method_generic_comment_void(); |
| 182 } |
| 183 |
| 184 @override |
| 185 @failingTest |
| 186 void test_parseClassMember_method_generic_noReturnType() { |
| 187 // TODO(paulberry): Add support for method declarations |
| 188 super.test_parseClassMember_method_generic_noReturnType(); |
| 189 } |
| 190 |
| 191 @override |
| 192 @failingTest |
| 193 void test_parseClassMember_method_generic_returnType() { |
| 194 // TODO(paulberry): Add support for method declarations |
| 195 super.test_parseClassMember_method_generic_returnType(); |
| 196 } |
| 197 |
| 198 @override |
| 199 @failingTest |
| 200 void test_parseClassMember_method_generic_void() { |
| 201 // TODO(paulberry): Add support for method declarations |
| 202 super.test_parseClassMember_method_generic_void(); |
| 203 } |
| 204 |
| 205 @override |
| 206 @failingTest |
| 207 void test_parseClassMember_method_get_noType() { |
| 208 // TODO(paulberry): Add support for method declarations |
| 209 super.test_parseClassMember_method_get_noType(); |
| 210 } |
| 211 |
| 212 @override |
| 213 @failingTest |
| 214 void test_parseClassMember_method_get_type() { |
| 215 // TODO(paulberry): Add support for method declarations |
| 216 super.test_parseClassMember_method_get_type(); |
| 217 } |
| 218 |
| 219 @override |
| 220 @failingTest |
| 221 void test_parseClassMember_method_get_void() { |
| 222 // TODO(paulberry): Add support for method declarations |
| 223 super.test_parseClassMember_method_get_void(); |
| 224 } |
| 225 |
| 226 @override |
| 227 @failingTest |
| 228 void test_parseClassMember_method_operator_noType() { |
| 229 // TODO(paulberry): Add support for method declarations |
| 230 super.test_parseClassMember_method_operator_noType(); |
| 231 } |
| 232 |
| 233 @override |
| 234 @failingTest |
| 235 void test_parseClassMember_method_operator_type() { |
| 236 // TODO(paulberry): Add support for method declarations |
| 237 super.test_parseClassMember_method_operator_type(); |
| 238 } |
| 239 |
| 240 @override |
| 241 @failingTest |
| 242 void test_parseClassMember_method_operator_void() { |
| 243 // TODO(paulberry): Add support for method declarations |
| 244 super.test_parseClassMember_method_operator_void(); |
| 245 } |
| 246 |
| 247 @override |
| 248 @failingTest |
| 249 void test_parseClassMember_method_returnType_functionType() { |
| 250 // TODO(paulberry): InputError: ErrorKind.ExpectedFunctionBody {actual: m} |
| 251 super.test_parseClassMember_method_returnType_functionType(); |
| 252 } |
| 253 |
| 254 @override |
| 255 @failingTest |
| 256 void test_parseClassMember_method_returnType_parameterized() { |
| 257 // TODO(paulberry): Add support for method declarations |
| 258 super.test_parseClassMember_method_returnType_parameterized(); |
| 259 } |
| 260 |
| 261 @override |
| 262 @failingTest |
| 263 void test_parseClassMember_method_set_noType() { |
| 264 // TODO(paulberry): Add support for method declarations |
| 265 super.test_parseClassMember_method_set_noType(); |
| 266 } |
| 267 |
| 268 @override |
| 269 @failingTest |
| 270 void test_parseClassMember_method_set_type() { |
| 271 // TODO(paulberry): Add support for method declarations |
| 272 super.test_parseClassMember_method_set_type(); |
| 273 } |
| 274 |
| 275 @override |
| 276 @failingTest |
| 277 void test_parseClassMember_method_set_void() { |
| 278 // TODO(paulberry): Add support for method declarations |
| 279 super.test_parseClassMember_method_set_void(); |
| 280 } |
| 281 |
| 282 @override |
| 283 @failingTest |
| 284 void test_parseClassMember_method_trailing_commas() { |
| 285 // TODO(paulberry): Add support for method declarations |
| 286 super.test_parseClassMember_method_trailing_commas(); |
| 287 } |
| 288 |
| 289 @override |
| 290 @failingTest |
| 291 void test_parseClassMember_operator_functionType() { |
| 292 // TODO(paulberry): InputError: ErrorKind.ExpectedFunctionBody {actual: oper
ator} |
| 293 super.test_parseClassMember_operator_functionType(); |
| 294 } |
| 295 |
| 296 @override |
| 297 @failingTest |
| 298 void test_parseClassMember_operator_index() { |
| 299 // TODO(paulberry): Unhandled event: OperatorName |
| 300 super.test_parseClassMember_operator_index(); |
| 301 } |
| 302 |
| 303 @override |
| 304 @failingTest |
| 305 void test_parseClassMember_operator_indexAssign() { |
| 306 // TODO(paulberry): Unhandled event: OperatorName |
| 307 super.test_parseClassMember_operator_indexAssign(); |
| 308 } |
| 309 |
| 310 @override |
| 311 @failingTest |
| 312 void test_parseClassMember_redirectingFactory_const() { |
| 313 // TODO(paulberry): Unhandled event: ConstructorReference |
| 314 super.test_parseClassMember_redirectingFactory_const(); |
| 315 } |
| 316 |
| 317 @override |
| 318 @failingTest |
| 319 void test_parseClassMember_redirectingFactory_nonConst() { |
| 320 // TODO(paulberry): Unhandled event: ConstructorReference |
| 321 super.test_parseClassMember_redirectingFactory_nonConst(); |
| 322 } |
| 323 |
| 324 @override |
| 325 @failingTest |
| 326 void test_parseConstructor_assert() { |
| 327 // TODO(paulberry): Fasta doesn't support asserts in initializers |
| 328 super.test_parseConstructor_assert(); |
| 329 } |
| 330 |
| 331 @override |
| 332 @failingTest |
| 333 void test_parseConstructor_with_pseudo_function_literal() { |
| 334 // TODO(paulberry): Expected: an object with length of <1> |
| 335 super.test_parseConstructor_with_pseudo_function_literal(); |
| 336 } |
| 337 |
| 338 @override |
| 339 @failingTest |
| 340 void test_parseConstructorFieldInitializer_qualified() { |
| 341 // TODO(paulberry): Unhandled event: ThisExpression |
| 342 super.test_parseConstructorFieldInitializer_qualified(); |
| 343 } |
| 344 |
| 345 @override |
| 346 @failingTest |
| 347 void test_parseConstructorFieldInitializer_unqualified() { |
| 348 // TODO(paulberry): Expected: an object with length of <1> |
| 349 super.test_parseConstructorFieldInitializer_unqualified(); |
| 350 } |
| 351 |
| 352 @override |
| 353 @failingTest |
| 354 void test_parseGetter_nonStatic() { |
| 355 // TODO(paulberry): Add support for method declarations |
| 356 super.test_parseGetter_nonStatic(); |
| 357 } |
| 358 |
| 359 @override |
| 360 @failingTest |
| 361 void test_parseGetter_static() { |
| 362 // TODO(paulberry): Invalid modifier (static). Report an error. |
| 363 super.test_parseGetter_static(); |
| 364 } |
| 365 |
| 366 @override |
| 367 @failingTest |
| 368 void test_parseInitializedIdentifierList_type() { |
| 369 // TODO(paulberry): Unhandled event: Fields |
| 370 super.test_parseInitializedIdentifierList_type(); |
| 371 } |
| 372 |
| 373 @override |
| 374 @failingTest |
| 375 void test_parseInitializedIdentifierList_var() { |
| 376 // TODO(paulberry): Unhandled event: Fields |
| 377 super.test_parseInitializedIdentifierList_var(); |
| 378 } |
| 379 |
| 380 @override |
| 381 @failingTest |
| 382 void test_parseOperator() { |
| 383 // TODO(paulberry): Unhandled event: OperatorName |
| 384 super.test_parseOperator(); |
| 385 } |
| 386 |
| 387 @override |
| 388 @failingTest |
| 389 void test_parseSetter_nonStatic() { |
| 390 // TODO(paulberry): Add support for method declarations |
| 391 super.test_parseSetter_nonStatic(); |
| 392 } |
| 393 |
| 394 @override |
| 395 @failingTest |
| 396 void test_parseSetter_static() { |
| 397 // TODO(paulberry): Invalid modifier (static). Report an error. |
| 398 super.test_parseSetter_static(); |
| 399 } |
| 400 } |
| 401 |
46 /** | 402 /** |
47 * Tests of the fasta parser based on [ComplexParserTestMixin]. | 403 * Tests of the fasta parser based on [ComplexParserTestMixin]. |
48 */ | 404 */ |
49 @reflectiveTest | 405 @reflectiveTest |
50 class ComplexParserTest_Fasta extends FastaParserTestCase | 406 class ComplexParserTest_Fasta extends FastaParserTestCase |
51 with ComplexParserTestMixin { | 407 with ComplexParserTestMixin { |
52 @override | 408 @override |
53 @failingTest | 409 @failingTest |
54 void test_additiveExpression_precedence_multiplicative_left_withSuper() { | 410 void test_additiveExpression_precedence_multiplicative_left_withSuper() { |
55 // TODO(paulberry,ahe): AstBuilder doesn't implement | 411 // TODO(paulberry,ahe): AstBuilder doesn't implement |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 /** | 606 /** |
251 * Implementation of [AbstractParserTestCase] specialized for testing the | 607 * Implementation of [AbstractParserTestCase] specialized for testing the |
252 * Fasta parser. | 608 * Fasta parser. |
253 */ | 609 */ |
254 class FastaParserTestCase extends Object | 610 class FastaParserTestCase extends Object |
255 with ParserTestHelpers | 611 with ParserTestHelpers |
256 implements AbstractParserTestCase { | 612 implements AbstractParserTestCase { |
257 ParserProxy _parserProxy; | 613 ParserProxy _parserProxy; |
258 | 614 |
259 @override | 615 @override |
| 616 set enableAssertInitializer(bool value) { |
| 617 if (value == true) { |
| 618 // TODO(paulberry,ahe): it looks like asserts in initializer lists are not |
| 619 // supported by Fasta. |
| 620 throw new UnimplementedError(); |
| 621 } |
| 622 } |
| 623 |
| 624 @override |
260 set enableGenericMethodComments(bool value) { | 625 set enableGenericMethodComments(bool value) { |
261 if (value == true) { | 626 if (value == true) { |
262 // TODO(paulberry,ahe): generic method comment syntax is not supported by | 627 // TODO(paulberry,ahe): generic method comment syntax is not supported by |
263 // Fasta. | 628 // Fasta. |
264 throw new UnimplementedError(); | 629 throw new UnimplementedError(); |
265 } | 630 } |
266 } | 631 } |
267 | 632 |
268 @override | 633 @override |
269 set enableNnbd(bool value) { | 634 set enableNnbd(bool value) { |
(...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
771 var astBuilder = new AstBuilder(library, member, elementStore, scope); | 1136 var astBuilder = new AstBuilder(library, member, elementStore, scope); |
772 return new ParserProxy._( | 1137 return new ParserProxy._( |
773 startingToken, new fasta.Parser(astBuilder), astBuilder); | 1138 startingToken, new fasta.Parser(astBuilder), astBuilder); |
774 } | 1139 } |
775 | 1140 |
776 ParserProxy._(this._currentFastaToken, this._fastaParser, this._astBuilder); | 1141 ParserProxy._(this._currentFastaToken, this._fastaParser, this._astBuilder); |
777 | 1142 |
778 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | 1143 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
779 | 1144 |
780 @override | 1145 @override |
| 1146 ClassMember parseClassMember(String className) { |
| 1147 _astBuilder.className = className; |
| 1148 var result = _run((parser) => parser.parseMember) as ClassMember; |
| 1149 _astBuilder.className = null; |
| 1150 return result; |
| 1151 } |
| 1152 |
| 1153 @override |
781 CompilationUnit parseCompilationUnit2() { | 1154 CompilationUnit parseCompilationUnit2() { |
782 return _run((parser) => parser.parseUnit) as CompilationUnit; | 1155 return _run((parser) => parser.parseUnit) as CompilationUnit; |
783 } | 1156 } |
784 | 1157 |
| 1158 @override |
| 1159 ConstructorFieldInitializer parseConstructorFieldInitializer(bool hasThis) { |
| 1160 // Fasta's parser doesn't need the [hasThis] hint, so we ignore it. |
| 1161 var colon = new fasta.SymbolToken(fasta.COLON_INFO, 0); |
| 1162 colon.next = _currentFastaToken; |
| 1163 _currentFastaToken = colon; |
| 1164 var initializers = _run((parser) => parser.parseInitializers) as List; |
| 1165 return initializers[0] as ConstructorFieldInitializer; |
| 1166 } |
| 1167 |
785 /** | 1168 /** |
786 * Runs a single parser function, and returns the result as an analyzer AST. | 1169 * Runs a single parser function, and returns the result as an analyzer AST. |
787 */ | 1170 */ |
788 Object _run(ParseFunction getParseFunction(fasta.Parser parser)) { | 1171 Object _run(ParseFunction getParseFunction(fasta.Parser parser)) { |
789 var parseFunction = getParseFunction(_fastaParser); | 1172 var parseFunction = getParseFunction(_fastaParser); |
790 _currentFastaToken = parseFunction(_currentFastaToken); | 1173 _currentFastaToken = parseFunction(_currentFastaToken); |
791 expect(_currentFastaToken.isEof, isTrue); | 1174 expect(_currentFastaToken.isEof, isTrue); |
792 expect(_astBuilder.stack, hasLength(1)); | 1175 expect(_astBuilder.stack, hasLength(1)); |
793 return _astBuilder.pop(); | 1176 return _astBuilder.pop(); |
794 } | 1177 } |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1079 void test_parseTypeAlias_genericFunction_typeParameters_voidReturnType() { | 1462 void test_parseTypeAlias_genericFunction_typeParameters_voidReturnType() { |
1080 super.test_parseTypeAlias_genericFunction_typeParameters_voidReturnType(); | 1463 super.test_parseTypeAlias_genericFunction_typeParameters_voidReturnType(); |
1081 } | 1464 } |
1082 | 1465 |
1083 @override | 1466 @override |
1084 @failingTest | 1467 @failingTest |
1085 void test_parseTypeAlias_genericFunction_voidReturnType() { | 1468 void test_parseTypeAlias_genericFunction_voidReturnType() { |
1086 super.test_parseTypeAlias_genericFunction_voidReturnType(); | 1469 super.test_parseTypeAlias_genericFunction_voidReturnType(); |
1087 } | 1470 } |
1088 } | 1471 } |
OLD | NEW |