diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/CodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/algorithms/CodeGenerator.java index 88733b5..0948da2 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/CodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/CodeGenerator.java @@ -1,33 +1,23 @@ package algorithms; import java.util.ArrayList; -import java.util.HashSet; -import code.ast.TypeDeclaration; +import code.ast.*; import models.*; -import models.algebra.Expression; -import models.algebra.Field; -import models.algebra.InvalidMessage; -import models.algebra.Parameter; -import models.algebra.ParameterizedIdentifierIsFutureWork; -import models.algebra.Symbol; -import models.algebra.Term; -import models.algebra.Type; -import models.algebra.UnificationFailed; -import models.algebra.ValueUndefined; -import models.dataConstraintModel.ChannelMember; -import models.dataConstraintModel.DataConstraintModel; -import models.dataConstraintModel.IdentifierTemplate; +import models.algebra.*; +import models.dataConstraintModel.*; import models.dataFlowModel.*; import models.dataFlowModel.DataflowChannelGenerator.IResourceStateAccessor; public class CodeGenerator { - static public ArrayList doGenerate(ResourceDependencyGraph graph,DataFlowModel model) { + static public ArrayList doGenerate(ResourceDependencyGraph graph, DataFlowModel model) { ArrayList codes = new ArrayList<>(); ArrayList resources = StoreResourceCheck(graph); - + codes.add(new TypeDeclaration("Main")); - for(ResourceNode rn:resources) { + for (ResourceNode rn : resources) { + codes.get(0).addField(new FieldDeclaration(rn.getIdentifierTemplate().getResourceStateType(), + rn.getIdentifierTemplate().getResourceName())); codes.add(new TypeDeclaration(rn.getIdentifierTemplate().getResourceName())); } return codes; @@ -53,26 +43,26 @@ if (flag) resources.add(rn); } - return resources; - } - - static private ArrayList trackNode(ResourceNode rn) { - ArrayList resources = new ArrayList<>(); - for (Edge e : rn.getOutEdges()) { - ResourceDependency re = (ResourceDependency) e; - if (((PushPullAttribute) re.getAttribute()).getOptions().get(0) == PushPullValue.PUSH) { - return trackNode((ResourceNode) re.getDestination()); - } - } - for (Edge e : rn.getInEdges()) { - ResourceDependency re = (ResourceDependency) e; - if (((PushPullAttribute) re.getAttribute()).getOptions().get(0) != PushPullValue.PUSH) { - return trackNode((ResourceNode) re.getSource()); - } - } + trackNode(resources.get(0),resources); return resources; } + static private void trackNode(ResourceNode current,ArrayList resources) { + if(!resources.contains(current)) resources.add(current); + for(Edge e:current.getOutEdges()) { + ResourceDependency re = (ResourceDependency) e; + if(((PushPullAttribute) re.getAttribute()).getOptions().get(0) != PushPullValue.PUSH) { + trackNode((ResourceNode) re.getDestination(),resources); + } + } + for (Edge e : current.getInEdges()) { + ResourceDependency re = (ResourceDependency) e; + if (((PushPullAttribute) re.getAttribute()).getOptions().get(0) == PushPullValue.PUSH) { + trackNode((ResourceNode) re.getSource(),resources); + } + } + } + static public IResourceStateAccessor pushAccessor = new IResourceStateAccessor() { @Override public Expression getCurrentStateAccessorFor(IdentifierTemplate target, IdentifierTemplate from) {