From 03d7911be68f8e27e76ceab501e8428e2c602512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Sun, 21 Feb 2021 14:12:12 -0500 Subject: [PATCH] Implement class features in estree (#12370) Co-authored-by: Kai Cataldo --- .../babel-eslint-parser/src/analyze-scope.js | 4 + .../babel-eslint-parser/src/visitor-keys.js | 6 +- .../src/rules/no-invalid-this.js | 5 +- eslint/babel-eslint-plugin/src/rules/semi.js | 2 +- .../test/integration/eslint/verify.js | 34 ++++++ .../babel-parser/src/parser/expression.js | 7 +- packages/babel-parser/src/plugins/estree.js | 47 +++++++- .../babel-parser/src/plugins/flow/index.js | 3 +- packages/babel-parser/src/types.js | 13 +++ .../class-private-method/basic/input.js | 1 + .../class-private-method/basic/output.json | 62 ++++++++--- .../class-private-property/basic/input.js | 4 + .../class-private-property/basic/options.json | 3 + .../class-private-property/basic/output.json | 61 +++++++++++ .../class-private-property/flow/input.js | 5 + .../class-private-property/flow/options.json | 3 + .../class-private-property/flow/output.json | 100 ++++++++++++++++++ .../typescript/input.js | 5 + .../typescript/options.json | 3 + .../typescript/output.json | 97 +++++++++++++++++ .../estree/class-property/basic/input.js | 6 ++ .../estree/class-property/basic/options.json | 3 + .../estree/class-property/basic/output.json | 96 +++++++++++++++++ .../fixtures/estree/private-in/basic/input.js | 6 ++ .../estree/private-in/basic/options.json | 3 + .../estree/private-in/basic/output.json | 97 +++++++++++++++++ 26 files changed, 656 insertions(+), 20 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/estree/class-private-property/basic/input.js create mode 100644 packages/babel-parser/test/fixtures/estree/class-private-property/basic/options.json create mode 100644 packages/babel-parser/test/fixtures/estree/class-private-property/basic/output.json create mode 100644 packages/babel-parser/test/fixtures/estree/class-private-property/flow/input.js create mode 100644 packages/babel-parser/test/fixtures/estree/class-private-property/flow/options.json create mode 100644 packages/babel-parser/test/fixtures/estree/class-private-property/flow/output.json create mode 100644 packages/babel-parser/test/fixtures/estree/class-private-property/typescript/input.js create mode 100644 packages/babel-parser/test/fixtures/estree/class-private-property/typescript/options.json create mode 100644 packages/babel-parser/test/fixtures/estree/class-private-property/typescript/output.json create mode 100644 packages/babel-parser/test/fixtures/estree/class-property/basic/input.js create mode 100644 packages/babel-parser/test/fixtures/estree/class-property/basic/options.json create mode 100644 packages/babel-parser/test/fixtures/estree/class-property/basic/output.json create mode 100644 packages/babel-parser/test/fixtures/estree/private-in/basic/input.js create mode 100644 packages/babel-parser/test/fixtures/estree/private-in/basic/options.json create mode 100644 packages/babel-parser/test/fixtures/estree/private-in/basic/output.json diff --git a/eslint/babel-eslint-parser/src/analyze-scope.js b/eslint/babel-eslint-parser/src/analyze-scope.js index c7604b48a3..69829d011b 100644 --- a/eslint/babel-eslint-parser/src/analyze-scope.js +++ b/eslint/babel-eslint-parser/src/analyze-scope.js @@ -166,6 +166,10 @@ class Referencer extends OriginalReferencer { this._visitClassProperty(node); } + PropertyDefinition(node) { + this._visitClassProperty(node); + } + // TODO: Update to visit type annotations when TypeScript/Flow support this syntax. ClassPrivateMethod(node) { super.MethodDefinition(node); diff --git a/eslint/babel-eslint-parser/src/visitor-keys.js b/eslint/babel-eslint-parser/src/visitor-keys.js index abf0c1b515..29376a65ac 100644 --- a/eslint/babel-eslint-parser/src/visitor-keys.js +++ b/eslint/babel-eslint-parser/src/visitor-keys.js @@ -8,11 +8,15 @@ export const newTypes = { Literal: ESLINT_VISITOR_KEYS.Literal, MethodDefinition: ["decorators"].concat(ESLINT_VISITOR_KEYS.MethodDefinition), Property: ["decorators"].concat(ESLINT_VISITOR_KEYS.Property), + // todo: remove this when Acorn supports class properties + PropertyDefinition: t.VISITOR_KEYS.ClassProperty, + // todo: remove this when Acorn supports class properties + PrivateIdentifier: [], }; // AST Types that shares `"type"` property with Babel but have different shape export const conflictTypes = { - // todo: remove this when class features are supported + // todo: remove this when we drop Babel 7 support ClassPrivateMethod: ["decorators"].concat( ESLINT_VISITOR_KEYS.MethodDefinition, ), diff --git a/eslint/babel-eslint-plugin/src/rules/no-invalid-this.js b/eslint/babel-eslint-plugin/src/rules/no-invalid-this.js index d420faa5c1..b51b5af636 100644 --- a/eslint/babel-eslint-plugin/src/rules/no-invalid-this.js +++ b/eslint/babel-eslint-plugin/src/rules/no-invalid-this.js @@ -11,7 +11,10 @@ export default ruleComposer.filterReports(noInvalidThisRule, problem => { if ( node.type === "ClassPrivateMethod" || node.type === "ClassPrivateProperty" || - node.type === "ClassProperty" + node.type === "ClassProperty" || + node.type === "PropertyDefinition" || + (node.type === "MethodDefinition" && + node.key.type === "PrivateIdentifier") ) { inClassMember = true; return; diff --git a/eslint/babel-eslint-plugin/src/rules/semi.js b/eslint/babel-eslint-plugin/src/rules/semi.js index 07e41f9174..5c4fa9cfea 100644 --- a/eslint/babel-eslint-plugin/src/rules/semi.js +++ b/eslint/babel-eslint-plugin/src/rules/semi.js @@ -79,7 +79,7 @@ function report(context, node, missing) { export default ruleComposer.joinReports([ rule, context => ({ - "ClassProperty, ClassPrivateProperty"(node) { + "ClassProperty, ClassPrivateProperty, PropertyDefinition"(node) { const options = context.options[1]; const exceptOneLine = options && options.omitLastInOneLineBlock === true; const sourceCode = context.getSourceCode(); diff --git a/eslint/babel-eslint-tests/test/integration/eslint/verify.js b/eslint/babel-eslint-tests/test/integration/eslint/verify.js index 5ec83416f5..6f63452871 100644 --- a/eslint/babel-eslint-tests/test/integration/eslint/verify.js +++ b/eslint/babel-eslint-tests/test/integration/eslint/verify.js @@ -1734,6 +1734,15 @@ describe("verify", () => { { "no-unused-vars": 1 }, ); }); + + it("type annotations should work", () => { + verifyAndAssertMessages( + `class C { + #p: Array + }`, + { "no-undef": 1 }, + ); + }); }); describe("private methods", () => { @@ -1794,6 +1803,31 @@ describe("verify", () => { { "no-unreachable": 1 }, ); }); + + it("should work with func-names", () => { + verifyAndAssertMessages( + ` + export class C { + #d() {}; + } + `, + { "func-names": 1 }, + ); + }); + + it("should work with space-before-function-paren", () => { + verifyAndAssertMessages( + ` + export class C { + #d() {}; + } + `, + { "space-before-function-paren": 1 }, + [ + "2:5 Missing space before function parentheses. space-before-function-paren", + ], + ); + }); }); }); diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index dbc9bdc5e8..f3a434127a 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -1172,12 +1172,15 @@ export default class ExpressionParser extends LValParser { node = (this.parseMaybePrivateName(true): N.PrivateName); if (this.match(tt._in)) { this.expectPlugin("privateIn"); - this.classScope.usePrivateName(node.id.name, node.start); + this.classScope.usePrivateName( + this.getPrivateNameSV(node), + node.start, + ); } else if (this.hasPlugin("privateIn")) { this.raise( this.state.start, Errors.PrivateInExpectedIn, - node.id.name, + this.getPrivateNameSV(node), ); } else { throw this.unexpected(start); diff --git a/packages/babel-parser/src/plugins/estree.js b/packages/babel-parser/src/plugins/estree.js index d9416b95e3..472946209e 100644 --- a/packages/babel-parser/src/plugins/estree.js +++ b/packages/babel-parser/src/plugins/estree.js @@ -194,6 +194,33 @@ export default (superClass: Class): Class => } } + parseMaybePrivateName(...args: [boolean]): any { + const node = super.parseMaybePrivateName(...args); + if (node.type === "PrivateName") { + return this.convertPrivateNameToPrivateIdentifier(node); + } + return node; + } + + convertPrivateNameToPrivateIdentifier( + node: N.PrivateName, + ): N.EstreePrivateIdentifier { + const name = super.getPrivateNameSV(node); + node = (node: any); + delete node.id; + node.name = name; + node.type = "PrivateIdentifier"; + return node; + } + + isPrivateName(node: N.Node): boolean { + return node.type === "PrivateIdentifier"; + } + + getPrivateNameSV(node: N.Node): string { + return node.name; + } + parseLiteral( value: any, type: /*T["kind"]*/ string, @@ -240,11 +267,27 @@ export default (superClass: Class): Class => delete funcNode.kind; // $FlowIgnore node.value = funcNode; - - type = type === "ClassMethod" ? "MethodDefinition" : type; + if (type === "ClassPrivateMethod") { + // $FlowIgnore + node.computed = false; + } + type = "MethodDefinition"; return this.finishNode(node, type); } + parseClassProperty(...args: [N.ClassProperty]): any { + const propertyNode = (super.parseClassProperty(...args): any); + propertyNode.type = "PropertyDefinition"; + return (propertyNode: N.EstreePropertyDefinition); + } + + parseClassPrivateProperty(...args: [N.ClassPrivateProperty]): any { + const propertyNode = (super.parseClassPrivateProperty(...args): any); + propertyNode.type = "PropertyDefinition"; + propertyNode.computed = false; + return (propertyNode: N.EstreePropertyDefinition); + } + parseObjectMethod( prop: N.ObjectMethod, isGenerator: boolean, diff --git a/packages/babel-parser/src/plugins/flow/index.js b/packages/babel-parser/src/plugins/flow/index.js index f5011ecda3..6fa8ce1107 100644 --- a/packages/babel-parser/src/plugins/flow/index.js +++ b/packages/babel-parser/src/plugins/flow/index.js @@ -2181,7 +2181,8 @@ export default (superClass: Class): Class => if (member.declare) { if ( member.type !== "ClassProperty" && - member.type !== "ClassPrivateProperty" + member.type !== "ClassPrivateProperty" && + member.type !== "PropertyDefinition" // Used by estree plugin ) { this.raise(pos, FlowErrors.DeclareClassElement); } else if (member.value) { diff --git a/packages/babel-parser/src/types.js b/packages/babel-parser/src/types.js index b190b4bde7..97d8445c0a 100644 --- a/packages/babel-parser/src/types.js +++ b/packages/babel-parser/src/types.js @@ -1077,6 +1077,19 @@ export type EstreeImportExpression = NodeBase & { source: Expression, }; +export type EstreePrivateIdentifier = NodeBase & { + type: "PrivateIdentifier", + name: string, +}; + +export type EstreePropertyDefinition = NodeBase & { + type: "PropertyDefinition", + static: boolean, + key: Expression | EstreePrivateIdentifier, + computed: boolean, + value: Expression, +}; + // === === === === // TypeScript // === === === === diff --git a/packages/babel-parser/test/fixtures/estree/class-private-method/basic/input.js b/packages/babel-parser/test/fixtures/estree/class-private-method/basic/input.js index 83ead2348f..95a442a265 100644 --- a/packages/babel-parser/test/fixtures/estree/class-private-method/basic/input.js +++ b/packages/babel-parser/test/fixtures/estree/class-private-method/basic/input.js @@ -1,3 +1,4 @@ class A { #foo(arg, ...others) {} + static #bar(arg, ...others) {} } diff --git a/packages/babel-parser/test/fixtures/estree/class-private-method/basic/output.json b/packages/babel-parser/test/fixtures/estree/class-private-method/basic/output.json index 0c0275a5fe..8cba57bd79 100644 --- a/packages/babel-parser/test/fixtures/estree/class-private-method/basic/output.json +++ b/packages/babel-parser/test/fixtures/estree/class-private-method/basic/output.json @@ -1,15 +1,15 @@ { "type": "File", - "start":0,"end":37,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "start":0,"end":70,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, "program": { "type": "Program", - "start":0,"end":37,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "start":0,"end":70,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, "sourceType": "script", "interpreter": null, "body": [ { "type": "ClassDeclaration", - "start":0,"end":37,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "start":0,"end":70,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, "id": { "type": "Identifier", "start":6,"end":7,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":7},"identifierName":"A"}, @@ -18,20 +18,16 @@ "superClass": null, "body": { "type": "ClassBody", - "start":8,"end":37,"loc":{"start":{"line":1,"column":8},"end":{"line":3,"column":1}}, + "start":8,"end":70,"loc":{"start":{"line":1,"column":8},"end":{"line":4,"column":1}}, "body": [ { - "type": "ClassPrivateMethod", + "type": "MethodDefinition", "start":12,"end":35,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":25}}, "static": false, "key": { - "type": "PrivateName", + "type": "PrivateIdentifier", "start":12,"end":16,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":6}}, - "id": { - "type": "Identifier", - "start":13,"end":16,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":6},"identifierName":"foo"}, - "name": "foo" - } + "name": "foo" }, "kind": "method", "value": { @@ -62,7 +58,49 @@ "start":33,"end":35,"loc":{"start":{"line":2,"column":23},"end":{"line":2,"column":25}}, "body": [] } - } + }, + "computed": false + }, + { + "type": "MethodDefinition", + "start":38,"end":68,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":32}}, + "static": true, + "key": { + "type": "PrivateIdentifier", + "start":45,"end":49,"loc":{"start":{"line":3,"column":9},"end":{"line":3,"column":13}}, + "name": "bar" + }, + "kind": "method", + "value": { + "type": "FunctionExpression", + "start":49,"end":68,"loc":{"start":{"line":3,"column":13},"end":{"line":3,"column":32}}, + "id": null, + "generator": false, + "async": false, + "expression": false, + "params": [ + { + "type": "Identifier", + "start":50,"end":53,"loc":{"start":{"line":3,"column":14},"end":{"line":3,"column":17},"identifierName":"arg"}, + "name": "arg" + }, + { + "type": "RestElement", + "start":55,"end":64,"loc":{"start":{"line":3,"column":19},"end":{"line":3,"column":28}}, + "argument": { + "type": "Identifier", + "start":58,"end":64,"loc":{"start":{"line":3,"column":22},"end":{"line":3,"column":28},"identifierName":"others"}, + "name": "others" + } + } + ], + "body": { + "type": "BlockStatement", + "start":66,"end":68,"loc":{"start":{"line":3,"column":30},"end":{"line":3,"column":32}}, + "body": [] + } + }, + "computed": false } ] } diff --git a/packages/babel-parser/test/fixtures/estree/class-private-property/basic/input.js b/packages/babel-parser/test/fixtures/estree/class-private-property/basic/input.js new file mode 100644 index 0000000000..6124cfdbf4 --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/class-private-property/basic/input.js @@ -0,0 +1,4 @@ +class A { + #foo = "bar"; + static #bar = foo; +} diff --git a/packages/babel-parser/test/fixtures/estree/class-private-property/basic/options.json b/packages/babel-parser/test/fixtures/estree/class-private-property/basic/options.json new file mode 100644 index 0000000000..05648e4640 --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/class-private-property/basic/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["estree", "classPrivateProperties"] +} diff --git a/packages/babel-parser/test/fixtures/estree/class-private-property/basic/output.json b/packages/babel-parser/test/fixtures/estree/class-private-property/basic/output.json new file mode 100644 index 0000000000..23c1a61c12 --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/class-private-property/basic/output.json @@ -0,0 +1,61 @@ +{ + "type": "File", + "start":0,"end":48,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, + "program": { + "type": "Program", + "start":0,"end":48,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":48,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":7,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":7},"identifierName":"A"}, + "name": "A" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":8,"end":48,"loc":{"start":{"line":1,"column":8},"end":{"line":4,"column":1}}, + "body": [ + { + "type": "PropertyDefinition", + "start":12,"end":25,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":15}}, + "static": false, + "key": { + "type": "PrivateIdentifier", + "start":12,"end":16,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":6}}, + "name": "foo" + }, + "value": { + "type": "Literal", + "start":19,"end":24,"loc":{"start":{"line":2,"column":9},"end":{"line":2,"column":14}}, + "value": "bar", + "raw": "\"bar\"" + }, + "computed": false + }, + { + "type": "PropertyDefinition", + "start":28,"end":46,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":20}}, + "static": true, + "key": { + "type": "PrivateIdentifier", + "start":35,"end":39,"loc":{"start":{"line":3,"column":9},"end":{"line":3,"column":13}}, + "name": "bar" + }, + "value": { + "type": "Identifier", + "start":42,"end":45,"loc":{"start":{"line":3,"column":16},"end":{"line":3,"column":19},"identifierName":"foo"}, + "name": "foo" + }, + "computed": false + } + ] + } + } + ] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/estree/class-private-property/flow/input.js b/packages/babel-parser/test/fixtures/estree/class-private-property/flow/input.js new file mode 100644 index 0000000000..f8fce5e3b9 --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/class-private-property/flow/input.js @@ -0,0 +1,5 @@ +class A { + #foo = "bar"; + static #bar = foo; + declare #qux: Array; +} diff --git a/packages/babel-parser/test/fixtures/estree/class-private-property/flow/options.json b/packages/babel-parser/test/fixtures/estree/class-private-property/flow/options.json new file mode 100644 index 0000000000..273df01c4f --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/class-private-property/flow/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["flow", "estree", "classPrivateProperties"] +} diff --git a/packages/babel-parser/test/fixtures/estree/class-private-property/flow/output.json b/packages/babel-parser/test/fixtures/estree/class-private-property/flow/output.json new file mode 100644 index 0000000000..e8de51b0d2 --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/class-private-property/flow/output.json @@ -0,0 +1,100 @@ +{ + "type": "File", + "start":0,"end":79,"loc":{"start":{"line":1,"column":0},"end":{"line":5,"column":1}}, + "program": { + "type": "Program", + "start":0,"end":79,"loc":{"start":{"line":1,"column":0},"end":{"line":5,"column":1}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":79,"loc":{"start":{"line":1,"column":0},"end":{"line":5,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":7,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":7},"identifierName":"A"}, + "name": "A" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":8,"end":79,"loc":{"start":{"line":1,"column":8},"end":{"line":5,"column":1}}, + "body": [ + { + "type": "PropertyDefinition", + "start":12,"end":25,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":15}}, + "static": false, + "key": { + "type": "PrivateIdentifier", + "start":12,"end":16,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":6}}, + "name": "foo" + }, + "variance": null, + "value": { + "type": "Literal", + "start":19,"end":24,"loc":{"start":{"line":2,"column":9},"end":{"line":2,"column":14}}, + "value": "bar", + "raw": "\"bar\"" + }, + "computed": false + }, + { + "type": "PropertyDefinition", + "start":28,"end":46,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":20}}, + "static": true, + "key": { + "type": "PrivateIdentifier", + "start":35,"end":39,"loc":{"start":{"line":3,"column":9},"end":{"line":3,"column":13}}, + "name": "bar" + }, + "variance": null, + "value": { + "type": "Identifier", + "start":42,"end":45,"loc":{"start":{"line":3,"column":16},"end":{"line":3,"column":19},"identifierName":"foo"}, + "name": "foo" + }, + "computed": false + }, + { + "type": "PropertyDefinition", + "start":49,"end":77,"loc":{"start":{"line":4,"column":2},"end":{"line":4,"column":30}}, + "declare": true, + "static": false, + "key": { + "type": "PrivateIdentifier", + "start":57,"end":61,"loc":{"start":{"line":4,"column":10},"end":{"line":4,"column":14}}, + "name": "qux" + }, + "variance": null, + "typeAnnotation": { + "type": "TypeAnnotation", + "start":61,"end":76,"loc":{"start":{"line":4,"column":14},"end":{"line":4,"column":29}}, + "typeAnnotation": { + "type": "GenericTypeAnnotation", + "start":63,"end":76,"loc":{"start":{"line":4,"column":16},"end":{"line":4,"column":29}}, + "typeParameters": { + "type": "TypeParameterInstantiation", + "start":68,"end":76,"loc":{"start":{"line":4,"column":21},"end":{"line":4,"column":29}}, + "params": [ + { + "type": "StringTypeAnnotation", + "start":69,"end":75,"loc":{"start":{"line":4,"column":22},"end":{"line":4,"column":28}} + } + ] + }, + "id": { + "type": "Identifier", + "start":63,"end":68,"loc":{"start":{"line":4,"column":16},"end":{"line":4,"column":21},"identifierName":"Array"}, + "name": "Array" + } + } + }, + "value": null, + "computed": false + } + ] + } + } + ] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/estree/class-private-property/typescript/input.js b/packages/babel-parser/test/fixtures/estree/class-private-property/typescript/input.js new file mode 100644 index 0000000000..f8fce5e3b9 --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/class-private-property/typescript/input.js @@ -0,0 +1,5 @@ +class A { + #foo = "bar"; + static #bar = foo; + declare #qux: Array; +} diff --git a/packages/babel-parser/test/fixtures/estree/class-private-property/typescript/options.json b/packages/babel-parser/test/fixtures/estree/class-private-property/typescript/options.json new file mode 100644 index 0000000000..b2f3ef5307 --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/class-private-property/typescript/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["typescript", "estree", "classPrivateProperties"] +} diff --git a/packages/babel-parser/test/fixtures/estree/class-private-property/typescript/output.json b/packages/babel-parser/test/fixtures/estree/class-private-property/typescript/output.json new file mode 100644 index 0000000000..5fc9b9306a --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/class-private-property/typescript/output.json @@ -0,0 +1,97 @@ +{ + "type": "File", + "start":0,"end":79,"loc":{"start":{"line":1,"column":0},"end":{"line":5,"column":1}}, + "program": { + "type": "Program", + "start":0,"end":79,"loc":{"start":{"line":1,"column":0},"end":{"line":5,"column":1}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":79,"loc":{"start":{"line":1,"column":0},"end":{"line":5,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":7,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":7},"identifierName":"A"}, + "name": "A" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":8,"end":79,"loc":{"start":{"line":1,"column":8},"end":{"line":5,"column":1}}, + "body": [ + { + "type": "PropertyDefinition", + "start":12,"end":25,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":15}}, + "static": false, + "key": { + "type": "PrivateIdentifier", + "start":12,"end":16,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":6}}, + "name": "foo" + }, + "value": { + "type": "Literal", + "start":19,"end":24,"loc":{"start":{"line":2,"column":9},"end":{"line":2,"column":14}}, + "value": "bar", + "raw": "\"bar\"" + }, + "computed": false + }, + { + "type": "PropertyDefinition", + "start":28,"end":46,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":20}}, + "static": true, + "key": { + "type": "PrivateIdentifier", + "start":35,"end":39,"loc":{"start":{"line":3,"column":9},"end":{"line":3,"column":13}}, + "name": "bar" + }, + "value": { + "type": "Identifier", + "start":42,"end":45,"loc":{"start":{"line":3,"column":16},"end":{"line":3,"column":19},"identifierName":"foo"}, + "name": "foo" + }, + "computed": false + }, + { + "type": "PropertyDefinition", + "start":49,"end":77,"loc":{"start":{"line":4,"column":2},"end":{"line":4,"column":30}}, + "declare": true, + "static": false, + "key": { + "type": "PrivateIdentifier", + "start":57,"end":61,"loc":{"start":{"line":4,"column":10},"end":{"line":4,"column":14}}, + "name": "qux" + }, + "typeAnnotation": { + "type": "TSTypeAnnotation", + "start":61,"end":76,"loc":{"start":{"line":4,"column":14},"end":{"line":4,"column":29}}, + "typeAnnotation": { + "type": "TSTypeReference", + "start":63,"end":76,"loc":{"start":{"line":4,"column":16},"end":{"line":4,"column":29}}, + "typeName": { + "type": "Identifier", + "start":63,"end":68,"loc":{"start":{"line":4,"column":16},"end":{"line":4,"column":21},"identifierName":"Array"}, + "name": "Array" + }, + "typeParameters": { + "type": "TSTypeParameterInstantiation", + "start":68,"end":76,"loc":{"start":{"line":4,"column":21},"end":{"line":4,"column":29}}, + "params": [ + { + "type": "TSStringKeyword", + "start":69,"end":75,"loc":{"start":{"line":4,"column":22},"end":{"line":4,"column":28}} + } + ] + } + } + }, + "value": null, + "computed": false + } + ] + } + } + ] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/estree/class-property/basic/input.js b/packages/babel-parser/test/fixtures/estree/class-property/basic/input.js new file mode 100644 index 0000000000..48edb1bb1b --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/class-property/basic/input.js @@ -0,0 +1,6 @@ +class A { + foo = "bar"; + [bar] = foo; + static "qux" = "quux"; + static [quux] = "qux"; +} diff --git a/packages/babel-parser/test/fixtures/estree/class-property/basic/options.json b/packages/babel-parser/test/fixtures/estree/class-property/basic/options.json new file mode 100644 index 0000000000..78ec974b4f --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/class-property/basic/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["estree", "classProperties"] +} diff --git a/packages/babel-parser/test/fixtures/estree/class-property/basic/output.json b/packages/babel-parser/test/fixtures/estree/class-property/basic/output.json new file mode 100644 index 0000000000..2147f4df6d --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/class-property/basic/output.json @@ -0,0 +1,96 @@ +{ + "type": "File", + "start":0,"end":91,"loc":{"start":{"line":1,"column":0},"end":{"line":6,"column":1}}, + "program": { + "type": "Program", + "start":0,"end":91,"loc":{"start":{"line":1,"column":0},"end":{"line":6,"column":1}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":91,"loc":{"start":{"line":1,"column":0},"end":{"line":6,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":7,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":7},"identifierName":"A"}, + "name": "A" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":8,"end":91,"loc":{"start":{"line":1,"column":8},"end":{"line":6,"column":1}}, + "body": [ + { + "type": "PropertyDefinition", + "start":12,"end":24,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":14}}, + "static": false, + "key": { + "type": "Identifier", + "start":12,"end":15,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":5},"identifierName":"foo"}, + "name": "foo" + }, + "computed": false, + "value": { + "type": "Literal", + "start":18,"end":23,"loc":{"start":{"line":2,"column":8},"end":{"line":2,"column":13}}, + "value": "bar", + "raw": "\"bar\"" + } + }, + { + "type": "PropertyDefinition", + "start":27,"end":39,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":14}}, + "static": false, + "computed": true, + "key": { + "type": "Identifier", + "start":28,"end":31,"loc":{"start":{"line":3,"column":3},"end":{"line":3,"column":6},"identifierName":"bar"}, + "name": "bar" + }, + "value": { + "type": "Identifier", + "start":35,"end":38,"loc":{"start":{"line":3,"column":10},"end":{"line":3,"column":13},"identifierName":"foo"}, + "name": "foo" + } + }, + { + "type": "PropertyDefinition", + "start":42,"end":64,"loc":{"start":{"line":4,"column":2},"end":{"line":4,"column":24}}, + "static": true, + "key": { + "type": "Literal", + "start":49,"end":54,"loc":{"start":{"line":4,"column":9},"end":{"line":4,"column":14}}, + "value": "qux", + "raw": "\"qux\"" + }, + "computed": false, + "value": { + "type": "Literal", + "start":57,"end":63,"loc":{"start":{"line":4,"column":17},"end":{"line":4,"column":23}}, + "value": "quux", + "raw": "\"quux\"" + } + }, + { + "type": "PropertyDefinition", + "start":67,"end":89,"loc":{"start":{"line":5,"column":2},"end":{"line":5,"column":24}}, + "static": true, + "computed": true, + "key": { + "type": "Identifier", + "start":75,"end":79,"loc":{"start":{"line":5,"column":10},"end":{"line":5,"column":14},"identifierName":"quux"}, + "name": "quux" + }, + "value": { + "type": "Literal", + "start":83,"end":88,"loc":{"start":{"line":5,"column":18},"end":{"line":5,"column":23}}, + "value": "qux", + "raw": "\"qux\"" + } + } + ] + } + } + ] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/estree/private-in/basic/input.js b/packages/babel-parser/test/fixtures/estree/private-in/basic/input.js new file mode 100644 index 0000000000..ced1c624f0 --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/private-in/basic/input.js @@ -0,0 +1,6 @@ +class A { + #foo = "bar"; + static isA(obj) { + return #foo in obj; + } +} diff --git a/packages/babel-parser/test/fixtures/estree/private-in/basic/options.json b/packages/babel-parser/test/fixtures/estree/private-in/basic/options.json new file mode 100644 index 0000000000..6db93254bf --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/private-in/basic/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["estree", "classPrivateProperties", "privateIn"] +} diff --git a/packages/babel-parser/test/fixtures/estree/private-in/basic/output.json b/packages/babel-parser/test/fixtures/estree/private-in/basic/output.json new file mode 100644 index 0000000000..2af3c274c7 --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/private-in/basic/output.json @@ -0,0 +1,97 @@ +{ + "type": "File", + "start":0,"end":75,"loc":{"start":{"line":1,"column":0},"end":{"line":6,"column":1}}, + "program": { + "type": "Program", + "start":0,"end":75,"loc":{"start":{"line":1,"column":0},"end":{"line":6,"column":1}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":75,"loc":{"start":{"line":1,"column":0},"end":{"line":6,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":7,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":7},"identifierName":"A"}, + "name": "A" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":8,"end":75,"loc":{"start":{"line":1,"column":8},"end":{"line":6,"column":1}}, + "body": [ + { + "type": "PropertyDefinition", + "start":12,"end":25,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":15}}, + "static": false, + "key": { + "type": "PrivateIdentifier", + "start":12,"end":16,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":6}}, + "name": "foo" + }, + "value": { + "type": "Literal", + "start":19,"end":24,"loc":{"start":{"line":2,"column":9},"end":{"line":2,"column":14}}, + "value": "bar", + "raw": "\"bar\"" + }, + "computed": false + }, + { + "type": "MethodDefinition", + "start":28,"end":73,"loc":{"start":{"line":3,"column":2},"end":{"line":5,"column":3}}, + "static": true, + "key": { + "type": "Identifier", + "start":35,"end":38,"loc":{"start":{"line":3,"column":9},"end":{"line":3,"column":12},"identifierName":"isA"}, + "name": "isA" + }, + "computed": false, + "kind": "method", + "value": { + "type": "FunctionExpression", + "start":38,"end":73,"loc":{"start":{"line":3,"column":12},"end":{"line":5,"column":3}}, + "id": null, + "generator": false, + "async": false, + "expression": false, + "params": [ + { + "type": "Identifier", + "start":39,"end":42,"loc":{"start":{"line":3,"column":13},"end":{"line":3,"column":16},"identifierName":"obj"}, + "name": "obj" + } + ], + "body": { + "type": "BlockStatement", + "start":44,"end":73,"loc":{"start":{"line":3,"column":18},"end":{"line":5,"column":3}}, + "body": [ + { + "type": "ReturnStatement", + "start":50,"end":69,"loc":{"start":{"line":4,"column":4},"end":{"line":4,"column":23}}, + "argument": { + "type": "BinaryExpression", + "start":57,"end":68,"loc":{"start":{"line":4,"column":11},"end":{"line":4,"column":22}}, + "left": { + "type": "PrivateIdentifier", + "start":57,"end":61,"loc":{"start":{"line":4,"column":11},"end":{"line":4,"column":15}}, + "name": "foo" + }, + "operator": "in", + "right": { + "type": "Identifier", + "start":65,"end":68,"loc":{"start":{"line":4,"column":19},"end":{"line":4,"column":22},"identifierName":"obj"}, + "name": "obj" + } + } + } + ] + } + } + } + ] + } + } + ] + } +} \ No newline at end of file