Analysis: infer when a refcount is required and add colors in DebugVisitor
[scilab.git] / scilab / modules / ast / includes / ast / debugvisitor.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2008-2008 - DIGITEO - Bruno JOFRET
4  *  Copyright (C) 2015 - Scilab Enterprises - Calixte DENIZET
5  *
6  *  This file must be used under the terms of the CeCILL.
7  *  This source file is licensed as described in the file COPYING, which
8  *  you should have received as part of this distribution.  The terms
9  *  are also available at
10  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  */
13
14 #ifndef AST_DEBUGVISITOR_HXX
15 #define AST_DEBUGVISITOR_HXX
16
17 #include <iostream>
18 #include <sstream>
19
20 #include "visitor.hxx"
21 #include "allexp.hxx"
22 #include "allvar.hxx"
23 #include "alldec.hxx"
24 #include "alltypes.hxx"
25
26 namespace ast
27 {
28 class EXTERN_AST DebugVisitor : public GenVisitor<const_kind>
29 {
30 public:
31     DebugVisitor(std::wostream & my_ostr = std::wcerr, const bool _printDecoration = false, const bool _colored = false) : ostr(&my_ostr),
32         printDecoration(_printDecoration),
33 #ifdef _MSC_VER
34         colored(false)
35 #else
36         colored(_colored)
37 #endif
38     { }
39
40     /** \name Visit Matrix Expressions nodes.
41      ** \{ */
42 public :
43     virtual void visit (const MatrixExp &e);
44     virtual void visit (const MatrixLineExp &e);
45     /** \} */
46
47     /** \name Visit Cell Expressions nodes.
48      ** \{ */
49 public :
50     virtual void visit (const CellExp &e);
51     /** \} */
52
53     /** \name Visit Constant Expressions nodes.
54      ** \{ */
55 public :
56     virtual void visit (const StringExp &e);
57     virtual void visit (const CommentExp &e);
58     virtual void visit (const DoubleExp  &e);
59     virtual void visit (const BoolExp  &e);
60     virtual void visit (const NilExp &e);
61     /** \} */
62
63     /** \name Visit Variable related nodes.
64      ** \{ */
65     virtual void visit (const SimpleVar &e);
66     virtual void visit (const ColonVar &e);
67     virtual void visit (const DollarVar &e);
68     virtual void visit (const ArrayListVar &e);
69     /** \} */
70
71     /** \name Visit Control Expressions or Instructions nodes.
72      ** \{ */
73     virtual void visit (const FieldExp &e);
74     virtual void visit (const OpExp &e);
75     virtual void visit (const LogicalOpExp &e);
76     virtual void visit (const AssignExp  &e);
77     virtual void visit (const CellCallExp &e);
78     virtual void visit (const CallExp &e);
79     virtual void visit (const IfExp  &e);
80     virtual void visit (const TryCatchExp  &e);
81     virtual void visit (const WhileExp  &e);
82     virtual void visit (const ForExp  &e);
83     virtual void visit (const BreakExp &e);
84     virtual void visit (const ContinueExp &e);
85     virtual void visit (const ReturnExp &e);
86     virtual void visit (const SeqExp  &e);
87     virtual void visit (const SelectExp  &e);
88     virtual void visit (const CaseExp  &e);
89     virtual void visit (const ArrayListExp  &e);
90     virtual void visit (const AssignListExp  &e);
91     /** \} */
92
93     /** \name Visit Single Operation nodes.
94      ** \{ */
95     virtual void visit (const NotExp &e);
96     virtual void visit (const TransposeExp &e);
97     /** \} */
98
99     /** \name Visit Declaration nodes.
100      ** \{ */
101     /** \brief Visit Var declarations. */
102     virtual void visit (const VarDec &e);
103     virtual void visit (const FunctionDec &e);
104     /** \} */
105
106     /** \name Visit Type dedicated Expressions related node.
107      ** \{ */
108 public:
109     virtual void visit(const ListExp &e);
110
111     /* optimized */
112     virtual void visit(const OptimizedExp &e);
113     virtual void visit(const MemfillExp &e);
114     virtual void visit(const DAXPYExp &e);
115     virtual void visit(const IntSelectExp &e);
116     virtual void visit(const StringSelectExp &e);
117     /** \} */
118
119     template<typename T>
120     inline void printInternalType(std::wostringstream & stream, types::InternalType * pIT)
121     {
122         T * pT = static_cast<T *>(pIT);
123         if (pT)
124         {
125             const int size = pT->getSize();
126             if (size == 0)
127             {
128                 stream << L"[]";
129             }
130             else if (size == 1)
131             {
132                 stream << pT->get(0);
133             }
134             else
135             {
136                 stream << L"[";
137                 const int _size = std::min(4, size);
138                 for (unsigned int i = 0; i < _size - 1; ++i)
139                 {
140                     stream << pT->get(i) << L",";
141                 }
142                 stream << pT->get(_size - 1);
143                 if (size <= _size)
144                 {
145                     stream << L"]";
146                 }
147                 else
148                 {
149                     stream << L"...";
150                 }
151             }
152         }
153     }
154
155 protected:
156
157     std::wostream * ostr;
158     const bool printDecoration;
159     const bool colored;
160
161 private:
162
163     void START_NODE(const ast::Ast & e);
164     void END_NODE(void);
165     void print(const std::wstring & pre, const Location & loc, const std::wstring & post, const std::wstring & deco);
166     void print(const std::wstring & str);
167     void print(const std::wstring & str, const Exp & e);
168     void print(const Exp & e);
169     void print(const Location & loc);
170
171     static const std::wstring NORMAL;
172     static const std::wstring BOLD;
173     static const std::wstring RED;
174     static const std::wstring GREEN;
175     static const std::wstring YELLOW;
176     static const std::wstring BLUE;
177     static const std::wstring MAGENTA;
178     static const std::wstring CYAN;
179     static const std::wstring WHITE;
180 };
181 }
182 #endif // !AST_DEBUGVISITOR_HXX