From e6eb2e6dab3429be078339886e01009e215e414f Mon Sep 17 00:00:00 2001
From: Miles Vella <673-vella@users.noreply.gitlab.cs.uni-duesseldorf.de>
Date: Mon, 10 Mar 2025 14:40:37 +0100
Subject: [PATCH] fix some visitors not working with records

---
 .../codegenerator/MachineConstantsOptimizer.java     |  6 +++---
 .../codegenerator/MachineConstantsPreprocessor.java  |  3 +++
 .../codegenerator/analyzers/IdentifierAnalyzer.java  |  3 +++
 .../analyzers/ParallelConstructAnalyzer.java         |  7 +++++++
 .../analyzers/PrimedIdentifierAnalyzer.java          |  3 +++
 .../generators/LambdaFunctionGenerator.java          |  3 +++
 .../codegenerator/generators/MachineGenerator.java   |  2 +-
 .../generators/MachinePreprocessor.java              | 12 +++++++++---
 8 files changed, 32 insertions(+), 7 deletions(-)

diff --git a/src/main/java/de/hhu/stups/codegenerator/MachineConstantsOptimizer.java b/src/main/java/de/hhu/stups/codegenerator/MachineConstantsOptimizer.java
index 50dcbb023..63ad6b25d 100644
--- a/src/main/java/de/hhu/stups/codegenerator/MachineConstantsOptimizer.java
+++ b/src/main/java/de/hhu/stups/codegenerator/MachineConstantsOptimizer.java
@@ -313,17 +313,17 @@ public class MachineConstantsOptimizer implements AbstractVisitor<Node, Void> {
 
     @Override
     public Node visitRecordNode(RecordNode node, Void expected) {
-        return node;
+        return new RecordNode(node.getSourceCodePosition(), node.getDeclarations(), node.getExpressions().stream().map(expr -> (ExprNode) visitExprNode(expr, expected)).collect(Collectors.toList()));
     }
 
     @Override
     public Node visitStructNode(StructNode node, Void expected) {
-        return node;
+        return new StructNode(node.getSourceCodePosition(), node.getDeclarations(), node.getExpressions().stream().map(expr -> (ExprNode) visitExprNode(expr, expected)).collect(Collectors.toList()));
     }
 
     @Override
     public Node visitRecordFieldAccessNode(RecordFieldAccessNode node, Void expected) {
-        return node;
+        return new RecordFieldAccessNode(node.getSourceCodePosition(), (ExprNode) visitExprNode(node.getRecord(), expected), node.getIdentifier());
     }
 
     @Override
diff --git a/src/main/java/de/hhu/stups/codegenerator/MachineConstantsPreprocessor.java b/src/main/java/de/hhu/stups/codegenerator/MachineConstantsPreprocessor.java
index 68d6799fc..692bfbf12 100644
--- a/src/main/java/de/hhu/stups/codegenerator/MachineConstantsPreprocessor.java
+++ b/src/main/java/de/hhu/stups/codegenerator/MachineConstantsPreprocessor.java
@@ -271,16 +271,19 @@ public class MachineConstantsPreprocessor implements AbstractVisitor<Node, Void>
 
     @Override
     public Node visitRecordNode(RecordNode node, Void expected) {
+        node.getExpressions().forEach(e -> visitExprNode(e, expected));
         return null;
     }
 
     @Override
     public Node visitStructNode(StructNode node, Void expected) {
+        node.getExpressions().forEach(e -> visitExprNode(e, expected));
         return null;
     }
 
     @Override
     public Node visitRecordFieldAccessNode(RecordFieldAccessNode node, Void expected) {
+        visitExprNode(node.getRecord(), expected);
         return null;
     }
 
diff --git a/src/main/java/de/hhu/stups/codegenerator/analyzers/IdentifierAnalyzer.java b/src/main/java/de/hhu/stups/codegenerator/analyzers/IdentifierAnalyzer.java
index 4497f95a7..9443a5d03 100644
--- a/src/main/java/de/hhu/stups/codegenerator/analyzers/IdentifierAnalyzer.java
+++ b/src/main/java/de/hhu/stups/codegenerator/analyzers/IdentifierAnalyzer.java
@@ -348,16 +348,19 @@ public class IdentifierAnalyzer implements AbstractVisitor<Void, Void> {
 
     @Override
     public Void visitRecordNode(RecordNode node, Void expected) {
+        node.getExpressions().forEach(expr -> visitExprNode(expr, expected));
         return null;
     }
 
     @Override
     public Void visitStructNode(StructNode node, Void expected) {
+        node.getExpressions().forEach(expr -> visitExprNode(expr, expected));
         return null;
     }
 
     @Override
     public Void visitRecordFieldAccessNode(RecordFieldAccessNode node, Void expected) {
+        visitExprNode(node.getRecord(), expected);
         return null;
     }
 
diff --git a/src/main/java/de/hhu/stups/codegenerator/analyzers/ParallelConstructAnalyzer.java b/src/main/java/de/hhu/stups/codegenerator/analyzers/ParallelConstructAnalyzer.java
index f69dd9b74..cc743f914 100644
--- a/src/main/java/de/hhu/stups/codegenerator/analyzers/ParallelConstructAnalyzer.java
+++ b/src/main/java/de/hhu/stups/codegenerator/analyzers/ParallelConstructAnalyzer.java
@@ -433,8 +433,15 @@ public class ParallelConstructAnalyzer implements AbstractVisitor<Void, Void> {
         return null;
     }
 
+    /*
+     * When visiting a record node, local variables are added to ignored variables as they are not relevant for variables in a parallel substitution.
+     */
     @Override
     public Void visitStructNode(StructNode node, Void expected) {
+        List<String> locals = node.getDeclarations().stream().map(DeclarationNode::getName).collect(Collectors.toList());
+        ignoredVariables.addAll(locals);
+        node.getExpressions().forEach(expr -> visitExprNode(expr, expected));
+        ignoredVariables.removeAll(locals);
         return null;
     }
 
diff --git a/src/main/java/de/hhu/stups/codegenerator/analyzers/PrimedIdentifierAnalyzer.java b/src/main/java/de/hhu/stups/codegenerator/analyzers/PrimedIdentifierAnalyzer.java
index b6e27d7a2..1f60345cc 100644
--- a/src/main/java/de/hhu/stups/codegenerator/analyzers/PrimedIdentifierAnalyzer.java
+++ b/src/main/java/de/hhu/stups/codegenerator/analyzers/PrimedIdentifierAnalyzer.java
@@ -272,16 +272,19 @@ public class PrimedIdentifierAnalyzer implements AbstractVisitor<Void, Void> {
 
     @Override
     public Void visitRecordNode(RecordNode node, Void expected) {
+        node.getExpressions().forEach(expr -> visitExprNode(expr, expected));
         return null;
     }
 
     @Override
     public Void visitStructNode(StructNode node, Void expected) {
+        node.getExpressions().forEach(expr -> visitExprNode(expr, expected));
         return null;
     }
 
     @Override
     public Void visitRecordFieldAccessNode(RecordFieldAccessNode node, Void expected) {
+        visitExprNode(node.getRecord(), expected);
         return null;
     }
 
diff --git a/src/main/java/de/hhu/stups/codegenerator/generators/LambdaFunctionGenerator.java b/src/main/java/de/hhu/stups/codegenerator/generators/LambdaFunctionGenerator.java
index 7ef64bfbb..2b3a05849 100644
--- a/src/main/java/de/hhu/stups/codegenerator/generators/LambdaFunctionGenerator.java
+++ b/src/main/java/de/hhu/stups/codegenerator/generators/LambdaFunctionGenerator.java
@@ -416,16 +416,19 @@ public class LambdaFunctionGenerator implements AbstractVisitor<Void, Void> {
 
     @Override
     public Void visitRecordNode(RecordNode node, Void expected) {
+        node.getExpressions().forEach(expr -> visitExprNode(expr, expected));
         return null;
     }
 
     @Override
     public Void visitStructNode(StructNode node, Void expected) {
+        node.getExpressions().forEach(expr -> visitExprNode(expr, expected));
         return null;
     }
 
     @Override
     public Void visitRecordFieldAccessNode(RecordFieldAccessNode node, Void expected) {
+        visitExprNode(node.getRecord(), expected);
         return null;
     }
 
diff --git a/src/main/java/de/hhu/stups/codegenerator/generators/MachineGenerator.java b/src/main/java/de/hhu/stups/codegenerator/generators/MachineGenerator.java
index 84cb6906c..e1ead492b 100755
--- a/src/main/java/de/hhu/stups/codegenerator/generators/MachineGenerator.java
+++ b/src/main/java/de/hhu/stups/codegenerator/generators/MachineGenerator.java
@@ -739,7 +739,7 @@ public class MachineGenerator implements AbstractVisitor<String, Void> {
 
 	@Override
 	public String visitStructNode(StructNode node, Void expected) {
-		return "";
+		return expressionGenerator.visitExprNode(node);
 	}
 
 	@Override
diff --git a/src/main/java/de/hhu/stups/codegenerator/generators/MachinePreprocessor.java b/src/main/java/de/hhu/stups/codegenerator/generators/MachinePreprocessor.java
index 75107c093..4af3f1a47 100644
--- a/src/main/java/de/hhu/stups/codegenerator/generators/MachinePreprocessor.java
+++ b/src/main/java/de/hhu/stups/codegenerator/generators/MachinePreprocessor.java
@@ -577,17 +577,23 @@ public class MachinePreprocessor implements AbstractVisitor<Node, Void> {
 
     @Override
     public Node visitRecordNode(RecordNode node, Void expected) {
-        return node;
+        RecordNode result = new RecordNode(node.getSourceCodePosition(), node.getDeclarations(), node.getExpressions().stream().map(expr -> (ExprNode) visitExprNode(node, expected)).collect(Collectors.toList()));
+        result.setType(node.getType());
+        return result;
     }
 
     @Override
     public Node visitStructNode(StructNode node, Void expected) {
-        return node;
+        StructNode result = new StructNode(node.getSourceCodePosition(), node.getDeclarations(), node.getExpressions().stream().map(expr -> (ExprNode) visitExprNode(node, expected)).collect(Collectors.toList()));
+        result.setType(node.getType());
+        return result;
     }
 
     @Override
     public Node visitRecordFieldAccessNode(RecordFieldAccessNode node, Void expected) {
-        return node;
+        RecordFieldAccessNode result = new RecordFieldAccessNode(node.getSourceCodePosition(), (ExprNode) visitExprNode(node.getRecord(), expected), node.getIdentifier());
+        result.setType(node.getType());
+        return result;
     }
 
     @Override
-- 
GitLab