xpath - 通过XPath的PMD PrimaryPrefix问题

标签 xpath pmd

我花了大约4个小时来解决这个问题,但是事实证明,在开发相当原始的自定义规则时,使用XPath非常痛苦。

对于我的问题的一部分,我需要PMD XPath能够区分以下几行:
int var = this.nocall;
int var = nocall;

从AST,我看到PrimaryPrefix:this
但是我无法使用// PrimaryPrefix ['this']或// PrimaryExpression / PrimaryPrefix ['this]]或// PrimaryPrefix [@ image ='this']选择第一个语句

我想知道是否有人暗示如何使用“ this”检索所有表达式。通过XPath在分配部分。

尝试解析的示例代码:

class testRuleOne {
    private int nocall;
    public void myMethod() {
        int var = this.nocall;
        var = this.getNoCall();
    }
}


这是AST的原始XML:

<MethodDeclaration Abstract="false" BeginColumn="16" BeginLine="3" EndColumn="9" EndLine="6" Final="false" Image="" InterfaceMember="false" Label="" MethodName="myMethod" Modifiers="1" Native="false" PackagePrivate="false" Private="false" Protected="false" Public="true" Static="false" Strictfp="false" Synchronized="false" SyntacticallyAbstract="false" SyntacticallyPublic="true" Transient="false" Void="true" Volatile="false">
                    <ResultType BeginColumn="16" BeginLine="3" EndColumn="19" EndLine="3" Image="" Label="" Void="true" returnsArray="false"/>
                    <MethodDeclarator BeginColumn="21" BeginLine="3" EndColumn="30" EndLine="3" Image="myMethod" Label="" ParameterCount="0">
                        <FormalParameters BeginColumn="29" BeginLine="3" EndColumn="30" EndLine="3" Image="" Label="" ParameterCount="0"/>
                    </MethodDeclarator>
                    <Block BeginColumn="32" BeginLine="3" EndColumn="9" EndLine="6" Image="" Label="" containsComment="false">
                        <BlockStatement Allocation="false" BeginColumn="17" BeginLine="4" EndColumn="38" EndLine="4" Image="" Label="">
                            <LocalVariableDeclaration Abstract="false" Array="false" ArrayDepth="0" BeginColumn="17" BeginLine="4" EndColumn="37" EndLine="4" Final="false" Image="" Label="" Modifiers="0" Native="false" PackagePrivate="true" Private="false" Protected="false" Public="false" Static="false" Strictfp="false" Synchronized="false" Transient="false" VariableName="var" Volatile="false">
                                <Type Array="false" ArrayDepth="0" BeginColumn="17" BeginLine="4" EndColumn="19" EndLine="4" Image="" Label="" TypeImage="int">
                                    <PrimitiveType Array="false" ArrayDepth="0" BeginColumn="17" BeginLine="4" Boolean="false" EndColumn="19" EndLine="4" Image="int" Label=""/>
                                </Type>
                                <VariableDeclarator BeginColumn="21" BeginLine="4" EndColumn="37" EndLine="4" Image="" Label="">
                                    <VariableDeclaratorId Array="false" ArrayDepth="0" BeginColumn="21" BeginLine="4" EndColumn="23" EndLine="4" ExceptionBlockParameter="false" Image="var" Label=""/>
                                    <VariableInitializer BeginColumn="27" BeginLine="4" EndColumn="37" EndLine="4" Image="" Label="">
                                        <Expression BeginColumn="27" BeginLine="4" EndColumn="37" EndLine="4" Image="" Label="">
                                            <PrimaryExpression BeginColumn="27" BeginLine="4" EndColumn="37" EndLine="4" Image="" Label="">
                                                <PrimaryPrefix BeginColumn="27" BeginLine="4" EndColumn="30" EndLine="4" Image="" Label="this" SuperModifier="false" ThisModifier="true"/>
                                                <PrimarySuffix ArgumentCount="" Arguments="false" ArrayDereference="false" BeginColumn="31" BeginLine="4" EndColumn="37" EndLine="4" Image="nocall" Label=""/>
                                            </PrimaryExpression>
                                        </Expression>
                                    </VariableInitializer>
                                </VariableDeclarator>
                            </LocalVariableDeclaration>
                        </BlockStatement>
                        <BlockStatement Allocation="false" BeginColumn="17" BeginLine="5" EndColumn="39" EndLine="5" Image="" Label="">

最佳答案

我将使用ThisModifier而不是Label-原因是Label将不再在PMD 5中可用。 Label只是一个字符串表示形式(类似于toString())。

//PrimaryExpression[PrimaryPrefix/@ThisModifier='true']


这将适用于PMD 4.x和将来的PMD 5-因此您无需修正规则。

另请参阅:https://sourceforge.net/projects/pmd/forums/forum/188194/topic/4971141

关于xpath - 通过XPath的PMD PrimaryPrefix问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8998109/

相关文章:

java - Eclipse PMD 找不到 basic.xml

java - 从 XML 解析数据的 Groovy 语法

Java-如何通过包含换行符的属性值进行选择

java - 有没有办法让 PMD 规则集忽略圈复杂度的 Hashcode 和 Equals 方法?

java - PMD CPD 排除 equals 和 hashcode 等方法?

java - 添加空字符串与 toString - 为什么不好?

xpath - 匹配子节点内容的 xdt 变换定位器

c# - Xpath 无法解析 XML : Namespace manager or XsltContext needed

ruby - hpricot 与 Firebug 的 XPath

maven-plugin - maven-pmd-plugin 仅使用捆绑的规则集