]>
code.delx.au - gnu-emacs-elpa/blob - scopifier-microoptimized.js
0cc4f77be7432e1e825ecb5d3847c07996afc26a
3 var escope
= require('escope'),
4 esprima
= require('esprima'),
10 // Given code, returns an array of `[start, end, level, style]' tokens for
12 module
.exports = function (code
) {
30 // Gracefully handle parse errors by doing nothing.
32 ast
= esprima
.parse(code
, {
36 analyzedScopes
= escope
.analyze(ast
).scopes
;
41 for (i
= 0; i
< analyzedScopes
.length
; i
+= 1) {
42 scope
= analyzedScopes
[i
];
43 // Having its level set implies it was already annotated.
44 if (scope
.level
=== undefined) {
46 if (scope
.upper
.functionExpressionScope
) {
47 // Pretend function expression scope doesn't exist.
48 scope
.level
= scope
.upper
.level
;
49 scope
.variables
= scope
.upper
.variables
.concat(scope
.variables
);
51 scope
.level
= scope
.upper
.level
+ 1;
57 // We've only given the scope a level for posterity's sake. We're
59 if (!scope
.functionExpressionScope
) {
60 range
= scope
.block
.range
;
67 definitionsIndex
= tokens
.length
;
69 for (j
= 0; j
< scope
.variables
.length
; j
+= 1) {
70 variable
= scope
.variables
[j
];
71 definitionsCount
+= variable
.defs
.length
;
72 for (k
= 0; k
< variable
.defs
.length
; k
+= 1) {
73 definition
= variable
.defs
[k
];
74 range
= definition
.name
.range
;
83 for (j
= 0; j
< scope
.references
.length
; j
+= 1) {
84 reference
= scope
.references
[j
];
85 range
= reference
.identifier
.range
;
87 // Determine if a definition already exists for the
88 // range. (escope detects variables twice if they are
89 // declared and initialized simultaneously; this filters
91 for (k
= 0; k
< definitionsCount
; k
+= 1) {
92 definition
= tokens
[definitionsIndex
+ k
];
93 if (definition
[0] === range
[0] + 1 &&
94 definition
[1] === range
[1] + 1) {
101 // Handle global references too.
104 reference
.resolved
? reference
.resolved
.scope
.level
: 0,
105 reference
.__maybeImplicitGlobal
? bold
: normal
113 for (i
= 0; i
< ast
.comments
.length
; i
+= 1) {
114 comment
= ast
.comments
[i
];
115 range
= comment
.range
;
124 return scopes
.concat(tokens
);