我想使用Java在Sonarqube中构建一个自定义规则,它可以捕获以下事件的发生:
import org.slf4j.Logger; import org.slf4j.LoggerFactory;
字符串或者代码中的单词Logger或LogFactory。我应该使用visitLiteral()吗?
Logger
LogFactory
visitLiteral()
djmepvbi1#
您有多种选择来实现这一点,最简单的一个是编写您的自定义规则扩展org.sonar.plugins.java.api.IssuableSubscriptionVisitor,遵循tutorial中所描述的内容(正如@user7790438在您的问题的评论中所指出的那样......您可能必须适应其中所描述的内容,但它为您提供了基础知识),并注册到Tree.Kind.Identifier节点。然后,一旦访问了所有的标识符节点,只需将给定的节点转换为org.sonar.plugins.java.api.tree.IdentifierTree,并检索它们的name()。从那里,您将能够检查它是否被称为Logger或LoggerFactory。另一种方法是订阅Tree.Kind.IMPORT树,然后简单地检查限定标识符。但是使用星型导入会使其效率不高,并且不允许您找到所有的占位符。对于您的信息,您不能访问字面量,因为您最终只能访问语言的字面量(字符串,整数,双精度,布尔值等),就像方法的名称所建议的那样。
org.sonar.plugins.java.api.IssuableSubscriptionVisitor
Tree.Kind.Identifier
org.sonar.plugins.java.api.tree.IdentifierTree
name()
LoggerFactory
Tree.Kind.IMPORT
1条答案
按热度按时间djmepvbi1#
您有多种选择来实现这一点,最简单的一个是编写您的自定义规则扩展
org.sonar.plugins.java.api.IssuableSubscriptionVisitor
,遵循tutorial中所描述的内容(正如@user7790438在您的问题的评论中所指出的那样......您可能必须适应其中所描述的内容,但它为您提供了基础知识),并注册到Tree.Kind.Identifier
节点。然后,一旦访问了所有的标识符节点,只需将给定的节点转换为
org.sonar.plugins.java.api.tree.IdentifierTree
,并检索它们的name()
。从那里,您将能够检查它是否被称为Logger
或LoggerFactory
。另一种方法是订阅
Tree.Kind.IMPORT
树,然后简单地检查限定标识符。但是使用星型导入会使其效率不高,并且不允许您找到所有的占位符。对于您的信息,您不能访问字面量,因为您最终只能访问语言的字面量(字符串,整数,双精度,布尔值等),就像方法的名称所建议的那样。