查找对象的类

时间:2018-03-12 13:51:34

标签: java sonarqube rule

目前我有责任在SonarQube中迁移一些规则。较旧的基于PMD和Checkstyle库。需要使用集成的Sonar规则(如大多数鱿鱼规则)编写新的规则。我正在处理的规则需要检查是否在循环中使用了包含其名称中的“Dao”的类中的任何方法。

我对规则迁移和声纳库的使用不太熟悉,所以我试图使用squid规则中的一些部分,但我无法找到我需要的确切内容。

@Override
public void visitNode(Tree tree) {
   MethodInvocationTree methodInvocationTree = (MethodInvocationTree) tree;
   IdentifierTree methodName = methodName(methodInvocationTree);

   if ( methodClassContainsDaoInName(tree?) && insideLoop(tree?)) {
      reportIssue(methodName, "DAO methods should not be called inside loop");
   }
}

我仍然坚持第一个方法(methodClassContainsDaoInName())。目前我正在尝试获取方法和对象,并检查该对象的类是否在其名称中包含“Dao”。我用这个命令:

tree.parent().firstToken().text();

此命令找到我的对象,但只给出了它的名字。我试着这样做:

tree.parent().firstToken().toClass();

但它给了我错误的类(如果我没记错的话它会返回符号或标记类)。

也许有人知道如何将该结果转换为正确的对象? 也许有人知道更好的方法来制定这个规则并且可以分享一些例子吗?

1 个答案:

答案 0 :(得分:2)

作为免责声明,我不会为您编写规则。一切都应该从API(语法或语义)中获得......一旦在规则编写和概念方面正确地阐述了您的要求。

重新制定要求:您正在尝试验证所拥有被调用方法的类(对象...)是否为DAO(又名所有者),如果是这样的话,提出一个问题(如果它在一个循环中,但那是另一个故事)。

现在,从您已有的methodInvocationTree本身,访问其关联的symbol(API中有symbol()方法),然后它{{1符号,应该是拥有类。然后,您可以从所有者符号直接访问其owner,并验证其是否包含" Dao"。

加入代码:

name

重要说明:从语法API中,您使用了SonarJava API的另一个抽象级别,可以访问符号。为了完成语义,SonarJava需要在分析期间访问字节码。如果未提供字节码,则很可能语义引擎无法解析方法。具体来说,这意味着所有符号都是boolean methodFromDao = methodInvocationTree .symbol() .owner() .name() .contains("Dao"); ,并且您无法了解其所有者。