Во-первых, вы должны знать, что Proparse не дает доступа к каждой детали препроцессора. Тем не менее, метод unit.getMacroGraph()
даст вам доступ к видимой части препроцессора, так что это хорошая отправная точка. Если вы ищете использование данной переменной препроцессора, вы можете искать экземпляры NamedMacroRef, указывающие на правильный объект MacroDef (с NamedMacroRef#getMacroDef()#getName()
) и правильное значение.
В старом стиле для каждого l oop:
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()