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

时间:2015-08-07 10:32:18

标签: java sonarqube

我正在编写一些规则,一个是在for-each语句中提醒indexOf()的用法。 Here是我到目前为止所做的,但是方法调用和赋值被认为是表达式而不是语句,BodyTree类返回一组StatementTree s

1 个答案:

答案 0 :(得分:1)

您可以将代码直接放入您的请求中,读者可以更轻松地理解其余部分。

一些评论:

  • 不使用if (st instanceof BlockTree),而是使用if(st.is(Tree.Kind.BLOCK))
  • 当您注册foreach语句时,您不需要使用instance of。输入ForEachStatementTree方法时,您的树必须是visitNode。然后你只需要施放它。

现在,请注意,您的方法可能不是最简单的方法,因此处理所有情况可能过于复杂。您可能想尝试这种方法:

  • 注册foreach method invocation树(Tree.Kind.METHOD_INVOCATION
  • 当您访问foreach节点时,存储与用于foreach(或相应符号...)的集合对应的表达式
  • 当您访问方法调用时,请检查您是否在foreach并且方法名称是indexof。您可以检查是否在与foreach使用的集合相同的集合中调用它。
  • 如果需要,请添加问题
  • 为了密切关注嵌套调用,重写方法SubscriptionVisitor.leaveNode(Tree tree),将在离开订阅节点时调用,如果节点是foreach树则取消堆栈。