diff --git a/src/main/java/ast/MethodDeclaration.java b/src/main/java/ast/MethodDeclaration.java index df8d29e..9718762 100644 --- a/src/main/java/ast/MethodDeclaration.java +++ b/src/main/java/ast/MethodDeclaration.java @@ -92,20 +92,40 @@ this.body = body; } + public void addUniqueStatement(Statement statement) { + if (body == null) { + body = new Block(); + body.addStatement(statement); + return; + } + if (body.contains(List.of(statement))) return; + body.addStatement(statement); + } + public void addStatement(Statement statement) { if (body == null) { body = new Block(); } body.addStatement(statement); } - + + public void addUniqueStatement(String statement) { + if (body == null) { + body = new Block(); + body.addStatement(statement); + return; + } + if (body.contains(List.of(new PlainStatement(statement)))) return; + body.addStatement(statement); + } + public void addStatement(String statement) { if (body == null) { body = new Block(); } body.addStatement(statement); } - + public void addFirstStatement(Statement statement) { if (body == null) { body = new Block(); diff --git a/src/main/java/ast/Statement.java b/src/main/java/ast/Statement.java index 9c3fad6..9da4841 100644 --- a/src/main/java/ast/Statement.java +++ b/src/main/java/ast/Statement.java @@ -4,4 +4,12 @@ @Override public abstract String toString(); + + @Override + public boolean equals(Object another) { + if (!(another instanceof Statement)) { + return false; + } + return toString().equals(another.toString()); + } } diff --git a/src/main/java/generators/ASTGenerator.java b/src/main/java/generators/ASTGenerator.java index 89f5709..faa741b 100644 --- a/src/main/java/generators/ASTGenerator.java +++ b/src/main/java/generators/ASTGenerator.java @@ -8,7 +8,6 @@ import designPatternExtensions.InterfaceNode; import designPatternExtensions.MediatorInsertion; import designPatternExtensions.PresenterInsertion; -import models.algebra.Type; import models.dataConstraintModel.MapType; import models.objectOrientedTransfer.*; @@ -110,7 +109,7 @@ MethodInvocation callGetter = new MethodInvocation(field3, mapGet, args); // name3Map.get(name3Id) return23.setExpression(callGetter); // return name3Map.get(name3Id); } - getter.addStatement(return23); + getter.addUniqueStatement(return23); getter.setReturnType(type3); // Construct coordinator method @@ -126,7 +125,7 @@ MethodInvocation callGetter = new MethodInvocation(field2, getter.getName(), args); // name2.getName3() Assignment assignment = new Assignment(field3, callGetter); // this.name3 = name2.getName3(); ExpressionStatement assignmentStatement = new ExpressionStatement(assignment); - coordionator.addStatement(assignmentStatement); + coordionator.addUniqueStatement(assignmentStatement); return codebase; } @@ -169,7 +168,7 @@ FieldAccess field2 = new FieldAccess(new ThisExpression(), field32.getName()); // this.name2 Assignment assignment = new Assignment(field2, new Variable(toVariableName(name2))); // this.name2 = name2; ExpressionStatement assignmentStatement = new ExpressionStatement(assignment); - setter.addStatement(assignmentStatement); + setter.addUniqueStatement(assignmentStatement); // Construct coordinator method MethodDeclaration coordionator = createMethod(class1, updateMethodPrefix + toComponentName(name2)); @@ -178,7 +177,7 @@ FieldAccess field3 = new FieldAccess(field13.getName()); if (!pushEdge.toMany()) { MethodInvocation callSetter = new MethodInvocation(field3, setter.getName(), args); // name3.setName2(name2) - coordionator.addStatement(new ExpressionStatement(callSetter)); + coordionator.addUniqueStatement(new ExpressionStatement(callSetter)); } else { VariableDeclaration idVar = new VariableDeclaration(keyType, pushEdge.getName() + idPostfix); coordionator.addParameter(idVar); @@ -186,7 +185,7 @@ args = new ArrayList<>(); args.add(new Variable(idVar.getName())); args.add(callConstructor); - coordionator.addStatement(new ExpressionStatement(new MethodInvocation(field3, mapPut, args))); // name3Map.put(name3Id, new new Name3(name2)); + coordionator.addUniqueStatement(new ExpressionStatement(new MethodInvocation(field3, mapPut, args))); // name3Map.put(name3Id, new new Name3(name2)); } return codebase; } @@ -217,7 +216,7 @@ FieldAccess field1 = new FieldAccess(new ThisExpression(), field31.getName()); // this.name1 Assignment assignment = new Assignment(field1, new Variable(toVariableName(name1))); // this.name1 = name1; ExpressionStatement assignmentStatement = new ExpressionStatement(assignment); - setter3.addStatement(assignmentStatement); + setter3.addUniqueStatement(assignmentStatement); // Construct setter in class2 MethodDeclaration setter2 = createMethod(class2, setterPrefix + toComponentName(name1)); @@ -227,7 +226,7 @@ List args = new ArrayList<>(); args.add(new Variable(param1.getName())); MethodInvocation callSetter = new MethodInvocation(field3, setter3.getName(), args); // name3.setName1(name1) - setter2.addStatement(new ExpressionStatement(callSetter)); + setter2.addUniqueStatement(new ExpressionStatement(callSetter)); // Construct coordinator method MethodDeclaration coordionator = createMethod(class1, updateMethodPrefix + toComponentName(name1)); @@ -235,7 +234,7 @@ args = new ArrayList<>(); args.add(new ThisExpression()); callSetter = new MethodInvocation(field2, setter2.getName(), args); // name2.setName1(this) - coordionator.addStatement(new ExpressionStatement(callSetter)); + coordionator.addUniqueStatement(new ExpressionStatement(callSetter)); return codebase; } @@ -270,7 +269,7 @@ constructor.addParameter(dstParam); FieldAccess dstFieldAccess = new FieldAccess(new ThisExpression(), dstField.getName()); Assignment dstAssignment = new Assignment(dstFieldAccess, new Variable(dstFieldName)); // this.b = b; - constructor.addStatement(new ExpressionStatement(dstAssignment)); + constructor.addUniqueStatement(new ExpressionStatement(dstAssignment)); // Add delegation methods to the Mediator that forward calls to dst's public methods TypeDeclaration dstClass = createClass(codebase, dstName); @@ -290,9 +289,9 @@ if (method.getReturnType() != null) { ReturnStatement returnStatement = new ReturnStatement(); returnStatement.setExpression(callDst); - delegateMethod.addStatement(returnStatement); + delegateMethod.addUniqueStatement(returnStatement); } else { - delegateMethod.addStatement(new ExpressionStatement(callDst)); + delegateMethod.addUniqueStatement(new ExpressionStatement(callDst)); } } @@ -317,7 +316,7 @@ mediatorSetter.addParameter(mediatorParam); FieldAccess mediatorFieldAccess = new FieldAccess(new ThisExpression(), mediatorFieldName); Assignment mediatorAssignment = new Assignment(mediatorFieldAccess, new Variable(mediatorFieldName)); // this.me = me; - mediatorSetter.addStatement(new ExpressionStatement(mediatorAssignment)); + mediatorSetter.addUniqueStatement(new ExpressionStatement(mediatorAssignment)); // Change the constructor parameter type in src from dst to Mediator, and rename the parameter accordingly for (MethodDeclaration method: srcClass.getMethods()) { @@ -422,9 +421,9 @@ VariableDeclaration dstParam = new VariableDeclaration(dstType, dstFieldName); constructor.addParameter(srcParam); constructor.addParameter(dstParam); - constructor.addStatement(new ExpressionStatement( + constructor.addUniqueStatement(new ExpressionStatement( new Assignment(new FieldAccess(new ThisExpression(), srcField.getName()), new Variable(srcFieldName)))); - constructor.addStatement(new ExpressionStatement( + constructor.addUniqueStatement(new ExpressionStatement( new Assignment(new FieldAccess(new ThisExpression(), dstField.getName()), new Variable(dstFieldName)))); TypeDeclaration srcClass = createClass(codebase, srcName); @@ -451,7 +450,7 @@ ReturnStatement returnStatement = new ReturnStatement(); returnStatement.setExpression(new FieldAccess(new ThisExpression(), field.getName())); - newGetter.addStatement(returnStatement); + newGetter.addUniqueStatement(returnStatement); newGetter.setReturnType(field.getType()); } getters.add(newGetter); @@ -472,7 +471,7 @@ setter.addParameter(setterParam); // Find the corresponding field in dstClass, or create one if it doesn't exist FieldDeclaration propertyField = createField(dstClass, toVariableName(propertyName), propertyType); - setter.addStatement(new ExpressionStatement( + setter.addUniqueStatement(new ExpressionStatement( new Assignment(new FieldAccess(new ThisExpression(), propertyField.getName()), new Variable(toVariableName(propertyName))))); } @@ -484,7 +483,7 @@ List setterArgs = new ArrayList<>(); setterArgs.add(callGetter); MethodInvocation callSetter = new MethodInvocation(new FieldAccess(dstField.getName()), setter.getName(), setterArgs); - coordinator.addStatement(new ExpressionStatement(callSetter)); + coordinator.addUniqueStatement(new ExpressionStatement(callSetter)); } removeDirectDependency(srcClass, dstType); diff --git a/src/main/java/models/objectOrientedTransfer/Delta.java b/src/main/java/models/objectOrientedTransfer/Delta.java index d5ed3db..8f83631 100644 --- a/src/main/java/models/objectOrientedTransfer/Delta.java +++ b/src/main/java/models/objectOrientedTransfer/Delta.java @@ -43,10 +43,10 @@ /** * binding composition - * (this * delta) + * (this o delta) * * @param delta - * @return this * delta + * @return this o delta */ public Delta combine(PrimitiveDelta delta) { return new Delta(delta, this); @@ -54,10 +54,10 @@ /** * binding composition - * (this * delta) + * (this o delta) * * @param delta - * @return this * delta + * @return this o delta */ public Delta combine(Delta delta) { Delta preDelta = this.copy(); @@ -68,7 +68,7 @@ } /** - * if this = d1 * d2 * ... * dn + * if this = d1 o d2 o ... o dn * * @return [d1, d2, ..., dn] */ @@ -89,4 +89,8 @@ } return new Delta(bottomDelta.copy(), subDelta.copy()); } + + public String toString() { + return bottomDelta.toString() + (subDelta == null ? "" : " o " + subDelta.toString()); + } } diff --git a/src/main/java/models/objectOrientedTransfer/DeltaComplex.java b/src/main/java/models/objectOrientedTransfer/DeltaComplex.java index 81ce625..a26c0d2 100644 --- a/src/main/java/models/objectOrientedTransfer/DeltaComplex.java +++ b/src/main/java/models/objectOrientedTransfer/DeltaComplex.java @@ -23,7 +23,7 @@ } /** - * dependency composition + * dependency chaining * (this = delta | this) * * @param delta @@ -99,4 +99,8 @@ } return new DeltaComplex(frontierDelta.copy(), subComplex.copy()); } + + public String toString() { + return "tau_C(" + frontierDelta.toString() + ")" + (subComplex == null ? "" : " | " + subComplex.toString()); + } } diff --git a/src/main/java/models/objectOrientedTransfer/ObjectNode.java b/src/main/java/models/objectOrientedTransfer/ObjectNode.java index 0ffdaa8..7d62d05 100644 --- a/src/main/java/models/objectOrientedTransfer/ObjectNode.java +++ b/src/main/java/models/objectOrientedTransfer/ObjectNode.java @@ -16,4 +16,8 @@ public void setName(String name) { this.name = name; } + + public String toString() { + return name; + } } diff --git a/src/main/java/models/objectOrientedTransfer/PrimitivePullDelta.java b/src/main/java/models/objectOrientedTransfer/PrimitivePullDelta.java index bf3037f..3b6d625 100644 --- a/src/main/java/models/objectOrientedTransfer/PrimitivePullDelta.java +++ b/src/main/java/models/objectOrientedTransfer/PrimitivePullDelta.java @@ -49,4 +49,8 @@ return new PrimitivePullDelta(pullEdge1, pullEdge2, dataName); } + public String toString() { + return "Delta[" + pullEdge1.getSource().toString() + "->" + pullEdge2.getDestination().toString() + "]"; + } + } diff --git a/src/main/java/models/objectOrientedTransfer/PrimitivePullPushDelta.java b/src/main/java/models/objectOrientedTransfer/PrimitivePullPushDelta.java index 8fa3e07..0e41d15 100644 --- a/src/main/java/models/objectOrientedTransfer/PrimitivePullPushDelta.java +++ b/src/main/java/models/objectOrientedTransfer/PrimitivePullPushDelta.java @@ -49,4 +49,7 @@ return new PrimitivePullPushDelta(pullEdge, pushEdge, dataName); } + public String toString() { + return "Delta[" + pullEdge.getDestination().toString() + "->" + pushEdge.getDestination().toString() + "]"; + } } diff --git a/src/main/java/models/objectOrientedTransfer/PrimitivePushDelta.java b/src/main/java/models/objectOrientedTransfer/PrimitivePushDelta.java index 63d0635..14bbd4b 100644 --- a/src/main/java/models/objectOrientedTransfer/PrimitivePushDelta.java +++ b/src/main/java/models/objectOrientedTransfer/PrimitivePushDelta.java @@ -50,4 +50,7 @@ return new PrimitivePushDelta(pushEdge1, pushEdge2, dataName); } + public String toString() { + return "Delta[" + pushEdge2.getDestination().toString() + "->" + pushEdge1.getSource().toString() + "]"; + } }