$
This commit is contained in:
84
node_modules/recast/example/to-while
generated
vendored
Normal file
84
node_modules/recast/example/to-while
generated
vendored
Normal file
@@ -0,0 +1,84 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
// This script converts for and do-while loops into equivalent while loops.
|
||||
// Note that for-in statements are left unmodified, as they do not have a
|
||||
// simple analogy to while loops. Also note that labeled continue statements
|
||||
// are not correctly handled at this point, and will trigger an assertion
|
||||
// failure if encountered.
|
||||
|
||||
var assert = require("assert");
|
||||
var recast = require("recast");
|
||||
var types = recast.types;
|
||||
var n = types.namedTypes;
|
||||
var b = types.builders;
|
||||
|
||||
recast.run(function(ast, callback) {
|
||||
recast.visit(ast, {
|
||||
visitForStatement: function(path) {
|
||||
var fst = path.node;
|
||||
|
||||
path.replace(
|
||||
fst.init,
|
||||
b.whileStatement(
|
||||
fst.test,
|
||||
insertBeforeLoopback(fst, fst.update)
|
||||
)
|
||||
);
|
||||
|
||||
this.traverse(path);
|
||||
},
|
||||
|
||||
visitDoWhileStatement: function(path) {
|
||||
var dwst = path.node;
|
||||
return b.whileStatement(
|
||||
b.literal(true),
|
||||
insertBeforeLoopback(
|
||||
dwst,
|
||||
b.ifStatement(
|
||||
dwst.test,
|
||||
b.breakStatement()
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
callback(ast);
|
||||
});
|
||||
|
||||
function insertBeforeLoopback(loop, toInsert) {
|
||||
var body = loop.body;
|
||||
|
||||
if (!n.Statement.check(toInsert)) {
|
||||
toInsert = b.expressionStatement(toInsert);
|
||||
}
|
||||
|
||||
if (n.BlockStatement.check(body)) {
|
||||
body.body.push(toInsert);
|
||||
} else {
|
||||
body = b.blockStatement([body, toInsert]);
|
||||
loop.body = body;
|
||||
}
|
||||
|
||||
recast.visit(body, {
|
||||
visitContinueStatement: function(path) {
|
||||
var cst = path.node;
|
||||
|
||||
assert.equal(
|
||||
cst.label, null,
|
||||
"Labeled continue statements are not yet supported."
|
||||
);
|
||||
|
||||
path.replace(toInsert, path.node);
|
||||
return false;
|
||||
},
|
||||
|
||||
// Do not descend into nested loops.
|
||||
visitWhileStatement: function() {},
|
||||
visitForStatement: function() {},
|
||||
visitForInStatement: function() {},
|
||||
visitDoWhileStatement: function() {}
|
||||
});
|
||||
|
||||
return body;
|
||||
}
|
Reference in New Issue
Block a user