From 3d1f3bfc073ebbc67e7a7a249cf396a83608708d Mon Sep 17 00:00:00 2001
From: Sophie Coudert <sophie.coudert@telecom-paris.fr>
Date: Sun, 16 Jun 2024 16:06:02 +0200
Subject: [PATCH] debug of error cases (buggy SysML input File) in progress

---
 .../tosysmlv2/AvatarFromSysML.java            | 36 ++++++++++++++-----
 .../tosysmlv2/AvatarFromSysMLError.java       |  4 +--
 .../tosysmlv2/AvatarFromSysMLLexer.java       |  4 +--
 .../tosysmlv2/AvatarFromSysMLParser.java      |  1 +
 .../tosysmlv2/AvatarFromSysMLSyntax.java      | 33 +++++++++++++----
 .../tosysmlv2/javacup/AvatarFromSysML.jcup    |  1 +
 6 files changed, 60 insertions(+), 19 deletions(-)

diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java
index 5e17ea1b28..df48206f65 100644
--- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java
+++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java
@@ -46,6 +46,7 @@ import java.util.function.BiConsumer;
 import avatartranslator.*;
 import avatartranslator.tosysmlv2.AvatarFromSysMLSyntax.*;
 import java_cup.runtime.ComplexSymbolFactory;
+import myutil.TraceManager;
 
 import static java.lang.System.out;
 
@@ -79,23 +80,32 @@ public class AvatarFromSysML {
             e.printStackTrace(out);
             return new AvatarSpecification("DummySpec", null);
         }
+        TraceManager.addDev("Parsing Model");
         try { stxSpec = parser.parseModel(); }
         catch (java.lang.Exception e) {
             e.printStackTrace(out);
             return new AvatarSpecification("DummySpec", null);
         }
-        if (stxSpec == null) return new AvatarSpecification("DummySpec", null);
+        if (stxSpec == null) {
+            for(AvatarFromSysMLError e : parser.getErrors())
+                TraceManager.addDev(e.toString());
+            return new AvatarSpecification("DummySpec", null);
+        }
         errors = stxSpec.getErrors();
+        TraceManager.addDev("Building Specification");
         avSpec = new AvatarSpecification("FromSysMLV2_EXAMPLE_SPECIFICATION",null);
         transitionList.clear();
         signalMap.clear();
         blockMap.clear();
         stateMap.clear();
+        TraceManager.addDev("Building DataTypes");
         buildDataTypes();
+        TraceManager.addDev("Building DataTypes");
         buildBlocks();
+        TraceManager.addDev("Building DataTypes");
         buildRelations();
         for(AvatarFromSysMLError e : errors)
-            System.out.println(e.toString());
+            TraceManager.addDev(e.toString());
 /*        for (AvatarBlock blk : avSpec.getListOfBlocks()) {
             for (AvatarStateMachineElement asme : blk.getStateMachine().getListOfElements()) {
                 if (asme.getNexts().size() == 1 &&
@@ -107,7 +117,6 @@ public class AvatarFromSysML {
                             ((AvatarTransition)asme).getDelayExtra2() + "%%%%%%%%%%%%%");
             }
         } */
-        System.out.println("$$$$$$$$$$ DONE $$$$$$$$$$$$");
         return avSpec;
     }
 
@@ -393,15 +402,20 @@ public class AvatarFromSysML {
             AvatarStateMachineElement theSourceState;
             size = states.length;
             for (int i = 0; i < size; i++) {
+                byte stateType = states[i].getType();
+                boolean undeclaredState = false;
                 if (! states[i].isDeclared()) {
                     addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR,
                             "state " + theBlock.getName() + "." + states[i].getName() + " is used but not declared"));
-                    continue;
+                    stateType = AvatarFromSysMLSyntax.STXSTANDARDSTATE;
+                    undeclaredState = true;
                 }
-                byte stateType = states[i].getType();
                 if (stateType != AvatarFromSysMLSyntax.STXPRESENDSTATE &&
                         stateType != AvatarFromSysMLSyntax.STXPRERECEIVESTATE &&
                         stateType != AvatarFromSysMLSyntax.STXSTOPSTATE ) {
+                    if (undeclaredState) {
+                        states[i].setType(AvatarFromSysMLSyntax.STXSTANDARDSTATE);
+                    }
                     theSourceState = getState(states[i], theBlock);
                     asm.addElement(theSourceState);
                     if (stateType == AvatarFromSysMLSyntax.STXRANDOMSTATE) {
@@ -424,8 +438,8 @@ public class AvatarFromSysML {
                         }
                         if (! transition.isDeclared()) {
                             addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getRleft(),
-                                    "transition from state " + states[i].getName() + " in block" + theBlock.getName() +
-                                            "." + states[i].getName() + " is used but not declared" ));
+                                    "transition request in state " + states[i].getName() + " in block" + theBlock.getName() +
+                                            " has no associated declaration" ));
                             continue;
                         }
                         AvatarTransition theTransition = new AvatarTransition(theBlock,"", null);
@@ -870,8 +884,12 @@ public class AvatarFromSysML {
             for (int i = 0; i < size; i++) {
                 StxChannel c = r.getChannel(i);
                 c.commuteSignals(r.getBlock1().getName());
-                theRelation.addSignals(getSignal(c.getSignalA()),getSignal(c.getSignalB()));
-            }
+                if (c.getSignalA() != null && c.getSignalB() != null)
+                    theRelation.addSignals(getSignal(c.getSignalA()),getSignal(c.getSignalB()));
+                else
+                 addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, c.getLeft(),
+                 "missing signal binding for channel"));
+           }
         }
     }
 }
diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLError.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLError.java
index 92f7a6b7ed..2fd8694210 100644
--- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLError.java
+++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLError.java
@@ -45,10 +45,10 @@ public class AvatarFromSysMLError {
         else
             res.append("BUG ");
         if (location != null)
-            res.append("(l" + location.getLine() + ",c" + location.getColumn() + ")");
+            res.append("(l" + (location.getLine() + 1) + ",c" + (location.getColumn() + 1) + ")");
         res.append(": " + message);
         if (reference != null)
-            res.append(" (c.f. l" + reference.getLine() + ",c" + reference.getColumn() + ")");
+            res.append(" (c.f. l" + (reference.getLine() + 1) + ",c" + (reference.getColumn() + 1) + ")");
         res.append("\n");
         return res.toString();
     }
diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLLexer.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLLexer.java
index 6767651e43..796f4fa4a2 100644
--- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLLexer.java
+++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLLexer.java
@@ -1,4 +1,4 @@
-/* The following code was generated by JFlex 1.4.3 on 16/06/2024 11:17 */
+/* The following code was generated by JFlex 1.4.3 on 16/06/2024 13:02 */
 
 package avatartranslator.tosysmlv2;
 import java_cup.runtime.*;
@@ -9,7 +9,7 @@ import avatartranslator.tosysmlv2.AvatarFromSysMLSyntax.*;
 /**
  * This class is a scanner generated by 
  * <a href="http://www.jflex.de/">JFlex</a> 1.4.3
- * on 16/06/2024 11:17 from the specification file
+ * on 16/06/2024 13:02 from the specification file
  * <tt>__AvatarFromSysMLLexer__.jflex</tt>
  */
 public class AvatarFromSysMLLexer implements java_cup.runtime.Scanner {
diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParser.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParser.java
index c173fe36d9..45c582d25d 100644
--- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParser.java
+++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParser.java
@@ -1207,6 +1207,7 @@ public class AvatarFromSysMLParser extends java_cup.runtime.lr_parser {
     private StringBuffer stringAcc = new StringBuffer();
     private ArrayList<AvatarFromSysMLError> errors;
     private void addError(AvatarFromSysMLError _err) { errors.add(_err); }
+    public ArrayList<AvatarFromSysMLError> getErrors() { return errors; }
     private StxStructure theStructure;
     private HashMap<String,StxDataType> dataTypeMap;
     private StxRelation theRelation;
diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java
index 2122ec9016..4434c0a634 100644
--- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java
+++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java
@@ -504,19 +504,28 @@ public class AvatarFromSysMLSyntax {
             }
             return false;
         }
-        private ArrayList<AvatarFromSysMLError> errors;
+
         private class Complete implements BiConsumer<StxField, String> {
             List<AvatarFromSysMLError> errors;
-            public Complete(List<AvatarFromSysMLError> l){ errors = l; };
+            private boolean[] inProfile;
+            public boolean[] getInProfile() { return inProfile; }
+            public Complete(List<AvatarFromSysMLError> l){
+                errors = l;
+                inProfile = new boolean[inMessage.getSize()];
+                for (int i = 0; i < inMessage.getSize(); i++) { inProfile[i] = false; }
+            };
             public void accept(StxField o, String i) {
                 int index = inMessage.indexOf(i);
-                if (errors != null && index == -1) {
+                if ( index == -1) {
                     errors.add(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, o.getLeft(),"Field " +
                             o.getName() + " of out-message is " +
                             "associated to a field (" + i + ") in in-message that does not exist", inMessage.getLeft()));
                 }
-                o.setType(inMessage.fields.get(index).getType());
-                fields.set(index, o);
+                else {
+                    inProfile[index] = true;
+                    o.setType(inMessage.fields.get(index).getType());
+                    fields.set(index, o);
+                }
             }
         }
         public void complete(List<AvatarFromSysMLError> errors) {
@@ -527,7 +536,19 @@ public class AvatarFromSysMLSyntax {
                     return;
                 }
             if (fieldMap.isEmpty()) for (StxField f: inMessage.fields) fields.add(f);
-            else fieldMap.forEach(new Complete(errors));
+            else {
+                Complete cmp = new Complete(errors);
+                fieldMap.forEach(cmp);
+                boolean[] inProfile = cmp.getInProfile();
+                for(int i =0; i < inProfile.length; i++)
+                    if (! inProfile[i]) {
+                        errors.add(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, getLeft(),
+                            "out-message has no field associated to in-message field " + inMessage.getFieldName(i) + " --> field added",
+                                inMessage.getLeft()));
+                        fields.set(i, new StxField(inMessage.getFieldName(i),inMessage.getFieldType(i)));
+                    }
+            }
+
             channel = inMessage.channel;
             if (channel == null)
                 if (errors != null) {
diff --git a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup
index d015a8dd46..e11ccec9f9 100644
--- a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup
+++ b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup
@@ -62,6 +62,7 @@ parser code {:
     private StringBuffer stringAcc = new StringBuffer();
     private ArrayList<AvatarFromSysMLError> errors;
     private void addError(AvatarFromSysMLError _err) { errors.add(_err); }
+    public ArrayList<AvatarFromSysMLError> getErrors() { return errors; }
     private StxStructure theStructure;
     private HashMap<String,StxDataType> dataTypeMap;
     private StxRelation theRelation;
-- 
GitLab