sonarqube:在编写自定义java规则时如何获取表达式字符串?

zu0ti5jz  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(363)

目标类是:

class Example{

  public void m(){

    System.out.println("Hello" + 1);

  }

}

我想获取methodinvocation“system.out.println”(“hello”+1)”的完整字符串,以便进行一些正则表达式检查。怎么写?

public class Rule extends BaseTreeVisitor implements JavaFileScanner {

    @Override
    public void visitMethodInvocation(MethodInvocationTree tree) {

        //get the string of MethodInvocation
        //some regex check
        super.visitMethodInvocation(tree);

    }
}

我使用eclipsejdt和idea psi编写了一些代码检查规则,它们的表达式树节点具有这些属性。我想知道为什么声纳只有第一个和最后一个标记。
谢谢!

np8igboo

np8igboo1#

一个老问题,但我有一个解决办法。
这适用于任何种类的树。

@Override
public void visitMethodInvocation(MethodInvocationTree tree) {
    int firstLine = tree.firstToken().line();
    int lastLine = tree.lastToken().line();

    String rawText = getRelevantLines(firstLine, lastLine);
    // do your thing here with rawText
}

private String getRelevantLines(int startLine, int endLine) {
    StringBuilder builder = new StringBuilder();
    context.getFileLines().subList(startLine, endLine).forEach(builder::append);
    return builder.toString();
}

如果要进一步细化,还可以使用firsttoken().column,或者在regex中使用方法名。
如果您想要更多的行/更大的范围,只需使用该树的父级。parent()
这也将处理表达式/params/etc跨越多行的情况。
也许有更好的办法。。。但我不知道还有别的办法。如果我能想出更好的办法,可能会更新。

相关问题