-
-
Notifications
You must be signed in to change notification settings - Fork 4.2k
/
utils.ts
55 lines (46 loc) · 1.37 KB
/
utils.ts
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
import type { AST } from '@glimmer/syntax';
export function isPath(node: AST.Node): node is AST.PathExpression {
return node.type === 'PathExpression';
}
export function isSubExpression(node: AST.Node): node is AST.SubExpression {
return node.type === 'SubExpression';
}
export function isStringLiteral(node: AST.Expression): node is AST.StringLiteral {
return node.type === 'StringLiteral';
}
function getLocalName(node: string | AST.VarHead): string {
if (typeof node === 'string') {
return node;
} else {
return node.original;
}
}
export function trackLocals() {
let locals = new Map();
let node = {
enter(node: AST.Template | AST.Block | AST.ElementNode) {
let params = 'params' in node ? node.params : node.blockParams;
for (let param of params) {
let name = getLocalName(param);
let value = locals.get(param) || 0;
locals.set(name, value + 1);
}
},
exit(node: AST.Template | AST.Block | AST.ElementNode) {
let params = 'params' in node ? node.params : node.blockParams;
for (let param of params) {
let name = getLocalName(param);
let value = locals.get(name) - 1;
if (value === 0) {
locals.delete(name);
} else {
locals.set(name, value);
}
}
},
};
return {
hasLocal: (key: string) => locals.has(key),
node,
};
}