自定义声纳规则检查正确的方法调用

时间:2018-02-19 12:54:09

标签: java sonarqube

我的自定义SonarQube插件在本地SonarQube服务器上运行并且运行正常。现在我想添加更多东西。我对编写自己的声纳规则感兴趣,该规则检查非弃用的构造函数是否用于一个类。

可能的构造函数调用:

@Deprecated
public ExampleClass(String a) 
{
    //deprecated/old/wrong stuff happening
}
public ExampleClass(String a, String b)
{
    //correct stuff happening
}

我已经在该州,只会访问Method个笔记。

现在我想知道如何查看使用了哪个new ExampleClass表达式?

1 个答案:

答案 0 :(得分:0)

找到了一个有效的解决方案 这是我做的:

  1. nodesToVisit设为Tree.Kind.ASSIGNMENT
  2. 检查表达式是否为Tree.Kind.NEW_CLASS
  3. 检查identifier是否为ExampleClass.class.getSimpleName()
  4. 做我的论据检查
  5. 代码:

    AssignmentExpressionTree assignment = (AssignmentExpressionTree) tree;
    
        if ( assignment.expression().is(Tree.Kind.NEW_CLASS) )
        {
            NewClassTreeImpl expression = (NewClassTreeImpl) assignment.expression();
            IdentifierTreeImpl identifier = (IdentifierTreeImpl) expression.identifier();
    
            if ( StringUtils.equals(identifier.name(), ExampleClass.class.getSimpleName()) )
            {
                ArgumentListTreeImpl arguments = (ArgumentListTreeImpl) expression.arguments();
    
                if ( arguments.size() != 2 )
                {
                    reportIssue(expression, "Use the 2 parameter constructor call when creating new ExampleClass objects!");
                }
                else if ( StringUtils.indexOfAny(arguments.get(1).symbolType().name(), POSSIBLE_PARAMETER_TYPES) == -1 )
                {
                    reportIssue(expression, "The second parameter must be from type String");
                }
            }
        }
    

    如果您发现我的规则有任何改进,请告诉我。谢谢!