【问题标题】:PMD PrimaryPrefix issue through XPath通过 XPath 的 PMD PrimaryPrefix 问题
【发布时间】:2012-01-26 03:41:16
【问题描述】:

我在这方面花了大约 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="">

【问题讨论】:

    标签: xpath pmd


    【解决方案1】:

    我会使用 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

    【讨论】:

    • 这是一些我不知道的新信息。你知道如何使用 count(node-set) 来判断是否有任何 PrimaryPrefix/Name 是 FieldDelceration 之一吗?我已经搜索了一天,没有结果。我希望我不必处理 Java PMD 规则,因为代码看起来很疯狂。
    【解决方案2】:

    使用

    //PrimaryExpression[PrimaryPrefix/@Label='this']
    

    在提供的 XML 上评估此 XPath 表达式时(它的格式严重错误,但我已更正):

    <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=""/>
        </Block>
    </MethodDeclaration>
    

    想要的元素被选中

    <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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多