Получение startPosition и длины вызова метода с использованием JDT
Допустим, у меня есть этот исходный код Java. Как я могу получить startPosition и длину вызова "extractMethod(amount)"?
package smcho;
public class Extract {
String _name = "";
public int extractedMethod(int amount)
{
....
}
public int getValue(int amount) {
if (amount > 10) {
int z = extractedMethod(amount);
return z;
}
....
}
Я мог бы использовать программы просмотра hexa, чтобы найти начальную позицию 0x1FA и длину len("извлеченный (метод)") == 17, но я хотел бы сделать это программно, используя JDT.
Однажды я смог получить CompilationUnit, но мне нужно знать, как получить ссылку на вызов в этом CompilationUnit.
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject orig = root.getProject(this.projectName);
orig.open(pm);
javaProject = JavaCore.create(orig);
IType type = this.javaProject.findType(this.className);
ICompilationUnit unit = type.getCompilationUnit();
ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setSource(unit);
parser.setResolveBindings(true);
CompilationUnit cunit = (CompilationUnit) parser.createAST(null);
ASTNode root = parser.createAST(null);
root.accept(new ASTVisitor() {
public bool visit(...)
});
2 ответа
Решение
Это код, который работает для меня. Я могу хранить значения внутри JDT/ASTVisitor()?
public void setPositionFinder(String methodName) throws JavaModelException
{
//findMethod(methodName);
IType type = this.javaProject.findType(this.className);
ICompilationUnit unit = type.getCompilationUnit();
ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setSource(unit);
parser.setResolveBindings(true);
CompilationUnit cunit = (CompilationUnit) parser.createAST(null);
//ASTNode root = parser.createAST(null);
final String name = this.newMethodName;
cunit.accept(new ASTVisitor() {
public boolean visit(MethodInvocation methodInvocation)
{
String methodName = methodInvocation.getName().toString();
System.out.println(methodName);
if (methodName.equals(name))
{
startPosition = methodInvocation.getStartPosition();
length = methodInvocation.getLength();
System.out.printf("startPosition %d - Length %d", startPosition, length);
}
return false;
}
});
}
Вы можете получить номер стартовой строки и длину ASTNode, как показано ниже
int startLineNumber = compilationUnit.getLineNumber(node.getStartPosition()) - 1;
int nodeLength = node.getLength();
int endLineNumber = compilationUnit.getLineNumber(node.getStartPosition() + nodeLength) - 1;
Смотрите ниже сообщения для получения дополнительной информации