Skip to content

Instantly share code, notes, and snippets.

@kumabook
Created May 29, 2014 13:12
Show Gist options
  • Save kumabook/b8d8218c6d7d00201b9d to your computer and use it in GitHub Desktop.
Save kumabook/b8d8218c6d7d00201b9d to your computer and use it in GitHub Desktop.
esprima, estraverse, escodegen使ってjavascriptの関数すべてにトレースログを仕込んでみる ref: http://qiita.com/kumabook/items/d84437185ca44f7a96e1
esprima = require 'esprima'
escodegen = require 'escodegen'
estraverse = require 'estraverse'
fs = require 'fs'
_funcID = 0
logger = (funcID, fileName, node, parent, loc) ->
name = 'anonymous'
if node.id?
name = node.id.name
else if parent.id
name = parent.id.name
logItem = {
id: funcID,
file: fileName,
func: name,
line: node.loc[loc].line
phase: loc
}
esprima.parse('logger.trace(' + JSON.stringify(logItem) + ' );').body
injectLogger = (source, fileName) ->
ast = esprima.parse source, {
loc: true
}
estraverse.traverse ast, {
enter: (node, parent) ->
if (node.type == 'FunctionExpression' ||
node.type == 'FunctionDeclaration')
_funcID++
node.body.body = logger(_funcID,
fileName,
node,
parent,
'start').concat node.body.body
node.body.body = node.body.body.concat logger(_funcID,
fileName,
node,
parent,
'end')
}
escodegen.generate ast
fs.readFile process.argv[2], (err, source) ->
console.log injectLogger source
esprima = require 'esprima'
escodegen = require 'escodegen'
esmorph = require 'esmorph'
fs = require 'fs'
logger = (fileName, fn, phase) ->
logItem = {
file: fileName,
func: fn.name,
line: fn.line,
range: fn.range,
phase: phase,
return: fn.return ? false
}
'logger.trace(' + JSON.stringify(logItem) + ' );'
injectLogger = (source, fileName) ->
tracers = [
(esmorph.Tracer.FunctionEntrance (fn) -> logger(fileName, fn, 'start')),
(esmorph.Tracer.FunctionExit (fn) -> logger(fileName, fn, 'end'))
]
code = esmorph.modify(source, tracers)
fs.readFile process.argv[2], (err, source) ->
console.log injectLogger source.toString()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment