【问题标题】:Custom Sonar Rule To Check For Correct Method Call自定义声纳规则以检查正确的方法调用
【发布时间】:2018-02-19 23:43:50
【问题描述】:

我在本地 SonarQube 服务器上启动并运行了我的自定义 SonarQube 插件,它工作正常。现在我想给它添加更多的东西。我有兴趣编写我自己的 Sonar Rule 来检查非弃用的构造函数是否用于一个类。

可能的构造函数调用:

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

我已经处于这种状态,只会访问Method 笔记。

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

【问题讨论】:

    标签: java sonarqube


    【解决方案1】:

    找到了一个可行的解决方案。 这是我所做的:

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

    代码:

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

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

    【讨论】:

    • 您可以直接将NodesToVisit设置为NEW_CLASS:因为这里只有当您直接分配构造函数时才会检测到someCall(new Example...)等情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2019-04-22
    • 2018-03-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多