1 package no.uio.ifi.refaktor.analyze.analyzers;
3 import java.util.Arrays;
4 import java.util.Collection;
5 import java.util.LinkedList;
8 import no.uio.ifi.refaktor.analyze.exceptions.GenericAnalyzerException;
9 import no.uio.ifi.refaktor.utils.ParseUtils;
10 import no.uio.ifi.refaktor.utils.RefaktorASTNodeSearchUtil;
12 import org.eclipse.jdt.core.IMethod;
13 import org.eclipse.jdt.core.JavaModelException;
14 import org.eclipse.jdt.core.dom.ASTVisitor;
15 import org.eclipse.jdt.core.dom.Block;
16 import org.eclipse.jdt.core.dom.CompilationUnit;
17 import org.eclipse.jdt.core.dom.DoStatement;
18 import org.eclipse.jdt.core.dom.EnhancedForStatement;
19 import org.eclipse.jdt.core.dom.ForStatement;
20 import org.eclipse.jdt.core.dom.IfStatement;
21 import org.eclipse.jdt.core.dom.LabeledStatement;
22 import org.eclipse.jdt.core.dom.MethodDeclaration;
23 import org.eclipse.jdt.core.dom.Statement;
24 import org.eclipse.jdt.core.dom.SwitchCase;
25 import org.eclipse.jdt.core.dom.SwitchStatement;
26 import org.eclipse.jdt.core.dom.WhileStatement;
28 public class StatementListsCreator extends ASTVisitor {
30 private final IMethod method;
31 private final Collection<List<Statement>> statementLists;
32 private MethodDeclaration methodDeclaration;
34 public StatementListsCreator(IMethod method) {
36 statementLists = new LinkedList<List<Statement>>();
39 Collection<List<Statement>> getStatementLists() {
41 return statementLists;
44 private void createStatements() {
45 clearStatementLists();
46 createMethodDeclaration();
47 addStatementListsFromMethodDeclaration();
50 private void clearStatementLists() {
51 statementLists.clear();
54 private void createMethodDeclaration() {
56 methodDeclaration = getMethodDeclarationNode(method);
57 assert methodDeclaration != null;
58 } catch (JavaModelException e) {
59 throw new GenericAnalyzerException(e);
63 public static MethodDeclaration getMethodDeclarationNode(IMethod method) throws JavaModelException {
64 CompilationUnit compilationUnit = ParseUtils.parse(method.getCompilationUnit());
65 return RefaktorASTNodeSearchUtil.getMethodDeclarationNode(method, compilationUnit);
68 private void addStatementListsFromMethodDeclaration() {
69 methodDeclaration.accept(this);
72 public int getNumberOfStatements() {
74 for (List<Statement> list: statementLists)
80 public boolean visit(Block node) {
81 statementLists.add(new LinkedList<Statement>(node.statements()));
86 public boolean visit(DoStatement node) {
87 addIfNotBlockOrNull(node.getBody());
92 public boolean visit(EnhancedForStatement node) {
93 addIfNotBlockOrNull(node.getBody());
98 public boolean visit(ForStatement node) {
99 addIfNotBlockOrNull(node.getBody());
104 public boolean visit(IfStatement node) {
105 addIfNotBlockOrNull(node.getThenStatement());
106 addIfNotBlockOrNull(node.getElseStatement());
111 public boolean visit(LabeledStatement node) {
112 addIfNotBlockOrNull(node.getBody());
117 public boolean visit(SwitchStatement node) {
118 List<Statement> statementList = new LinkedList<Statement>();
120 for (Object stmtObject: node.statements()) {
121 assert stmtObject instanceof Statement;
122 Statement statement = (Statement) stmtObject;
124 if (statement instanceof SwitchCase) {
125 if (!statementList.isEmpty()) {
126 statementLists.add(statementList);
127 statementList = new LinkedList<Statement>();
130 statementList.add(statement);
134 if (!statementList.isEmpty())
135 statementLists.add(statementList);
141 public boolean visit(WhileStatement node) {
142 addIfNotBlockOrNull(node.getBody());
146 private void addIfNotBlockOrNull(Statement body) {
147 if (!(body instanceof Block) && body != null)
148 statementLists.add(new LinkedList<Statement>(Arrays.asList(body)));