diff --git a/src/main/java/de/hhu/stups/codegenerator/MachineConstantsOptimizer.java b/src/main/java/de/hhu/stups/codegenerator/MachineConstantsOptimizer.java index 50dcbb02327fbfc038b61dca417521d8d5b2489a..63ad6b25dae0e6e5d37139fccef463f314d996e5 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 68d6799fc33aea26423415bffd8c8dfab447fb44..692bfbf12495e2a1aabc6b7a731e98513fbf9efa 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 4497f95a7f67f60d4009dfebf72053a7b464b902..9443a5d03317d185f9edeeb5cbedacc4cdf26ff2 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 f69dd9b749bbd0ad57b30b3cdf4e404690afad07..cc743f914afea8b7fe53c37c8ffc3e5f1f253c41 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 b6e27d7a29df1f662e01fa06099d2a0385016f6b..1f60345cc067f9b401e30240878825291e55e755 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 7ef64bfbbb9a8fed04585a10df28faba6278a824..2b3a05849579be3e8c7d8cef6c0bbd4d9a6d6fac 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 84cb6906c01027322cb58b1ce8c9ce58359e61d7..e1ead492bb3847f9ae1ac15276d76c5b7721b790 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 75107c0937e065591d13b4a73f9e7edc13c01d7c..4af3f1a470fcf1bb4fb8f8a00db78c6ec73202dc 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