Kotlin Linting规则集提供程序';尾随逗号';

Kotlin Linting规则集提供程序';尾随逗号';,kotlin,gradle,sonarqube,ktlint,Kotlin,Gradle,Sonarqube,Ktlint,我一直在尝试使用Pinterest库创建规则集,但无法删除子参数列表的部分 由于Kotlin上支持“尾随逗号”的更新,正在破坏我所有的静态代码分析(SonarQube Gradle插件2.8)。因此,我决定创建一个RuleSetProvider,以便在项目中找到的所有参数列表的末尾找到一个从代码中删除的逗号' class NoTrailingCommaRule : Rule("no-trailing-comma") { override fun visit( no

我一直在尝试使用Pinterest库创建规则集,但无法删除子参数列表的部分

由于Kotlin上支持“尾随逗号”的更新,正在破坏我所有的静态代码分析(SonarQube Gradle插件2.8)。因此,我决定创建一个RuleSetProvider,以便在项目中找到的所有参数列表的末尾找到一个从代码中删除的逗号'

class NoTrailingCommaRule : Rule("no-trailing-comma") {

override fun visit(
    node: ASTNode,
    autoCorrect: Boolean,
    emit: (offset: Int, errorMessage: String, canBeAutoCorrected: Boolean) -> Unit
) {
    if (node.elementType == ElementType.COMMA) {
        node.parents().forEach {
            if (it.elementType == ElementType.VALUE_PARAMETER_LIST) {
                if (it.text.contains("pepe")) {
                    println("############# IS PEPE ###############")
                    println("ParamList-> " + it.text)
                    println("-------------------------------------")

                    if (it is PsiParameterList) {
                        it.parameters.forEach { param ->
                            println("   -> ${param.text}")
//                            if (next.elementType == ElementType.COMMA)
//                                println("     -> comma,")
                            println("---==---")
                        }
                        println("#####################################")
                    }
                }
            }
        }
    }
  }
}

/// Sample class to lint
data class PEPE(
   val pepe: String,
   var pepe1: List<String> = emptyList(), //<- This is the kind of comma I want to remove
) 
class NoTrailingCommaRule:规则(“无尾随逗号”){
趣味之旅(
节点:ASTNode,
自动更正:布尔,
emit:(偏移量:Int,错误消息:String,canBeAutoCorrected:Boolean)->单位
) {
if(node.elementType==elementType.逗号){
node.parents().forEach{
if(it.elementType==elementType.VALUE\u参数\u列表){
if(it.text.contains(“pepe”)){
println(“PEPE是PEPE吗”)
println(“参数列表->”+it.text)
println(“-----------------------------------------”)
如果(它是PsiParameterList){
it.parameters.forEach{param->
println(“->${param.text}”)
//if(next.elementType==elementType.逗号)
//println(“->逗号”)
println(“--===--”)
}
3月月日日日日日日日日日日日方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方
}
}
}
}
}
}
}
///皮棉样品等级
数据类PEPE(
瓦尔·佩佩:弦,

var pepe1:List=emptyList(),//请参见下面的规则,我已为其发送了PR:

package com.pinterest.ktlint.ruleset.experimental

import com.pinterest.ktlint.core.Rule
import com.pinterest.ktlint.core.ast.ElementType
import com.pinterest.ktlint.core.ast.children
import org.jetbrains.kotlin.com.intellij.lang.ASTNode
import org.jetbrains.kotlin.psi.psiUtil.endOffset

class NoTrailingCommaRule : Rule("no-trailing-comma") {

    override fun visit(
        node: ASTNode,
        autoCorrect: Boolean,
        emit: (offset: Int, errorMessage: String, canBeAutoCorrected: Boolean) -> Unit
    ) {
        if (node.elementType == ElementType.VALUE_ARGUMENT_LIST || node.elementType == ElementType.VALUE_PARAMETER_LIST) {
            val lastNode = node
                .children()
                .filter { it.elementType != ElementType.WHITE_SPACE }
                .filter { it.elementType != ElementType.EOL_COMMENT }
                .filter { it.elementType != ElementType.RPAR }
                .last()
            if (lastNode.elementType == ElementType.COMMA) {
                emit(lastNode.psi.endOffset - 1, "Trailing command in argument list is redundant", true)
                if (autoCorrect) {
                    node.removeChild(lastNode)
                }
            }
        }
    }
}
以及测试:

package com.pinterest.ktlint.ruleset.experimental

import com.pinterest.ktlint.core.LintError
import com.pinterest.ktlint.test.format
import com.pinterest.ktlint.test.lint
import org.assertj.core.api.Assertions.assertThat
import org.junit.Test

class NoTrailingCommaRuleTest {
    @Test
    fun testFormatIsCorrectWithArgumentList() {
        val code =
            """
            val list1 = listOf("a", "b",)
            val list2 = listOf(
                "a",
                "b", // The comma before the comment should be removed without removing the comment itself
            )
            """.trimIndent()
        val autoCorrectedCode =
            """
            val list1 = listOf("a", "b")
            val list2 = listOf(
                "a",
                "b" // The comma before the comment should be removed without removing the comment itself
            )
            """.trimIndent()

        assertThat(NoTrailingCommaRule().lint(code)).isEqualTo(
            listOf(
                LintError(line = 1, col = 28, ruleId = "no-trailing-comma", detail = "Trailing command in argument list is redundant"),
                LintError(line = 4, col = 8, ruleId = "no-trailing-comma", detail = "Trailing command in argument list is redundant"),
            )
        )
        assertThat(NoTrailingCommaRule().format(code))
            .isEqualTo(autoCorrectedCode)
    }

    @Test
    fun testFormatIsCorrectWithValueList() {
        val code =
            """
            data class Foo1(
               val bar: Int, // The comma before the comment should be removed without removing the comment itself
            )
            data class Foo2(val bar: Int,)
            """.trimIndent()
        val autoCorrectedCode =
            """
            data class Foo1(
               val bar: Int // The comma before the comment should be removed without removing the comment itself
            )
            data class Foo2(val bar: Int)
            """.trimIndent()

        assertThat(NoTrailingCommaRule().lint(code)).isEqualTo(
            listOf(
                LintError(line = 2, col = 16, ruleId = "no-trailing-comma", detail = "Trailing command in argument list is redundant"),
                LintError(line = 4, col = 29, ruleId = "no-trailing-comma", detail = "Trailing command in argument list is redundant"),
            )
        )
        assertThat(NoTrailingCommaRule().format(code))
            .isEqualTo(autoCorrectedCode)
    }
}