Merge remote-tracking branch 'origin/master' into windows
[scilab.git] / scilab / modules / ast / src / cpp / analysis / VisitSeqExp.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2015 - 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 #include "AnalysisVisitor.hxx"
17
18 namespace analysis
19 {
20
21 void AnalysisVisitor::visit(ast::SeqExp & e)
22 {
23     logger.log("SeqExp", e.getLocation());
24     ast::exps_t::iterator i = e.getExps().begin();
25     ast::exps_t::iterator itEnd = e.getExps().end();
26     for (; i != itEnd; ++i)
27     {
28         ast::Exp* exp = *i;
29         if (exp->isCallExp())
30         {
31             visit(*static_cast<ast::CallExp *>(exp), /* LHS */ 0);
32         }
33         else if (exp->isBreakExp() || exp->isContinueExp())
34         {
35             exp->accept(*this);
36             if (loops.empty())
37             {
38                 // We are not in a loop so this break is useless.
39                 exp->replace(new ast::CommentExp(exp->getLocation(), new std::string("useless break or continue")));
40             }
41             else
42             {
43                 // We are in a loop: all the code after the break in this SeqExp is useless
44                 break;
45             }
46         }
47         else
48         {
49             exp->accept(*this);
50         }
51     }
52
53     if (i != itEnd)
54     {
55         ++i;
56         if (i != itEnd)
57         {
58             e.getExps().erase(i, itEnd);
59         }
60     }
61 }
62
63 } // namespace analysis