gpt4 book ai didi

xpath - 通过XPath的PMD PrimaryPrefix问题

转载 作者:行者123 更新时间:2023-12-03 17:18:15 24 4
gpt4 key购买 nike

我花了大约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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com