From 4c220c088c99df41901685662a8532762424af27 Mon Sep 17 00:00:00 2001
From: hansene <dominik_hansen@web.de>
Date: Thu, 30 Jul 2015 14:52:55 +0200
Subject: [PATCH] Fixed bug in the sees eliminator

---
 src/main/java/de/tlc4b/TLC4B.java             |  1 +
 .../transformation/SeesEliminator.java        | 73 ++++++++++---------
 .../de/tlc4b/tlc/integration/BasicTest.java   |  1 +
 src/test/resources/composition/sees2/M1.mch   |  3 +
 src/test/resources/composition/sees2/M2.mch   |  7 ++
 src/test/resources/composition/sees2/M3.mch   |  7 ++
 src/test/resources/composition/sees2/M4.mch   |  6 ++
 7 files changed, 63 insertions(+), 35 deletions(-)
 create mode 100644 src/test/resources/composition/sees2/M1.mch
 create mode 100644 src/test/resources/composition/sees2/M2.mch
 create mode 100644 src/test/resources/composition/sees2/M3.mch
 create mode 100644 src/test/resources/composition/sees2/M4.mch

diff --git a/src/main/java/de/tlc4b/TLC4B.java b/src/main/java/de/tlc4b/TLC4B.java
index 89610f7..134a48e 100644
--- a/src/main/java/de/tlc4b/TLC4B.java
+++ b/src/main/java/de/tlc4b/TLC4B.java
@@ -154,6 +154,7 @@ public class TLC4B {
 
 	public static void test(String[] args, boolean deleteFiles)
 			throws Exception {
+		System.setProperty("apple.awt.UIElement", "true"); // avoiding pop up windows
 		TLC4BGlobals.resetGlobals();
 		TLC4BGlobals.setDeleteOnExit(deleteFiles);
 		TLC4BGlobals.setCreateTraceFile(false);
diff --git a/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java b/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java
index e728371..2e755f3 100644
--- a/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java
+++ b/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java
@@ -26,15 +26,24 @@ public class SeesEliminator extends DepthFirstAdapter {
 
 	private final Start main;
 	private final Map<String, Start> parsedMachines;
+	private final ArrayList<String> resolvedMachines;
 
 	public static void eliminateSeesClauses(Start start,
 			Map<String, Start> parsedMachines) {
-		new SeesEliminator(start, parsedMachines);
+		new SeesEliminator(start, parsedMachines, new ArrayList<String>());
 	}
 
-	private SeesEliminator(Start start, Map<String, Start> parsedMachines) {
+	private void eliminateSeenMachinesRecursively(Start start,
+			Map<String, Start> parsedMachines,
+			ArrayList<String> resolvedMachines) {
+		new SeesEliminator(start, parsedMachines, resolvedMachines);
+	}
+
+	private SeesEliminator(Start start, Map<String, Start> parsedMachines,
+			ArrayList<String> resolvedMachines) {
 		this.main = start;
 		this.parsedMachines = parsedMachines;
+		this.resolvedMachines = resolvedMachines;
 		MachineClauseSorter.sortMachineClauses(start);
 		start.apply(this);
 	}
@@ -43,14 +52,17 @@ public class SeesEliminator extends DepthFirstAdapter {
 		LinkedList<PExpression> machineNames = node.getMachineNames();
 		for (PExpression pExpression : machineNames) {
 			AIdentifierExpression id = (AIdentifierExpression) pExpression;
-			String identifierAsString = Utils.getIdentifierAsString(id
+			String machineName = Utils.getIdentifierAsString(id
 					.getIdentifier());
-			Start start = parsedMachines.get(identifierAsString);
-			DefinitionsEliminator.eliminateDefinitions(start);
-			eliminateSeesClauses(start, parsedMachines);
-			new MachineClauseAdder(main, start);
-			if(node.parent() != null){
-				node.replaceBy(null);
+			if(!resolvedMachines.contains(machineName)){
+				resolvedMachines.add(machineName);
+				Start start = parsedMachines.get(machineName);
+				DefinitionsEliminator.eliminateDefinitions(start);
+				eliminateSeenMachinesRecursively(start, parsedMachines, resolvedMachines);
+				new MachineClauseAdder(main, start);
+				if (node.parent() != null) {
+					node.replaceBy(null);
+				}
 			}
 		}
 	}
@@ -60,13 +72,14 @@ public class SeesEliminator extends DepthFirstAdapter {
 		private final HashMap<Class<? extends PMachineClause>, PMachineClause> machineClauseHashMap;
 		private final LinkedList<PMachineClause> additionalMachineClauseList;
 
-		public MachineClauseAdder(Start main, Start start) {
+		public MachineClauseAdder(Start main, Start seenMachineStart) {
 			this.machineClausesList = new ArrayList<PMachineClause>();
 			this.machineClauseHashMap = new LinkedHashMap<Class<? extends PMachineClause>, PMachineClause>();
 			this.additionalMachineClauseList = new LinkedList<PMachineClause>();
 
 			PParseUnit pParseUnit = main.getPParseUnit();
 			AAbstractMachineParseUnit machineParseUnit = (AAbstractMachineParseUnit) pParseUnit;
+			System.out.println(machineParseUnit.getHeader());
 
 			for (PMachineClause machineClause : machineParseUnit
 					.getMachineClauses()) {
@@ -75,9 +88,8 @@ public class SeesEliminator extends DepthFirstAdapter {
 						machineClause);
 			}
 
-			start.apply(this);
-			
-			
+			seenMachineStart.apply(this);
+
 			LinkedList<PMachineClause> newMachineClauseList = new LinkedList<PMachineClause>();
 			for (PMachineClause pMachineClause : machineClausesList) {
 				pMachineClause.replaceBy(null); // delete parent of clause
@@ -92,7 +104,9 @@ public class SeesEliminator extends DepthFirstAdapter {
 			AConstantsMachineClause main = (AConstantsMachineClause) machineClauseHashMap
 					.get(node.getClass());
 
-			if (main != null) {
+			if (main == null) {
+				additionalMachineClauseList.add(node);
+			} else {
 				ArrayList<PExpression> oldConstantsList = new ArrayList<PExpression>(
 						main.getIdentifiers());
 				ArrayList<PExpression> newConstantsList = new ArrayList<PExpression>();
@@ -109,8 +123,6 @@ public class SeesEliminator extends DepthFirstAdapter {
 
 				}
 				main.setIdentifiers(newConstantsList);
-			} else {
-				additionalMachineClauseList.add(node);
 			}
 		}
 
@@ -144,34 +156,27 @@ public class SeesEliminator extends DepthFirstAdapter {
 
 		@Override
 		public void caseAPropertiesMachineClause(APropertiesMachineClause node) {
-			APropertiesMachineClause main = null;
-			for (PMachineClause clause : machineClausesList) {
-				if (clause instanceof APropertiesMachineClause) {
-					main = (APropertiesMachineClause) clause;
-				}
-			}
-
-			if (main != null) {
+			APropertiesMachineClause main = (APropertiesMachineClause) machineClauseHashMap
+					.get(node.getClass());
+			if (main == null) {
+				additionalMachineClauseList.add(node);
+			} else {
 				AConjunctPredicate con = new AConjunctPredicate();
 				con.setLeft(main.getPredicates());
 				con.setRight(node.getPredicates());
 				main.setPredicates(con);
-			} else {
-				additionalMachineClauseList.add(node);
 			}
 
 		}
 
 		@Override
 		public void caseADefinitionsMachineClause(ADefinitionsMachineClause node) {
-			ADefinitionsMachineClause main = null;
-			for (PMachineClause clause : machineClausesList) {
-				if (clause instanceof ADefinitionsMachineClause) {
-					main = (ADefinitionsMachineClause) clause;
-				}
-			}
+			ADefinitionsMachineClause main = (ADefinitionsMachineClause) machineClauseHashMap
+					.get(node.getClass());
 
-			if (main != null) {
+			if (main == null) {
+				additionalMachineClauseList.add(node);
+			} else {
 				ArrayList<PDefinition> oldDefinitions = new ArrayList<PDefinition>(
 						main.getDefinitions());
 				ArrayList<PDefinition> newDefinitionsList = new ArrayList<PDefinition>();
@@ -190,8 +195,6 @@ public class SeesEliminator extends DepthFirstAdapter {
 
 				}
 				main.setDefinitions(newDefinitionsList);
-			} else {
-				additionalMachineClauseList.add(node);
 			}
 		}
 
diff --git a/src/test/java/de/tlc4b/tlc/integration/BasicTest.java b/src/test/java/de/tlc4b/tlc/integration/BasicTest.java
index 743559e..b3fe175 100644
--- a/src/test/java/de/tlc4b/tlc/integration/BasicTest.java
+++ b/src/test/java/de/tlc4b/tlc/integration/BasicTest.java
@@ -38,6 +38,7 @@ public class BasicTest extends AbstractParseMachineTest {
 	public static Configuration getConfig() {
 		final ArrayList<TestPair> list = new ArrayList<TestPair>();
 		list.add(new TestPair(NoError, "./src/test/resources/composition/sees"));
+		list.add(new TestPair(NoError, "./src/test/resources/composition/sees2"));
 		list.add(new TestPair(NoError, "./src/test/resources/basics"));
 		list.add(new TestPair(NoError, "./src/test/resources/laws"));
 		return getConfiguration(list);
diff --git a/src/test/resources/composition/sees2/M1.mch b/src/test/resources/composition/sees2/M1.mch
new file mode 100644
index 0000000..a8d6a05
--- /dev/null
+++ b/src/test/resources/composition/sees2/M1.mch
@@ -0,0 +1,3 @@
+MACHINE M1
+SEES M2, M4
+END
diff --git a/src/test/resources/composition/sees2/M2.mch b/src/test/resources/composition/sees2/M2.mch
new file mode 100644
index 0000000..8d955de
--- /dev/null
+++ b/src/test/resources/composition/sees2/M2.mch
@@ -0,0 +1,7 @@
+MACHINE M2
+SEES M3
+CONSTANTS
+  k2
+PROPERTIES
+  k2 = k3 + 1
+END
diff --git a/src/test/resources/composition/sees2/M3.mch b/src/test/resources/composition/sees2/M3.mch
new file mode 100644
index 0000000..f383a5a
--- /dev/null
+++ b/src/test/resources/composition/sees2/M3.mch
@@ -0,0 +1,7 @@
+MACHINE M3
+SEES M4
+CONSTANTS
+  k3
+PROPERTIES
+  k3 = 3
+END
diff --git a/src/test/resources/composition/sees2/M4.mch b/src/test/resources/composition/sees2/M4.mch
new file mode 100644
index 0000000..36ba47c
--- /dev/null
+++ b/src/test/resources/composition/sees2/M4.mch
@@ -0,0 +1,6 @@
+MACHINE M4
+CONSTANTS
+ k4
+PROPERTIES
+  k4 = 4
+END
-- 
GitLab