From 58ce95463f5c2a4090c294a02e262bf11eafbcd8 Mon Sep 17 00:00:00 2001
From: Jan Gruteser <jan.gruteser@hhu.de>
Date: Tue, 14 Jan 2025 19:56:32 +0100
Subject: [PATCH] simplifications in types

---
 .../de/tla2b/types/AbstractHasFollowers.java  |   4 -
 src/main/java/de/tla2b/types/EnumType.java    |  12 +-
 .../de/tla2b/types/StructOrFunctionType.java  |  18 +--
 src/main/java/de/tla2b/types/StructType.java  | 108 ++++---------
 .../java/de/tla2b/types/TupleOrFunction.java  | 148 +++++-------------
 src/main/java/de/tla2b/types/TupleType.java   |   4 +-
 6 files changed, 78 insertions(+), 216 deletions(-)

diff --git a/src/main/java/de/tla2b/types/AbstractHasFollowers.java b/src/main/java/de/tla2b/types/AbstractHasFollowers.java
index 295c4cf..9da88b8 100644
--- a/src/main/java/de/tla2b/types/AbstractHasFollowers.java
+++ b/src/main/java/de/tla2b/types/AbstractHasFollowers.java
@@ -31,10 +31,6 @@ public abstract class AbstractHasFollowers extends TLAType {
 		followers.remove(o);
 	}
 
