From d14634fe3399ac6a9fd339c3fefb2d2338a5baea Mon Sep 17 00:00:00 2001
From: dgelessus <dgelessus@users.noreply.github.com>
Date: Wed, 25 Jan 2023 11:51:06 +0100
Subject: [PATCH] Combine scope checking into type checking

The type checker needs to look up the VTs anyway, so it makes more sense
to put the error check there as well.
---
 src/main/java/de/prob/voparser/VOParser.java  | 16 +---
 .../prob/voparser/VOScopeCheckException.java  | 17 -----
 .../java/de/prob/voparser/VOScopeChecker.java | 27 -------
 .../java/de/prob/voparser/VOTypeChecker.java  |  6 +-
 .../java/de/prob/voparser/VOScopingTest.java  | 75 -------------------
 .../de/prob/voparser/VOTypeCheckingTest.java  | 30 ++++++++
 6 files changed, 36 insertions(+), 135 deletions(-)
 delete mode 100644 src/main/java/de/prob/voparser/VOScopeCheckException.java
 delete mode 100644 src/main/java/de/prob/voparser/VOScopeChecker.java
 delete mode 100644 src/test/java/de/prob/voparser/VOScopingTest.java

diff --git a/src/main/java/de/prob/voparser/VOParser.java b/src/main/java/de/prob/voparser/VOParser.java
index 7eb0fac..fe5c544 100644
--- a/src/main/java/de/prob/voparser/VOParser.java
+++ b/src/main/java/de/prob/voparser/VOParser.java
@@ -16,13 +16,10 @@ public class VOParser {
 
 	private final Map<String, VTType> tasks;
 
-	private final VOScopeChecker scopeChecker;
-
 	private final VOTypeChecker typeChecker;
 
 	public VOParser() {
 		this.tasks = new HashMap<>();
-		this.scopeChecker = new VOScopeChecker(this);
 		this.typeChecker = new VOTypeChecker(this);
 	}
 
@@ -56,21 +53,10 @@ public class VOParser {
 		tasks.remove(id);
 	}
 
-	public void semanticCheck(Start ast) {
-		scopeChecker.scopeCheck(ast);
+	public void typeCheck(Start ast) {
 		typeChecker.typeCheck(ast);
 	}
 
-	public void semanticCheck(String formula) {
-		scopeCheck(formula);
-		typeCheck(formula);
-	}
-
-	public void scopeCheck(String formula) {
-		Start start = parseFormula(formula);
-		scopeChecker.scopeCheck(start);
-	}
-
 	public void typeCheck(String formula) {
 		Start start = parseFormula(formula);
 		typeChecker.typeCheck(start);
diff --git a/src/main/java/de/prob/voparser/VOScopeCheckException.java b/src/main/java/de/prob/voparser/VOScopeCheckException.java
deleted file mode 100644
index 7bbe7e2..0000000
--- a/src/main/java/de/prob/voparser/VOScopeCheckException.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package de.prob.voparser;
-
-public class VOScopeCheckException extends VOException {
-	private static final long serialVersionUID = 1L;
-	
-	public VOScopeCheckException(final String message, final Throwable cause) {
-		super(message, cause);
-	}
-	
-	public VOScopeCheckException(final String message) {
-		this(message, null);
-	}
-	
-	public VOScopeCheckException(final Throwable cause) {
-		this(cause == null ? null : cause.toString(), cause);
-	}
-}
diff --git a/src/main/java/de/prob/voparser/VOScopeChecker.java b/src/main/java/de/prob/voparser/VOScopeChecker.java
deleted file mode 100644
index 7c370c5..0000000
--- a/src/main/java/de/prob/voparser/VOScopeChecker.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package de.prob.voparser;
-
-import de.prob.voparser.analysis.DepthFirstAdapter;
-import de.prob.voparser.node.AIdentifierVo;
-import de.prob.voparser.node.Start;
-
-
-public class VOScopeChecker extends DepthFirstAdapter {
-
-	private final VOParser voParser;
-
-	public VOScopeChecker(VOParser voParser) {
-		this.voParser = voParser;
-	}
-
-	public void scopeCheck(Start start) {
-		start.apply(this);
-	}
-
-	@Override
-	public void caseAIdentifierVo(AIdentifierVo node) {
-		if (!voParser.getTasks().containsKey(node.getIdentifierLiteral().getText())) {
-			throw new VOScopeCheckException("Scope error in VO");
-		}
-	}
-
-}
diff --git a/src/main/java/de/prob/voparser/VOTypeChecker.java b/src/main/java/de/prob/voparser/VOTypeChecker.java
index ddba43f..e296814 100644
--- a/src/main/java/de/prob/voparser/VOTypeChecker.java
+++ b/src/main/java/de/prob/voparser/VOTypeChecker.java
@@ -92,7 +92,11 @@ public class VOTypeChecker extends DepthFirstAdapter {
 
 
 	private PersistentHashSet<AnimatorState> visitIdentifierNode(AIdentifierVo node, PersistentHashSet<AnimatorState> animatorState) {
-		VTType type = voParser.getTasks().get(node.getIdentifierLiteral().getText());
+		final String id = node.getIdentifierLiteral().getText();
+		if (!voParser.getTasks().containsKey(id)) {
+			throw new VOTypeCheckException("Scope error in VO");
+		}
+		VTType type = voParser.getTasks().get(id);
 		PersistentHashSet<AnimatorState> newAnimatorState = animatorState;
 		boolean valid = true;
 		switch (type) {
diff --git a/src/test/java/de/prob/voparser/VOScopingTest.java b/src/test/java/de/prob/voparser/VOScopingTest.java
deleted file mode 100644
index 2665b09..0000000
--- a/src/test/java/de/prob/voparser/VOScopingTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package de.prob.voparser;
-
-/** 
- * (c) 2022 Lehrstuhl fuer Softwaretechnik und Programmiersprachen,
- * Heinrich Heine Universitaet Duesseldorf
- * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
- * */
-
-import org.junit.Test;
-
-public class VOScopingTest {
-
-	@Test
-	public void testAtomic() {
-		VOParser voParser = new VOParser();
-		voParser.registerTask("MC1", VTType.EXPLORE);
-		voParser.scopeCheck("MC1");
-	}
-
-	@Test
-	public void testSequential() {
-		VOParser voParser = new VOParser();
-		voParser.registerTask("MC1", VTType.TRACE);
-		voParser.registerTask("TR1", VTType.TRACE);
-		voParser.scopeCheck("MC1;TR1");
-	}
-
-	@Test(expected = VOScopeCheckException.class)
-	public void testSequentialError() {
-		VOParser voParser = new VOParser();
-		voParser.registerTask("MC1", VTType.TRACE);
-		voParser.scopeCheck("MC1;TR1");
-	}
-
-	@Test
-	public void testAnd() {
-		VOParser voParser = new VOParser();
-		voParser.registerTask("MC1", VTType.TRACE);
-		voParser.registerTask("TR1", VTType.TRACE);
-		voParser.scopeCheck("MC1 & TR1");
-	}
-
-	@Test
-	public void testAnd2() {
-		VOParser voParser = new VOParser();
-		voParser.registerTask("MC1.1", VTType.TRACE);
-		voParser.registerTask("TR1.1", VTType.TRACE);
-		voParser.registerTask("MC2.1", VTType.TRACE);
-		voParser.registerTask("TR2.1", VTType.TRACE);
-		voParser.scopeCheck("(MC1.1; TR1.1) & (MC2.1; TR2.1)");
-	}
-
-	@Test
-	public void testOr() {
-		VOParser voParser = new VOParser();
-		voParser.registerTask("MC1", VTType.TRACE);
-		voParser.registerTask("TR1", VTType.TRACE);
-		voParser.scopeCheck("MC1 or TR1");
-	}
-
-	@Test
-	public void testDot() {
-		VOParser voParser = new VOParser();
-		voParser.registerTask("MC1.1", VTType.EXPLORE);
-		voParser.scopeCheck("MC1.1");
-	}
-
-
-	@Test(expected = VOScopeCheckException.class)
-	public void testScopingError() {
-		VOParser voParser = new VOParser();
-		voParser.scopeCheck("MC1");
-	}
-
-}
diff --git a/src/test/java/de/prob/voparser/VOTypeCheckingTest.java b/src/test/java/de/prob/voparser/VOTypeCheckingTest.java
index 8d3eb82..96e2baa 100644
--- a/src/test/java/de/prob/voparser/VOTypeCheckingTest.java
+++ b/src/test/java/de/prob/voparser/VOTypeCheckingTest.java
@@ -25,6 +25,13 @@ public class VOTypeCheckingTest {
 		voParser.typeCheck("MC1;MC2");
 	}
 
+	@Test(expected = VOTypeCheckException.class)
+	public void testSequentialError() {
+		VOParser voParser = new VOParser();
+		voParser.registerTask("MC1", VTType.TRACE);
+		voParser.typeCheck("MC1;TR1");
+	}
+
 	@Test(expected = VOTypeCheckException.class)
 	public void testSequential2() {
 		VOParser voParser = new VOParser();
@@ -42,6 +49,16 @@ public class VOTypeCheckingTest {
 		voParser.typeCheck("MC1 & TR1");
 	}
 
+	@Test
+	public void testAnd2() {
+		VOParser voParser = new VOParser();
+		voParser.registerTask("MC1.1", VTType.TRACE);
+		voParser.registerTask("TR1.1", VTType.TRACE);
+		voParser.registerTask("MC2.1", VTType.TRACE);
+		voParser.registerTask("TR2.1", VTType.TRACE);
+		voParser.typeCheck("(MC1.1; TR1.1) & (MC2.1; TR2.1)");
+	}
+
 	@Test
 	public void testOr() {
 		VOParser voParser = new VOParser();
@@ -50,4 +67,17 @@ public class VOTypeCheckingTest {
 		voParser.typeCheck("MC1 or TR1");
 	}
 
+	@Test
+	public void testDot() {
+		VOParser voParser = new VOParser();
+		voParser.registerTask("MC1.1", VTType.EXPLORE);
+		voParser.typeCheck("MC1.1");
+	}
+
+	@Test(expected = VOTypeCheckException.class)
+	public void testScopingError() {
+		VOParser voParser = new VOParser();
+		voParser.typeCheck("MC1");
+	}
+
 }
-- 
GitLab