2016-11-15 316 views
0

工作我也跟着问题 Ignore Issues in Blocks 指示,但因为它没有工作,我怀疑它可能是一些与正则表达式,而不是声纳配置有关。SonarQube:忽略块的问题不能与正则表达式

我有一些由EMF生成的代码。我改变了代码生成模板也以块的结尾,它看起来像这样加//最终产生的标签:

/* 
* @generated 
*/ 
public class MyGeneratedClass implements Enumerator { 

    /* 
    * @generated 
    */ 
    public void myGeneratedMethod() { 
     // some code that SonarQube doesn't like 

    } //end-generated 

} 

的想法是,正则表达式只能匹配方法块。所以START-BLOCK必须与文本@generated相匹配,只要它在注释终止后没有跟随'class','enum'或'interface'字。

我创造了这个正则表达式:

对于起始块:

@generated\h*\s[\s\*]*\/(?!\s*[^\s]*\s*(class|enum|interface)\s) 

对于最终块:

\/\/end-generated 

这适用于使用与Java Pattern类简单的代码我的测试,对于上面的类样本返回true:

public static void main(String[] args) throws IOException { 
    String regex = "@generated\\h*\\s[\\s\\*]*\\/(?!\\s*[^\\s]*\\s*(class|enum|interface)\\s)"; 
    String text = new String(Files.readAllBytes(Paths.get("test.txt"))); 
    Matcher matcher = Pattern.compile(regex).matcher(text); 
    System.out.println(matcher.find()); 
} 

但是,当我将它添加到SonarQube配置中时,它不起作用,在生成的方法中发现的问题仍然由SonarQube报告。
我添加的正则表达式:
SonarQube»设置»排除»问题»忽略块问题

我也试图与正则表达式的转义版本,并且结果是一样的:

@generated\\h*\\s[\\s\\*]*\\/(?!\\s*[^\\s]*\\s*(class|enum|interface)\\s) 

还加入这些设置直接进入声纳性能没有工作,在我上面提到的问题,已经报道:

sonar.issue.ignore.block=rule1 
[email protected]\\h*\\s[\\s\\*]*\\/(?!\\s*[^\\s]*\\s*(class|enum|interface)\\s) 
sonar.issue.ignore.block.rule1.endBlockRegexp=\\/\\/end-generated 

我使用SonarQube服务器5.1.2和Ru从Sonar-ant-task 2.3开始分析。

我想知道是否它可能是错误的正则表达式使SonarQube无法匹配它,或者可能是SonarQube正则表达式处理中的一些限制?

编辑:我改变了正则表达式,更简单的匹配'@generated'这个词,它工作。但是如果我把'@generated [\ n \ r]'强制为只匹配@generated之后有一个新行,那么它就不能工作了。
看来SonarQube不支持基本的东西,比如换行符。有人能证实这一点吗?

回答

1

我确认用于排除问题的所有模式都是每行应用一行。最后,它总是被翻译为“排除从X行到Y行的问题”。我同意这不完美(特别是现在我们有确切的问题位置),但这是一个“历史”功能。我们可能不会投入时间,因为我们的心情是避免复杂的配置。您的用例的理想解决方案是实现https://jira.sonarsource.com/browse/SONARJAVA-71

+0

是的,这是正确的。支持@Generated将是最好的选择。 – xsilmarx

0

由于SonarQube应用于每行的正则表达式,我想出了这个用例不同的解决方案:

我用每行的起始块正则表达式:(?米)@产生$,然后排除类|枚举|接口通过将此模式添加到结束块正则表达式以及最终生成的。

最终的配置是这样的:

sonar.issue.ignore.block=rule1 
sonar.issue.ignore.block.rule1.beginBlockRegexp=(?m)@generated$ 
sonar.issue.ignore.block.rule1.endBlockRegexp=\/\/\h*end-generated|\sclass\s|\senum\s|\sinterface\s