kotlin插件_Kotlin的SonarQube插件-正确创建插件

本文是关于创建SonarQube插件的Kotlin系列的最后一部分,主要介绍如何将ANTLR解析代码与SonarQube传感器对接,实现插件的完整功能。文中提到的主要步骤包括理解Sonar模型、编写插件代码、连接ANTLR解析器和传感器,以及运行和测试插件。此外,还讨论了当前实现的局限性和潜在的优化方向。
摘要由CSDN通过智能技术生成

kotlin插件

这是一系列关于创建SonarQube插件的Kotlin语言第三职位:

在这最后一篇文章中,我们将使用前两篇文章的代码来正确创建插件。

声纳模型

Sonar模型基于以下抽象:

插入
插件的入口点,用于将扩展注入SonarQube

一个插件指向其他抽象实例,以使SonarQube平台加载它们

抽象语言

很不言自明。 代表一种语言-Java,C#,Kotlin等

ProfileDefinition
定义在声纳启动期间自动注册的配置文件

配置文件是一组可变的完全配置的规则。 尽管不是绝对必要的,但预先注册了Sonar配置文件后,用户无需进行进一步配置即可分析其代码。 Sonar提供的每种语言插件都至少附加了一个配置文件。

规则定义
定义同一存储库的一些编码规则

在存储库中定义一组不变的规则定义。 规则定义定义可用参数,默认严重性等时,规则(从配置文件中)定义参数的确切值,特定严重性等。简而言之,规则实现角色定义。

传感器
从叶模块开始,为项目的每个模块调用一次传感器。 传感器可以解析平面文件,连接到Web服务器...传感器用于在文件级别添加度量和问题。

传感器是魔术发生的入口。

sonarqube api类图

开始编写插件代码

上面的每个抽象都需要一个具体的子类。 请注意,API类本身都是完全解耦的。 Plugin子类的作用是将它们绑定在一起。

classKotlinPlugin:Plugin{

    overridefundefine(context:Context){
        context.addExtensions(
                Kotlin::class.java,
                KotlinProfile::class.java,
                KotlinSensor::class.java,
                KotlinRulesDefinition::class.java)
    }
}

大多数代码主要是样板代码,但适用于ANTLR代码。

接线ANTLR解析代码

一方面,解析代码基于生成的侦听器。 另一方面,传感器是SonarQube解析的入口点。 两者之间需要一座桥梁。

在第一篇文章中,我们使用了Kotlin的现有语法来生成解析代码。 SonarQube提供了自己的词法分析器/解析器生成工具( SonarSource Language Recognizer )。 插件API的很大一部分基于此。 对于任何一种现实生活的语言来说,描述语法都不是一件容易的事,因此我宁愿设计自己的适配器代码。

AbstractKotlinParserListener

生成的ANTLR KotlinParserBaseListener子类。 它具有存储违规的属性以及添加此类违规的方法。

违反

违规仅包含行号,因为其余所需信息将存储在KotlinCheck实例中。

KotlinCheck

包装了AbstractKotlinParserListener抽象类。 定义什么构成违规。 它处理ANTLR样板代码本身。

可以表示为以下内容:

kotlin插件类图

传感器正常

通用伪代码应类似于以下内容:

FOR EACH source file
    FOR EACH rule
        Check for violation of the rule
        FOR EACH violation
            Call the SonarQube REST API to create a violation in the datastore

转换为:

classKotlinSensor(privatevalfs:FileSystem):Sensor{

    valsources:Iterable<InputFile>
        get()=fs.inputFiles(MAIN)

    overridefunexecute(context:SensorContext){
        sources.forEach{inputFile:InputFile->
            KotlinChecks.checks.forEach{check->
                valviolations=check.violations(inputFile.file())
                violations.forEach{(lineNumber)->
                    with(context.newIssue().forRule(check.ruleKey())){
                        vallocation=newLocation().apply{
                            on(inputFile)
                            message(check.message)
                            at(inputFile.selectLine(lineNumber))
                        }
                        at(location).save()
                    }
                }
            }
        }
    }
}

最后,运行

让我们在一个Test.kt文件中创建一个包含2个类Test1Test2的虚拟Maven项目,其代码与上周相同。 运行mvn sonar:sonar产生以下输出:

SonarQube屏幕截图

等瞧 ,我们的第一个SonarQube插件Kotlin,检查我们的定制开发的违规行为。

当然,它还有很多改进的余地:

  • 规则需要通过GUI激活-我找不到如何以编程方式进行操作
  • 添加新规则需要对插件进行更新。 在第3方插件规则不会自动添加,作为可能成为标准SonarQube插件的情况。
  • 到目前为止,似乎无法解析位于类外部的代码。
  • 每次检查都会执行分析树的遍历。 一个明显的性能提升将是只走一次,然后从那里进行所有检查。
  • 通过使用Sonar的内部SSLR替换ANTLR的语法,可以实现上述改进中的一部分
  • 没有测试...

这仍然使该项目成为成熟的Kotlin插件的理想起点。 拉请求是欢迎的!

可以在Github上以Maven格式找到此帖子的完整源代码。

翻译自: https://blog.frankel.ch/sonarqube-plugin-kotlin/3/

kotlin插件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值