From c27f7e2580bd4ef2bbbb821794900c30026e8ee4 Mon Sep 17 00:00:00 2001
From: dgelessus <dgelessus@users.noreply.github.com>
Date: Tue, 7 Nov 2023 13:50:54 +0100
Subject: [PATCH] Work around Event-B EMF bug that broke adding a variant

Modifying an already existing variant worked, but when adding a new
variant to a machine that didn't have one, Rodin complained that the
variant has an empty label.

This fix requires increasing the minimum Event-B EMF version to
guarantee that Variant.setName exists.
---
 org.eventb.texteditor.feature/feature.xml     |  1 +
 org.eventb.texteditor.ui/META-INF/MANIFEST.MF |  6 +--
 org.eventb.texttools/META-INF/MANIFEST.MF     |  6 +--
 .../parsing/TransformationVisitor.java        | 50 ++++++++++---------
 4 files changed, 34 insertions(+), 29 deletions(-)

diff --git a/org.eventb.texteditor.feature/feature.xml b/org.eventb.texteditor.feature/feature.xml
index 6bfea24..abf50fb 100644
--- a/org.eventb.texteditor.feature/feature.xml
+++ b/org.eventb.texteditor.feature/feature.xml
@@ -9,6 +9,7 @@
    <description>
       A text editor for the Rodin platform to edit Event-B models
 --- Release History ---
+3.5.1 - Fix "Empty label" error when adding a variant to a machine
 3.5.0 - Compatibility with EventB-EMF 7.0.0 - fixes CamilleX dependency conflict. Fixed OOM error when top-level end keyword is missing.
 3.4.1 - Internal updates to the build process - no visible changes.
 3.4.0 - Release for Rodin 3.5 and related dependencies
diff --git a/org.eventb.texteditor.ui/META-INF/MANIFEST.MF b/org.eventb.texteditor.ui/META-INF/MANIFEST.MF
index a87e4f9..80143c7 100644
--- a/org.eventb.texteditor.ui/META-INF/MANIFEST.MF
+++ b/org.eventb.texteditor.ui/META-INF/MANIFEST.MF
@@ -16,9 +16,9 @@ Require-Bundle: org.eclipse.core.resources;bundle-version="[3.8.1,4.0.0)",
  org.eclipse.ui.workbench.texteditor,
  org.eventb.core;bundle-version="[3.1.0,4.0.0)",
  org.eventb.core.ast;bundle-version="[3.1.0,4.0.0)",
- org.eventb.emf.core;bundle-version="[4.0.0,7.0.0)",
- org.eventb.emf.formulas;bundle-version="[1.4.0,3.0.0)",
- org.eventb.emf.persistence;bundle-version="[3.1.1,5.0.0)";visibility:=reexport,
+ org.eventb.emf.core;bundle-version="[5.0.0,7.0.0)",
+ org.eventb.emf.formulas;bundle-version="[1.5.0,3.0.0)",
+ org.eventb.emf.persistence;bundle-version="[3.6.0,5.0.0)";visibility:=reexport,
  org.eventb.texteditor.parsers;bundle-version="[3.5.1,3.6.0)",
  org.eventb.texttools;bundle-version="[3.5.1,3.6.0)";visibility:=reexport,
  org.eventb.ui;bundle-version="[3.0.0,4.0.0)";visibility:=reexport,
diff --git a/org.eventb.texttools/META-INF/MANIFEST.MF b/org.eventb.texttools/META-INF/MANIFEST.MF
index 8e0ddf3..ed60264 100644
--- a/org.eventb.texttools/META-INF/MANIFEST.MF
+++ b/org.eventb.texttools/META-INF/MANIFEST.MF
@@ -15,9 +15,9 @@ Require-Bundle: org.eclipse.core.resources;bundle-version="[3.8.1,4.0.0)",
  org.eclipse.jface.text;bundle-version="[3.6.0,4.0.0)",
  org.eventb.core;bundle-version="[3.1.0,4.0.0)",
  org.eventb.core.ast;bundle-version="[3.1.0,4.0.0)",
