Analysis: infer when a refcount is required and add colors in DebugVisitor
[scilab.git] / scilab / modules / ast / includes / analysis / data / GlobalsCollector.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2014 - Scilab Enterprises - Calixte DENIZET
4  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #ifndef __GLOBALS_COLLECTOR_HXX__
14 #define __GLOBALS_COLLECTOR_HXX__
15
16 #include <iostream>
17 #include <string>
18 #include <sstream>
19 #include <stack>
20 #include <vector>
21
22 #include "visitor.hxx"
23 #include "execvisitor.hxx"
24 #include "allexp.hxx"
25 #include "allvar.hxx"
26 #include "Chrono.hxx"
27 #include "MacroDef.hxx"
28
29 namespace analysis
30 {
31
32 class GlobalsCollector : public ast::ConstVisitor, public Chrono
33 {
34
35     MacroDef & macrodef;
36     std::set<symbol::Symbol> locals;
37     std::set<symbol::Symbol> & globals;
38
39     GlobalsCollector(MacroDef & _macrodef) : macrodef(_macrodef), globals(_macrodef.getGlobals()) { }
40
41 public:
42
43     virtual ~GlobalsCollector() { }
44
45     static void collect(MacroDef & macrodef);
46     const tools::SymbolOrdSet & getGlobals() const;
47     void print_info();
48
49     friend std::wostream & operator<<(std::wostream & out, const GlobalsCollector & gc);
50
51 private:
52
53     void collect();
54     void visit(const ast::SimpleVar & e);
55     void visit(const ast::DollarVar & e);
56     void visit(const ast::ColonVar & e);
57     void visit(const ast::ArrayListVar & e);
58     void visit(const ast::DoubleExp & e);
59     void visit(const ast::BoolExp & e);
60     void visit(const ast::StringExp & e);
61     void visit(const ast::CommentExp & e);
62     void visit(const ast::NilExp & e);
63     void visit(const ast::CallExp & e);
64     void visit(const ast::CellCallExp & e);
65     void visit(const ast::OpExp & e);
66     void visit(const ast::LogicalOpExp & e);
67     void visit(const ast::AssignExp & e);
68     void visit(const ast::IfExp & e);
69     void visit(const ast::WhileExp & e);
70     void visit(const ast::ForExp & e);
71     void visit(const ast::BreakExp & e);
72     void visit(const ast::ContinueExp & e);
73     void visit(const ast::TryCatchExp & e);
74     void visit(const ast::SelectExp & e);
75     void visit(const ast::CaseExp & e);
76     void visit(const ast::ReturnExp & e);
77     void visit(const ast::FieldExp & e);
78     void visit(const ast::NotExp & e);
79     void visit(const ast::TransposeExp & e);
80     void visit(const ast::MatrixExp & e);
81     void visit(const ast::MatrixLineExp & e);
82     void visit(const ast::CellExp & e);
83     void visit(const ast::SeqExp & e);
84     void visit(const ast::ArrayListExp & e);
85     void visit(const ast::AssignListExp & e);
86     void visit(const ast::VarDec & e);
87     void visit(const ast::FunctionDec & e);
88     void visit(const ast::ListExp & e);
89     void visit(const ast::OptimizedExp & e);
90     void visit(const ast::MemfillExp & e);
91     void visit(const ast::DAXPYExp & e);
92     void visit(const ast::IntSelectExp & e);
93     void visit(const ast::StringSelectExp & e);
94 };
95
96 } // namespace analysis
97
98 #endif // __GLOBALS_COLLECTOR_HXX__