diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/Assignment.java b/AlgebraicDataflowArchitectureModel/src/code/ast/Assignment.java index a7a2fc9..9145f61 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/Assignment.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/Assignment.java @@ -14,6 +14,11 @@ this.right = right; } + @Override + public Expression replace(Variable variable, Expression expression) { + return new Assignment(left.replace(variable, expression), right.replace(variable, expression)); + } + public Expression getLeft() { return left; } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/ClassInstanceCreation.java b/AlgebraicDataflowArchitectureModel/src/code/ast/ClassInstanceCreation.java index fe20607..fd6d138 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/ClassInstanceCreation.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/ClassInstanceCreation.java @@ -1,5 +1,6 @@ package code.ast; +import java.util.ArrayList; import java.util.List; public class ClassInstanceCreation extends Expression { @@ -16,6 +17,17 @@ this.arguments = arguments; } + @Override + public Expression replace(Variable variable, Expression expression) { + List replacedExpressions = new ArrayList<>(); + + for (Expression argument : arguments) { + replacedExpressions.add(argument.replace(variable, expression)); + } + + return new ClassInstanceCreation(type, replacedExpressions); + } + public Type getType() { return type; } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/Constant.java b/AlgebraicDataflowArchitectureModel/src/code/ast/Constant.java index f15c136..296f050 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/Constant.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/Constant.java @@ -12,6 +12,11 @@ this.value = value; } + @Override + public Expression replace(Variable variable, Expression expression) { + return this; + } + public String getValue() { return value; } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/Expression.java b/AlgebraicDataflowArchitectureModel/src/code/ast/Expression.java index d492947..4cc080e 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/Expression.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/Expression.java @@ -6,4 +6,14 @@ * @author s-yamagiwa */ public abstract class Expression extends ASTNode { + /** + * Replace {@code variable} with {@code expression} in AST. + * + * @param variable The variable to be replaced + * @param expression The expression that {@code variable} is replaced to + * @return A duplicated expression that is replaced with a given {@code expression} + * @implNote The instance of any member must be immutable + * @apiNote All variables match to the given one will be replaced with the given {@code expression} + */ + public abstract Expression replace(Variable variable, Expression expression); } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/FieldAccess.java b/AlgebraicDataflowArchitectureModel/src/code/ast/FieldAccess.java index bfae25d..dacc3e7 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/FieldAccess.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/FieldAccess.java @@ -19,6 +19,11 @@ this.fieldName = fieldName; } + @Override + public Expression replace(Variable variable, Expression expression) { + return new FieldAccess(expression.replace(variable, expression), fieldName); + } + public Expression getExpression() { return expression; } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/InfixExpression.java b/AlgebraicDataflowArchitectureModel/src/code/ast/InfixExpression.java index 8aa90be..adf0fba 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/InfixExpression.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/InfixExpression.java @@ -19,6 +19,11 @@ this.rightOperand = rightOperand; } + @Override + public Expression replace(Variable variable, Expression expression) { + return new InfixExpression(operator, leftOperand.replace(variable, expression), rightOperand.replace(variable, expression)); + } + public Symbol getOperator() { return this.operator; } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/MethodInvocation.java b/AlgebraicDataflowArchitectureModel/src/code/ast/MethodInvocation.java index 94c90e1..17d7358 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/MethodInvocation.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/MethodInvocation.java @@ -1,5 +1,6 @@ package code.ast; +import java.util.ArrayList; import java.util.List; /** @@ -39,6 +40,21 @@ this.arguments = arguments; } + @Override + public Expression replace(Variable variable, Expression expression) { + List replacedExpressions = new ArrayList<>(); + + for (Expression argument : arguments) { + replacedExpressions.add(argument.replace(variable, expression)); + } + + if (receiver == null) { + return new MethodInvocation(null, methodName, replacedExpressions); + } + + return new MethodInvocation(receiver.replace(variable, expression), methodName, replacedExpressions); + } + public Expression getReceiver() { return receiver; } @@ -65,27 +81,27 @@ @Override public String toString() { - if (receiver == null) { - StringBuilder builder = new StringBuilder(); - - builder.append(methodName).append("("); - - if (!arguments.isEmpty()) { - for (int i = 0; i < arguments.size(); i++) { - Expression argument = arguments.get(i); - - builder.append(argument.toString()); - - if (i < arguments.size() - 1) { - builder.append(", "); - } + StringBuilder builder = new StringBuilder(); + if (receiver != null) { + builder.append(receiver.toString()).append("."); + } + + builder.append(methodName).append("("); + + if (arguments != null && !arguments.isEmpty()) { + for (int i = 0; i < arguments.size(); i++) { + Expression argument = arguments.get(i); + + builder.append(argument.toString()); + + if (i < arguments.size() - 1) { + builder.append(", "); } } - - builder.append(");"); - - return builder.toString(); } - return super.toString(); + + builder.append(")"); + + return builder.toString(); } } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/ParenthesizedExpression.java b/AlgebraicDataflowArchitectureModel/src/code/ast/ParenthesizedExpression.java index a7b50cb..4fe659e 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/ParenthesizedExpression.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/ParenthesizedExpression.java @@ -13,6 +13,11 @@ this.expression = expression; } + @Override + public Expression replace(Variable variable, Expression expression) { + return new ParenthesizedExpression(this.expression.replace(variable, expression)); + } + public Expression getExpression() { return expression; } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/PostfixExpression.java b/AlgebraicDataflowArchitectureModel/src/code/ast/PostfixExpression.java index bc520ac..2793c32 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/PostfixExpression.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/PostfixExpression.java @@ -30,6 +30,11 @@ this.operator = operator; } + @Override + public Expression replace(Variable variable, Expression expression) { + return new PostfixExpression(operand.replace(variable, expression), operator); + } + public Expression getOperand() { return operand; } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/PrefixExpression.java b/AlgebraicDataflowArchitectureModel/src/code/ast/PrefixExpression.java index 2e854b7..debce52 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/PrefixExpression.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/PrefixExpression.java @@ -30,6 +30,11 @@ this.operator = operator; } + @Override + public Expression replace(Variable variable, Expression expression) { + return new PrefixExpression(operand.replace(variable, expression), operator); + } + public Expression getOperand() { return operand; } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/SuperMethodInvocation.java b/AlgebraicDataflowArchitectureModel/src/code/ast/SuperMethodInvocation.java index e7e3573..39380b2 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/SuperMethodInvocation.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/SuperMethodInvocation.java @@ -1,5 +1,6 @@ package code.ast; +import java.util.ArrayList; import java.util.List; /** @@ -21,6 +22,17 @@ this.arguments = arguments; } + @Override + public Expression replace(Variable variable, Expression expression) { + List replacedExpressions = new ArrayList<>(); + + for (Expression argument : arguments) { + replacedExpressions.add(argument.replace(variable, expression)); + } + + return new SuperMethodInvocation(methodName, replacedExpressions); + } + public String getMethodName() { return methodName; } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/ThisExpression.java b/AlgebraicDataflowArchitectureModel/src/code/ast/ThisExpression.java index aad8ee8..05d456d 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/ThisExpression.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/ThisExpression.java @@ -1,4 +1,13 @@ package code.ast; public class ThisExpression extends Expression { + @Override + public Expression replace(Variable variable, Expression expression) { + return this; + } + + @Override + public String toString() { + return "this"; + } } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/TypeLiteral.java b/AlgebraicDataflowArchitectureModel/src/code/ast/TypeLiteral.java index 4163b7d..69ebe3b 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/TypeLiteral.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/TypeLiteral.java @@ -12,6 +12,11 @@ this.type = type; } + @Override + public Expression replace(Variable variable, Expression expression) { + return this; + } + public Type getType() { return type; } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/Variable.java b/AlgebraicDataflowArchitectureModel/src/code/ast/Variable.java index 6d3dc00..baf9388 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/Variable.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/Variable.java @@ -12,6 +12,14 @@ this.name = name; } + @Override + public Expression replace(Variable variable, Expression expression) { + if (this == variable) { + return expression; + } + return this; + } + public String getName() { return name; } diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JavaImplementationVisitor.java b/AlgebraicDataflowArchitectureModel/src/generators/JavaImplementationVisitor.java index 3b1d8ce..0387689 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JavaImplementationVisitor.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JavaImplementationVisitor.java @@ -4,6 +4,10 @@ import models.dataConstraintModel.DataConstraintModel; import models.dataConstraintModel.JsonAccessor; import models.dataConstraintModel.JsonTerm; +import parser.Parser; + +import java.util.ArrayList; +import java.util.List; /** * This class is a Java implementation of {@link IExpressionVisitor} @@ -11,36 +15,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()]; @@ -55,15 +59,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]); @@ -73,120 +77,145 @@ 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(), 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(), 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 = ""; + List args = new 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 + ";\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()); + List args = new 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 + ";\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()); + List args = new 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()); + List args = new 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 "this." + visit((Constant) field, sideEffects); + 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 constant.getSymbol().getImplName(); + + return new code.ast.Constant(constant.getSymbol().getImplName()); } @Override - public String visit(Variable variable, String[] sideEffects) { - return variable.getName(); + public code.ast.Expression visit(Variable variable, String[] sideEffects) { + return new code.ast.Variable(variable.getName()); } @Override - public String visit(JsonTerm jsonTerm, String[] sideEffects) { - String temp = "temp_json" + jsonCount; + public code.ast.Expression visit(JsonTerm jsonTerm, String[] sideEffects) { + String tempName = "temp_json" + jsonCount; + code.ast.Variable tempVar = new code.ast.Variable(tempName); jsonCount++; - String impl = ""; - impl += "Map " + temp + " = new HashMap<>();\n"; + + code.ast.Block sideEffectsBlock = new code.ast.Block(); + + // Map temp_jsonN = new HashMap<>(); + code.ast.VariableDeclaration varDeclaration = new code.ast.VariableDeclaration( + DataConstraintModel.typeJson, + tempName, + new code.ast.ClassInstanceCreation(new code.ast.SimpleType("HashMap")) + ); + code.ast.VariableDeclarationStatement varStatement = new code.ast.VariableDeclarationStatement(); + varStatement.addFragment(varDeclaration); + + sideEffectsBlock.addStatement(varStatement); + + // temp_jsonN.put("key", value); for (String key : jsonTerm.keySet()) { - impl += temp + ".put(\"" + key + "\", " + jsonTerm.get(key).accept(this, sideEffects) + ");\n"; + code.ast.MethodInvocation putCall = new code.ast.MethodInvocation(tempVar, "put"); + List arguments = new ArrayList<>(); + arguments.add(new code.ast.Constant(Parser.DOUBLE_QUOT + key + Parser.DOUBLE_QUOT)); + arguments.add(jsonTerm.get(key).accept(this, sideEffects)); + putCall.setArguments(arguments); + + sideEffectsBlock.addStatement(new code.ast.ExpressionStatement(putCall)); } - sideEffects[0] += impl; - return temp; + + for (String statementStr : sideEffectsBlock.getStatements()) { + sideEffects[0] += statementStr + "\n"; + } + + return tempVar; } @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(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 2b0e579..836600c 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Constant.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Constant.java @@ -44,11 +44,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 65345a1..910518e 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Expression.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Expression.java @@ -32,7 +32,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 93076df..3fcc269 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java @@ -42,11 +42,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/IExpressionVisitor.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/IExpressionVisitor.java index a8a88f5..4c30c09 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/IExpressionVisitor.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/IExpressionVisitor.java @@ -3,16 +3,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/models/algebra/Term.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Term.java index 72f71a8..e753b2e 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Term.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Term.java @@ -312,11 +312,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 336a87f..dbe441b 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Variable.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Variable.java @@ -84,11 +84,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/JsonAccessor.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonAccessor.java index 1cf0c22..2ff827b 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonAccessor.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonAccessor.java @@ -1,5 +1,6 @@ package models.dataConstraintModel; +import models.algebra.IExpressionVisitor; import generators.JavaImplementationVisitor; import models.algebra.*; @@ -205,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 608a27e..9489f06 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java @@ -1,5 +1,6 @@ package models.dataConstraintModel; +import models.algebra.IExpressionVisitor; import generators.JavaImplementationVisitor; import models.algebra.*; import parser.Parser; @@ -91,11 +92,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); } }