]> git.tdb.fi Git - libs/gl.git/blob - source/glsl/debug.h
Add a visitor to dump the AST for debugging purposes
[libs/gl.git] / source / glsl / debug.h
1 #ifndef MSP_GL_SL_DEBUG_H_
2 #define MSP_GL_SL_DEBUG_H_
3
4 #include "syntax.h"
5 #include "visitor.h"
6
7 namespace Msp {
8 namespace GL {
9 namespace SL {
10
11 class DumpTree: private TraversingVisitor
12 {
13 private:
14         enum TreeChars
15         {
16                 EMPTY = 0x20,
17                 STRAIGHT = 0x2502,     // │
18                 BRANCH = 0x251C,       // ├
19                 BRANCH_LAST = 0x2514,  // └
20                 REACH = 0x2574         // ╴
21         };
22
23         std::map<const Node *, unsigned> node_labels;
24         std::string formatted;
25         std::vector<TreeChars> tree;
26
27 public:
28         const std::string &apply(Stage &);
29
30 private:
31         void append(const std::string &);
32         void begin_sub();
33         void last_branch();
34         void end_sub();
35         void annotated_branch(const std::string &, Node &);
36         unsigned get_label(const Node &);
37
38         template<typename T>
39         typename T::const_iterator increment(typename T::const_iterator &, const T &);
40
41         virtual void visit(Block &);
42         virtual void visit(Literal &);
43         virtual void visit(ParenthesizedExpression &);
44         virtual void visit(VariableReference &);
45         virtual void visit(MemberAccess &);
46         virtual void visit(UnaryExpression &);
47         virtual void visit(BinaryExpression &);
48         virtual void visit(Assignment &);
49         virtual void visit(FunctionCall &);
50         virtual void visit(ExpressionStatement &);
51         virtual void visit(Import &);
52         virtual void visit(Precision &);
53         virtual void visit(Layout &);
54         virtual void visit(InterfaceLayout &);
55         virtual void visit(StructDeclaration &);
56         virtual void visit(VariableDeclaration &);
57         virtual void visit(InterfaceBlock &);
58         virtual void visit(FunctionDeclaration &);
59         virtual void visit(Conditional &);
60         virtual void visit(Iteration &);
61         virtual void visit(Return &);
62         virtual void visit(Jump &);
63         using TraversingVisitor::visit;
64 };
65
66 } // namespace SL
67 } // namespace GL
68 } // namespace Msp
69
70 #endif