From 2e390eeecba8a42bba0583268b5c9dbed10a7b87 Mon Sep 17 00:00:00 2001
From: jerray <jawher.jerray@eurecom.fr>
Date: Tue, 9 Jan 2024 11:16:44 +0100
Subject: [PATCH] fix a bug in Avatar when handling an Else guard

---
 .../avatartranslator/AvatarGuardElse.java     | 19 ++++++++++---------
 .../avatartranslator/AvatarSpecification.java |  4 ++--
 .../avatartranslator/AvatarStateMachine.java  |  8 +++++---
 .../java/ui/AvatarDesignPanelTranslator.java  | 18 ++++++++++++++++++
 4 files changed, 35 insertions(+), 14 deletions(-)

diff --git a/src/main/java/avatartranslator/AvatarGuardElse.java b/src/main/java/avatartranslator/AvatarGuardElse.java
index 3afe3e0fe5..63ea73ad60 100644
--- a/src/main/java/avatartranslator/AvatarGuardElse.java
+++ b/src/main/java/avatartranslator/AvatarGuardElse.java
@@ -51,31 +51,32 @@ public class AvatarGuardElse extends AvatarGuard {
     public AvatarGuardElse () {
     }
 
-    public AvatarGuard getRealGuard (AvatarStateMachineElement precedent) {
+    public AvatarGuard getRealGuard(AvatarStateMachineElement precedent) {
         AvatarGuard result = null;
 
-        for (AvatarStateMachineElement asme: precedent.getNexts ()) {
+        for (AvatarStateMachineElement asme: precedent.getNexts()) {
             if (! (asme instanceof AvatarTransition))
                 continue;
 
-            AvatarGuard guard = ((AvatarTransition) asme).getGuard ();
+            AvatarGuard guard = ((AvatarTransition) asme).getGuard();
             if (guard == this)
                 continue;
 
-            if (guard == null || !guard.isGuarded ())
+            if (guard == null || !guard.isGuarded())
                 // another guard is empty: else will never trigger
                 // FIXME: add warning
-                return new AvatarConstantGuard (AvatarConstant.FALSE);
+                return new AvatarConstantGuard(AvatarConstant.FALSE);
 
-            if (guard.isElseGuard ())
+            if (guard.isElseGuard())
                 // there were two else guards... Shouldn't happen
                 // FIXME: add warning
-                continue;
+                // continue;
+                return null;
 
             if (result == null)
-                result = ((AvatarComposedGuard) guard).getOpposite ();
+                result = ((AvatarComposedGuard) guard).getOpposite();
             else
-                result = AvatarGuard.addGuard (result, ((AvatarComposedGuard) guard).getOpposite (), "and");
+                result = AvatarGuard.addGuard(result, ((AvatarComposedGuard) guard).getOpposite(), "and");
         }
 
         return result;
diff --git a/src/main/java/avatartranslator/AvatarSpecification.java b/src/main/java/avatartranslator/AvatarSpecification.java
index 74272690f6..22a070ba08 100644
--- a/src/main/java/avatartranslator/AvatarSpecification.java
+++ b/src/main/java/avatartranslator/AvatarSpecification.java
@@ -1573,8 +1573,8 @@ public class AvatarSpecification extends AvatarElement implements IBSParamSpec {
             return;
 
         for (AvatarStateMachineElement asme : asm.getListOfElements()) {
-            if (!(asme instanceof AvatarState))
-                continue;
+            // if (!(asme instanceof AvatarState))
+            //    continue;
 
             //TraceManager.addDev("Working with state " + asme.getNiceName());
             for (AvatarStateMachineElement next : asme.getNexts()) {
diff --git a/src/main/java/avatartranslator/AvatarStateMachine.java b/src/main/java/avatartranslator/AvatarStateMachine.java
index c72f78a718..518777832d 100644
--- a/src/main/java/avatartranslator/AvatarStateMachine.java
+++ b/src/main/java/avatartranslator/AvatarStateMachine.java
@@ -2202,9 +2202,11 @@ public class AvatarStateMachine extends AvatarElement {
                 AvatarTransition at = (AvatarTransition) asme;
 
                 // Guard
-                val = at.getGuard().toString();
-                if (MyMath.hasIntegerValueOverMax(val, maxV)) {
-                    invalids.add(this);
+                if (at.getGuard() != null) {
+                    val = at.getGuard().toString();
+                    if (MyMath.hasIntegerValueOverMax(val, maxV)) {
+                        invalids.add(this);
+                    }
                 }
 
                 // Delays
diff --git a/src/main/java/ui/AvatarDesignPanelTranslator.java b/src/main/java/ui/AvatarDesignPanelTranslator.java
index dd3ca1f65f..34ef2e9174 100644
--- a/src/main/java/ui/AvatarDesignPanelTranslator.java
+++ b/src/main/java/ui/AvatarDesignPanelTranslator.java
@@ -132,6 +132,24 @@ public class AvatarDesignPanelTranslator {
             addWarning(ce);
         }
 
+        for (AvatarBlock block : as.getListOfBlocks()) {
+            for (AvatarStateMachineElement asme : block.getStateMachine().getListOfElements()) {
+                if (asme instanceof AvatarTransition) {
+                    AvatarTransition at = (AvatarTransition) asme;
+                    if (at.getGuard() == null) {
+                        UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Error while using Else in Guard");
+                        ce.setTDiagramPanel(adp.getAvatarBDPanel());
+                        Object o = at.getReferenceObject();
+                        if (o instanceof TGComponent) {
+                            ce.setTGComponent((TGComponent) o);
+                            ce.setTDiagramPanel(((TGComponent) o).getTDiagramPanel());
+                        }
+                        addCheckingError(ce);
+                    }
+                }
+            }
+        }
+
         if (checkingErrors.size() == 0) {
             ArrayList<AvatarError> list = AvatarSyntaxChecker.checkSyntaxErrors(as);
             for (AvatarError ar : list) {
-- 
GitLab