diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/IExpressionVisitor.java b/AlgebraicDataflowArchitectureModel/src/code/ast/IExpressionVisitor.java index c8faa50..fe01735 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/IExpressionVisitor.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/IExpressionVisitor.java @@ -7,16 +7,16 @@ import models.dataConstraintModel.JsonAccessor; import models.dataConstraintModel.JsonTerm; -public interface IExpressionVisitor { - String visit(Term term, String[] sideEffects); +public interface IExpressionVisitor { + T visit(Term term, String[] sideEffects); - String visit(Field field, String[] sideEffects); + T visit(Field field, String[] sideEffects); - String visit(Constant constant, String[] sideEffects); + T visit(Constant constant, String[] sideEffects); - String visit(Variable variable, String[] sideEffects); + T visit(Variable variable, String[] sideEffects); - String visit(JsonTerm jsonTerm, String[] sideEffects); + T visit(JsonTerm jsonTerm, String[] sideEffects); - String visit(JsonAccessor jsonAccessor, String[] sideEffects); + T visit(JsonAccessor jsonAccessor, String[] sideEffects); } diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JavaImplementationVisitor.java b/AlgebraicDataflowArchitectureModel/src/generators/JavaImplementationVisitor.java index 46cd543..3888b41 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JavaImplementationVisitor.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JavaImplementationVisitor.java @@ -12,36 +12,36 @@ * * @author s-yamagiwa */ -public class JavaImplementationVisitor implements IExpressionVisitor { +public class JavaImplementationVisitor implements IExpressionVisitor { private static int jsonCount = 0; @Override - public String visit(Term term, String[] sideEffects) { + public code.ast.Expression visit(Term term, String[] sideEffects) { int[] implParamOrder = term.getSymbol().getImplParamOrder(); if (term.getSymbol().isImplLambda()) { String[] components = term.getSymbol().getImplName().split("->"); String component0 = components[0].replace("(", "").replace(")", ""); String[] params = component0.split(","); - String exp = components[1]; - String receiver = ""; + String expStr = components[1]; + code.ast.Expression receiver = null; if (implParamOrder == null) { receiver = term.getChildren().get(0).accept(this, sideEffects); - exp = exp.replace(params[0], receiver); + expStr = expStr.replace(params[0], receiver.toString()); for (int i = 1; i < params.length; i++) { - exp = exp.replace(params[i], term.getChildren().get(i).accept(this, sideEffects)); + expStr = expStr.replace(params[i], term.getChildren().get(i).accept(this, sideEffects).toString()); } } else { receiver = term.getChildren().get(implParamOrder[0]).accept(this, sideEffects); - exp = exp.replace(params[0], receiver); + expStr = expStr.replace(params[0], receiver.toString()); for (int i = 1; i < params.length; i++) { - exp = exp.replace(params[i], term.getChildren().get(implParamOrder[i]).accept(this, sideEffects)); + expStr = expStr.replace(params[i], term.getChildren().get(implParamOrder[i]).accept(this, sideEffects).toString()); } } if (term.getSymbol().isImplWithSideEffect()) { - sideEffects[0] = sideEffects[0] + exp + ";\n"; - exp = receiver; + sideEffects[0] = sideEffects[0] + expStr + ";\n"; + return receiver; } - return exp; + return new code.ast.Constant(expStr); } if (term.getSymbol().isImplGenerative()) { Type[] childrenTypes = new Type[term.getChildren().size()]; @@ -56,15 +56,15 @@ childrenTypes[i] = ((Term) child).getType(); } String[] childSideEffect = new String[]{""}; - childrenImpl[i] = child.accept(this, childSideEffect); + childrenImpl[i] = child.accept(this, childSideEffect).toString(); childrenSideEffects[i] = childSideEffect[0]; } - String exp = term.getSymbol().generate(term.getType(), childrenTypes, childrenImpl, childrenSideEffects, sideEffects); + String expStr = term.getSymbol().generate(term.getType(), childrenTypes, childrenImpl, childrenSideEffects, sideEffects); if (term.getSymbol().isImplWithSideEffect()) { - sideEffects[0] = sideEffects[0] + exp; - exp = childrenImpl[0]; // the value of this term + sideEffects[0] = sideEffects[0] + expStr; + return new code.ast.Constant(childrenImpl[0]); // the value of this term } - return exp; + return new code.ast.Constant(expStr); } else { for (int i = 0; i < term.getChildren().size(); i++) { Expression child = term.getChildren().get(implParamOrder[i]); @@ -74,123 +74,123 @@ childrenTypes[i] = ((Term) child).getType(); } String[] childSideEffect = new String[]{""}; - childrenImpl[i] = child.accept(this, childSideEffect); + childrenImpl[i] = child.accept(this, childSideEffect).toString(); childrenSideEffects[i] = childSideEffect[0]; } - String exp = term.getSymbol().generate(term.getType(), childrenTypes, childrenImpl, childrenSideEffects, sideEffects); + String expStr = term.getSymbol().generate(term.getType(), childrenTypes, childrenImpl, childrenSideEffects, sideEffects); if (term.getSymbol().isImplWithSideEffect()) { - sideEffects[0] = sideEffects[0] + exp; - exp = childrenImpl[0]; // the value of this term + sideEffects[0] = sideEffects[0] + expStr; + return new code.ast.Constant(childrenImpl[0]); // the value of this term } - return exp; + return new code.ast.Constant(expStr); } } if (term.getArity() == 2 && term.getSymbol().isImplInfix()) { if (implParamOrder == null) { - return "(" + term.getChildren().get(0).accept(this, sideEffects) + term.getSymbol().toImplementation() + term.getChildren().get(1).accept(this, sideEffects) + ")"; + return new code.ast.MethodInvocation(term.getChildren().get(0).accept(this, sideEffects), term.getSymbol().toImplementation(), java.util.List.of(term.getChildren().get(1).accept(this, sideEffects))); } else { - return "(" + term.getChildren().get(implParamOrder[0]).accept(this, sideEffects) + term.getSymbol().toImplementation() + term.getChildren().get(implParamOrder[1]).accept(this, sideEffects) + ")"; + return new code.ast.MethodInvocation(term.getChildren().get(implParamOrder[0]).accept(this, sideEffects), term.getSymbol().toImplementation(), java.util.List.of(term.getChildren().get(implParamOrder[1]).accept(this, sideEffects))); } } if ((term.getArity() >= 1 || term.getArity() == -1) && term.getSymbol().isImplMethod()) { if (implParamOrder == null) { - String exp = null; - String receiver = ""; + code.ast.MethodInvocation invocation = null; + code.ast.Expression receiver = null; if (term.getChildren().size() > 0 && term.getChildren().get(0) != null) { receiver = term.getChildren().get(0).accept(this, sideEffects); - exp = receiver + "." + term.getSymbol().toImplementation() + "("; + invocation = new code.ast.MethodInvocation(receiver, term.getSymbol().toImplementation()); } else { - exp = term.getSymbol().toImplementation() + "("; + invocation = new code.ast.MethodInvocation(term.getSymbol().toImplementation()); } - String delimiter = ""; + java.util.List args = new java.util.ArrayList<>(); for (int i = 1; i < term.getChildren().size(); i++) { Expression e = term.getChildren().get(i); - exp += (delimiter + e.accept(this, sideEffects)); - delimiter = ","; + args.add(e.accept(this, sideEffects)); } - exp += ")"; + invocation.setArguments(args); if (term.getSymbol().isImplWithSideEffect()) { - sideEffects[0] = sideEffects[0] + exp + ";\n"; - exp = receiver; + sideEffects[0] = sideEffects[0] + invocation.toString() + ";\n"; + return receiver; } - return exp; + return invocation; } else { - String receiver = term.getChildren().get(implParamOrder[0]).accept(this, sideEffects); - String exp = receiver + "." + term.getSymbol().toImplementation() + "("; - String delimiter = ""; + code.ast.Expression receiver = term.getChildren().get(implParamOrder[0]).accept(this, sideEffects); + code.ast.MethodInvocation invocation = new code.ast.MethodInvocation(receiver, term.getSymbol().toImplementation()); + java.util.List args = new java.util.ArrayList<>(); for (int i = 1; i < term.getChildren().size(); i++) { Expression e = term.getChildren().get(implParamOrder[i]); - exp += (delimiter + e.accept(this, sideEffects)); - delimiter = ","; + args.add(e.accept(this, sideEffects)); } - exp += ")"; + invocation.setArguments(args); if (term.getSymbol().isImplWithSideEffect()) { - sideEffects[0] = sideEffects[0] + exp + ";\n"; - exp = receiver; + sideEffects[0] = sideEffects[0] + invocation.toString() + ";\n"; + return receiver; } - return exp; + return invocation; } } else { if (implParamOrder == null) { - String exp = term.getSymbol().toImplementation() + "("; - String delimiter = ""; + code.ast.MethodInvocation invocation = new code.ast.MethodInvocation(term.getSymbol().toImplementation()); + java.util.List args = new java.util.ArrayList<>(); for (Expression e : term.getChildren()) { - exp += (delimiter + e.accept(this, sideEffects)); - delimiter = ","; + args.add(e.accept(this, sideEffects)); } - return exp + ")"; + invocation.setArguments(args); + return invocation; } else { - String exp = term.getSymbol().toImplementation() + "("; - String delimiter = ""; + code.ast.MethodInvocation invocation = new code.ast.MethodInvocation(term.getSymbol().toImplementation()); + java.util.List args = new java.util.ArrayList<>(); for (int i = 0; i < term.getChildren().size(); i++) { Expression e = term.getChildren().get(implParamOrder[i]); - exp += (delimiter + e.accept(this, sideEffects)); - delimiter = ","; + args.add(e.accept(this, sideEffects)); } - return exp + ")"; + invocation.setArguments(args); + return invocation; } } } @Override - public String visit(Field field, String[] sideEffects) { - return new code.ast.FieldAccess(new code.ast.ThisExpression(), visit((Constant) field, sideEffects)).toString(); + public code.ast.Expression visit(Field field, String[] sideEffects) { + return new code.ast.FieldAccess(new code.ast.ThisExpression(), visit((Constant) field, sideEffects).toString()); } @Override - public String visit(Constant constant, String[] sideEffects) { + public code.ast.Expression visit(Constant constant, String[] sideEffects) { if (constant.getSymbol().isImplGenerative()) { String exp = constant.getSymbol().generate(constant.getType(), new Type[]{}, new String[]{}, new String[]{}, sideEffects); - return exp; + return new code.ast.Constant(exp); } - return new code.ast.Constant(constant.getSymbol().getImplName()).toString(); + return new code.ast.Constant(constant.getSymbol().getImplName()); } @Override - public String visit(Variable variable, String[] sideEffects) { - return new code.ast.Variable(variable.getName()).toString(); + public code.ast.Expression visit(Variable variable, String[] sideEffects) { + return new code.ast.Variable(variable.getName()); } @Override - public String visit(JsonTerm jsonTerm, String[] sideEffects) { + public code.ast.Expression visit(JsonTerm jsonTerm, String[] sideEffects) { String temp = "temp_json" + jsonCount; jsonCount++; String impl = ""; impl += "Map " + temp + " = new HashMap<>();\n"; for (String key : jsonTerm.keySet()) { - impl += temp + ".put(\"" + key + "\", " + jsonTerm.get(key).accept(this, sideEffects) + ");\n"; + impl += temp + ".put(\"" + key + "\", " + jsonTerm.get(key).accept(this, sideEffects).toString() + ");\n"; } sideEffects[0] += impl; - return temp; + return new code.ast.Variable(temp); } @Override - public String visit(JsonAccessor jsonAccessor, String[] sideEffects) { + public code.ast.Expression visit(JsonAccessor jsonAccessor, String[] sideEffects) { if (jsonAccessor.getSymbol().equals(DataConstraintModel.dotParam)) { - return jsonAccessor.getChildren().get(0).accept(this, sideEffects) + "." + jsonAccessor.getSymbol().toImplementation() + "(" + jsonAccessor.getChildren().get(1).accept(this, sideEffects) + ")"; + code.ast.MethodInvocation invocation = new code.ast.MethodInvocation(jsonAccessor.getChildren().get(0).accept(this, sideEffects), jsonAccessor.getSymbol().toImplementation()); + invocation.setArguments(java.util.List.of(jsonAccessor.getChildren().get(1).accept(this, sideEffects))); + return invocation; } return visit((Term) jsonAccessor, sideEffects); } diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Constant.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Constant.java index cd1c8da..3433b19 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Constant.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Constant.java @@ -45,11 +45,11 @@ } public String toImplementation(String[] sideEffects) { - return accept(new JavaImplementationVisitor(), sideEffects); + return accept(new JavaImplementationVisitor(), sideEffects).toString(); } @Override - public String accept(IExpressionVisitor visitor, String[] sideEffects) { + public T accept(IExpressionVisitor visitor, String[] sideEffects) { return visitor.visit(this, sideEffects); } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Expression.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Expression.java index 43dba7f..a30a164 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Expression.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Expression.java @@ -34,7 +34,7 @@ return getSubTerms(Variable.class); } - public abstract String accept(IExpressionVisitor visitor, String[] sideEffects); + public abstract T accept(IExpressionVisitor visitor, String[] sideEffects); /** * Get the implementation of this expression. diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java index 4b1858d..cca367a 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java @@ -47,7 +47,7 @@ } @Override - public String accept(IExpressionVisitor visitor, String[] sideEffects) { + public T accept(IExpressionVisitor visitor, String[] sideEffects) { return visitor.visit(this, sideEffects); } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Term.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Term.java index cc91fd9..edc2d78 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Term.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Term.java @@ -313,11 +313,11 @@ } public String toImplementation(String[] sideEffects) { - return accept(new JavaImplementationVisitor(), sideEffects); + return accept(new JavaImplementationVisitor(), sideEffects).toString(); } @Override - public String accept(IExpressionVisitor visitor, String[] sideEffects) { + public T accept(IExpressionVisitor visitor, String[] sideEffects) { return visitor.visit(this, sideEffects); } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Variable.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Variable.java index a1c1dcc..426d067 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Variable.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Variable.java @@ -89,7 +89,7 @@ } @Override - public String accept(IExpressionVisitor visitor, String[] sideEffects) { + public T accept(IExpressionVisitor visitor, String[] sideEffects) { return visitor.visit(this, sideEffects); } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonAccessor.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonAccessor.java index 17668ff..e8c525b 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonAccessor.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonAccessor.java @@ -206,11 +206,11 @@ } public String toImplementation(String[] sideEffects) { - return accept(new JavaImplementationVisitor(), sideEffects); + return accept(new JavaImplementationVisitor(), sideEffects).toString(); } @Override - public String accept(IExpressionVisitor visitor, String[] sideEffects) { + public T accept(IExpressionVisitor visitor, String[] sideEffects) { return visitor.visit(this, sideEffects); } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java index 4606711..96cf029 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java @@ -96,7 +96,7 @@ } @Override - public String accept(IExpressionVisitor visitor, String[] sideEffects) { + public T accept(IExpressionVisitor visitor, String[] sideEffects) { return visitor.visit(this, sideEffects); } }