In [37]:
var acorn = require('acorn')
acorn.tokTypes.YALP = new acorn.TokenType("YALP")
acorn.plugins.yalp = function(instance){
instance.extend("parseExpression", function(inner) {
return function(noIn, refShorthandDefaultPos){
var startPos = this.start, startLoc = this.startLoc
var thing = inner.call(this);
if(this.eat(acorn.tokTypes.YALP)){
// console.log('YAWLP', this, thing)
var node = this.startNodeAt(startPos, startLoc)
node.arguments = [thing]
var clog = this.startNode()
clog.name = "log"
node.callee = this.finishNode(clog, "Identifier")
return this.finishNode(node, "CallExpression")
}
return thing
};
});
instance.extend("readToken", function(inner){
return function(code){
var context = this.curContext();
if(code == 33){ // !
++this.pos;
return this.finishToken(acorn.tokTypes.YALP)
}
return inner.call(this, code)
}
})
}
var comments = [], tokens = [];
var escodegen = require('escodegen')
var ast = acorn.parse(`
var n = 500, k = 1;
for(var i = 0; i < 100; i++){
k = k / 2 * (3 - n * k * k)
5!
blah!
}
`, {
plugins: {
yalp: true
},
ranges: true,
// collect comments in Esprima's format
onComment: comments,
// collect token ranges
onToken: tokens
})
// attach comments using collected information
escodegen.attachComments(ast, comments, tokens);
// console.log(ast)
// generate code
console.log(escodegen.generate(ast, {comment: true}));
Out[37]:
In [20]:
process.cwd()
Out[20]:
In [26]:
module.paths.push('/Users/kevin/Projects/gayfish/experiment/node_modules')
Out[26]:
In [ ]: