Java 变量树:如何获取SonarQube中变量的.operator函数

Java 变量树:如何获取SonarQube中变量的.operator函数,java,sonarqube,Java,Sonarqube,我需要一个自定义规则,用于报告以下场景的问题: public class SomeClass { private void getLength() { StringBuffer strBuffer = new StringBuffer(); int length = strBuffer.toString().length(); // I want issue to be reported on this line for "strBuffer.toStr

我需要一个自定义规则,用于报告以下场景的问题:

public class SomeClass {

    private void getLength() {
        StringBuffer strBuffer = new StringBuffer();
        int length = strBuffer.toString().length(); // I want issue to be reported on this line for "strBuffer.toString().length();"
    }
}
到目前为止,我得到的是:

@Override
public void visitMemberSelectExpression(MemberSelectExpressionTree tree) {
    System.out.println("MEMBERSELECTEXPRESSIONTREE--" + tree.identifier().identifierToken().text() + "--symbol name --" + tree.identifier().symbolType().name());
    if (tree.is(Kind.METHOD_INVOCATION)) {
        System.out.println("**************Method Invocation**********" + tree.identifier().symbolType().name());
        if (tree.identifier().identifierToken().text().equalsIgnoreCase("toString")) {
            System.out.println("**************Method Invocation**********tostring");
        }
    }
    super.visitMemberSelectExpression(tree);
}
但是上面的代码不起作用。请指导我如何完成这个? 在点运算符(
)之后,我应该使用哪个树(ExpressionTree、VariablTree、BinaryExpressionTree或其他树)来获取该令牌?

strBuffer.toString().length()不是二进制表达式,而是方法调用树

。不是运算符,这似乎与variableTree(变量声明的语法树部分,而不是其用法)完全无关

此方法调用树有一个methodSelect字段,它是一个memberSelectExpression(由标识符和表达式组成的树),标识符
长度
,表达式是一个方法调用树(
strBuffer.toString()
)它有一个methodSelect字段,该字段是一个成员选择表达式,并且带有标识符
toString
,该表达式是一个标识符树(
strBuffer

然后我不确定您想要实现什么,但是如果您想要检测某些方法调用,您可以依赖语义分析(使用符号API),并且有一个规则模板来检测特定的方法调用

[编辑]

为了检测在一个表达式中是否有这两个连续调用,我将执行以下操作:


检测对
java.lang.String
的length()方法的调用,然后检查此方法调用是否具有作为方法调用的methodSelect(
methodSelect.is(Tree.Kind.method\u invocation)
)并检查此方法调用是否是对StringBuffer的
toString
方法的调用。

谢谢您的回复..您能否提供显示规则模板以检测特定方法调用的任何链接..另请参阅我对问题的编辑..我想知道如何在这个示例中使用字符串缓冲区的instanceofMemberSelectExpression规则模板就在这里:(无需为这些模板编写任何代码)。我没有收到您在评论中的最后一个问题。请查看我问题中的编辑,并建议如何获取给定符号是否为字符串缓冲区,以及给定标识符是否为字符串缓冲区,以及是否使用了toString.length();在一条语句中..在查看我的代码的打印结果时,我看到一个接一个地给出了长度和to字符串..如何找到它们都是同一表达式的一部分?它不能。在本例中,您的树是memberselectExpressionTree,其类型为MEMBER\u SELECT。检查此树的表达式字段,而不是树本身。感谢它的帮助:)