From eb7ce943ea237fdfe871965646522ba50233caee Mon Sep 17 00:00:00 2001
From: Ludovic Apvrille <ludovic.apvrille@telecom-paris.fr>
Date: Mon, 27 Mar 2023 15:12:02 +0200
Subject: [PATCH] Adding contant value in Avatar: handling random, method call
 and receive message

---
 modeling/AVATAR/PressureController.xml        |  40 +--
 .../java/avatartranslator/AvatarBlock.java    | 324 +++++++++---------
 .../avatartranslator/AvatarSyntaxChecker.java |   2 +-
 .../java/ui/AvatarDesignPanelTranslator.java  | 122 ++++---
 src/main/java/ui/avatarbd/AvatarBDPanel.java  |   2 +-
 5 files changed, 259 insertions(+), 231 deletions(-)

diff --git a/modeling/AVATAR/PressureController.xml b/modeling/AVATAR/PressureController.xml
index 04a41b528f..7bda8ecf5a 100644
--- a/modeling/AVATAR/PressureController.xml
+++ b/modeling/AVATAR/PressureController.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
-<TURTLEGMODELING version="1.0beta" ANIMATE_INTERACTIVE_SIMULATION="true" ACTIVATE_PENALTIES="false" UPDATE_INFORMATION_DIPLO_SIM="false" ANIMATE_WITH_INFO_DIPLO_SIM="true" OPEN_DIAG_DIPLO_SIM="false" LAST_SELECTED_MAIN_TAB="7" LAST_SELECTED_SUB_TAB="2">
+<TURTLEGMODELING version="1.0beta" ANIMATE_INTERACTIVE_SIMULATION="true" ACTIVATE_PENALTIES="false" UPDATE_INFORMATION_DIPLO_SIM="false" ANIMATE_WITH_INFO_DIPLO_SIM="true" OPEN_DIAG_DIPLO_SIM="false" LAST_SELECTED_MAIN_TAB="7" LAST_SELECTED_SUB_TAB="0">
 
 <Modeling type="Avatar Requirement" nameTab="Requirements" >
 <AvatarRDPanel name="RequirementsSystemView" minX="10" maxX="2500" minY="10" maxY="1500" zoom="1.0" >
@@ -21435,8 +21435,8 @@ F PressureSensor.SendingPressure --&gt; MainController.HighPressure
 <extraparam>
 <blockType data="block" color="-4072719" />
 <CryptoBlock value="false" />
-<Attribute access="0" var="1" id="branchToUse" value="false" type="4" typeOther="" />
-<Attribute access="0" var="1" id="pressure" value="" type="8" typeOther="" />
+<Attribute access="0" var="0" id="branchToUse" value="false" type="4" typeOther="" />
+<Attribute access="0" var="0" id="pressure" value="" type="8" typeOther="" />
 <Method value="$int readingPressure()" />
 <Method value="$bool isInCode()" />
 <Signal value="out pressureValue(int value)" attached="true" />
@@ -22293,7 +22293,7 @@ F PressureSensor.SendingPressure --&gt; MainController.HighPressure
 <new d="false" />
 </CONNECTOR><SUBCOMPONENT type="-1" id="8869" index="25" uid="1437fa68-4b92-44e9-91fe-8798bebbadef" >
 <father id="8871" num="0" />
-<cdparam x="357" y="356" />
+<cdparam x="325" y="356" />
 <sizeparam width="168" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
 <hidden value="false" />
 <enabled value="true" />
@@ -22706,7 +22706,7 @@ F PressureSensor.SendingPressure --&gt; MainController.HighPressure
 </CONNECTOR><SUBCOMPONENT type="-1" id="9136" index="18" uid="9c1a9cbe-02d3-41fc-a7bb-43d88b954bcf" >
 <father id="9138" num="0" />
 <cdparam x="697" y="476" />
-<sizeparam width="10" height="15" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
+<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
 <hidden value="false" />
 <enabled value="true" />
 <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" />
@@ -22785,7 +22785,7 @@ F PressureSensor.SendingPressure --&gt; MainController.HighPressure
 <SUBCOMPONENT type="-1" id="9147" index="23" uid="7e6ee145-5077-4747-8b2e-1e211643cf05" >
 <father id="9153" num="4" />
 <cdparam x="674" y="402" />
-<sizeparam width="10" height="15" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
+<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
 <hidden value="false" />
 <enabled value="true" />
 <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" />
@@ -22864,7 +22864,7 @@ F PressureSensor.SendingPressure --&gt; MainController.HighPressure
 <SUBCOMPONENT type="-1" id="9162" index="28" uid="c1f02373-4f6d-4272-8771-88bdeb4b49fc" >
 <father id="9168" num="4" />
 <cdparam x="462" y="508" />
-<sizeparam width="194" height="15" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
+<sizeparam width="194" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
 <hidden value="false" />
 <enabled value="true" />
 <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" />
@@ -22943,7 +22943,7 @@ F PressureSensor.SendingPressure --&gt; MainController.HighPressure
 <SUBCOMPONENT type="-1" id="9177" index="33" uid="10b045ca-0d74-4e84-95b4-4ef0d5b6f47a" >
 <father id="9183" num="4" />
 <cdparam x="328" y="345" />
