【发布时间】:2018-03-12 13:51:33
【问题描述】:
目前我的任务是在 SonarQube 中迁移一些规则。较旧的基于 PMD 和 Checkstyle 库。新的规则需要使用集成的 Sonar 规则(如大多数 squid 规则)编写。我目前正在处理的规则需要检查是否在循环中使用了名称中包含“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();
但它给了我错误的类(如果我没记错的话它返回符号或令牌类)。
也许有人知道我怎样才能将该结果转换为正确的对象? 也许有人知道让这条规则生效的更好方法并可以分享一些例子?
【问题讨论】:
-
我想你想要 Object.getClass().getName() 之类的东西
-
@MichaelPeacock nop,真的不是。所有信息都在语法树 API 中。
-
是的,我想获取对象的类,但是这个规则需要是通用的,所以在检查项目之前我没有对象。这种方法适合我,但首先我需要找到那个对象(或多个对象)
-
你试过
methodInvocation.symbol().owner().name()吗?