diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/MethodBodyGenerator.java b/AlgebraicDataflowArchitectureModel/src/algorithms/MethodBodyGenerator.java index 21a2454..c27b6b3 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/MethodBodyGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/MethodBodyGenerator.java @@ -10,6 +10,7 @@ import models.Node; import models.algebra.InvalidMessage; import models.algebra.ParameterizedIdentifierIsFutureWork; +import models.algebra.Symbol; import models.algebra.UnificationFailed; import models.algebra.ValueUndefined; import models.dataConstraintModel.ChannelMember; @@ -23,6 +24,21 @@ public class MethodBodyGenerator { public static ArrayList doGenerate(ResourceDependencyGraph graph, DataFlowModel model, ArrayList types) { + Symbol floor = model.getSymbol("floor"); + Symbol.Memento floorMem = null; + if (floor != null) { + floorMem = floor.createMemento(); + floor.setImplName("(int)Math.floor"); + floor.setImplOperatorType(Symbol.Type.PREFIX); + } + Symbol sum = model.getSymbol("sum"); + Symbol.Memento sumMem = null; + if (sum != null) { + sumMem = sum.createMemento(); + sum.setImplName("stream().mapToInt(x->x).sum"); + sum.setImplOperatorType(Symbol.Type.METHOD); + } + // Create a map from type names (lower case) to their types. Map typeMap = new HashMap<>(); for (TypeDeclaration type: types) { @@ -36,16 +52,22 @@ PushPullAttribute pushPull = (PushPullAttribute) d.getAttribute(); ResourceNode src = (ResourceNode) d.getSource(); ResourceNode dst = (ResourceNode) d.getDestination(); - TypeDeclaration dstType = typeMap.get(dst.getIdentifierTemplate().getResourceName()); + String srcResourceName = src.getIdentifierTemplate().getResourceName(); + String dstResourceName = dst.getIdentifierTemplate().getResourceName(); + TypeDeclaration srcType = typeMap.get(srcResourceName); + TypeDeclaration dstType = typeMap.get(dstResourceName); for (ChannelMember out: d.getChannelGenerator().getOutputChannelMembers()) { if (out.getIdentifierTemplate() == dst.getIdentifierTemplate()) { if (pushPull.getOptions().get(0) == PushPullValue.PUSH) { // push MethodDeclaration update = getUpdateMethod(dstType); String curState = d.getChannelGenerator().deriveUpdateExpressionOf(out, CodeGenerator.pushAccessor).toImplementation(); - update.addStatement(dst.getIdentifierTemplate().getResourceName() + " = " + curState + ";"); + update.addFirstStatement(dstResourceName + " = " + curState + ";"); MethodDeclaration getter = getGetterMethod(dstType); - getter.addStatement("return " + dst.getIdentifierTemplate().getResourceName() + ";"); + getter.addStatement("return " + dstResourceName + ";"); + // src side + MethodDeclaration srcUpdate = getUpdateMethod(srcType); + if (srcUpdate != null) srcUpdate.addStatement(dstResourceName + ".update(" + srcResourceName + ");"); } else { // pull or push/pull MethodDeclaration getter = getGetterMethod(dstType); @@ -67,6 +89,9 @@ | InvalidMessage | UnificationFailed | ValueUndefined e1) { e1.printStackTrace(); } + + if (floor != null) floor.setMemento(floorMem); + if (sum != null) sum.setMemento(sumMem); return types; } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/Block.java b/AlgebraicDataflowArchitectureModel/src/code/ast/Block.java index abea107..2b4f654 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/Block.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/Block.java @@ -14,6 +14,10 @@ this.statements = statements; } + public void addFirstStatement(String statement) { + statements.add(0, statement); + } + public void addStatement(String statement) { statements.add(statement); } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/MethodDeclaration.java b/AlgebraicDataflowArchitectureModel/src/code/ast/MethodDeclaration.java index f7b9c4f..c66b438 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/MethodDeclaration.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/MethodDeclaration.java @@ -90,6 +90,13 @@ body.addStatement(statement); } + public void addFirstStatement(String statement) { + if (body == null) { + body = new Block(); + } + body.addFirstStatement(statement); + } + public String toString() { String code = "public "; if (returnType == null) { diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Symbol.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Symbol.java index 1192085..37f32d7 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Symbol.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Symbol.java @@ -56,6 +56,10 @@ public String getName() { return name; } + + public Type getOperatorType() { + return operatorType; + } public boolean isInfix() { return (operatorType == Type.INFIX); @@ -85,6 +89,10 @@ return implName; } + public void setImplName(String implName) { + this.implName = implName; + } + public Type getImplOperatorType() { return implOperatorType; } @@ -96,6 +104,10 @@ public boolean isImplMethod() { return (implOperatorType == Type.METHOD); } + + public void setImplOperatorType(Type implOperatorType) { + this.implOperatorType = implOperatorType; + } public int[] getImplParamOrder() { return implParamOrder; @@ -124,4 +136,23 @@ INFIX, METHOD } + + public Memento createMemento() { + return new Memento(implName, implOperatorType); + } + + public void setMemento(Memento memento) { + this.implName = memento.implName; + this.implOperatorType = memento.implOperatorType; + } + + public static class Memento { + private String implName; + private Type implOperatorType = Type.PREFIX; + + public Memento(String implName, Type implOperatorType) { + this.implName = implName; + this.implOperatorType = implOperatorType; + } + } }