diff --git a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java index ae548ee..d1cb9de 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java @@ -93,10 +93,18 @@ // map or list. if (DataConstraintModel.typeList.isAncestorOf(res.getResourceStateType())) { // list. - return langSpec.newListType(getComponentName(child, langSpec)); + if (generatesComponent(child)) { + return langSpec.newListType(getComponentName(child, langSpec)); + } else { + return langSpec.newListType(getImplStateType(child, langSpec).getImplementationTypeName()); + } } else if (DataConstraintModel.typeMap.isAncestorOf(res.getResourceStateType())) { // map. - return langSpec.newMapType(DataConstraintModel.typeString, getComponentName(child, langSpec)); + if (generatesComponent(child)) { + return langSpec.newMapType(DataConstraintModel.typeString, getComponentName(child, langSpec)); + } else { + return langSpec.newMapType(DataConstraintModel.typeString, getImplStateType(child, langSpec).getImplementationTypeName()); + } } return null; } else { @@ -105,6 +113,12 @@ } } } + + public static boolean generatesComponent(ResourceHierarchy res) { + return res.getParent() == null || !(res.getChildren() == null || res.getChildren().size() == 0); +// Type resType = res.getResourceStateType(); +// return DataConstraintModel.typeJson.isAncestorOf(resType) || DataConstraintModel.typeList.isAncestorOf(resType) || DataConstraintModel.typeMap.isAncestorOf(resType); + } /** * Generate source codes in specified language from data-flow/control-flow graph. @@ -336,23 +350,23 @@ } protected void declareAccessorInMainComponent(TypeDeclaration mainComponent, ResourceNode accessRes, MethodDeclaration stateGetter, ILanguageSpecific langSpec) { - List mainParams = new ArrayList<>(); + List mainGetterParams = new ArrayList<>(); int v = 1; for (Selector selector: accessRes.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable var = (Variable) selector.getExpression(); - mainParams.add(langSpec.newVariableDeclaration(var.getType(), var.getName())); + mainGetterParams.add(langSpec.newVariableDeclaration(var.getType(), var.getName())); } else if (selector.getExpression() instanceof Term) { Term var = (Term) selector.getExpression(); - mainParams.add(new VariableDeclaration(var.getType(), "v" + v)); + mainGetterParams.add(new VariableDeclaration(var.getType(), "v" + v)); } v++; } MethodDeclaration accessor = null; - if (mainParams.size() == 0) { + if (mainGetterParams.size() == 0) { accessor = langSpec.newMethodDeclaration(getterPrefix + getComponentName(accessRes.getResourceHierarchy(), langSpec), getImplStateType(accessRes.getResourceHierarchy(), langSpec)); } else { - accessor = langSpec.newMethodDeclaration(getterPrefix + getComponentName(accessRes.getResourceHierarchy(), langSpec), false, getImplStateType(accessRes.getResourceHierarchy(), langSpec), mainParams); + accessor = langSpec.newMethodDeclaration(getterPrefix + getComponentName(accessRes.getResourceHierarchy(), langSpec), false, getImplStateType(accessRes.getResourceHierarchy(), langSpec), mainGetterParams); } Block block = new Block(); Expression getState = JavaCodeGenerator.pullAccessor.getCurrentStateAccessorFor(accessRes.getOutSideResource(), null); @@ -500,8 +514,7 @@ } } - if (target.getResourceHierarchy().getNumParameters() > 0 - || (target.getResourceHierarchy().getChildren() != null && target.getResourceHierarchy().getChildren().size() > 0)) { + if (generatesComponent(target.getResourceHierarchy())) { Term newGetter = new Term(new Symbol(getterOfResourceState, 1, Symbol.Type.METHOD)); newGetter.addChild(getter); getter = newGetter;