Analysis: fix bug in listexp analysis
[scilab.git] / scilab / modules / ast / src / cpp / ast / debugvisitor.cpp
index de22ce4..ed49e4a 100644 (file)
@@ -17,45 +17,46 @@ namespace ast
 {
 static int level = -1;
 
-static void DEBUG_START_NODE(const ast::Ast& e)
+void DebugVisitor::DEBUG_START_NODE(const ast::Ast& e)
 {
-    wcerr << L"(" << e.getNodeNumber() << L") ";
+    *ostr << L"(" << e.getNodeNumber() << L") ";
     ++level;
 }
 
-static void DEBUG_END_NODE(void)
+void DebugVisitor::DEBUG_END_NODE(void)
 {
     --level;
 }
 
-static void DEBUG(wstring str)
+void DebugVisitor::DEBUG(wstring str)
 {
     for (int i = 0 ; i < level; ++i)
     {
-        wcerr << L"  ";
+        *ostr << L"  ";
     }
     if (level > 0)
     {
-        wcerr << L"     ";
+        *ostr << L"     ";
     }
-    wcerr << str << endl;
+    *ostr << str << endl;
 }
 
-static void DEBUG(wstring str, const Exp &e)
+void DebugVisitor::DEBUG(wstring str, const Exp &e)
 {
     for (int i = 0 ; i < level; ++i)
     {
-        wcerr << L"  ";
+        *ostr << L"  ";
     }
     if (level > 0)
     {
-        wcerr << L"|_./ ";
+        *ostr << L"|_./ ";
     }
-    wcerr << str;
+    *ostr << str;
 
     Location loc = e.getLocation();
-    wcerr << L" @(" << loc.first_line << L"." << loc.first_column << L" -> ";
-    wcerr << loc.last_line << L"." << loc.last_column << L")" << endl;
+    *ostr << L" @(" << loc.first_line << L"." << loc.first_column << L" -> ";
+    *ostr << loc.last_line << L"." << loc.last_column << L")";
+    //*ostr << L" Deco(" << e.getDecorator() << L")" << endl;
 }
 
 
@@ -63,10 +64,10 @@ void DebugVisitor::visit (const MatrixExp &e)
 {
     DEBUG_START_NODE(e);
     DEBUG(L"Exec MatrixExp", e);
-    list<MatrixLineExp *>::const_iterator      i;
-    for (i = e.getLines().begin() ; i != e.getLines().end() ; ++i )
+    exps_t lines = e.getLines();
+    for (exps_t::const_iterator it = lines.begin(), itEnd = lines.end(); it != itEnd ; ++it)
     {
-        (*i)->accept (*this);
+        (*it)->accept(*this);
     }
     DEBUG_END_NODE();
 }
@@ -75,35 +76,39 @@ void DebugVisitor::visit (const MatrixLineExp &e)
 {
     DEBUG_START_NODE(e);
     DEBUG(L"Exec MatrixLineExp", e);
-    list<Exp *>::const_iterator        i;
-    for (i = e.getColumns().begin() ; i != e.getColumns().end() ; ++i)
+    exps_t columns = e.getColumns();
+    for (exps_t::const_iterator it = columns.begin(), itEnd = columns.end(); it != itEnd ; ++it)
     {
-        (*i)->accept (*this);
+        (*it)->accept(*this);
     }
     DEBUG_END_NODE();
 }
-/** \} */
 
 void DebugVisitor::visit (const CellExp &e)
 {
     DEBUG_START_NODE(e);
     DEBUG(L"Exec CellExp", e);
-    list<MatrixLineExp *>::const_iterator      i;
-    for (i = e.getLines().begin() ; i != e.getLines().end() ; ++i )
+    exps_t lines = e.getLines();
+    for (exps_t::const_iterator it = lines.begin(), itEnd = lines.end(); it != itEnd ; ++it)
     {
-        (*i)->accept (*this);
+        (*it)->accept(*this);
     }
     DEBUG_END_NODE();
 }
 
-/** \} */
-
-/** \name Visit Constant Expressions nodes.
-** \{ */
 void DebugVisitor::visit (const StringExp &e)
 {
     DEBUG_START_NODE(e);
-    DEBUG(L"Exec StringExp : " + e.getValue(), e);
+    wostringstream stream;
+    if (e.getConstant())
+    {
+        printInternalType<types::String>(stream, e.getConstant());
+    }
+    else
+    {
+        stream << e.getValue();
+    }
+    DEBUG(L"Exec StringExp : " + stream.str(), e);
     DEBUG_END_NODE();
 }
 
@@ -118,7 +123,25 @@ void DebugVisitor::visit (const DoubleExp  &e)
 {
     DEBUG_START_NODE(e);
     wostringstream stream;
-    stream << e.getValue();
+    types::InternalType * pIT = e.getConstant();
+    if (pIT)
+    {
+        if (pIT->isImplicitList())
+        {
+            types::ImplicitList * pIL = static_cast<types::ImplicitList *>(pIT);
+            stream << static_cast<types::Double *>(pIL->getStart())->get(0) << L":"
+                   << static_cast<types::Double *>(pIL->getStep())->get(0) << L":"
+                   << static_cast<types::Double *>(pIL->getEnd())->get(0);
+        }
+        else
+        {
+            printInternalType<types::Double>(stream, pIT);
+        }
+    }
+    else
+    {
+        stream << e.getValue();
+    }
     DEBUG(L"Exec DoubleExp : " + stream.str(), e);
     DEBUG_END_NODE();
 }
@@ -127,8 +150,15 @@ void DebugVisitor::visit (const BoolExp  &e)
 {
     DEBUG_START_NODE(e);
     wostringstream stream;
-    stream << e.getValue();
-    DEBUG(L"Exec getv    : " + stream.str(), e);
+    if (e.getConstant())
+    {
+        printInternalType<types::Bool>(stream, e.getConstant());
+    }
+    else
+    {
+        stream << e.getValue();
+    }
+    DEBUG(L"Exec BoolExp : " + stream.str(), e);
     DEBUG_END_NODE();
 }
 
@@ -138,14 +168,25 @@ void DebugVisitor::visit (const NilExp &e)
     DEBUG(L"Exec NilExp", e);
     DEBUG_END_NODE();
 }
