如何知道使用 JavaParser 读取或修改变量
How know a variable is read or modified using JavaParser
我正在使用 JavaParser 解析 Java 应用程序。我需要一个函数来 return 读取或修改方法主体中的变量的情况数。例如,该函数应确定以下代码中的变量 x 被读取两次并被修改一次。
private int foo(){
int x;
System.out.println(x); //Read
x = 10; //modify
bar(x); //read
}
到目前为止我写了这段代码。
for (ClassOrInterfaceDeclaration cd : cu.findAll(ClassOrInterfaceDeclaration.class)) {
for (MethodDeclaration method : cd.getMethods()) {
method.getBody().ifPresent(blockStatement -> {
for( VariableDeclarator variable : blockStatement.findAll(VariableDeclarator.class)) {
for (NameExpr nameExp : blockStatement.findAll(NameExpr.class)) {
if (nameExp.getNameAsString().equals(variable.getNameAsString())) {
System.out.println(nameExp.getNameAsString());
}
}
}
});
}
}
使用这段代码我可以知道变量x在方法体中被使用了3次,但是我无法区分读和写。让我知道使用 JavaParser.
执行此操作的最佳方法是什么
我能够使用以下代码解决问题:
for (NameExpr nameExpr : callingMethod.findAll(NameExpr.class)) {
ResolvedValueDeclaration calledVariable = nameExpr.resolve();
String variableName = calledVariable.getName();
String variableType = calledVariable.getType().describe();
String type = "Read";
Node parentNode = nameExpr.getParentNode().get();
if (parentNode instanceof AssignExpr) {
Expression target = ((AssignExpr)parentNode).getTarget();
//Note that arrayAccessExp is not covered in this code
if (target.isNameExpr()) {
if (target.asNameExpr().getNameAsString().equals(variableName))
type = "Write";
}
}
}
我正在使用 JavaParser 解析 Java 应用程序。我需要一个函数来 return 读取或修改方法主体中的变量的情况数。例如,该函数应确定以下代码中的变量 x 被读取两次并被修改一次。
private int foo(){
int x;
System.out.println(x); //Read
x = 10; //modify
bar(x); //read
}
到目前为止我写了这段代码。
for (ClassOrInterfaceDeclaration cd : cu.findAll(ClassOrInterfaceDeclaration.class)) {
for (MethodDeclaration method : cd.getMethods()) {
method.getBody().ifPresent(blockStatement -> {
for( VariableDeclarator variable : blockStatement.findAll(VariableDeclarator.class)) {
for (NameExpr nameExp : blockStatement.findAll(NameExpr.class)) {
if (nameExp.getNameAsString().equals(variable.getNameAsString())) {
System.out.println(nameExp.getNameAsString());
}
}
}
});
}
}
使用这段代码我可以知道变量x在方法体中被使用了3次,但是我无法区分读和写。让我知道使用 JavaParser.
执行此操作的最佳方法是什么我能够使用以下代码解决问题:
for (NameExpr nameExpr : callingMethod.findAll(NameExpr.class)) {
ResolvedValueDeclaration calledVariable = nameExpr.resolve();
String variableName = calledVariable.getName();
String variableType = calledVariable.getType().describe();
String type = "Read";
Node parentNode = nameExpr.getParentNode().get();
if (parentNode instanceof AssignExpr) {
Expression target = ((AssignExpr)parentNode).getTarget();
//Note that arrayAccessExp is not covered in this code
if (target.isNameExpr()) {
if (target.asNameExpr().getNameAsString().equals(variableName))
type = "Write";
}
}
}