使用树访问者查找所有方法调用

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 未看到后续调用。