Skip to content

Commit

Permalink
feat: implement experimental class features support
Browse files Browse the repository at this point in the history
  • Loading branch information
JLHwung committed Nov 17, 2020
1 parent 5419475 commit 4a293e3
Show file tree
Hide file tree
Showing 10 changed files with 276 additions and 14 deletions.
41 changes: 39 additions & 2 deletions packages/babel-parser/src/plugins/estree.js
Expand Up @@ -238,6 +238,26 @@ export default (superClass: Class<Parser>): Class<Parser> =>
}
}

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<T: N.Literal>(
value: any,
type: /*T["kind"]*/ string,
Expand Down Expand Up @@ -284,11 +304,28 @@ export default (superClass: Class<Parser>): Class<Parser> =>
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,
Expand Down
13 changes: 13 additions & 0 deletions packages/babel-parser/src/types.js
Expand Up @@ -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
// === === === ===
Expand Down
@@ -1,3 +1,4 @@
class A {
#foo(arg, ...others) {}
static #bar(arg, ...others) {}
}
@@ -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"},
Expand All @@ -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": {
Expand Down Expand Up @@ -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
}
]
}
Expand Down
@@ -0,0 +1,4 @@
class A {
#foo = "bar";
static #bar = foo;
}
@@ -0,0 +1,3 @@
{
"plugins": ["estree", "classPrivateProperties"]
}
@@ -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
}
]
}
}
]
}
}
@@ -0,0 +1,6 @@
class A {
foo = "bar";
[bar] = foo;
static "qux" = "quux";
static [quux] = "qux";
}
@@ -0,0 +1,3 @@
{
"plugins": ["estree", "classProperties"]
}
@@ -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\""
}
}
]
}
}
]
}
}

0 comments on commit 4a293e3

Please sign in to comment.