-
Notifications
You must be signed in to change notification settings - Fork 54
/
parseJavaScript.js
81 lines (73 loc) · 1.71 KB
/
parseJavaScript.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
const acorn = require('acorn');
const Parser = acorn.Parser.extend(require('acorn-jsx')());
const estraverse = require('estraverse');
// From espree
function convertAcornCommentToEsprimaComment(
block,
text,
start,
end,
startLoc,
endLoc
) {
const comment = {
type: block ? 'Block' : 'Line',
value: text
};
if (typeof start === 'number') {
comment.start = start;
comment.end = end;
comment.range = [start, end];
}
if (typeof startLoc === 'object') {
comment.loc = {
start: startLoc,
end: endLoc
};
}
return comment;
}
function parseJavaScript(code, options = {}) {
const comments = [];
const tokens = [];
const parser = new Parser(
{
...options,
// Collect comments
onComment(block, text, start, end, startLoc, endLoc) {
comments.push(
convertAcornCommentToEsprimaComment(
block,
text,
start,
end,
startLoc,
endLoc
)
);
},
onToken(token) {
tokens.push(token);
}
},
code
);
const ast = parser.parse();
ast.comments = comments;
ast.tokens = tokens;
const lastToken = tokens.pop();
// Adjustments from espree:
if (ast.range) {
ast.range[0] = ast.body.length ? ast.body[0].range[0] : ast.range[0];
ast.range[1] = lastToken ? lastToken.range[1] : ast.range[1];
}
if (ast.loc) {
ast.loc.start = ast.body.length ? ast.body[0].loc.start : ast.loc.start;
ast.loc.end = lastToken ? lastToken.loc.end : ast.loc.end;
}
if (options.locations && options.ranges) {
estraverse.attachComments(ast, ast.comments, ast.tokens);
}
return ast;
}
module.exports = parseJavaScript;