使用树访问者查找所有方法调用
Finding all method invocations with tree visitor
我正在将使用 ASM 针对字节码实现的简单静态分析规则转换为与 SonarQube 一起工作。
我创建了 BaseTreeVisitor
的子类并覆盖了 visitMethodInvocation(MethodInvocationTree tree)
方法。
当它解析像
这样的简单方法时
public void someMethod() {
org.fest.assertions.Assertions.assertThat(true);
}
被调用方法的完全限定名称和类型很容易从 MethodInvocationTree 中检索。
但是对于链式方法调用,例如
public void someMethod() {
org.fest.assertions.Assertions.assertThat(true).isEqualTo(true);
}
只有终止 isEqualTo
方法调用可见。
如何检测 assertThat 也被调用?
使用 ASM 检测方法调用很简单。我应该使用声纳的另一部分 api 而不是 TreeVisitor?
问题是我自己造成的 if
super.visitMethodInvocation(mit);
未在覆盖中调用 visitMethodInvocation
未看到后续调用。
我正在将使用 ASM 针对字节码实现的简单静态分析规则转换为与 SonarQube 一起工作。
我创建了 BaseTreeVisitor
的子类并覆盖了 visitMethodInvocation(MethodInvocationTree tree)
方法。
当它解析像
这样的简单方法时public void someMethod() {
org.fest.assertions.Assertions.assertThat(true);
}
被调用方法的完全限定名称和类型很容易从 MethodInvocationTree 中检索。
但是对于链式方法调用,例如
public void someMethod() {
org.fest.assertions.Assertions.assertThat(true).isEqualTo(true);
}
只有终止 isEqualTo
方法调用可见。
如何检测 assertThat 也被调用?
使用 ASM 检测方法调用很简单。我应该使用声纳的另一部分 api 而不是 TreeVisitor?
问题是我自己造成的 if
super.visitMethodInvocation(mit);
未在覆盖中调用 visitMethodInvocation
未看到后续调用。