Sonar 插件编码:如何测试语句是否是方法调用?

Sonar plugin coding: How do I test if a statement is a method invocation?

我正在写一些规则,其中一个是提醒 for-each 语句中 indexOf() 的用法。 Here 是我到目前为止所拥有的,但是方法调用和赋值被认为是表达式,而不是语句,并且 BodyTree class returns 一组 StatementTrees

你可以直接把你的代码放到你的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。