Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SonarQube OpenEdge自定义规则以验证&;带Proparse的IF预处理器_Sonarqube_Openedge - Fatal编程技术网

SonarQube OpenEdge自定义规则以验证&;带Proparse的IF预处理器

SonarQube OpenEdge自定义规则以验证&;带Proparse的IF预处理器,sonarqube,openedge,Sonarqube,Openedge,我正在尝试创建一个自定义插件,基于及其版本的Proparse,以创建一个使a&IF预处理器有效的规则 此规则需要验证应用程序是否使用了不推荐使用的值&GLOBAL-DEFINE,如下所示: /* "A" is the deprecated value of "opts" so I want to create a new ISSUE here */ &IF "{&opts}" = "A" &THEN MESSAGE "DEPRECATED CODE". &

我正在尝试创建一个自定义插件,基于及其版本的Proparse,以创建一个使a&IF预处理器有效的规则

此规则需要验证应用程序是否使用了不推荐使用的值
&GLOBAL-DEFINE
,如下所示:

/* "A" is the deprecated value of "opts" so I want to create a new ISSUE here */
&IF "{&opts}" = "A" &THEN
    MESSAGE "DEPRECATED CODE".
&ENDIF

&IF "{&opts}" > "A" &THEN
    MESSAGE "OK CODE".
&ENDIF
对于我扩展的这条规则,我尝试这样做:

/* "A" is the deprecated value of "opts" so I want to create a new ISSUE here */
&IF "{&opts}" = "A" &THEN
    MESSAGE "DEPRECATED CODE".
&ENDIF

&IF "{&opts}" > "A" &THEN
    MESSAGE "OK CODE".
&ENDIF
if(unit.getMacroGraph().macroEventList.stream().noneMatch(宏->宏实例of NamedMacroRef
&&((NamedMacroRef)宏.getMacroDef().getName().equalsIgnoreCase(“opts”)){
返回;
}
TokenSource stream=unit.lex();
ProToken tok=(ProToken)stream.nextToken();
while(tok.getNodeType()!=ABLNodeType.eofu ANTLR4){
if(tok.getNodeType()==ABLNodeType.AMPIF){
//验证节点。
系统输出打印项次(tok);
}
tok=(ProToken)stream.nextToken();
}

但我不知道这是否是最好的验证方法(我是根据其他来源的代码验证的),它不起作用,因为下一个节点是一个空的“QSSTRING”。我是Proparse领域的新手,非常感谢您的帮助。

首先,您必须知道,Proparse不能访问预处理器的每个细节。也就是说,方法
unit.getMacroGraph()
将允许您访问预处理器的可见部分,因此这是一个很好的起点。 如果要查找给定预处理器变量的用法,可以搜索指向右MacroDef对象的NamedMacroRef实例(使用
NamedMacroRef\getMacroDef()\getName()
)和正确的值

在每个循环的旧样式中:

for (MacroRef ref : unit.getMacroSourceArray()) {
  if ((ref instanceof NamedMacroRef)) {
    if ("opts".equalsIgnoreCase(((NamedMacroRef) ref).getMacroDef().getName())
        && "A".equalsIgnoreCase(((NamedMacroRef) ref).getMacroDef().getValue())) {
      System.out.println("OPTS variable usage with value 'A' at file " + ref.getFileIndex() + ":" + ref.getLine());
    }
  }
}
在此文件中:

&global-define opts a
&IF "{&opts}" = "A" &THEN
    MESSAGE "DEPRECATED CODE".
&ENDIF
&undefine opts
&global-define opts b
&IF "{&opts}" > "A" &THEN
    MESSAGE "OK CODE".
&ENDIF
这使得:

OPTS variable usage with value 'A' at file 0:2
因此,您无法访问表达式引擎,但我认为当前的API足以满足您的需要


然后,您可以使用SonarQube报告问题,方法是
OpenEdgeProparseCheck#reportIssue()

Hi@gilles querret,谢谢您的回复。这里的情况是,我需要验证比较值
=“A”
,而不是变量本身的值。该变量位于包含值为“B”的包含中,因此使用该包含编译的源代码仅包含
opts
变量的值“B”。AST中不公开预处理器表达式,并且在下一层令牌流使用后丢弃预处理器令牌(也就是说,你不能像对待空白那样通过getHiddenTokensBefore访问它们),并查找
ABLNodeType.AMPIF
。您可以查看其中的代码。如果您喜欢生活在最前沿,您可以尝试将&If表达式作为隐藏标记(如空格)提供的分支