]> git.uio.no Git - ifi-stolz-refaktor.git/blob - case-study/refaktor-before/src/no/uio/ifi/refaktor/refactorings/visitors/InsertAssertsVisitor.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / refaktor-before / src / no / uio / ifi / refaktor / refactorings / visitors / InsertAssertsVisitor.java
1 package no.uio.ifi.refaktor.refactorings.visitors;
2
3 import java.util.List;
4
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;
16
17 public class InsertAssertsVisitor extends ASTVisitor {
18         private ASTRewrite rewrite;
19
20         @Override
21         public boolean visit(MethodDeclaration node) {
22                 makeTheAssertRewrite(node);
23                 return false;
24         }
25
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();
32                 
33                 for (Statement stmt: originalList) {
34                         if (stmt == originalList.get(originalList.size()-1))
35                                 break;
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);
49                 }
50         }
51         
52         public ASTRewrite getRewrite() {
53                 return rewrite;
54         }
55 }