Skip to content
This repository has been archived by the owner on Feb 1, 2025. It is now read-only.

Commit

Permalink
Adjusted regenerator-transform and regenerator-preset to the refactor…
Browse files Browse the repository at this point in the history
…ed regenerator-runtime
  • Loading branch information
Andarist committed Jul 29, 2017
1 parent ad64918 commit 4a0dacc
Show file tree
Hide file tree
Showing 11 changed files with 59 additions and 36 deletions.
7 changes: 5 additions & 2 deletions lib/visit.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,14 @@ var util = require("./util.js");

exports.transform = function transform(node, options) {
options = util.defaults(options || {}, {
includeRuntime: false
includeRuntime: false,
presetOptions: {},
});

console.log('lib transform options', options)

var result = require("babel-core").transformFromAst(node, null, {
presets: [require("regenerator-preset")],
presets: [["regenerator-preset", options.presetOptions]],
code: false,
ast: true
});
Expand Down
2 changes: 1 addition & 1 deletion main.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ function getRuntimeCode() {
}

var transformOptions = {
presets: [require("regenerator-preset")],
presets: [["regenerator-preset", { strict: false }]],
parserOpts: {
sourceType: "module",
allowImportExportEverywhere: true,
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
"babel-plugin-transform-es2015-block-scoping": "^6.18.0",
"babel-plugin-transform-es2015-classes": "^6.18.0",
"babel-plugin-transform-es2015-for-of": "^6.18.0",
"babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
"babel-runtime": "^6.18.0",
"babel-types": "^6.19.0",
"commoner": "^0.10.8",
Expand Down
35 changes: 26 additions & 9 deletions packages/regenerator-preset/index.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,28 @@
module.exports = {
plugins: [
require("babel-plugin-syntax-async-functions"),
require("babel-plugin-syntax-async-generators"),
require("babel-plugin-transform-es2015-classes"),
require("babel-plugin-transform-es2015-arrow-functions"),
require("babel-plugin-transform-es2015-block-scoping"),
require("babel-plugin-transform-es2015-for-of"),
require("regenerator-transform").default
]
buildPreset: function (context, opts) {
opts = opts !== undefined ? opts : {};
var modules = opts.modules !== undefined ? opts.modules : true;
var loose = opts.loose !== undefined ? opts.loose : false;
var strict = opts.strict !== undefined ? opts.strict : true;

console.log('buildPreset options', opts)

var plugins = [
require("babel-plugin-syntax-async-functions"),
require("babel-plugin-syntax-async-generators"),
require("babel-plugin-transform-es2015-classes"),
require("babel-plugin-transform-es2015-arrow-functions"),
require("babel-plugin-transform-es2015-block-scoping"),
require("babel-plugin-transform-es2015-for-of"),
require("regenerator-transform").default
];

if (modules) {
plugins.push(["babel-plugin-transform-es2015-modules-commonjs", { loose: loose, strict: strict }]);
}

return {
plugins: plugins,
};
}
};
1 change: 1 addition & 0 deletions packages/regenerator-preset/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
"babel-plugin-transform-es2015-block-scoping": "^6.18.0",
"babel-plugin-transform-es2015-classes": "^6.18.0",
"babel-plugin-transform-es2015-for-of": "^6.18.0",
"babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
"regenerator-transform": "^0.9.12"
}
}
6 changes: 4 additions & 2 deletions packages/regenerator-transform/src/emit.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@ import * as util from "./util";

let hasOwn = Object.prototype.hasOwnProperty;

function Emitter(contextId) {
function Emitter(contextId, visitorState) {
assert.ok(this instanceof Emitter);
t.assertIdentifier(contextId);

this.visitorState = visitorState;

// Used to generate unique temporary names.
this.nextTempId = 0;

Expand Down Expand Up @@ -512,7 +514,7 @@ Ep.explodeStatement = function(path, labelId) {
self.emitAssign(
keyIterNextFn,
t.callExpression(
util.runtimeProperty("keys"),
util.runtimeProperty(self.visitorState, "keys"),
[self.explodeExpression(path.get("right"))]
)
);
Expand Down
4 changes: 2 additions & 2 deletions packages/regenerator-transform/src/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@

import * as t from "babel-types";

export function runtimeProperty(name) {
export function runtimeProperty(state, name) {
return t.memberExpression(
t.identifier("regeneratorRuntime"),
state.get("regeneratorRuntime"),
t.identifier(name),
false
);
Expand Down
26 changes: 16 additions & 10 deletions packages/regenerator-transform/src/visit.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,12 @@ let getMarkInfo = require("private").makeAccessor();

exports.name = "regenerator-transform";

exports.pre = function (file) {
this.setDynamic("regeneratorRuntime", function () {
return file.addImport("regenerator-runtime", "*", "regeneratorRuntime");
})
};

exports.visitor = {
Function: {
exit: function(path, state) {
Expand Down Expand Up @@ -51,7 +57,7 @@ exports.visitor = {
let bodyBlockPath = path.get("body");

if (node.async) {
bodyBlockPath.traverse(awaitVisitor);
bodyBlockPath.traverse(awaitVisitor, { parentState: state });
}

bodyBlockPath.traverse(functionSentVisitor, {
Expand Down Expand Up @@ -84,7 +90,7 @@ exports.visitor = {
bodyBlockPath.node.body = innerBody;
}

let outerFnExpr = getOuterFnExpr(path);
let outerFnExpr = getOuterFnExpr(path, state);
// Note that getOuterFnExpr has the side-effect of ensuring that the
// function has a name (so node.id will always be an Identifier), even
// if a temporary name has to be synthesized.
Expand All @@ -106,7 +112,7 @@ exports.visitor = {
));
}

let emitter = new Emitter(contextId);
let emitter = new Emitter(contextId, state);
emitter.explode(path.get("body"));

if (vars && vars.declarations.length > 0) {
Expand All @@ -128,7 +134,7 @@ exports.visitor = {
}

let wrapCall = t.callExpression(
util.runtimeProperty(node.async ? "async" : "wrap"),
util.runtimeProperty(state, node.async ? "async" : "wrap"),
wrapArgs
);

Expand All @@ -152,7 +158,7 @@ exports.visitor = {
}

if (wasGeneratorFunction && t.isExpression(node)) {
util.replaceWithOrRemove(path, t.callExpression(util.runtimeProperty("mark"), [node]))
util.replaceWithOrRemove(path, t.callExpression(util.runtimeProperty(state, "mark"), [node]))
}

// Generators are processed in 'exit' handlers so that regenerator only has to run on
Expand All @@ -167,7 +173,7 @@ exports.visitor = {
// used to refer reliably to the function object from inside the function.
// This expression is essentially a replacement for arguments.callee, with
// the key advantage that it works in strict mode.
function getOuterFnExpr(funPath) {
function getOuterFnExpr(funPath, state) {
let node = funPath.node;
t.assertFunction(node);

Expand All @@ -187,7 +193,7 @@ function getOuterFnExpr(funPath) {
return node.id;
}

let markDecl = getRuntimeMarkDecl(pp);
let markDecl = getRuntimeMarkDecl(pp, state);
let markedArray = markDecl.declarations[0].id;
let funDeclIdArray = markDecl.declarations[0].init.callee.object;
t.assertArrayExpression(funDeclIdArray);
Expand All @@ -205,7 +211,7 @@ function getOuterFnExpr(funPath) {
return node.id;
}

function getRuntimeMarkDecl(blockPath) {
function getRuntimeMarkDecl(blockPath, state) {
let block = blockPath.node;
assert.ok(Array.isArray(block.body));

Expand All @@ -223,7 +229,7 @@ function getRuntimeMarkDecl(blockPath) {
t.identifier("map"),
false
),
[util.runtimeProperty("mark")]
[util.runtimeProperty(state, "mark")]
)
)
]);
Expand Down Expand Up @@ -285,7 +291,7 @@ let awaitVisitor = {
// can distinguish between awaited and merely yielded values.
util.replaceWithOrRemove(path, t.yieldExpression(
t.callExpression(
util.runtimeProperty("awrap"),
util.runtimeProperty(this.parentState, "awrap"),
[argument]
),
false
Expand Down
7 changes: 1 addition & 6 deletions test/async.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,12 @@
*/

var assert = require("assert");
var regeneratorRuntime = require("regenerator-runtime");

describe("async functions and await expressions", function() {
Promise = require("promise");

describe("regeneratorRuntime", function() {
it("should be defined globally", function() {
var global = Function("return this")();
assert.ok("regeneratorRuntime" in global);
assert.strictEqual(global.regeneratorRuntime, regeneratorRuntime);
});

it("should have a .wrap method", function() {
assert.strictEqual(typeof regeneratorRuntime.wrap, "function");
});
Expand Down
1 change: 0 additions & 1 deletion test/tests.es6.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ describe("simple argument yielder", function() {
function *gen(x) {
yield x;
}

check(gen("oyez"), ["oyez"]);
check(gen("foo", "bar"), ["foo"]);
});
Expand Down
5 changes: 2 additions & 3 deletions test/tests.transform.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ var recast = require("recast");
var types = recast.types;
var n = types.namedTypes;
var transform = require("..").transform;
var regeneratorRuntime = require("regenerator-runtime");

describe("_blockHoist nodes", function() {
it("should be hoisted to the outer body", function() {
Expand All @@ -26,9 +27,7 @@ describe("_blockHoist nodes", function() {
assert.strictEqual(hoistMeStmt.expression.callee.name, "hoistMe");

hoistMeStmt._blockHoist = 1;

eval(recast.print(transform(ast)).code);

eval(recast.print(transform(ast, { presetOptions: { strict: false } })).code);
assert.strictEqual(typeof foo, "function");
assert.ok(regeneratorRuntime.isGeneratorFunction(foo));
assert.strictEqual(names.length, 0);
Expand Down

0 comments on commit 4a0dacc

Please sign in to comment.