Проблема PMD PrimaryPrefix через XPath - PullRequest
1 голос
/ 25 января 2012

Я потратил около 4 часов на это, но XPath оказался очень болезненным для работы при разработке довольно оригинальных пользовательских правил.

Для одной части моей проблемы мне нужно PMD XPath, чтобы можно было различить следующие строки: int var = this.nocall; int var = nocall;

Из AST я вижу, что PrimaryPrefix: это Но я не могу выбрать первый оператор с помощью // 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();
    }
}

Вот необработанный XML-код AST:

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

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Вместо метки я бы использовал ThisModifier - причина в том, что метка больше не будет доступна в PMD 5. Метка - это просто строковое представление (аналогично toString ()).

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

Это будет работать как с PMD 4.x, так и с будущей PMD 5, поэтому вам не нужно будет исправлять правило.

Смотри также: https://sourceforge.net/projects/pmd/forums/forum/188194/topic/4971141

1 голос
/ 25 января 2012

Используйте

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

Когда это выражение XPath оценивается по предоставленному 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=""/>
    </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>
...