Al ejecutar la función addLogging podemos observar que añade un console.log() que muestra el nombre de la función que se está llamando. Esto lo consigue de la siguiente manera:
- Se genera un AST del código fuente de la función que se le pasa como parámetro.
- Se recorre el AST en busca de nodos de tipo
FunctionDeclaration
yFunctionExpression
. - Se llama a la función
addBeforeCode()
, a la que se le pasa por parámetros el nodo con la llamada a la función. - La función
addBeforeCode()
genera el código del console.log(), lo parsea y lo añade al nodo que se le pasa por parámetros.
Se ha modificado el código de logging-espree.js
para que el log también indique los valores de los argumentos que se pasaron a la función.
Ejemplo:
function foo(a, b) {
var x = 'blah';
var y = (function (z) {
return z+3;
})(2);
}
foo(1, 'wut', 3);
function foo(a, b) {
console.log(`Entering foo(${ a }, ${ b })`);
var x = 'blah';
var y = function (z) {
console.log(`Entering <anonymous function>(${ z })`);
return z + 3;
}(2);
}
foo(1, 'wut', 3);
CLI con Commander.js
- Añadimos
node.type === 'ArrowFunctionExpression'
a los posibles tipos de nodo que se recorren conestraverse
en la funciónaddLogging()
.
estraverse.traverse(ast, {
enter: function(node, parent) {
if (node.type === 'FunctionDeclaration' ||
node.type === 'FunctionExpression' ||
node.type === 'ArrowFunctionExpression') {
addBeforeCode(node);
}
}
});
- Añadimos la propiedad
loc
aespree.parse()
en la funciónaddLogging()
para poder obtener la línea de la función.
const ast = espree.parse(code, {ecmaVersion:6, loc: true});
- Añadimos la información de
node.loc.start.line
en elconsole.log()
generado en la funciónaddBeforeCode()
.
const line = node.loc.start.line;
const beforeCode = "console.log(`Entering " +
name + "(" + args.join(', ') + ") at line " + line +"`);";