diff --git a/packages/babel-parser/src/plugins/estree.js b/packages/babel-parser/src/plugins/estree.js index c96478e1511f..abc51174ca27 100644 --- a/packages/babel-parser/src/plugins/estree.js +++ b/packages/babel-parser/src/plugins/estree.js @@ -238,6 +238,26 @@ export default (superClass: Class): Class => } } + parseMaybePrivateName( + ...args: [boolean] + ): N.Identifier | N.EstreePrivateIdentifier { + const node = super.parseMaybePrivateName(...args); + if (node.type === "PrivateName") { + node.name = node.id.name; + delete node.id; + node.type = "PrivateIdentifier"; + } + return node; + } + + isPrivateName(node: Node): boolean { + return node.type === "PrivateIdentifier"; + } + + getPrivateNameSV(node: Node): string { + return node.name; + } + parseLiteral( value: any, type: /*T["kind"]*/ string, @@ -284,11 +304,28 @@ export default (superClass: Class): Class => delete funcNode.kind; // $FlowIgnore node.value = funcNode; - - type = type === "ClassMethod" ? "MethodDefinition" : type; + if (type === "ClassPrivateMethod") { + node.computed = false; + } + type = "MethodDefinition"; return this.finishNode(node, type); } + parseClassProperty(...args: [N.ClassProperty]): N.EstreePropertyDefinition { + const propertyNode = super.parseClassProperty(...args); + propertyNode.type = "PropertyDefinition"; + return propertyNode; + } + + parseClassPrivateProperty( + ...args: [N.ClassPrivateProperty] + ): N.EstreePropertyDefinition { + const propertyNode = super.parseClassPrivateProperty(...args); + propertyNode.type = "PropertyDefinition"; + propertyNode.computed = false; + return propertyNode; + } + parseObjectMethod( prop: N.ObjectMethod, isGenerator: boolean, diff --git a/packages/babel-parser/src/types.js b/packages/babel-parser/src/types.js index d5a28729d41b..9cffd7db8add 100644 --- a/packages/babel-parser/src/types.js +++ b/packages/babel-parser/src/types.js @@ -1072,6 +1072,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 83ead2348fae..95a442a2652d 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 0c0275a5fe10..8cba57bd797f 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 000000000000..6124cfdbf4c5 --- /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 000000000000..05648e46404b --- /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 000000000000..23c1a61c1202 --- /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-property/basic/input.js b/packages/babel-parser/test/fixtures/estree/class-property/basic/input.js new file mode 100644 index 000000000000..48edb1bb1ba9 --- /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 000000000000..78ec974b4f47 --- /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 000000000000..2147f4df6df8 --- /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