diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/CodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/algorithms/CodeGenerator.java index bbf1201..5ba1720 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/CodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/CodeGenerator.java @@ -2,6 +2,7 @@ import java.util.ArrayList; +import code.ast.Block; import code.ast.FieldDeclaration; import code.ast.MethodDeclaration; import code.ast.TypeDeclaration; @@ -34,12 +35,39 @@ codes.add(new TypeDeclaration("Main")); for (ResourceNode rn : resources) { + boolean f = false; String name = rn.getIdentifierTemplate().getResourceName().substring(0, 1).toUpperCase() + rn.getIdentifierTemplate().getResourceName().substring(1); + String consstr = "new " + name + "("; + for (Edge e : rn.getOutEdges()) { + ResourceDependency re = (ResourceDependency) e; + String rename = ((ResourceNode) re.getDestination()).getIdentifierTemplate().getResourceName() + .substring(0, 1).toUpperCase() + + ((ResourceNode) re.getDestination()).getIdentifierTemplate().getResourceName().substring(1); + if (((PushPullAttribute) re.getAttribute()).getOptions().get(0) == PushPullValue.PUSH) { + consstr += rename.toLowerCase() + ","; + f = true; + } + } + for (Edge e : rn.getInEdges()) { + ResourceDependency re = (ResourceDependency) e; + String rename = ((ResourceNode) re.getSource()).getIdentifierTemplate().getResourceName() + .substring(0, 1).toUpperCase() + + ((ResourceNode) re.getSource()).getIdentifierTemplate().getResourceName().substring(1); + if (((PushPullAttribute) re.getAttribute()).getOptions().get(0) != PushPullValue.PUSH) { + consstr += rename.toLowerCase() + ","; + f = true; + } + } + if (f) + consstr = consstr.substring(0, consstr.length() - 1); + consstr += ")"; FieldDeclaration field = new FieldDeclaration(new Type(name, name), - rn.getIdentifierTemplate().getResourceName()); + rn.getIdentifierTemplate().getResourceName(), consstr); TypeDeclaration type = new TypeDeclaration(name); codes.get(0).addField(field); + MethodDeclaration cons = new MethodDeclaration(name, true); + Block block = new Block(); for (Edge e : rn.getOutEdges()) { ResourceDependency re = (ResourceDependency) e; String rename = ((ResourceNode) re.getDestination()).getIdentifierTemplate().getResourceName() @@ -48,10 +76,13 @@ if (((PushPullAttribute) re.getAttribute()).getOptions().get(0) == PushPullValue.PUSH) { type.addField(new FieldDeclaration(new Type(rename, rename), ((ResourceNode) re.getDestination()).getIdentifierTemplate().getResourceName())); - type.addConstructors(new VariableDeclaration(new Type(rename, rename), + cons.addParameter(new VariableDeclaration(new Type(rename, rename), ((ResourceNode) re.getDestination()).getIdentifierTemplate().getResourceName())); + block.addStatement("this." + rename.toLowerCase() + " = " + rename.toLowerCase()); + cons.setBody(block); } } + block = new Block(); ArrayList vars = new ArrayList<>(); boolean flag = false; for (Edge e : rn.getInEdges()) { @@ -62,8 +93,10 @@ if (((PushPullAttribute) re.getAttribute()).getOptions().get(0) != PushPullValue.PUSH) { type.addField(new FieldDeclaration(new Type(rename, rename), ((ResourceNode) re.getSource()).getIdentifierTemplate().getResourceName())); - type.addConstructors(new VariableDeclaration(new Type(rename, rename), + cons.addParameter(new VariableDeclaration(new Type(rename, rename), ((ResourceNode) re.getSource()).getIdentifierTemplate().getResourceName())); + block.addStatement("this." + rename.toLowerCase() + " = " + rename.toLowerCase()); + cons.setBody(block); } else { vars.add(new VariableDeclaration( ((ResourceNode) re.getSource()).getIdentifierTemplate().getResourceStateType(), @@ -71,11 +104,15 @@ flag = true; } } + type.addMethod(cons); if (flag) type.addMethod(new MethodDeclaration("update", false, typeVoid, vars)); if (((StoreAttribute) rn.getAttribute()).isStored()) { + String str = "new " + rn.getIdentifierTemplate().getResourceStateType() + .getImplementationTypeName()+ "()"; + if(!rn.getIdentifierTemplate().getResourceStateType().getTypeName().contains("List")) str = null; type.addField(new FieldDeclaration(rn.getIdentifierTemplate().getResourceStateType(), - rn.getIdentifierTemplate().getResourceName())); + rn.getIdentifierTemplate().getResourceName(), str)); } type.addMethod(new MethodDeclaration("get" + type.getTypeName(), rn.getIdentifierTemplate().getResourceStateType())); diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/FieldDeclaration.java b/AlgebraicDataflowArchitectureModel/src/code/ast/FieldDeclaration.java index 038dc6a..1d58007 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/FieldDeclaration.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/FieldDeclaration.java @@ -11,6 +11,12 @@ this.type = type; this.fieldName = fieldName; } + + public FieldDeclaration(Type type, String fieldName, String initializer) { + this.type = type; + this.fieldName = fieldName; + this.initializer = initializer; + } public Type getType() { return type; @@ -35,7 +41,7 @@ public void setInitializer(String initializer) { this.initializer = initializer; } - + public String toString() { if (initializer == null) { return type.getImplementationTypeName() + " " + fieldName + ";\n"; diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/MethodDeclaration.java b/AlgebraicDataflowArchitectureModel/src/code/ast/MethodDeclaration.java index c66b438..6705cf6 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/MethodDeclaration.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/MethodDeclaration.java @@ -100,8 +100,8 @@ public String toString() { String code = "public "; if (returnType == null) { - code += "void "; - } else { + if(!isConstructor) code += "void "; + }else { code += returnType.getImplementationTypeName() + " "; } code += (name + "("); diff --git a/AlgebraicDataflowArchitectureModel/src/tests/CodeGeneratorTest.java b/AlgebraicDataflowArchitectureModel/src/tests/CodeGeneratorTest.java index 4b652d8..290fa27 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/CodeGeneratorTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/CodeGeneratorTest.java @@ -24,16 +24,16 @@ ResourceDependencyGraph graph = DataStorageNecessity.run(model); EdgeTransitionSelectable.run(graph); DataStorageDecision.run(graph); - ArrayList codetree = CodeGenerator.doGenerate(graph, model); - for(TypeDeclaration str:codetree) { - System.out.println(str.getTypeName()); - for(FieldDeclaration field:str.getFields()) { - System.out.println("-" + field.getType().getTypeName() + " " + field.getName()); - } - for(MethodDeclaration method:str.getMethods()) { - System.out.println("-" + method.getReturnType().getTypeName() + " " + method.getName()); - } - } + ArrayList codetree = MethodBodyGenerator.doGenerate(graph, model, CodeGenerator.doGenerate(graph, model)); +// for(TypeDeclaration str:codetree) { +// System.out.println(str.getTypeName()); +// for(FieldDeclaration field:str.getFields()) { +// System.out.println("-" + field.getType().getTypeName() + " " + field.getName()); +// } +// for(MethodDeclaration method:str.getMethods()) { +// System.out.println("-" + method.getReturnType().getTypeName() + " " + method.getName()); +// } +// } System.out.println(codetree); } catch (ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutKeyword | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression