diff --git a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java index beae21c..55f1ddc 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java @@ -436,15 +436,11 @@ for (ChannelMember out: ch.getOutputChannelMembers()) { if (out.getIdentifierTemplate() == resourceNode.getIdentifierTemplate()) { String[] sideEffects = new String[] {""}; - if (!isContainedPush) { - // All incoming edges are in PULL-style. - String curState = ch.deriveUpdateExpressionOf(out, getPullAccessor()).toImplementation(sideEffects); - getter.addStatement(sideEffects[0] + langSpec.getReturnStatement(curState) + langSpec.getStatementDelimiter()); - } else { - // At least one incoming edge is in PUSH-style. - String curState = ch.deriveUpdateExpressionOf(out, getPullAccessor(), inputIdentifierToStateAccessor).toImplementation(sideEffects); - getter.addStatement(sideEffects[0] + langSpec.getReturnStatement(curState) + langSpec.getStatementDelimiter()); - } + // The following process is common to the cases of 1) and 2). + // 1) All incoming edges are in PULL-style. + // 2) At least one incoming edge is in PUSH-style. + String curState = ch.deriveUpdateExpressionOf(out, getPullAccessor(), inputIdentifierToStateAccessor).toImplementation(sideEffects); + getter.addStatement(sideEffects[0] + langSpec.getReturnStatement(curState) + langSpec.getStatementDelimiter()); break; } } @@ -455,7 +451,7 @@ } if (resourcesToReturn == null || resourcesToReturn.size() == 1) return getter; } else if (resourcesToReturn == null || resourcesToReturn.size() == 1) { - // Declare and fill a mediate getter method. + // Declare a mediate getter method to return a single value. String getterMethodName = "get"; ResourceNode returnedRes = null; if (resourcesToReturn != null) { @@ -466,6 +462,18 @@ getterMethodName += langSpec.toComponentName(returnedRes.getIdentifierTemplate().getResourceName()) + "Value"; MethodDeclaration mediateGetter = langSpec.newMethodDeclaration(getterMethodName, returnedRes.getIdentifierTemplate().getResourceStateType()); component.addMethod(mediateGetter); + + // Add a return statement. + if (node.getOutdegree() == 1) { + Edge outEdge = node.getOutEdges().iterator().next(); + ObjectNode dstNode = (ObjectNode) outEdge.getDestination(); + MethodDeclaration nextGetter = declareAndFillGetterMethods(dstNode, outEdge, dataFlowInform, componentMap, langSpec); + mediateGetter.addStatement( + langSpec.getReturnStatement(langSpec.getMethodInvocation(dstNode.getName(), nextGetter.getName())) + + langSpec.getStatementDelimiter()); + } else { + // Unexpected. + } return mediateGetter; } // Declare a mediate getter method to return multiple values.