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/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..5d8a848 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; } 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 5ef621e..05d456d 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/ThisExpression.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/ThisExpression.java @@ -2,6 +2,11 @@ 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/tests/ASTTest.java b/AlgebraicDataflowArchitectureModel/src/tests/ASTTest.java index c29320f..38d5144 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/ASTTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/ASTTest.java @@ -1,6 +1,7 @@ package tests; import code.ast.*; +import models.algebra.Type; import models.dataConstraintModel.DataConstraintModel; import java.util.Arrays; @@ -14,7 +15,7 @@ VariableDeclarationStatement varStmt = new VariableDeclarationStatement(); varStmt.setModifiers(List.of(new PlainStatement("private"))); - varStmt.setType(new PrimitiveType(new SimpleName("int"))); + varStmt.setType(new PrimitiveType(DataConstraintModel.typeInt)); varStmt.setFragments(List.of( new VariableDeclaration(DataConstraintModel.typeInt, "x"), new VariableDeclaration(DataConstraintModel.typeInt, "sum")