diff --git a/src/main/java/jp/naist/sd/kenja/factextractor/ast/ASTMethod.java b/src/main/java/jp/naist/sd/kenja/factextractor/ast/ASTMethod.java index 6236c3d..9fb1f16 100644 --- a/src/main/java/jp/naist/sd/kenja/factextractor/ast/ASTMethod.java +++ b/src/main/java/jp/naist/sd/kenja/factextractor/ast/ASTMethod.java @@ -27,6 +27,11 @@ public class ASTMethod implements Treeable { */ private Blob parameters; + /** + * A Blob isntance corresponding to local variables in the method. + */ + private Blob variables; + /** * root Tree of a Method. */ @@ -42,6 +47,8 @@ public class ASTMethod implements Treeable { */ private static final String PARAMETERS_BLOB_NAME = "parameters"; + private static final String VARIABLES_BLOB_NAME = "variables"; + /** * True if method is a constructor. */ @@ -72,6 +79,7 @@ protected ASTMethod(MethodDeclaration node) { isConstructor = node.isConstructor(); setBody(node); setParameters(node.parameters()); + setVariables(node); } /** @@ -142,6 +150,27 @@ private void setParameters(List parametersList) { parameters.setBody(parameterBody); } + /** + * Read and set local variables to the Blob. + * @param node + */ + private void setVariables(MethodDeclaration node) { + variables = new Blob(VARIABLES_BLOB_NAME); + root.append(variables); + + VariableDeclarationVisitor visitor = new VariableDeclarationVisitor(); + node.getBody().accept(visitor); + visitor.sortVariableList(); + + StringBuilder body = new StringBuilder(); + for (String variable : visitor.getVariables()) { + body.append(variable); + body.append("\n"); + } + + variables.setBody(body.toString()); + } + /** * return directory name of the method. * diff --git a/src/main/java/jp/naist/sd/kenja/factextractor/ast/VariableDeclarationVisitor.java b/src/main/java/jp/naist/sd/kenja/factextractor/ast/VariableDeclarationVisitor.java new file mode 100644 index 0000000..80a7e3a --- /dev/null +++ b/src/main/java/jp/naist/sd/kenja/factextractor/ast/VariableDeclarationVisitor.java @@ -0,0 +1,43 @@ +package jp.naist.sd.kenja.factextractor.ast; + +import com.google.common.collect.Ordering; +import org.eclipse.jdt.core.dom.ASTVisitor; +import org.eclipse.jdt.core.dom.VariableDeclarationFragment; +import org.eclipse.jdt.core.dom.VariableDeclarationStatement; + +import java.util.ArrayList; +import java.util.List; + +public class VariableDeclarationVisitor extends ASTVisitor { + private List variables; + + public VariableDeclarationVisitor() { + variables = new ArrayList(); + } + + public List getVariables() { + return variables; + } + + public void sortVariableList() { + variables = Ordering.from(String.CASE_INSENSITIVE_ORDER).sortedCopy(variables); + } + + @Override + public boolean visit(VariableDeclarationStatement node) { + StringBuilder variableNameBase = new StringBuilder(); + variableNameBase.append(node.getType()); + variableNameBase.append(" "); + for (Object obj : node.fragments()) { + StringBuilder variableName = new StringBuilder(variableNameBase); + VariableDeclarationFragment fragment = (VariableDeclarationFragment)obj; + variableName.append(fragment.getName()); + for (int dimension = 0; dimension < fragment.getExtraDimensions(); dimension++) { + variableName.append("[]"); + } + variables.add(variableName.toString()); + } + + return true; + } +}