* Bug #13932 fixed - macrovar was broken in YaSp branch. 93/16693/4
Vincent COUVERT [Tue, 16 Jun 2015 13:26:48 +0000 (15:26 +0200)]
Tests added in macrovar.tst: test_run functions macrovar

Change-Id: I6e8e81d87874745d04162a861f8e24f351a697ce

scilab/modules/ast/includes/ast/macrovarvisitor.hxx
scilab/modules/ast/src/cpp/ast/macrovarvisitor.cpp
scilab/modules/functions/tests/unit_tests/macrovar.dia.ref
scilab/modules/functions/tests/unit_tests/macrovar.tst

index 1d8b128..e21a411 100644 (file)
@@ -29,13 +29,22 @@ namespace ast
 class EXTERN_AST MacrovarVisitor : public DummyVisitor
 {
 public:
-    MacrovarVisitor() {}
+    MacrovarVisitor()
+    {
+        isAssignExpLeftExp = false;
+    }
     ~MacrovarVisitor() {}
 
+    void visit (const MatrixLineExp &e);
     void visit (const SimpleVar &e);
+    void visit(const OpExp &e);
     void visit(const CallExp &e);
+    void visit(const ForExp &e);
     void visit (const VarDec &e);
+    void visit (const FunctionDec &e);
+    void visit(const FieldExp &e);
     void visit(const AssignExp &e);
+    void visit(const AssignListExp &e);
 
     std::list<std::wstring>& getIn();
     std::list<std::wstring>& getOut();
@@ -65,6 +74,7 @@ public:
     std::list<std::wstring> m_local; // local variables
 
     std::wstring m_current;
+    bool isAssignExpLeftExp;
 };
 }
 
index 5448df9..c692688 100644 (file)
@@ -18,15 +18,41 @@ using namespace ast;
 using namespace symbol;
 namespace ast
 {
+
+void MacrovarVisitor::visit (const MatrixLineExp &e)
+{
+    exps_t columns = e.getColumns();
+    for (exps_t::const_iterator it = columns.begin(), itEnd = columns.end(); it != itEnd ; ++it)
+    {
+        (*it)->accept (*this);
+        add();
+    }
+}
+
 void MacrovarVisitor::visit (const SimpleVar &e)
 {
     m_current = e.getSymbol().getName();
 }
 
+void MacrovarVisitor::visit(const OpExp &e)
+{
+    e.getLeft().accept(*this);
+    add();
+    e.getRight().accept(*this);
+    add();
+}
+
 void MacrovarVisitor::visit(const CallExp &e)
 {
     e.getName().accept (*this);
-    add();
+    if (isAssignExpLeftExp)
+    {
+        add(m_local);
+    }
+    else
+    {
+        add();
+    }
 
     exps_t args = e.getArgs();
     for (auto arg : args)
@@ -36,17 +62,68 @@ void MacrovarVisitor::visit(const CallExp &e)
     }
 }
 
+void MacrovarVisitor::visit (const ForExp  &e)
+{
+    e.getVardec().accept(*this);
+    add(m_local);
+    e.getBody().accept (*this);
+}
+
+void MacrovarVisitor::visit (const FieldExp &e)
+{
+    e.getHead()->accept(*this);
+    add(m_local);
+}
+
 void MacrovarVisitor::visit(const AssignExp &e)
 {
+    isAssignExpLeftExp = true;
     e.getLeftExp().getOriginal()->accept (*this);
-    add();
+    isAssignExpLeftExp = false;
+    if (e.getLeftExp().isSimpleVar())
+    {
+        add(m_local);
+    }
+    else
+    {
+        add();
+    }
+
     e.getRightExp().getOriginal()->accept (*this);
     add();
 }
 
+void MacrovarVisitor::visit (const AssignListExp  &e)
+{
+    isAssignExpLeftExp = true;
+    for (exps_t::const_iterator it = e.getExps().begin (), itEnd = e.getExps().end(); it != itEnd; ++it)
+    {
+        (*it)->accept (*this);
+        if ((*it)->isSimpleVar())
+        {
+            add(m_local);
+        }
+        else
+        {
+            add();
+        }
+    }
+    isAssignExpLeftExp = false;
+}
+
 void MacrovarVisitor::visit (const VarDec  &e)
 {
+    m_current = e.getSymbol().getName();
+    add(m_local);
     e.getInit().getOriginal()->accept(*this);
+    add();
+}
+
+void MacrovarVisitor::visit (const FunctionDec  &e)
+{
+    // Function declared locally but never called
+    // If called then the CallExp visitor does the job
+    m_current = e.getSymbol().getName();
     add(m_local);
 }
 
@@ -93,7 +170,6 @@ void MacrovarVisitor::add(std::list<std::wstring>& lst)
 void MacrovarVisitor::add()
 {
     InternalType* pVar = Context::getInstance()->get(Symbol(m_current));
-
     if (pVar)
     {
         if (pVar->isCallable())
@@ -102,14 +178,9 @@ void MacrovarVisitor::add()
             add(m_called);
             return;
         }
-
-        //symbol already exists and not callable.
-        //it is a external var
-        add(m_external);
-        return;
     }
 
-    add(m_local);
+    add(m_external);
 }
 
 bool MacrovarVisitor::isAlreadyIn(std::list<std::wstring>& lst)
index 82abc8f..60ba660 100644 (file)
@@ -69,3 +69,76 @@ function [o1, o2, o3] = foo(i1, i2, i3, i4)
 endfunction
 val = macrovar(foo);
 assert_checkequal(ref, val);
