diff options
Diffstat (limited to 'deps/npm/node_modules/readable-stream/node_modules/unreachable-branch-transform/node_modules/recast/example')
4 files changed, 153 insertions, 0 deletions
diff --git a/deps/npm/node_modules/readable-stream/node_modules/unreachable-branch-transform/node_modules/recast/example/add-braces b/deps/npm/node_modules/readable-stream/node_modules/unreachable-branch-transform/node_modules/recast/example/add-braces new file mode 100755 index 0000000000..0c6901d09f --- /dev/null +++ b/deps/npm/node_modules/readable-stream/node_modules/unreachable-branch-transform/node_modules/recast/example/add-braces @@ -0,0 +1,44 @@ +#!/usr/bin/env node + +var recast = require("recast"); +var types = recast.types; +var n = types.namedTypes; +var b = types.builders; + +require("recast").run(function(ast, callback) { + recast.visit(ast, { + visitIfStatement: function(path) { + var stmt = path.node; + stmt.consequent = fix(stmt.consequent); + + var alt = stmt.alternate; + if (!n.IfStatement.check(alt)) { + stmt.alternate = fix(alt); + } + + this.traverse(path); + }, + + visitWhileStatement: visitLoop, + visitForStatement: visitLoop, + visitForInStatement: visitLoop + }); + + callback(ast); +}); + +function visitLoop(path) { + var loop = path.node; + loop.body = fix(loop.body); + this.traverse(path); +} + +function fix(clause) { + if (clause) { + if (!n.BlockStatement.check(clause)) { + clause = b.blockStatement([clause]); + } + } + + return clause; +} diff --git a/deps/npm/node_modules/readable-stream/node_modules/unreachable-branch-transform/node_modules/recast/example/generic-identity b/deps/npm/node_modules/readable-stream/node_modules/unreachable-branch-transform/node_modules/recast/example/generic-identity new file mode 100755 index 0000000000..a8364c350d --- /dev/null +++ b/deps/npm/node_modules/readable-stream/node_modules/unreachable-branch-transform/node_modules/recast/example/generic-identity @@ -0,0 +1,17 @@ +#!/usr/bin/env node + +// This script should reprint the contents of the given file without +// reusing the original source, but with identical AST structure. + +var recast = require("recast"); + +recast.run(function(ast, callback) { + recast.visit(ast, { + visitNode: function(path) { + this.traverse(path); + path.node.original = null; + } + }); + + callback(ast); +}); diff --git a/deps/npm/node_modules/readable-stream/node_modules/unreachable-branch-transform/node_modules/recast/example/identity b/deps/npm/node_modules/readable-stream/node_modules/unreachable-branch-transform/node_modules/recast/example/identity new file mode 100755 index 0000000000..62981b8f68 --- /dev/null +++ b/deps/npm/node_modules/readable-stream/node_modules/unreachable-branch-transform/node_modules/recast/example/identity @@ -0,0 +1,8 @@ +#!/usr/bin/env node + +// This script should echo the contents of the given file without +// modification. + +require("recast").run(function(ast, callback) { + callback(ast); +}); diff --git a/deps/npm/node_modules/readable-stream/node_modules/unreachable-branch-transform/node_modules/recast/example/to-while b/deps/npm/node_modules/readable-stream/node_modules/unreachable-branch-transform/node_modules/recast/example/to-while new file mode 100755 index 0000000000..99222223f8 --- /dev/null +++ b/deps/npm/node_modules/readable-stream/node_modules/unreachable-branch-transform/node_modules/recast/example/to-while @@ -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; +} |