diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/FieldDeclaration.java b/AlgebraicDataflowArchitectureModel/src/code/ast/FieldDeclaration.java index 0993b92..cedf1a4 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/FieldDeclaration.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/FieldDeclaration.java @@ -9,7 +9,8 @@ public class FieldDeclaration extends BodyDeclaration implements IAnnotatable { private Type type; private String fieldName; - private String initializer; + private String initializer = null; + private String initializationBlock = null; private Map annotations = new HashMap<>(); public FieldDeclaration(Type type, String fieldName) { @@ -47,6 +48,14 @@ this.initializer = initializer; } + public String getInitializationBlock() { + return initializationBlock; + } + + public void setInitializationBlock(String initializationBlock) { + this.initializationBlock = initializationBlock; + } + @Override public Annotation getAnnotation(String name) { return annotations.get(name); @@ -67,10 +76,14 @@ for (Annotation annotation: getAnnotations()) { code += annotation.toString() + "\n"; } - if (initializer == null) { - code += "private " + type.getInterfaceTypeName() + " " + fieldName + ";\n"; + if (initializationBlock != null) { + code += "private " + type.getInterfaceTypeName() + " " + fieldName + ";\n" + initializationBlock + "\n"; } else { - code += "private " + type.getInterfaceTypeName() + " " + fieldName + " = " + initializer + ";\n"; + if (initializer == null) { + code += "private " + type.getInterfaceTypeName() + " " + fieldName + ";\n"; + } else { + code += "private " + type.getInterfaceTypeName() + " " + fieldName + " = " + initializer + ";\n"; + } } return code; } diff --git a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java index f90f701..0319c58 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java @@ -857,7 +857,23 @@ } return decoded; } - + + protected void setFieldInitializer(FieldDeclaration field, Type type, Expression initialValue) { + String initializer = null; + if (initialValue != null) { + String sideEffects[] = new String[]{""}; + initializer = initialValue.toImplementation(sideEffects); + if (sideEffects[0] == null || sideEffects[0].length() == 0) { + field.setInitializer(initializer); + } else { + field.setInitializationBlock("{\n" + sideEffects[0] + field.getName() + " = " + initializer + ";\n" + "}\n"); + } + } else if (type != null) { + initializer = DataConstraintModel.getDefaultValue(type); + field.setInitializer(initializer); + } + } + protected IResourceStateAccessor getPushAccessor(IPlatformSpecific platformSpec) { if (platformSpec.isMonolithic()) { return new IResourceStateAccessor() { diff --git a/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java b/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java index 37d70a5..3990544 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java @@ -518,7 +518,8 @@ Set children = resourceNode.getResourceHierarchy().getChildren(); if (children == null || children.size() == 0) { // leaf resource. - FieldDeclaration stateField = langSpec.newFieldDeclaration(resStateType, fieldOfResourceState, langSpec.getFieldInitializer(resStateType, resourceNode.getResourceHierarchy().getInitialValue())); + FieldDeclaration stateField = langSpec.newFieldDeclaration(resStateType, fieldOfResourceState); + setFieldInitializer(stateField, resStateType, resourceNode.getResourceHierarchy().getInitialValue()); component.addField(stateField); // Add a parameter to initialize the state field to the constructor. // Map nameToParam = constructorParams.get(resourceNode.getResourceHierarchy()); @@ -534,7 +535,8 @@ ResourceHierarchy child = children.iterator().next(); if (children.size() == 1 && child.getNumParameters() > 0) { // map or list. - FieldDeclaration stateField = langSpec.newFieldDeclaration(resStateType, fieldOfResourceState, langSpec.getFieldInitializer(resStateType, resourceNode.getResourceHierarchy().getInitialValue())); + FieldDeclaration stateField = langSpec.newFieldDeclaration(resStateType, fieldOfResourceState); + setFieldInitializer(stateField, resStateType, resourceNode.getResourceHierarchy().getInitialValue()); component.addField(stateField); } else { // class @@ -1736,10 +1738,8 @@ if (langSpec.declareField()) { // Declare the cache field. String cacheFieldName = langSpec.toVariableName(getComponentName(srcResPath.getResourceHierarchy(), langSpec)); - FieldDeclaration cacheField = langSpec.newFieldDeclaration( - srcResPath.getResourceStateType(), - cacheFieldName, - langSpec.getFieldInitializer(srcResPath.getResourceStateType(), srcResPath.getResourceHierarchy().getInitialValue())); + FieldDeclaration cacheField = langSpec.newFieldDeclaration(srcResPath.getResourceStateType(), cacheFieldName); + setFieldInitializer(cacheField, srcResPath.getResourceStateType(), srcResPath.getResourceHierarchy().getInitialValue()); if (component != null) { component.addField(cacheField); } else if (parentComponent != null){ diff --git a/AlgebraicDataflowArchitectureModel/src/generators/ILanguageSpecific.java b/AlgebraicDataflowArchitectureModel/src/generators/ILanguageSpecific.java index 5e5ea4a..bce2707 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/ILanguageSpecific.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/ILanguageSpecific.java @@ -25,7 +25,6 @@ Type newMapType(Type keyType, String compTypeName); Type newTupleType(List compTypes); String getVariableDeclaration(String typeName, String varName); - String getFieldInitializer(Type type, Expression initialValue); boolean declareField(); String getSelfExp(); String getFieldAccessor(String fieldName); diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java b/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java index 7115e57..e40f789 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java @@ -101,17 +101,6 @@ } @Override - public String getFieldInitializer(Type type, Expression initialValue) { - String initializer = null; - if (initialValue != null) { - initializer = initialValue.toImplementation(new String[] {""}); - } else if (type != null) { - initializer = DataConstraintModel.getDefaultValue(type); - } - return initializer; - } - - @Override public boolean declareField() { return true; } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java index 8dba4c8..6f32281 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java @@ -14,6 +14,7 @@ public class JsonTerm extends Term { private Map keyToIndex = new HashMap<>(); + private static int count = 0; public JsonTerm() { super(new Symbol("json", -1)); @@ -93,15 +94,14 @@ } public String toImplementation(String[] sideEffects) { - final int count[] = new int[]{0}; - String temp = "temp_json" + count[0]; + String temp = "temp_json" + count; + count++; String impl = ""; impl += "Map " + temp + " = new HashMap<>();\n"; for (String key: keySet()) { impl += temp + ".put(\"" + key + "\", " + get(key).toImplementation(sideEffects) + ");\n"; } sideEffects[0] += impl; - count[0]++; return temp; } }