From 54fef6b9663c3c4555f8017df0457da6f3b1774a Mon Sep 17 00:00:00 2001 From: Kenji Fujiwara Date: Mon, 2 Nov 2015 13:56:02 -0500 Subject: [PATCH 1/2] supported local variables. (not sorted) --- .../sd/kenja/factextractor/ast/ASTMethod.java | 28 ++++++++++++++ .../ast/VariableDeclarationVisitor.java | 38 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 src/main/java/jp/naist/sd/kenja/factextractor/ast/VariableDeclarationVisitor.java 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..b2db5e2 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,26 @@ 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); + + 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..0fbe424 --- /dev/null +++ b/src/main/java/jp/naist/sd/kenja/factextractor/ast/VariableDeclarationVisitor.java @@ -0,0 +1,38 @@ +package jp.naist.sd.kenja.factextractor.ast; + +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; + } + + @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; + } +} From f5d433bdd2f83219a911413ac6ff60d7d2a800d0 Mon Sep 17 00:00:00 2001 From: Kenji Fujiwara Date: Wed, 11 Nov 2015 17:10:16 -0500 Subject: [PATCH 2/2] sort variables --- .../java/jp/naist/sd/kenja/factextractor/ast/ASTMethod.java | 1 + .../kenja/factextractor/ast/VariableDeclarationVisitor.java | 5 +++++ 2 files changed, 6 insertions(+) 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 b2db5e2..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 @@ -160,6 +160,7 @@ private void setVariables(MethodDeclaration node) { VariableDeclarationVisitor visitor = new VariableDeclarationVisitor(); node.getBody().accept(visitor); + visitor.sortVariableList(); StringBuilder body = new StringBuilder(); for (String variable : visitor.getVariables()) { 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 index 0fbe424..80a7e3a 100644 --- a/src/main/java/jp/naist/sd/kenja/factextractor/ast/VariableDeclarationVisitor.java +++ b/src/main/java/jp/naist/sd/kenja/factextractor/ast/VariableDeclarationVisitor.java @@ -1,5 +1,6 @@ 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; @@ -18,6 +19,10 @@ 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();