-<sizeparam width="194" height="15" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
+<sizeparam width="194" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
 <hidden value="false" />
 <enabled value="true" />
 <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" />
@@ -22978,7 +22978,7 @@ F PressureSensor.SendingPressure --&gt; MainController.HighPressure
 </CONNECTOR><SUBCOMPONENT type="-1" id="9188" index="34" uid="f28c32af-dedb-40a8-bc1a-bb8eb4ec6e29" >
 <father id="9190" num="0" />
 <cdparam x="474" y="146" />
-<sizeparam width="10" height="15" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
+<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
 <hidden value="false" />
 <enabled value="true" />
 <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" />
@@ -23013,7 +23013,7 @@ F PressureSensor.SendingPressure --&gt; MainController.HighPressure
 </CONNECTOR><SUBCOMPONENT type="-1" id="9195" index="35" uid="4a776332-2d15-46a6-8791-ba62536e771e" >
 <father id="9197" num="0" />
 <cdparam x="566" y="247" />
-<sizeparam width="10" height="15" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
+<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
 <hidden value="false" />
 <enabled value="true" />
 <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" />
@@ -23048,7 +23048,7 @@ F PressureSensor.SendingPressure --&gt; MainController.HighPressure
 </CONNECTOR><SUBCOMPONENT type="-1" id="9202" index="36" uid="aea74c6a-ac1c-4457-a44f-6f3258552d50" >
 <father id="9204" num="0" />
 <cdparam x="590" y="304" />
-<sizeparam width="10" height="15" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
+<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
 <hidden value="false" />
 <enabled value="true" />
 <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" />
@@ -23083,7 +23083,7 @@ F PressureSensor.SendingPressure --&gt; MainController.HighPressure
 </CONNECTOR><SUBCOMPONENT type="-1" id="9209" index="37" uid="594a2866-a50c-47c9-bfc5-00fefa162705" >
 <father id="9211" num="0" />
 <cdparam x="583" y="365" />
-<sizeparam width="44" height="15" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
+<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
 <hidden value="false" />
 <enabled value="true" />
 <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" />
@@ -23118,7 +23118,7 @@ F PressureSensor.SendingPressure --&gt; MainController.HighPressure
 </CONNECTOR><SUBCOMPONENT type="-1" id="9216" index="38" uid="e9de9ebf-5e06-4a2b-a92b-52fd4f4a1c82" >
 <father id="9218" num="0" />
 <cdparam x="692" y="468" />
-<sizeparam width="10" height="15" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
+<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
 <hidden value="false" />
 <enabled value="true" />
 <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" />
@@ -23153,7 +23153,7 @@ F PressureSensor.SendingPressure --&gt; MainController.HighPressure
 </CONNECTOR><SUBCOMPONENT type="-1" id="9223" index="39" uid="088c80ff-b42e-48ca-8015-6607c60d1758" >
 <father id="9225" num="0" />
 <cdparam x="695" y="548" />
-<sizeparam width="44" height="15" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
+<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
 <hidden value="false" />
 <enabled value="true" />
 <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" />
@@ -23177,8 +23177,8 @@ F PressureSensor.SendingPressure --&gt; MainController.HighPressure
 </SUBCOMPONENT>
 
 <COMPONENT type="5104" id="9236" index="10" uid="fe37ebcc-a627-47a4-aee8-bd47adbb7f1a" >
-<cdparam x="587" y="448" />
-<sizeparam width="221" height="20" minWidth="30" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
+<cdparam x="597" y="448" />
+<sizeparam width="200" height="20" minWidth="30" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
 <hidden value="false" />
 <enabled value="true" />
 <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" />
@@ -23197,8 +23197,8 @@ F PressureSensor.SendingPressure --&gt; MainController.HighPressure
 </COMPONENT>
 
 <COMPONENT type="5103" id="9247" index="11" uid="e3e31799-f463-45a6-9d5a-681267a38a03" >
-<cdparam x="646" y="570" />
-<sizeparam width="103" height="20" minWidth="30" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
+<cdparam x="651" y="570" />
+<sizeparam width="92" height="20" minWidth="30" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
 <hidden value="false" />
 <enabled value="true" />
 <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" />
@@ -23349,8 +23349,8 @@ F PressureSensor.SendingPressure --&gt; MainController.HighPressure
 </COMPONENT>
 
 <COMPONENT type="5104" id="9363" index="15" uid="b25d12e2-81af-4e5c-9a2c-a5bf9455bcb5" >
-<cdparam x="451" y="275" />
-<sizeparam width="221" height="20" minWidth="30" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
+<cdparam x="461" y="275" />
+<sizeparam width="200" height="20" minWidth="30" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" />
 <hidden value="false" />
 <enabled value="true" />
 <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" />
diff --git a/src/main/java/avatartranslator/AvatarBlock.java b/src/main/java/avatartranslator/AvatarBlock.java
index 866f007d8a..ab8835c89a 100644
--- a/src/main/java/avatartranslator/AvatarBlock.java
+++ b/src/main/java/avatartranslator/AvatarBlock.java
@@ -39,6 +39,7 @@
 package avatartranslator;
 
 import myutil.NameChecker;
+import myutil.TraceManager;
 
 import java.util.ArrayList;
 import java.util.LinkedList;
@@ -63,7 +64,7 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
     private int blockIndex; //Index of block in the Avatar Specification
 
     private String globalCode;
-    
+
     private int booleanOffset;
     private int attributeOptRatio;
     private List<AvatarAttribute> constants;
@@ -82,6 +83,126 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
         attributeOptRatio = 1;
     }
 
+    public static boolean isAValidMethodCall(AvatarStateMachineOwner owner, String _s) {
+        int i;
+
+        //TraceManager.addDev("****** method=" + _s);
+        String all = _s;
+
+        int indexeq = _s.indexOf('=');
+
+        if (indexeq != -1) {
+            _s = _s.substring(indexeq + 1, _s.length()).trim();
+            //TraceManager.addDev("****** cut method: " + _s);
+        }
+
+        int index0 = _s.indexOf("(");
+        int index1 = _s.indexOf(")");
+        if ((index0 == -1) || (index1 == -1) || (index1 < index0)) {
+            //TraceManager.addDev("No parenthesis");
+            return false;
+        }
+
+        String method = _s.substring(0, index0);
+
+        AvatarMethod am = owner.getAvatarMethodWithName(method);
+        if (am == null) {
+            //TraceManager.addDev("Method not found");
+            return false;
+        }
+
+        String[] actions;
+        AvatarAttribute aa;
+        String params = _s.substring(index0 + 1, index1).trim();
+        //TraceManager.addDev("params=" + params);
+        if (params.length() == 0) {
+            if (am.getListOfAttributes().size() != 0) {
+                return false;
+            }
+        } else {
+            //TraceManager.addDev("params=" + params);
+            actions = params.split(",");
+            if (am.getListOfAttributes().size() != actions.length) {
+                return false;
+            }
+
+            for (i = 0; i < actions.length; i++) {
+                //TraceManager.addDev("params=" + params +  " actions=" + actions[i]);
+                // Must check the validity of this action
+
+                if (am.getListOfAttributes().get(i).isInt()) {
+                    if (AvatarSyntaxChecker.isAValidIntExpr(null, owner, actions[i].trim()) < 0) {
+                        return false;
+                    }
+                } else {
+                    // Assume it is a bool attribute
+                    if (AvatarSyntaxChecker.isAValidBoolExpr(null, owner, actions[i].trim()) < 0) {
+                        return false;
+                    }
+                }
+
+            /*aa = getAvatarAttributeWithName(actions[i].trim());
+              if (aa == null) {
+              //TraceManager.addDev("Failed for attribute " + actions[i]);
+              return false;
+              }*/
+            }
+        }
+
+        // Checking for return attributes
+        //TraceManager.addDev("Checking for return attributes");
+        if (indexeq != -1) {
+            //TraceManager.addDev("Checking for return params");
+            String retparams = all.substring(0, indexeq).trim();
+            //TraceManager.addDev("Retparam=" + retparams);
+
+            // multiple params
+            if (retparams.length() > 0) {
+                if (retparams.charAt(0) == '(') {
+                    if (retparams.charAt(retparams.length() - 1) != ')') {
+                        //TraceManager.addDev("Bad format for return params: " + retparams);
+                        return false;
+                    }
+
+                    retparams = retparams.substring(1, retparams.length() - 1).trim();
+                    actions = retparams.split(",");
+                    if (am.getListOfReturnAttributes().size() != actions.length) {
+                        return false;
+                    }
+
+                    for (i = 0; i < actions.length; i++) {
+                        //TraceManager.addDev("params=" + retparams + " actions=" + actions[i]);
+                        aa = owner.getAvatarAttributeWithName(actions[i].trim());
+                        if (aa == null) {
+                            //TraceManager.addDev("Failed for attribute " + actions[i]);
+                            return false;
+                        } else if (aa.isConstant()) {
+                            return false;
+                        }
+                    }
+
+                } else {
+                    // Only one param.
+                    aa = owner.getAvatarAttributeWithName(retparams);
+                    if (aa == null) {
+                        //TraceManager.addDev("Failed for return attribute " + retparams);
+                        return false;
+                    } else if (aa.isConstant()) {
+                        return false;
+                    }
+
+                    if (am.getListOfReturnAttributes().size() != 1) {
+                        //TraceManager.addDev("Wrong number of return parameters in :" + retparams);
+                        return false;
+                    }
+                }
+
+            }
+        }
+        //TraceManager.addDev("Ok for method " + _s);
+
+        return true;
+    }
 
     // For code generation
     public void addGlobalCode(String _code) {
@@ -102,24 +223,23 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
         return globalCode;
     }
 
+    public AvatarBlock getFather() {
+        return father;
+    }
 
     // Relation with parent block
     public void setFather(AvatarBlock _father) {
         father = _father;
     }
 
