Merge remote-tracking branch 'origin/master' into windows
[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  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 #ifndef __GLOBALS_COLLECTOR_HXX__
17 #define __GLOBALS_COLLECTOR_HXX__
18
19 #include <iostream>
20 #include <string>
21 #include <sstream>
22 #include <stack>
23 #include <vector>
24
25 #include "visitor.hxx"
26 #include "execvisitor.hxx"
27 #include "allexp.hxx"
28 #include "allvar.hxx"
29 #include "Chrono.hxx"
30 #include "MacroDef.hxx"
31
32 namespace analysis
33 {
34
35 class GlobalsCollector : public ast::ConstVisitor, public Chrono
36 {
37
38     MacroDef & macrodef;
39     std::set<symbol::Symbol> locals;
40     std::set<symbol::Symbol> & globals;
41
42     GlobalsCollector(MacroDef & _macrodef) : macrodef(_macrodef), globals(_macrodef.getGlobals()) { }
43
44 public:
45
46     virtual ~GlobalsCollector() { }
47
48     virtual GlobalsCollector* clone()
49     {
50         return new GlobalsCollector(macrodef);
51     }
52
53     static void collect(MacroDef & macrodef);
54     const tools::SymbolOrdSet & getGlobals() const;
55     void print_info();
56
57     friend std::ostream & operator<<(std::ostream & out, const GlobalsCollector & gc);
58
59 private:
60
61     void collect();
62     void visit(const ast::SimpleVar & e);
63     void visit(const ast::DollarVar & e);
64     void visit(const ast::ColonVar & e);
65     void visit(const ast::ArrayListVar & e);
66     void visit(const ast::DoubleExp & e);
67     void visit(const ast::BoolExp & e);
68     void visit(const ast::StringExp & e);
69     void visit(const ast::CommentExp & e);
70     void visit(const ast::NilExp & e);
71     void visit(const ast::CallExp & e);
72     void visit(const ast::CellCallExp & e);
73     void visit(const ast::OpExp & e);
74     void visit(const ast::LogicalOpExp & e);
75     void visit(const ast::AssignExp & e);
76     void visit(const ast::IfExp & e);
77     void visit(const ast::WhileExp & e);
78     void visit(const ast::ForExp & e);
79     void visit(const ast::BreakExp & e);
80     void visit(const ast::ContinueExp & e);
81     void visit(const ast::TryCatchExp & e);
82     void visit(const ast::SelectExp & e);
83     void visit(const ast::CaseExp & e);
84     void visit(const ast::ReturnExp & e);
85     void visit(const ast::FieldExp & e);
86     void visit(const ast::NotExp & e);
87     void visit(const ast::TransposeExp & e);
88     void visit(const ast::MatrixExp & e);
89     void visit(const ast::MatrixLineExp & e);
90     void visit(const ast::CellExp & e);
91     void visit(const ast::SeqExp & e);
92     void visit(const ast::ArrayListExp & e);
93     void visit(const ast::AssignListExp & e);
94     void visit(const ast::VarDec & e);
95     void visit(const ast::FunctionDec & e);
96     void visit(const ast::ListExp & e);
97     void visit(const ast::OptimizedExp & e);
98     void visit(const ast::MemfillExp & e);
99     void visit(const ast::DAXPYExp & e);
100     void visit(const ast::IntSelectExp & e);
101     void visit(const ast::StringSelectExp & e);
102 };
103
104 } // namespace analysis
105
106 #endif // __GLOBALS_COLLECTOR_HXX__