diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/MethodDeclaration.java b/AlgebraicDataflowArchitectureModel/src/code/ast/MethodDeclaration.java index 503768e..333388e 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/MethodDeclaration.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/MethodDeclaration.java @@ -82,6 +82,9 @@ } public Block getBody() { + if (body == null) { + body = new Block(); + } return body; } diff --git a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java index e8208ea..d127e93 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java @@ -291,19 +291,19 @@ protected void fillStateGetterMethod(MethodDeclaration stateGetter, ResourceHierarchy resourceHierarchy, Type resStateType) { // returns the state field when all incoming data-flow edges are PUSH-style. if (langSpec.isValueType(resStateType)) { - stateGetter.addStatement(langSpec.getReturnStatement(langSpec.getFieldAccessor(fieldOfResourceState)) + langSpec.getStatementDelimiter()); // return value; + stateGetter.addStatement(langSpec.getReturnStatement(langSpec.getFieldAccessor(fieldOfResourceState))); // return value; } else { if (resourceHierarchy.getChildren() != null && resourceHierarchy.getChildren().size() == 1 && resourceHierarchy.getChildren().iterator().next().getNumParameters() > 0) { // list or map // if (!platformSpec.isMonolithic()) { // // For REST API -// stateGetter.addStatement(langSpec.getReturnStatement(langSpec.getFieldAccessor(fieldOfResourceState)) + langSpec.getStatementDelimiter()); // return value; +// stateGetter.addStatement(langSpec.getReturnStatement(langSpec.getFieldAccessor(fieldOfResourceState))); // return value; // } else { String implTypeName = resStateType.getImplementationTypeName(); // copy the current state to be returned as a 'value' List parameters = new ArrayList<>(); parameters.add(langSpec.getFieldAccessor(fieldOfResourceState)); - stateGetter.addStatement(langSpec.getReturnStatement(langSpec.getConstructorInvocation(implTypeName, parameters)) + langSpec.getStatementDelimiter()); // return new Resource(value); + stateGetter.addStatement(langSpec.getReturnStatement(langSpec.getConstructorInvocation(implTypeName, parameters))); // return new Resource(value); // } } else { if (resourceHierarchy.getChildren() == null || resourceHierarchy.getChildren().size() == 0) { @@ -316,7 +316,7 @@ // copy the current state to be returned as a 'value' List parameters = new ArrayList<>(); parameters.add(langSpec.getFieldAccessor(fieldOfResourceState)); - stateGetter.addStatement(langSpec.getReturnStatement(langSpec.getConstructorInvocation(implTypeName, parameters)) + langSpec.getStatementDelimiter()); // return new Resource(value); + stateGetter.addStatement(langSpec.getReturnStatement(langSpec.getConstructorInvocation(implTypeName, parameters))); // return new Resource(value); // } } else { Term composer = null; @@ -346,9 +346,9 @@ String[] sideEffects = new String[] {null}; String returnValue = composer.toImplementation(sideEffects); if (sideEffects[0] != null) { - stateGetter.addStatement(sideEffects[0] + langSpec.getReturnStatement(returnValue) + langSpec.getStatementDelimiter()); + stateGetter.addStatement(sideEffects[0] + langSpec.getReturnStatement(returnValue)); } else { - stateGetter.addStatement(langSpec.getReturnStatement(returnValue) + langSpec.getStatementDelimiter()); + stateGetter.addStatement(langSpec.getReturnStatement(returnValue)); } } } @@ -386,7 +386,7 @@ String[] sideEffects = new String[] {null}; String returnValue = selector.toImplementation(sideEffects); if (sideEffects[0] != null) descendantGetter.addStatement(sideEffects[0]); - descendantGetter.addStatement(langSpec.getReturnStatement(returnValue) + langSpec.getStatementDelimiter()); + descendantGetter.addStatement(langSpec.getReturnStatement(returnValue)); } } @@ -416,15 +416,15 @@ } Block block = new Block(); Expression getState = getPullAccessor(platformSpec).getDirectStateAccessorFor(accessResPath, null); - block.addStatement(langSpec.getReturnStatement(getState.toImplementation(new String[] {null})) + langSpec.getStatementDelimiter()); + block.addStatement(langSpec.getReturnStatement(getState.toImplementation(new String[] {null}))); // if (stateGetter.getParameters() == null || stateGetter.getParameters().size() == 0) { -// block.addStatement(langSpec.getReturnStatement(langSpec.getMethodInvocation(accessRes.getResourceName(), stateGetter.getName())) + langSpec.getStatementDelimiter()); +// block.addStatement(langSpec.getReturnStatement(langSpec.getMethodInvocation(accessRes.getResourceName(), stateGetter.getName()))); // } else { // List resParams = new ArrayList<>(); // for (VariableDeclaration var: stateGetter.getParameters()) { // resParams.add(var.getName()); // } -// block.addStatement(langSpec.getReturnStatement(langSpec.getMethodInvocation(accessRes.getResourceName(), stateGetter.getName(), resParams)) + langSpec.getStatementDelimiter()); +// block.addStatement(langSpec.getReturnStatement(langSpec.getMethodInvocation(accessRes.getResourceName(), stateGetter.getName(), resParams))); // } accessor.setBody(block); mainComponent.addMethod(accessor); diff --git a/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java b/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java index b6f023a..d37689a 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java @@ -1278,7 +1278,7 @@ // generate a return statement. String[] sideEffects = new String[] {""}; String curState = ch.deriveUpdateExpressionOf(out, messageTerm, getPullAccessor(platformSpec)).toImplementation(sideEffects); - stateGetter.addStatement(sideEffects[0] + langSpec.getReturnStatement(curState) + langSpec.getStatementDelimiter()); + stateGetter.addStatement(sideEffects[0] + langSpec.getReturnStatement(curState)); } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork | InvalidMessage | UnificationFailed | ValueUndefined e) { e.printStackTrace(); @@ -1643,21 +1643,25 @@ jsonParam.setType(DataConstraintModel.typeListStr); jsonParam.setName(paramName + "_json"); paramConverter += langSpec.newVariableDeclaration(paramType, paramName) + langSpec.getAssignment() + langSpec.getConstructorInvocation(paramType.getImplementationTypeName(), null) + langSpec.getStatementDelimiter() + "\n"; - paramConverter += langSpec.getForStatementForCollection(langSpec.newVariableDeclaration(DataConstraintModel.typeString, "str"), jsonParam.getName()) + "\n"; + EnhancedForStatement forStatement = langSpec.getForStatementForCollection(langSpec.newVariableDeclaration(DataConstraintModel.typeString, "str"), jsonParam.getName()); + Block forBlock = new Block(); Type mapType = convertFromEntryToMapType(compType, langSpec); - paramConverter += "\t" + ((RestApiSpecific) platformSpec).getConversionFromJsonString("str", "i", mapType.getInterfaceTypeName()) + langSpec.getStatementDelimiter() + "\n"; - paramConverter += "\t" + langSpec.getMethodInvocation(paramName, DataConstraintModel.append.getImplName(), List.of(getCodeForConversionFromMapToTuple(compType, "i", langSpec))) + langSpec.getStatementDelimiter() + "\n"; - paramConverter += langSpec.getEndForStatement("str"); + forBlock.addStatement(((RestApiSpecific) platformSpec).getConversionFromJsonString("str", "i", mapType.getInterfaceTypeName()) + langSpec.getStatementDelimiter()); + forBlock.addStatement(langSpec.getMethodInvocation(paramName, DataConstraintModel.append.getImplName(), List.of(getCodeForConversionFromMapToTuple(compType, "i", langSpec))) + langSpec.getStatementDelimiter()); + forStatement.setBody(forBlock); + paramConverter += forStatement; ((RestApiSpecific) platformSpec).addJsonException(update); } else if (compType != null && DataConstraintModel.typePair.isAncestorOf(compType)) { jsonParam.setType(DataConstraintModel.typeListStr); jsonParam.setName(paramName + "_json"); paramConverter += langSpec.newVariableDeclaration(paramType, paramName) + langSpec.getAssignment() + langSpec.getConstructorInvocation(paramType.getImplementationTypeName(), null) + langSpec.getStatementDelimiter() + "\n"; - paramConverter += langSpec.getForStatementForCollection(langSpec.newVariableDeclaration(DataConstraintModel.typeString, "str"), jsonParam.getName()) + "\n"; + EnhancedForStatement forStatement = langSpec.getForStatementForCollection(langSpec.newVariableDeclaration(DataConstraintModel.typeString, "str"), jsonParam.getName()); + Block forBlock = new Block(); Type mapType = convertFromEntryToMapType(compType, langSpec); - paramConverter += "\t" + ((RestApiSpecific) platformSpec).getConversionFromJsonString("str", "i", mapType.getInterfaceTypeName()) + langSpec.getStatementDelimiter() + "\n"; - paramConverter += "\t" + langSpec.getMethodInvocation(paramName, DataConstraintModel.append.getImplName(), List.of(getCodeForConversionFromMapToPair(compType, "i", langSpec))) + langSpec.getStatementDelimiter() + "\n"; - paramConverter += langSpec.getEndForStatement("str"); + forBlock.addStatement(((RestApiSpecific) platformSpec).getConversionFromJsonString("str", "i", mapType.getInterfaceTypeName()) + langSpec.getStatementDelimiter()); + forBlock.addStatement(langSpec.getMethodInvocation(paramName, DataConstraintModel.append.getImplName(), List.of(getCodeForConversionFromMapToPair(compType, "i", langSpec))) + langSpec.getStatementDelimiter()); + forStatement.setBody(forBlock); + paramConverter += forStatement; ((RestApiSpecific) platformSpec).addJsonException(update); } else if (compType != null && DataConstraintModel.typeMap.isAncestorOf(compType)) { jsonParam.setType(DataConstraintModel.typeListStr); @@ -3207,7 +3211,7 @@ resPath.replacePathParam(i, pathParam, null); } Expression getState = getPullAccessor(platformSpec).getDirectStateAccessorFor(resPath, resPath.getRoot()); - getterAccessor.getBody().addStatement(langSpec.getReturnStatement(getState.toImplementation(new String[] {null})) + langSpec.getStatementDelimiter()); + getterAccessor.getBody().addStatement(langSpec.getReturnStatement(getState.toImplementation(new String[] {null}))); if (!platformSpec.isMonolithic()) { ((RestApiSpecific) platformSpec).addGetAnnotations(getterAccessor); if (resourcePath.length() > 0) { diff --git a/AlgebraicDataflowArchitectureModel/src/generators/ILanguageSpecific.java b/AlgebraicDataflowArchitectureModel/src/generators/ILanguageSpecific.java index 0952bb4..2dfe533 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/ILanguageSpecific.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/ILanguageSpecific.java @@ -41,8 +41,6 @@ ForStatement getForStatementForList(String varName, String list); EnhancedForStatement getForStatementForCollection(VariableDeclaration varDeclaration, String collection); EnhancedForStatement getForStatementForMap(String varName, String map); - String getEndForStatement(); - String getEndForStatement(String varName); String toComponentName(String name); String toVariableName(String name); String getMainComponentName(); diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java b/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java index 8effbd1..6b3b259 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java @@ -84,7 +84,7 @@ public ListType newListType(Type compType, Type parentListType) { List typeArgs = new ArrayList<>(); typeArgs.add((code.ast.Type) compType.getInterfaceType()); - return new ListType("List", new code.ast.ParameterizedType(typeArrayList), new code.ast.ParameterizedType(JavaSpecific.typeList, typeArgs), compType, parentListType); + return new ListType("List", new code.ast.ParameterizedType(typeArrayList), new code.ast.ParameterizedType(JavaSpecific.typeList, typeArgs), parentListType, compType); } @Override @@ -98,7 +98,7 @@ List typeArgs = new ArrayList<>(); typeArgs.add((code.ast.Type) keyType.getInterfaceType()); typeArgs.add((code.ast.Type) valueType.getInterfaceType()); - return new MapType("Map", new code.ast.ParameterizedType(typeHashMap), new code.ast.ParameterizedType(JavaSpecific.typeMap, typeArgs), keyType, valueType, parentMapType); + return new MapType("Map", new code.ast.ParameterizedType(typeHashMap), new code.ast.ParameterizedType(JavaSpecific.typeMap, typeArgs), parentMapType, keyType, valueType); } @Override @@ -111,7 +111,7 @@ List typeArgs = new ArrayList<>(); typeArgs.add((code.ast.Type) keyType.getInterfaceType()); typeArgs.add((code.ast.Type) valueType.getInterfaceType()); - return new MapType("Map", new code.ast.ParameterizedType(typeHashMap), new code.ast.ParameterizedType(JavaSpecific.typeMap, typeArgs), keyType, valueType, parentMapType); + return new MapType("Map", new code.ast.ParameterizedType(typeHashMap), new code.ast.ParameterizedType(JavaSpecific.typeMap, typeArgs), parentMapType, keyType, valueType); } @Override @@ -132,7 +132,7 @@ interfaceType = new code.ast.ParameterizedType(typeMapEntry, typeArgs); } } - return new TupleType("Tuple", implType, interfaceType, componentTypes, parentTupleType); + return new TupleType("Tuple", implType, interfaceType, parentTupleType, componentTypes); } @Override @@ -282,16 +282,6 @@ } @Override - public String getEndForStatement() { - return "}"; - } - - @Override - public String getEndForStatement(String varName) { - return "}"; - } - - @Override public String toComponentName(String name) { return name.substring(0, 1).toUpperCase() + name.substring(1); } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/TupleType.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/TupleType.java index ef95568..a0ed0aa 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/TupleType.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/TupleType.java @@ -25,7 +25,7 @@ this.componentTypes = new ArrayList<>(); } - public TupleType(String typeName, code.ast.Type implementationType, code.ast.Type interfaceType, List componentTypes, Type parentTupleType) { + public TupleType(String typeName, code.ast.Type implementationType, code.ast.Type interfaceType, Type parentTupleType, List componentTypes) { super(typeName, implementationType, interfaceType, parentTupleType); this.componentTypes = componentTypes; }