-    public AvatarBlock getFather() {
-        return father;
-    }
+    /*public void addAttribute(AvatarAttribute _attribute) {
+        attributes.add(_attribute);
+	}*/
 
     public AvatarStateMachine getStateMachine() {
         return asm;
     }
 
-    /*public void addAttribute(AvatarAttribute _attribute) {
-        attributes.add(_attribute);
-	}*/
-
     public void addMethod(AvatarMethod _method) {
         methods.add(_method);
     }
@@ -128,7 +248,9 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
         signals.add(_signal);
     }
 
-    public void clearAttributes() {attributes.clear();}
+    public void clearAttributes() {
+        attributes.clear();
+    }
 
     public AvatarSignal addSignalIfApplicable(String name, int type, Object refObject) {
         AvatarSignal sig = getSignalByName(name);
@@ -141,7 +263,6 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
 
     }
 
-
     public List<AvatarAttribute> getAttributes() {
         return attributes;
     }
@@ -154,7 +275,6 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
         return methods;
     }
 
-
     public List<AvatarSignal> getSignals() {
         return signals;
     }
@@ -282,7 +402,6 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
         return false;
     }
 
-
     public AvatarAttribute getAttribute(int _index) {
         return attributes.get(_index);
     }
@@ -314,10 +433,10 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
         }
         return -1;
     }
-    
+
     public int getIndexOfConstantWithName(String _name) {
         int cpt = 0;
-        
+
         if (constants == null) {
             return -1;
         }
@@ -329,7 +448,7 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
         }
         return -1;
     }
