Java Sonarqube自定义规则-不应重复字符串文字,在记录器上下文中忽略

Java Sonarqube自定义规则-不应重复字符串文字,在记录器上下文中忽略,java,sonarqube,sonarqube-web,Java,Sonarqube,Sonarqube Web,尝试扩展下面的QUBE规则以忽略记录器方法中出现的字符串文字 我在尝试提取方法的方法名时遇到了问题(在基本访问者树的上下文中,这些方法的作用域可能不是我分析中的方法。但是我有幸在methodInvocation类型中提取了一些方法名) 所以我的问题是,是否有人有基本访问者树元素的定义列表,以及它将如何看到不同的语句 e、 g.weeLogger.Log(异常,“发生异常”) 或 e、 g.记录器(异常1,“发生异常”) 还有,有没有人做过类似的事情,并分享他们是如何从基本访问者树类中提取方法名,

尝试扩展下面的QUBE规则以忽略记录器方法中出现的字符串文字

我在尝试提取方法的方法名时遇到了问题(在基本访问者树的上下文中,这些方法的作用域可能不是我分析中的方法。但是我有幸在methodInvocation类型中提取了一些方法名)

所以我的问题是,是否有人有基本访问者树元素的定义列表,以及它将如何看到不同的语句

e、 g.weeLogger.Log(异常,“发生异常”)

e、 g.记录器(异常1,“发生异常”)

还有,有没有人做过类似的事情,并分享他们是如何从基本访问者树类中提取方法名,以便使用Sonarqube进行分析的


获取方法名称

    public class SomeClass extends IssuableSubscriptionVisitor {
      @Override
      public List<Tree.Kind> nodesToVisit() {
        return ImmutableList.of(Tree.Kind.METHOD);
      }

      @Override
      public void visitNode(Tree tree) {
        MethodTree methodTree = (MethodTree) tree;
        IdentifierTree methodName = methodTree.simpleName();
       // getName from methodName. 

      }

**get invocation method name**
public class SomeClass extends IssuableSubscriptionVisitor {

    public static IdentifierTree methodName(MethodInvocationTree mit) {
        IdentifierTree id;
        if (mit.methodSelect().is(Tree.Kind.IDENTIFIER)) {
            id = (IdentifierTree) mit.methodSelect();
        } else {
            id = ((MemberSelectExpressionTree) mit.methodSelect()).identifier();
        }
        return id;
    }
公共类SomeClass扩展了IssuableSubscriptionVisitor{
@凌驾
公共列表nodesToVisit(){
返回ImmutableList.of(Tree.Kind.METHOD);
}
@凌驾
公共无效访问节点(树){
MethodTree MethodTree=(MethodTree)树;
IdentifierTree methodName=methodTree.simpleName();
//从methodName获取名称。
}
**获取调用方法名称**
公共类SomeClass扩展IssuableSubscriptionVisitor{
公共静态标识符树方法名(MethodInvocationTree){
标识树id;
if(mit.methodSelect().is(Tree.Kind.IDENTIFIER)){
id=(IdentifierTree)mit.methodSelect();
}否则{
id=((MemberSelectExpressionTree)mit.methodSelect()).identifier();
}
返回id;
}

如果您能在此处发布一些相关代码和您得到的错误,将非常有帮助?如上所述,在代码中没有真正的错误,正在寻找提取方法名称并将其与Sonarqube的参数关联的方法analysis@JordanSmith,您的工作结果是什么?我还想跳过重复错误loggers@michaldo我添加了一个回答这个问题,我的解决方案你能澄清我要@Override的意思吗?根据我在超类中的理解,他们没有要重写的nodeToVisit()或visitNode()?它是一个扩展SubscriptionVisitor的类,如果你需要使用BaseTreeVisitor,你可以跳过public void visitMethodInvocationTree(MethodInvocationTree树)或公共无效访问方法(MethodTree)非常感谢您的帮助help@michaldo希望这是有意义的,只需要将其添加到原始字符串文字复制规则中。可以扩展到任何自定义记录器变量名称谢谢,我在这里分享了这个问题:
@Override
public void visitMethodInvocation(MethodInvocationTree tree) {
    IdentifierTree id;
    if (tree.methodSelect().is(Tree.Kind.IDENTIFIER)){
        id = (IdentifierTree) tree.methodSelect();
    } else {
        id = ((MemberSelectExpressionTree) tree.methodSelect()).identifier();
    }

    if(id.name().matches("(.*)[lL]og(.*)")){
        //Do nothing -> Ignores method with the "log" in them for scanning
    }else {
        scan(tree.methodSelect());
        scan(tree.typeArguments());
        scan(tree.arguments());
    }
}