SLint: remove all CNES code
[scilab.git] / scilab / modules / coverage / src / cpp / InstrumentVisitor.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2015 - 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 #include "InstrumentVisitor.hxx"
14 #include "CoverModule.hxx"
15
16 namespace coverage
17 {
18
19 void InstrumentVisitor::visit(ast::SeqExp & e)
20 {
21     if (e.getParent() && !e.getParent()->isFunctionDec())
22     {
23         cover.add(macro, &e);
24     }
25
26     instrCounts += e.getExps().size();
27     for (auto exp : e.getExps())
28     {
29         if (exp->isCommentExp())
30         {
31             --instrCounts;
32         }
33         else
34         {
35             cover.add(macro, exp);
36             exp->accept(*this);
37         }
38     }
39 }
40
41 void InstrumentVisitor::visit(ast::IfExp & e)
42 {
43     ++branchesCount;
44     e.getThen().accept(*this);
45     if (e.hasElse())
46     {
47         ++branchesCount;
48         if (e.getElse().isCommentExp())
49         {
50             cover.add(macro, &e.getElse());
51         }
52         else
53         {
54             e.getElse().accept(*this);
55         }
56     }
57 }
58
59 void InstrumentVisitor::visit(ast::WhileExp & e)
60 {
61     ++branchesCount;
62     e.getBody().accept(*this);
63 }
64
65 void InstrumentVisitor::visit(ast::ForExp & e)
66 {
67     ++branchesCount;
68     e.getBody().accept(*this);
69 }
70
71 void InstrumentVisitor::visit(ast::TryCatchExp & e)
72 {
73     branchesCount += 2;
74     e.getTry().accept(*this);
75     e.getCatch().accept(*this);
76 }
77
78 void InstrumentVisitor::visit(ast::SelectExp & e)
79 {
80     ast::exps_t cases = e.getCases();
81     branchesCount += cases.size();
82     for (auto exp : cases)
83     {
84         exp->accept(*this);
85     }
86     if (e.hasDefault())
87     {
88         ++branchesCount;
89         e.getDefaultCase()->accept(*this);
90     }
91 }
92
93 void InstrumentVisitor::visit(ast::CaseExp & e)
94 {
95     cover.add(macro, e.getTest());
96     e.getBody()->accept(*this);
97 }
98
99 void InstrumentVisitor::visit(ast::FunctionDec & e)
100 {
101     types::Macro * pMacro = e.getMacro();
102     if (!pMacro)
103     {
104         std::list<symbol::Variable *> * pVarList = new std::list<symbol::Variable *>();
105         const ast::exps_t & vars = e.getArgs().getVars();
106         for (const auto var : vars)
107         {
108             pVarList->push_back(var->getAs<ast::SimpleVar>()->getStack());
109         }
110
111         //get output parameters list
112         std::list<symbol::Variable * > * pRetList = new std::list<symbol::Variable *>();
113         const ast::exps_t & rets = e.getReturns().getVars();
114         for (const auto ret : rets)
115         {
116             pRetList->push_back(ret->getAs<ast::SimpleVar>()->getStack());
117         }
118
119         pMacro = new types::Macro(e.getSymbol().getName(), *pVarList, *pRetList, static_cast<ast::SeqExp &>(e.getBody()), L"script");
120         pMacro->setLines(e.getLocation().first_line, e.getLocation().last_line);
121         //pMacro->setFirstLine(e.getLocation().first_line);
122         e.setMacro(pMacro);
123     }
124
125     inners.push_back(pMacro);
126 }
127 }