diff --git a/packages/babel-parser/src/plugins/typescript/index.js b/packages/babel-parser/src/plugins/typescript/index.js index c11dd2ace0..ea067f5707 100644 --- a/packages/babel-parser/src/plugins/typescript/index.js +++ b/packages/babel-parser/src/plugins/typescript/index.js @@ -131,6 +131,8 @@ const TSErrors = makeErrorTemplates( "A 'set' accessor cannot have rest parameter.", SetAccesorCannotHaveReturnType: "A 'set' accessor cannot have a return type annotation.", + StaticBlockCannotHaveModifier: + "Static class blocks cannot have any modifier.", TypeAnnotationAfterAssign: "Type annotations must come before default assignments, e.g. instead of `age = 25: number` use `age: number = 25`.", TypeImportCannotSpecifyDefaultAndNamed: @@ -2317,34 +2319,49 @@ export default (superClass: Class): Class => return this.tsParseModifier(["public", "protected", "private"]); } + tsHasSomeModifiers(member: any, modifiers: TsModifier[]): boolean { + return modifiers.some(modifier => { + if (tsIsAccessModifier(modifier)) { + return member.accessibility === modifier; + } + return !!member[modifier]; + }); + } + parseClassMember( classBody: N.ClassBody, member: any, state: N.ParseClassMemberState, ): void { - this.tsParseModifiers(member, [ + const invalidModifersForStaticBlocks = [ "declare", "private", "public", "protected", "override", - "static", "abstract", "readonly", - ]); + ]; + this.tsParseModifiers( + member, + invalidModifersForStaticBlocks.concat(["static"]), + ); - const callParseClassMember = () => { - this.parseClassMemberWithIsStatic( - classBody, - member, - state, - !!member.static, - ); + const callParseClassMemberWithIsStatic = () => { + const isStatic = !!member.static; + if (isStatic && this.eat(tt.braceL)) { + if (this.tsHasSomeModifiers(member, invalidModifersForStaticBlocks)) { + this.raise(this.state.pos, TSErrors.StaticBlockCannotHaveModifier); + } + this.parseClassStaticBlock(classBody, ((member: any): N.StaticBlock)); + } else { + this.parseClassMemberWithIsStatic(classBody, member, state, isStatic); + } }; if (member.declare) { - this.tsInAmbientContext(callParseClassMember); + this.tsInAmbientContext(callParseClassMemberWithIsStatic); } else { - callParseClassMember(); + callParseClassMemberWithIsStatic(); } } diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-private/input.ts b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-private/input.ts new file mode 100644 index 0000000000..78f1f56591 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-private/input.ts @@ -0,0 +1,3 @@ +class Foo { + static private {} +} diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-private/output.json b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-private/output.json new file mode 100644 index 0000000000..65faa07fd2 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-private/output.json @@ -0,0 +1,40 @@ +{ + "type": "File", + "start":0,"end":33,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "errors": [ + "SyntaxError: 'private' modifier must precede 'static' modifier. (2:9)", + "SyntaxError: Static class blocks cannot have any modifier. (2:19)" + ], + "program": { + "type": "Program", + "start":0,"end":33,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":33,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"Foo"}, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":10,"end":33,"loc":{"start":{"line":1,"column":10},"end":{"line":3,"column":1}}, + "body": [ + { + "type": "StaticBlock", + "start":14,"end":31,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":19}}, + "static": true, + "accessibility": "private", + "body": [] + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-protected/input.ts b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-protected/input.ts new file mode 100644 index 0000000000..2cacf18a77 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-protected/input.ts @@ -0,0 +1,3 @@ +class Foo { + static protected {} +} diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-protected/output.json b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-protected/output.json new file mode 100644 index 0000000000..b0cfcdb022 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-protected/output.json @@ -0,0 +1,40 @@ +{ + "type": "File", + "start":0,"end":35,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "errors": [ + "SyntaxError: 'protected' modifier must precede 'static' modifier. (2:9)", + "SyntaxError: Static class blocks cannot have any modifier. (2:21)" + ], + "program": { + "type": "Program", + "start":0,"end":35,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":35,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"Foo"}, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":10,"end":35,"loc":{"start":{"line":1,"column":10},"end":{"line":3,"column":1}}, + "body": [ + { + "type": "StaticBlock", + "start":14,"end":33,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":21}}, + "static": true, + "accessibility": "protected", + "body": [] + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-public/input.ts b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-public/input.ts new file mode 100644 index 0000000000..4b547e4fbc --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-public/input.ts @@ -0,0 +1,3 @@ +class Foo { + static public {} +} diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-public/output.json b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-public/output.json new file mode 100644 index 0000000000..178d8a4e5d --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-public/output.json @@ -0,0 +1,40 @@ +{ + "type": "File", + "start":0,"end":32,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "errors": [ + "SyntaxError: 'public' modifier must precede 'static' modifier. (2:9)", + "SyntaxError: Static class blocks cannot have any modifier. (2:18)" + ], + "program": { + "type": "Program", + "start":0,"end":32,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":32,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"Foo"}, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":10,"end":32,"loc":{"start":{"line":1,"column":10},"end":{"line":3,"column":1}}, + "body": [ + { + "type": "StaticBlock", + "start":14,"end":30,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":18}}, + "static": true, + "accessibility": "public", + "body": [] + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-modifier-abstract/input.ts b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-modifier-abstract/input.ts new file mode 100644 index 0000000000..59517ad9d2 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-modifier-abstract/input.ts @@ -0,0 +1,3 @@ +class Foo { + abstract static {} +} diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-modifier-abstract/output.json b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-modifier-abstract/output.json new file mode 100644 index 0000000000..66fd7a1b2b --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-modifier-abstract/output.json @@ -0,0 +1,40 @@ +{ + "type": "File", + "start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "errors": [ + "SyntaxError: 'static' modifier cannot be used with 'abstract' modifier. (2:11)", + "SyntaxError: Static class blocks cannot have any modifier. (2:20)" + ], + "program": { + "type": "Program", + "start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"Foo"}, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":10,"end":34,"loc":{"start":{"line":1,"column":10},"end":{"line":3,"column":1}}, + "body": [ + { + "type": "StaticBlock", + "start":14,"end":32,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":20}}, + "abstract": true, + "static": true, + "body": [] + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-modifier-override/input.ts b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-modifier-override/input.ts new file mode 100644 index 0000000000..5f3c5dbcae --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-modifier-override/input.ts @@ -0,0 +1,3 @@ +class Foo { + override static {} +} diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-modifier-override/output.json b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-modifier-override/output.json new file mode 100644 index 0000000000..cd9e56ada8 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-modifier-override/output.json @@ -0,0 +1,40 @@ +{ + "type": "File", + "start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "errors": [ + "SyntaxError: 'static' modifier must precede 'override' modifier. (2:11)", + "SyntaxError: Static class blocks cannot have any modifier. (2:20)" + ], + "program": { + "type": "Program", + "start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"Foo"}, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":10,"end":34,"loc":{"start":{"line":1,"column":10},"end":{"line":3,"column":1}}, + "body": [ + { + "type": "StaticBlock", + "start":14,"end":32,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":20}}, + "override": true, + "static": true, + "body": [] + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-modifier-static/input.ts b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-modifier-static/input.ts new file mode 100644 index 0000000000..7c63af013d --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-modifier-static/input.ts @@ -0,0 +1,3 @@ +class Foo { + static static {} +} diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-modifier-static/output.json b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-modifier-static/output.json new file mode 100644 index 0000000000..e5dcf1757e --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-modifier-static/output.json @@ -0,0 +1,38 @@ +{ + "type": "File", + "start":0,"end":32,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "errors": [ + "SyntaxError: Duplicate modifier: 'static'. (2:9)" + ], + "program": { + "type": "Program", + "start":0,"end":32,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":32,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"Foo"}, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":10,"end":32,"loc":{"start":{"line":1,"column":10},"end":{"line":3,"column":1}}, + "body": [ + { + "type": "StaticBlock", + "start":14,"end":30,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":18}}, + "static": true, + "body": [] + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-blocks-with-modifer-declare/input.ts b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-blocks-with-modifer-declare/input.ts new file mode 100644 index 0000000000..def675f07a --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-blocks-with-modifer-declare/input.ts @@ -0,0 +1,3 @@ +class Foo { + declare static {} +} diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-blocks-with-modifer-declare/output.json b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-blocks-with-modifer-declare/output.json new file mode 100644 index 0000000000..0f311fbf18 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-blocks-with-modifer-declare/output.json @@ -0,0 +1,39 @@ +{ + "type": "File", + "start":0,"end":33,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "errors": [ + "SyntaxError: Static class blocks cannot have any modifier. (2:19)" + ], + "program": { + "type": "Program", + "start":0,"end":33,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":33,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"Foo"}, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":10,"end":33,"loc":{"start":{"line":1,"column":10},"end":{"line":3,"column":1}}, + "body": [ + { + "type": "StaticBlock", + "start":14,"end":31,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":19}}, + "declare": true, + "static": true, + "body": [] + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-blocks-with-modifier-readonly/input.ts b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-blocks-with-modifier-readonly/input.ts new file mode 100644 index 0000000000..5a86c69a07 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-blocks-with-modifier-readonly/input.ts @@ -0,0 +1,3 @@ +class Foo { + readonly static {} +} diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-blocks-with-modifier-readonly/output.json b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-blocks-with-modifier-readonly/output.json new file mode 100644 index 0000000000..86a169878b --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-blocks-with-modifier-readonly/output.json @@ -0,0 +1,40 @@ +{ + "type": "File", + "start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "errors": [ + "SyntaxError: 'static' modifier must precede 'readonly' modifier. (2:11)", + "SyntaxError: Static class blocks cannot have any modifier. (2:20)" + ], + "program": { + "type": "Program", + "start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"Foo"}, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":10,"end":34,"loc":{"start":{"line":1,"column":10},"end":{"line":3,"column":1}}, + "body": [ + { + "type": "StaticBlock", + "start":14,"end":32,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":20}}, + "readonly": true, + "static": true, + "body": [] + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/options.json b/packages/babel-parser/test/fixtures/typescript/static-blocks/options.json new file mode 100644 index 0000000000..711110b57a --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["classStaticBlock", "typescript"], + "sourceType": "module" +} diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks-and-proptery-named-static/input.ts b/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks-and-proptery-named-static/input.ts new file mode 100644 index 0000000000..60bb438e20 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks-and-proptery-named-static/input.ts @@ -0,0 +1,4 @@ +class Foo { + static; + static {} +} diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks-and-proptery-named-static/output.json b/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks-and-proptery-named-static/output.json new file mode 100644 index 0000000000..1fd1dd8237 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks-and-proptery-named-static/output.json @@ -0,0 +1,47 @@ +{ + "type": "File", + "start":0,"end":35,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, + "program": { + "type": "Program", + "start":0,"end":35,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":35,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"Foo"}, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":10,"end":35,"loc":{"start":{"line":1,"column":10},"end":{"line":4,"column":1}}, + "body": [ + { + "type": "ClassProperty", + "start":14,"end":21,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":9}}, + "static": false, + "key": { + "type": "Identifier", + "start":14,"end":20,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":8},"identifierName":"static"}, + "name": "static" + }, + "computed": false, + "value": null + }, + { + "type": "StaticBlock", + "start":24,"end":33,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":11}}, + "static": true, + "body": [] + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks-and-static-property-named-static/input.ts b/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks-and-static-property-named-static/input.ts new file mode 100644 index 0000000000..84550c367b --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks-and-static-property-named-static/input.ts @@ -0,0 +1,4 @@ +class Foo { + static static; + static {} +} diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks-and-static-property-named-static/output.json b/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks-and-static-property-named-static/output.json new file mode 100644 index 0000000000..ffe88cead7 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks-and-static-property-named-static/output.json @@ -0,0 +1,47 @@ +{ + "type": "File", + "start":0,"end":42,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, + "program": { + "type": "Program", + "start":0,"end":42,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":42,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"Foo"}, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":10,"end":42,"loc":{"start":{"line":1,"column":10},"end":{"line":4,"column":1}}, + "body": [ + { + "type": "ClassProperty", + "start":14,"end":28,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":16}}, + "static": true, + "key": { + "type": "Identifier", + "start":21,"end":27,"loc":{"start":{"line":2,"column":9},"end":{"line":2,"column":15},"identifierName":"static"}, + "name": "static" + }, + "computed": false, + "value": null + }, + { + "type": "StaticBlock", + "start":31,"end":40,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":11}}, + "static": true, + "body": [] + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks-and-static-property/input.ts b/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks-and-static-property/input.ts new file mode 100644 index 0000000000..323bcb0f9e --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks-and-static-property/input.ts @@ -0,0 +1,4 @@ +class Foo { + static foo; + static {} +} diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks-and-static-property/output.json b/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks-and-static-property/output.json new file mode 100644 index 0000000000..754121e53f --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks-and-static-property/output.json @@ -0,0 +1,47 @@ +{ + "type": "File", + "start":0,"end":39,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, + "program": { + "type": "Program", + "start":0,"end":39,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":39,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"Foo"}, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":10,"end":39,"loc":{"start":{"line":1,"column":10},"end":{"line":4,"column":1}}, + "body": [ + { + "type": "ClassProperty", + "start":14,"end":25,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":13}}, + "static": true, + "key": { + "type": "Identifier", + "start":21,"end":24,"loc":{"start":{"line":2,"column":9},"end":{"line":2,"column":12},"identifierName":"foo"}, + "name": "foo" + }, + "computed": false, + "value": null + }, + { + "type": "StaticBlock", + "start":28,"end":37,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":11}}, + "static": true, + "body": [] + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks/input.ts b/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks/input.ts new file mode 100644 index 0000000000..e3d5a18914 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks/input.ts @@ -0,0 +1,3 @@ +class Foo { + static {} +} diff --git a/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks/output.json b/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks/output.json new file mode 100644 index 0000000000..05c10a18a8 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/static-blocks/static-blocks/output.json @@ -0,0 +1,35 @@ +{ + "type": "File", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "program": { + "type": "Program", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"Foo"}, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":10,"end":25,"loc":{"start":{"line":1,"column":10},"end":{"line":3,"column":1}}, + "body": [ + { + "type": "StaticBlock", + "start":14,"end":23,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":11}}, + "static": true, + "body": [] + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file