- org.eventb.emf.core;bundle-version="[4.0.0,7.0.0)",
- org.eventb.emf.formulas;bundle-version="[1.4.0,3.0.0)",
- org.eventb.emf.persistence;bundle-version="[3.1.1,5.0.0)",
+ org.eventb.emf.core;bundle-version="[5.0.0,7.0.0)",
+ org.eventb.emf.formulas;bundle-version="[1.5.0,3.0.0)",
+ org.eventb.emf.persistence;bundle-version="[3.6.0,5.0.0)",
  org.eventb.texteditor.parsers;bundle-version="[3.5.1,3.6.0)",
  org.rodinp.core;bundle-version="[1.7.0,2.0.0)"
 Bundle-Vendor: Heinrich-Heine University Dusseldorf
diff --git a/org.eventb.texttools/src/org/eventb/texttools/internal/parsing/TransformationVisitor.java b/org.eventb.texttools/src/org/eventb/texttools/internal/parsing/TransformationVisitor.java
index 4e034fc..7e7c9d7 100644
--- a/org.eventb.texttools/src/org/eventb/texttools/internal/parsing/TransformationVisitor.java
+++ b/org.eventb.texttools/src/org/eventb/texttools/internal/parsing/TransformationVisitor.java
@@ -11,29 +11,6 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Stack;
 
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eventb.emf.core.EventBCommented;
-import org.eventb.emf.core.EventBElement;
-import org.eventb.emf.core.EventBNamed;
-import org.eventb.emf.core.EventBNamedCommentedPredicateElement;
-import org.eventb.emf.core.EventBObject;
-import org.eventb.emf.core.context.Axiom;
-import org.eventb.emf.core.context.Context;
-import org.eventb.emf.core.context.ContextFactory;
-import org.eventb.emf.core.machine.Action;
-import org.eventb.emf.core.machine.Convergence;
-import org.eventb.emf.core.machine.Event;
-import org.eventb.emf.core.machine.Guard;
-import org.eventb.emf.core.machine.Invariant;
-import org.eventb.emf.core.machine.Machine;
-import org.eventb.emf.core.machine.MachineFactory;
-import org.eventb.emf.core.machine.Variant;
-import org.eventb.texttools.TextPositionUtil;
-import org.eventb.texttools.model.texttools.TextRange;
-import org.eventb.texttools.model.texttools.TexttoolsFactory;
-
 import de.be4.eventb.core.parser.analysis.DepthFirstAdapter;
 import de.be4.eventb.core.parser.node.AAction;
 import de.be4.eventb.core.parser.node.AAnticipatedConvergence;
@@ -67,6 +44,30 @@ import de.hhu.stups.sablecc.patch.IToken;
 import de.hhu.stups.sablecc.patch.PositionedNode;
 import de.hhu.stups.sablecc.patch.SourcePosition;
 
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eventb.core.IVariant;
+import org.eventb.emf.core.EventBCommented;
+import org.eventb.emf.core.EventBElement;
+import org.eventb.emf.core.EventBNamed;
+import org.eventb.emf.core.EventBNamedCommentedPredicateElement;
+import org.eventb.emf.core.EventBObject;
+import org.eventb.emf.core.context.Axiom;
+import org.eventb.emf.core.context.Context;
+import org.eventb.emf.core.context.ContextFactory;
+import org.eventb.emf.core.machine.Action;
+import org.eventb.emf.core.machine.Convergence;
+import org.eventb.emf.core.machine.Event;
+import org.eventb.emf.core.machine.Guard;
+import org.eventb.emf.core.machine.Invariant;
+import org.eventb.emf.core.machine.Machine;
+import org.eventb.emf.core.machine.MachineFactory;
+import org.eventb.emf.core.machine.Variant;
+import org.eventb.texttools.TextPositionUtil;
+import org.eventb.texttools.model.texttools.TextRange;
+import org.eventb.texttools.model.texttools.TexttoolsFactory;
+
 public class TransformationVisitor extends DepthFirstAdapter {
 
 	private IDocument document;
@@ -217,6 +218,9 @@ public class TransformationVisitor extends DepthFirstAdapter {
 		TextPositionUtil.annotatePosition(newNode, createTextRange(node));
 
 		handleComment(newNode, node.getComments());
+		// Work around an Event-B EMF bug that sets an explicit empty label and suppresses the default label.
+		// TODO Allow a label here in the Camille grammar?
+		newNode.setName(IVariant.DEFAULT_LABEL);
 
 		final TFormula exprToken = node.getExpression();
 		final String exprString = exprToken.getText();
-- 
GitLab