Sonar 插件编码:如何测试语句是否是方法调用?
Sonar plugin coding: How do I test if a statement is a method invocation?
我正在写一些规则,其中一个是提醒 for-each 语句中 indexOf()
的用法。 Here 是我到目前为止所拥有的,但是方法调用和赋值被认为是表达式,而不是语句,并且 BodyTree
class returns 一组 StatementTree
s
你可以直接把你的代码放到你的request中,其他的读者会更容易理解。
几点评论:
- 而不是使用
if (st instanceof BlockTree)
,更喜欢使用 if(st.is(Tree.Kind.BLOCK))
。
- 当您注册到
foreach
语句时,您不需要使用 instance of
。输入 visitNode
方法时,您的树必然是 ForEachStatementTree
。然后你只需要施放它。
现在,请注意,您的方法可能不是最简单的方法,而且可能太复杂而无法以这种方式处理所有情况。您可能想尝试这种方法:
- 注册到
foreach
棵树 和 method invocation
棵树 (Tree.Kind.METHOD_INVOCATION
)
- 访问
foreach
节点时,存储foreach
所用集合对应的表达式(或相应的符号...)
- 当您访问方法调用时,请检查您是否在
foreach
中并且方法名称是 indexof
。您可以检查是否在与用于 foreach
. 的集合相同的集合上调用它
- 如果需要请添加问题
- 为了关注嵌套调用,覆盖方法
SubscriptionVisitor.leaveNode(Tree tree)
,离开订阅节点时将调用该方法,如果节点是foreach
树则unstack。
我正在写一些规则,其中一个是提醒 for-each 语句中 indexOf()
的用法。 Here 是我到目前为止所拥有的,但是方法调用和赋值被认为是表达式,而不是语句,并且 BodyTree
class returns 一组 StatementTree
s
你可以直接把你的代码放到你的request中,其他的读者会更容易理解。
几点评论:
- 而不是使用
if (st instanceof BlockTree)
,更喜欢使用if(st.is(Tree.Kind.BLOCK))
。 - 当您注册到
foreach
语句时,您不需要使用instance of
。输入visitNode
方法时,您的树必然是ForEachStatementTree
。然后你只需要施放它。
现在,请注意,您的方法可能不是最简单的方法,而且可能太复杂而无法以这种方式处理所有情况。您可能想尝试这种方法:
- 注册到
foreach
棵树 和method invocation
棵树 (Tree.Kind.METHOD_INVOCATION
) - 访问
foreach
节点时,存储foreach
所用集合对应的表达式(或相应的符号...) - 当您访问方法调用时,请检查您是否在
foreach
中并且方法名称是indexof
。您可以检查是否在与用于foreach
. 的集合相同的集合上调用它
- 如果需要请添加问题
- 为了关注嵌套调用,覆盖方法
SubscriptionVisitor.leaveNode(Tree tree)
,离开订阅节点时将调用该方法,如果节点是foreach
树则unstack。