├── .flowconfig ├── .gitignore ├── LICENSE ├── README.md ├── gulpfile.js ├── lib └── types.js ├── package.json ├── scripts ├── build-types.js └── transform.js ├── src └── types.js └── tests ├── types-2-spec.js └── types-spec.js /.flowconfig: -------------------------------------------------------------------------------- 1 | [ignore] 2 | .*/node_modules/nuclide-node-transpiler/.* 3 | 4 | [options] 5 | module.system=haste 6 | suppress_type=$ExpectError 7 | suppress_comment=\\( \\)\\$ExpectError 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Kyle Davis 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ast-types-flow 2 | 3 | Flow types for the Javascript AST. Based off of [benjamn/ast-types](https://github.com/benjamn/ast-types). 4 | 5 | ## Usage 6 | 7 | First install `ast-types-flow` via npm, then you can import any of the types 8 | that are exported. 9 | 10 | ```javascript 11 | /* @flow */ 12 | 13 | import type {Node} from 'ast-types-flow'; 14 | 15 | function getName(node: Node): string { 16 | switch (node.type) { 17 | case 'Identifier': 18 | return node.name; 19 | 20 | case 'ClassDeclaration': 21 | return node.id.name; // Error, id could be null. 22 | 23 | case 'FunctionDeclaration': 24 | return node.id.name; // Fine if it's always there. 25 | 26 | case 'FunctionExpression': 27 | if (node.id) { 28 | return node.id.name; // Can refine id to make sure it exists. 29 | } else { 30 | return 'Unknown'; 31 | } 32 | 33 | case 'Literal': 34 | return node.name; // Error, Literals don't have names, don't be silly. 35 | } 36 | return 'Unknown'; 37 | } 38 | ``` 39 | 40 | ## How it works 41 | 42 | A notion of "extends" is added to the Flow syntax via comments. A transform is 43 | included that will compile the source code into useful disjoint union types 44 | based on how the different types extend each other. For example: 45 | 46 | ```javascript 47 | type Node = { 48 | common: string, 49 | }; 50 | 51 | type Foo = { 52 | // extends Node 53 | foo: string, 54 | }; 55 | 56 | type Bar = { 57 | // extends Node 58 | bar: number, 59 | }; 60 | ``` 61 | 62 | Will be transformed into: 63 | 64 | ```javascript 65 | type Node = { 66 | type: 'Foo', 67 | _Foo: void, 68 | common: string, 69 | foo: string, 70 | } | { 71 | type: 'Bar', 72 | _Bar: void, 73 | common: string, 74 | bar: number, 75 | }; 76 | 77 | type Foo = { 78 | type: 'Foo', 79 | _Foo: void, 80 | common: string, 81 | foo: string, 82 | }; 83 | 84 | type Bar = { 85 | type: 'Bar', 86 | _Foo: void, 87 | common: string, 88 | bar: number, 89 | }; 90 | ``` 91 | 92 | A few things to note: 93 | 94 | 1. The type `Node` would more ideally be compiled into `Foo | Bar` but then the 95 | disjoint union cannot be properly refined. For now we have to duplicate the 96 | complete definitions. 97 | 2. Each entry in a disjoint union has to be structurally unique or Flow will 98 | have an error on the definition. That is why the private `_Foo: void` fields 99 | appear in the types. 100 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var gulp = require('gulp'); 4 | var buildTypes = require('./scripts/build-types'); 5 | 6 | gulp.task('build', function() { 7 | return gulp 8 | .src(['./src/types.js']) 9 | .pipe(buildTypes) 10 | .pipe(gulp.dest('./lib/')); 11 | }); 12 | 13 | gulp.task('default', ['build']); 14 | -------------------------------------------------------------------------------- /lib/types.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @flow 3 | */ 4 | 5 | 'use strict'; 6 | 7 | /* 8 | * Flow types for the Babylon AST. 9 | */ 10 | 11 | // Abstract types. Something must extend these. 12 | 13 | export type Comment = { 14 | type: 'CommentLine', 15 | _CommentLine?: void, 16 | value: string, 17 | end: number, 18 | loc: { 19 | end: {column: number, line: number}, 20 | start: {column: number, line: number}, 21 | }, 22 | start: number, 23 | } | { 24 | type: 'CommentBlock', 25 | _CommentBlock?: void, 26 | value: string, 27 | end: number, 28 | loc: { 29 | end: {column: number, line: number}, 30 | start: {column: number, line: number}, 31 | }, 32 | start: number, 33 | }; 34 | 35 | export type Declaration = { 36 | type: 'ClassBody', 37 | _ClassBody?: void, 38 | body: Array, 39 | end: number, 40 | innerComments: ?Array, 41 | leadingComments: ?Array, 42 | loc: { 43 | end: {column: number, line: number}, 44 | start: {column: number, line: number}, 45 | }, 46 | start: number, 47 | trailingComments: ?Array, 48 | } | { 49 | type: 'ClassDeclaration', 50 | _ClassDeclaration?: void, 51 | body: ClassBody, 52 | id: ?Identifier, 53 | superClass: ?Expression, 54 | decorators: any, 55 | superTypeParameters: any, 56 | typeParameters: any, 57 | end: number, 58 | innerComments: ?Array, 59 | leadingComments: ?Array, 60 | loc: { 61 | end: {column: number, line: number}, 62 | start: {column: number, line: number}, 63 | }, 64 | start: number, 65 | trailingComments: ?Array, 66 | } | { 67 | type: 'FunctionDeclaration', 68 | _FunctionDeclaration?: void, 69 | body: BlockStatement, 70 | id: Identifier, 71 | end: number, 72 | innerComments: ?Array, 73 | leadingComments: ?Array, 74 | loc: { 75 | end: {column: number, line: number}, 76 | start: {column: number, line: number}, 77 | }, 78 | start: number, 79 | trailingComments: ?Array, 80 | async: boolean, 81 | defaults: Array, 82 | expression: boolean, 83 | generator: boolean, 84 | params: Array, 85 | rest: ?Identifier, 86 | returnType: ?TypeAnnotation, 87 | typeParameters: ?TypeParameterDeclaration, 88 | } | { 89 | type: 'MethodDefinition', 90 | _MethodDefinition?: void, 91 | computed: boolean, 92 | key: Node, 93 | kind: 'constructor' | 'method' | 'get' | 'set', 94 | static: boolean, 95 | value: FunctionExpression, 96 | decorators: ?Array, 97 | end: number, 98 | innerComments: ?Array, 99 | leadingComments: ?Array, 100 | loc: { 101 | end: {column: number, line: number}, 102 | start: {column: number, line: number}, 103 | }, 104 | start: number, 105 | trailingComments: ?Array, 106 | } | { 107 | type: 'VariableDeclaration', 108 | _VariableDeclaration?: void, 109 | declarations: Array, 110 | kind: 'var' | 'let' | 'const', 111 | end: number, 112 | innerComments: ?Array, 113 | leadingComments: ?Array, 114 | loc: { 115 | end: {column: number, line: number}, 116 | start: {column: number, line: number}, 117 | }, 118 | start: number, 119 | trailingComments: ?Array, 120 | } | { 121 | type: 'ClassProperty', 122 | _ClassProperty?: void, 123 | computed: boolean, 124 | key: Node, 125 | static: boolean, 126 | typeAnnotation: ?TypeAnnotation, 127 | value: ?Expression, 128 | decorators: Array, 129 | end: number, 130 | innerComments: ?Array, 131 | leadingComments: ?Array, 132 | loc: { 133 | end: {column: number, line: number}, 134 | start: {column: number, line: number}, 135 | }, 136 | start: number, 137 | trailingComments: ?Array, 138 | }; 139 | 140 | export type Expression = { 141 | type: 'ArrayExpression', 142 | _ArrayExpression?: void, 143 | elements: Array, 144 | end: number, 145 | innerComments: ?Array, 146 | leadingComments: ?Array, 147 | loc: { 148 | end: {column: number, line: number}, 149 | start: {column: number, line: number}, 150 | }, 151 | start: number, 152 | trailingComments: ?Array, 153 | } | { 154 | type: 'AssignmentExpression', 155 | _AssignmentExpression?: void, 156 | left: Pattern, 157 | operator: AssignmentOperator, 158 | right: Expression, 159 | end: number, 160 | innerComments: ?Array, 161 | leadingComments: ?Array, 162 | loc: { 163 | end: {column: number, line: number}, 164 | start: {column: number, line: number}, 165 | }, 166 | start: number, 167 | trailingComments: ?Array, 168 | } | { 169 | type: 'AwaitExpression', 170 | _AwaitExpression?: void, 171 | all: boolean, 172 | argument: ?Expression, 173 | end: number, 174 | innerComments: ?Array, 175 | leadingComments: ?Array, 176 | loc: { 177 | end: {column: number, line: number}, 178 | start: {column: number, line: number}, 179 | }, 180 | start: number, 181 | trailingComments: ?Array, 182 | } | { 183 | type: 'BinaryExpression', 184 | _BinaryExpression?: void, 185 | left: Expression, 186 | operator: BinaryOperator, 187 | right: Expression, 188 | end: number, 189 | innerComments: ?Array, 190 | leadingComments: ?Array, 191 | loc: { 192 | end: {column: number, line: number}, 193 | start: {column: number, line: number}, 194 | }, 195 | start: number, 196 | trailingComments: ?Array, 197 | } | { 198 | type: 'BindExpression', 199 | _BindExpression?: void, 200 | callee: Node, 201 | object: Node, 202 | end: number, 203 | innerComments: ?Array, 204 | leadingComments: ?Array, 205 | loc: { 206 | end: {column: number, line: number}, 207 | start: {column: number, line: number}, 208 | }, 209 | start: number, 210 | trailingComments: ?Array, 211 | } | { 212 | type: 'CallExpression', 213 | _CallExpression?: void, 214 | arguments: Array, 215 | callee: Expression, 216 | end: number, 217 | innerComments: ?Array, 218 | leadingComments: ?Array, 219 | loc: { 220 | end: {column: number, line: number}, 221 | start: {column: number, line: number}, 222 | }, 223 | start: number, 224 | trailingComments: ?Array, 225 | } | { 226 | type: 'ClassExpression', 227 | _ClassExpression?: void, 228 | body: ClassBody, 229 | id: ?Identifier, 230 | superClass: ?Expression, 231 | decorators: any, 232 | superTypeParameters: any, 233 | typeParameters: any, 234 | end: number, 235 | innerComments: ?Array, 236 | leadingComments: ?Array, 237 | loc: { 238 | end: {column: number, line: number}, 239 | start: {column: number, line: number}, 240 | }, 241 | start: number, 242 | trailingComments: ?Array, 243 | } | { 244 | type: 'ComprehensionExpression', 245 | _ComprehensionExpression?: void, 246 | body: Expression, 247 | blocks: Array, 248 | filter: ?Expression, 249 | end: number, 250 | innerComments: ?Array, 251 | leadingComments: ?Array, 252 | loc: { 253 | end: {column: number, line: number}, 254 | start: {column: number, line: number}, 255 | }, 256 | start: number, 257 | trailingComments: ?Array, 258 | } | { 259 | type: 'ConditionalExpression', 260 | _ConditionalExpression?: void, 261 | alternate: Expression, 262 | consequent: Expression, 263 | test: Expression, 264 | end: number, 265 | innerComments: ?Array, 266 | leadingComments: ?Array, 267 | loc: { 268 | end: {column: number, line: number}, 269 | start: {column: number, line: number}, 270 | }, 271 | start: number, 272 | trailingComments: ?Array, 273 | } | { 274 | type: 'DoExpression', 275 | _DoExpression?: void, 276 | body: Statement, 277 | end: number, 278 | innerComments: ?Array, 279 | leadingComments: ?Array, 280 | loc: { 281 | end: {column: number, line: number}, 282 | start: {column: number, line: number}, 283 | }, 284 | start: number, 285 | trailingComments: ?Array, 286 | } | { 287 | type: 'FunctionExpression', 288 | _FunctionExpression?: void, 289 | body: BlockStatement, 290 | id: ?Identifier, 291 | end: number, 292 | innerComments: ?Array, 293 | leadingComments: ?Array, 294 | loc: { 295 | end: {column: number, line: number}, 296 | start: {column: number, line: number}, 297 | }, 298 | start: number, 299 | trailingComments: ?Array, 300 | async: boolean, 301 | defaults: Array, 302 | expression: boolean, 303 | generator: boolean, 304 | params: Array, 305 | rest: ?Identifier, 306 | returnType: ?TypeAnnotation, 307 | typeParameters: ?TypeParameterDeclaration, 308 | } | { 309 | type: 'Identifier', 310 | _Identifier?: void, 311 | name: string, 312 | typeAnnotation: ?TypeAnnotation, 313 | end: number, 314 | innerComments: ?Array, 315 | leadingComments: ?Array, 316 | loc: { 317 | end: {column: number, line: number}, 318 | start: {column: number, line: number}, 319 | }, 320 | start: number, 321 | trailingComments: ?Array, 322 | } | { 323 | type: 'Literal', 324 | _Literal?: void, 325 | raw: string, 326 | regex: ?{pattern: string, flags: string}, 327 | value: ?(string | boolean | number | RegExp), 328 | end: number, 329 | innerComments: ?Array, 330 | leadingComments: ?Array, 331 | loc: { 332 | end: {column: number, line: number}, 333 | start: {column: number, line: number}, 334 | }, 335 | start: number, 336 | trailingComments: ?Array, 337 | } | { 338 | type: 'LogicalExpression', 339 | _LogicalExpression?: void, 340 | left: Expression, 341 | operator: LogicalOperator, 342 | right: Expression, 343 | end: number, 344 | innerComments: ?Array, 345 | leadingComments: ?Array, 346 | loc: { 347 | end: {column: number, line: number}, 348 | start: {column: number, line: number}, 349 | }, 350 | start: number, 351 | trailingComments: ?Array, 352 | } | { 353 | type: 'MemberExpression', 354 | _MemberExpression?: void, 355 | computed: boolean, 356 | object: Expression, 357 | property: Node, 358 | end: number, 359 | innerComments: ?Array, 360 | leadingComments: ?Array, 361 | loc: { 362 | end: {column: number, line: number}, 363 | start: {column: number, line: number}, 364 | }, 365 | start: number, 366 | trailingComments: ?Array, 367 | } | { 368 | type: 'NewExpression', 369 | _NewExpression?: void, 370 | arguments: Array, 371 | callee: Expression, 372 | end: number, 373 | innerComments: ?Array, 374 | leadingComments: ?Array, 375 | loc: { 376 | end: {column: number, line: number}, 377 | start: {column: number, line: number}, 378 | }, 379 | start: number, 380 | trailingComments: ?Array, 381 | } | { 382 | type: 'ObjectExpression', 383 | _ObjectExpression?: void, 384 | properties: Array, 385 | end: number, 386 | innerComments: ?Array, 387 | leadingComments: ?Array, 388 | loc: { 389 | end: {column: number, line: number}, 390 | start: {column: number, line: number}, 391 | }, 392 | start: number, 393 | trailingComments: ?Array, 394 | } | { 395 | type: 'SequenceExpression', 396 | _SequenceExpression?: void, 397 | expression: Array, 398 | end: number, 399 | innerComments: ?Array, 400 | leadingComments: ?Array, 401 | loc: { 402 | end: {column: number, line: number}, 403 | start: {column: number, line: number}, 404 | }, 405 | start: number, 406 | trailingComments: ?Array, 407 | } | { 408 | type: 'TaggedTemplateExpression', 409 | _TaggedTemplateExpression?: void, 410 | quasi: TemplateLiteral, 411 | tag: Expression, 412 | end: number, 413 | innerComments: ?Array, 414 | leadingComments: ?Array, 415 | loc: { 416 | end: {column: number, line: number}, 417 | start: {column: number, line: number}, 418 | }, 419 | start: number, 420 | trailingComments: ?Array, 421 | } | { 422 | type: 'TemplateLiteral', 423 | _TemplateLiteral?: void, 424 | expressions: Array, 425 | quasis: Array, 426 | end: number, 427 | innerComments: ?Array, 428 | leadingComments: ?Array, 429 | loc: { 430 | end: {column: number, line: number}, 431 | start: {column: number, line: number}, 432 | }, 433 | start: number, 434 | trailingComments: ?Array, 435 | } | { 436 | type: 'ThisExpression', 437 | _ThisExpression?: void, 438 | end: number, 439 | innerComments: ?Array, 440 | leadingComments: ?Array, 441 | loc: { 442 | end: {column: number, line: number}, 443 | start: {column: number, line: number}, 444 | }, 445 | start: number, 446 | trailingComments: ?Array, 447 | } | { 448 | type: 'UnaryExpression', 449 | _UnaryExpression?: void, 450 | argument: Expression, 451 | operator: UnaryOperator, 452 | prefix: true, 453 | end: number, 454 | innerComments: ?Array, 455 | leadingComments: ?Array, 456 | loc: { 457 | end: {column: number, line: number}, 458 | start: {column: number, line: number}, 459 | }, 460 | start: number, 461 | trailingComments: ?Array, 462 | } | { 463 | type: 'UpdateExpression', 464 | _UpdateExpression?: void, 465 | argument: Expression, 466 | operator: UpdateOperator, 467 | prefix: boolean, 468 | end: number, 469 | innerComments: ?Array, 470 | leadingComments: ?Array, 471 | loc: { 472 | end: {column: number, line: number}, 473 | start: {column: number, line: number}, 474 | }, 475 | start: number, 476 | trailingComments: ?Array, 477 | } | { 478 | type: 'YieldExpression', 479 | _YieldExpression?: void, 480 | argument: ?Expression, 481 | delegate: boolean, 482 | end: number, 483 | innerComments: ?Array, 484 | leadingComments: ?Array, 485 | loc: { 486 | end: {column: number, line: number}, 487 | start: {column: number, line: number}, 488 | }, 489 | start: number, 490 | trailingComments: ?Array, 491 | } | { 492 | type: 'TypeCastExpression', 493 | _TypeCastExpression?: void, 494 | expression: Expression, 495 | typeAnnotation: TypeAnnotation, 496 | end: number, 497 | innerComments: ?Array, 498 | leadingComments: ?Array, 499 | loc: { 500 | end: {column: number, line: number}, 501 | start: {column: number, line: number}, 502 | }, 503 | start: number, 504 | trailingComments: ?Array, 505 | } | { 506 | type: 'JSXElement', 507 | _JSXElement?: void, 508 | children: Array, 509 | closingElement: ?JSXClosingElement, 510 | openingElement: JSXOpeningElement, 511 | end: number, 512 | innerComments: ?Array, 513 | leadingComments: ?Array, 514 | loc: { 515 | end: {column: number, line: number}, 516 | start: {column: number, line: number}, 517 | }, 518 | start: number, 519 | trailingComments: ?Array, 520 | } | { 521 | type: 'JSXEmptyExpression', 522 | _JSXEmptyExpression?: void, 523 | end: number, 524 | innerComments: ?Array, 525 | leadingComments: ?Array, 526 | loc: { 527 | end: {column: number, line: number}, 528 | start: {column: number, line: number}, 529 | }, 530 | start: number, 531 | trailingComments: ?Array, 532 | } | { 533 | type: 'JSXExpressionContainer', 534 | _JSXExpressionContainer?: void, 535 | expression: Expression, 536 | end: number, 537 | innerComments: ?Array, 538 | leadingComments: ?Array, 539 | loc: { 540 | end: {column: number, line: number}, 541 | start: {column: number, line: number}, 542 | }, 543 | start: number, 544 | trailingComments: ?Array, 545 | } | { 546 | type: 'JSXMemberExpression', 547 | _JSXMemberExpression?: void, 548 | computed: boolean, 549 | object: Node, 550 | property: JSXIdentifier, 551 | end: number, 552 | innerComments: ?Array, 553 | leadingComments: ?Array, 554 | loc: { 555 | end: {column: number, line: number}, 556 | start: {column: number, line: number}, 557 | }, 558 | start: number, 559 | trailingComments: ?Array, 560 | }; 561 | 562 | export type Function = { 563 | type: 'ArrowFunctionExpression', 564 | _ArrowFunctionExpression?: void, 565 | body: Node, 566 | id: ?Identifier, 567 | end: number, 568 | innerComments: ?Array, 569 | leadingComments: ?Array, 570 | loc: { 571 | end: {column: number, line: number}, 572 | start: {column: number, line: number}, 573 | }, 574 | start: number, 575 | trailingComments: ?Array, 576 | async: boolean, 577 | defaults: Array, 578 | expression: boolean, 579 | generator: boolean, 580 | params: Array, 581 | rest: ?Identifier, 582 | returnType: ?TypeAnnotation, 583 | typeParameters: ?TypeParameterDeclaration, 584 | } | { 585 | type: 'FunctionDeclaration', 586 | _FunctionDeclaration?: void, 587 | body: BlockStatement, 588 | id: Identifier, 589 | end: number, 590 | innerComments: ?Array, 591 | leadingComments: ?Array, 592 | loc: { 593 | end: {column: number, line: number}, 594 | start: {column: number, line: number}, 595 | }, 596 | start: number, 597 | trailingComments: ?Array, 598 | async: boolean, 599 | defaults: Array, 600 | expression: boolean, 601 | generator: boolean, 602 | params: Array, 603 | rest: ?Identifier, 604 | returnType: ?TypeAnnotation, 605 | typeParameters: ?TypeParameterDeclaration, 606 | } | { 607 | type: 'FunctionExpression', 608 | _FunctionExpression?: void, 609 | body: BlockStatement, 610 | id: ?Identifier, 611 | end: number, 612 | innerComments: ?Array, 613 | leadingComments: ?Array, 614 | loc: { 615 | end: {column: number, line: number}, 616 | start: {column: number, line: number}, 617 | }, 618 | start: number, 619 | trailingComments: ?Array, 620 | async: boolean, 621 | defaults: Array, 622 | expression: boolean, 623 | generator: boolean, 624 | params: Array, 625 | rest: ?Identifier, 626 | returnType: ?TypeAnnotation, 627 | typeParameters: ?TypeParameterDeclaration, 628 | }; 629 | 630 | export type Node = { 631 | type: 'ArrayExpression', 632 | _ArrayExpression?: void, 633 | elements: Array, 634 | end: number, 635 | innerComments: ?Array, 636 | leadingComments: ?Array, 637 | loc: { 638 | end: {column: number, line: number}, 639 | start: {column: number, line: number}, 640 | }, 641 | start: number, 642 | trailingComments: ?Array, 643 | } | { 644 | type: 'ArrayPattern', 645 | _ArrayPattern?: void, 646 | elements: Array, 647 | typeAnnotation: ?TypeAnnotation, 648 | end: number, 649 | innerComments: ?Array, 650 | leadingComments: ?Array, 651 | loc: { 652 | end: {column: number, line: number}, 653 | start: {column: number, line: number}, 654 | }, 655 | start: number, 656 | trailingComments: ?Array, 657 | } | { 658 | type: 'ArrowFunctionExpression', 659 | _ArrowFunctionExpression?: void, 660 | body: Node, 661 | id: ?Identifier, 662 | end: number, 663 | innerComments: ?Array, 664 | leadingComments: ?Array, 665 | loc: { 666 | end: {column: number, line: number}, 667 | start: {column: number, line: number}, 668 | }, 669 | start: number, 670 | trailingComments: ?Array, 671 | async: boolean, 672 | defaults: Array, 673 | expression: boolean, 674 | generator: boolean, 675 | params: Array, 676 | rest: ?Identifier, 677 | returnType: ?TypeAnnotation, 678 | typeParameters: ?TypeParameterDeclaration, 679 | } | { 680 | type: 'AssignmentExpression', 681 | _AssignmentExpression?: void, 682 | left: Pattern, 683 | operator: AssignmentOperator, 684 | right: Expression, 685 | end: number, 686 | innerComments: ?Array, 687 | leadingComments: ?Array, 688 | loc: { 689 | end: {column: number, line: number}, 690 | start: {column: number, line: number}, 691 | }, 692 | start: number, 693 | trailingComments: ?Array, 694 | } | { 695 | type: 'AssignmentPattern', 696 | _AssignmentPattern?: void, 697 | left: Pattern, 698 | right: Expression, 699 | end: number, 700 | innerComments: ?Array, 701 | leadingComments: ?Array, 702 | loc: { 703 | end: {column: number, line: number}, 704 | start: {column: number, line: number}, 705 | }, 706 | start: number, 707 | trailingComments: ?Array, 708 | } | { 709 | type: 'AwaitExpression', 710 | _AwaitExpression?: void, 711 | all: boolean, 712 | argument: ?Expression, 713 | end: number, 714 | innerComments: ?Array, 715 | leadingComments: ?Array, 716 | loc: { 717 | end: {column: number, line: number}, 718 | start: {column: number, line: number}, 719 | }, 720 | start: number, 721 | trailingComments: ?Array, 722 | } | { 723 | type: 'BinaryExpression', 724 | _BinaryExpression?: void, 725 | left: Expression, 726 | operator: BinaryOperator, 727 | right: Expression, 728 | end: number, 729 | innerComments: ?Array, 730 | leadingComments: ?Array, 731 | loc: { 732 | end: {column: number, line: number}, 733 | start: {column: number, line: number}, 734 | }, 735 | start: number, 736 | trailingComments: ?Array, 737 | } | { 738 | type: 'BindExpression', 739 | _BindExpression?: void, 740 | callee: Node, 741 | object: Node, 742 | end: number, 743 | innerComments: ?Array, 744 | leadingComments: ?Array, 745 | loc: { 746 | end: {column: number, line: number}, 747 | start: {column: number, line: number}, 748 | }, 749 | start: number, 750 | trailingComments: ?Array, 751 | } | { 752 | type: 'BlockStatement', 753 | _BlockStatement?: void, 754 | body: Array, 755 | end: number, 756 | innerComments: ?Array, 757 | leadingComments: ?Array, 758 | loc: { 759 | end: {column: number, line: number}, 760 | start: {column: number, line: number}, 761 | }, 762 | start: number, 763 | trailingComments: ?Array, 764 | } | { 765 | type: 'BreakStatement', 766 | _BreakStatement?: void, 767 | label: ?Identifier, 768 | end: number, 769 | innerComments: ?Array, 770 | leadingComments: ?Array, 771 | loc: { 772 | end: {column: number, line: number}, 773 | start: {column: number, line: number}, 774 | }, 775 | start: number, 776 | trailingComments: ?Array, 777 | } | { 778 | type: 'CallExpression', 779 | _CallExpression?: void, 780 | arguments: Array, 781 | callee: Expression, 782 | end: number, 783 | innerComments: ?Array, 784 | leadingComments: ?Array, 785 | loc: { 786 | end: {column: number, line: number}, 787 | start: {column: number, line: number}, 788 | }, 789 | start: number, 790 | trailingComments: ?Array, 791 | } | { 792 | type: 'CatchClause', 793 | _CatchClause?: void, 794 | body: BlockStatement, 795 | param: Pattern, 796 | end: number, 797 | innerComments: ?Array, 798 | leadingComments: ?Array, 799 | loc: { 800 | end: {column: number, line: number}, 801 | start: {column: number, line: number}, 802 | }, 803 | start: number, 804 | trailingComments: ?Array, 805 | } | { 806 | type: 'ClassBody', 807 | _ClassBody?: void, 808 | body: Array, 809 | end: number, 810 | innerComments: ?Array, 811 | leadingComments: ?Array, 812 | loc: { 813 | end: {column: number, line: number}, 814 | start: {column: number, line: number}, 815 | }, 816 | start: number, 817 | trailingComments: ?Array, 818 | } | { 819 | type: 'ClassDeclaration', 820 | _ClassDeclaration?: void, 821 | body: ClassBody, 822 | id: ?Identifier, 823 | superClass: ?Expression, 824 | decorators: any, 825 | superTypeParameters: any, 826 | typeParameters: any, 827 | end: number, 828 | innerComments: ?Array, 829 | leadingComments: ?Array, 830 | loc: { 831 | end: {column: number, line: number}, 832 | start: {column: number, line: number}, 833 | }, 834 | start: number, 835 | trailingComments: ?Array, 836 | } | { 837 | type: 'ClassExpression', 838 | _ClassExpression?: void, 839 | body: ClassBody, 840 | id: ?Identifier, 841 | superClass: ?Expression, 842 | decorators: any, 843 | superTypeParameters: any, 844 | typeParameters: any, 845 | end: number, 846 | innerComments: ?Array, 847 | leadingComments: ?Array, 848 | loc: { 849 | end: {column: number, line: number}, 850 | start: {column: number, line: number}, 851 | }, 852 | start: number, 853 | trailingComments: ?Array, 854 | } | { 855 | type: 'ComprehensionBlock', 856 | _ComprehensionBlock?: void, 857 | each: boolean, 858 | left: Pattern, 859 | right: Expression, 860 | end: number, 861 | innerComments: ?Array, 862 | leadingComments: ?Array, 863 | loc: { 864 | end: {column: number, line: number}, 865 | start: {column: number, line: number}, 866 | }, 867 | start: number, 868 | trailingComments: ?Array, 869 | } | { 870 | type: 'ComprehensionExpression', 871 | _ComprehensionExpression?: void, 872 | body: Expression, 873 | blocks: Array, 874 | filter: ?Expression, 875 | end: number, 876 | innerComments: ?Array, 877 | leadingComments: ?Array, 878 | loc: { 879 | end: {column: number, line: number}, 880 | start: {column: number, line: number}, 881 | }, 882 | start: number, 883 | trailingComments: ?Array, 884 | } | { 885 | type: 'ConditionalExpression', 886 | _ConditionalExpression?: void, 887 | alternate: Expression, 888 | consequent: Expression, 889 | test: Expression, 890 | end: number, 891 | innerComments: ?Array, 892 | leadingComments: ?Array, 893 | loc: { 894 | end: {column: number, line: number}, 895 | start: {column: number, line: number}, 896 | }, 897 | start: number, 898 | trailingComments: ?Array, 899 | } | { 900 | type: 'ContinueStatement', 901 | _ContinueStatement?: void, 902 | label: ?Identifier, 903 | end: number, 904 | innerComments: ?Array, 905 | leadingComments: ?Array, 906 | loc: { 907 | end: {column: number, line: number}, 908 | start: {column: number, line: number}, 909 | }, 910 | start: number, 911 | trailingComments: ?Array, 912 | } | { 913 | type: 'Decorator', 914 | _Decorator?: void, 915 | expression: Expression, 916 | end: number, 917 | innerComments: ?Array, 918 | leadingComments: ?Array, 919 | loc: { 920 | end: {column: number, line: number}, 921 | start: {column: number, line: number}, 922 | }, 923 | start: number, 924 | trailingComments: ?Array, 925 | } | { 926 | type: 'DebuggerStatement', 927 | _DebuggerStatement?: void, 928 | end: number, 929 | innerComments: ?Array, 930 | leadingComments: ?Array, 931 | loc: { 932 | end: {column: number, line: number}, 933 | start: {column: number, line: number}, 934 | }, 935 | start: number, 936 | trailingComments: ?Array, 937 | } | { 938 | type: 'DoWhileStatement', 939 | _DoWhileStatement?: void, 940 | body: Statement, 941 | test: Expression, 942 | end: number, 943 | innerComments: ?Array, 944 | leadingComments: ?Array, 945 | loc: { 946 | end: {column: number, line: number}, 947 | start: {column: number, line: number}, 948 | }, 949 | start: number, 950 | trailingComments: ?Array, 951 | } | { 952 | type: 'DoExpression', 953 | _DoExpression?: void, 954 | body: Statement, 955 | end: number, 956 | innerComments: ?Array, 957 | leadingComments: ?Array, 958 | loc: { 959 | end: {column: number, line: number}, 960 | start: {column: number, line: number}, 961 | }, 962 | start: number, 963 | trailingComments: ?Array, 964 | } | { 965 | type: 'EmptyStatement', 966 | _EmptyStatement?: void, 967 | end: number, 968 | innerComments: ?Array, 969 | leadingComments: ?Array, 970 | loc: { 971 | end: {column: number, line: number}, 972 | start: {column: number, line: number}, 973 | }, 974 | start: number, 975 | trailingComments: ?Array, 976 | } | { 977 | type: 'ExpressionStatement', 978 | _ExpressionStatement?: void, 979 | expression: Expression, 980 | end: number, 981 | innerComments: ?Array, 982 | leadingComments: ?Array, 983 | loc: { 984 | end: {column: number, line: number}, 985 | start: {column: number, line: number}, 986 | }, 987 | start: number, 988 | trailingComments: ?Array, 989 | } | { 990 | type: 'File', 991 | _File?: void, 992 | program: Program, 993 | end: number, 994 | innerComments: ?Array, 995 | leadingComments: ?Array, 996 | loc: { 997 | end: {column: number, line: number}, 998 | start: {column: number, line: number}, 999 | }, 1000 | start: number, 1001 | trailingComments: ?Array, 1002 | } | { 1003 | type: 'ForInStatement', 1004 | _ForInStatement?: void, 1005 | body: Statement, 1006 | left: Node, 1007 | right: Expression, 1008 | end: number, 1009 | innerComments: ?Array, 1010 | leadingComments: ?Array, 1011 | loc: { 1012 | end: {column: number, line: number}, 1013 | start: {column: number, line: number}, 1014 | }, 1015 | start: number, 1016 | trailingComments: ?Array, 1017 | } | { 1018 | type: 'ForOfStatement', 1019 | _ForOfStatement?: void, 1020 | body: Statement, 1021 | left: Node, 1022 | right: Expression, 1023 | end: number, 1024 | innerComments: ?Array, 1025 | leadingComments: ?Array, 1026 | loc: { 1027 | end: {column: number, line: number}, 1028 | start: {column: number, line: number}, 1029 | }, 1030 | start: number, 1031 | trailingComments: ?Array, 1032 | } | { 1033 | type: 'ForStatement', 1034 | _ForStatement?: void, 1035 | init: ?Node, 1036 | test: ?Expression, 1037 | update: ?Expression, 1038 | body: Statement, 1039 | end: number, 1040 | innerComments: ?Array, 1041 | leadingComments: ?Array, 1042 | loc: { 1043 | end: {column: number, line: number}, 1044 | start: {column: number, line: number}, 1045 | }, 1046 | start: number, 1047 | trailingComments: ?Array, 1048 | } | { 1049 | type: 'FunctionDeclaration', 1050 | _FunctionDeclaration?: void, 1051 | body: BlockStatement, 1052 | id: Identifier, 1053 | end: number, 1054 | innerComments: ?Array, 1055 | leadingComments: ?Array, 1056 | loc: { 1057 | end: {column: number, line: number}, 1058 | start: {column: number, line: number}, 1059 | }, 1060 | start: number, 1061 | trailingComments: ?Array, 1062 | async: boolean, 1063 | defaults: Array, 1064 | expression: boolean, 1065 | generator: boolean, 1066 | params: Array, 1067 | rest: ?Identifier, 1068 | returnType: ?TypeAnnotation, 1069 | typeParameters: ?TypeParameterDeclaration, 1070 | } | { 1071 | type: 'FunctionExpression', 1072 | _FunctionExpression?: void, 1073 | body: BlockStatement, 1074 | id: ?Identifier, 1075 | end: number, 1076 | innerComments: ?Array, 1077 | leadingComments: ?Array, 1078 | loc: { 1079 | end: {column: number, line: number}, 1080 | start: {column: number, line: number}, 1081 | }, 1082 | start: number, 1083 | trailingComments: ?Array, 1084 | async: boolean, 1085 | defaults: Array, 1086 | expression: boolean, 1087 | generator: boolean, 1088 | params: Array, 1089 | rest: ?Identifier, 1090 | returnType: ?TypeAnnotation, 1091 | typeParameters: ?TypeParameterDeclaration, 1092 | } | { 1093 | type: 'Identifier', 1094 | _Identifier?: void, 1095 | name: string, 1096 | typeAnnotation: ?TypeAnnotation, 1097 | end: number, 1098 | innerComments: ?Array, 1099 | leadingComments: ?Array, 1100 | loc: { 1101 | end: {column: number, line: number}, 1102 | start: {column: number, line: number}, 1103 | }, 1104 | start: number, 1105 | trailingComments: ?Array, 1106 | } | { 1107 | type: 'IfStatement', 1108 | _IfStatement?: void, 1109 | alternate: ?Statement, 1110 | consequent: Statement, 1111 | test: Expression, 1112 | end: number, 1113 | innerComments: ?Array, 1114 | leadingComments: ?Array, 1115 | loc: { 1116 | end: {column: number, line: number}, 1117 | start: {column: number, line: number}, 1118 | }, 1119 | start: number, 1120 | trailingComments: ?Array, 1121 | } | { 1122 | type: 'ImportDefaultSpecifier', 1123 | _ImportDefaultSpecifier?: void, 1124 | local: Node, 1125 | end: number, 1126 | innerComments: ?Array, 1127 | leadingComments: ?Array, 1128 | loc: { 1129 | end: {column: number, line: number}, 1130 | start: {column: number, line: number}, 1131 | }, 1132 | start: number, 1133 | trailingComments: ?Array, 1134 | } | { 1135 | type: 'ImportNamespaceSpecifier', 1136 | _ImportNamespaceSpecifier?: void, 1137 | local: Node, 1138 | end: number, 1139 | innerComments: ?Array, 1140 | leadingComments: ?Array, 1141 | loc: { 1142 | end: {column: number, line: number}, 1143 | start: {column: number, line: number}, 1144 | }, 1145 | start: number, 1146 | trailingComments: ?Array, 1147 | } | { 1148 | type: 'ImportDeclaration', 1149 | _ImportDeclaration?: void, 1150 | specifiers: Array, 1151 | source: Literal, 1152 | end: number, 1153 | innerComments: ?Array, 1154 | leadingComments: ?Array, 1155 | loc: { 1156 | end: {column: number, line: number}, 1157 | start: {column: number, line: number}, 1158 | }, 1159 | start: number, 1160 | trailingComments: ?Array, 1161 | } | { 1162 | type: 'ImportSpecifier', 1163 | _ImportSpecifier?: void, 1164 | imported: Node, 1165 | local: Node, 1166 | end: number, 1167 | innerComments: ?Array, 1168 | leadingComments: ?Array, 1169 | loc: { 1170 | end: {column: number, line: number}, 1171 | start: {column: number, line: number}, 1172 | }, 1173 | start: number, 1174 | trailingComments: ?Array, 1175 | } | { 1176 | type: 'LabeledStatement', 1177 | _LabeledStatement?: void, 1178 | body: Statement, 1179 | label: Identifier, 1180 | end: number, 1181 | innerComments: ?Array, 1182 | leadingComments: ?Array, 1183 | loc: { 1184 | end: {column: number, line: number}, 1185 | start: {column: number, line: number}, 1186 | }, 1187 | start: number, 1188 | trailingComments: ?Array, 1189 | } | { 1190 | type: 'Literal', 1191 | _Literal?: void, 1192 | raw: string, 1193 | regex: ?{pattern: string, flags: string}, 1194 | value: ?(string | boolean | number | RegExp), 1195 | end: number, 1196 | innerComments: ?Array, 1197 | leadingComments: ?Array, 1198 | loc: { 1199 | end: {column: number, line: number}, 1200 | start: {column: number, line: number}, 1201 | }, 1202 | start: number, 1203 | trailingComments: ?Array, 1204 | } | { 1205 | type: 'LogicalExpression', 1206 | _LogicalExpression?: void, 1207 | left: Expression, 1208 | operator: LogicalOperator, 1209 | right: Expression, 1210 | end: number, 1211 | innerComments: ?Array, 1212 | leadingComments: ?Array, 1213 | loc: { 1214 | end: {column: number, line: number}, 1215 | start: {column: number, line: number}, 1216 | }, 1217 | start: number, 1218 | trailingComments: ?Array, 1219 | } | { 1220 | type: 'MemberExpression', 1221 | _MemberExpression?: void, 1222 | computed: boolean, 1223 | object: Expression, 1224 | property: Node, 1225 | end: number, 1226 | innerComments: ?Array, 1227 | leadingComments: ?Array, 1228 | loc: { 1229 | end: {column: number, line: number}, 1230 | start: {column: number, line: number}, 1231 | }, 1232 | start: number, 1233 | trailingComments: ?Array, 1234 | } | { 1235 | type: 'MetaProperty', 1236 | _MetaProperty?: void, 1237 | meta: Node, 1238 | property: Node, 1239 | end: number, 1240 | innerComments: ?Array, 1241 | leadingComments: ?Array, 1242 | loc: { 1243 | end: {column: number, line: number}, 1244 | start: {column: number, line: number}, 1245 | }, 1246 | start: number, 1247 | trailingComments: ?Array, 1248 | } | { 1249 | type: 'MethodDefinition', 1250 | _MethodDefinition?: void, 1251 | computed: boolean, 1252 | key: Node, 1253 | kind: 'constructor' | 'method' | 'get' | 'set', 1254 | static: boolean, 1255 | value: FunctionExpression, 1256 | decorators: ?Array, 1257 | end: number, 1258 | innerComments: ?Array, 1259 | leadingComments: ?Array, 1260 | loc: { 1261 | end: {column: number, line: number}, 1262 | start: {column: number, line: number}, 1263 | }, 1264 | start: number, 1265 | trailingComments: ?Array, 1266 | } | { 1267 | type: 'NewExpression', 1268 | _NewExpression?: void, 1269 | arguments: Array, 1270 | callee: Expression, 1271 | end: number, 1272 | innerComments: ?Array, 1273 | leadingComments: ?Array, 1274 | loc: { 1275 | end: {column: number, line: number}, 1276 | start: {column: number, line: number}, 1277 | }, 1278 | start: number, 1279 | trailingComments: ?Array, 1280 | } | { 1281 | type: 'Noop', 1282 | _Noop?: void, 1283 | end: number, 1284 | innerComments: ?Array, 1285 | leadingComments: ?Array, 1286 | loc: { 1287 | end: {column: number, line: number}, 1288 | start: {column: number, line: number}, 1289 | }, 1290 | start: number, 1291 | trailingComments: ?Array, 1292 | } | { 1293 | type: 'ObjectExpression', 1294 | _ObjectExpression?: void, 1295 | properties: Array, 1296 | end: number, 1297 | innerComments: ?Array, 1298 | leadingComments: ?Array, 1299 | loc: { 1300 | end: {column: number, line: number}, 1301 | start: {column: number, line: number}, 1302 | }, 1303 | start: number, 1304 | trailingComments: ?Array, 1305 | } | { 1306 | type: 'ObjectPattern', 1307 | _ObjectPattern?: void, 1308 | properties: Array, 1309 | typeAnnotation: ?TypeAnnotation, 1310 | end: number, 1311 | innerComments: ?Array, 1312 | leadingComments: ?Array, 1313 | loc: { 1314 | end: {column: number, line: number}, 1315 | start: {column: number, line: number}, 1316 | }, 1317 | start: number, 1318 | trailingComments: ?Array, 1319 | } | { 1320 | type: 'Program', 1321 | _Program?: void, 1322 | body: Array, 1323 | end: number, 1324 | innerComments: ?Array, 1325 | leadingComments: ?Array, 1326 | loc: { 1327 | end: {column: number, line: number}, 1328 | start: {column: number, line: number}, 1329 | }, 1330 | start: number, 1331 | trailingComments: ?Array, 1332 | } | { 1333 | type: 'Property', 1334 | _Property?: void, 1335 | computed: boolean, 1336 | key: Node, 1337 | kind: 'init' | 'get' | 'set', 1338 | method: boolean, 1339 | shorthand: boolean, 1340 | value: Node, 1341 | decorators: ?Array, 1342 | end: number, 1343 | innerComments: ?Array, 1344 | leadingComments: ?Array, 1345 | loc: { 1346 | end: {column: number, line: number}, 1347 | start: {column: number, line: number}, 1348 | }, 1349 | start: number, 1350 | trailingComments: ?Array, 1351 | } | { 1352 | type: 'RestElement', 1353 | _RestElement?: void, 1354 | argument: Pattern, 1355 | typeAnnotation: ?TypeAnnotation, 1356 | end: number, 1357 | innerComments: ?Array, 1358 | leadingComments: ?Array, 1359 | loc: { 1360 | end: {column: number, line: number}, 1361 | start: {column: number, line: number}, 1362 | }, 1363 | start: number, 1364 | trailingComments: ?Array, 1365 | } | { 1366 | type: 'ReturnStatement', 1367 | _ReturnStatement?: void, 1368 | argument: ?Expression, 1369 | end: number, 1370 | innerComments: ?Array, 1371 | leadingComments: ?Array, 1372 | loc: { 1373 | end: {column: number, line: number}, 1374 | start: {column: number, line: number}, 1375 | }, 1376 | start: number, 1377 | trailingComments: ?Array, 1378 | } | { 1379 | type: 'SequenceExpression', 1380 | _SequenceExpression?: void, 1381 | expression: Array, 1382 | end: number, 1383 | innerComments: ?Array, 1384 | leadingComments: ?Array, 1385 | loc: { 1386 | end: {column: number, line: number}, 1387 | start: {column: number, line: number}, 1388 | }, 1389 | start: number, 1390 | trailingComments: ?Array, 1391 | } | { 1392 | type: 'SpreadElement', 1393 | _SpreadElement?: void, 1394 | argument: Expression, 1395 | end: number, 1396 | innerComments: ?Array, 1397 | leadingComments: ?Array, 1398 | loc: { 1399 | end: {column: number, line: number}, 1400 | start: {column: number, line: number}, 1401 | }, 1402 | start: number, 1403 | trailingComments: ?Array, 1404 | } | { 1405 | type: 'SpreadProperty', 1406 | _SpreadProperty?: void, 1407 | argument: Expression, 1408 | end: number, 1409 | innerComments: ?Array, 1410 | leadingComments: ?Array, 1411 | loc: { 1412 | end: {column: number, line: number}, 1413 | start: {column: number, line: number}, 1414 | }, 1415 | start: number, 1416 | trailingComments: ?Array, 1417 | } | { 1418 | type: 'Super', 1419 | _Super?: void, 1420 | end: number, 1421 | innerComments: ?Array, 1422 | leadingComments: ?Array, 1423 | loc: { 1424 | end: {column: number, line: number}, 1425 | start: {column: number, line: number}, 1426 | }, 1427 | start: number, 1428 | trailingComments: ?Array, 1429 | } | { 1430 | type: 'SwitchCase', 1431 | _SwitchCase?: void, 1432 | consequent: Array, 1433 | test: ?Expression, 1434 | end: number, 1435 | innerComments: ?Array, 1436 | leadingComments: ?Array, 1437 | loc: { 1438 | end: {column: number, line: number}, 1439 | start: {column: number, line: number}, 1440 | }, 1441 | start: number, 1442 | trailingComments: ?Array, 1443 | } | { 1444 | type: 'SwitchStatement', 1445 | _SwitchStatement?: void, 1446 | cases: Array, 1447 | discriminant: Expression, 1448 | lexical: boolean, 1449 | end: number, 1450 | innerComments: ?Array, 1451 | leadingComments: ?Array, 1452 | loc: { 1453 | end: {column: number, line: number}, 1454 | start: {column: number, line: number}, 1455 | }, 1456 | start: number, 1457 | trailingComments: ?Array, 1458 | } | { 1459 | type: 'TaggedTemplateExpression', 1460 | _TaggedTemplateExpression?: void, 1461 | quasi: TemplateLiteral, 1462 | tag: Expression, 1463 | end: number, 1464 | innerComments: ?Array, 1465 | leadingComments: ?Array, 1466 | loc: { 1467 | end: {column: number, line: number}, 1468 | start: {column: number, line: number}, 1469 | }, 1470 | start: number, 1471 | trailingComments: ?Array, 1472 | } | { 1473 | type: 'TemplateElement', 1474 | _TemplateElement?: void, 1475 | tail: boolean, 1476 | value: {cooked: string, raw: string}, 1477 | end: number, 1478 | innerComments: ?Array, 1479 | leadingComments: ?Array, 1480 | loc: { 1481 | end: {column: number, line: number}, 1482 | start: {column: number, line: number}, 1483 | }, 1484 | start: number, 1485 | trailingComments: ?Array, 1486 | } | { 1487 | type: 'TemplateLiteral', 1488 | _TemplateLiteral?: void, 1489 | expressions: Array, 1490 | quasis: Array, 1491 | end: number, 1492 | innerComments: ?Array, 1493 | leadingComments: ?Array, 1494 | loc: { 1495 | end: {column: number, line: number}, 1496 | start: {column: number, line: number}, 1497 | }, 1498 | start: number, 1499 | trailingComments: ?Array, 1500 | } | { 1501 | type: 'ThisExpression', 1502 | _ThisExpression?: void, 1503 | end: number, 1504 | innerComments: ?Array, 1505 | leadingComments: ?Array, 1506 | loc: { 1507 | end: {column: number, line: number}, 1508 | start: {column: number, line: number}, 1509 | }, 1510 | start: number, 1511 | trailingComments: ?Array, 1512 | } | { 1513 | type: 'ThrowStatement', 1514 | _ThrowStatement?: void, 1515 | argument: Expression, 1516 | end: number, 1517 | innerComments: ?Array, 1518 | leadingComments: ?Array, 1519 | loc: { 1520 | end: {column: number, line: number}, 1521 | start: {column: number, line: number}, 1522 | }, 1523 | start: number, 1524 | trailingComments: ?Array, 1525 | } | { 1526 | type: 'TryStatement', 1527 | _TryStatement?: void, 1528 | block: BlockStatement, 1529 | finalizer: ?BlockStatement, 1530 | guardedHandlers: Array, 1531 | handler: ?CatchClause, 1532 | handlers: ?Array, 1533 | end: number, 1534 | innerComments: ?Array, 1535 | leadingComments: ?Array, 1536 | loc: { 1537 | end: {column: number, line: number}, 1538 | start: {column: number, line: number}, 1539 | }, 1540 | start: number, 1541 | trailingComments: ?Array, 1542 | } | { 1543 | type: 'UnaryExpression', 1544 | _UnaryExpression?: void, 1545 | argument: Expression, 1546 | operator: UnaryOperator, 1547 | prefix: true, 1548 | end: number, 1549 | innerComments: ?Array, 1550 | leadingComments: ?Array, 1551 | loc: { 1552 | end: {column: number, line: number}, 1553 | start: {column: number, line: number}, 1554 | }, 1555 | start: number, 1556 | trailingComments: ?Array, 1557 | } | { 1558 | type: 'UpdateExpression', 1559 | _UpdateExpression?: void, 1560 | argument: Expression, 1561 | operator: UpdateOperator, 1562 | prefix: boolean, 1563 | end: number, 1564 | innerComments: ?Array, 1565 | leadingComments: ?Array, 1566 | loc: { 1567 | end: {column: number, line: number}, 1568 | start: {column: number, line: number}, 1569 | }, 1570 | start: number, 1571 | trailingComments: ?Array, 1572 | } | { 1573 | type: 'VariableDeclaration', 1574 | _VariableDeclaration?: void, 1575 | declarations: Array, 1576 | kind: 'var' | 'let' | 'const', 1577 | end: number, 1578 | innerComments: ?Array, 1579 | leadingComments: ?Array, 1580 | loc: { 1581 | end: {column: number, line: number}, 1582 | start: {column: number, line: number}, 1583 | }, 1584 | start: number, 1585 | trailingComments: ?Array, 1586 | } | { 1587 | type: 'VariableDeclarator', 1588 | _VariableDeclarator?: void, 1589 | id: Pattern, 1590 | init: ?Expression, 1591 | end: number, 1592 | innerComments: ?Array, 1593 | leadingComments: ?Array, 1594 | loc: { 1595 | end: {column: number, line: number}, 1596 | start: {column: number, line: number}, 1597 | }, 1598 | start: number, 1599 | trailingComments: ?Array, 1600 | } | { 1601 | type: 'WhileStatement', 1602 | _WhileStatement?: void, 1603 | body: Statement, 1604 | test: Expression, 1605 | end: number, 1606 | innerComments: ?Array, 1607 | leadingComments: ?Array, 1608 | loc: { 1609 | end: {column: number, line: number}, 1610 | start: {column: number, line: number}, 1611 | }, 1612 | start: number, 1613 | trailingComments: ?Array, 1614 | } | { 1615 | type: 'WithStatement', 1616 | _WithStatement?: void, 1617 | body: Statement, 1618 | object: Expression, 1619 | end: number, 1620 | innerComments: ?Array, 1621 | leadingComments: ?Array, 1622 | loc: { 1623 | end: {column: number, line: number}, 1624 | start: {column: number, line: number}, 1625 | }, 1626 | start: number, 1627 | trailingComments: ?Array, 1628 | } | { 1629 | type: 'YieldExpression', 1630 | _YieldExpression?: void, 1631 | argument: ?Expression, 1632 | delegate: boolean, 1633 | end: number, 1634 | innerComments: ?Array, 1635 | leadingComments: ?Array, 1636 | loc: { 1637 | end: {column: number, line: number}, 1638 | start: {column: number, line: number}, 1639 | }, 1640 | start: number, 1641 | trailingComments: ?Array, 1642 | } | { 1643 | type: 'ExportAllDeclaration', 1644 | _ExportAllDeclaration?: void, 1645 | exported: Node, 1646 | source: Node, 1647 | end: number, 1648 | innerComments: ?Array, 1649 | leadingComments: ?Array, 1650 | loc: { 1651 | end: {column: number, line: number}, 1652 | start: {column: number, line: number}, 1653 | }, 1654 | start: number, 1655 | trailingComments: ?Array, 1656 | } | { 1657 | type: 'ExportDefaultDeclaration', 1658 | _ExportDefaultDeclaration?: void, 1659 | declaration: Node, 1660 | end: number, 1661 | innerComments: ?Array, 1662 | leadingComments: ?Array, 1663 | loc: { 1664 | end: {column: number, line: number}, 1665 | start: {column: number, line: number}, 1666 | }, 1667 | start: number, 1668 | trailingComments: ?Array, 1669 | } | { 1670 | type: 'ExportNamedDeclaration', 1671 | _ExportNamedDeclaration?: void, 1672 | declaration: Node, 1673 | source: Literal, 1674 | specifiers: Array, 1675 | end: number, 1676 | innerComments: ?Array, 1677 | leadingComments: ?Array, 1678 | loc: { 1679 | end: {column: number, line: number}, 1680 | start: {column: number, line: number}, 1681 | }, 1682 | start: number, 1683 | trailingComments: ?Array, 1684 | } | { 1685 | type: 'ExportDefaultSpecifier', 1686 | _ExportDefaultSpecifier?: void, 1687 | exported: Node, 1688 | end: number, 1689 | innerComments: ?Array, 1690 | leadingComments: ?Array, 1691 | loc: { 1692 | end: {column: number, line: number}, 1693 | start: {column: number, line: number}, 1694 | }, 1695 | start: number, 1696 | trailingComments: ?Array, 1697 | } | { 1698 | type: 'ExportNamespaceSpecifier', 1699 | _ExportNamespaceSpecifier?: void, 1700 | exported: Node, 1701 | end: number, 1702 | innerComments: ?Array, 1703 | leadingComments: ?Array, 1704 | loc: { 1705 | end: {column: number, line: number}, 1706 | start: {column: number, line: number}, 1707 | }, 1708 | start: number, 1709 | trailingComments: ?Array, 1710 | } | { 1711 | type: 'ExportSpecifier', 1712 | _ExportSpecifier?: void, 1713 | local: Node, 1714 | exported: Node, 1715 | end: number, 1716 | innerComments: ?Array, 1717 | leadingComments: ?Array, 1718 | loc: { 1719 | end: {column: number, line: number}, 1720 | start: {column: number, line: number}, 1721 | }, 1722 | start: number, 1723 | trailingComments: ?Array, 1724 | } | { 1725 | type: 'AnyTypeAnnotation', 1726 | _AnyTypeAnnotation?: void, 1727 | end: number, 1728 | innerComments: ?Array, 1729 | leadingComments: ?Array, 1730 | loc: { 1731 | end: {column: number, line: number}, 1732 | start: {column: number, line: number}, 1733 | }, 1734 | start: number, 1735 | trailingComments: ?Array, 1736 | } | { 1737 | type: 'ArrayTypeAnnotation', 1738 | _ArrayTypeAnnotation?: void, 1739 | elementType: Type, 1740 | end: number, 1741 | innerComments: ?Array, 1742 | leadingComments: ?Array, 1743 | loc: { 1744 | end: {column: number, line: number}, 1745 | start: {column: number, line: number}, 1746 | }, 1747 | start: number, 1748 | trailingComments: ?Array, 1749 | } | { 1750 | type: 'BooleanLiteralTypeAnnotation', 1751 | _BooleanLiteralTypeAnnotation?: void, 1752 | raw: string, 1753 | value: boolean, 1754 | end: number, 1755 | innerComments: ?Array, 1756 | leadingComments: ?Array, 1757 | loc: { 1758 | end: {column: number, line: number}, 1759 | start: {column: number, line: number}, 1760 | }, 1761 | start: number, 1762 | trailingComments: ?Array, 1763 | } | { 1764 | type: 'BooleanTypeAnnotation', 1765 | _BooleanTypeAnnotation?: void, 1766 | end: number, 1767 | innerComments: ?Array, 1768 | leadingComments: ?Array, 1769 | loc: { 1770 | end: {column: number, line: number}, 1771 | start: {column: number, line: number}, 1772 | }, 1773 | start: number, 1774 | trailingComments: ?Array, 1775 | } | { 1776 | type: 'ClassImplements', 1777 | _ClassImplements?: void, 1778 | id: Identifier, 1779 | typeParameters: ?TypeParameterInstantiation, 1780 | superClass: ?Expression, 1781 | end: number, 1782 | innerComments: ?Array, 1783 | leadingComments: ?Array, 1784 | loc: { 1785 | end: {column: number, line: number}, 1786 | start: {column: number, line: number}, 1787 | }, 1788 | start: number, 1789 | trailingComments: ?Array, 1790 | } | { 1791 | type: 'ClassProperty', 1792 | _ClassProperty?: void, 1793 | computed: boolean, 1794 | key: Node, 1795 | static: boolean, 1796 | typeAnnotation: ?TypeAnnotation, 1797 | value: ?Expression, 1798 | decorators: Array, 1799 | end: number, 1800 | innerComments: ?Array, 1801 | leadingComments: ?Array, 1802 | loc: { 1803 | end: {column: number, line: number}, 1804 | start: {column: number, line: number}, 1805 | }, 1806 | start: number, 1807 | trailingComments: ?Array, 1808 | } | { 1809 | type: 'DeclareClass', 1810 | _DeclareClass?: void, 1811 | body: ObjectTypeAnnotation, 1812 | extends: Array, 1813 | id: Identifier, 1814 | typeParameters: ?TypeParameterDeclaration, 1815 | end: number, 1816 | innerComments: ?Array, 1817 | leadingComments: ?Array, 1818 | loc: { 1819 | end: {column: number, line: number}, 1820 | start: {column: number, line: number}, 1821 | }, 1822 | start: number, 1823 | trailingComments: ?Array, 1824 | } | { 1825 | type: 'DeclareFunction', 1826 | _DeclareFunction?: void, 1827 | id: Identifier, 1828 | end: number, 1829 | innerComments: ?Array, 1830 | leadingComments: ?Array, 1831 | loc: { 1832 | end: {column: number, line: number}, 1833 | start: {column: number, line: number}, 1834 | }, 1835 | start: number, 1836 | trailingComments: ?Array, 1837 | } | { 1838 | type: 'DeclareModule', 1839 | _DeclareModule?: void, 1840 | body: BlockStatement, 1841 | id: Node, 1842 | end: number, 1843 | innerComments: ?Array, 1844 | leadingComments: ?Array, 1845 | loc: { 1846 | end: {column: number, line: number}, 1847 | start: {column: number, line: number}, 1848 | }, 1849 | start: number, 1850 | trailingComments: ?Array, 1851 | } | { 1852 | type: 'DeclareVariable', 1853 | _DeclareVariable?: void, 1854 | id: Identifier, 1855 | end: number, 1856 | innerComments: ?Array, 1857 | leadingComments: ?Array, 1858 | loc: { 1859 | end: {column: number, line: number}, 1860 | start: {column: number, line: number}, 1861 | }, 1862 | start: number, 1863 | trailingComments: ?Array, 1864 | } | { 1865 | type: 'FunctionTypeAnnotation', 1866 | _FunctionTypeAnnotation?: void, 1867 | params: Array, 1868 | rest: ?FunctionTypeParam, 1869 | returnType: Type, 1870 | typeParameters: ?TypeParameterDeclaration, 1871 | end: number, 1872 | innerComments: ?Array, 1873 | leadingComments: ?Array, 1874 | loc: { 1875 | end: {column: number, line: number}, 1876 | start: {column: number, line: number}, 1877 | }, 1878 | start: number, 1879 | trailingComments: ?Array, 1880 | } | { 1881 | type: 'FunctionTypeParam', 1882 | _FunctionTypeParam?: void, 1883 | name: Identifier, 1884 | optional: boolean, 1885 | typeAnnotation: Type, 1886 | end: number, 1887 | innerComments: ?Array, 1888 | leadingComments: ?Array, 1889 | loc: { 1890 | end: {column: number, line: number}, 1891 | start: {column: number, line: number}, 1892 | }, 1893 | start: number, 1894 | trailingComments: ?Array, 1895 | } | { 1896 | type: 'GenericTypeAnnotation', 1897 | _GenericTypeAnnotation?: void, 1898 | id: Node, 1899 | typeParameters: ?TypeParameterInstantiation, 1900 | end: number, 1901 | innerComments: ?Array, 1902 | leadingComments: ?Array, 1903 | loc: { 1904 | end: {column: number, line: number}, 1905 | start: {column: number, line: number}, 1906 | }, 1907 | start: number, 1908 | trailingComments: ?Array, 1909 | } | { 1910 | type: 'InterfaceExtends', 1911 | _InterfaceExtends?: void, 1912 | id: Identifier, 1913 | typeParameters: ?TypeParameterInstantiation, 1914 | end: number, 1915 | innerComments: ?Array, 1916 | leadingComments: ?Array, 1917 | loc: { 1918 | end: {column: number, line: number}, 1919 | start: {column: number, line: number}, 1920 | }, 1921 | start: number, 1922 | trailingComments: ?Array, 1923 | } | { 1924 | type: 'InterfaceDeclaration', 1925 | _InterfaceDeclaration?: void, 1926 | body: ObjectTypeAnnotation, 1927 | extends: Array, 1928 | id: Identifier, 1929 | typeParameters: ?TypeParameterDeclaration, 1930 | end: number, 1931 | innerComments: ?Array, 1932 | leadingComments: ?Array, 1933 | loc: { 1934 | end: {column: number, line: number}, 1935 | start: {column: number, line: number}, 1936 | }, 1937 | start: number, 1938 | trailingComments: ?Array, 1939 | } | { 1940 | type: 'IntersectionTypeAnnotation', 1941 | _IntersectionTypeAnnotation?: void, 1942 | types: Array, 1943 | end: number, 1944 | innerComments: ?Array, 1945 | leadingComments: ?Array, 1946 | loc: { 1947 | end: {column: number, line: number}, 1948 | start: {column: number, line: number}, 1949 | }, 1950 | start: number, 1951 | trailingComments: ?Array, 1952 | } | { 1953 | type: 'MixedTypeAnnotation', 1954 | _MixedTypeAnnotation?: void, 1955 | end: number, 1956 | innerComments: ?Array, 1957 | leadingComments: ?Array, 1958 | loc: { 1959 | end: {column: number, line: number}, 1960 | start: {column: number, line: number}, 1961 | }, 1962 | start: number, 1963 | trailingComments: ?Array, 1964 | } | { 1965 | type: 'NullableTypeAnnotation', 1966 | _NullableTypeAnnotation?: void, 1967 | typeAnnotation: Type, 1968 | end: number, 1969 | innerComments: ?Array, 1970 | leadingComments: ?Array, 1971 | loc: { 1972 | end: {column: number, line: number}, 1973 | start: {column: number, line: number}, 1974 | }, 1975 | start: number, 1976 | trailingComments: ?Array, 1977 | } | { 1978 | type: 'NumberLiteralTypeAnnotation', 1979 | _NumberLiteralTypeAnnotation?: void, 1980 | raw: string, 1981 | value: number, 1982 | end: number, 1983 | innerComments: ?Array, 1984 | leadingComments: ?Array, 1985 | loc: { 1986 | end: {column: number, line: number}, 1987 | start: {column: number, line: number}, 1988 | }, 1989 | start: number, 1990 | trailingComments: ?Array, 1991 | } | { 1992 | type: 'NumberTypeAnnotation', 1993 | _NumberTypeAnnotation?: void, 1994 | end: number, 1995 | innerComments: ?Array, 1996 | leadingComments: ?Array, 1997 | loc: { 1998 | end: {column: number, line: number}, 1999 | start: {column: number, line: number}, 2000 | }, 2001 | start: number, 2002 | trailingComments: ?Array, 2003 | } | { 2004 | type: 'StringLiteralTypeAnnotation', 2005 | _StringLiteralTypeAnnotation?: void, 2006 | raw: string, 2007 | value: string, 2008 | end: number, 2009 | innerComments: ?Array, 2010 | leadingComments: ?Array, 2011 | loc: { 2012 | end: {column: number, line: number}, 2013 | start: {column: number, line: number}, 2014 | }, 2015 | start: number, 2016 | trailingComments: ?Array, 2017 | } | { 2018 | type: 'StringTypeAnnotation', 2019 | _StringTypeAnnotation?: void, 2020 | end: number, 2021 | innerComments: ?Array, 2022 | leadingComments: ?Array, 2023 | loc: { 2024 | end: {column: number, line: number}, 2025 | start: {column: number, line: number}, 2026 | }, 2027 | start: number, 2028 | trailingComments: ?Array, 2029 | } | { 2030 | type: 'TupleTypeAnnotation', 2031 | _TupleTypeAnnotation?: void, 2032 | types: Array, 2033 | end: number, 2034 | innerComments: ?Array, 2035 | leadingComments: ?Array, 2036 | loc: { 2037 | end: {column: number, line: number}, 2038 | start: {column: number, line: number}, 2039 | }, 2040 | start: number, 2041 | trailingComments: ?Array, 2042 | } | { 2043 | type: 'TypeofTypeAnnotation', 2044 | _TypeofTypeAnnotation?: void, 2045 | argument: Type, 2046 | end: number, 2047 | innerComments: ?Array, 2048 | leadingComments: ?Array, 2049 | loc: { 2050 | end: {column: number, line: number}, 2051 | start: {column: number, line: number}, 2052 | }, 2053 | start: number, 2054 | trailingComments: ?Array, 2055 | } | { 2056 | type: 'TypeAlias', 2057 | _TypeAlias?: void, 2058 | id: Identifier, 2059 | right: Type, 2060 | typeParameters: ?TypeParameterDeclaration, 2061 | end: number, 2062 | innerComments: ?Array, 2063 | leadingComments: ?Array, 2064 | loc: { 2065 | end: {column: number, line: number}, 2066 | start: {column: number, line: number}, 2067 | }, 2068 | start: number, 2069 | trailingComments: ?Array, 2070 | } | { 2071 | type: 'TypeAnnotation', 2072 | _TypeAnnotation?: void, 2073 | typeAnnotation: Type, 2074 | end: number, 2075 | innerComments: ?Array, 2076 | leadingComments: ?Array, 2077 | loc: { 2078 | end: {column: number, line: number}, 2079 | start: {column: number, line: number}, 2080 | }, 2081 | start: number, 2082 | trailingComments: ?Array, 2083 | } | { 2084 | type: 'TypeCastExpression', 2085 | _TypeCastExpression?: void, 2086 | expression: Expression, 2087 | typeAnnotation: TypeAnnotation, 2088 | end: number, 2089 | innerComments: ?Array, 2090 | leadingComments: ?Array, 2091 | loc: { 2092 | end: {column: number, line: number}, 2093 | start: {column: number, line: number}, 2094 | }, 2095 | start: number, 2096 | trailingComments: ?Array, 2097 | } | { 2098 | type: 'TypeParameterDeclaration', 2099 | _TypeParameterDeclaration?: void, 2100 | params: Array, 2101 | end: number, 2102 | innerComments: ?Array, 2103 | leadingComments: ?Array, 2104 | loc: { 2105 | end: {column: number, line: number}, 2106 | start: {column: number, line: number}, 2107 | }, 2108 | start: number, 2109 | trailingComments: ?Array, 2110 | } | { 2111 | type: 'TypeParameterInstantiation', 2112 | _TypeParameterInstantiation?: void, 2113 | params: Array, 2114 | end: number, 2115 | innerComments: ?Array, 2116 | leadingComments: ?Array, 2117 | loc: { 2118 | end: {column: number, line: number}, 2119 | start: {column: number, line: number}, 2120 | }, 2121 | start: number, 2122 | trailingComments: ?Array, 2123 | } | { 2124 | type: 'ObjectTypeAnnotation', 2125 | _ObjectTypeAnnotation?: void, 2126 | callProperties: Array, 2127 | indexers: Array, 2128 | properties: Array, 2129 | end: number, 2130 | innerComments: ?Array, 2131 | leadingComments: ?Array, 2132 | loc: { 2133 | end: {column: number, line: number}, 2134 | start: {column: number, line: number}, 2135 | }, 2136 | start: number, 2137 | trailingComments: ?Array, 2138 | } | { 2139 | type: 'ObjectTypeCallProperty', 2140 | _ObjectTypeCallProperty?: void, 2141 | static: boolean, 2142 | value: FunctionTypeAnnotation, 2143 | end: number, 2144 | innerComments: ?Array, 2145 | leadingComments: ?Array, 2146 | loc: { 2147 | end: {column: number, line: number}, 2148 | start: {column: number, line: number}, 2149 | }, 2150 | start: number, 2151 | trailingComments: ?Array, 2152 | } | { 2153 | type: 'ObjectTypeIndexer', 2154 | _ObjectTypeIndexer?: void, 2155 | id: Identifier, 2156 | key: Type, 2157 | value: Type, 2158 | end: number, 2159 | innerComments: ?Array, 2160 | leadingComments: ?Array, 2161 | loc: { 2162 | end: {column: number, line: number}, 2163 | start: {column: number, line: number}, 2164 | }, 2165 | start: number, 2166 | trailingComments: ?Array, 2167 | } | { 2168 | type: 'ObjectTypeProperty', 2169 | _ObjectTypeProperty?: void, 2170 | key: Node, 2171 | optional: boolean, 2172 | value: Type, 2173 | end: number, 2174 | innerComments: ?Array, 2175 | leadingComments: ?Array, 2176 | loc: { 2177 | end: {column: number, line: number}, 2178 | start: {column: number, line: number}, 2179 | }, 2180 | start: number, 2181 | trailingComments: ?Array, 2182 | } | { 2183 | type: 'QualifiedTypeIdentifier', 2184 | _QualifiedTypeIdentifier?: void, 2185 | id: Identifier, 2186 | qualification: Node, 2187 | end: number, 2188 | innerComments: ?Array, 2189 | leadingComments: ?Array, 2190 | loc: { 2191 | end: {column: number, line: number}, 2192 | start: {column: number, line: number}, 2193 | }, 2194 | start: number, 2195 | trailingComments: ?Array, 2196 | } | { 2197 | type: 'UnionTypeAnnotation', 2198 | _UnionTypeAnnotation?: void, 2199 | types: Array, 2200 | end: number, 2201 | innerComments: ?Array, 2202 | leadingComments: ?Array, 2203 | loc: { 2204 | end: {column: number, line: number}, 2205 | start: {column: number, line: number}, 2206 | }, 2207 | start: number, 2208 | trailingComments: ?Array, 2209 | } | { 2210 | type: 'VoidTypeAnnotation', 2211 | _VoidTypeAnnotation?: void, 2212 | end: number, 2213 | innerComments: ?Array, 2214 | leadingComments: ?Array, 2215 | loc: { 2216 | end: {column: number, line: number}, 2217 | start: {column: number, line: number}, 2218 | }, 2219 | start: number, 2220 | trailingComments: ?Array, 2221 | } | { 2222 | type: 'JSXAttribute', 2223 | _JSXAttribute?: void, 2224 | name: Node, 2225 | value: ?Node, 2226 | end: number, 2227 | innerComments: ?Array, 2228 | leadingComments: ?Array, 2229 | loc: { 2230 | end: {column: number, line: number}, 2231 | start: {column: number, line: number}, 2232 | }, 2233 | start: number, 2234 | trailingComments: ?Array, 2235 | } | { 2236 | type: 'JSXClosingElement', 2237 | _JSXClosingElement?: void, 2238 | name: Node, 2239 | end: number, 2240 | innerComments: ?Array, 2241 | leadingComments: ?Array, 2242 | loc: { 2243 | end: {column: number, line: number}, 2244 | start: {column: number, line: number}, 2245 | }, 2246 | start: number, 2247 | trailingComments: ?Array, 2248 | } | { 2249 | type: 'JSXElement', 2250 | _JSXElement?: void, 2251 | children: Array, 2252 | closingElement: ?JSXClosingElement, 2253 | openingElement: JSXOpeningElement, 2254 | end: number, 2255 | innerComments: ?Array, 2256 | leadingComments: ?Array, 2257 | loc: { 2258 | end: {column: number, line: number}, 2259 | start: {column: number, line: number}, 2260 | }, 2261 | start: number, 2262 | trailingComments: ?Array, 2263 | } | { 2264 | type: 'JSXEmptyExpression', 2265 | _JSXEmptyExpression?: void, 2266 | end: number, 2267 | innerComments: ?Array, 2268 | leadingComments: ?Array, 2269 | loc: { 2270 | end: {column: number, line: number}, 2271 | start: {column: number, line: number}, 2272 | }, 2273 | start: number, 2274 | trailingComments: ?Array, 2275 | } | { 2276 | type: 'JSXExpressionContainer', 2277 | _JSXExpressionContainer?: void, 2278 | expression: Expression, 2279 | end: number, 2280 | innerComments: ?Array, 2281 | leadingComments: ?Array, 2282 | loc: { 2283 | end: {column: number, line: number}, 2284 | start: {column: number, line: number}, 2285 | }, 2286 | start: number, 2287 | trailingComments: ?Array, 2288 | } | { 2289 | type: 'JSXIdentifier', 2290 | _JSXIdentifier?: void, 2291 | name: string, 2292 | end: number, 2293 | innerComments: ?Array, 2294 | leadingComments: ?Array, 2295 | loc: { 2296 | end: {column: number, line: number}, 2297 | start: {column: number, line: number}, 2298 | }, 2299 | start: number, 2300 | trailingComments: ?Array, 2301 | } | { 2302 | type: 'JSXMemberExpression', 2303 | _JSXMemberExpression?: void, 2304 | computed: boolean, 2305 | object: Node, 2306 | property: JSXIdentifier, 2307 | end: number, 2308 | innerComments: ?Array, 2309 | leadingComments: ?Array, 2310 | loc: { 2311 | end: {column: number, line: number}, 2312 | start: {column: number, line: number}, 2313 | }, 2314 | start: number, 2315 | trailingComments: ?Array, 2316 | } | { 2317 | type: 'JSXNamespacedName', 2318 | _JSXNamespacedName?: void, 2319 | name: JSXIdentifier, 2320 | namespace: JSXIdentifier, 2321 | end: number, 2322 | innerComments: ?Array, 2323 | leadingComments: ?Array, 2324 | loc: { 2325 | end: {column: number, line: number}, 2326 | start: {column: number, line: number}, 2327 | }, 2328 | start: number, 2329 | trailingComments: ?Array, 2330 | } | { 2331 | type: 'JSXOpeningElement', 2332 | _JSXOpeningElement?: void, 2333 | attributes: Array, 2334 | name: Array, 2335 | selfClosing: boolean, 2336 | end: number, 2337 | innerComments: ?Array, 2338 | leadingComments: ?Array, 2339 | loc: { 2340 | end: {column: number, line: number}, 2341 | start: {column: number, line: number}, 2342 | }, 2343 | start: number, 2344 | trailingComments: ?Array, 2345 | } | { 2346 | type: 'JSXSpreadAttribute', 2347 | _JSXSpreadAttribute?: void, 2348 | argument: Expression, 2349 | end: number, 2350 | innerComments: ?Array, 2351 | leadingComments: ?Array, 2352 | loc: { 2353 | end: {column: number, line: number}, 2354 | start: {column: number, line: number}, 2355 | }, 2356 | start: number, 2357 | trailingComments: ?Array, 2358 | }; 2359 | 2360 | export type Pattern = { 2361 | type: 'ArrayPattern', 2362 | _ArrayPattern?: void, 2363 | elements: Array, 2364 | typeAnnotation: ?TypeAnnotation, 2365 | end: number, 2366 | innerComments: ?Array, 2367 | leadingComments: ?Array, 2368 | loc: { 2369 | end: {column: number, line: number}, 2370 | start: {column: number, line: number}, 2371 | }, 2372 | start: number, 2373 | trailingComments: ?Array, 2374 | } | { 2375 | type: 'AssignmentPattern', 2376 | _AssignmentPattern?: void, 2377 | left: Pattern, 2378 | right: Expression, 2379 | end: number, 2380 | innerComments: ?Array, 2381 | leadingComments: ?Array, 2382 | loc: { 2383 | end: {column: number, line: number}, 2384 | start: {column: number, line: number}, 2385 | }, 2386 | start: number, 2387 | trailingComments: ?Array, 2388 | } | { 2389 | type: 'Identifier', 2390 | _Identifier?: void, 2391 | name: string, 2392 | typeAnnotation: ?TypeAnnotation, 2393 | end: number, 2394 | innerComments: ?Array, 2395 | leadingComments: ?Array, 2396 | loc: { 2397 | end: {column: number, line: number}, 2398 | start: {column: number, line: number}, 2399 | }, 2400 | start: number, 2401 | trailingComments: ?Array, 2402 | } | { 2403 | type: 'ObjectPattern', 2404 | _ObjectPattern?: void, 2405 | properties: Array, 2406 | typeAnnotation: ?TypeAnnotation, 2407 | end: number, 2408 | innerComments: ?Array, 2409 | leadingComments: ?Array, 2410 | loc: { 2411 | end: {column: number, line: number}, 2412 | start: {column: number, line: number}, 2413 | }, 2414 | start: number, 2415 | trailingComments: ?Array, 2416 | } | { 2417 | type: 'RestElement', 2418 | _RestElement?: void, 2419 | argument: Pattern, 2420 | typeAnnotation: ?TypeAnnotation, 2421 | end: number, 2422 | innerComments: ?Array, 2423 | leadingComments: ?Array, 2424 | loc: { 2425 | end: {column: number, line: number}, 2426 | start: {column: number, line: number}, 2427 | }, 2428 | start: number, 2429 | trailingComments: ?Array, 2430 | }; 2431 | 2432 | export type Statement = { 2433 | type: 'BlockStatement', 2434 | _BlockStatement?: void, 2435 | body: Array, 2436 | end: number, 2437 | innerComments: ?Array, 2438 | leadingComments: ?Array, 2439 | loc: { 2440 | end: {column: number, line: number}, 2441 | start: {column: number, line: number}, 2442 | }, 2443 | start: number, 2444 | trailingComments: ?Array, 2445 | } | { 2446 | type: 'BreakStatement', 2447 | _BreakStatement?: void, 2448 | label: ?Identifier, 2449 | end: number, 2450 | innerComments: ?Array, 2451 | leadingComments: ?Array, 2452 | loc: { 2453 | end: {column: number, line: number}, 2454 | start: {column: number, line: number}, 2455 | }, 2456 | start: number, 2457 | trailingComments: ?Array, 2458 | } | { 2459 | type: 'ContinueStatement', 2460 | _ContinueStatement?: void, 2461 | label: ?Identifier, 2462 | end: number, 2463 | innerComments: ?Array, 2464 | leadingComments: ?Array, 2465 | loc: { 2466 | end: {column: number, line: number}, 2467 | start: {column: number, line: number}, 2468 | }, 2469 | start: number, 2470 | trailingComments: ?Array, 2471 | } | { 2472 | type: 'DoWhileStatement', 2473 | _DoWhileStatement?: void, 2474 | body: Statement, 2475 | test: Expression, 2476 | end: number, 2477 | innerComments: ?Array, 2478 | leadingComments: ?Array, 2479 | loc: { 2480 | end: {column: number, line: number}, 2481 | start: {column: number, line: number}, 2482 | }, 2483 | start: number, 2484 | trailingComments: ?Array, 2485 | } | { 2486 | type: 'EmptyStatement', 2487 | _EmptyStatement?: void, 2488 | end: number, 2489 | innerComments: ?Array, 2490 | leadingComments: ?Array, 2491 | loc: { 2492 | end: {column: number, line: number}, 2493 | start: {column: number, line: number}, 2494 | }, 2495 | start: number, 2496 | trailingComments: ?Array, 2497 | } | { 2498 | type: 'ExpressionStatement', 2499 | _ExpressionStatement?: void, 2500 | expression: Expression, 2501 | end: number, 2502 | innerComments: ?Array, 2503 | leadingComments: ?Array, 2504 | loc: { 2505 | end: {column: number, line: number}, 2506 | start: {column: number, line: number}, 2507 | }, 2508 | start: number, 2509 | trailingComments: ?Array, 2510 | } | { 2511 | type: 'ForInStatement', 2512 | _ForInStatement?: void, 2513 | body: Statement, 2514 | left: Node, 2515 | right: Expression, 2516 | end: number, 2517 | innerComments: ?Array, 2518 | leadingComments: ?Array, 2519 | loc: { 2520 | end: {column: number, line: number}, 2521 | start: {column: number, line: number}, 2522 | }, 2523 | start: number, 2524 | trailingComments: ?Array, 2525 | } | { 2526 | type: 'ForOfStatement', 2527 | _ForOfStatement?: void, 2528 | body: Statement, 2529 | left: Node, 2530 | right: Expression, 2531 | end: number, 2532 | innerComments: ?Array, 2533 | leadingComments: ?Array, 2534 | loc: { 2535 | end: {column: number, line: number}, 2536 | start: {column: number, line: number}, 2537 | }, 2538 | start: number, 2539 | trailingComments: ?Array, 2540 | } | { 2541 | type: 'ForStatement', 2542 | _ForStatement?: void, 2543 | init: ?Node, 2544 | test: ?Expression, 2545 | update: ?Expression, 2546 | body: Statement, 2547 | end: number, 2548 | innerComments: ?Array, 2549 | leadingComments: ?Array, 2550 | loc: { 2551 | end: {column: number, line: number}, 2552 | start: {column: number, line: number}, 2553 | }, 2554 | start: number, 2555 | trailingComments: ?Array, 2556 | } | { 2557 | type: 'IfStatement', 2558 | _IfStatement?: void, 2559 | alternate: ?Statement, 2560 | consequent: Statement, 2561 | test: Expression, 2562 | end: number, 2563 | innerComments: ?Array, 2564 | leadingComments: ?Array, 2565 | loc: { 2566 | end: {column: number, line: number}, 2567 | start: {column: number, line: number}, 2568 | }, 2569 | start: number, 2570 | trailingComments: ?Array, 2571 | } | { 2572 | type: 'LabeledStatement', 2573 | _LabeledStatement?: void, 2574 | body: Statement, 2575 | label: Identifier, 2576 | end: number, 2577 | innerComments: ?Array, 2578 | leadingComments: ?Array, 2579 | loc: { 2580 | end: {column: number, line: number}, 2581 | start: {column: number, line: number}, 2582 | }, 2583 | start: number, 2584 | trailingComments: ?Array, 2585 | } | { 2586 | type: 'ReturnStatement', 2587 | _ReturnStatement?: void, 2588 | argument: ?Expression, 2589 | end: number, 2590 | innerComments: ?Array, 2591 | leadingComments: ?Array, 2592 | loc: { 2593 | end: {column: number, line: number}, 2594 | start: {column: number, line: number}, 2595 | }, 2596 | start: number, 2597 | trailingComments: ?Array, 2598 | } | { 2599 | type: 'SwitchStatement', 2600 | _SwitchStatement?: void, 2601 | cases: Array, 2602 | discriminant: Expression, 2603 | lexical: boolean, 2604 | end: number, 2605 | innerComments: ?Array, 2606 | leadingComments: ?Array, 2607 | loc: { 2608 | end: {column: number, line: number}, 2609 | start: {column: number, line: number}, 2610 | }, 2611 | start: number, 2612 | trailingComments: ?Array, 2613 | } | { 2614 | type: 'ThrowStatement', 2615 | _ThrowStatement?: void, 2616 | argument: Expression, 2617 | end: number, 2618 | innerComments: ?Array, 2619 | leadingComments: ?Array, 2620 | loc: { 2621 | end: {column: number, line: number}, 2622 | start: {column: number, line: number}, 2623 | }, 2624 | start: number, 2625 | trailingComments: ?Array, 2626 | } | { 2627 | type: 'TryStatement', 2628 | _TryStatement?: void, 2629 | block: BlockStatement, 2630 | finalizer: ?BlockStatement, 2631 | guardedHandlers: Array, 2632 | handler: ?CatchClause, 2633 | handlers: ?Array, 2634 | end: number, 2635 | innerComments: ?Array, 2636 | leadingComments: ?Array, 2637 | loc: { 2638 | end: {column: number, line: number}, 2639 | start: {column: number, line: number}, 2640 | }, 2641 | start: number, 2642 | trailingComments: ?Array, 2643 | } | { 2644 | type: 'WhileStatement', 2645 | _WhileStatement?: void, 2646 | body: Statement, 2647 | test: Expression, 2648 | end: number, 2649 | innerComments: ?Array, 2650 | leadingComments: ?Array, 2651 | loc: { 2652 | end: {column: number, line: number}, 2653 | start: {column: number, line: number}, 2654 | }, 2655 | start: number, 2656 | trailingComments: ?Array, 2657 | } | { 2658 | type: 'WithStatement', 2659 | _WithStatement?: void, 2660 | body: Statement, 2661 | object: Expression, 2662 | end: number, 2663 | innerComments: ?Array, 2664 | leadingComments: ?Array, 2665 | loc: { 2666 | end: {column: number, line: number}, 2667 | start: {column: number, line: number}, 2668 | }, 2669 | start: number, 2670 | trailingComments: ?Array, 2671 | } | { 2672 | type: 'DeclareClass', 2673 | _DeclareClass?: void, 2674 | body: ObjectTypeAnnotation, 2675 | extends: Array, 2676 | id: Identifier, 2677 | typeParameters: ?TypeParameterDeclaration, 2678 | end: number, 2679 | innerComments: ?Array, 2680 | leadingComments: ?Array, 2681 | loc: { 2682 | end: {column: number, line: number}, 2683 | start: {column: number, line: number}, 2684 | }, 2685 | start: number, 2686 | trailingComments: ?Array, 2687 | } | { 2688 | type: 'DeclareFunction', 2689 | _DeclareFunction?: void, 2690 | id: Identifier, 2691 | end: number, 2692 | innerComments: ?Array, 2693 | leadingComments: ?Array, 2694 | loc: { 2695 | end: {column: number, line: number}, 2696 | start: {column: number, line: number}, 2697 | }, 2698 | start: number, 2699 | trailingComments: ?Array, 2700 | } | { 2701 | type: 'DeclareModule', 2702 | _DeclareModule?: void, 2703 | body: BlockStatement, 2704 | id: Node, 2705 | end: number, 2706 | innerComments: ?Array, 2707 | leadingComments: ?Array, 2708 | loc: { 2709 | end: {column: number, line: number}, 2710 | start: {column: number, line: number}, 2711 | }, 2712 | start: number, 2713 | trailingComments: ?Array, 2714 | } | { 2715 | type: 'DeclareVariable', 2716 | _DeclareVariable?: void, 2717 | id: Identifier, 2718 | end: number, 2719 | innerComments: ?Array, 2720 | leadingComments: ?Array, 2721 | loc: { 2722 | end: {column: number, line: number}, 2723 | start: {column: number, line: number}, 2724 | }, 2725 | start: number, 2726 | trailingComments: ?Array, 2727 | } | { 2728 | type: 'InterfaceDeclaration', 2729 | _InterfaceDeclaration?: void, 2730 | body: ObjectTypeAnnotation, 2731 | extends: Array, 2732 | id: Identifier, 2733 | typeParameters: ?TypeParameterDeclaration, 2734 | end: number, 2735 | innerComments: ?Array, 2736 | leadingComments: ?Array, 2737 | loc: { 2738 | end: {column: number, line: number}, 2739 | start: {column: number, line: number}, 2740 | }, 2741 | start: number, 2742 | trailingComments: ?Array, 2743 | } | { 2744 | type: 'TypeAlias', 2745 | _TypeAlias?: void, 2746 | id: Identifier, 2747 | right: Type, 2748 | typeParameters: ?TypeParameterDeclaration, 2749 | end: number, 2750 | innerComments: ?Array, 2751 | leadingComments: ?Array, 2752 | loc: { 2753 | end: {column: number, line: number}, 2754 | start: {column: number, line: number}, 2755 | }, 2756 | start: number, 2757 | trailingComments: ?Array, 2758 | }; 2759 | 2760 | export type Type = { 2761 | type: 'AnyTypeAnnotation', 2762 | _AnyTypeAnnotation?: void, 2763 | end: number, 2764 | innerComments: ?Array, 2765 | leadingComments: ?Array, 2766 | loc: { 2767 | end: {column: number, line: number}, 2768 | start: {column: number, line: number}, 2769 | }, 2770 | start: number, 2771 | trailingComments: ?Array, 2772 | } | { 2773 | type: 'ArrayTypeAnnotation', 2774 | _ArrayTypeAnnotation?: void, 2775 | elementType: Type, 2776 | end: number, 2777 | innerComments: ?Array, 2778 | leadingComments: ?Array, 2779 | loc: { 2780 | end: {column: number, line: number}, 2781 | start: {column: number, line: number}, 2782 | }, 2783 | start: number, 2784 | trailingComments: ?Array, 2785 | } | { 2786 | type: 'BooleanLiteralTypeAnnotation', 2787 | _BooleanLiteralTypeAnnotation?: void, 2788 | raw: string, 2789 | value: boolean, 2790 | end: number, 2791 | innerComments: ?Array, 2792 | leadingComments: ?Array, 2793 | loc: { 2794 | end: {column: number, line: number}, 2795 | start: {column: number, line: number}, 2796 | }, 2797 | start: number, 2798 | trailingComments: ?Array, 2799 | } | { 2800 | type: 'BooleanTypeAnnotation', 2801 | _BooleanTypeAnnotation?: void, 2802 | end: number, 2803 | innerComments: ?Array, 2804 | leadingComments: ?Array, 2805 | loc: { 2806 | end: {column: number, line: number}, 2807 | start: {column: number, line: number}, 2808 | }, 2809 | start: number, 2810 | trailingComments: ?Array, 2811 | } | { 2812 | type: 'FunctionTypeAnnotation', 2813 | _FunctionTypeAnnotation?: void, 2814 | params: Array, 2815 | rest: ?FunctionTypeParam, 2816 | returnType: Type, 2817 | typeParameters: ?TypeParameterDeclaration, 2818 | end: number, 2819 | innerComments: ?Array, 2820 | leadingComments: ?Array, 2821 | loc: { 2822 | end: {column: number, line: number}, 2823 | start: {column: number, line: number}, 2824 | }, 2825 | start: number, 2826 | trailingComments: ?Array, 2827 | } | { 2828 | type: 'GenericTypeAnnotation', 2829 | _GenericTypeAnnotation?: void, 2830 | id: Node, 2831 | typeParameters: ?TypeParameterInstantiation, 2832 | end: number, 2833 | innerComments: ?Array, 2834 | leadingComments: ?Array, 2835 | loc: { 2836 | end: {column: number, line: number}, 2837 | start: {column: number, line: number}, 2838 | }, 2839 | start: number, 2840 | trailingComments: ?Array, 2841 | } | { 2842 | type: 'IntersectionTypeAnnotation', 2843 | _IntersectionTypeAnnotation?: void, 2844 | types: Array, 2845 | end: number, 2846 | innerComments: ?Array, 2847 | leadingComments: ?Array, 2848 | loc: { 2849 | end: {column: number, line: number}, 2850 | start: {column: number, line: number}, 2851 | }, 2852 | start: number, 2853 | trailingComments: ?Array, 2854 | } | { 2855 | type: 'MixedTypeAnnotation', 2856 | _MixedTypeAnnotation?: void, 2857 | end: number, 2858 | innerComments: ?Array, 2859 | leadingComments: ?Array, 2860 | loc: { 2861 | end: {column: number, line: number}, 2862 | start: {column: number, line: number}, 2863 | }, 2864 | start: number, 2865 | trailingComments: ?Array, 2866 | } | { 2867 | type: 'NullableTypeAnnotation', 2868 | _NullableTypeAnnotation?: void, 2869 | typeAnnotation: Type, 2870 | end: number, 2871 | innerComments: ?Array, 2872 | leadingComments: ?Array, 2873 | loc: { 2874 | end: {column: number, line: number}, 2875 | start: {column: number, line: number}, 2876 | }, 2877 | start: number, 2878 | trailingComments: ?Array, 2879 | } | { 2880 | type: 'NumberLiteralTypeAnnotation', 2881 | _NumberLiteralTypeAnnotation?: void, 2882 | raw: string, 2883 | value: number, 2884 | end: number, 2885 | innerComments: ?Array, 2886 | leadingComments: ?Array, 2887 | loc: { 2888 | end: {column: number, line: number}, 2889 | start: {column: number, line: number}, 2890 | }, 2891 | start: number, 2892 | trailingComments: ?Array, 2893 | } | { 2894 | type: 'NumberTypeAnnotation', 2895 | _NumberTypeAnnotation?: void, 2896 | end: number, 2897 | innerComments: ?Array, 2898 | leadingComments: ?Array, 2899 | loc: { 2900 | end: {column: number, line: number}, 2901 | start: {column: number, line: number}, 2902 | }, 2903 | start: number, 2904 | trailingComments: ?Array, 2905 | } | { 2906 | type: 'StringLiteralTypeAnnotation', 2907 | _StringLiteralTypeAnnotation?: void, 2908 | raw: string, 2909 | value: string, 2910 | end: number, 2911 | innerComments: ?Array, 2912 | leadingComments: ?Array, 2913 | loc: { 2914 | end: {column: number, line: number}, 2915 | start: {column: number, line: number}, 2916 | }, 2917 | start: number, 2918 | trailingComments: ?Array, 2919 | } | { 2920 | type: 'StringTypeAnnotation', 2921 | _StringTypeAnnotation?: void, 2922 | end: number, 2923 | innerComments: ?Array, 2924 | leadingComments: ?Array, 2925 | loc: { 2926 | end: {column: number, line: number}, 2927 | start: {column: number, line: number}, 2928 | }, 2929 | start: number, 2930 | trailingComments: ?Array, 2931 | } | { 2932 | type: 'TupleTypeAnnotation', 2933 | _TupleTypeAnnotation?: void, 2934 | types: Array, 2935 | end: number, 2936 | innerComments: ?Array, 2937 | leadingComments: ?Array, 2938 | loc: { 2939 | end: {column: number, line: number}, 2940 | start: {column: number, line: number}, 2941 | }, 2942 | start: number, 2943 | trailingComments: ?Array, 2944 | } | { 2945 | type: 'ObjectTypeAnnotation', 2946 | _ObjectTypeAnnotation?: void, 2947 | callProperties: Array, 2948 | indexers: Array, 2949 | properties: Array, 2950 | end: number, 2951 | innerComments: ?Array, 2952 | leadingComments: ?Array, 2953 | loc: { 2954 | end: {column: number, line: number}, 2955 | start: {column: number, line: number}, 2956 | }, 2957 | start: number, 2958 | trailingComments: ?Array, 2959 | } | { 2960 | type: 'UnionTypeAnnotation', 2961 | _UnionTypeAnnotation?: void, 2962 | types: Array, 2963 | end: number, 2964 | innerComments: ?Array, 2965 | leadingComments: ?Array, 2966 | loc: { 2967 | end: {column: number, line: number}, 2968 | start: {column: number, line: number}, 2969 | }, 2970 | start: number, 2971 | trailingComments: ?Array, 2972 | } | { 2973 | type: 'VoidTypeAnnotation', 2974 | _VoidTypeAnnotation?: void, 2975 | end: number, 2976 | innerComments: ?Array, 2977 | leadingComments: ?Array, 2978 | loc: { 2979 | end: {column: number, line: number}, 2980 | start: {column: number, line: number}, 2981 | }, 2982 | start: number, 2983 | trailingComments: ?Array, 2984 | }; 2985 | 2986 | // Concrete Types. Nothing can extend these. 2987 | 2988 | export type CommentLine = { 2989 | type: 'CommentLine', 2990 | _CommentLine?: void, 2991 | value: string, 2992 | end: number, 2993 | loc: { 2994 | end: {column: number, line: number}, 2995 | start: {column: number, line: number}, 2996 | }, 2997 | start: number, 2998 | }; 2999 | 3000 | export type CommentBlock = { 3001 | type: 'CommentBlock', 3002 | _CommentBlock?: void, 3003 | value: string, 3004 | end: number, 3005 | loc: { 3006 | end: {column: number, line: number}, 3007 | start: {column: number, line: number}, 3008 | }, 3009 | start: number, 3010 | }; 3011 | 3012 | // Babel concrete types. 3013 | 3014 | export type ArrayExpression = { 3015 | type: 'ArrayExpression', 3016 | _ArrayExpression?: void, 3017 | elements: Array, 3018 | end: number, 3019 | innerComments: ?Array, 3020 | leadingComments: ?Array, 3021 | loc: { 3022 | end: {column: number, line: number}, 3023 | start: {column: number, line: number}, 3024 | }, 3025 | start: number, 3026 | trailingComments: ?Array, 3027 | }; 3028 | 3029 | export type ArrayPattern = { 3030 | type: 'ArrayPattern', 3031 | _ArrayPattern?: void, 3032 | elements: Array, 3033 | typeAnnotation: ?TypeAnnotation, 3034 | end: number, 3035 | innerComments: ?Array, 3036 | leadingComments: ?Array, 3037 | loc: { 3038 | end: {column: number, line: number}, 3039 | start: {column: number, line: number}, 3040 | }, 3041 | start: number, 3042 | trailingComments: ?Array, 3043 | }; 3044 | 3045 | export type ArrowFunctionExpression = { 3046 | type: 'ArrowFunctionExpression', 3047 | _ArrowFunctionExpression?: void, 3048 | body: Node, 3049 | id: ?Identifier, 3050 | end: number, 3051 | innerComments: ?Array, 3052 | leadingComments: ?Array, 3053 | loc: { 3054 | end: {column: number, line: number}, 3055 | start: {column: number, line: number}, 3056 | }, 3057 | start: number, 3058 | trailingComments: ?Array, 3059 | async: boolean, 3060 | defaults: Array, 3061 | expression: boolean, 3062 | generator: boolean, 3063 | params: Array, 3064 | rest: ?Identifier, 3065 | returnType: ?TypeAnnotation, 3066 | typeParameters: ?TypeParameterDeclaration, 3067 | }; 3068 | 3069 | type AssignmentOperator = 3070 | '=' | 3071 | '+=' | 3072 | '-=' | 3073 | '*=' | 3074 | '/=' | 3075 | '%=' | 3076 | '<<=' | 3077 | '>>=' | 3078 | '>>>=' | 3079 | '|=' | 3080 | '^=' | 3081 | '&='; 3082 | 3083 | export type AssignmentExpression = { 3084 | type: 'AssignmentExpression', 3085 | _AssignmentExpression?: void, 3086 | left: Pattern, 3087 | operator: AssignmentOperator, 3088 | right: Expression, 3089 | end: number, 3090 | innerComments: ?Array, 3091 | leadingComments: ?Array, 3092 | loc: { 3093 | end: {column: number, line: number}, 3094 | start: {column: number, line: number}, 3095 | }, 3096 | start: number, 3097 | trailingComments: ?Array, 3098 | }; 3099 | 3100 | export type AssignmentPattern = { 3101 | type: 'AssignmentPattern', 3102 | _AssignmentPattern?: void, 3103 | left: Pattern, 3104 | right: Expression, 3105 | end: number, 3106 | innerComments: ?Array, 3107 | leadingComments: ?Array, 3108 | loc: { 3109 | end: {column: number, line: number}, 3110 | start: {column: number, line: number}, 3111 | }, 3112 | start: number, 3113 | trailingComments: ?Array, 3114 | }; 3115 | 3116 | export type AwaitExpression = { 3117 | type: 'AwaitExpression', 3118 | _AwaitExpression?: void, 3119 | all: boolean, 3120 | argument: ?Expression, 3121 | end: number, 3122 | innerComments: ?Array, 3123 | leadingComments: ?Array, 3124 | loc: { 3125 | end: {column: number, line: number}, 3126 | start: {column: number, line: number}, 3127 | }, 3128 | start: number, 3129 | trailingComments: ?Array, 3130 | }; 3131 | 3132 | type BinaryOperator = 3133 | '==' | 3134 | '!=' | 3135 | '===' | 3136 | '!==' | 3137 | '<' | 3138 | '<=' | 3139 | '>' | 3140 | '>=' | 3141 | '<<' | 3142 | '>>' | 3143 | '>>>' | 3144 | '+' | 3145 | '-' | 3146 | '*' | 3147 | '/' | 3148 | '%' | 3149 | '&' | 3150 | '|' | 3151 | '^' | 3152 | 'in' | 3153 | 'instanceof' | 3154 | '..'; 3155 | 3156 | export type BinaryExpression = { 3157 | type: 'BinaryExpression', 3158 | _BinaryExpression?: void, 3159 | left: Expression, 3160 | operator: BinaryOperator, 3161 | right: Expression, 3162 | end: number, 3163 | innerComments: ?Array, 3164 | leadingComments: ?Array, 3165 | loc: { 3166 | end: {column: number, line: number}, 3167 | start: {column: number, line: number}, 3168 | }, 3169 | start: number, 3170 | trailingComments: ?Array, 3171 | }; 3172 | 3173 | // TODO: What is this? 3174 | export type BindExpression = { 3175 | type: 'BindExpression', 3176 | _BindExpression?: void, 3177 | callee: Node, 3178 | object: Node, 3179 | end: number, 3180 | innerComments: ?Array, 3181 | leadingComments: ?Array, 3182 | loc: { 3183 | end: {column: number, line: number}, 3184 | start: {column: number, line: number}, 3185 | }, 3186 | start: number, 3187 | trailingComments: ?Array, 3188 | }; 3189 | 3190 | export type BlockStatement = { 3191 | type: 'BlockStatement', 3192 | _BlockStatement?: void, 3193 | body: Array, 3194 | end: number, 3195 | innerComments: ?Array, 3196 | leadingComments: ?Array, 3197 | loc: { 3198 | end: {column: number, line: number}, 3199 | start: {column: number, line: number}, 3200 | }, 3201 | start: number, 3202 | trailingComments: ?Array, 3203 | }; 3204 | 3205 | export type BreakStatement = { 3206 | type: 'BreakStatement', 3207 | _BreakStatement?: void, 3208 | label: ?Identifier, 3209 | end: number, 3210 | innerComments: ?Array, 3211 | leadingComments: ?Array, 3212 | loc: { 3213 | end: {column: number, line: number}, 3214 | start: {column: number, line: number}, 3215 | }, 3216 | start: number, 3217 | trailingComments: ?Array, 3218 | }; 3219 | 3220 | export type CallExpression = { 3221 | type: 'CallExpression', 3222 | _CallExpression?: void, 3223 | arguments: Array, 3224 | callee: Expression, 3225 | end: number, 3226 | innerComments: ?Array, 3227 | leadingComments: ?Array, 3228 | loc: { 3229 | end: {column: number, line: number}, 3230 | start: {column: number, line: number}, 3231 | }, 3232 | start: number, 3233 | trailingComments: ?Array, 3234 | }; 3235 | 3236 | export type CatchClause = { 3237 | type: 'CatchClause', 3238 | _CatchClause?: void, 3239 | body: BlockStatement, 3240 | param: Pattern, 3241 | end: number, 3242 | innerComments: ?Array, 3243 | leadingComments: ?Array, 3244 | loc: { 3245 | end: {column: number, line: number}, 3246 | start: {column: number, line: number}, 3247 | }, 3248 | start: number, 3249 | trailingComments: ?Array, 3250 | }; 3251 | 3252 | export type ClassBody = { 3253 | type: 'ClassBody', 3254 | _ClassBody?: void, 3255 | body: Array, 3256 | end: number, 3257 | innerComments: ?Array, 3258 | leadingComments: ?Array, 3259 | loc: { 3260 | end: {column: number, line: number}, 3261 | start: {column: number, line: number}, 3262 | }, 3263 | start: number, 3264 | trailingComments: ?Array, 3265 | }; 3266 | 3267 | export type ClassDeclaration = { 3268 | type: 'ClassDeclaration', 3269 | _ClassDeclaration?: void, 3270 | body: ClassBody, 3271 | id: ?Identifier, 3272 | superClass: ?Expression, 3273 | decorators: any, 3274 | superTypeParameters: any, 3275 | typeParameters: any, 3276 | end: number, 3277 | innerComments: ?Array, 3278 | leadingComments: ?Array, 3279 | loc: { 3280 | end: {column: number, line: number}, 3281 | start: {column: number, line: number}, 3282 | }, 3283 | start: number, 3284 | trailingComments: ?Array, 3285 | }; 3286 | 3287 | export type ClassExpression = { 3288 | type: 'ClassExpression', 3289 | _ClassExpression?: void, 3290 | body: ClassBody, 3291 | id: ?Identifier, 3292 | superClass: ?Expression, 3293 | decorators: any, 3294 | superTypeParameters: any, 3295 | typeParameters: any, 3296 | end: number, 3297 | innerComments: ?Array, 3298 | leadingComments: ?Array, 3299 | loc: { 3300 | end: {column: number, line: number}, 3301 | start: {column: number, line: number}, 3302 | }, 3303 | start: number, 3304 | trailingComments: ?Array, 3305 | }; 3306 | 3307 | export type ComprehensionBlock = { 3308 | type: 'ComprehensionBlock', 3309 | _ComprehensionBlock?: void, 3310 | each: boolean, 3311 | left: Pattern, 3312 | right: Expression, 3313 | end: number, 3314 | innerComments: ?Array, 3315 | leadingComments: ?Array, 3316 | loc: { 3317 | end: {column: number, line: number}, 3318 | start: {column: number, line: number}, 3319 | }, 3320 | start: number, 3321 | trailingComments: ?Array, 3322 | }; 3323 | 3324 | export type ComprehensionExpression = { 3325 | type: 'ComprehensionExpression', 3326 | _ComprehensionExpression?: void, 3327 | body: Expression, 3328 | blocks: Array, 3329 | filter: ?Expression, 3330 | end: number, 3331 | innerComments: ?Array, 3332 | leadingComments: ?Array, 3333 | loc: { 3334 | end: {column: number, line: number}, 3335 | start: {column: number, line: number}, 3336 | }, 3337 | start: number, 3338 | trailingComments: ?Array, 3339 | }; 3340 | 3341 | export type ConditionalExpression = { 3342 | type: 'ConditionalExpression', 3343 | _ConditionalExpression?: void, 3344 | alternate: Expression, 3345 | consequent: Expression, 3346 | test: Expression, 3347 | end: number, 3348 | innerComments: ?Array, 3349 | leadingComments: ?Array, 3350 | loc: { 3351 | end: {column: number, line: number}, 3352 | start: {column: number, line: number}, 3353 | }, 3354 | start: number, 3355 | trailingComments: ?Array, 3356 | }; 3357 | 3358 | export type ContinueStatement = { 3359 | type: 'ContinueStatement', 3360 | _ContinueStatement?: void, 3361 | label: ?Identifier, 3362 | end: number, 3363 | innerComments: ?Array, 3364 | leadingComments: ?Array, 3365 | loc: { 3366 | end: {column: number, line: number}, 3367 | start: {column: number, line: number}, 3368 | }, 3369 | start: number, 3370 | trailingComments: ?Array, 3371 | }; 3372 | 3373 | // TODO: Make this correct. 3374 | export type Decorator = { 3375 | type: 'Decorator', 3376 | _Decorator?: void, 3377 | expression: Expression, 3378 | end: number, 3379 | innerComments: ?Array, 3380 | leadingComments: ?Array, 3381 | loc: { 3382 | end: {column: number, line: number}, 3383 | start: {column: number, line: number}, 3384 | }, 3385 | start: number, 3386 | trailingComments: ?Array, 3387 | }; 3388 | 3389 | export type DebuggerStatement = { 3390 | type: 'DebuggerStatement', 3391 | _DebuggerStatement?: void, 3392 | end: number, 3393 | innerComments: ?Array, 3394 | leadingComments: ?Array, 3395 | loc: { 3396 | end: {column: number, line: number}, 3397 | start: {column: number, line: number}, 3398 | }, 3399 | start: number, 3400 | trailingComments: ?Array, 3401 | }; 3402 | 3403 | export type DoWhileStatement = { 3404 | type: 'DoWhileStatement', 3405 | _DoWhileStatement?: void, 3406 | body: Statement, 3407 | test: Expression, 3408 | end: number, 3409 | innerComments: ?Array, 3410 | leadingComments: ?Array, 3411 | loc: { 3412 | end: {column: number, line: number}, 3413 | start: {column: number, line: number}, 3414 | }, 3415 | start: number, 3416 | trailingComments: ?Array, 3417 | }; 3418 | 3419 | // TODO: Make this correct. 3420 | export type DoExpression = { 3421 | type: 'DoExpression', 3422 | _DoExpression?: void, 3423 | body: Statement, 3424 | end: number, 3425 | innerComments: ?Array, 3426 | leadingComments: ?Array, 3427 | loc: { 3428 | end: {column: number, line: number}, 3429 | start: {column: number, line: number}, 3430 | }, 3431 | start: number, 3432 | trailingComments: ?Array, 3433 | }; 3434 | 3435 | export type EmptyStatement = { 3436 | type: 'EmptyStatement', 3437 | _EmptyStatement?: void, 3438 | end: number, 3439 | innerComments: ?Array, 3440 | leadingComments: ?Array, 3441 | loc: { 3442 | end: {column: number, line: number}, 3443 | start: {column: number, line: number}, 3444 | }, 3445 | start: number, 3446 | trailingComments: ?Array, 3447 | }; 3448 | 3449 | export type ExpressionStatement = { 3450 | type: 'ExpressionStatement', 3451 | _ExpressionStatement?: void, 3452 | expression: Expression, 3453 | end: number, 3454 | innerComments: ?Array, 3455 | leadingComments: ?Array, 3456 | loc: { 3457 | end: {column: number, line: number}, 3458 | start: {column: number, line: number}, 3459 | }, 3460 | start: number, 3461 | trailingComments: ?Array, 3462 | }; 3463 | 3464 | export type File = { 3465 | type: 'File', 3466 | _File?: void, 3467 | program: Program, 3468 | end: number, 3469 | innerComments: ?Array, 3470 | leadingComments: ?Array, 3471 | loc: { 3472 | end: {column: number, line: number}, 3473 | start: {column: number, line: number}, 3474 | }, 3475 | start: number, 3476 | trailingComments: ?Array, 3477 | }; 3478 | 3479 | export type ForInStatement = { 3480 | type: 'ForInStatement', 3481 | _ForInStatement?: void, 3482 | body: Statement, 3483 | left: Node, 3484 | right: Expression, 3485 | end: number, 3486 | innerComments: ?Array, 3487 | leadingComments: ?Array, 3488 | loc: { 3489 | end: {column: number, line: number}, 3490 | start: {column: number, line: number}, 3491 | }, 3492 | start: number, 3493 | trailingComments: ?Array, 3494 | }; 3495 | 3496 | // TODO: Make this correct. 3497 | export type ForOfStatement = { 3498 | type: 'ForOfStatement', 3499 | _ForOfStatement?: void, 3500 | body: Statement, 3501 | left: Node, 3502 | right: Expression, 3503 | end: number, 3504 | innerComments: ?Array, 3505 | leadingComments: ?Array, 3506 | loc: { 3507 | end: {column: number, line: number}, 3508 | start: {column: number, line: number}, 3509 | }, 3510 | start: number, 3511 | trailingComments: ?Array, 3512 | }; 3513 | 3514 | export type ForStatement = { 3515 | type: 'ForStatement', 3516 | _ForStatement?: void, 3517 | init: ?Node, 3518 | test: ?Expression, 3519 | update: ?Expression, 3520 | body: Statement, 3521 | end: number, 3522 | innerComments: ?Array, 3523 | leadingComments: ?Array, 3524 | loc: { 3525 | end: {column: number, line: number}, 3526 | start: {column: number, line: number}, 3527 | }, 3528 | start: number, 3529 | trailingComments: ?Array, 3530 | }; 3531 | 3532 | export type FunctionDeclaration = { 3533 | type: 'FunctionDeclaration', 3534 | _FunctionDeclaration?: void, 3535 | body: BlockStatement, 3536 | id: Identifier, 3537 | end: number, 3538 | innerComments: ?Array, 3539 | leadingComments: ?Array, 3540 | loc: { 3541 | end: {column: number, line: number}, 3542 | start: {column: number, line: number}, 3543 | }, 3544 | start: number, 3545 | trailingComments: ?Array, 3546 | async: boolean, 3547 | defaults: Array, 3548 | expression: boolean, 3549 | generator: boolean, 3550 | params: Array, 3551 | rest: ?Identifier, 3552 | returnType: ?TypeAnnotation, 3553 | typeParameters: ?TypeParameterDeclaration, 3554 | }; 3555 | 3556 | export type FunctionExpression = { 3557 | type: 'FunctionExpression', 3558 | _FunctionExpression?: void, 3559 | body: BlockStatement, 3560 | id: ?Identifier, 3561 | end: number, 3562 | innerComments: ?Array, 3563 | leadingComments: ?Array, 3564 | loc: { 3565 | end: {column: number, line: number}, 3566 | start: {column: number, line: number}, 3567 | }, 3568 | start: number, 3569 | trailingComments: ?Array, 3570 | async: boolean, 3571 | defaults: Array, 3572 | expression: boolean, 3573 | generator: boolean, 3574 | params: Array, 3575 | rest: ?Identifier, 3576 | returnType: ?TypeAnnotation, 3577 | typeParameters: ?TypeParameterDeclaration, 3578 | }; 3579 | 3580 | export type Identifier = { 3581 | type: 'Identifier', 3582 | _Identifier?: void, 3583 | name: string, 3584 | typeAnnotation: ?TypeAnnotation, 3585 | end: number, 3586 | innerComments: ?Array, 3587 | leadingComments: ?Array, 3588 | loc: { 3589 | end: {column: number, line: number}, 3590 | start: {column: number, line: number}, 3591 | }, 3592 | start: number, 3593 | trailingComments: ?Array, 3594 | }; 3595 | 3596 | export type IfStatement = { 3597 | type: 'IfStatement', 3598 | _IfStatement?: void, 3599 | alternate: ?Statement, 3600 | consequent: Statement, 3601 | test: Expression, 3602 | end: number, 3603 | innerComments: ?Array, 3604 | leadingComments: ?Array, 3605 | loc: { 3606 | end: {column: number, line: number}, 3607 | start: {column: number, line: number}, 3608 | }, 3609 | start: number, 3610 | trailingComments: ?Array, 3611 | }; 3612 | 3613 | // TODO: Make this correct. 3614 | export type ImportDefaultSpecifier = { 3615 | type: 'ImportDefaultSpecifier', 3616 | _ImportDefaultSpecifier?: void, 3617 | local: Node, 3618 | end: number, 3619 | innerComments: ?Array, 3620 | leadingComments: ?Array, 3621 | loc: { 3622 | end: {column: number, line: number}, 3623 | start: {column: number, line: number}, 3624 | }, 3625 | start: number, 3626 | trailingComments: ?Array, 3627 | }; 3628 | 3629 | // TODO: Make this correct. 3630 | export type ImportNamespaceSpecifier = { 3631 | type: 'ImportNamespaceSpecifier', 3632 | _ImportNamespaceSpecifier?: void, 3633 | local: Node, 3634 | end: number, 3635 | innerComments: ?Array, 3636 | leadingComments: ?Array, 3637 | loc: { 3638 | end: {column: number, line: number}, 3639 | start: {column: number, line: number}, 3640 | }, 3641 | start: number, 3642 | trailingComments: ?Array, 3643 | }; 3644 | 3645 | // TODO: Make this correct. 3646 | export type ImportDeclaration = { 3647 | type: 'ImportDeclaration', 3648 | _ImportDeclaration?: void, 3649 | specifiers: Array, 3650 | source: Literal, 3651 | end: number, 3652 | innerComments: ?Array, 3653 | leadingComments: ?Array, 3654 | loc: { 3655 | end: {column: number, line: number}, 3656 | start: {column: number, line: number}, 3657 | }, 3658 | start: number, 3659 | trailingComments: ?Array, 3660 | }; 3661 | 3662 | // TODO: Make this correct. 3663 | export type ImportSpecifier = { 3664 | type: 'ImportSpecifier', 3665 | _ImportSpecifier?: void, 3666 | imported: Node, 3667 | local: Node, 3668 | end: number, 3669 | innerComments: ?Array, 3670 | leadingComments: ?Array, 3671 | loc: { 3672 | end: {column: number, line: number}, 3673 | start: {column: number, line: number}, 3674 | }, 3675 | start: number, 3676 | trailingComments: ?Array, 3677 | }; 3678 | 3679 | export type LabeledStatement = { 3680 | type: 'LabeledStatement', 3681 | _LabeledStatement?: void, 3682 | body: Statement, 3683 | label: Identifier, 3684 | end: number, 3685 | innerComments: ?Array, 3686 | leadingComments: ?Array, 3687 | loc: { 3688 | end: {column: number, line: number}, 3689 | start: {column: number, line: number}, 3690 | }, 3691 | start: number, 3692 | trailingComments: ?Array, 3693 | }; 3694 | 3695 | export type Literal = { 3696 | type: 'Literal', 3697 | _Literal?: void, 3698 | raw: string, 3699 | regex: ?{pattern: string, flags: string}, 3700 | value: ?(string | boolean | number | RegExp), 3701 | end: number, 3702 | innerComments: ?Array, 3703 | leadingComments: ?Array, 3704 | loc: { 3705 | end: {column: number, line: number}, 3706 | start: {column: number, line: number}, 3707 | }, 3708 | start: number, 3709 | trailingComments: ?Array, 3710 | }; 3711 | 3712 | type LogicalOperator = '||' | '&&'; 3713 | 3714 | export type LogicalExpression = { 3715 | type: 'LogicalExpression', 3716 | _LogicalExpression?: void, 3717 | left: Expression, 3718 | operator: LogicalOperator, 3719 | right: Expression, 3720 | end: number, 3721 | innerComments: ?Array, 3722 | leadingComments: ?Array, 3723 | loc: { 3724 | end: {column: number, line: number}, 3725 | start: {column: number, line: number}, 3726 | }, 3727 | start: number, 3728 | trailingComments: ?Array, 3729 | }; 3730 | 3731 | export type MemberExpression = { 3732 | type: 'MemberExpression', 3733 | _MemberExpression?: void, 3734 | computed: boolean, 3735 | object: Expression, 3736 | property: Node, 3737 | end: number, 3738 | innerComments: ?Array, 3739 | leadingComments: ?Array, 3740 | loc: { 3741 | end: {column: number, line: number}, 3742 | start: {column: number, line: number}, 3743 | }, 3744 | start: number, 3745 | trailingComments: ?Array, 3746 | }; 3747 | 3748 | // TODO: Make this correct. 3749 | export type MetaProperty = { 3750 | type: 'MetaProperty', 3751 | _MetaProperty?: void, 3752 | meta: Node, 3753 | property: Node, 3754 | end: number, 3755 | innerComments: ?Array, 3756 | leadingComments: ?Array, 3757 | loc: { 3758 | end: {column: number, line: number}, 3759 | start: {column: number, line: number}, 3760 | }, 3761 | start: number, 3762 | trailingComments: ?Array, 3763 | }; 3764 | 3765 | export type MethodDefinition = { 3766 | type: 'MethodDefinition', 3767 | _MethodDefinition?: void, 3768 | computed: boolean, 3769 | key: Node, 3770 | kind: 'constructor' | 'method' | 'get' | 'set', 3771 | static: boolean, 3772 | value: FunctionExpression, 3773 | decorators: ?Array, 3774 | end: number, 3775 | innerComments: ?Array, 3776 | leadingComments: ?Array, 3777 | loc: { 3778 | end: {column: number, line: number}, 3779 | start: {column: number, line: number}, 3780 | }, 3781 | start: number, 3782 | trailingComments: ?Array, 3783 | }; 3784 | 3785 | export type NewExpression = { 3786 | type: 'NewExpression', 3787 | _NewExpression?: void, 3788 | arguments: Array, 3789 | callee: Expression, 3790 | end: number, 3791 | innerComments: ?Array, 3792 | leadingComments: ?Array, 3793 | loc: { 3794 | end: {column: number, line: number}, 3795 | start: {column: number, line: number}, 3796 | }, 3797 | start: number, 3798 | trailingComments: ?Array, 3799 | }; 3800 | 3801 | export type Noop = { 3802 | type: 'Noop', 3803 | _Noop?: void, 3804 | end: number, 3805 | innerComments: ?Array, 3806 | leadingComments: ?Array, 3807 | loc: { 3808 | end: {column: number, line: number}, 3809 | start: {column: number, line: number}, 3810 | }, 3811 | start: number, 3812 | trailingComments: ?Array, 3813 | }; 3814 | 3815 | export type ObjectExpression = { 3816 | type: 'ObjectExpression', 3817 | _ObjectExpression?: void, 3818 | properties: Array, 3819 | end: number, 3820 | innerComments: ?Array, 3821 | leadingComments: ?Array, 3822 | loc: { 3823 | end: {column: number, line: number}, 3824 | start: {column: number, line: number}, 3825 | }, 3826 | start: number, 3827 | trailingComments: ?Array, 3828 | }; 3829 | 3830 | export type ObjectPattern = { 3831 | type: 'ObjectPattern', 3832 | _ObjectPattern?: void, 3833 | properties: Array, 3834 | typeAnnotation: ?TypeAnnotation, 3835 | end: number, 3836 | innerComments: ?Array, 3837 | leadingComments: ?Array, 3838 | loc: { 3839 | end: {column: number, line: number}, 3840 | start: {column: number, line: number}, 3841 | }, 3842 | start: number, 3843 | trailingComments: ?Array, 3844 | }; 3845 | 3846 | export type Program = { 3847 | type: 'Program', 3848 | _Program?: void, 3849 | body: Array, 3850 | end: number, 3851 | innerComments: ?Array, 3852 | leadingComments: ?Array, 3853 | loc: { 3854 | end: {column: number, line: number}, 3855 | start: {column: number, line: number}, 3856 | }, 3857 | start: number, 3858 | trailingComments: ?Array, 3859 | }; 3860 | 3861 | export type Property = { 3862 | type: 'Property', 3863 | _Property?: void, 3864 | computed: boolean, 3865 | key: Node, 3866 | kind: 'init' | 'get' | 'set', 3867 | method: boolean, 3868 | shorthand: boolean, 3869 | value: Node, 3870 | decorators: ?Array, 3871 | end: number, 3872 | innerComments: ?Array, 3873 | leadingComments: ?Array, 3874 | loc: { 3875 | end: {column: number, line: number}, 3876 | start: {column: number, line: number}, 3877 | }, 3878 | start: number, 3879 | trailingComments: ?Array, 3880 | }; 3881 | 3882 | export type RestElement = { 3883 | type: 'RestElement', 3884 | _RestElement?: void, 3885 | argument: Pattern, 3886 | typeAnnotation: ?TypeAnnotation, 3887 | end: number, 3888 | innerComments: ?Array, 3889 | leadingComments: ?Array, 3890 | loc: { 3891 | end: {column: number, line: number}, 3892 | start: {column: number, line: number}, 3893 | }, 3894 | start: number, 3895 | trailingComments: ?Array, 3896 | }; 3897 | 3898 | export type ReturnStatement = { 3899 | type: 'ReturnStatement', 3900 | _ReturnStatement?: void, 3901 | argument: ?Expression, 3902 | end: number, 3903 | innerComments: ?Array, 3904 | leadingComments: ?Array, 3905 | loc: { 3906 | end: {column: number, line: number}, 3907 | start: {column: number, line: number}, 3908 | }, 3909 | start: number, 3910 | trailingComments: ?Array, 3911 | }; 3912 | 3913 | export type SequenceExpression = { 3914 | type: 'SequenceExpression', 3915 | _SequenceExpression?: void, 3916 | expression: Array, 3917 | end: number, 3918 | innerComments: ?Array, 3919 | leadingComments: ?Array, 3920 | loc: { 3921 | end: {column: number, line: number}, 3922 | start: {column: number, line: number}, 3923 | }, 3924 | start: number, 3925 | trailingComments: ?Array, 3926 | }; 3927 | 3928 | export type SpreadElement = { 3929 | type: 'SpreadElement', 3930 | _SpreadElement?: void, 3931 | argument: Expression, 3932 | end: number, 3933 | innerComments: ?Array, 3934 | leadingComments: ?Array, 3935 | loc: { 3936 | end: {column: number, line: number}, 3937 | start: {column: number, line: number}, 3938 | }, 3939 | start: number, 3940 | trailingComments: ?Array, 3941 | }; 3942 | 3943 | export type SpreadProperty = { 3944 | type: 'SpreadProperty', 3945 | _SpreadProperty?: void, 3946 | argument: Expression, 3947 | end: number, 3948 | innerComments: ?Array, 3949 | leadingComments: ?Array, 3950 | loc: { 3951 | end: {column: number, line: number}, 3952 | start: {column: number, line: number}, 3953 | }, 3954 | start: number, 3955 | trailingComments: ?Array, 3956 | }; 3957 | 3958 | export type Super = { 3959 | type: 'Super', 3960 | _Super?: void, 3961 | end: number, 3962 | innerComments: ?Array, 3963 | leadingComments: ?Array, 3964 | loc: { 3965 | end: {column: number, line: number}, 3966 | start: {column: number, line: number}, 3967 | }, 3968 | start: number, 3969 | trailingComments: ?Array, 3970 | }; 3971 | 3972 | export type SwitchCase = { 3973 | type: 'SwitchCase', 3974 | _SwitchCase?: void, 3975 | consequent: Array, 3976 | test: ?Expression, 3977 | end: number, 3978 | innerComments: ?Array, 3979 | leadingComments: ?Array, 3980 | loc: { 3981 | end: {column: number, line: number}, 3982 | start: {column: number, line: number}, 3983 | }, 3984 | start: number, 3985 | trailingComments: ?Array, 3986 | }; 3987 | 3988 | export type SwitchStatement = { 3989 | type: 'SwitchStatement', 3990 | _SwitchStatement?: void, 3991 | cases: Array, 3992 | discriminant: Expression, 3993 | lexical: boolean, 3994 | end: number, 3995 | innerComments: ?Array, 3996 | leadingComments: ?Array, 3997 | loc: { 3998 | end: {column: number, line: number}, 3999 | start: {column: number, line: number}, 4000 | }, 4001 | start: number, 4002 | trailingComments: ?Array, 4003 | }; 4004 | 4005 | export type TaggedTemplateExpression = { 4006 | type: 'TaggedTemplateExpression', 4007 | _TaggedTemplateExpression?: void, 4008 | quasi: TemplateLiteral, 4009 | tag: Expression, 4010 | end: number, 4011 | innerComments: ?Array, 4012 | leadingComments: ?Array, 4013 | loc: { 4014 | end: {column: number, line: number}, 4015 | start: {column: number, line: number}, 4016 | }, 4017 | start: number, 4018 | trailingComments: ?Array, 4019 | }; 4020 | 4021 | export type TemplateElement = { 4022 | type: 'TemplateElement', 4023 | _TemplateElement?: void, 4024 | tail: boolean, 4025 | value: {cooked: string, raw: string}, 4026 | end: number, 4027 | innerComments: ?Array, 4028 | leadingComments: ?Array, 4029 | loc: { 4030 | end: {column: number, line: number}, 4031 | start: {column: number, line: number}, 4032 | }, 4033 | start: number, 4034 | trailingComments: ?Array, 4035 | }; 4036 | 4037 | export type TemplateLiteral = { 4038 | type: 'TemplateLiteral', 4039 | _TemplateLiteral?: void, 4040 | expressions: Array, 4041 | quasis: Array, 4042 | end: number, 4043 | innerComments: ?Array, 4044 | leadingComments: ?Array, 4045 | loc: { 4046 | end: {column: number, line: number}, 4047 | start: {column: number, line: number}, 4048 | }, 4049 | start: number, 4050 | trailingComments: ?Array, 4051 | }; 4052 | 4053 | export type ThisExpression = { 4054 | type: 'ThisExpression', 4055 | _ThisExpression?: void, 4056 | end: number, 4057 | innerComments: ?Array, 4058 | leadingComments: ?Array, 4059 | loc: { 4060 | end: {column: number, line: number}, 4061 | start: {column: number, line: number}, 4062 | }, 4063 | start: number, 4064 | trailingComments: ?Array, 4065 | }; 4066 | 4067 | export type ThrowStatement = { 4068 | type: 'ThrowStatement', 4069 | _ThrowStatement?: void, 4070 | argument: Expression, 4071 | end: number, 4072 | innerComments: ?Array, 4073 | leadingComments: ?Array, 4074 | loc: { 4075 | end: {column: number, line: number}, 4076 | start: {column: number, line: number}, 4077 | }, 4078 | start: number, 4079 | trailingComments: ?Array, 4080 | }; 4081 | 4082 | export type TryStatement = { 4083 | type: 'TryStatement', 4084 | _TryStatement?: void, 4085 | block: BlockStatement, 4086 | finalizer: ?BlockStatement, 4087 | guardedHandlers: Array, 4088 | handler: ?CatchClause, 4089 | handlers: ?Array, 4090 | end: number, 4091 | innerComments: ?Array, 4092 | leadingComments: ?Array, 4093 | loc: { 4094 | end: {column: number, line: number}, 4095 | start: {column: number, line: number}, 4096 | }, 4097 | start: number, 4098 | trailingComments: ?Array, 4099 | }; 4100 | 4101 | type UnaryOperator = '-' | '+' | '!' | '~' | 'typeof' | 'void' | 'delete'; 4102 | 4103 | export type UnaryExpression = { 4104 | type: 'UnaryExpression', 4105 | _UnaryExpression?: void, 4106 | argument: Expression, 4107 | operator: UnaryOperator, 4108 | prefix: true, 4109 | end: number, 4110 | innerComments: ?Array, 4111 | leadingComments: ?Array, 4112 | loc: { 4113 | end: {column: number, line: number}, 4114 | start: {column: number, line: number}, 4115 | }, 4116 | start: number, 4117 | trailingComments: ?Array, 4118 | }; 4119 | 4120 | type UpdateOperator = '++' | '--'; 4121 | 4122 | export type UpdateExpression = { 4123 | type: 'UpdateExpression', 4124 | _UpdateExpression?: void, 4125 | argument: Expression, 4126 | operator: UpdateOperator, 4127 | prefix: boolean, 4128 | end: number, 4129 | innerComments: ?Array, 4130 | leadingComments: ?Array, 4131 | loc: { 4132 | end: {column: number, line: number}, 4133 | start: {column: number, line: number}, 4134 | }, 4135 | start: number, 4136 | trailingComments: ?Array, 4137 | }; 4138 | 4139 | export type VariableDeclaration = { 4140 | type: 'VariableDeclaration', 4141 | _VariableDeclaration?: void, 4142 | declarations: Array, 4143 | kind: 'var' | 'let' | 'const', 4144 | end: number, 4145 | innerComments: ?Array, 4146 | leadingComments: ?Array, 4147 | loc: { 4148 | end: {column: number, line: number}, 4149 | start: {column: number, line: number}, 4150 | }, 4151 | start: number, 4152 | trailingComments: ?Array, 4153 | }; 4154 | 4155 | export type VariableDeclarator = { 4156 | type: 'VariableDeclarator', 4157 | _VariableDeclarator?: void, 4158 | id: Pattern, 4159 | init: ?Expression, 4160 | end: number, 4161 | innerComments: ?Array, 4162 | leadingComments: ?Array, 4163 | loc: { 4164 | end: {column: number, line: number}, 4165 | start: {column: number, line: number}, 4166 | }, 4167 | start: number, 4168 | trailingComments: ?Array, 4169 | }; 4170 | 4171 | export type WhileStatement = { 4172 | type: 'WhileStatement', 4173 | _WhileStatement?: void, 4174 | body: Statement, 4175 | test: Expression, 4176 | end: number, 4177 | innerComments: ?Array, 4178 | leadingComments: ?Array, 4179 | loc: { 4180 | end: {column: number, line: number}, 4181 | start: {column: number, line: number}, 4182 | }, 4183 | start: number, 4184 | trailingComments: ?Array, 4185 | }; 4186 | 4187 | export type WithStatement = { 4188 | type: 'WithStatement', 4189 | _WithStatement?: void, 4190 | body: Statement, 4191 | object: Expression, 4192 | end: number, 4193 | innerComments: ?Array, 4194 | leadingComments: ?Array, 4195 | loc: { 4196 | end: {column: number, line: number}, 4197 | start: {column: number, line: number}, 4198 | }, 4199 | start: number, 4200 | trailingComments: ?Array, 4201 | }; 4202 | 4203 | export type YieldExpression = { 4204 | type: 'YieldExpression', 4205 | _YieldExpression?: void, 4206 | argument: ?Expression, 4207 | delegate: boolean, 4208 | end: number, 4209 | innerComments: ?Array, 4210 | leadingComments: ?Array, 4211 | loc: { 4212 | end: {column: number, line: number}, 4213 | start: {column: number, line: number}, 4214 | }, 4215 | start: number, 4216 | trailingComments: ?Array, 4217 | }; 4218 | 4219 | // TODO: Make this correct. 4220 | export type ExportAllDeclaration = { 4221 | type: 'ExportAllDeclaration', 4222 | _ExportAllDeclaration?: void, 4223 | exported: Node, 4224 | source: Node, 4225 | end: number, 4226 | innerComments: ?Array, 4227 | leadingComments: ?Array, 4228 | loc: { 4229 | end: {column: number, line: number}, 4230 | start: {column: number, line: number}, 4231 | }, 4232 | start: number, 4233 | trailingComments: ?Array, 4234 | }; 4235 | 4236 | // TODO: Make this correct. 4237 | export type ExportDefaultDeclaration = { 4238 | type: 'ExportDefaultDeclaration', 4239 | _ExportDefaultDeclaration?: void, 4240 | declaration: Node, 4241 | end: number, 4242 | innerComments: ?Array, 4243 | leadingComments: ?Array, 4244 | loc: { 4245 | end: {column: number, line: number}, 4246 | start: {column: number, line: number}, 4247 | }, 4248 | start: number, 4249 | trailingComments: ?Array, 4250 | }; 4251 | 4252 | // TODO: Make this correct. 4253 | export type ExportNamedDeclaration = { 4254 | type: 'ExportNamedDeclaration', 4255 | _ExportNamedDeclaration?: void, 4256 | declaration: Node, 4257 | source: Literal, 4258 | specifiers: Array, 4259 | end: number, 4260 | innerComments: ?Array, 4261 | leadingComments: ?Array, 4262 | loc: { 4263 | end: {column: number, line: number}, 4264 | start: {column: number, line: number}, 4265 | }, 4266 | start: number, 4267 | trailingComments: ?Array, 4268 | }; 4269 | 4270 | // TODO: Make this correct. 4271 | export type ExportDefaultSpecifier = { 4272 | type: 'ExportDefaultSpecifier', 4273 | _ExportDefaultSpecifier?: void, 4274 | exported: Node, 4275 | end: number, 4276 | innerComments: ?Array, 4277 | leadingComments: ?Array, 4278 | loc: { 4279 | end: {column: number, line: number}, 4280 | start: {column: number, line: number}, 4281 | }, 4282 | start: number, 4283 | trailingComments: ?Array, 4284 | }; 4285 | 4286 | // TODO: Make this correct. 4287 | export type ExportNamespaceSpecifier = { 4288 | type: 'ExportNamespaceSpecifier', 4289 | _ExportNamespaceSpecifier?: void, 4290 | exported: Node, 4291 | end: number, 4292 | innerComments: ?Array, 4293 | leadingComments: ?Array, 4294 | loc: { 4295 | end: {column: number, line: number}, 4296 | start: {column: number, line: number}, 4297 | }, 4298 | start: number, 4299 | trailingComments: ?Array, 4300 | }; 4301 | 4302 | // TODO: Make this correct. 4303 | export type ExportSpecifier = { 4304 | type: 'ExportSpecifier', 4305 | _ExportSpecifier?: void, 4306 | local: Node, 4307 | exported: Node, 4308 | end: number, 4309 | innerComments: ?Array, 4310 | leadingComments: ?Array, 4311 | loc: { 4312 | end: {column: number, line: number}, 4313 | start: {column: number, line: number}, 4314 | }, 4315 | start: number, 4316 | trailingComments: ?Array, 4317 | }; 4318 | 4319 | export type AnyTypeAnnotation = { 4320 | type: 'AnyTypeAnnotation', 4321 | _AnyTypeAnnotation?: void, 4322 | end: number, 4323 | innerComments: ?Array, 4324 | leadingComments: ?Array, 4325 | loc: { 4326 | end: {column: number, line: number}, 4327 | start: {column: number, line: number}, 4328 | }, 4329 | start: number, 4330 | trailingComments: ?Array, 4331 | }; 4332 | 4333 | export type ArrayTypeAnnotation = { 4334 | type: 'ArrayTypeAnnotation', 4335 | _ArrayTypeAnnotation?: void, 4336 | elementType: Type, 4337 | end: number, 4338 | innerComments: ?Array, 4339 | leadingComments: ?Array, 4340 | loc: { 4341 | end: {column: number, line: number}, 4342 | start: {column: number, line: number}, 4343 | }, 4344 | start: number, 4345 | trailingComments: ?Array, 4346 | }; 4347 | 4348 | export type BooleanLiteralTypeAnnotation = { 4349 | type: 'BooleanLiteralTypeAnnotation', 4350 | _BooleanLiteralTypeAnnotation?: void, 4351 | raw: string, 4352 | value: boolean, 4353 | end: number, 4354 | innerComments: ?Array, 4355 | leadingComments: ?Array, 4356 | loc: { 4357 | end: {column: number, line: number}, 4358 | start: {column: number, line: number}, 4359 | }, 4360 | start: number, 4361 | trailingComments: ?Array, 4362 | }; 4363 | 4364 | export type BooleanTypeAnnotation = { 4365 | type: 'BooleanTypeAnnotation', 4366 | _BooleanTypeAnnotation?: void, 4367 | end: number, 4368 | innerComments: ?Array, 4369 | leadingComments: ?Array, 4370 | loc: { 4371 | end: {column: number, line: number}, 4372 | start: {column: number, line: number}, 4373 | }, 4374 | start: number, 4375 | trailingComments: ?Array, 4376 | }; 4377 | 4378 | export type ClassImplements = { 4379 | type: 'ClassImplements', 4380 | _ClassImplements?: void, 4381 | id: Identifier, 4382 | typeParameters: ?TypeParameterInstantiation, 4383 | superClass: ?Expression, 4384 | end: number, 4385 | innerComments: ?Array, 4386 | leadingComments: ?Array, 4387 | loc: { 4388 | end: {column: number, line: number}, 4389 | start: {column: number, line: number}, 4390 | }, 4391 | start: number, 4392 | trailingComments: ?Array, 4393 | }; 4394 | 4395 | export type ClassProperty = { 4396 | type: 'ClassProperty', 4397 | _ClassProperty?: void, 4398 | computed: boolean, 4399 | key: Node, 4400 | static: boolean, 4401 | typeAnnotation: ?TypeAnnotation, 4402 | value: ?Expression, 4403 | decorators: Array, 4404 | end: number, 4405 | innerComments: ?Array, 4406 | leadingComments: ?Array, 4407 | loc: { 4408 | end: {column: number, line: number}, 4409 | start: {column: number, line: number}, 4410 | }, 4411 | start: number, 4412 | trailingComments: ?Array, 4413 | }; 4414 | 4415 | export type DeclareClass = { 4416 | type: 'DeclareClass', 4417 | _DeclareClass?: void, 4418 | body: ObjectTypeAnnotation, 4419 | extends: Array, 4420 | id: Identifier, 4421 | typeParameters: ?TypeParameterDeclaration, 4422 | end: number, 4423 | innerComments: ?Array, 4424 | leadingComments: ?Array, 4425 | loc: { 4426 | end: {column: number, line: number}, 4427 | start: {column: number, line: number}, 4428 | }, 4429 | start: number, 4430 | trailingComments: ?Array, 4431 | }; 4432 | 4433 | // TODO: Make this correct. 4434 | export type DeclareFunction = { 4435 | type: 'DeclareFunction', 4436 | _DeclareFunction?: void, 4437 | id: Identifier, 4438 | end: number, 4439 | innerComments: ?Array, 4440 | leadingComments: ?Array, 4441 | loc: { 4442 | end: {column: number, line: number}, 4443 | start: {column: number, line: number}, 4444 | }, 4445 | start: number, 4446 | trailingComments: ?Array, 4447 | }; 4448 | 4449 | export type DeclareModule = { 4450 | type: 'DeclareModule', 4451 | _DeclareModule?: void, 4452 | body: BlockStatement, 4453 | id: Node, 4454 | end: number, 4455 | innerComments: ?Array, 4456 | leadingComments: ?Array, 4457 | loc: { 4458 | end: {column: number, line: number}, 4459 | start: {column: number, line: number}, 4460 | }, 4461 | start: number, 4462 | trailingComments: ?Array, 4463 | }; 4464 | 4465 | // TODO: Make this correct. 4466 | export type DeclareVariable = { 4467 | type: 'DeclareVariable', 4468 | _DeclareVariable?: void, 4469 | id: Identifier, 4470 | end: number, 4471 | innerComments: ?Array, 4472 | leadingComments: ?Array, 4473 | loc: { 4474 | end: {column: number, line: number}, 4475 | start: {column: number, line: number}, 4476 | }, 4477 | start: number, 4478 | trailingComments: ?Array, 4479 | }; 4480 | 4481 | export type FunctionTypeAnnotation = { 4482 | type: 'FunctionTypeAnnotation', 4483 | _FunctionTypeAnnotation?: void, 4484 | params: Array, 4485 | rest: ?FunctionTypeParam, 4486 | returnType: Type, 4487 | typeParameters: ?TypeParameterDeclaration, 4488 | end: number, 4489 | innerComments: ?Array, 4490 | leadingComments: ?Array, 4491 | loc: { 4492 | end: {column: number, line: number}, 4493 | start: {column: number, line: number}, 4494 | }, 4495 | start: number, 4496 | trailingComments: ?Array, 4497 | }; 4498 | 4499 | export type FunctionTypeParam = { 4500 | type: 'FunctionTypeParam', 4501 | _FunctionTypeParam?: void, 4502 | name: Identifier, 4503 | optional: boolean, 4504 | typeAnnotation: Type, 4505 | end: number, 4506 | innerComments: ?Array, 4507 | leadingComments: ?Array, 4508 | loc: { 4509 | end: {column: number, line: number}, 4510 | start: {column: number, line: number}, 4511 | }, 4512 | start: number, 4513 | trailingComments: ?Array, 4514 | }; 4515 | 4516 | export type GenericTypeAnnotation = { 4517 | type: 'GenericTypeAnnotation', 4518 | _GenericTypeAnnotation?: void, 4519 | id: Node, 4520 | typeParameters: ?TypeParameterInstantiation, 4521 | end: number, 4522 | innerComments: ?Array, 4523 | leadingComments: ?Array, 4524 | loc: { 4525 | end: {column: number, line: number}, 4526 | start: {column: number, line: number}, 4527 | }, 4528 | start: number, 4529 | trailingComments: ?Array, 4530 | }; 4531 | 4532 | export type InterfaceExtends = { 4533 | type: 'InterfaceExtends', 4534 | _InterfaceExtends?: void, 4535 | id: Identifier, 4536 | typeParameters: ?TypeParameterInstantiation, 4537 | end: number, 4538 | innerComments: ?Array, 4539 | leadingComments: ?Array, 4540 | loc: { 4541 | end: {column: number, line: number}, 4542 | start: {column: number, line: number}, 4543 | }, 4544 | start: number, 4545 | trailingComments: ?Array, 4546 | }; 4547 | 4548 | export type InterfaceDeclaration = { 4549 | type: 'InterfaceDeclaration', 4550 | _InterfaceDeclaration?: void, 4551 | body: ObjectTypeAnnotation, 4552 | extends: Array, 4553 | id: Identifier, 4554 | typeParameters: ?TypeParameterDeclaration, 4555 | end: number, 4556 | innerComments: ?Array, 4557 | leadingComments: ?Array, 4558 | loc: { 4559 | end: {column: number, line: number}, 4560 | start: {column: number, line: number}, 4561 | }, 4562 | start: number, 4563 | trailingComments: ?Array, 4564 | }; 4565 | 4566 | export type IntersectionTypeAnnotation = { 4567 | type: 'IntersectionTypeAnnotation', 4568 | _IntersectionTypeAnnotation?: void, 4569 | types: Array, 4570 | end: number, 4571 | innerComments: ?Array, 4572 | leadingComments: ?Array, 4573 | loc: { 4574 | end: {column: number, line: number}, 4575 | start: {column: number, line: number}, 4576 | }, 4577 | start: number, 4578 | trailingComments: ?Array, 4579 | }; 4580 | 4581 | export type MixedTypeAnnotation = { 4582 | type: 'MixedTypeAnnotation', 4583 | _MixedTypeAnnotation?: void, 4584 | end: number, 4585 | innerComments: ?Array, 4586 | leadingComments: ?Array, 4587 | loc: { 4588 | end: {column: number, line: number}, 4589 | start: {column: number, line: number}, 4590 | }, 4591 | start: number, 4592 | trailingComments: ?Array, 4593 | }; 4594 | 4595 | export type NullableTypeAnnotation = { 4596 | type: 'NullableTypeAnnotation', 4597 | _NullableTypeAnnotation?: void, 4598 | typeAnnotation: Type, 4599 | end: number, 4600 | innerComments: ?Array, 4601 | leadingComments: ?Array, 4602 | loc: { 4603 | end: {column: number, line: number}, 4604 | start: {column: number, line: number}, 4605 | }, 4606 | start: number, 4607 | trailingComments: ?Array, 4608 | }; 4609 | 4610 | export type NumberLiteralTypeAnnotation = { 4611 | type: 'NumberLiteralTypeAnnotation', 4612 | _NumberLiteralTypeAnnotation?: void, 4613 | raw: string, 4614 | value: number, 4615 | end: number, 4616 | innerComments: ?Array, 4617 | leadingComments: ?Array, 4618 | loc: { 4619 | end: {column: number, line: number}, 4620 | start: {column: number, line: number}, 4621 | }, 4622 | start: number, 4623 | trailingComments: ?Array, 4624 | }; 4625 | 4626 | export type NumberTypeAnnotation = { 4627 | type: 'NumberTypeAnnotation', 4628 | _NumberTypeAnnotation?: void, 4629 | end: number, 4630 | innerComments: ?Array, 4631 | leadingComments: ?Array, 4632 | loc: { 4633 | end: {column: number, line: number}, 4634 | start: {column: number, line: number}, 4635 | }, 4636 | start: number, 4637 | trailingComments: ?Array, 4638 | }; 4639 | 4640 | export type StringLiteralTypeAnnotation = { 4641 | type: 'StringLiteralTypeAnnotation', 4642 | _StringLiteralTypeAnnotation?: void, 4643 | raw: string, 4644 | value: string, 4645 | end: number, 4646 | innerComments: ?Array, 4647 | leadingComments: ?Array, 4648 | loc: { 4649 | end: {column: number, line: number}, 4650 | start: {column: number, line: number}, 4651 | }, 4652 | start: number, 4653 | trailingComments: ?Array, 4654 | }; 4655 | 4656 | export type StringTypeAnnotation = { 4657 | type: 'StringTypeAnnotation', 4658 | _StringTypeAnnotation?: void, 4659 | end: number, 4660 | innerComments: ?Array, 4661 | leadingComments: ?Array, 4662 | loc: { 4663 | end: {column: number, line: number}, 4664 | start: {column: number, line: number}, 4665 | }, 4666 | start: number, 4667 | trailingComments: ?Array, 4668 | }; 4669 | 4670 | export type TupleTypeAnnotation = { 4671 | type: 'TupleTypeAnnotation', 4672 | _TupleTypeAnnotation?: void, 4673 | types: Array, 4674 | end: number, 4675 | innerComments: ?Array, 4676 | leadingComments: ?Array, 4677 | loc: { 4678 | end: {column: number, line: number}, 4679 | start: {column: number, line: number}, 4680 | }, 4681 | start: number, 4682 | trailingComments: ?Array, 4683 | }; 4684 | 4685 | export type TypeofTypeAnnotation = { 4686 | type: 'TypeofTypeAnnotation', 4687 | _TypeofTypeAnnotation?: void, 4688 | argument: Type, 4689 | end: number, 4690 | innerComments: ?Array, 4691 | leadingComments: ?Array, 4692 | loc: { 4693 | end: {column: number, line: number}, 4694 | start: {column: number, line: number}, 4695 | }, 4696 | start: number, 4697 | trailingComments: ?Array, 4698 | }; 4699 | 4700 | export type TypeAlias = { 4701 | type: 'TypeAlias', 4702 | _TypeAlias?: void, 4703 | id: Identifier, 4704 | right: Type, 4705 | typeParameters: ?TypeParameterDeclaration, 4706 | end: number, 4707 | innerComments: ?Array, 4708 | leadingComments: ?Array, 4709 | loc: { 4710 | end: {column: number, line: number}, 4711 | start: {column: number, line: number}, 4712 | }, 4713 | start: number, 4714 | trailingComments: ?Array, 4715 | }; 4716 | 4717 | export type TypeAnnotation = { 4718 | type: 'TypeAnnotation', 4719 | _TypeAnnotation?: void, 4720 | typeAnnotation: Type, 4721 | end: number, 4722 | innerComments: ?Array, 4723 | leadingComments: ?Array, 4724 | loc: { 4725 | end: {column: number, line: number}, 4726 | start: {column: number, line: number}, 4727 | }, 4728 | start: number, 4729 | trailingComments: ?Array, 4730 | }; 4731 | 4732 | export type TypeCastExpression = { 4733 | type: 'TypeCastExpression', 4734 | _TypeCastExpression?: void, 4735 | expression: Expression, 4736 | typeAnnotation: TypeAnnotation, 4737 | end: number, 4738 | innerComments: ?Array, 4739 | leadingComments: ?Array, 4740 | loc: { 4741 | end: {column: number, line: number}, 4742 | start: {column: number, line: number}, 4743 | }, 4744 | start: number, 4745 | trailingComments: ?Array, 4746 | }; 4747 | 4748 | export type TypeParameterDeclaration = { 4749 | type: 'TypeParameterDeclaration', 4750 | _TypeParameterDeclaration?: void, 4751 | params: Array, 4752 | end: number, 4753 | innerComments: ?Array, 4754 | leadingComments: ?Array, 4755 | loc: { 4756 | end: {column: number, line: number}, 4757 | start: {column: number, line: number}, 4758 | }, 4759 | start: number, 4760 | trailingComments: ?Array, 4761 | }; 4762 | 4763 | export type TypeParameterInstantiation = { 4764 | type: 'TypeParameterInstantiation', 4765 | _TypeParameterInstantiation?: void, 4766 | params: Array, 4767 | end: number, 4768 | innerComments: ?Array, 4769 | leadingComments: ?Array, 4770 | loc: { 4771 | end: {column: number, line: number}, 4772 | start: {column: number, line: number}, 4773 | }, 4774 | start: number, 4775 | trailingComments: ?Array, 4776 | }; 4777 | 4778 | export type ObjectTypeAnnotation = { 4779 | type: 'ObjectTypeAnnotation', 4780 | _ObjectTypeAnnotation?: void, 4781 | callProperties: Array, 4782 | indexers: Array, 4783 | properties: Array, 4784 | end: number, 4785 | innerComments: ?Array, 4786 | leadingComments: ?Array, 4787 | loc: { 4788 | end: {column: number, line: number}, 4789 | start: {column: number, line: number}, 4790 | }, 4791 | start: number, 4792 | trailingComments: ?Array, 4793 | }; 4794 | 4795 | export type ObjectTypeCallProperty = { 4796 | type: 'ObjectTypeCallProperty', 4797 | _ObjectTypeCallProperty?: void, 4798 | static: boolean, 4799 | value: FunctionTypeAnnotation, 4800 | end: number, 4801 | innerComments: ?Array, 4802 | leadingComments: ?Array, 4803 | loc: { 4804 | end: {column: number, line: number}, 4805 | start: {column: number, line: number}, 4806 | }, 4807 | start: number, 4808 | trailingComments: ?Array, 4809 | }; 4810 | 4811 | export type ObjectTypeIndexer = { 4812 | type: 'ObjectTypeIndexer', 4813 | _ObjectTypeIndexer?: void, 4814 | id: Identifier, 4815 | key: Type, 4816 | value: Type, 4817 | end: number, 4818 | innerComments: ?Array, 4819 | leadingComments: ?Array, 4820 | loc: { 4821 | end: {column: number, line: number}, 4822 | start: {column: number, line: number}, 4823 | }, 4824 | start: number, 4825 | trailingComments: ?Array, 4826 | }; 4827 | 4828 | export type ObjectTypeProperty = { 4829 | type: 'ObjectTypeProperty', 4830 | _ObjectTypeProperty?: void, 4831 | key: Node, 4832 | optional: boolean, 4833 | value: Type, 4834 | end: number, 4835 | innerComments: ?Array, 4836 | leadingComments: ?Array, 4837 | loc: { 4838 | end: {column: number, line: number}, 4839 | start: {column: number, line: number}, 4840 | }, 4841 | start: number, 4842 | trailingComments: ?Array, 4843 | }; 4844 | 4845 | export type QualifiedTypeIdentifier = { 4846 | type: 'QualifiedTypeIdentifier', 4847 | _QualifiedTypeIdentifier?: void, 4848 | id: Identifier, 4849 | qualification: Node, 4850 | end: number, 4851 | innerComments: ?Array, 4852 | leadingComments: ?Array, 4853 | loc: { 4854 | end: {column: number, line: number}, 4855 | start: {column: number, line: number}, 4856 | }, 4857 | start: number, 4858 | trailingComments: ?Array, 4859 | }; 4860 | 4861 | export type UnionTypeAnnotation = { 4862 | type: 'UnionTypeAnnotation', 4863 | _UnionTypeAnnotation?: void, 4864 | types: Array, 4865 | end: number, 4866 | innerComments: ?Array, 4867 | leadingComments: ?Array, 4868 | loc: { 4869 | end: {column: number, line: number}, 4870 | start: {column: number, line: number}, 4871 | }, 4872 | start: number, 4873 | trailingComments: ?Array, 4874 | }; 4875 | 4876 | export type VoidTypeAnnotation = { 4877 | type: 'VoidTypeAnnotation', 4878 | _VoidTypeAnnotation?: void, 4879 | end: number, 4880 | innerComments: ?Array, 4881 | leadingComments: ?Array, 4882 | loc: { 4883 | end: {column: number, line: number}, 4884 | start: {column: number, line: number}, 4885 | }, 4886 | start: number, 4887 | trailingComments: ?Array, 4888 | }; 4889 | 4890 | export type JSXAttribute = { 4891 | type: 'JSXAttribute', 4892 | _JSXAttribute?: void, 4893 | name: Node, 4894 | value: ?Node, 4895 | end: number, 4896 | innerComments: ?Array, 4897 | leadingComments: ?Array, 4898 | loc: { 4899 | end: {column: number, line: number}, 4900 | start: {column: number, line: number}, 4901 | }, 4902 | start: number, 4903 | trailingComments: ?Array, 4904 | }; 4905 | 4906 | export type JSXClosingElement = { 4907 | type: 'JSXClosingElement', 4908 | _JSXClosingElement?: void, 4909 | name: Node, 4910 | end: number, 4911 | innerComments: ?Array, 4912 | leadingComments: ?Array, 4913 | loc: { 4914 | end: {column: number, line: number}, 4915 | start: {column: number, line: number}, 4916 | }, 4917 | start: number, 4918 | trailingComments: ?Array, 4919 | }; 4920 | 4921 | export type JSXElement = { 4922 | type: 'JSXElement', 4923 | _JSXElement?: void, 4924 | children: Array, 4925 | closingElement: ?JSXClosingElement, 4926 | openingElement: JSXOpeningElement, 4927 | end: number, 4928 | innerComments: ?Array, 4929 | leadingComments: ?Array, 4930 | loc: { 4931 | end: {column: number, line: number}, 4932 | start: {column: number, line: number}, 4933 | }, 4934 | start: number, 4935 | trailingComments: ?Array, 4936 | }; 4937 | 4938 | export type JSXEmptyExpression = { 4939 | type: 'JSXEmptyExpression', 4940 | _JSXEmptyExpression?: void, 4941 | end: number, 4942 | innerComments: ?Array, 4943 | leadingComments: ?Array, 4944 | loc: { 4945 | end: {column: number, line: number}, 4946 | start: {column: number, line: number}, 4947 | }, 4948 | start: number, 4949 | trailingComments: ?Array, 4950 | }; 4951 | 4952 | export type JSXExpressionContainer = { 4953 | type: 'JSXExpressionContainer', 4954 | _JSXExpressionContainer?: void, 4955 | expression: Expression, 4956 | end: number, 4957 | innerComments: ?Array, 4958 | leadingComments: ?Array, 4959 | loc: { 4960 | end: {column: number, line: number}, 4961 | start: {column: number, line: number}, 4962 | }, 4963 | start: number, 4964 | trailingComments: ?Array, 4965 | }; 4966 | 4967 | export type JSXIdentifier = { 4968 | type: 'JSXIdentifier', 4969 | _JSXIdentifier?: void, 4970 | name: string, 4971 | end: number, 4972 | innerComments: ?Array, 4973 | leadingComments: ?Array, 4974 | loc: { 4975 | end: {column: number, line: number}, 4976 | start: {column: number, line: number}, 4977 | }, 4978 | start: number, 4979 | trailingComments: ?Array, 4980 | }; 4981 | 4982 | export type JSXMemberExpression = { 4983 | type: 'JSXMemberExpression', 4984 | _JSXMemberExpression?: void, 4985 | computed: boolean, 4986 | object: Node, 4987 | property: JSXIdentifier, 4988 | end: number, 4989 | innerComments: ?Array, 4990 | leadingComments: ?Array, 4991 | loc: { 4992 | end: {column: number, line: number}, 4993 | start: {column: number, line: number}, 4994 | }, 4995 | start: number, 4996 | trailingComments: ?Array, 4997 | }; 4998 | 4999 | export type JSXNamespacedName = { 5000 | type: 'JSXNamespacedName', 5001 | _JSXNamespacedName?: void, 5002 | name: JSXIdentifier, 5003 | namespace: JSXIdentifier, 5004 | end: number, 5005 | innerComments: ?Array, 5006 | leadingComments: ?Array, 5007 | loc: { 5008 | end: {column: number, line: number}, 5009 | start: {column: number, line: number}, 5010 | }, 5011 | start: number, 5012 | trailingComments: ?Array, 5013 | }; 5014 | 5015 | export type JSXOpeningElement = { 5016 | type: 'JSXOpeningElement', 5017 | _JSXOpeningElement?: void, 5018 | attributes: Array, 5019 | name: Array, 5020 | selfClosing: boolean, 5021 | end: number, 5022 | innerComments: ?Array, 5023 | leadingComments: ?Array, 5024 | loc: { 5025 | end: {column: number, line: number}, 5026 | start: {column: number, line: number}, 5027 | }, 5028 | start: number, 5029 | trailingComments: ?Array, 5030 | }; 5031 | 5032 | export type JSXSpreadAttribute = { 5033 | type: 'JSXSpreadAttribute', 5034 | _JSXSpreadAttribute?: void, 5035 | argument: Expression, 5036 | end: number, 5037 | innerComments: ?Array, 5038 | leadingComments: ?Array, 5039 | loc: { 5040 | end: {column: number, line: number}, 5041 | start: {column: number, line: number}, 5042 | }, 5043 | start: number, 5044 | trailingComments: ?Array, 5045 | }; 5046 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ast-types-flow", 3 | "version": "0.0.8", 4 | "description": "Flow types for the Javascript AST", 5 | "main": "lib/types.js", 6 | "files": [ 7 | "lib" 8 | ], 9 | "scripts": { 10 | "build": "gulp build", 11 | "test": "flow" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "git+https://github.com/kyldvs/ast-types-flow.git" 16 | }, 17 | "keywords": [ 18 | "flow", 19 | "ast", 20 | "javascript" 21 | ], 22 | "author": "kyldvs", 23 | "license": "MIT", 24 | "bugs": { 25 | "url": "https://github.com/kyldvs/ast-types-flow/issues" 26 | }, 27 | "homepage": "https://github.com/kyldvs/ast-types-flow#readme", 28 | "devDependencies": { 29 | "gulp": "^3.9.0", 30 | "gulp-util": "^3.0.6", 31 | "jscodeshift": "^0.3.7", 32 | "nuclide-node-transpiler": "0.0.30", 33 | "through2": "^2.0.0" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /scripts/build-types.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('nuclide-node-transpiler'); 4 | 5 | var PluginError = require('gulp-util/lib/PluginError'); 6 | 7 | var through = require('through2'); 8 | var transform = require('./transform'); 9 | 10 | function createError(file, message) { 11 | return new PluginError(pluginName, file.path + ': ' + message, { 12 | fileName: file.path, 13 | showStack: false 14 | }); 15 | } 16 | 17 | function buildTypes(file, encoding, callback) { 18 | if (file.isNull()) { 19 | return callback(null, file); 20 | } 21 | 22 | if (file.isStream()) { 23 | return callback(createError(file, 'Streaming not supported')); 24 | } 25 | 26 | // Do the jscodeshift magic. 27 | var result = transform(String(file.contents)); 28 | file.contents = new Buffer(result); 29 | 30 | callback(null, file); 31 | } 32 | 33 | module.exports = through.obj(buildTypes); 34 | -------------------------------------------------------------------------------- /scripts/transform.js: -------------------------------------------------------------------------------- 1 | 'use babel'; 2 | 3 | var jscodeshift = require('jscodeshift'); 4 | 5 | function transform(source) { 6 | const j = jscodeshift; 7 | const root = j(source); 8 | 9 | // Collect all the types we will be exporting. 10 | 11 | const types = new Map(); 12 | const props = new Map(); 13 | root 14 | .find( 15 | j.TypeAlias, 16 | { 17 | id: {type: 'Identifier'}, 18 | right: {type: 'ObjectTypeAnnotation'} 19 | } 20 | ) 21 | .forEach(p => { 22 | const n = p.node; 23 | const type = n.id.name; 24 | types.set(type, new Set()); 25 | props.set(type, []); 26 | const comments = []; 27 | 28 | // We know right is an ObjectTypeAnnotation. 29 | Array.prototype.push.apply(comments, n.right.comments || []); 30 | n.right.properties.forEach(property => { 31 | Array.prototype.push.apply(comments, property.comments || []); 32 | // Re-create the property. 33 | props.get(type).push(j.objectTypeProperty( 34 | j.identifier(property.key.name), 35 | property.value, // TODO: Re-create this better. 36 | !!property.optional 37 | )); 38 | }); 39 | 40 | // Then parse each comment to see what this extends. 41 | comments.forEach(comment => { 42 | const value = comment.value; 43 | if (/extends (\w+, )*\w+$/.test(value)) { 44 | value.replace('extends', '').trim().split(', ').forEach(superType => { 45 | types.get(type).add(superType); 46 | }) 47 | } 48 | }); 49 | }); 50 | 51 | // Fully resolve all types. 52 | 53 | const maxDepth = 10; 54 | for (let i = 0; i < maxDepth; i++) { 55 | for (let [type, supers] of types) { 56 | for (let superType of supers) { 57 | for (let subType of types.get(superType)) { 58 | supers.add(subType); 59 | } 60 | } 61 | } 62 | } 63 | 64 | // Flip the type map. 65 | 66 | const reverse = new Map(); 67 | for (let [type, supers] of types) { 68 | reverse.set(type, new Set()); 69 | } 70 | for (let [type, supers] of types) { 71 | for (let superType of supers) { 72 | reverse.get(superType).add(type); 73 | } 74 | } 75 | 76 | // Build the props of each type definition. 77 | 78 | const resolvedProps = new Map(); 79 | for (let [type, supers] of types) { 80 | // Copy existing types. 81 | resolvedProps.set(type, props.get(type).slice(0)); 82 | 83 | // Hack to make sure everything is structurally unique. 84 | resolvedProps.get(type).unshift(j.objectTypeProperty( 85 | j.identifier('_' + type), 86 | j.voidTypeAnnotation(), 87 | true 88 | )); 89 | 90 | // Add the type field. 91 | resolvedProps.get(type).unshift(j.objectTypeProperty( 92 | j.identifier('type'), 93 | j.stringLiteralTypeAnnotation(type, '\'' + type + '\''), 94 | false 95 | )); 96 | 97 | for (let superType of supers) { 98 | Array.prototype.push.apply( 99 | resolvedProps.get(type), 100 | props.get(superType) 101 | ); 102 | } 103 | } 104 | 105 | // Replace every type with its concrete props. 106 | 107 | root 108 | .find( 109 | j.TypeAlias, 110 | { 111 | id: {type: 'Identifier'}, 112 | right: {type: 'ObjectTypeAnnotation'} 113 | } 114 | ) 115 | .forEach(p => { 116 | const n = p.node; 117 | const name = n.id.name; 118 | if (!resolvedProps.has(name)) { 119 | return; 120 | } 121 | p.replace(j.typeAlias( 122 | n.id, 123 | null, 124 | j.objectTypeAnnotation(resolvedProps.get(name)) 125 | )); 126 | }); 127 | 128 | // Save the concrete types. 129 | 130 | const concreteTypes = new Map(); 131 | root 132 | .find( 133 | j.TypeAlias, 134 | { 135 | id: {type: 'Identifier'}, 136 | right: {type: 'ObjectTypeAnnotation'} 137 | } 138 | ) 139 | .forEach(p => { 140 | const n = p.node; 141 | const name = n.id.name; 142 | concreteTypes.set(name, n.right); 143 | }); 144 | 145 | // Replace the abstract types. 146 | 147 | root 148 | .find( 149 | j.TypeAlias, 150 | { 151 | id: {type: 'Identifier'}, 152 | right: {type: 'ObjectTypeAnnotation'} 153 | } 154 | ) 155 | .forEach(p => { 156 | const n = p.node; 157 | const name = n.id.name; 158 | if (reverse.get(name).size === 0) { 159 | return; 160 | } 161 | const unionTypes = []; 162 | for (let reverseType of reverse.get(name)) { 163 | // Make sure the reverse type is also abstract though. 164 | if (reverse.get(reverseType).size === 0) { 165 | unionTypes.push(concreteTypes.get(reverseType)); 166 | } 167 | } 168 | n.right = j.unionTypeAnnotation(unionTypes); 169 | p.replace(n); 170 | }); 171 | 172 | return root.toSource({quote: 'single'}); 173 | } 174 | 175 | module.exports = transform; 176 | -------------------------------------------------------------------------------- /src/types.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @flow 3 | */ 4 | 5 | 'use strict'; 6 | 7 | /* 8 | * Flow types for the Babylon AST. 9 | */ 10 | 11 | // Abstract types. Something must extend these. 12 | 13 | export type Comment = { 14 | end: number, 15 | loc: { 16 | end: {column: number, line: number}, 17 | start: {column: number, line: number}, 18 | }, 19 | start: number, 20 | }; 21 | 22 | export type Declaration = { 23 | // extends Node 24 | }; 25 | 26 | export type Expression = {}; 27 | 28 | export type Function = { 29 | // TODO: Can't properly override base types yet. 30 | // id: ?Identifier, 31 | // body: BlockStatement, 32 | 33 | async: boolean, 34 | defaults: Array, 35 | expression: boolean, 36 | generator: boolean, 37 | params: Array, 38 | rest: ?Identifier, 39 | returnType: ?TypeAnnotation, 40 | typeParameters: ?TypeParameterDeclaration, 41 | }; 42 | 43 | export type Node = { 44 | end: number, 45 | innerComments: ?Array, 46 | leadingComments: ?Array, 47 | loc: { 48 | end: {column: number, line: number}, 49 | start: {column: number, line: number}, 50 | }, 51 | start: number, 52 | trailingComments: ?Array, 53 | }; 54 | 55 | export type Pattern = {}; 56 | 57 | export type Statement = {}; 58 | 59 | export type Type = {}; 60 | 61 | // Concrete Types. Nothing can extend these. 62 | 63 | export type CommentLine = { 64 | // extends Comment 65 | value: string, 66 | }; 67 | 68 | export type CommentBlock = { 69 | // extends Comment 70 | value: string, 71 | }; 72 | 73 | // Babel concrete types. 74 | 75 | export type ArrayExpression = { 76 | // extends Node, Expression 77 | elements: Array, 78 | }; 79 | 80 | export type ArrayPattern = { 81 | // extends Node, Pattern 82 | elements: Array, 83 | typeAnnotation: ?TypeAnnotation, 84 | }; 85 | 86 | export type ArrowFunctionExpression = { 87 | // extends Node, Function 88 | body: Node, // BlockStatement | Expression, 89 | id: ?Identifier, 90 | }; 91 | 92 | type AssignmentOperator = 93 | '=' | 94 | '+=' | 95 | '-=' | 96 | '*=' | 97 | '/=' | 98 | '%=' | 99 | '<<=' | 100 | '>>=' | 101 | '>>>=' | 102 | '|=' | 103 | '^=' | 104 | '&='; 105 | 106 | export type AssignmentExpression = { 107 | // extends Node, Expression 108 | left: Pattern, 109 | operator: AssignmentOperator, 110 | right: Expression, 111 | }; 112 | 113 | export type AssignmentPattern = { 114 | // extends Node, Pattern 115 | left: Pattern, 116 | right: Expression, 117 | }; 118 | 119 | export type AwaitExpression = { 120 | // extends Node, Expression 121 | all: boolean, 122 | argument: ?Expression, 123 | }; 124 | 125 | type BinaryOperator = 126 | '==' | 127 | '!=' | 128 | '===' | 129 | '!==' | 130 | '<' | 131 | '<=' | 132 | '>' | 133 | '>=' | 134 | '<<' | 135 | '>>' | 136 | '>>>' | 137 | '+' | 138 | '-' | 139 | '*' | 140 | '/' | 141 | '%' | 142 | '&' | 143 | '|' | 144 | '^' | 145 | 'in' | 146 | 'instanceof' | 147 | '..'; 148 | 149 | export type BinaryExpression = { 150 | // extends Node, Expression 151 | left: Expression, 152 | operator: BinaryOperator, 153 | right: Expression, 154 | }; 155 | 156 | // TODO: What is this? 157 | export type BindExpression = { 158 | // extends Node, Expression 159 | callee: Node, 160 | object: Node, 161 | }; 162 | 163 | export type BlockStatement = { 164 | // extends Node, Statement 165 | body: Array, 166 | }; 167 | 168 | export type BreakStatement = { 169 | // extends Node, Statement 170 | label: ?Identifier, 171 | }; 172 | 173 | export type CallExpression = { 174 | // extends Node, Expression 175 | arguments: Array, // Array 176 | callee: Expression, 177 | }; 178 | 179 | export type CatchClause = { 180 | // extends Node 181 | body: BlockStatement, 182 | param: Pattern, 183 | }; 184 | 185 | export type ClassBody = { 186 | // extends Node, Declaration 187 | body: Array, 188 | }; 189 | 190 | export type ClassDeclaration = { 191 | // extends Node, Declaration 192 | body: ClassBody, 193 | id: ?Identifier, 194 | superClass: ?Expression, 195 | 196 | // TODO: Get proper types. 197 | decorators: any, 198 | superTypeParameters: any, 199 | typeParameters: any, 200 | 201 | // TODO: Recast parse error. 202 | // 'implements': Array, 203 | }; 204 | 205 | export type ClassExpression = { 206 | // extends Node, Expression 207 | body: ClassBody, 208 | id: ?Identifier, 209 | superClass: ?Expression, 210 | 211 | // TODO: Get proper types. 212 | decorators: any, 213 | superTypeParameters: any, 214 | typeParameters: any, 215 | 216 | // TODO: Recast parse error. 217 | // 'implements': Array, 218 | }; 219 | 220 | export type ComprehensionBlock = { 221 | // extends Node 222 | each: boolean, 223 | left: Pattern, 224 | right: Expression, 225 | }; 226 | 227 | export type ComprehensionExpression = { 228 | // extends Node, Expression 229 | body: Expression, 230 | blocks: Array, 231 | filter: ?Expression, 232 | }; 233 | 234 | export type ConditionalExpression = { 235 | // extends Node, Expression 236 | alternate: Expression, 237 | consequent: Expression, 238 | test: Expression, 239 | }; 240 | 241 | export type ContinueStatement = { 242 | // extends Node, Statement 243 | label: ?Identifier, 244 | }; 245 | 246 | // TODO: Make this correct. 247 | export type Decorator = { 248 | // extends Node 249 | expression: Expression, 250 | }; 251 | 252 | export type DebuggerStatement = { 253 | // extends Node 254 | }; 255 | 256 | export type DoWhileStatement = { 257 | // extends Node, Statement 258 | body: Statement, 259 | test: Expression, 260 | }; 261 | 262 | // TODO: Make this correct. 263 | export type DoExpression = { 264 | // extends Node, Expression 265 | body: Statement, 266 | }; 267 | 268 | export type EmptyStatement = { 269 | // extends Node, Statement 270 | }; 271 | 272 | export type ExpressionStatement = { 273 | // extends Node, Statement 274 | expression: Expression, 275 | }; 276 | 277 | export type File = { 278 | // extends Node 279 | program: Program, 280 | }; 281 | 282 | export type ForInStatement = { 283 | // extends Node, Statement 284 | body: Statement, 285 | left: Node, // VariableDeclaration | Expression 286 | right: Expression, 287 | }; 288 | 289 | // TODO: Make this correct. 290 | export type ForOfStatement = { 291 | // extends Node, Statement 292 | body: Statement, 293 | left: Node, 294 | right: Expression, 295 | }; 296 | 297 | export type ForStatement = { 298 | // extends Node, Statement 299 | init: ?Node, // ?(VariableDeclaration | Expression) 300 | test: ?Expression, 301 | update: ?Expression, 302 | body: Statement, 303 | }; 304 | 305 | export type FunctionDeclaration = { 306 | // extends Node, Function, Declaration 307 | body: BlockStatement, 308 | id: Identifier, 309 | }; 310 | 311 | export type FunctionExpression = { 312 | // extends Node, Expression, Function 313 | body: BlockStatement, 314 | id: ?Identifier, 315 | }; 316 | 317 | export type Identifier = { 318 | // extends Node, Expression, Pattern 319 | name: string, 320 | typeAnnotation: ?TypeAnnotation, 321 | }; 322 | 323 | export type IfStatement = { 324 | // extends Node, Statement 325 | alternate: ?Statement, 326 | consequent: Statement, 327 | test: Expression, 328 | }; 329 | 330 | // TODO: Make this correct. 331 | export type ImportDefaultSpecifier = { 332 | // extends Node 333 | local: Node, 334 | }; 335 | 336 | // TODO: Make this correct. 337 | export type ImportNamespaceSpecifier = { 338 | // extends Node 339 | local: Node, 340 | }; 341 | 342 | // TODO: Make this correct. 343 | export type ImportDeclaration = { 344 | // extends Node 345 | specifiers: Array, 346 | source: Literal, 347 | }; 348 | 349 | // TODO: Make this correct. 350 | export type ImportSpecifier = { 351 | // extends Node 352 | imported: Node, 353 | local: Node, 354 | }; 355 | 356 | export type LabeledStatement = { 357 | // extends Node, Statement 358 | body: Statement, 359 | label: Identifier, 360 | }; 361 | 362 | export type Literal = { 363 | // extends Node, Expression 364 | raw: string, 365 | regex: ?{pattern: string, flags: string}, 366 | value: ?(string | boolean | number | RegExp), 367 | }; 368 | 369 | type LogicalOperator = '||' | '&&'; 370 | 371 | export type LogicalExpression = { 372 | // extends Node, Expression 373 | left: Expression, 374 | operator: LogicalOperator, 375 | right: Expression, 376 | }; 377 | 378 | export type MemberExpression = { 379 | // extends Node, Expression 380 | computed: boolean, 381 | object: Expression, 382 | property: Node, // Identifier | Expression 383 | }; 384 | 385 | // TODO: Make this correct. 386 | export type MetaProperty = { 387 | // extends Node 388 | meta: Node, 389 | property: Node, 390 | }; 391 | 392 | export type MethodDefinition = { 393 | // extends Node, Declaration 394 | computed: boolean, 395 | key: Node, // Literal | Identifier | Expression 396 | kind: 'constructor' | 'method' | 'get' | 'set', 397 | static: boolean, 398 | value: FunctionExpression, 399 | 400 | // TODO: Make this correct. 401 | decorators: ?Array, 402 | }; 403 | 404 | export type NewExpression = { 405 | // extends Node, Expression 406 | arguments: Array, // Array 407 | callee: Expression, 408 | }; 409 | 410 | export type Noop = { 411 | // extends Node 412 | }; 413 | 414 | export type ObjectExpression = { 415 | // extends Node, Expression 416 | properties: Array, // Array 417 | }; 418 | 419 | export type ObjectPattern = { 420 | // extends Node, Pattern 421 | properties: Array, // Array 422 | typeAnnotation: ?TypeAnnotation, 423 | }; 424 | 425 | export type Program = { 426 | // extends Node 427 | body: Array, 428 | }; 429 | 430 | export type Property = { 431 | // extends Node 432 | computed: boolean, 433 | key: Node, // Literal | Identifier | Expression 434 | kind: 'init' | 'get' | 'set', 435 | method: boolean, 436 | shorthand: boolean, 437 | value: Node, // Expression | Pattern 438 | 439 | // TODO: Make this correct. 440 | decorators: ?Array, 441 | }; 442 | 443 | export type RestElement = { 444 | // extends Node, Pattern 445 | argument: Pattern, 446 | typeAnnotation: ?TypeAnnotation, 447 | }; 448 | 449 | export type ReturnStatement = { 450 | // extends Node, Statement 451 | argument: ?Expression, 452 | }; 453 | 454 | export type SequenceExpression = { 455 | // extends Node, Expression 456 | expression: Array, 457 | }; 458 | 459 | export type SpreadElement = { 460 | // extends Node 461 | argument: Expression, 462 | }; 463 | 464 | export type SpreadProperty = { 465 | // extends Node 466 | argument: Expression, 467 | }; 468 | 469 | export type Super = { 470 | // extends Node 471 | }; 472 | 473 | export type SwitchCase = { 474 | // extends Node 475 | consequent: Array, 476 | test: ?Expression, 477 | }; 478 | 479 | export type SwitchStatement = { 480 | // extends Node, Statement 481 | cases: Array, 482 | discriminant: Expression, 483 | lexical: boolean, 484 | }; 485 | 486 | export type TaggedTemplateExpression = { 487 | // extends Node, Expression 488 | quasi: TemplateLiteral, 489 | tag: Expression, 490 | }; 491 | 492 | export type TemplateElement = { 493 | // extends Node 494 | tail: boolean, 495 | value: {cooked: string, raw: string}, 496 | }; 497 | 498 | export type TemplateLiteral = { 499 | // extends Node, Expression 500 | expressions: Array, 501 | quasis: Array, 502 | }; 503 | 504 | export type ThisExpression = { 505 | // extends Node, Expression 506 | }; 507 | 508 | export type ThrowStatement = { 509 | // extends Node, Statement 510 | argument: Expression, 511 | }; 512 | 513 | export type TryStatement = { 514 | // extends Node, Statement 515 | block: BlockStatement, 516 | finalizer: ?BlockStatement, 517 | guardedHandlers: Array, 518 | handler: ?CatchClause, 519 | handlers: ?Array, 520 | }; 521 | 522 | type UnaryOperator = '-' | '+' | '!' | '~' | 'typeof' | 'void' | 'delete'; 523 | 524 | export type UnaryExpression = { 525 | // extends Node, Expression 526 | argument: Expression, 527 | operator: UnaryOperator, 528 | prefix: true, 529 | }; 530 | 531 | type UpdateOperator = '++' | '--'; 532 | 533 | export type UpdateExpression = { 534 | // extends Node, Expression 535 | argument: Expression, 536 | operator: UpdateOperator, 537 | prefix: boolean, 538 | }; 539 | 540 | export type VariableDeclaration = { 541 | // extends Node, Declaration 542 | declarations: Array, 543 | kind: 'var' | 'let' | 'const', 544 | }; 545 | 546 | export type VariableDeclarator = { 547 | // extends Node 548 | id: Pattern, 549 | init: ?Expression, 550 | }; 551 | 552 | export type WhileStatement = { 553 | // extends Node, Statement 554 | body: Statement, 555 | test: Expression, 556 | }; 557 | 558 | export type WithStatement = { 559 | // extends Node, Statement 560 | body: Statement, 561 | object: Expression, 562 | }; 563 | 564 | export type YieldExpression = { 565 | // extends Node, Expression 566 | argument: ?Expression, 567 | delegate: boolean, 568 | }; 569 | 570 | // TODO: Make this correct. 571 | export type ExportAllDeclaration = { 572 | // extends Node 573 | exported: Node, 574 | source: Node, 575 | }; 576 | 577 | // TODO: Make this correct. 578 | export type ExportDefaultDeclaration = { 579 | // extends Node 580 | declaration: Node, 581 | }; 582 | 583 | // TODO: Make this correct. 584 | export type ExportNamedDeclaration = { 585 | // extends Node 586 | declaration: Node, 587 | source: Literal, 588 | specifiers: Array, 589 | }; 590 | 591 | // TODO: Make this correct. 592 | export type ExportDefaultSpecifier = { 593 | // extends Node 594 | exported: Node, 595 | }; 596 | 597 | // TODO: Make this correct. 598 | export type ExportNamespaceSpecifier = { 599 | // extends Node 600 | exported: Node, 601 | }; 602 | 603 | // TODO: Make this correct. 604 | export type ExportSpecifier = { 605 | // extends Node 606 | local: Node, 607 | exported: Node, 608 | }; 609 | 610 | export type AnyTypeAnnotation = { 611 | // extends Node, Type 612 | }; 613 | 614 | export type ArrayTypeAnnotation = { 615 | // extends Node, Type 616 | elementType: Type, 617 | }; 618 | 619 | export type BooleanLiteralTypeAnnotation = { 620 | // extends Node, Type 621 | raw: string, 622 | value: boolean, 623 | }; 624 | 625 | export type BooleanTypeAnnotation = { 626 | // extends Node, Type 627 | }; 628 | 629 | export type ClassImplements = { 630 | // extends Node 631 | id: Identifier, 632 | typeParameters: ?TypeParameterInstantiation, 633 | 634 | // TODO: Make this correct. 635 | superClass: ?Expression, 636 | }; 637 | 638 | export type ClassProperty = { 639 | // extends Node, Declaration 640 | computed: boolean, 641 | key: Node, // Literal | Identifier | Expression 642 | static: boolean, 643 | typeAnnotation: ?TypeAnnotation, 644 | value: ?Expression, 645 | 646 | // TODO: Make this correct. 647 | decorators: Array, 648 | }; 649 | 650 | export type DeclareClass = { 651 | // extends Node, Statement 652 | body: ObjectTypeAnnotation, 653 | extends: Array, 654 | id: Identifier, 655 | typeParameters: ?TypeParameterDeclaration, 656 | }; 657 | 658 | // TODO: Make this correct. 659 | export type DeclareFunction = { 660 | // extends Node, Statement 661 | id: Identifier, 662 | }; 663 | 664 | export type DeclareModule = { 665 | // extends Node, Statement 666 | body: BlockStatement, 667 | id: Node, // Identifier | Literal 668 | }; 669 | 670 | // TODO: Make this correct. 671 | export type DeclareVariable = { 672 | // extends Node, Statement 673 | id: Identifier, 674 | }; 675 | 676 | export type FunctionTypeAnnotation = { 677 | // extends Node, Type 678 | params: Array, 679 | rest: ?FunctionTypeParam, 680 | returnType: Type, 681 | typeParameters: ?TypeParameterDeclaration, 682 | }; 683 | 684 | export type FunctionTypeParam = { 685 | // extends Node 686 | name: Identifier, 687 | optional: boolean, 688 | typeAnnotation: Type, 689 | }; 690 | 691 | export type GenericTypeAnnotation = { 692 | // extends Node, Type 693 | id: Node, // Identifier | QualifiedTypeIdentifier 694 | typeParameters: ?TypeParameterInstantiation, 695 | }; 696 | 697 | export type InterfaceExtends = { 698 | // extends Node 699 | id: Identifier, 700 | typeParameters: ?TypeParameterInstantiation, 701 | }; 702 | 703 | export type InterfaceDeclaration = { 704 | // extends Node, Statement 705 | body: ObjectTypeAnnotation, 706 | extends: Array, 707 | id: Identifier, 708 | typeParameters: ?TypeParameterDeclaration, 709 | }; 710 | 711 | export type IntersectionTypeAnnotation = { 712 | // extends Node, Type 713 | types: Array, 714 | }; 715 | 716 | export type MixedTypeAnnotation = { 717 | // extends Node, Type 718 | }; 719 | 720 | export type NullableTypeAnnotation = { 721 | // extends Node, Type 722 | typeAnnotation: Type, 723 | }; 724 | 725 | export type NumberLiteralTypeAnnotation = { 726 | // extends Node, Type 727 | raw: string, 728 | value: number, 729 | }; 730 | 731 | export type NumberTypeAnnotation = { 732 | // extends Node, Type 733 | }; 734 | 735 | export type StringLiteralTypeAnnotation = { 736 | // extends Node, Type 737 | raw: string, 738 | value: string, 739 | }; 740 | 741 | export type StringTypeAnnotation = { 742 | // extends Node, Type 743 | }; 744 | 745 | export type TupleTypeAnnotation = { 746 | // extends Node, Type 747 | types: Array, 748 | }; 749 | 750 | export type TypeofTypeAnnotation = { 751 | // extends Node 752 | argument: Type, 753 | }; 754 | 755 | export type TypeAlias = { 756 | // extends Node, Statement 757 | id: Identifier, 758 | right: Type, 759 | typeParameters: ?TypeParameterDeclaration, 760 | }; 761 | 762 | export type TypeAnnotation = { 763 | // extends Node 764 | typeAnnotation: Type, 765 | }; 766 | 767 | export type TypeCastExpression = { 768 | // extends Node, Expression 769 | expression: Expression, 770 | typeAnnotation: TypeAnnotation, 771 | }; 772 | 773 | export type TypeParameterDeclaration = { 774 | // extends Node 775 | params: Array, 776 | }; 777 | 778 | export type TypeParameterInstantiation = { 779 | // extends Node 780 | params: Array, 781 | }; 782 | 783 | export type ObjectTypeAnnotation = { 784 | // extends Node, Type 785 | callProperties: Array, 786 | indexers: Array, 787 | properties: Array, 788 | }; 789 | 790 | export type ObjectTypeCallProperty = { 791 | // extends Node 792 | static: boolean, 793 | value: FunctionTypeAnnotation, 794 | }; 795 | 796 | export type ObjectTypeIndexer = { 797 | // extends Node 798 | id: Identifier, 799 | key: Type, 800 | value: Type, 801 | }; 802 | 803 | export type ObjectTypeProperty = { 804 | // extends Node 805 | key: Node, // Literal | Identifier 806 | optional: boolean, 807 | value: Type, 808 | }; 809 | 810 | export type QualifiedTypeIdentifier = { 811 | // extends Node 812 | id: Identifier, 813 | qualification: Node, // Identifier | QualifiedTypeIdentifier 814 | }; 815 | 816 | export type UnionTypeAnnotation = { 817 | // extends Node, Type 818 | types: Array, 819 | }; 820 | 821 | export type VoidTypeAnnotation = { 822 | // extends Node, Type 823 | }; 824 | 825 | export type JSXAttribute = { 826 | // extends Node 827 | name: Node, // JSXIdentifier | JSXNamespacedName 828 | value: ?Node, // ?(Literal | JSXExpressionContainer) 829 | }; 830 | 831 | export type JSXClosingElement = { 832 | // extends Node 833 | name: Node, 834 | }; 835 | 836 | export type JSXElement = { 837 | // extends Node, Expression 838 | children: Array, 839 | closingElement: ?JSXClosingElement, 840 | openingElement: JSXOpeningElement, 841 | }; 842 | 843 | export type JSXEmptyExpression = { 844 | // extends Node, Expression 845 | }; 846 | 847 | export type JSXExpressionContainer = { 848 | // extends Node, Expression 849 | expression: Expression, 850 | }; 851 | 852 | export type JSXIdentifier = { 853 | // extends Node 854 | name: string, 855 | }; 856 | 857 | export type JSXMemberExpression = { 858 | // extends Node, Expression 859 | computed: boolean, 860 | object: Node, // JSXIdentifier | JSXMemberExpression 861 | property: JSXIdentifier, 862 | }; 863 | 864 | export type JSXNamespacedName = { 865 | // extends Node 866 | name: JSXIdentifier, 867 | namespace: JSXIdentifier, 868 | }; 869 | 870 | export type JSXOpeningElement = { 871 | // extends Node 872 | attributes: Array, 873 | name: Array, 874 | selfClosing: boolean, 875 | }; 876 | 877 | export type JSXSpreadAttribute = { 878 | // extends Node 879 | argument: Expression, 880 | }; 881 | -------------------------------------------------------------------------------- /tests/types-2-spec.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @flow 3 | */ 4 | 5 | 'use strict'; 6 | 7 | import type {Node} from '../lib/types'; 8 | 9 | function print(node: Node): Array { 10 | if (node.type === 'File') { 11 | return print(node.program); 12 | } 13 | if (node.type === 'Program') { 14 | node.body.forEach(statement => { 15 | print(statement); 16 | }); 17 | } 18 | return []; 19 | } 20 | -------------------------------------------------------------------------------- /tests/types-spec.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @flow 3 | */ 4 | 5 | 'use strict'; 6 | 7 | import type {Node} from '../lib/types'; 8 | 9 | function a(node: Node) { 10 | switch (node.type) { 11 | case 'Identifier': 12 | assertString(node.name); 13 | if (node.comments) { 14 | node.comments.forEach(comment => { 15 | assertString(comment.value); 16 | }); 17 | } 18 | break; 19 | 20 | case 'BlockStatement': 21 | node.body.forEach(statement => { 22 | switch (statement.type) { 23 | case 'LabeledStatement': 24 | assertString(statement.label.name); 25 | } 26 | }); 27 | break; 28 | } 29 | } 30 | 31 | function b(node: Node) { 32 | if (node.type === 'ContinueStatement' && node.label) { 33 | assertString(node.label.name); 34 | // $ExpectError 35 | assertString(node.label.notName); 36 | } 37 | } 38 | 39 | function getName(node: Node): string { 40 | switch (node.type) { 41 | case 'Identifier': 42 | return node.name; 43 | 44 | case 'ClassDeclaration': 45 | // $ExpectError 46 | return node.id.name; // Error, id could be null. 47 | 48 | case 'FunctionDeclaration': 49 | return node.id.name; // Fine if it's always there. 50 | 51 | case 'FunctionExpression': 52 | if (node.id) { 53 | return node.id.name; // Can refine id to make sure it exists. 54 | } else { 55 | return 'Unknown'; 56 | } 57 | 58 | case 'Literal': 59 | // $ExpectError 60 | return node.name; // Error, Literals don't have names, don't be silly. 61 | } 62 | return 'Unknown'; 63 | } 64 | 65 | // Some helper functions to assert the values of different types. 66 | function assertString(x: string) {} 67 | --------------------------------------------------------------------------------