Function sent (#5920)
* Create "babel-helper-wrap-function" It contains the logic to wrap a function inside a call expression. It was part of the "babel-helper-remap-async-to-generator" package, but it is needed to transpile "function.sent" * Create "babel-transform-function-sent" It transforms the "function.sent" meta property by replacing it with "yield" and making the generator ignore the first ".next()" call. * "function.sent" is the last value passed to .next(), not the first one * Disable exec tests on old node * Fix flow error * Add "transform-function-sent" to "stage-2" preset * Do every trasformation in one traversal * Test for "yield function.sent" * [skip ci] * Fix some typos [skip ci]
This commit is contained in:
committed by
Henry Zhu
parent
4a35243118
commit
fb9a752262
56
packages/babel-plugin-transform-function-sent/src/index.js
Normal file
56
packages/babel-plugin-transform-function-sent/src/index.js
Normal file
@@ -0,0 +1,56 @@
|
||||
import syntaxFunctionSent from "babel-plugin-syntax-function-sent";
|
||||
import wrapFunction from "babel-helper-wrap-function";
|
||||
|
||||
export default function({ types: t }) {
|
||||
const isFunctionSent = node =>
|
||||
t.isIdentifier(node.meta, { name: "function" }) &&
|
||||
t.isIdentifier(node.property, { name: "sent" });
|
||||
|
||||
const yieldVisitor = {
|
||||
Function(path) {
|
||||
path.skip();
|
||||
},
|
||||
|
||||
YieldExpression(path) {
|
||||
const replaced = t.isAssignmentExpression(path.parent, {
|
||||
left: this.sentId,
|
||||
});
|
||||
if (!replaced) {
|
||||
path.replaceWith(t.assignmentExpression("=", this.sentId, path.node));
|
||||
}
|
||||
},
|
||||
|
||||
MetaProperty(path) {
|
||||
if (isFunctionSent(path.node)) {
|
||||
path.replaceWith(this.sentId);
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
return {
|
||||
inherits: syntaxFunctionSent,
|
||||
|
||||
visitor: {
|
||||
MetaProperty(path, state) {
|
||||
if (!isFunctionSent(path.node)) return;
|
||||
|
||||
const fnPath = path.getFunctionParent();
|
||||
|
||||
if (!fnPath.node.generator) {
|
||||
throw new Error("Parent generator function not found");
|
||||
}
|
||||
|
||||
const sentId = path.scope.generateUidIdentifier("function.sent");
|
||||
|
||||
fnPath.traverse(yieldVisitor, { sentId });
|
||||
fnPath.node.body.body.unshift(
|
||||
t.variableDeclaration("let", [
|
||||
t.variableDeclarator(sentId, t.yieldExpression()),
|
||||
]),
|
||||
);
|
||||
|
||||
wrapFunction(fnPath, state.addHelper("skipFirstGeneratorNext"));
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user