From bc5e2bec73b43e1b98b1b1d107b0d3698c37abc5 Mon Sep 17 00:00:00 2001
From: Sophie Coudert <sophie.coudert@telecom-paris.fr>
Date: Thu, 13 Jun 2024 17:03:11 +0200
Subject: [PATCH] debug... method parameters fixed, but no return type

---
 .../tosysmlv2/Avatar2SysML.java               |   9 +-
 .../tosysmlv2/AvatarFromSysML.java            | 169 +++++++++++++++---
 src/main/java/ui/AvatarMethod.java            |   4 +-
 3 files changed, 153 insertions(+), 29 deletions(-)

diff --git a/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java
index f6ddc11ba8..3ce7139345 100644
--- a/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java
+++ b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java
@@ -917,7 +917,6 @@ public class Avatar2SysML {
             else if (target instanceof AvatarExpireTimer)
                 requestType = 5;
         }
-
         // computing request
         if (guarded) {
             sysMLrequests.append(indent + "if " +
@@ -970,7 +969,7 @@ public class Avatar2SysML {
             doAction = receiveActions2SysML(methodMap.get(((AvatarActionOnSignal)target).getSignal()),
                     ((AvatarActionOnSignal)target).getOriginalValues());
         else
-            doAction = transitionActions2SysM(at);
+            doAction = transitionActions2SysML(at);
         indent = indent.substring(indentStepSize);
 
         sysMLtransitions.append("\n" + indent + "transition : '#AvatarTransition' first " + srcName);
@@ -1131,12 +1130,12 @@ public class Avatar2SysML {
     String methodCall2SysML(AvatarTermFunction m) {
         return expr2SysML(m.getOriginalAction());
     }
-    String transitionActions2SysM(AvatarTransition at) {
+    String transitionActions2SysML(AvatarTransition at) {
         StringBuffer result;
-        result = new StringBuffer(indent + "do action : '#TransitionAction' {\n" + indent + indentStep + "first start;\n");
-        indent += indentStep;
         int size = at.getNbOfAction();
         if (size == 0) return null;
+        result = new StringBuffer(indent + "do action : '#TransitionAction' {\n" + indent + indentStep + "first start;\n");
+        indent += indentStep;
         for(int i = 0; i < size; i++) {
             String ac = at.getOriginalAction(i);
             int eq = ac.indexOf("=");
diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java
index 84378fbeb7..c11ff22e89 100644
--- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java
+++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java
@@ -118,13 +118,20 @@ public class AvatarFromSysML {
         }
         return b;
     }
-    private AvatarAttribute getAttributeByName(String _name, AvatarBlock _block) {
+    private AvatarAttribute getOriginalAttributeByName(String _name, AvatarBlock _block) {
         List<AvatarAttribute> l = _block.getOriginalAttributes();
         int size = l.size();
         for (int i = 0; i < size; i++)
             if(l.get(i).getName().equals(_name)) return  l.get(i);
         return null;
     }
+    private AvatarAttribute getAttributeByName(String _name, AvatarBlock _block) {
+        List<AvatarAttribute> l = _block.getAttributes();
+        int size = l.size();
+        for (int i = 0; i < size; i++)
+            if(l.get(i).getName().equals(_name)) return  l.get(i);
+        return null;
+    }
     private AvatarAttribute getTimerByName(String _name, AvatarBlock _block) {
         AvatarAttribute res =  getAttributeByName(_name, _block);
         if (res != null && res.getType() == AvatarType.TIMER) return res;
@@ -145,7 +152,7 @@ public class AvatarFromSysML {
                     break;
                 case AvatarFromSysMLSyntax.STXCOUNTSTATE :
                     s = new AvatarQueryOnSignal(_s.getName(), getSignal(_s.getSignal()),
-                            getAttributeByName(_s.getVariable(),_b), null, _b);
+                            getAttributeByName(_s.getVariable().replaceAll("\\.", "__"),_b), null, _b);
                     break;
                 case AvatarFromSysMLSyntax.STXSTOPSTATE :
                 case AvatarFromSysMLSyntax.STXSENDSTATE :
@@ -225,19 +232,36 @@ public class AvatarFromSysML {
             for (int i = 0; i < size; i++) {
                 StxAttribute a = blk.getAttribute(i);
                 AvatarAttribute aa;
+                AvatarAttribute ax;
                 if (a.getType().equals("Integer")) {
                     aa = new AvatarAttribute(a.getName(), AvatarType.INTEGER, theBlock, null);
                     aa.setInitialValue(a.getInit());
+                    ax = new AvatarAttribute(a.getName(), AvatarType.INTEGER, theBlock, null);
+                    ax.setInitialValue(a.getInit());
+                    theBlock.addAttribute(ax);
+                    ax.setAsConstant(false);
                 }
                 else if (a.getType().equals("Boolean")) {
                     aa = new AvatarAttribute(a.getName(), AvatarType.BOOLEAN, theBlock, null);
                     aa.setInitialValue(a.getInit());
+                    ax = new AvatarAttribute(a.getName(), AvatarType.BOOLEAN, theBlock, null);
+                    ax.setInitialValue(a.getInit());
+                    theBlock.addAttribute(ax);
+                    ax.setAsConstant(false);
                 }
                 else {
                     aa = new AvatarAttribute(a.getName(), AvatarType.UNDEFINED, theBlock, null);
                     // aa.setInitialValue(a.getInit());
                     AvatarDataType adt = avSpec.getDataTypeByName(a.getType());
                     aa.setDataType(adt);
+                    String aaName =  a.getName() + "__";
+                    int dtsize = adt.getFullSize();
+                    for (int j = 0; j < dtsize; j++) {
+                        ax = new AvatarAttribute(aaName + adt.getFieldString(j),
+                                adt.getFieldStringType(j), theBlock, null);
+                        theBlock.addAttribute(ax);
+                        ax.setAsConstant(false);
+                    }
                 }
                 theBlock.addOriginalAttribute(aa);
                 aa.setAsConstant(false);
@@ -247,17 +271,26 @@ public class AvatarFromSysML {
             for (int i = 0; i < size; i++) {
                 StxAttribute a = blk.getConstant(i);
                 AvatarAttribute aa;
+                AvatarAttribute ax;
                 if (a.getType().equals("Integer")) {
                     aa = new AvatarAttribute(a.getName(), AvatarType.INTEGER, theBlock, null);
                     aa.setInitialValue(a.getInit());
                     theBlock.addAttribute(aa);
                     aa.setAsConstant(true);
+                    ax = new AvatarAttribute(a.getName(), AvatarType.INTEGER, theBlock, null);
+                    ax.setInitialValue(a.getInit());
+                    theBlock.addAttribute(ax);
+                    ax.setAsConstant(true);
                 }
                 else if (a.getType().equals("Boolean")) {
                     aa = new AvatarAttribute(a.getName(), AvatarType.BOOLEAN, theBlock, null);
                     aa.setInitialValue(a.getInit());
                     theBlock.addAttribute(aa);
                     aa.setAsConstant(true);
+                    ax = new AvatarAttribute(a.getName(), AvatarType.INTEGER, theBlock, null);
+                    ax.setInitialValue(a.getInit());
+                    theBlock.addAttribute(ax);
+                    ax.setAsConstant(true);
                 }
                 else
                     addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR,
@@ -269,7 +302,10 @@ public class AvatarFromSysML {
                 AvatarAttribute aa = new AvatarAttribute(blk.getTimer(i).getName(), AvatarType.TIMER, theBlock, null);
                 theBlock.addOriginalAttribute(aa);
                 aa.setAsConstant(false);
-            }
+                aa = new AvatarAttribute(blk.getTimer(i).getName(), AvatarType.TIMER, theBlock, null);
+                theBlock.addAttribute(aa);
+                aa.setAsConstant(false);
+           }
             // add Methods
             size = blk.getNbMethods();
             for (int i = 0; i < size; i++) {
@@ -291,6 +327,12 @@ public class AvatarFromSysML {
                     AvatarAttribute ret = new AvatarAttribute("return", AvatarType.UNDEFINED, theBlock, null);
                     ret.setDataType(adt);
                     am.addOriginalReturnParameter(ret);
+                    int dtsize = adt.getFullSize();
+                    for (int j = 0; j < dtsize; j++) {
+                        ret = new AvatarAttribute("return__" + adt.getFieldString(j),
+                                 adt.getFieldStringType(j), theBlock, null);
+                        am.addReturnParameter(ret);
+                    }
                 }
             }
             // add Signals (build profile delayed)
@@ -347,8 +389,11 @@ public class AvatarFromSysML {
                     theSourceState = getState(states[i], theBlock);
                     asm.addElement(theSourceState);
                     if (stateType == AvatarFromSysMLSyntax.STXRANDOMSTATE) {
-                        ((AvatarRandom) theSourceState).setValues(states[i].getMinValue(), states[i].getMaxValue());
-                        ((AvatarRandom) theSourceState).setVariable(states[i].getVariable());
+                        ((AvatarRandom) theSourceState).setOriginalValues(states[i].getMinValue(), states[i].getMaxValue());
+                        ((AvatarRandom) theSourceState).setValues(
+                                states[i].getMinValue().replaceAll("\\.", "__"),
+                                states[i].getMaxValue().replaceAll("\\.", "__"));
+                        ((AvatarRandom) theSourceState).setVariable(states[i].getVariable().replaceAll("\\.", "__"));
                     } else if (stateType == AvatarFromSysMLSyntax.STXSTARTSTATE)
                         asm.setStartState((AvatarStartState) theSourceState);
                 // add transitions
@@ -371,11 +416,19 @@ public class AvatarFromSysML {
                         transitionList.add(theTransition);
                         asm.addElement(theTransition);
                         theSourceState.addNext(theTransition);
-                        theTransition.setGuard("",transition.getGuard());
+                        if (transition.getGuard() != null) {
+                            theTransition.setGuard(
+                                    "[" + transition.getGuard().replaceAll("\\.", "__") + "]",
+                                    "[" + transition.getGuard() + "]");
+                        }
                         String minDelay = transition.getMinDelay().trim();
                         String maxDelay = transition.getMaxDelay().trim();
                         if (minDelay.equals(maxDelay)) maxDelay = "";
-                        theTransition.setDelays("","", minDelay, maxDelay);
+                        theTransition.setDelays(
+                                minDelay.replaceAll("\\.", "__"),
+                                maxDelay.replaceAll("\\.", "__"),
+                                minDelay,
+                                maxDelay);
                         setDistributionLaw(theTransition, transition.getDelayDistributionLaw(),transition.getDelayExtra(), transition);
                         // add actions
                         List<StxAction> actions = transition.getActions(); // should exist only in some cases...
@@ -383,18 +436,31 @@ public class AvatarFromSysML {
                         for (int k = 0; k < asize; k++) {
                             StxAction action = actions.get(k);
                             if(action.getType() == AvatarFromSysMLSyntax.STXASSIGNACTION){
-                                String leftHandStr = action.getTarget();
+                                String originalLeftHandStr = action.getTarget();
+                                String leftHandStr = extendIdent(action.getTarget().replaceAll("\\.", "__"), blk);
+                                String originalRightHandStr;
                                 String rightHandStr;
                                 StxTerm value = action.getValue();
-                                if (value instanceof StxId){ rightHandStr = ((StxId)value).getString(); }
-                                else if (value instanceof StxExpr){ rightHandStr = ((StxExpr)value).getString(); }
-                                else { rightHandStr = extendCall((StxCall)value,blk); }
-                                theTransition.addAction("", leftHandStr + "=" + rightHandStr);
+                                if (value instanceof StxId) {
+                                    originalRightHandStr = ((StxId)value).getString();
+                                    rightHandStr = ((StxId)value).getString().replaceAll("\\.", "__");
+                                }
+                                else if (value instanceof StxExpr){
+                                    originalRightHandStr = ((StxExpr)value).getString();
+                                    rightHandStr = ((StxExpr)value).getString().replaceAll("\\.", "__");
+                                }
+                                else {
+                                    originalRightHandStr = extendOriginalCall((StxCall)value,blk);
+                                    rightHandStr = extendCall((StxCall)value,blk);
+                                }
+                                theTransition.addAction(leftHandStr + "=" + rightHandStr,
+                                        originalLeftHandStr + "=" + originalRightHandStr);
                             }
                             else { // STXMETHODACTION
                                 if (action.getValue() instanceof StxCall) { // else ERROR
+                                    String originalTermStr = extendOriginalCall((StxCall)action.getValue(),blk);
                                     String termStr = extendCall((StxCall)action.getValue(),blk);
-                                    theTransition.addAction("", termStr);
+                                    theTransition.addAction(termStr, originalTermStr);
                                 }
                             }
                         }
@@ -474,9 +540,22 @@ public class AvatarFromSysML {
                                     int nbParam = sendPayload.size();
                                     for(int u = 0; u < nbParam; u++) {
                                         StxTerm p = sendPayload.get(u);
-                                        if (p instanceof StxId){  state.addOriginalValue(((StxId)p).getString()); }
-                                        else if (p instanceof StxExpr){ state.addOriginalValue( ((StxExpr)p).getString() ); }
-                                        else { state.addOriginalValue( extendCall((StxCall)p,blk) ); }
+                                        if (p instanceof StxId) {
+                                            state.addOriginalValue(((StxId)p).getString());
+                                            String[] ids = extendPath(
+                                                    ((StxId)p).getString().replaceAll("\\.", "__"),
+                                                    blk).split(",");
+                                            int isize = ids.length;
+                                            for(int w = 0; w < isize; w++)  state.addValue(ids[w]);
+                                        }
+                                        else if (p instanceof StxExpr) {
+                                            state.addOriginalValue( ((StxExpr)p).getString() );
+                                            state.addValue( ((StxExpr)p).getString().replaceAll("\\.", "__"));
+                                        }
+                                        else {
+                                            state.addOriginalValue(extendOriginalCall((StxCall)p,blk));
+                                            state.addValue(extendCall((StxCall)p,blk));
+                                        }
                                     }
                                 }
                             }
@@ -514,7 +593,11 @@ public class AvatarFromSysML {
                                     HashMap<String, String> receivePayload = transition.getReceivePayload();
                                     int nbParams = profile.getSize();
                                     for (int k = 0; k < nbParams; k++) {
-                                        state.addOriginalValue(receivePayload.get(profile.getFieldName(k)));
+                                        String value = receivePayload.get(profile.getFieldName(k));
+                                        state.addOriginalValue(value);
+                                        String[] ids = extendPath(value.replaceAll("\\.", "__"), blk).split(",");
+                                        int isize = ids.length;
+                                        for(int w = 0; w < isize; w++)  state.addValue(ids[w]);
                                     }
                                 }
                             }
@@ -531,12 +614,14 @@ public class AvatarFromSysML {
                                              "set-timer transition has no associated timer", transition.getRleft()));
                                  }
                                  state.setTimer(getTimerByName(transition.getTimer(), theBlock));
-                                 if (transition.getSendPayload() == null || transition.getSendPayload().size() != 1) {
+                                 if (transition.getSendPayload() == null || transition.getSendPayload().size() != 1
+                                        || !(transition.getSendPayload().get(0) instanceof StxExpr)) {
                                      addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getLeft(),
                                              "payload of set-timer transition is not well formed", transition.getRleft()));
                                      continue;
                                  }
                                  state.setTimerValue(((StxExpr)transition.getSendPayload().get(0)).getString().replaceAll(".","__"));
+                                 state.setTimerOriginalValue(((StxExpr)transition.getSendPayload().get(0)).getString());
                              }
                              else  {
                                  addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getLeft(),
@@ -644,11 +729,20 @@ public class AvatarFromSysML {
                     addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, ss.getLeft(),
                      "message profile uses undefined datatype " + type));
                 }
-                aa = new AvatarAttribute(ss.getFieldName(i), AvatarType.UNDEFINED, b, null);
+                String aaName = ss.getFieldName(i);
+                aa = new AvatarAttribute(aaName, AvatarType.UNDEFINED, b, null);
                 aa.setDataType(adt);
                 am.addOriginalParameter(aa);
                 aa.setAsConstant(false);
-            }
+                aaName = aaName + "__";
+                int dtsize = adt.getFullSize();
+                for (int j = 0; j < dtsize; j++) {
+                    aa = new AvatarAttribute(aaName + adt.getFieldString(j),
+                             adt.getFieldStringType(j), b, null);
+                    am.addParameter(aa);
+                    aa.setAsConstant(false);
+                }
+           }
         }
     }
     private String getStxAttributeType(String name, StxBlock blk){
@@ -658,7 +752,6 @@ public class AvatarFromSysML {
         }
         return null;
     }
-/*
     private String getStxPathType(String s, StxBlock b) {
         String[] path = s.split("__");
         String type = getStxAttributeType(path[0], b);
@@ -681,8 +774,40 @@ public class AvatarFromSysML {
         }
         return type;
     }
- */
+    private String extendString;
+    private AvatarDataType extendType;
+    private String extendPath(String path, StxBlock b) {
+        extendString = getStxPathType(path, b);
+        if (extendString.equals("Integer") || extendString.equals("Boolean")) {
+            extendType = null;
+            return path;
+        }
+        extendType = avSpec.getDataTypeByName(extendString);
+        int size = extendType.getFullSize() - 1;
+        if (size == -1) return path;
+        StringBuffer res = new StringBuffer();
+        int i;
+        for (i = 0; i < size; i++)
+            res.append(path + "__" + extendType.getFieldString(i) + ", ");
+        res.append(path + "__" + extendType.getFieldString(i));
+        return res.toString();
+    }
+    private String extendIdent (String path, StxBlock b) {
+        String result = extendPath(path, b);
+        return (result.indexOf(',') == -1 ? result : "(" + result + ")");
+    }
      private String extendCall (StxCall call, StxBlock b) {
+        StringBuffer result = new StringBuffer();
+        int size = call.getNbIdents();
+        int i;
+        for (i =0 ; i < size; i++) {
+            result.append(call.getSegment(i));
+            result.append(extendPath(call.getIdent(i), b));
+        }
+        result.append(call.getSegment(i));
+        return result.toString().replaceAll("\\.", "__");
+     }
+     private String extendOriginalCall (StxCall call, StxBlock b) {
         StringBuffer result = new StringBuffer();
         int size = call.getNbIdents();
         int i;
diff --git a/src/main/java/ui/AvatarMethod.java b/src/main/java/ui/AvatarMethod.java
index 35e25bc1ed..8fce54de90 100644
--- a/src/main/java/ui/AvatarMethod.java
+++ b/src/main/java/ui/AvatarMethod.java
@@ -250,12 +250,12 @@ public class AvatarMethod {
                     return null;
                 }
                 TraceManager.addDev("Checking input parameter");
-                if (!isAValidId(splitted[i], false, false,false, checkTypes, extraTypes)) {
+                if (!isAValidId(splitted[i], false, false,false, false, extraTypes)) {
                     TraceManager.addDev("Unvalid input type #" + i + ": " + splitted[i]);
                     return null;
                 }
 
-                if (!isAValidId(splitted[i + 1], true, true,true, false, extraTypes)) {
+                if (!isAValidId(splitted[i + 1], true, true,true, checkTypes, extraTypes)) {
                     TraceManager.addDev("Unvalid id of parameter " + splitted[i + 1]);
                     return null;
                 }
-- 
GitLab