+ref = list([], [], ["u";"t"], [], ["y"]);
+function [] = foo()
+    y = [u;t];
+endfunction
+val = macrovar(foo);
+assert_checkequal(ref, val);
+ref = list([], [], ["u";"t"], [], ["y"]);
+function [] = foo()
+    y(1) = [u;t];
+endfunction
+val = macrovar(foo);
+assert_checkequal(ref, val);
+ref = list([], [], ["u";"t"], [], ["y";"z"]);
+function [] = foo()
+    [y,z] = [u;t];
+endfunction
+val = macrovar(foo);
+assert_checkequal(ref, val);
+ref = list([], [], ["u";"t"], [], ["y";"z"]);
+function [] = foo()
+    [y(1),z(2)] = [u;t];
+endfunction
+val = macrovar(foo);
+assert_checkequal(ref, val);
+ref = list([], [], ["u";"t"], [], ["bar";"y"]);
+function [] = foo()
+    function bar()
+    endfunction
+    bar();
+    y = [u;t];
+endfunction
+val = macrovar(foo);
+assert_checkequal(ref, val);
+ref = list([], [], ["u";"t"], [], ["bar";"y"]);
+function [] = foo()
+    function bar()
+    endfunction
+    y = [u;t];
+endfunction
+val = macrovar(foo);
+assert_checkequal(ref, val);
+ref = list(["x1";"x2"], ["y"], ["a"], [], ["loc"]);
+function y = foo(x1, x2)
+    loc = 1;
+    y = a*x1+x2-loc
+endfunction
+val = macrovar(foo);
+assert_checkequal(ref, val);
+ref = list([],[],[],["length";"typeof";"steadycos";"lincos";"ppol";"obscont";"clear"],["M";"m";"l";"ph";"i";"scs_m";"X";"U";"Y";"XP";"sys";"Kc";"Kf";"Contr";"z0";"th0"]);
+function foo()
+    M=10;
+    m=3;
+    l=3;
+    ph=0.1;
+    for i=1:length(scs_m.objs)
+        if typeof(scs_m.objs(i)) == "Block" then
+            if scs_m.objs(i).gui == "SUPER_f" then
+                scs_m=scs_m.objs(i).model.rpar;
+                break
+            end
+        end
+    end
+    [X,U,Y,XP]=steadycos(scs_m,[],[],[],[],1,1:$);
+    sys= lincos(scs_m,X,U);
+    Kc=-ppol(sys.A,sys.B,[-1,-1,-1,-1]);
+    Kf=-ppol(sys.A',sys.C',[-2,-2,-2,-2]);Kf=Kf';
+    Contr=obscont(sys,Kc,Kf);
+    clear("scs_m","X","Y","XP","Kc","Kp","sys","%cpr");
+    z0=-4;
+    th0=.02;
+endfunction
+val = macrovar(foo);
+assert_checkequal(ref, val);
index 7acd315..a7f2416 100644 (file)
@@ -84,3 +84,93 @@ endfunction
 
 val = macrovar(foo);
 assert_checkequal(ref, val);
+
+ref = list([], [], ["u";"t"], [], ["y"]);
+function [] = foo()
+    y = [u;t];
+endfunction
+
+val = macrovar(foo);
+assert_checkequal(ref, val);
+
+ref = list([], [], ["u";"t"], [], ["y"]);
+function [] = foo()
+    y(1) = [u;t];
+endfunction
+
+val = macrovar(foo);
+assert_checkequal(ref, val);
+
+ref = list([], [], ["u";"t"], [], ["y";"z"]);
+function [] = foo()
+    [y,z] = [u;t];
+endfunction
+
+val = macrovar(foo);
+assert_checkequal(ref, val);
+
+ref = list([], [], ["u";"t"], [], ["y";"z"]);
+function [] = foo()
+    [y(1),z(2)] = [u;t];
+endfunction
+
+val = macrovar(foo);
+assert_checkequal(ref, val);
+
+ref = list([], [], ["u";"t"], [], ["bar";"y"]);
+function [] = foo()
+    function bar()
+    endfunction
+    bar();
+    y = [u;t];
+endfunction
+
+val = macrovar(foo);
+assert_checkequal(ref, val);
+
+ref = list([], [], ["u";"t"], [], ["bar";"y"]);
+function [] = foo()
+    function bar()
+    endfunction
+    y = [u;t];
+endfunction
+
+val = macrovar(foo);
+assert_checkequal(ref, val);
+
+ref = list(["x1";"x2"], ["y"], ["a"], [], ["loc"]);
+function y = foo(x1, x2)
+    loc = 1;
+    y = a*x1+x2-loc
+endfunction
+
+val = macrovar(foo);
+assert_checkequal(ref, val);
+
+ref = list([],[],[],["length";"typeof";"steadycos";"lincos";"ppol";"obscont";"clear"],["M";"m";"l";"ph";"i";"scs_m";"X";"U";"Y";"XP";"sys";"Kc";"Kf";"Contr";"z0";"th0"]);
+
+function foo()
+    M=10;
+    m=3;
+    l=3;
+    ph=0.1;
+    for i=1:length(scs_m.objs)
+        if typeof(scs_m.objs(i)) == "Block" then
+            if scs_m.objs(i).gui == "SUPER_f" then
+                scs_m=scs_m.objs(i).model.rpar;
+                break
+            end
+        end
+    end
+    [X,U,Y,XP]=steadycos(scs_m,[],[],[],[],1,1:$);
+    sys= lincos(scs_m,X,U);
+    Kc=-ppol(sys.A,sys.B,[-1,-1,-1,-1]);
+    Kf=-ppol(sys.A',sys.C',[-2,-2,-2,-2]);Kf=Kf';
+    Contr=obscont(sys,Kc,Kf);
+    clear("scs_m","X","Y","XP","Kc","Kp","sys","%cpr");
+    z0=-4;
+    th0=.02;
+endfunction
+
+val = macrovar(foo);
+assert_checkequal(ref, val);