Skip to content

Commit

Permalink
Create a spec version w/ get/set/call
Browse files Browse the repository at this point in the history
  • Loading branch information
Robin Ricard committed Jul 20, 2018
1 parent c0194fe commit 6d61421
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 4 deletions.
20 changes: 20 additions & 0 deletions packages/babel-helpers/src/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -1038,3 +1038,23 @@ helpers.classStaticPrivateFieldBase = () => template.program.ast`
return privateClass;
}
`;

helpers.classStaticPrivateFieldGet = () => template.program.ast`
export default function _classStaticPrivateFieldGet(receiver, classConstructor, privateClass, privateId) {
if (receiver !== classConstructor && receiver.constructor !== classConstructor) {
throw new TypeError("Private static access of wrong provenance");
}
return privateClass[privateId];
}
`;

helpers.classStaticPrivateFieldSet = () => template.program.ast`
export default function _classStaticPrivateFieldSet(
receiver, classConstructor, privateClass, privateId, value
) {
if (receiver !== classConstructor && receiver.constructor !== classConstructor) {
throw new TypeError("Private static access of wrong provenance");
}
privateClass[privateId] = value;
}
`;
42 changes: 38 additions & 4 deletions packages/babel-plugin-proposal-class-properties/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,41 @@ export default declare((api, options) => {
},
};

const staticPrivatePropertyHandler = {
const staticPrivatePropertyHandlerSpec = {
...privateNameHandlerSpec,

get(member) {
const { file, privateId, privateClassId, classRef } = this;

return t.callExpression(file.addHelper("classStaticPrivateFieldGet"), [
this.receiver(member),
classRef,
privateClassId,
t.stringLiteral(privateId.name),
]);
},

set(member, value) {
const { file, privateId, privateClassId, classRef } = this;

return t.callExpression(file.addHelper("classStaticPrivateFieldSet"), [
this.receiver(member),
classRef,
privateClassId,
t.stringLiteral(privateId.name),
value,
]);
},

call(member, args) {
// The first access (the get) should do the memo assignment.
this.memoise(member, 1);

return optimiseCall(this.get(member), this.receiver(member), args);
},
};

const staticPrivatePropertyHandlerLoose = {
handle(member) {
const { file, privateId, privateClassId, classRef } = this;
member.replaceWith(
Expand Down Expand Up @@ -284,13 +318,13 @@ export default declare((api, options) => {
);
}

parentPath.traverse(privateNameVisitor, {
memberExpressionToFunctions(parentPath, privateNameVisitor, {
name,
privateId,
privateClassId,
classRef: ref,
file: state,
...staticPrivatePropertyHandler,
...staticPrivatePropertyHandlerSpec,
});

staticNodesToAdd.push(
Expand Down Expand Up @@ -318,7 +352,7 @@ export default declare((api, options) => {
privateClassId: ref,
classRef: ref,
file: state,
...staticPrivatePropertyHandler,
...staticPrivatePropertyHandlerLoose,
});

const staticNodesToAdd = [
Expand Down

0 comments on commit 6d61421

Please sign in to comment.