-/** \} */
 
-/** \name Visit Variable related nodes.
-** \{ */
 void DebugVisitor::visit (const SimpleVar &e)
 {
+    std::wstring ty;
+    analysis::TIType type = e.getDecorator().getResult().getType();
+    if (type.type != analysis::TIType::UNKNOWN)
+    {
+        if (type.isscalar())
+        {
+            ty = L" (" + analysis::TIType::toString(type.type) + L")";
+        }
+        else
+        {
+            ty = L" (" + analysis::TIType::toString(type.type) + L"*)";
+        }
+    }
+
     DEBUG_START_NODE(e);
-    DEBUG(L"Exec SimpleVar : " + e.getSymbol().getName(), e);
+    DEBUG(L"Exec SimpleVar : " + e.getSymbol().getName() + ty, e);
     DEBUG_END_NODE();
 }
 
@@ -167,27 +208,20 @@ void DebugVisitor::visit (const ArrayListVar &e)
 {
     DEBUG_START_NODE(e);
     DEBUG(L"Exec ArrayListVar", e);
-    list<Var *>::const_iterator        i;
-    for (i = e.getVars().begin() ; i != e.getVars().end() ; ++i)
+    exps_t vars = e.getVars();
+    for (exps_t::const_iterator it = vars.begin (), itEnd = vars.end(); it != itEnd; ++it)
     {
-        (*i)->accept (*this);
+        (*it)->accept(*this);
     }
     DEBUG_END_NODE();
 }
-/** \} */
-
-/** \name Visit Control Expressions or Instructions nodes.
-** \{ */
 
 void DebugVisitor::visit (const FieldExp &e)
 {
     DEBUG_START_NODE(e);
     DEBUG(L"Exec FieldExp", e);
-    // FIXME
-    {
-        e.getHead()->accept(*this);
-        e.getTail()->accept(*this);
-    }
+    e.getHead()->accept(*this);
+    e.getTail()->accept(*this);
     DEBUG_END_NODE();
 }
 
@@ -195,12 +229,8 @@ void DebugVisitor::visit(const OpExp &e)
 {
     DEBUG_START_NODE(e);
     DEBUG(L"Exec OpExp", e);
-    // FIXME
-    {
-        e.getLeft().accept(*this);
-        //e.oper_get();
-        e.getRight().accept(*this);
-    }
+    e.getLeft().accept(*this);
+    e.getRight().accept(*this);
     DEBUG_END_NODE();
 }
 
@@ -208,12 +238,8 @@ void DebugVisitor::visit(const LogicalOpExp &e)
 {
     DEBUG_START_NODE(e);
     DEBUG(L"Exec LogicalOpExp", e);
-    // FIXME
-    {
-        e.getLeft().accept(*this);
-        //e.oper_get();
-        e.getRight().accept(*this);
-    }
+    e.getLeft().accept(*this);
+    e.getRight().accept(*this);
     DEBUG_END_NODE();
 }
 
