ASTParser - MethodInvocation - 如何检测静态方法调用

ASTParser - MethodInvocation - How to detect a static method call

示例代码:

String.valueOf("test");

此代码的访问者:

cu.accept(new ASTVisitor()
{
    public boolean visit(MethodInvocation inv)
    {               
        System.out.println(inv);
        System.out.println(inv.getExpression().getClass());
        return true;
    }
});

输出:

String.valueOf("test")
class org.eclipse.jdt.core.dom.SimpleName

但非静态调用也会 return SimpleName。

其次,我尝试获取 resolveMethodBinding(),但这里没有任何方法可以帮助我检测是否是静态方法。

有人知道这样做吗?谢谢

您需要使用可用的绑定构建 AST,然后调用:

IMethodBinding binding = inv.resolveMethodBinding();
if (binding.getModifiers() & Modifier.STATIC > 0) {
  // method is static method
} else {
  // method is not static
}

像这样区分静态调用(而不是静态方法):

myInteger.toString(); // Non-static call
Integer.toString(myInteger); // Static call
myInteger.toString(myInteger); // Non-static call (called from an object)

您需要使用可用的绑定构建 AST 并编写:

cu.accept(new ASTVisitor()
{
    public boolean visit(MethodInvocation inv)
    {               
        if (inv.getExpression() instanceof Name
                        && ((Name) inv.getExpression()).resolveBinding().getKind() == IBinding.TYPE)
        {
            // Static call
        }
        else
        {
            // Non-static call
        }
        return true;
    }
});