-
Notifications
You must be signed in to change notification settings - Fork 1
/
logging.js
49 lines (42 loc) · 1.38 KB
/
logging.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
let escodegen = require('escodegen');
let esprima = require('esprima');
let estraverse = require('estraverse');
function addLogging(code) {
let ast = esprima.parse(code);
estraverse.traverse(ast, {
enter: function(node, parent) {
if (node.type === 'FunctionDeclaration' ||
node.type === 'FunctionExpression') {
addBeforeCode(node);
}
}
});
return escodegen.generate(ast);
}
function addBeforeCode(node) {
let name = node.id ? node.id.name : '<anonymous function>';
let num_param;
var valores= "";
for(num_param=0; num_param < node.params.length ; num_param++){
valores = valores+node.params[num_param].name;
if(num_param < node.params.length -1){
valores = valores + ", ";
}
}
let beforeCode = `console.log('Entering ${name}(${valores})');`;
let beforeNodes = esprima.parse(beforeCode).body;
node.body.body = beforeNodes.concat(node.body.body);
}
/*para escribir cadena multilínea hay que añadir ese tic, el acento francés*/
const input = `
function foo(a, b) {
var x = 'blah';
var y = (function () {
return 3;
})();
}
foo(1, 'wut', 3);
`;
const output = addLogging(input);
console.log(`input:\n${input}\n---`); // Dollar llavita abrir significa evalúa la expresión y sustituye en JS, en Ruby eso se hace con #
console.log(`output:\n${output}\n---`);