Как написать пользовательские правила для ktlint в kotlin? - PullRequest
0 голосов
/ 01 июля 2019

Я пытался написать пользовательские правила для ktlint.Когда я пытаюсь выполнить свое пользовательское правило через терминал, я не получаю ошибок, стандартные правила ktlint выполняются, но мои пользовательские правила игнорируются.Может быть, у кого-то есть идеи, чего мне не хватает?

Мой build.gradle:

plugins {
id 'java-library'
id 'org.jetbrains.kotlin.jvm' version '1.3.40'
id 'maven'
}

group 'com.xxx'

repositories {
    mavenCentral()
    jcenter()
}

configurations {
    ktlint
}


dependencies {
    compileOnly "com.pinterest.ktlint:ktlint-core:0.32.0"
    testCompile "junit:junit:4.12"
    testCompile "org.assertj:assertj-core:3.10.0"
    testCompile "com.pinterest.ktlint:ktlint-core:0.32.0"
    testCompile "com.pinterest.ktlint:ktlint-test:0.32.0"
}

task ktlint(type: JavaExec, dependsOn: classes) {
    main = 'com.pinterest.ktlint.Main'
    // adding compiled classes to the classpath so that ktlint would validate project's sources
    // using its own ruleset (in other words to dogfood)
    classpath = configurations.ktlint + sourceSets.main.output
    args '--debug', 'src/**/*.kt'
}

check.dependsOn ktlint

Мой класс пользовательских правил (для целей тестирования он всегда должен выдавать ошибку lint):

package com.xxx.ktlint

import com.pinterest.ktlint.core.Rule
import org.jetbrains.kotlin.com.intellij.lang.ASTNode

class TempRule : Rule("no-var") {

    override fun visit(
        node: ASTNode,
        autoCorrect: Boolean,
        emit: (offset: Int, errorMessage: String, canBeAutoCorrected: Boolean) -> Unit
    ) {
        emit(node.startOffset, "#### TEST: KTLINT ERROR", false)
    }
}

My com.pinterest.ktlint.core.RuleSetProvider:

com.xxx.ktlint.CustomRuleSetProvider

Я создаю jar, выполняя задачу gral "jar", а затем выполняю ktlint следующим образом в терминале:

ktlint -R ../path/to/ktlint-rules.jar "path/to/file/**/file-to-be-checked.kt"

Я не получаю ошибок, и ktlint применяется к файлу, который должен проверять все стандартные правила, как и ожидалось, но мои пользовательские правила просто игнорируются.Сам jar-файл, похоже, не игнорируется, поскольку, когда я добавляю несуществующее имя в команду, я получаю сообщение об ошибке.

Есть идеи?

1 Ответ

1 голос
/ 02 июля 2019

Проблема заключалась в том, что я установил локально ktlint с версией 0.31.0 (до того, как pent взял на себя код), а в моем build.gradle я использовал 0.33.0 (после того, как ptinerest принял код).Поскольку многие пакеты были переименованы, эти разные версии не могли ужиться друг с другом.После обновления моего локального ktlint до версии 0.33.0 пользовательское правило было применено, как и ожидалось.

...