-	public String followersToString() {
-		return followers.toString();
-	}
-
 	protected void setFollowersTo(TLAType newType) {
 		if (this.followers == null)
 			return;
diff --git a/src/main/java/de/tla2b/types/EnumType.java b/src/main/java/de/tla2b/types/EnumType.java
index 26e745a..583dd35 100644
--- a/src/main/java/de/tla2b/types/EnumType.java
+++ b/src/main/java/de/tla2b/types/EnumType.java
@@ -1,6 +1,7 @@
 package de.tla2b.types;
 
 import de.be4.classicalb.core.parser.node.PExpression;
+import de.be4.classicalb.core.parser.util.ASTBuilder;
 import de.tla2b.exceptions.UnificationException;
 import de.tla2b.output.TypeVisitorInterface;
 import de.tla2bAst.BAstCreator;
@@ -12,21 +13,12 @@ import java.util.Set;
 public class EnumType extends AbstractHasFollowers {
 	public final Set<String> modelvalues;
 	public int id;
-	private boolean noVal = false;
 
 	public EnumType(List<String> enums) {
 		super(MODELVALUE);
 		modelvalues = new LinkedHashSet<>(enums);
 	}
 
-	public void setNoVal() {
-		noVal = true;
-	}
-
-	public boolean hasNoVal() {
-		return noVal;
-	}
-
 	public Set<String> getValues() {
 		return modelvalues;
 	}
@@ -74,7 +66,7 @@ public class EnumType extends AbstractHasFollowers {
 
 	@Override
 	public PExpression getBNode() {
-		return BAstCreator.createIdentifierNode("ENUM" + id);
+		return ASTBuilder.createIdentifier("ENUM" + id);
 	}
 
 	public void apply(TypeVisitorInterface t) {
diff --git a/src/main/java/de/tla2b/types/StructOrFunctionType.java b/src/main/java/de/tla2b/types/StructOrFunctionType.java
index 89a9fbf..be4ec5b 100644
--- a/src/main/java/de/tla2b/types/StructOrFunctionType.java
+++ b/src/main/java/de/tla2b/types/StructOrFunctionType.java
@@ -11,32 +11,26 @@ import java.util.Map.Entry;
 import java.util.Set;
 
 public class StructOrFunctionType extends AbstractHasFollowers {
-	private final Map<String, TLAType> types;
+	private final Map<String, TLAType> types = new LinkedHashMap<>();
 
 	public StructOrFunctionType(String name, TLAType type) {
 		super(STRUCT_OR_FUNCTION);
-		types = new LinkedHashMap<>();
 		types.put(name, type);
 	}
 
 	public StructOrFunctionType() {
 		super(STRUCT_OR_FUNCTION);
-		types = new LinkedHashMap<>();
 	}
 
 	public void setNewType(TLAType old, TLAType New) {
-		Set<Entry<String, TLAType>> set = types.entrySet();
-
-		for (Entry<String, TLAType> entry : set) {
-			if (entry.getValue() == old) {
-				String key = entry.getKey();
-				if (New instanceof AbstractHasFollowers) {
-					// set new reference
+		types.forEach((name, type) -> {
+			if (type == old) {
+				if (New instanceof AbstractHasFollowers) { // set new reference
 					((AbstractHasFollowers) New).addFollower(this);
 				}
-				types.put(key, New);
+				types.put(name, New);
 			}
-		}
+		});
 		testRecord();
 	}
 
diff --git a/src/main/java/de/tla2b/types/StructType.java b/src/main/java/de/tla2b/types/StructType.java
index 18137a9..98e3455 100644
--- a/src/main/java/de/tla2b/types/StructType.java
+++ b/src/main/java/de/tla2b/types/StructType.java
@@ -5,16 +5,15 @@ import de.tla2b.exceptions.UnificationException;
 import de.tla2b.output.TypeVisitorInterface;
 
 import java.util.*;
-import java.util.Map.Entry;
+import java.util.stream.Collectors;
 
 public class StructType extends AbstractHasFollowers {
-	private final LinkedHashMap<String, TLAType> types;
+	private final Map<String, TLAType> types = new LinkedHashMap<>();
 	private boolean extensible;
 	private boolean incompleteStruct;
 
 	public StructType() {
 		super(STRUCT);
-		types = new LinkedHashMap<>();
 		extensible = false;
 		incompleteStruct = false;
 	}
@@ -34,26 +33,17 @@ public class StructType extends AbstractHasFollowers {
 	}
 
 	public void add(String name, TLAType type) {
-		if (type instanceof AbstractHasFollowers) {
-			// set new reference
+		if (type instanceof AbstractHasFollowers) { // set new reference
 			((AbstractHasFollowers) type).addFollower(this);
 		}
 		types.put(name, type);
 	}
 
 	public void setNewType(TLAType old, TLAType New) {
-		Set<Entry<String, TLAType>> set = types.entrySet();
-
-		for (Entry<String, TLAType> entry : set) {
-			if (entry.getValue() == old) {
-				String key = entry.getKey();
-				if (New instanceof AbstractHasFollowers) {
-					// set new reference
-					((AbstractHasFollowers) New).addFollower(this);
-				}
-				types.put(key, New);
-			}
-		}
+		types.forEach((name, type) -> {
+			if (type == old)
+				add(name, New);
+		});
 	}
 
 	@Override
@@ -71,22 +61,14 @@ public class StructType extends AbstractHasFollowers {
 		}
 		if (o.getKind() == UNTYPED)
 			return true;
-
 		if (o instanceof StructOrFunctionType) {
 			return o.compare(this);
 		}
 		if (o instanceof StructType) {
 			StructType s = (StructType) o;
-
-			for (String fieldName : types.keySet()) {
-				if (s.types.containsKey(fieldName)) {
-					if (!this.types.get(fieldName).compare(
-						s.types.get(fieldName))) {
-						return false;
-					}
-				}
-			}
-			return true;
+			return types.keySet().stream()
+					.filter(s.types::containsKey)
+					.allMatch(fieldName -> this.types.get(fieldName).compare(s.types.get(fieldName)));
 		}
 		return false;
 	}
@@ -123,11 +105,7 @@ public class StructType extends AbstractHasFollowers {
 					TLAType res = this.types.get(fieldName).unify(sType);
 					this.types.put(fieldName, res);
 				} else {
-					if (sType instanceof AbstractHasFollowers) {
-						// set new reference
-						((AbstractHasFollowers) sType).addFollower(this);
-					}
-					this.types.put(fieldName, sType);
+					add(fieldName, sType);
 				}
 				this.incompleteStruct = false;
 			}
@@ -139,68 +117,38 @@ public class StructType extends AbstractHasFollowers {
 	@Override
 	public StructType cloneTLAType() {
 		StructType clone = new StructType();
-
-		Set<Entry<String, TLAType>> set = this.types.entrySet();
-
-		for (Entry<String, TLAType> entry : set) {
-			String field = entry.getKey();
-			TLAType type = entry.getValue().cloneTLAType();
-			clone.add(field, type);
-		}
-
+		this.types.forEach((field, type) -> clone.add(field, type.cloneTLAType()));
 		return clone;
 	}
 
-	public ArrayList<String> getFields() {
-		ArrayList<String> fields = new ArrayList<>(this.types.keySet());
-		return fields;
+	public List<String> getFields() {
+		return new ArrayList<>(this.types.keySet());
 	}
 
 	@Override
 	public boolean contains(TLAType o) {
-		for (TLAType bType : types.values()) {
-			if (bType.equals(o) || bType.contains(o))
-				return true;
-		}
-		return false;
+		return types.values().stream().anyMatch(bType -> bType.equals(o) || bType.contains(o));
 	}
 
 	@Override
 	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		sb.append("struct(");
-		Iterator<String> keys = types.keySet().iterator();
-		if (!keys.hasNext()) {
-			sb.append("...");
-		}
-		while (keys.hasNext()) {
-			String fieldName = keys.next();
-			sb.append(fieldName).append(":").append(types.get(fieldName));
-			if (keys.hasNext())
-				sb.append(",");
-		}
-		sb.append(")");
-		return sb.toString();
+		if (types.isEmpty())
+			return "struct(...)";
+
+		return "struct(" + types.entrySet().stream()
+				.map(entry -> entry.getKey() + ":" + entry.getValue())
+				.collect(Collectors.joining(",")) + ")";
 	}
 
 	@Override
 	public PExpression getBNode() {
 		List<PRecEntry> recList = new ArrayList<>();
-		for (Entry<String, TLAType> entry : types.entrySet()) {
-			ARecEntry rec = new ARecEntry();
-			rec.setIdentifier(new TIdentifierLiteral(entry.getKey()));
-			if (extensible) {
-
-				AMultOrCartExpression cart = new AMultOrCartExpression();
-				cart.setLeft(new ABoolSetExpression());
-				cart.setRight(entry.getValue().getBNode());
-				APowSubsetExpression pow = new APowSubsetExpression(cart);
-				rec.setValue(pow);
-			} else {
-				rec.setValue(entry.getValue().getBNode());
-			}
-			recList.add(rec);
-		}
+		types.forEach((id, type) -> {
+			PExpression value = extensible
+					? new APowSubsetExpression(new AMultOrCartExpression(new ABoolSetExpression(), type.getBNode()))
+					: type.getBNode();
+			recList.add(new ARecEntry(new TIdentifierLiteral(id), value));
+		});
 		return new AStructExpression(recList);
 	}
 
@@ -208,7 +156,7 @@ public class StructType extends AbstractHasFollowers {
 		visitor.caseStructType(this);
 	}
 
-	public LinkedHashMap<String, TLAType> getTypeTable() {
+	public Map<String, TLAType> getTypes() {
 		return this.types;
 	}
 
diff --git a/src/main/java/de/tla2b/types/TupleOrFunction.java b/src/main/java/de/tla2b/types/TupleOrFunction.java
index 3794538..396f87a 100644
--- a/src/main/java/de/tla2b/types/TupleOrFunction.java
+++ b/src/main/java/de/tla2b/types/TupleOrFunction.java
@@ -4,14 +4,11 @@ import de.be4.classicalb.core.parser.node.PExpression;
 import de.tla2b.exceptions.UnificationException;
 import de.tla2b.output.TypeVisitorInterface;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map.Entry;
+import java.util.*;
+import java.util.stream.Collectors;
 
 public class TupleOrFunction extends AbstractHasFollowers {
-	private final LinkedHashMap<Integer, TLAType> types = new LinkedHashMap<>();
+	private final Map<Integer, TLAType> types = new LinkedHashMap<>();
 
 	public TupleOrFunction(Integer index, TLAType type) {
 		super(TUPLE_OR_FUNCTION);
@@ -47,36 +44,22 @@ public class TupleOrFunction extends AbstractHasFollowers {
 
 	@Override
 	public String toString() {
-
-		StringBuilder sb = new StringBuilder();
-		sb.append("TupleOrFunction");
-		sb.append("(");
-		for (Iterator<Integer> keys = types.keySet().iterator(); keys.hasNext(); ) {
-			Integer key = keys.next();
-			sb.append(key);
-			sb.append(" : ").append(types.get(key));
-			if (keys.hasNext())
-				sb.append(", ");
-		}
-		sb.append(")");
-		return sb.toString();
+		return "TupleOrFunction(" + types.entrySet().stream()
+				.map(entry -> entry.getKey() + " : " + entry.getValue())
+				.collect(Collectors.joining(", ")) + ")";
 		// throw new RuntimeException("Type " + sb + "is incomplete");
 	}
 
 	@Override
 	public PExpression getBNode() {
-		FunctionType func = new FunctionType();
-		func.setDomain(IntType.getInstance());
-		func.setRange(new UntypedType());
-		FunctionType res;
+		FunctionType func = new FunctionType(IntType.getInstance(), new UntypedType());
 		try {
-			res = (FunctionType) func.unify(this);
+			FunctionType res = (FunctionType) func.unify(this);
 			return res.getBNode();
-		} catch (UnificationException e) {
-			// tuple
+		} catch (UnificationException e) { // tuple
 			boolean isTuple = true;
-			ArrayList<TLAType> typeList = new ArrayList<>();
-			for (int i = 1; i <= types.keySet().size(); i++) {
+			List<TLAType> typeList = new ArrayList<>();
+			for (int i = 1; i <= types.size(); i++) {
 				if (types.containsKey(i)) {
 					typeList.add(types.get(i));
 				} else {
@@ -88,22 +71,9 @@ public class TupleOrFunction extends AbstractHasFollowers {
 			if (isTuple) {
 				return new TupleType(typeList).getBNode();
 			} else {
-				StringBuilder sb = new StringBuilder();
-				sb.append("(");
-				for (Iterator<Integer> keys = types.keySet().iterator(); keys
-					.hasNext(); ) {
-					Integer key = keys.next();
-					sb.append(key);
-					sb.append(" : ").append(types.get(key));
-					if (keys.hasNext())
-						sb.append(", ");
-				}
-				sb.append(")");
-				throw new RuntimeException("Type " + sb + "is incomplete");
+				throw new RuntimeException("Type " + this + " is incomplete");
 			}
-
 		}
-
 	}
 
 	@Override
@@ -116,48 +86,30 @@ public class TupleOrFunction extends AbstractHasFollowers {
 
 		if (o instanceof FunctionType) {
 			FunctionType t = (FunctionType) o;
-			if (!t.getDomain().compare(IntType.getInstance())) {
-				return false;
-			}
-			for (TLAType type : this.types.values()) {
-				if (!type.compare(t.getRange())) {
-					return false;
-				}
-			}
-			return true;
+			return t.getDomain().compare(IntType.getInstance()) &&
+					this.types.values().stream().allMatch(type -> type.compare(t.getRange()));
 		}
 		if (o instanceof TupleType) {
 			TupleType tupleType = (TupleType) o;
-			for (Integer index : this.types.keySet()) {
-				if (index >= 1
-					&& index <= tupleType.getTypes().size()
-					&& this.types.get(index).compare(
-					tupleType.getTypes().get(index - 1))) {
-				} else {
-					return false;
-				}
-			}
-			return true;
+			return this.types.keySet().stream().allMatch(
+					index -> index >= 1 &&
+					index <= tupleType.getTypes().size() &&
+					this.types.get(index).compare(tupleType.getTypes().get(index - 1)));
 		}
 		if (o instanceof TupleOrFunction) {
 			TupleOrFunction other = (TupleOrFunction) o;
-			if (isTupleOrFunction(this, other)) {
+			if (isTupleOrFunction(this, other))
 				return true;
-			}
+			if (types.size() != other.types.size())
+				return false;
 
-			try {
-				for (int i = 1; i <= types.keySet().size(); i++) {
-					if (!types.get(i).compare(other.types.get(i))) {
-						return false;
-					}
+			for (int i = 1; i <= types.size(); i++) {
+				if (!types.get(i).compare(other.types.get(i))) {
+					return false;
 				}
-			} catch (Exception e) {
-				return false;
 			}
-
 			return true;
 		}
-
 		// this type is not comparable to all other types
 		return false;
 	}
@@ -171,12 +123,7 @@ public class TupleOrFunction extends AbstractHasFollowers {
 
 	@Override
 	public boolean contains(TLAType o) {
-		for (TLAType type : this.types.values()) {
-			if (type.equals(o) || type.contains(o)) {
-				return true;
-			}
-		}
-		return false;
+		return this.types.values().stream().anyMatch(type -> type.equals(o) || type.contains(o));
 	}
 
 	@Override
@@ -188,19 +135,14 @@ public class TupleOrFunction extends AbstractHasFollowers {
 			if (type.isUntyped())
 				return true;
 		}
-		FunctionType func = new FunctionType();
-		func.setDomain(IntType.getInstance());
-		func.setRange(new UntypedType());
+		FunctionType func = new FunctionType(IntType.getInstance(), new UntypedType());
 		return !func.compare(this);
 	}
 
 	@Override
 	public TLAType cloneTLAType() {
 		TupleOrFunction res = new TupleOrFunction();
-		for (Entry<Integer, TLAType> entry : this.types.entrySet()) {
-			res.types.put(entry.getKey(), entry
-				.getValue().cloneTLAType());
-		}
+		res.types.putAll(this.types);
 		return res;
 	}
 
@@ -229,8 +171,7 @@ public class TupleOrFunction extends AbstractHasFollowers {
 			List<TLAType> typeList = new ArrayList<>();
 			for (int i = 0; i < tupleType.getTypes().size(); i++) {
 				if (this.types.containsKey(i + 1)) {
-					TLAType res = tupleType.getTypes().get(i)
-						.unify(this.types.get(i + 1));
+					TLAType res = tupleType.getTypes().get(i).unify(this.types.get(i + 1));
 					typeList.add(res);
 				} else {
 					typeList.add(tupleType.getTypes().get(i));
@@ -245,18 +186,15 @@ public class TupleOrFunction extends AbstractHasFollowers {
 		if (o instanceof TupleOrFunction) {
 			TupleOrFunction other = (TupleOrFunction) o;
 			for (Integer i : other.types.keySet()) {
+				TLAType res;
 				if (this.types.containsKey(i)) {
-					TLAType res = other.types.get(i).unify(this.types.get(i));
-					if (res instanceof AbstractHasFollowers)
-						((AbstractHasFollowers) res).addFollower(this);
-					this.types.put(i, res);
+					res = other.types.get(i).unify(this.types.get(i));
 				} else {
-					TLAType res = other.types.get(i);
-					if (res instanceof AbstractHasFollowers)
-						((AbstractHasFollowers) res).addFollower(this);
-					this.types.put(i, res);
+					res = other.types.get(i);
 				}
-
+				if (res instanceof AbstractHasFollowers)
+					((AbstractHasFollowers) res).addFollower(this);
+				this.types.put(i, res);
 			}
 			other.setFollowersTo(this);
 			return this;
@@ -295,33 +233,26 @@ public class TupleOrFunction extends AbstractHasFollowers {
 			// TupleType tuple2 = new TupleType(list2);
 			// return tuple1.unify(tuple2);
 			// }
-
 		}
-
 		throw new RuntimeException();
 	}
 
 	public void setNewType(AbstractHasFollowers oldType, TLAType newType) {
-		LinkedHashMap<Integer, TLAType> temp = new LinkedHashMap<>(
-			types);
-		for (Entry<Integer, TLAType> entry : temp.entrySet()) {
-			if (entry.getValue().equals(oldType)) {
-				types.put(entry.getKey(), newType);
+		new HashMap<>(types).forEach((key,value) -> {
+			if (value.equals(oldType)) {
+				types.put(key, newType);
 				if (newType instanceof AbstractHasFollowers) {
 					((AbstractHasFollowers) newType).addFollower(this);
 				}
 			}
-		}
-
+		});
 		update();
 	}
 
 	public TLAType getFinalType() {
 		List<TLAType> list = new ArrayList<>(this.types.values());
-
 		if (comparable(list)) {
-			FunctionType func = new FunctionType(IntType.getInstance(),
-				new UntypedType());
+			FunctionType func = new FunctionType(IntType.getInstance(), new UntypedType());
 			try {
 				func = (FunctionType) func.unify(this);
 				this.setFollowersTo(func);
@@ -334,7 +265,6 @@ public class TupleOrFunction extends AbstractHasFollowers {
 			this.setFollowersTo(tuple);
 			return tuple;
 		}
-
 	}
 
 	private TLAType update() {
diff --git a/src/main/java/de/tla2b/types/TupleType.java b/src/main/java/de/tla2b/types/TupleType.java
index 4a6500c..557c1b7 100644
--- a/src/main/java/de/tla2b/types/TupleType.java
+++ b/src/main/java/de/tla2b/types/TupleType.java
@@ -1,12 +1,14 @@
 package de.tla2b.types;
 
 import de.be4.classicalb.core.parser.node.PExpression;
+import de.be4.classicalb.core.parser.util.ASTBuilder;
 import de.tla2b.exceptions.UnificationException;
 import de.tla2b.output.TypeVisitorInterface;
 import de.tla2bAst.BAstCreator;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 public class TupleType extends AbstractHasFollowers {
 	private List<TLAType> types;
@@ -146,7 +148,7 @@ public class TupleType extends AbstractHasFollowers {
 
 	@Override
 	public PExpression getBNode() {
-		return BAstCreator.createNestedCouple(types);
+		return ASTBuilder.createNestedMultOrCard(types.stream().map(TLAType::getBNode).collect(Collectors.toList()));
 	}
 
 	public void apply(TypeVisitorInterface visitor) {
-- 
GitLab