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



我想要一个自定义规则来报告以下场景的问题:

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();不是二进制表达式,它是一个方法调用树。

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

此方法调用树有一个methodSelect字段,该字段是具有标识符length的memberSelectExpression(由标识符和表达式组成的树(和作为方法调用树(strBuffer.toString()(的表达式,

该表达式具有methodSelect字段,该字段是成员选择表达式以及标识符toString和表达式,该表达式是标识符树(strBuffer(

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

[编辑]

为了检测您在一个表达式中有这两个连续的调用,我要做的是:

检测对 java.lang.String 的 length(( 方法的调用,然后检查此方法调用是否具有方法选择,即方法调用 ( methodSelect.is(Tree.Kind.METHOD_INVOCATION) (,并检查此方法调用是否是对 StringBuffer 的 toString 方法的调用。

最新更新