gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:30:24 30 4
gpt4 key购买 nike

目标类是:

class Example{

public void m(){

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

}

}

我想获取 MethodInitation“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);

}
}

我使用eclipse jdt和idea psi编写了一些代码检查规则,其表达式树节点具有这些属性。我想知道为什么 Sonar 只有第一个和最后一个标记。

谢谢!

最佳答案

一个老问题,但我有一个解决方案。

这适用于任何类型的树。

@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或者在正则表达式中使用方法名称。

如果你想要更多的行/更大的范围,只需使用该树的父树tree.parent()

这也将处理表达式/参数/等跨越多行的情况。

可能有更好的方法...但我不知道还有其他方法。如果我找到更好的东西,可能会更新。

关于java - Sonarqube:编写自定义java规则时如何获取表达式字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53648039/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com