Sonarqube自定义规则 - 字符串文字不应重复,在记录器

时间:2018-03-23 10:20:19

标签: java sonarqube sonarqube-web

尝试扩展以下链接的Sonarqube规则,以忽略记录器方法中字符串文字的出现。

我在尝试为方法提取方法名称时遇到问题(在基本访问者树的上下文中可能没有作为我的分析中的方法。但是有一些运气看看methodInvocation类型以提取一些方法名称)

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

e.g。 weeLogger.Log(例外,"发生异常");

e.g。记录器(例外1,"发生异常);

并且还有人做过类似的事情并分享他们如何从Base Visitor Tree类中提取方法名称以便与Sonarqube进行分析?

https://github.com/SonarSource/sonar-java/blob/master/java-checks/src/main/java/org/sonar/java/checks/StringLiteralDuplicatedCheck.java

2 个答案:

答案 0 :(得分:1)

@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());
    }
}

答案 1 :(得分:0)

获取方法名称

    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;
    }