From 0cf8520d6e8109bffc0e682fdfccd51a18e2140f Mon Sep 17 00:00:00 2001
From: Sebastian Krings <sebastian@krin.gs>
Date: Wed, 2 Jan 2013 15:33:12 +0100
Subject: [PATCH] translation of units pragmas in machines, contexts next

---
 .../core/translator/pragmas/UnitPragma.java   | 26 +++++++++++++++++++
 .../eventb/translator/ContextTranslator.java  | 23 +++++++++++++---
 .../translator/internal/ModelTranslator.java  | 21 +++++++++++++--
 .../ui/eventb/StartUnitAnalysisHandler.java   |  8 +++---
 4 files changed, 69 insertions(+), 9 deletions(-)
 create mode 100644 de.prob.core/src/de/prob/core/translator/pragmas/UnitPragma.java

diff --git a/de.prob.core/src/de/prob/core/translator/pragmas/UnitPragma.java b/de.prob.core/src/de/prob/core/translator/pragmas/UnitPragma.java
new file mode 100644
index 00000000..851fa593
--- /dev/null
+++ b/de.prob.core/src/de/prob/core/translator/pragmas/UnitPragma.java
@@ -0,0 +1,26 @@
+package de.prob.core.translator.pragmas;
+
+import de.prob.prolog.output.IPrologTermOutput;
+
+public class UnitPragma implements IPragma {
+	private String definedIn;
+	private String attachedTo;
+	private String content;
+
+	public UnitPragma(String definedIn, String attachedTo, String content) {
+		this.definedIn = definedIn;
+		this.attachedTo = attachedTo;
+		this.content = content;
+	}
+
+	@Override
+	public void output(IPrologTermOutput pout) {
+		pout.openTerm("pragma");
+		pout.printAtom("unit");
+		pout.printAtom(definedIn);
+		pout.printAtom(attachedTo);
+		pout.printAtom(content);
+		pout.closeTerm();
+	}
+
+}
diff --git a/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java b/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java
index 62fb49e4..bc24a254 100644
--- a/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java
+++ b/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java
@@ -32,9 +32,11 @@ import org.eventb.core.ISCMachineRoot;
 import org.eventb.core.ast.FormulaFactory;
 import org.eventb.core.ast.ITypeEnvironment;
 import org.eventb.core.seqprover.IConfidence;
+import org.rodinp.core.IAttributeType;
 import org.rodinp.core.IRodinElement;
 import org.rodinp.core.IRodinFile;
 import org.rodinp.core.IRodinProject;
+import org.rodinp.core.RodinCore;
 import org.rodinp.core.RodinDBException;
 
 import de.be4.classicalb.core.parser.analysis.pragma.internal.ClassifiedPragma;
@@ -52,8 +54,10 @@ import de.be4.classicalb.core.parser.node.PPredicate;
 import de.be4.classicalb.core.parser.node.PSet;
 import de.be4.classicalb.core.parser.node.TIdentifierLiteral;
 import de.hhu.stups.sablecc.patch.SourcePosition;
+import de.prob.core.internal.Activator;
 import de.prob.core.translator.TranslationFailedException;
 import de.prob.core.translator.pragmas.IPragma;
+import de.prob.core.translator.pragmas.UnitPragma;
 import de.prob.eventb.translator.internal.EProofStatus;
 import de.prob.eventb.translator.internal.ProofObligation;
 import de.prob.eventb.translator.internal.SequentSource;
@@ -112,7 +116,6 @@ public final class ContextTranslator extends AbstractComponentTranslator {
 				if (rodinFile.exists()) {
 					ISCContextRoot root = (ISCContextRoot) rodinFile.getRoot();
 					collectProofInfo(root);
-					collectPragmas(root);
 				}
 			} catch (Exception e) {
 				// We do not guarantee to include proof infos. If something goes
@@ -124,11 +127,23 @@ public final class ContextTranslator extends AbstractComponentTranslator {
 			Assert.isTrue(machine_root.getRodinFile().isConsistent());
 		}
 		translateContext();
-
+		collectPragmas();
 	}
 
-	private void collectPragmas(ISCContextRoot origin) {
-		// TODO
+	private void collectPragmas() throws RodinDBException {
+		// unit pragma, attached to constants
+		final IAttributeType.String UNITATTRIBUTE = RodinCore
+				.getStringAttrType(Activator.PLUGIN_ID + ".unitPragmaAttribute");
+
+		final ISCConstant[] constants = context.getSCConstants();
+
+		for (final ISCConstant constant : constants) {
+			if (constant.hasAttribute(UNITATTRIBUTE)) {
+				pragmas.add(new UnitPragma(getResource(), constant
+						.getIdentifierString(), constant
+						.getAttributeValue(UNITATTRIBUTE)));
+			}
+		}
 	}
 
 	private void collectProofInfo(ISCContextRoot origin)
diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/ModelTranslator.java b/de.prob.core/src/de/prob/eventb/translator/internal/ModelTranslator.java
index fd794bea..db29b3ae 100644
--- a/de.prob.core/src/de/prob/eventb/translator/internal/ModelTranslator.java
+++ b/de.prob.core/src/de/prob/eventb/translator/internal/ModelTranslator.java
@@ -35,13 +35,16 @@ import org.eventb.core.ISCVariable;
 import org.eventb.core.ISCVariant;
 import org.eventb.core.ISCWitness;
 import org.eventb.core.ITraceableElement;
+import org.eventb.core.IVariable;
 import org.eventb.core.ast.FormulaFactory;
 import org.eventb.core.ast.ITypeEnvironment;
 import org.eventb.core.ast.Predicate;
 import org.eventb.core.seqprover.IConfidence;
+import org.rodinp.core.IAttributeType;
 import org.rodinp.core.IElementType;
 import org.rodinp.core.IRodinElement;
 import org.rodinp.core.IRodinFile;
+import org.rodinp.core.RodinCore;
 import org.rodinp.core.RodinDBException;
 
 import de.be4.classicalb.core.parser.node.AAnticipatedEventstatus;
@@ -66,8 +69,10 @@ import de.be4.classicalb.core.parser.node.PPredicate;
 import de.be4.classicalb.core.parser.node.PSubstitution;
 import de.be4.classicalb.core.parser.node.PWitness;
 import de.be4.classicalb.core.parser.node.TIdentifierLiteral;
+import de.prob.core.internal.Activator;
 import de.prob.core.translator.TranslationFailedException;
 import de.prob.core.translator.pragmas.IPragma;
+import de.prob.core.translator.pragmas.UnitPragma;
 import de.prob.eventb.translator.AbstractComponentTranslator;
 import de.prob.eventb.translator.AssignmentVisitor;
 import de.prob.eventb.translator.ExpressionVisitor;
@@ -176,8 +181,20 @@ public class ModelTranslator extends AbstractComponentTranslator {
 		collectPragmas();
 	}
 
-	private void collectPragmas() {
-		// TODO
+	private void collectPragmas() throws RodinDBException {
+		// unit pragma, attached to constants
+		final IAttributeType.String UNITATTRIBUTE = RodinCore
+				.getStringAttrType(Activator.PLUGIN_ID + ".unitPragmaAttribute");
+
+		final IVariable[] variables = origin.getVariables();
+
+		for (final IVariable variable : variables) {
+			if (variable.hasAttribute(UNITATTRIBUTE)) {
+				pragmas.add(new UnitPragma(getResource(), variable
+						.getIdentifierString(), variable
+						.getAttributeValue(UNITATTRIBUTE)));
+			}
+		}
 	}
 
 	private void collectProofInfo() throws RodinDBException {
diff --git a/de.prob.ui/src/de/prob/ui/eventb/StartUnitAnalysisHandler.java b/de.prob.ui/src/de/prob/ui/eventb/StartUnitAnalysisHandler.java
index 3b2ce2fe..4bbe282b 100644
--- a/de.prob.ui/src/de/prob/ui/eventb/StartUnitAnalysisHandler.java
+++ b/de.prob.ui/src/de/prob/ui/eventb/StartUnitAnalysisHandler.java
@@ -56,7 +56,7 @@ import de.prob.parser.ResultParserException;
 import de.prob.prolog.term.CompoundPrologTerm;
 import de.prob.prolog.term.ListPrologTerm;
 import de.prob.prolog.term.PrologTerm;
-import de.prob.ui.pragmas.InferredUnitPragma;
+import de.prob.ui.pragmas.InferredUnitPragmaAttribute;
 
 public class StartUnitAnalysisHandler extends AbstractHandler implements
 		IHandler {
@@ -178,7 +178,8 @@ public class StartUnitAnalysisHandler extends AbstractHandler implements
 					for (IVariable var : allVariables) {
 						String variableName = var.getIdentifierString();
 						if (variables.containsKey(variableName)) {
-							var.setAttributeValue(InferredUnitPragma.ATTRIBUTE,
+							var.setAttributeValue(
+									InferredUnitPragmaAttribute.ATTRIBUTE,
 									variables.get(variableName),
 									new NullProgressMonitor());
 						}
@@ -192,7 +193,8 @@ public class StartUnitAnalysisHandler extends AbstractHandler implements
 					for (IConstant var : allConstants) {
 						String constantName = var.getIdentifierString();
 						if (variables.containsKey(constantName)) {
-							var.setAttributeValue(InferredUnitPragma.ATTRIBUTE,
+							var.setAttributeValue(
+									InferredUnitPragmaAttribute.ATTRIBUTE,
 									variables.get(constantName),
 									new NullProgressMonitor());
 						}
-- 
GitLab