如何在 pmd 的一条规则中使用两个 AST 节点?
How to use two AST node in one rule in pmd?
我想编写一个使用两个 AST
节点的自定义 PMD
规则。
我的自定义规则扫描源代码以查找数学运算符。
我希望我的规则从这些
中找到多个运算符
+,*,/, and -
在同一个表达式中。
我尝试了一些解决方案,但都没有用,例如:
public class OperatorPrecednece extends AbstractJavaRule {
Public Object visit(ASTMultiplicativeExpression node, Object data) {
Object tvisi(ASTAdditiveExpression node2, Object data2){
addViolation(data2, node2);
}
return super.visit(node, data);
}
}
怎么做?
我选择了 XPath 而不是 Java。将此规则放入您的 pmd 规则集配置 xml:
<rule name="MultipleOperatorsInExpression" language="java" message="More than one different operator used in expression" class="net.sourceforge.pmd.lang.rule.XPathRule">
<properties>
<property name="xpath">
<value>
<![CDATA[
//Expression[.//AdditiveExpression and .//MultiplicativeExpression]
]]>
</value>
</property>
</properties>
</rule>
但这还不是一个完整的解决方案...我正在调查一个可能的 pmd 错误:看起来像 1+2-3+4
这样的表达式得到一个 AdditiveExpression:+
节点而不是 3 个不同的节点及其各自的运算符,因此检测仅使用 + 和 - 或仅使用 * 和 / 的表达式将不会被检测到。但它会检测混合加法和乘法运算符的表达式。
如果我弄明白了,我会更新答案,但我希望这个规则有用。
我正在添加另一个答案,以说明如何使用 Java 界面制作类似的东西。这是未经测试的代码,但总体思路如下:
public class OperatorPrecednece extends AbstractJavaRule {
private boolean additiveExpression = false;
private boolean multiplicativeExpression = false;
public Object visit(ASTMultiplicativeExpression node, Object data) {
multiplicativeExpression = true;
if (additiveExpression) {
addViolation(data, node);
}
Object superVisit = super.visit(node, data);
multiplicativeExpression = false;
return superVisit;
}
public Object visit(ASTAdditiveExpression node, Object data) {
additiveExpression = true;
if (multiplicativeExpression) {
addViolation(data, node);
}
Object superVisit = super.visit(node, data);
additiveExpression = false;
return superVisit;
}
}
因此,访问者模式遍历了 AST,当它到达一个 ASTMultiplicativeExpression 时它设置了一个 multiplicativeExpression 标志,然后继续遍历。如果在该遍历中到达 ASTAdditiveExpression,则将设置标志并添加违规。当您 return 从该遍历返回到 ASTMultiplicativeExpression 时,该标志未设置。 ASTAdditiveExpression 和 additiveExpression 标志也一样。
我想编写一个使用两个 AST
节点的自定义 PMD
规则。
我的自定义规则扫描源代码以查找数学运算符。
我希望我的规则从这些
中找到多个运算符+,*,/, and -
在同一个表达式中。
我尝试了一些解决方案,但都没有用,例如:
public class OperatorPrecednece extends AbstractJavaRule {
Public Object visit(ASTMultiplicativeExpression node, Object data) {
Object tvisi(ASTAdditiveExpression node2, Object data2){
addViolation(data2, node2);
}
return super.visit(node, data);
}
}
怎么做?
我选择了 XPath 而不是 Java。将此规则放入您的 pmd 规则集配置 xml:
<rule name="MultipleOperatorsInExpression" language="java" message="More than one different operator used in expression" class="net.sourceforge.pmd.lang.rule.XPathRule">
<properties>
<property name="xpath">
<value>
<![CDATA[
//Expression[.//AdditiveExpression and .//MultiplicativeExpression]
]]>
</value>
</property>
</properties>
</rule>
但这还不是一个完整的解决方案...我正在调查一个可能的 pmd 错误:看起来像 1+2-3+4
这样的表达式得到一个 AdditiveExpression:+
节点而不是 3 个不同的节点及其各自的运算符,因此检测仅使用 + 和 - 或仅使用 * 和 / 的表达式将不会被检测到。但它会检测混合加法和乘法运算符的表达式。
如果我弄明白了,我会更新答案,但我希望这个规则有用。
我正在添加另一个答案,以说明如何使用 Java 界面制作类似的东西。这是未经测试的代码,但总体思路如下:
public class OperatorPrecednece extends AbstractJavaRule {
private boolean additiveExpression = false;
private boolean multiplicativeExpression = false;
public Object visit(ASTMultiplicativeExpression node, Object data) {
multiplicativeExpression = true;
if (additiveExpression) {
addViolation(data, node);
}
Object superVisit = super.visit(node, data);
multiplicativeExpression = false;
return superVisit;
}
public Object visit(ASTAdditiveExpression node, Object data) {
additiveExpression = true;
if (multiplicativeExpression) {
addViolation(data, node);
}
Object superVisit = super.visit(node, data);
additiveExpression = false;
return superVisit;
}
}
因此,访问者模式遍历了 AST,当它到达一个 ASTMultiplicativeExpression 时它设置了一个 multiplicativeExpression 标志,然后继续遍历。如果在该遍历中到达 ASTAdditiveExpression,则将设置标志并添加违规。当您 return 从该遍历返回到 ASTMultiplicativeExpression 时,该标志未设置。 ASTAdditiveExpression 和 additiveExpression 标志也一样。