From 3b6b40c2df69f6c353a2d8c1a24da8680fae78f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Mon, 17 Oct 2022 15:47:29 -0400 Subject: [PATCH] fix: module block program should span within {} --- .../babel-parser/src/parser/expression.ts | 12 +++- packages/babel-parser/src/parser/statement.ts | 17 +++-- .../src/plugins/typescript/index.ts | 1 - .../output.json | 2 +- .../output.json | 2 +- .../input.js | 1 + .../options.json | 3 + .../output.json | 2 +- .../output.json | 2 +- .../output.json | 2 +- .../valid-class-in-module-blocks/output.json | 2 +- .../input.js | 1 + .../output.json | 43 ++++++++++++ .../output.json | 4 +- .../output.json | 2 +- .../valid-import-module-blocks/output.json | 2 +- .../output.json | 2 +- .../valid-nested-module-blocks/output.json | 4 +- .../output.json | 2 +- .../output.json | 2 +- .../input.js | 3 + .../output.json | 65 +++++++++++++++++++ 22 files changed, 153 insertions(+), 23 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-hashbang-comment-in-module-blocks/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-hashbang-comment-in-module-blocks/options.json create mode 100644 packages/babel-parser/test/fixtures/experimental/module-blocks/valid-comments-only-module-blocks/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/module-blocks/valid-comments-only-module-blocks/output.json create mode 100644 packages/babel-parser/test/fixtures/experimental/module-blocks/valid-trailing-comment-module-blocks/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/module-blocks/valid-trailing-comment-module-blocks/output.json diff --git a/packages/babel-parser/src/parser/expression.ts b/packages/babel-parser/src/parser/expression.ts index 94eb85440f63..73e6f94f9ac5 100644 --- a/packages/babel-parser/src/parser/expression.ts +++ b/packages/babel-parser/src/parser/expression.ts @@ -3236,18 +3236,24 @@ export default abstract class ExpressionParser extends LValParser { this.expectPlugin("moduleBlocks"); const node = this.startNode(); this.next(); // eat "module" - this.expect(tt.braceL); + if (!this.match(tt.braceL)) { + this.unexpected(null, tt.braceL); + } + // start program node immediately after `{` + const program = this.startNodeAt( + this.state.end, + this.state.endLoc, + ); + this.next(); // eat `{` const revertScopes = this.initializeScopes(/** inModule */ true); this.enterInitialScopes(); - const program = this.startNode(); try { node.body = this.parseProgram(program, tt.braceR, "module"); } finally { revertScopes(); } - this.eat(tt.braceR); return this.finishNode(node, "ModuleExpression"); } diff --git a/packages/babel-parser/src/parser/statement.ts b/packages/babel-parser/src/parser/statement.ts index 879af34b3dcc..a38984d0a174 100644 --- a/packages/babel-parser/src/parser/statement.ts +++ b/packages/babel-parser/src/parser/statement.ts @@ -222,10 +222,19 @@ export default abstract class StatementParser extends ExpressionParser { this.raise(Errors.ModuleExportUndefined, { at, localName }); } } + let finishedProgram: N.Program; if (end === tt.eof) { - this.next(); // consume eof for the top level program + // finish at eof for top level program + finishedProgram = this.finishNode(program, "Program"); + } else { + // finish immediately before the end token + finishedProgram = this.finishNodeAt( + program, + "Program", + createPositionWithColumnOffset(this.state.startLoc, -1), + ); } - return this.finishNode(program, "Program"); + return finishedProgram; } // TODO @@ -1126,7 +1135,6 @@ export default abstract class StatementParser extends ExpressionParser { tt.braceR, afterBlockParse, ); - this.next(); // eat tt.braceR if (createNewLexicalScope) { this.scope.exit(); } @@ -1208,6 +1216,8 @@ export default abstract class StatementParser extends ExpressionParser { if (!oldStrict) { this.setStrict(false); } + + this.next(); } // Parse a regular `for` loop. The disambiguation code in @@ -1883,7 +1893,6 @@ export default abstract class StatementParser extends ExpressionParser { this.prodParam.enter(PARAM); const body: N.Node[] = (member.body = []); this.parseBlockOrModuleBlockBody(body, undefined, false, tt.braceR); - this.next(); // eat tt.braceR this.prodParam.exit(); this.scope.exit(); this.state.labels = oldLabels; diff --git a/packages/babel-parser/src/plugins/typescript/index.ts b/packages/babel-parser/src/plugins/typescript/index.ts index f9b908131575..acb3ab9e0dc8 100644 --- a/packages/babel-parser/src/plugins/typescript/index.ts +++ b/packages/babel-parser/src/plugins/typescript/index.ts @@ -1869,7 +1869,6 @@ export default (superClass: ClassWithMixin) => /* topLevel */ true, /* end */ tt.braceR, ); - this.next(); // eat tt.braceR this.scope.exit(); return this.finishNode(node, "TSModuleBlock"); } diff --git a/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-class-in-module-blocks/output.json b/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-class-in-module-blocks/output.json index 0f7ad9038262..5e9595f71d82 100644 --- a/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-class-in-module-blocks/output.json +++ b/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-class-in-module-blocks/output.json @@ -53,7 +53,7 @@ "start":23,"end":66,"loc":{"start":{"line":3,"column":4,"index":23},"end":{"line":5,"column":5,"index":66}}, "body": { "type": "Program", - "start":38,"end":60,"loc":{"start":{"line":4,"column":6,"index":38},"end":{"line":4,"column":28,"index":60}}, + "start":31,"end":65,"loc":{"start":{"line":3,"column":12,"index":31},"end":{"line":5,"column":4,"index":65}}, "sourceType": "module", "interpreter": null, "body": [ diff --git a/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-duplicated-exports-in-blocks/output.json b/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-duplicated-exports-in-blocks/output.json index fa1fcd9356e8..616cd779b8b2 100644 --- a/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-duplicated-exports-in-blocks/output.json +++ b/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-duplicated-exports-in-blocks/output.json @@ -27,7 +27,7 @@ "start":10,"end":66,"loc":{"start":{"line":1,"column":10,"index":10},"end":{"line":4,"column":1,"index":66}}, "body": { "type": "Program", - "start":21,"end":64,"loc":{"start":{"line":2,"column":2,"index":21},"end":{"line":3,"column":17,"index":64}}, + "start":18,"end":65,"loc":{"start":{"line":1,"column":18,"index":18},"end":{"line":4,"column":0,"index":65}}, "sourceType": "module", "interpreter": null, "body": [ diff --git a/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-hashbang-comment-in-module-blocks/input.js b/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-hashbang-comment-in-module-blocks/input.js new file mode 100644 index 000000000000..2016d0725027 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-hashbang-comment-in-module-blocks/input.js @@ -0,0 +1 @@ +module { #!/usr/bin/env node }; diff --git a/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-hashbang-comment-in-module-blocks/options.json b/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-hashbang-comment-in-module-blocks/options.json new file mode 100644 index 000000000000..2a28555f76db --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-hashbang-comment-in-module-blocks/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token (1:9)" +} diff --git a/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-undefined-export-in-module-blocks01/output.json b/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-undefined-export-in-module-blocks01/output.json index 77746858c49f..f1d57e69ea11 100644 --- a/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-undefined-export-in-module-blocks01/output.json +++ b/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-undefined-export-in-module-blocks01/output.json @@ -18,7 +18,7 @@ "start":0,"end":27,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":3,"column":1,"index":27}}, "body": { "type": "Program", - "start":11,"end":25,"loc":{"start":{"line":2,"column":2,"index":11},"end":{"line":2,"column":16,"index":25}}, + "start":8,"end":26,"loc":{"start":{"line":1,"column":8,"index":8},"end":{"line":3,"column":0,"index":26}}, "sourceType": "module", "interpreter": null, "body": [ diff --git a/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-undefined-export-in-module-blocks02/output.json b/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-undefined-export-in-module-blocks02/output.json index 5d2348ecda9d..0e5d5430a87c 100644 --- a/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-undefined-export-in-module-blocks02/output.json +++ b/packages/babel-parser/test/fixtures/experimental/module-blocks/invalid-undefined-export-in-module-blocks02/output.json @@ -35,7 +35,7 @@ "start":9,"end":37,"loc":{"start":{"line":2,"column":0,"index":9},"end":{"line":4,"column":1,"index":37}}, "body": { "type": "Program", - "start":20,"end":35,"loc":{"start":{"line":3,"column":2,"index":20},"end":{"line":3,"column":17,"index":35}}, + "start":17,"end":36,"loc":{"start":{"line":2,"column":8,"index":17},"end":{"line":4,"column":0,"index":36}}, "sourceType": "module", "interpreter": null, "body": [ diff --git a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-assign-module-blocks-to-variables/output.json b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-assign-module-blocks-to-variables/output.json index 1260f3baf63c..c3e11e258176 100644 --- a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-assign-module-blocks-to-variables/output.json +++ b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-assign-module-blocks-to-variables/output.json @@ -24,7 +24,7 @@ "start":10,"end":48,"loc":{"start":{"line":1,"column":10,"index":10},"end":{"line":3,"column":1,"index":48}}, "body": { "type": "Program", - "start":21,"end":46,"loc":{"start":{"line":2,"column":2,"index":21},"end":{"line":2,"column":27,"index":46}}, + "start":18,"end":47,"loc":{"start":{"line":1,"column":18,"index":18},"end":{"line":3,"column":0,"index":47}}, "sourceType": "module", "interpreter": null, "body": [ diff --git a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-class-in-module-blocks/output.json b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-class-in-module-blocks/output.json index 1bc74e29909a..3003ea2fce54 100644 --- a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-class-in-module-blocks/output.json +++ b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-class-in-module-blocks/output.json @@ -50,7 +50,7 @@ "start":23,"end":96,"loc":{"start":{"line":3,"column":4,"index":23},"end":{"line":8,"column":5,"index":96}}, "body": { "type": "Program", - "start":38,"end":90,"loc":{"start":{"line":4,"column":6,"index":38},"end":{"line":7,"column":7,"index":90}}, + "start":31,"end":95,"loc":{"start":{"line":3,"column":12,"index":31},"end":{"line":8,"column":4,"index":95}}, "sourceType": "module", "interpreter": null, "body": [ diff --git a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-comments-only-module-blocks/input.js b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-comments-only-module-blocks/input.js new file mode 100644 index 000000000000..3dff2092e54a --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-comments-only-module-blocks/input.js @@ -0,0 +1 @@ +module {/* comment */} diff --git a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-comments-only-module-blocks/output.json b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-comments-only-module-blocks/output.json new file mode 100644 index 000000000000..5f64c881438c --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-comments-only-module-blocks/output.json @@ -0,0 +1,43 @@ +{ + "type": "File", + "start":0,"end":22,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":22,"index":22}}, + "program": { + "type": "Program", + "start":0,"end":22,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":22,"index":22}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":22,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":22,"index":22}}, + "expression": { + "type": "ModuleExpression", + "start":0,"end":22,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":22,"index":22}}, + "body": { + "type": "Program", + "start":8,"end":21,"loc":{"start":{"line":1,"column":8,"index":8},"end":{"line":1,"column":21,"index":21}}, + "sourceType": "module", + "interpreter": null, + "body": [], + "directives": [], + "innerComments": [ + { + "type": "CommentBlock", + "value": " comment ", + "start":8,"end":21,"loc":{"start":{"line":1,"column":8,"index":8},"end":{"line":1,"column":21,"index":21}} + } + ] + } + } + } + ], + "directives": [] + }, + "comments": [ + { + "type": "CommentBlock", + "value": " comment ", + "start":8,"end":21,"loc":{"start":{"line":1,"column":8,"index":8},"end":{"line":1,"column":21,"index":21}} + } + ] +} diff --git a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-duplicated-exports-between-other-modules/output.json b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-duplicated-exports-between-other-modules/output.json index 018f96af6e97..97da0d82c3ea 100644 --- a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-duplicated-exports-between-other-modules/output.json +++ b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-duplicated-exports-between-other-modules/output.json @@ -55,7 +55,7 @@ "start":37,"end":72,"loc":{"start":{"line":2,"column":11,"index":37},"end":{"line":2,"column":46,"index":72}}, "body": { "type": "Program", - "start":46,"end":70,"loc":{"start":{"line":2,"column":20,"index":46},"end":{"line":2,"column":44,"index":70}}, + "start":45,"end":71,"loc":{"start":{"line":2,"column":19,"index":45},"end":{"line":2,"column":45,"index":71}}, "sourceType": "module", "interpreter": null, "body": [ @@ -115,7 +115,7 @@ "start":85,"end":120,"loc":{"start":{"line":3,"column":11,"index":85},"end":{"line":3,"column":46,"index":120}}, "body": { "type": "Program", - "start":94,"end":118,"loc":{"start":{"line":3,"column":20,"index":94},"end":{"line":3,"column":44,"index":118}}, + "start":93,"end":119,"loc":{"start":{"line":3,"column":19,"index":93},"end":{"line":3,"column":45,"index":119}}, "sourceType": "module", "interpreter": null, "body": [ diff --git a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-duplicated-variables-in-module-blocks/output.json b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-duplicated-variables-in-module-blocks/output.json index 9f000ff0794e..e0a8586a42ca 100644 --- a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-duplicated-variables-in-module-blocks/output.json +++ b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-duplicated-variables-in-module-blocks/output.json @@ -49,7 +49,7 @@ "start":29,"end":60,"loc":{"start":{"line":2,"column":10,"index":29},"end":{"line":4,"column":1,"index":60}}, "body": { "type": "Program", - "start":40,"end":58,"loc":{"start":{"line":3,"column":2,"index":40},"end":{"line":3,"column":20,"index":58}}, + "start":37,"end":59,"loc":{"start":{"line":2,"column":18,"index":37},"end":{"line":4,"column":0,"index":59}}, "sourceType": "module", "interpreter": null, "body": [ diff --git a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-import-module-blocks/output.json b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-import-module-blocks/output.json index e7bfb4fa5aac..2f6eb776e1e1 100644 --- a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-import-module-blocks/output.json +++ b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-import-module-blocks/output.json @@ -24,7 +24,7 @@ "start":10,"end":48,"loc":{"start":{"line":1,"column":10,"index":10},"end":{"line":3,"column":1,"index":48}}, "body": { "type": "Program", - "start":21,"end":46,"loc":{"start":{"line":2,"column":2,"index":21},"end":{"line":2,"column":27,"index":46}}, + "start":18,"end":47,"loc":{"start":{"line":1,"column":18,"index":18},"end":{"line":3,"column":0,"index":47}}, "sourceType": "module", "interpreter": null, "body": [ diff --git a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-module-blocks-as-arguments/output.json b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-module-blocks-as-arguments/output.json index 7085dc6ec4c7..712ed000ef14 100644 --- a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-module-blocks-as-arguments/output.json +++ b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-module-blocks-as-arguments/output.json @@ -33,7 +33,7 @@ "start":26,"end":66,"loc":{"start":{"line":1,"column":26,"index":26},"end":{"line":3,"column":1,"index":66}}, "body": { "type": "Program", - "start":39,"end":64,"loc":{"start":{"line":2,"column":4,"index":39},"end":{"line":2,"column":29,"index":64}}, + "start":34,"end":65,"loc":{"start":{"line":1,"column":34,"index":34},"end":{"line":3,"column":0,"index":65}}, "sourceType": "module", "interpreter": null, "body": [ diff --git a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-nested-module-blocks/output.json b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-nested-module-blocks/output.json index f6c15c62ee45..bb598da246b1 100644 --- a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-nested-module-blocks/output.json +++ b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-nested-module-blocks/output.json @@ -24,7 +24,7 @@ "start":8,"end":62,"loc":{"start":{"line":1,"column":8,"index":8},"end":{"line":5,"column":1,"index":62}}, "body": { "type": "Program", - "start":19,"end":60,"loc":{"start":{"line":2,"column":2,"index":19},"end":{"line":4,"column":4,"index":60}}, + "start":16,"end":61,"loc":{"start":{"line":1,"column":16,"index":16},"end":{"line":5,"column":0,"index":61}}, "sourceType": "module", "interpreter": null, "body": [ @@ -36,7 +36,7 @@ "start":19,"end":59,"loc":{"start":{"line":2,"column":2,"index":19},"end":{"line":4,"column":3,"index":59}}, "body": { "type": "Program", - "start":32,"end":55,"loc":{"start":{"line":3,"column":4,"index":32},"end":{"line":3,"column":27,"index":55}}, + "start":27,"end":58,"loc":{"start":{"line":2,"column":10,"index":27},"end":{"line":4,"column":2,"index":58}}, "sourceType": "module", "interpreter": null, "body": [ diff --git a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-singleline-module-blocks/output.json b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-singleline-module-blocks/output.json index 46df2d812019..1e68f0dd8714 100644 --- a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-singleline-module-blocks/output.json +++ b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-singleline-module-blocks/output.json @@ -24,7 +24,7 @@ "start":10,"end":45,"loc":{"start":{"line":1,"column":10,"index":10},"end":{"line":1,"column":45,"index":45}}, "body": { "type": "Program", - "start":19,"end":43,"loc":{"start":{"line":1,"column":19,"index":19},"end":{"line":1,"column":43,"index":43}}, + "start":18,"end":44,"loc":{"start":{"line":1,"column":18,"index":18},"end":{"line":1,"column":44,"index":44}}, "sourceType": "module", "interpreter": null, "body": [ diff --git a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-top-level-await-in-module-blocks/output.json b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-top-level-await-in-module-blocks/output.json index 6fea1443537d..c8096215890e 100644 --- a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-top-level-await-in-module-blocks/output.json +++ b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-top-level-await-in-module-blocks/output.json @@ -15,7 +15,7 @@ "start":0,"end":18,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":18,"index":18}}, "body": { "type": "Program", - "start":9,"end":16,"loc":{"start":{"line":1,"column":9,"index":9},"end":{"line":1,"column":16,"index":16}}, + "start":8,"end":17,"loc":{"start":{"line":1,"column":8,"index":8},"end":{"line":1,"column":17,"index":17}}, "sourceType": "module", "interpreter": null, "body": [ diff --git a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-trailing-comment-module-blocks/input.js b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-trailing-comment-module-blocks/input.js new file mode 100644 index 000000000000..4948e65b2592 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-trailing-comment-module-blocks/input.js @@ -0,0 +1,3 @@ +module { + /* leading */ x /* trailing */ +} diff --git a/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-trailing-comment-module-blocks/output.json b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-trailing-comment-module-blocks/output.json new file mode 100644 index 000000000000..5e8aa1ab9b2b --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/module-blocks/valid-trailing-comment-module-blocks/output.json @@ -0,0 +1,65 @@ +{ + "type": "File", + "start":0,"end":43,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":3,"column":1,"index":43}}, + "program": { + "type": "Program", + "start":0,"end":43,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":3,"column":1,"index":43}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":43,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":3,"column":1,"index":43}}, + "expression": { + "type": "ModuleExpression", + "start":0,"end":43,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":3,"column":1,"index":43}}, + "body": { + "type": "Program", + "start":8,"end":42,"loc":{"start":{"line":1,"column":8,"index":8},"end":{"line":3,"column":0,"index":42}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":25,"end":26,"loc":{"start":{"line":2,"column":16,"index":25},"end":{"line":2,"column":17,"index":26}}, + "expression": { + "type": "Identifier", + "start":25,"end":26,"loc":{"start":{"line":2,"column":16,"index":25},"end":{"line":2,"column":17,"index":26},"identifierName":"x"}, + "name": "x" + }, + "trailingComments": [ + { + "type": "CommentBlock", + "value": " trailing ", + "start":27,"end":41,"loc":{"start":{"line":2,"column":18,"index":27},"end":{"line":2,"column":32,"index":41}} + } + ], + "leadingComments": [ + { + "type": "CommentBlock", + "value": " leading ", + "start":11,"end":24,"loc":{"start":{"line":2,"column":2,"index":11},"end":{"line":2,"column":15,"index":24}} + } + ] + } + ], + "directives": [] + } + } + } + ], + "directives": [] + }, + "comments": [ + { + "type": "CommentBlock", + "value": " leading ", + "start":11,"end":24,"loc":{"start":{"line":2,"column":2,"index":11},"end":{"line":2,"column":15,"index":24}} + }, + { + "type": "CommentBlock", + "value": " trailing ", + "start":27,"end":41,"loc":{"start":{"line":2,"column":18,"index":27},"end":{"line":2,"column":32,"index":41}} + } + ] +}