-    
+
     public AvatarAttribute getConstantWithIndex(int index) {
         if (constants == null) {
             return null;
@@ -406,118 +525,6 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
         return null;
     }
 
-    public static boolean isAValidMethodCall(AvatarStateMachineOwner owner, String _s) {
-        int i;
-
-        //TraceManager.addDev("****** method=" + _s);
-        String all = _s;
-
-        int indexeq = _s.indexOf('=');
-
-        if (indexeq != -1) {
-            _s = _s.substring(indexeq + 1, _s.length()).trim();
-            //TraceManager.addDev("****** cut method: " + _s);
-        }
-
-        int index0 = _s.indexOf("(");
-        int index1 = _s.indexOf(")");
-        if ((index0 == -1) || (index1 == -1) || (index1 < index0)) {
-            //TraceManager.addDev("No parenthesis");
-            return false;
-        }
-
-        String method = _s.substring(0, index0);
-
-        AvatarMethod am = owner.getAvatarMethodWithName(method);
-        if (am == null) {
-            //TraceManager.addDev("Method not found");
-            return false;
-        }
-
-        String params = _s.substring(index0 + 1, index1).trim();
-        //TraceManager.addDev("params=" + params);
-        if (params.length() == 0) {
-            return am.getListOfAttributes().size() == 0;
-        }
-        //TraceManager.addDev("params=" + params);
-        String[] actions = params.split(",");
-        if (am.getListOfAttributes().size() != actions.length) {
-            return false;
-        }
-
-        AvatarAttribute aa;
-        for (i = 0; i < actions.length; i++) {
-            //TraceManager.addDev("params=" + params +  " actions=" + actions[i]);
-            // Must check tha validity of this action
-
-            if (am.getListOfAttributes().get(i).isInt()) {
-                if (AvatarSyntaxChecker.isAValidIntExpr(null, owner, actions[i].trim()) < 0) {
-                    return false;
-                }
-            } else {
-                // Assume it is a bool attribute
-                if (AvatarSyntaxChecker.isAValidBoolExpr(null, owner, actions[i].trim()) < 0) {
-                    return false;
-                }
-            }
-
-            /*aa = getAvatarAttributeWithName(actions[i].trim());
-              if (aa == null) {
-              //TraceManager.addDev("Failed for attribute " + actions[i]);
-              return false;
-              }*/
-        }
-
-        // Checking for return attributes
-        if (indexeq != -1) {
-            //TraceManager.addDev("Checking for return params");
-            String retparams = all.substring(0, indexeq).trim();
-            //TraceManager.addDev("Retparam=" + retparams);
-
-            // multiple params
-            if (retparams.length() > 0) {
-                if (retparams.charAt(0) == '(') {
-                    if (retparams.charAt(retparams.length() - 1) != ')') {
-                        //TraceManager.addDev("Bad format for return params: " + retparams);
-                        return false;
-                    }
-
-                    retparams = retparams.substring(1, retparams.length() - 1).trim();
-                    actions = retparams.split(",");
-                    if (am.getListOfReturnAttributes().size() != actions.length) {
-                        return false;
-                    }
-
-                    for (i = 0; i < actions.length; i++) {
-                        //TraceManager.addDev("params=" + retparams +  " actions=" + actions[i]);
-                        aa = owner.getAvatarAttributeWithName(actions[i].trim());
-                        if (aa == null) {
-                            //TraceManager.addDev("Failed for attribute " + actions[i]);
-                            return false;
-                        }
-                    }
-
-                } else {
-                    // Only one param.
-                    aa = owner.getAvatarAttributeWithName(retparams);
-                    if (aa == null) {
-                        //TraceManager.addDev("Failed for return attribute " + retparams);
-                        return false;
-                    }
-
-                    if (am.getListOfReturnAttributes().size() != 1) {
-                        //TraceManager.addDev("Wrong number of return parameters in :" + retparams);
-                        return false;
-                    }
-                }
-
-            }
-        }
-        //TraceManager.addDev("Ok for method " + _s);
-
-        return true;
-    }
-
     public AvatarStateMachineElement getStateMachineElementFromReferenceObject(Object _o) {
         return asm.getStateMachineElementFromReferenceObject(_o);
     }
@@ -737,7 +744,7 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
 
     public ArrayList<AvatarElement> getAttributesOverMax(int maxV) {
         ArrayList<AvatarElement> outside = new ArrayList<>();
-        for(AvatarAttribute aa: attributes) {
+        for (AvatarAttribute aa : attributes) {
             if (aa.isInt()) {
                 if (aa.hasInitialValue()) {
                     try {
@@ -753,38 +760,38 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
         }
         return outside;
     }
-    
-    
+
+
     //move boolean attributes to last positions in list attributes
     public void sortAttributes() {
         List<AvatarAttribute> newAttributes = new LinkedList<AvatarAttribute>();
-        
+
         for (AvatarAttribute attribute : attributes) {
             if (attribute.getType() != AvatarType.BOOLEAN) {
                 newAttributes.add(attribute);
             }
         }
-        
+
         booleanOffset = newAttributes.size();
-        
+
         for (AvatarAttribute attribute : attributes) {
             if (attribute.getType() == AvatarType.BOOLEAN) {
                 newAttributes.add(attribute);
             }
         }
-        
+
         attributes = newAttributes;
     }
-    
+
     public int getBooleanOffset() {
         return booleanOffset;
     }
-    
-    
+
+
     public int getAttributeOptRatio() {
         return attributeOptRatio;
     }
-    
+
     public void setAttributeOptRatio(int attributeOptRatio) {
         if (attributeOptRatio == 2 || attributeOptRatio == 4) {
             this.attributeOptRatio = attributeOptRatio;
@@ -792,20 +799,19 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
             this.attributeOptRatio = 1;
         }
     }
-    
-    
+
+
     public void removeConstantAttributes() {
         AvatarTransition at;
 
 
-
         if ((constants == null) || (constants.size() == 0)) {
             List<AvatarAttribute> newAttributes = new LinkedList<>();
             constants = new LinkedList<>();
-    
+
             for (AvatarAttribute attr : attributes) {
                 boolean toKeep = false;
-                
+
                 if (attr.isTimer()) {
                     toKeep = true;
                 }
@@ -817,10 +823,10 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
 
                         for (AvatarAction aa : at.getActions()) {
                             if (aa instanceof AvatarActionAssignment) {
-                               if (((AvatarActionAssignment) aa).leftHand.getName().compareTo(attr.name) == 0) {
-                                   //assigned
-                                   toKeep = true;
-                               }
+                                if (((AvatarActionAssignment) aa).leftHand.getName().compareTo(attr.name) == 0) {
+                                    //assigned
+                                    toKeep = true;
+                                }
                             }
                         }
                     } else if (elt instanceof AvatarActionOnSignal) {
@@ -844,7 +850,6 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
                     }
 
 
-
                     if (toKeep) {
                         break;
                     }
@@ -860,13 +865,12 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
     }
 
 
-
     public void removeUselessAttributes() {
         //AvatarTransition at;
         List<AvatarAttribute> toBeRemoved = new LinkedList<AvatarAttribute>();
 
 
-        for(AvatarAttribute aa: attributes) {
+        for (AvatarAttribute aa : attributes) {
             if (aa.isTimer()) {
                 if (!(asm.isTimerUsed(aa))) {
                     toBeRemoved.add(aa);
@@ -881,19 +885,19 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
             }
         }
 
-        for(AvatarAttribute aa: toBeRemoved) {
+        for (AvatarAttribute aa : toBeRemoved) {
             attributes.remove(aa);
         }
 
     }
 
     // Returns the number of replaced queries
-    public int  replaceQueriesWithReadSignal(AvatarSignal _origin, AvatarSignal _newSignal) {
+    public int replaceQueriesWithReadSignal(AvatarSignal _origin, AvatarSignal _newSignal) {
         List<AvatarQueryOnSignal> elts = new LinkedList<>();
         AvatarQueryOnSignal aqos;
 
         // Getting all related ops
-        for(AvatarStateMachineElement elt: asm.getListOfElements()) {
+        for (AvatarStateMachineElement elt : asm.getListOfElements()) {
             if (elt instanceof AvatarQueryOnSignal) {
                 aqos = (AvatarQueryOnSignal) elt;
                 if (aqos.getSignal() == _origin) {
@@ -903,7 +907,7 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
         }
 
         // Replacing ops
-        for(AvatarQueryOnSignal q: elts) {
+        for (AvatarQueryOnSignal q : elts) {
             AvatarActionOnSignal aaosQuery = new AvatarActionOnSignal("query", _newSignal, q.getReferenceObject());
             aaosQuery.addValue(q.getAttribute().getName());
             asm.replace(q, aaosQuery);
@@ -942,17 +946,17 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
     public NameChecker.NamedElement[] getSubNamedElements() {
         NameChecker.NamedElement[] nes = new NameChecker.NamedElement[attributes.size() + methods.size() + signals.size()];
         int index = 0;
-        for(AvatarAttribute aa: attributes) {
+        for (AvatarAttribute aa : attributes) {
             nes[index] = aa;
-            index ++;
+            index++;
         }
-        for(AvatarMethod am: methods) {
+        for (AvatarMethod am : methods) {
             nes[index] = am;
-            index ++;
+            index++;
         }
-        for(AvatarSignal as: signals) {
+        for (AvatarSignal as : signals) {
             nes[index] = as;
-            index ++;
+            index++;
         }
         return nes;
     }
diff --git a/src/main/java/avatartranslator/AvatarSyntaxChecker.java b/src/main/java/avatartranslator/AvatarSyntaxChecker.java
index 8c54b9ef82..46219fb6bd 100644
--- a/src/main/java/avatartranslator/AvatarSyntaxChecker.java
+++ b/src/main/java/avatartranslator/AvatarSyntaxChecker.java
@@ -83,7 +83,7 @@ public class AvatarSyntaxChecker {
     public static ArrayList<AvatarError> checkSyntaxWarnings(AvatarSpecification avspec) {
         ArrayList<AvatarError> warnings = new ArrayList<>();
 
-        warnings.addAll(checkIsolatedElements(avspec));
+        //warnings.addAll(checkIsolatedElements(avspec));
         warnings.addAll(checkNames(avspec));
 
 
diff --git a/src/main/java/ui/AvatarDesignPanelTranslator.java b/src/main/java/ui/AvatarDesignPanelTranslator.java
index 8ef2e7ce3d..80861b57c1 100644
--- a/src/main/java/ui/AvatarDesignPanelTranslator.java
+++ b/src/main/java/ui/AvatarDesignPanelTranslator.java
@@ -127,43 +127,44 @@ public class AvatarDesignPanelTranslator {
             addWarning(ce);
         }
 
-
-
-        ArrayList<AvatarError> list = AvatarSyntaxChecker.checkSyntaxErrors(as);
-        for (AvatarError ar : list) {
-            UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, AvatarError.errorStrings[ar.error]);
-            ce.setTDiagramPanel(adp.getAvatarBDPanel());
-            Object o = ar.firstAvatarElement.getReferenceObject();
-            if (o instanceof TGComponent) {
-                ce.setTGComponent((TGComponent) o);
-                ce.setTDiagramPanel(((TGComponent) o).getTDiagramPanel());
+        if (checkingErrors.size() == 0) {
+            ArrayList<AvatarError> list = AvatarSyntaxChecker.checkSyntaxErrors(as);
+            for (AvatarError ar : list) {
+                UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, AvatarError.errorStrings[ar.error]);
+                ce.setTDiagramPanel(adp.getAvatarBDPanel());
+                Object o = ar.firstAvatarElement.getReferenceObject();
+                if (o instanceof TGComponent) {
+                    ce.setTGComponent((TGComponent) o);
+                    ce.setTDiagramPanel(((TGComponent) o).getTDiagramPanel());
+                }
+                addCheckingError(ce);
             }
-            addWarning(ce);
-        }
 
-        ArrayList<AvatarError> listW = AvatarSyntaxChecker.checkSyntaxWarnings(as);
-        for (AvatarError ar : listW) {
-            UICheckingError ce;
-            if (ar.firstAvatarElement != null) {
-                if (ar.secondAvatarElement == null) {
-                    ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR,
-                            AvatarError.errorStrings[ar.error] + ": " + ar.firstAvatarElement.getName());
+
+            ArrayList<AvatarError> listW = AvatarSyntaxChecker.checkSyntaxWarnings(as);
+            for (AvatarError ar : listW) {
+                UICheckingError ce;
+                if (ar.firstAvatarElement != null) {
+                    if (ar.secondAvatarElement == null) {
+                        ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR,
+                                AvatarError.errorStrings[ar.error] + ": " + ar.firstAvatarElement.getName());
+                    } else {
+                        ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR,
+                                AvatarError.errorStrings[ar.error] + ": " +
+                                        ar.firstAvatarElement.getName() + " / " + ar.secondAvatarElement.getName());
+                    }
                 } else {
                     ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR,
-                            AvatarError.errorStrings[ar.error] + ": " +
-                                    ar.firstAvatarElement.getName() + " / " + ar.secondAvatarElement.getName());
+                            AvatarError.errorStrings[ar.error]);
                 }
-            } else {
-                ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR,
-                        AvatarError.errorStrings[ar.error]);
-            }
-            ce.setTDiagramPanel(adp.getAvatarBDPanel());
-            Object o = ar.firstAvatarElement.getReferenceObject();
-            if (o instanceof TGComponent) {
-                ce.setTGComponent((TGComponent) o);
-                ce.setTDiagramPanel(((TGComponent) o).getTDiagramPanel());
+                ce.setTDiagramPanel(adp.getAvatarBDPanel());
+                Object o = ar.firstAvatarElement.getReferenceObject();
+                if (o instanceof TGComponent) {
+                    ce.setTGComponent((TGComponent) o);
+                    ce.setTDiagramPanel(((TGComponent) o).getTDiagramPanel());
+                }
+                addWarning(ce);
             }
-            addWarning(ce);
         }
 
         adp.abdp.repaint();
@@ -1610,32 +1611,46 @@ public class AvatarDesignPanelTranslator {
     }
 
     private void manageAttribute(String _name, AvatarStateMachineOwner _ab, AvatarActionOnSignal _aaos, TDiagramPanel _tdp, TGComponent _tgc,
-                                 String _idOperator) {
+                                 String _idOperator, boolean writeOperation) {
         //TraceManager.addDev("Searching for attribute:" + _name);
         TAttribute ta = adp.getAvatarBDPanel().getAttribute(_name, _ab.getName());
         if (ta == null) {
             // Must search among attributes of the created block
             AvatarAttribute aatmp = _ab.getAvatarAttributeWithName(_name);
             if (aatmp != null) {
+                if (aatmp.isConstant() && writeOperation) {
+                    UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "Using constant parameter \"" + _name +
+                            "\" in a receive operation: " + _idOperator);
+                    ce.setTDiagramPanel(_tdp);
+                    ce.setTGComponent(_tgc);
+                    addCheckingError(ce);
+                    return;
+                }
                 _aaos.addValue(aatmp.getName());
                 return;
             }
 
-
-            UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed parameter: " + _name + " in signal expression: " + _idOperator);
-            // TODO: adapt
-            // ce.setAvatarBlock(_ab);
+            UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed parameter \"" + _name +
+                    "\" in signal expression: " + _idOperator);
             ce.setTDiagramPanel(_tdp);
             ce.setTGComponent(_tgc);
             addCheckingError(ce);
-            TraceManager.addDev("not found " + _name + " in block " + _ab.getName() + ". Attributes are:");
+            /*TraceManager.addDev("not found " + _name + " in block " + _ab.getName() + ". Attributes are:");
             for (AvatarAttribute aa : _ab.getAttributes()) {
                 TraceManager.addDev("\t" + aa.getName());
             }
-            TraceManager.addDev("\n");
+            TraceManager.addDev("\n");*/
             return;
         }
 
+        if (writeOperation && ta.isConstant()) {
+            UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "Using constant parameter \"" + _name +
+                    "\" in a receive operation: " + _idOperator);
+            ce.setTDiagramPanel(_tdp);
+            ce.setTGComponent(_tgc);
+            addCheckingError(ce);
+        }
+
         //TraceManager.addDev("Found: " + ta.getId());
 
         List<String> v = new LinkedList<String>();
@@ -1682,7 +1697,8 @@ public class AvatarDesignPanelTranslator {
                     ((ui.AvatarSignal) atas.getReferenceObject()).attachedToARelation = false;
                 }
                 //TraceManager.addDev("Spec:" + _as.toString());
-                throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Signal used for sending " + asmdss.getValue() + " is not connected to a channel");
+                throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Signal used for sending " + asmdss.getValue() +
+                        " is not connected to a channel");
             }
             if (atas.getReferenceObject() instanceof ui.AvatarSignal) {
                 //TraceManager.addDev("Send/ Setting as attached " + atas);
@@ -1713,7 +1729,7 @@ public class AvatarDesignPanelTranslator {
                 if (tmp.isEmpty())
                     throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Empty parameter in signal expression: " + asmdss.getValue());
 
-                this.manageAttribute(tmp, _ab, aaos, tdp, asmdss, asmdss.getValue());
+                this.manageAttribute(tmp, _ab, aaos, tdp, asmdss, asmdss.getValue(), false);
             }
 
             if (aaos.getNbOfValues() != atas.getListOfAttributes().size()) {
@@ -1973,7 +1989,8 @@ public class AvatarDesignPanelTranslator {
         asm.addElement(element);
     }
 
-    private void translateAvatarSMDReceiveSignal(TDiagramPanel tdp, AvatarSpecification _as, AvatarStateMachineOwner _ab, AvatarSMDReceiveSignal asmdrs) throws CheckingError {
+    private void translateAvatarSMDReceiveSignal(TDiagramPanel tdp, AvatarSpecification _as, AvatarStateMachineOwner _ab,
+                                                 AvatarSMDReceiveSignal asmdrs) throws CheckingError {
         AvatarStateMachine asm = _ab.getStateMachine();
         avatartranslator.AvatarSignal atas = _ab.getAvatarSignalWithName(asmdrs.getSignalName());
         if (atas == null)
@@ -1988,7 +2005,8 @@ public class AvatarDesignPanelTranslator {
                     //TraceManager.addDev("Receive/ Setting as attached " + atas);
                     ((ui.AvatarSignal) atas.getReferenceObject()).attachedToARelation = false;
                 }
-                throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Signal used for receiving " + asmdrs.getValue() + " is not connected to a channel");
+                throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Signal used for receiving " + asmdrs.getValue() +
+                        " is not connected to a channel");
             }
             if (atas.getReferenceObject() instanceof ui.AvatarSignal) {
                 //TraceManager.addDev("Receive/ Setting as attached " + atas);
@@ -2024,22 +2042,25 @@ public class AvatarDesignPanelTranslator {
                 if (tmp.isEmpty())
                     throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Empty parameter in signal expression: " + asmdrs.getValue());
 
-                this.manageAttribute(tmp, _ab, aaos, tdp, asmdrs, asmdrs.getValue());
+                this.manageAttribute(tmp, _ab, aaos, tdp, asmdrs, asmdrs.getValue(), true);
             }
 
             if (aaos.getNbOfValues() != atas.getListOfAttributes().size())
-                throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed signal receiving: " + asmdrs.getValue() + " -> nb of parameters does not match definition");
+                throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed signal receiving: " + asmdrs.getValue() +
+                        " -> nb of parameters does not match definition");
 
             // Checking expressions passed as parameter
             for (int i = 0; i < aaos.getNbOfValues(); i++) {
                 String theVal = aaos.getValue(i);
                 if (atas.getListOfAttributes().get(i).isInt()) {
                     if (AvatarSyntaxChecker.isAValidIntExpr(_as, _ab, theVal) < 0)
-                        throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed signal receiving: " + asmdrs.getValue() + " -> value at index #" + i + " does not match definition");
+                        throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed signal receiving: " + asmdrs.getValue() +
+                                " -> value at index #" + i + " does not match definition");
                 } else {
                     // We assume it is a bool attribute
                     if (AvatarSyntaxChecker.isAValidBoolExpr(_as, _ab, theVal) < 0)
-                        throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed signal receiving: " + asmdrs.getValue() + " -> value at index #" + i + " does not match definition");
+                        throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed signal receiving: " + asmdrs.getValue() +
+                                " -> value at index #" + i + " does not match definition");
                 }
             }
 
@@ -2175,7 +2196,8 @@ public class AvatarDesignPanelTranslator {
         asmdquery.setAVATARID(element.getID());
     }
 
-    private void translateAvatarSMDRandom(TDiagramPanel tdp, AvatarSpecification _as, AvatarStateMachineOwner _ab, AvatarSMDRandom asmdrand) throws CheckingError {
+    private void translateAvatarSMDRandom(TDiagramPanel tdp, AvatarSpecification _as, AvatarStateMachineOwner _ab, AvatarSMDRandom asmdrand)
+            throws CheckingError {
         AvatarStateMachine asm = _ab.getStateMachine();
 
         final AvatarStateMachineElement element;
@@ -2213,7 +2235,9 @@ public class AvatarDesignPanelTranslator {
                 this.makeError(-3, tdp, _ab, asmdrand, "random", tmp1);
                 // Checking type of variable -> must be an int
             else if (!(aa.isInt()))
-                this.makeError(error, tdp, _ab, asmdrand, ": variable of random must be of type \"int\"", tmp2);
+                this.makeError(error, tdp, _ab, asmdrand, ": variable of random must be of type \"int\"", tmp1);
+            else if (aa.isConstant())
+                this.makeError(error, tdp, _ab, asmdrand, ": variable of random must not be constant", tmp1);
 
             arandom.setVariable(tmp1);
         } else {
@@ -2458,7 +2482,7 @@ public class AvatarDesignPanelTranslator {
 
                     //TraceManager.addDev("Action before modifyStringMethodCall :" + actionText);
                     actionText = modifyStringMethodCall(actionText, block.getName());
-                    //TraceManager.addDev("Action after modifyStringMethodCall :" + actionText);
+                    TraceManager.addDev("Action after modifyStringMethodCall :" + actionText);
 
                     if (!AvatarBlock.isAValidMethodCall(block, actionText)) {
                         UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed transition method call: " + actionText);
diff --git a/src/main/java/ui/avatarbd/AvatarBDPanel.java b/src/main/java/ui/avatarbd/AvatarBDPanel.java
index bd72db2438..f7a3a5d4b0 100644
--- a/src/main/java/ui/avatarbd/AvatarBDPanel.java
+++ b/src/main/java/ui/avatarbd/AvatarBDPanel.java
@@ -131,7 +131,7 @@ public class AvatarBDPanel extends TDiagramPanel {
     }
 
     public void updateSignalAttachement(AvatarBDBlock _b, AvatarBDPortConnector _conn) {
-        TraceManager.addDev("Update signal attachment for block " + _b.getBlockName());
+        //TraceManager.addDev("Update signal attachment for block " + _b.getBlockName());
 
     	// Set all signals of B as non connected
     	_b.setSignalsAsNonAttached();
-- 
GitLab