1 package no.uio.ifi.refaktor.refactorings.visitors;
5 import org.eclipse.jdt.core.dom.ASTVisitor;
6 import org.eclipse.jdt.core.dom.AssertStatement;
7 import org.eclipse.jdt.core.dom.Block;
8 import org.eclipse.jdt.core.dom.InfixExpression;
9 import org.eclipse.jdt.core.dom.MethodDeclaration;
10 import org.eclipse.jdt.core.dom.Name;
11 import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
12 import org.eclipse.jdt.core.dom.Statement;
13 import org.eclipse.jdt.core.dom.StringLiteral;
14 import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
15 import org.eclipse.jdt.core.dom.rewrite.ListRewrite;
17 public class InsertAssertsVisitor extends ASTVisitor {
18 private ASTRewrite rewrite;
21 public boolean visit(MethodDeclaration node) {
22 makeTheAssertRewrite(node);
26 protected void makeTheAssertRewrite(MethodDeclaration node) {
27 Block body = node.getBody();
28 this.rewrite = ASTRewrite.create(body.getAST());
29 ListRewrite statementsListRewrite = this.rewrite.getListRewrite(body, Block.STATEMENTS_PROPERTY);
30 @SuppressWarnings("unchecked")
31 List<Statement> originalList = (List<Statement>) statementsListRewrite.getOriginalList();
33 for (Statement stmt: originalList) {
34 if (stmt == originalList.get(originalList.size()-1))
36 // TODO: Do we have to call getAST() every time again?
37 AssertStatement assertStatement = body.getAST().newAssertStatement();
38 InfixExpression infixExpression = body.getAST().newInfixExpression();
39 Name qualifier = ((SingleVariableDeclaration) node.parameters().get(0)).getName();
40 // TODO: how can we make sure that "x" is free?
41 infixExpression.setLeftOperand(body.getAST().newQualifiedName(body.getAST().newName(qualifier.getFullyQualifiedName()) , body.getAST().newSimpleName("x")));
42 infixExpression.setOperator(InfixExpression.Operator.EQUALS);
43 infixExpression.setRightOperand(body.getAST().newThisExpression());
44 assertStatement.setExpression(infixExpression);
45 StringLiteral stringLiteral = body.getAST().newStringLiteral();
46 stringLiteral.setLiteralValue("The Move Method refactoring has broken the program due to aliasing issues!");
47 assertStatement.setMessage(stringLiteral);
48 statementsListRewrite.insertAfter(assertStatement, stmt, null);
52 public ASTRewrite getRewrite() {