forked from fossamagna/gas-entry-generator
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
83 lines (75 loc) · 2.23 KB
/
index.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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
'use strict';
var esprima = require('esprima');
var estraverse = require('estraverse');
var escodegen = require('escodegen');
function createBaseAST() {
var ast = {};
ast.type = 'Program';
ast.body = [];
return ast;
}
function createStubFunctionASTNode(functionName, leadingComments, params) {
var node = {
type: 'FunctionDeclaration',
id: {
type: 'Identifier',
name: functionName
},
params: [],
defaults: [],
body: {
type: 'BlockStatement',
body: []
},
generator: false,
expression: false
};
if (leadingComments) {
node.leadingComments = leadingComments;
}
if (params) {
node.params = params;
}
return node;
}
function _generateStubs(data, options) {
var ast = esprima.parseScript(data, { attachComment: options.comment });
var stubs = [];
var functionName;
estraverse.traverse(ast, {
leave: function (node) {
if (node.type === 'ExpressionStatement'
&& isGlobalAssignmentExpression(node.expression)) {
functionName = node.expression.left.property.name;
stubs.push(createStubFunctionASTNode(functionName, node.leadingComments, node.expression.right.params));
} else if (node.type === 'ExpressionStatement'
&& node.expression.type === 'SequenceExpression') {
node.expression.expressions.forEach(function (expression) {
if (isGlobalAssignmentExpression(expression)) {
functionName = expression.left.property.name;
stubs.push(createStubFunctionASTNode(functionName, node.leadingComments, expression.right.params));
}
});
}
}
});
return stubs;
}
function isGlobalAssignmentExpression(node) {
return node.type === 'AssignmentExpression'
&& node.operator === '='
&& node.left.type === 'MemberExpression'
&& node.left.object.type === 'Identifier'
&& node.left.object.name === 'global'
}
function generateStubs(source, options) {
options = options || {comment: false};
var comment = !!options.comment;
var baseAST = createBaseAST();
var stubs = _generateStubs(source, options);
stubs.forEach(function (stub) {
baseAST.body.push(stub);
});
return escodegen.generate(baseAST, { comment: comment });
}
module.exports = generateStubs;