@@ -221,11 +247,8 @@ void DebugVisitor::visit (const AssignExp  &e)
 {
     DEBUG_START_NODE(e);
     DEBUG(L"Exec AssignExp", e);
-    //FIXME
-    {
-        e.getLeftExp().accept (*this);
-        e.getRightExp().accept (*this);
-    }
+    e.getLeftExp().accept(*this);
+    e.getRightExp().accept(*this);
     DEBUG_END_NODE();
 }
 
@@ -233,33 +256,31 @@ void DebugVisitor::visit(const CellCallExp &e)
 {
     DEBUG_START_NODE(e);
     DEBUG(L"Exec CellCallExp", e);
-    e.getName().accept (*this);
-    // FIXME
-    {
-        list<Exp *>::const_iterator    i;
+    e.getName().accept(*this);
 
-        for (i = e.getArgs().begin (); i != e.getArgs().end (); ++i)
-        {
-            (*i)->accept (*this);
-        }
+    exps_t args = e.getArgs();
+    for (auto arg : args)
+    {
+        arg->accept(*this);
     }
+
     DEBUG_END_NODE();
 }
 
 void DebugVisitor::visit(const CallExp &e)
 {
+    std::wstring str;
+
     DEBUG_START_NODE(e);
-    DEBUG(L"Exec CallExp", e);
-    e.getName().accept (*this);
-    // FIXME
-    {
-        list<Exp *>::const_iterator    i;
+    DEBUG(L"Exec CallExp" + str, e);
+    e.getName().accept(*this);
 
-        for (i = e.getArgs().begin (); i != e.getArgs().end (); ++i)
-        {
-            (*i)->accept (*this);
-        }
+    exps_t args = e.getArgs();
+    for (auto arg : args)
+    {
+        arg->accept(*this);
     }
+
     DEBUG_END_NODE();
 }
 
@@ -267,14 +288,11 @@ void DebugVisitor::visit (const IfExp  &e)
 {
     DEBUG_START_NODE(e);
     DEBUG(L"Exec IfExp", e);
-    // FIXME
+    e.getTest ().accept(*this);
+    e.getThen ().accept(*this);
+    if (e.hasElse())
     {
-        e.getTest ().accept(*this);
-        e.getThen ().accept(*this);
-        if (e.hasElse())
-        {
-            e.getElse ().accept(*this);
-        }
+        e.getElse ().accept(*this);
     }
     DEBUG_END_NODE();
 }
@@ -283,11 +301,8 @@ void DebugVisitor::visit (const TryCatchExp  &e)
 {
     DEBUG_START_NODE(e);
     DEBUG(L"Exec TryCatchExp", e);
-    // FIXME
-    {
-        e.getTry ().accept(*this);
-        e.getCatch ().accept(*this);
-    }
+    e.getTry ().accept(*this);
+    e.getCatch ().accept(*this);
     DEBUG_END_NODE();
 }
 
@@ -295,9 +310,8 @@ void DebugVisitor::visit (const WhileExp  &e)
 {
     DEBUG_START_NODE(e);
     DEBUG(L"Exec WhileExp", e);
-    // FIMXE
-    e.getTest().accept (*this);
-    e.getBody().accept (*this);
+    e.getTest().accept(*this);
+    e.getBody().accept(*this);
     DEBUG_END_NODE();
 }
 
@@ -306,7 +320,7 @@ void DebugVisitor::visit (const ForExp  &e)
     DEBUG_START_NODE(e);
     DEBUG(L"Exec ForExp", e);
     e.getVardec().accept(*this);
-    e.getBody().accept (*this);
+    e.getBody().accept(*this);
     DEBUG_END_NODE();
 }
 
@@ -340,11 +354,13 @@ void DebugVisitor::visit (const SelectExp &e)
     DEBUG_START_NODE(e);
     DEBUG(L"Exec SelectExp", e);
     e.getSelect()->accept(*this);
-    ast::cases_t::iterator it;
-    for (it = e.getCases()->begin() ; it !=  e.getCases()->end() ; ++it)
+
+    exps_t cases = e.getCases();
+    for (auto exp : cases)
     {
-        (*it)->accept(*this);
+        exp->accept(*this);
     }
+
     if (e.getDefaultCase() != NULL)
     {
         e.getDefaultCase()->accept(*this);
@@ -365,14 +381,9 @@ void DebugVisitor::visit (const SeqExp  &e)
 {
     DEBUG_START_NODE(e);
     DEBUG(L"Exec SeqExp", e);
-    list<Exp *>::const_iterator        i;
-    for (i = e.getExps().begin (); i != e.getExps().end (); ++i)
+    for (exps_t::const_iterator it = e.getExps().begin (), itEnd = e.getExps().end(); it != itEnd; ++it)
     {
-        if (!(*i)->isVerbose())
-        {
-            DEBUG(L"__MUTE__");
-        }
-        (*i)->accept (*this);
+        (*it)->accept(*this);
     }
     DEBUG_END_NODE();
 }
@@ -381,10 +392,9 @@ void DebugVisitor::visit (const ArrayListExp  &e)
 {
     DEBUG_START_NODE(e);
     DEBUG(L"Exec ArrayListExp", e);
-    list<Exp *>::const_iterator        i;
-    for (i = e.getExps().begin (); i != e.getExps().end (); ++i)
+    for (exps_t::const_iterator it = e.getExps().begin (), itEnd = e.getExps().end(); it != itEnd; ++it)
     {
-        (*i)->accept (*this);
+        (*it)->accept(*this);
     }
     DEBUG_END_NODE();
 }
@@ -393,22 +403,18 @@ void DebugVisitor::visit (const AssignListExp  &e)
 {
     DEBUG_START_NODE(e);
     DEBUG(L"Exec AssignListExp", e);
-    list<Exp *>::const_iterator        i;
-    for (i = e.getExps().begin (); i != e.getExps().end (); ++i)
+    for (exps_t::const_iterator it = e.getExps().begin (), itEnd = e.getExps().end(); it != itEnd; ++it)
     {
-        (*i)->accept (*this);
+        (*it)->accept(*this);
     }
     DEBUG_END_NODE();
 }
-/** \} */
 
-/** \name Visit Single Operation nodes.
-** \{ */
 void DebugVisitor::visit (const NotExp &e)
 {
     DEBUG_START_NODE(e);
     DEBUG(L"Exec NotExp", e);
-    e.getExp().accept (*this);
+    e.getExp().accept(*this);
     DEBUG_END_NODE();
 }
 
@@ -416,23 +422,17 @@ void DebugVisitor::visit (const TransposeExp &e)
 {
     DEBUG_START_NODE(e);
     DEBUG(L"Exec TransposeExp", e);
-    e.getExp().accept (*this);
+    e.getExp().accept(*this);
     DEBUG_END_NODE();
 }
-/** \} */
 
-/** \name Visit Declaration nodes.
-** \{ */
-/** \brief Visit Var declarations. */
 void DebugVisitor::visit (const VarDec  &e)
 {
     DEBUG_START_NODE(e);
     DEBUG(L"Exec VarDec", e);
-    {
-        DEBUG_START_NODE(e);
-        DEBUG(L"Exec Symbol : " + e.getSymbol().getName(), e);
-        DEBUG_END_NODE();
-    }
+    DEBUG_START_NODE(e);
+    DEBUG(L"Exec Symbol : " + e.getSymbol().getName(), e);
+    DEBUG_END_NODE();
     e.getInit().accept(*this);
     DEBUG_END_NODE();
 }
@@ -457,10 +457,7 @@ void DebugVisitor::visit (const FunctionDec  &e)
 
     DEBUG_END_NODE();
 }
-/** \} */
 
-/** \name Visit Type dedicated Expressions related node.
-** \{ */
 void DebugVisitor::visit(const ListExp &e)
 {
     DEBUG_START_NODE(e);
@@ -470,5 +467,47 @@ void DebugVisitor::visit(const ListExp &e)
     e.getEnd().accept(*this);
     DEBUG_END_NODE();
 }
-/** \} */
+
+void DebugVisitor::visit(const OptimizedExp &e)
+{
+    e.getOriginal()->accept(*this);
+}
+
+void DebugVisitor::visit(const MemfillExp &e)
+{
+    DEBUG_START_NODE(e);
+    DEBUG(L"Exec MemfillExp", e);
+    e.getValue().accept(*this);
+
+    exps_t args = e.getArgs();
+    for (auto arg : args)
+    {
+        arg->accept(*this);
+    }
+
+    DEBUG_END_NODE();
+}
+
+void DebugVisitor::visit(const DAXPYExp &e)
+{
+    DEBUG_START_NODE(e);
+    DEBUG(L"Exec DAXPYExp", e);
+    e.getA().accept(*this);
+    e.getX().accept(*this);
+    e.getY().accept(*this);
+    DEBUG_END_NODE();
+
+    //e.getOriginal()->accept(*this);
+}
+
+void DebugVisitor::visit(const IntSelectExp & e)
+{
+    e.getOriginal()->accept(*this);
+}
+
+void DebugVisitor::visit(const StringSelectExp & e)
+{
+    e.getOriginal()->accept(*this);
+}
+
 }