nixd
Loading...
Searching...
No Matches
Traverse.inc
Go to the documentation of this file.
1/// Traverse.inc, the file declares how to traverse nix::Expr
2///
3/// The file provides: DEF_TRAVERSE_TYPE(Name, Stmt)
4/// Stmt defines how to traverse AST nodes (i.e. visit it's subnodes)
5/// The subnodes is wrapped around with macro TRY_TO_TRAVERSE.
6
7#ifdef DEF_TRAVERSE_TYPE
8
9DEF_TRAVERSE_TYPE(ExprAssert, {
10 TRY_TO_TRAVERSE(T->cond);
11 TRY_TO_TRAVERSE(T->body);
12})
13
14DEF_TRAVERSE_TYPE(ExprAttrs, {
15 for (auto &[_, Elem] : T->attrs)
16 TRY_TO_TRAVERSE(Elem.e);
17 for (auto &DAD : T->dynamicAttrs) {
18 TRY_TO_TRAVERSE(DAD.nameExpr);
19 TRY_TO_TRAVERSE(DAD.valueExpr);
20 }
21})
22
23DEF_TRAVERSE_TYPE(ExprCall, {
24 for (auto &Arg : T->args)
25 TRY_TO_TRAVERSE(Arg);
26 TRY_TO_TRAVERSE(T->fun);
27})
28
29DEF_TRAVERSE_TYPE(ExprConcatStrings, {
30 for (auto &[_, E] : *T->es)
32})
33
34DEF_TRAVERSE_TYPE(ExprFloat, {})
35
36DEF_TRAVERSE_TYPE(ExprIf, {
37 TRY_TO_TRAVERSE(T->cond);
38 TRY_TO_TRAVERSE(T->then);
39 TRY_TO_TRAVERSE(T->else_);
40})
41
42DEF_TRAVERSE_TYPE(ExprInt, {})
43
44DEF_TRAVERSE_TYPE(ExprLambda, {
45 if (T->hasFormals())
46 for (auto &F : T->formals->formals)
47 TRY_TO_TRAVERSE(F.def);
48 TRY_TO_TRAVERSE(T->body);
49})
50
51DEF_TRAVERSE_TYPE(ExprLet, {
52 TRY_TO_TRAVERSE(T->attrs);
53 TRY_TO_TRAVERSE(T->body);
54})
55
56DEF_TRAVERSE_TYPE(ExprList, {
57 for (auto &E : T->elems)
59})
60
61#define DEF_TRAVERSE_BINARY_EXPR(BIN_OP) \
62 DEF_TRAVERSE_TYPE(BIN_OP, { \
63 TRY_TO_TRAVERSE(T->e1); \
64 TRY_TO_TRAVERSE(T->e2); \
65 })
66
67DEF_TRAVERSE_BINARY_EXPR(ExprOpAnd)
68DEF_TRAVERSE_BINARY_EXPR(ExprOpConcatLists)
69DEF_TRAVERSE_BINARY_EXPR(ExprOpEq)
70DEF_TRAVERSE_BINARY_EXPR(ExprOpImpl)
71DEF_TRAVERSE_BINARY_EXPR(ExprOpNEq)
72DEF_TRAVERSE_BINARY_EXPR(ExprOpOr)
73DEF_TRAVERSE_BINARY_EXPR(ExprOpUpdate)
74
75#undef DEF_TRAVERSE_BINARY_EXPR
76
77DEF_TRAVERSE_TYPE(ExprOpHasAttr, {
78 TRY_TO_TRAVERSE(T->e);
79 for (auto &E : T->attrPath)
80 if (!E.symbol)
81 TRY_TO_TRAVERSE(E.expr);
82})
83
84DEF_TRAVERSE_TYPE(ExprOpNot, { TRY_TO_TRAVERSE(T->e); })
85
86DEF_TRAVERSE_TYPE(ExprPath, {})
87DEF_TRAVERSE_TYPE(ExprPos, {})
88DEF_TRAVERSE_TYPE(ExprSelect, {
89 TRY_TO_TRAVERSE(T->def);
90 TRY_TO_TRAVERSE(T->e);
91 for (auto &E : T->attrPath) {
92 if (!E.symbol)
93 TRY_TO_TRAVERSE(E.expr);
94 }
95})
96
97DEF_TRAVERSE_TYPE(ExprString, {})
98DEF_TRAVERSE_TYPE(ExprVar, {})
99DEF_TRAVERSE_TYPE(ExprWith, {
100 TRY_TO_TRAVERSE(T->attrs);
101 TRY_TO_TRAVERSE(T->body);
102})
103
104#endif // DEF_TRAVERSE_TYPE
#define DEF_TRAVERSE_TYPE(TYPE, CODE)
Definition Visitor.h:87
#define TRY_TO_TRAVERSE(EXPR)
Definition Visitor.h:85