Giter Site home page Giter Site logo

kotlinter-gradle's Introduction

Kotlinter Gradle

Build Status Latest Version

Painless Gradle plugin for linting and formatting Kotlin source files using the awesome ktlint engine.

It aims to be easy to set up with zero required configuration and behaves as you'd expect out of the box.

It's also fast because it integrates the ktlint engine directly with Gradle's incremental build and uses the Worker API to parallelize work.

Installation

Available on the Gradle Plugins Portal: https://plugins.gradle.org/plugin/org.jmailen.kotlinter

Single module

Kotlin
plugins {
    id("org.jmailen.kotlinter") version "4.4.1"
}
Groovy
plugins {
    id "org.jmailen.kotlinter" version "4.4.1"
}

Multi-module and Android

Kotlin Root `build.gradle.kts`
plugins {
    id("org.jmailen.kotlinter") version "4.4.1" apply false
}

Each module build.gradle.kts with Kotlin source

plugins {
    id("org.jmailen.kotlinter")
}
Groovy Root `build.gradle`
plugins {
    id 'org.jmailen.kotlinter' version "4.4.1" apply false
}

Each module build.gradle with Kotlin source

plugins {
    id 'org.jmailen.kotlinter'
}

Compatibility

kotlinter version min kotlin version max kotlin version min gradle version
4.2.0+ 1.9.20 - 8.4
4.0.0+ 1.9.0 - 7.6
3.14.0+ 1.8.0 1.8.22 7.6
3.11.0+ 1.7.0 1.7.22 7.0
3.10.0+ 1.6.20 1.6.21 7.0
3.7.0+ 1.5.31 1.6.10 7.0
3.5.0+ 1.5.0 1.5.30 6.8
3.0.0+ 1.4.0 1.4.30 6.8
2.0.0+ 1.3.0 1.3.30 -

Features

  • Supports Kotlin Gradle plugins:
  • Supports .kt and .kts files
  • Standalone LintTask and FormatTask types for defining custom tasks
  • Incremental build support and fast parallelization with Gradle Worker API
  • Configures from .editorconfig when available
  • Configurable reporters

Tasks

When your project uses one of the supported Kotlin Gradle plugins, Kotlinter adds these tasks:

formatKotlin: format Kotlin source code according to ktlint rules or warn when auto-format not possible.

lintKotlin: report Kotlin lint errors and by default fail the build.

Also check becomes dependent on lintKotlin.

Granular tasks are added for each source set in the project: formatKotlinSourceSet and lintKotlinSourceSet.

Git Hooks

Kotlinter can install a hook to run pre-push (installKotlinterPrePushHook). The hook runs lintKotlin and, if there are errors, formatKotlin and exits non-zero leaving changed files to be committed.

You must apply the kotlinter plugin to your root project to make this task available. If using git worktree you must install the hook from the parent git directory.

To install the hook automatically when someone runs the build, add this to your root project build.gradle.kts:

Kotlin
tasks.check {
    dependsOn("installKotlinterPrePushHook")
}
Groovy
tasks.named('check') {
    dependsOn 'installKotlinterPrePushHook'
}

Configuration

Options are configured in the kotlinter extension. Defaults shown (you may omit the configuration block entirely if you want these defaults).

Kotlin
kotlinter {
    failBuildWhenCannotAutoFormat = false
    ignoreFailures = false
    reporters = arrayOf("checkstyle", "plain")
}
Groovy
kotlinter {
    failBuildWhenCannotAutoFormat = false
    ignoreFailures = false
    reporters = ['checkstyle', 'plain']
}

Setting failBuildWhenCannotAutoFormat to true will configure the formatKotlin task to fail the build when auto-format is not able to fix a lint error. This is overrided by setting ignoreFailures to true.

Options for reporters: checkstyle, html, json, plain, sarif

Reporters behave as described at: https://github.com/pinterest/ktlint

Editorconfig

Kotlinter will configure itself using an .editorconfig file if one is present.

This configuration includes code style and linting rules.

See KtLint configuration for details.

Customizing Tasks

The formatKotlinSourceSet and lintKotlinSourceSet tasks inherit from SourceTask so you can customize includes, excludes, and source.

Kotlin
tasks.withType<LintTask> {
    this.source = this.source.minus(fileTree("src/generated")).asFileTree
}

tasks.withType<FormatTask> {
    this.source = this.source.minus(fileTree("src/generated")).asFileTree
}
Groovy
tasks.named("lintKotlinMain") {
  source = source - fileTree("$buildDir/generated")
}

Note that exclude paths are relative to the package root.

Custom Tasks

If you aren't using autoconfiguration from a supported plugin or otherwise need to handle additional source code, you can create custom tasks:

Kotlin
import org.jmailen.gradle.kotlinter.tasks.LintTask
import org.jmailen.gradle.kotlinter.tasks.FormatTask

tasks.register<LintTask>("ktLint") {
    group = "verification"
    source(files("src"))
    reports.set(
        mapOf(
            "plain" to file("build/lint-report.txt"),
            "json" to file("build/lint-report.json")
        )
    )
}

tasks.register<FormatTask>("ktFormat") {
    group = "formatting"
    source(files("src"))
    report.set(file("build/format-report.txt"))
}
Groovy
import org.jmailen.gradle.kotlinter.tasks.LintTask
import org.jmailen.gradle.kotlinter.tasks.FormatTask

tasks.register('ktLint', LintTask) {
    group 'verification'
    source files('src')
    reports = [
            'plain': file('build/lint-report.txt'),
            'json' : file('build/lint-report.json')
    ]
}


tasks.register('ktFormat', FormatTask) {
  group 'formatting'
  source files('src/test')
  report = file('build/format-report.txt')
}

Custom ktlint version

If you need to use a different version of ktlint you can override the dependency.

Kotlin or Groovy
buildscript {
    configurations.classpath {
        resolutionStrategy {
            force(
                "com.pinterest.ktlint:ktlint-rule-engine:1.2.1",
                "com.pinterest.ktlint:ktlint-rule-engine-core:1.2.1",
                "com.pinterest.ktlint:ktlint-cli-reporter-core:1.2.1",
                "com.pinterest.ktlint:ktlint-cli-reporter-checkstyle:1.2.1",
                "com.pinterest.ktlint:ktlint-cli-reporter-json:1.2.1",
                "com.pinterest.ktlint:ktlint-cli-reporter-html:1.2.1",
                "com.pinterest.ktlint:ktlint-cli-reporter-plain:1.2.1",
                "com.pinterest.ktlint:ktlint-cli-reporter-sarif:1.2.1",
                "com.pinterest.ktlint:ktlint-ruleset-standard:1.2.1"
            )
        }
    }
}

Alternatively, if you have a custom build convention plugin that utilizes kotlinter, you can enforce a newer KtLint version through a platform directive:

Kotlin or Groovy
dependencies {
    implementation(platform("com.pinterest.ktlint:ktlint-bom:1.2.1"))
    implementation("org.jmailen.gradle:kotlinter-gradle:4.4.1")
}

Custom Rules

You can add custom ktlint RuleSets using the buildscript classpath:

Kotlin
buildscript {
    dependencies {
        classpath(files("libs/my-custom-ktlint-rules.jar"))
        classpath("org.other.ktlint:custom-rules:1.0")
    }
}
Groovy
buildscript {
    dependencies {
        classpath files('libs/my-custom-ktlint-rules.jar')
        classpath 'org.other.ktlint:custom-rules:1.0'
    }
}

kotlinter-gradle's People

Contributors

acreddy9 avatar bespaltovyj avatar bigdaz avatar dependabot[bot] avatar dinomite avatar exoego avatar goooler avatar jasonab avatar jeremymailen avatar jmeekhof avatar kirillsinyuk avatar lwasyl avatar mahoney avatar marukami avatar mateuszkwiecinski avatar mydogtom avatar olegivo avatar paulwoitaschek avatar realdadfish avatar samzurcher avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

kotlinter-gradle's Issues

ClassNotFoundException for LintWorkerRunnable

Kotlinter 2.1.1
AGP 3.5.0
Gradle 5.6

This now happens every time we run :lintKotlinAll on CI (Jenkins). Not reproducible locally.

This didn't happen with AGP 3.5-rc2. Not sure what the root cause is. Any ideas?

the :lintKotlinAll task looks like this:

// root build.gradle
import org.jmailen.gradle.kotlinter.tasks.LintTask

def lintKotlinAll = tasks.register('lintKotlinAll', LintTask) {
    group = 'verification'
    source files(myProjects.collect { "${it.basePath}/src" })
    disabledRules = ["import-ordering", "final-newline"]
    reports = [
        'plain': file("$buildDir/reports/ktlint/all-lint.txt"),
        'html' : file("$buildDir/reports/ktlint/index.html")
    ]
}

where myProjects is an array of MyProject objects that simply represent all the Gradle subprojects in the build. So, one of the file elements would be "app/src".

[2019-08-21T17:33:12.426Z] FAILURE: Build failed with an exception.

[2019-08-21T17:33:12.426Z]

[2019-08-21T17:33:12.426Z] * What went wrong:

[2019-08-21T17:33:12.426Z] Execution failed for task ':lintKotlinAll'.

[2019-08-21T17:33:12.426Z] > There were multiple failures while executing work items

[2019-08-21T17:33:12.426Z] > A failure occurred while executing org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable

[2019-08-21T17:33:12.426Z] > java.lang.ClassNotFoundException: org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable

[2019-08-21T17:33:12.426Z] > A failure occurred while executing org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable

[2019-08-21T17:33:12.426Z] > java.lang.ClassNotFoundException: org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable

[2019-08-21T17:33:12.426Z] > A failure occurred while executing org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable

... etc ...

Provide Gradle Kotlin DSL examples in documentation

As a Gradle Kotlin DSL adopter, I'd like to know how to configure this plugin using the Kotlin DSL.

This plugin was identified as one of the most useful Gradle plugins. With Kotlin DSL 1.0 approaching shortly, it'd be wonderful if the documentation provided Kotlin and Groovy DSL samples. Blog post with suggestions.

Here are a couple additional resources:

Thank you for providing a great Gradle plugin! โ€”The Gradle Team

1.15.0 can't find task w/ name "check"

plugins {
id 'org.jmailen.kotlinter' version '1.15.0'
}
in the root gradle (not the app gradle) file causes this error

* What went wrong:
An exception occurred applying plugin request [id: 'org.jmailen.kotlinter', version: '1.15.0']
> Failed to apply plugin [id 'org.jmailen.kotlinter']
   > Task with name 'check' not found in root project 'android'.

1.14.0 didn't have a problem.
We do have flavors and build types.
Switching back to 1.14.0, gradle tasks does show the "check" task:

Verification tasks
------------------
check - Runs all checks.
connectedAndroidTest - Installs and runs instrumentation tests for all flavors on connected devices.

fails to run when using kotlin v1.1.3

:lintKotlinMain FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':lintKotlinMain'.
> org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment$Companion.createForProduction(Lorg/jetbrains/kotlin/com/intellij/openapi/Disposable;Lorg/jetbrains/kotlin/config/CompilerConfiguration;Ljava/util/List;)Lorg/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment;

and in some situation says:

 ./gradlew check
:lintKotlinMain FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':lintKotlinMain'.
> Could not initialize class com.github.shyiko.ktlint.core.KtLint

gradle.properties:

version=1.0
group=com.foo.example

kotlinVersion=1.1.3

junitVersion = 5.0.0-M4
junitPlatformVersion = 1.0.0-M4

ktlintVersion = 0.8.3
kotlinterPluginVersion = 1.1.0

build.gradle:

buildscript {
  dependencies {
    classpath "gradle.plugin.org.jmailen.gradle:kotlinter-gradle:$kotlinterPluginVersion"

    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
    classpath "org.junit.platform:junit-platform-gradle-plugin:$junitPlatformVersion"
  }
}

apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: "org.jmailen.kotlinter"
apply plugin: 'org.junit.platform.gradle.plugin'

dependencies {
  compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
  compile "org.jetbrains.kotlin:kotlin-test:$kotlinVersion"

  testCompile "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion"
  testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlinVersion"

  testCompile "org.junit.platform:junit-platform-runner:$junitPlatformVersion"
  testCompile "org.junit.platform:junit-platform-launcher:$junitPlatformVersion"
  testCompile "org.junit.platform:junit-platform-engine:$junitPlatformVersion"
  testCompile "org.junit.platform:junit-platform-console:$junitPlatformVersion"

  testCompile "org.junit.jupiter:junit-jupiter-api:$junitVersion"

  testRuntime "org.junit.jupiter:junit-jupiter-engine:$junitVersion"
}

sourceCompatibility = 1.8

junitPlatform {
  platformVersion "$junitPlatformVersion"
}

kotlinter {
  indentSize = 4
}

task wrapper(type: Wrapper) {
  gradleVersion = '3.5.1'
}

Multiple reporters?

Doesn't seem possible but is possible via ktlint Any chance support could be added?

Need to add lint report for Android Studio

Hey. First of all - kotlinter is awesome. I want to suggest small improvement.

So, I use lintKotlin task as runtime dependency like this:

    tasks.whenTaskAdded { Task task ->
        if (task.name.startsWith('assemble')) {
            task.dependsOn 'lintKotlin'
        }
    }

The problem is in Android Studio build output window: when lint task is unsuccessful, I see this:

org.gradle.api.GradleException: Kotlin source failed lint check.
	at org.jmailen.gradle.kotlinter.tasks.LintTask.run(LintTask.kt:94)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	...

And...that's all. When I start lintKotlin task from console of run it as separate task from Android Studio - I see normal output and warnings, it's ok, the problem is in case of runtime dependency. Could you add lint report for Studio?

Regression: formatKotlin fails in 1.19+

Running ./gradlew clean formatKotlin fails since 1.19 in my project:

4: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':argas-junit5:formatKotlinMain'.
> java.io.FileNotFoundException: /Users/jvandria/argas-backend/argas-junit5/build/reports/ktlint/main-format.txt (No such file or directory)

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':argas-junit5:formatKotlinMain'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:110)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipCachedTaskExecuter.execute(SkipCachedTaskExecuter.java:105)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:59)
        at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ResolveBuildCacheKeyExecuter.execute(ResolveBuildCacheKeyExecuter.java:66)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:59)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:101)
        at org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter.java:44)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:91)
        at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:59)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.run(EventFiringTaskExecuter.java:51)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:46)
        at org.gradle.execution.taskgraph.LocalTaskInfoExecutor.execute(LocalTaskInfoExecutor.java:42)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareWorkItemExecutor.execute(DefaultTaskExecutionGraph.java:273)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareWorkItemExecutor.execute(DefaultTaskExecutionGraph.java:258)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:135)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:130)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.execute(DefaultTaskPlanExecutor.java:200)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.executeWithWork(DefaultTaskPlanExecutor.java:191)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.run(DefaultTaskPlanExecutor.java:130)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
        at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: org.gradle.api.UncheckedIOException: java.io.FileNotFoundException: /Users/jvandrian/argas-backend/argas-junit5/build/reports/ktlint/main-format.txt (No such file or directory)
        at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:57)
        at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:40)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:76)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:46)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:786)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:753)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:131)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:120)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:99)
        ... 36 more
Caused by: java.io.FileNotFoundException: /Users/jvandria/argas-backend/argas-junit5/build/reports/ktlint/main-format.txt (No such file or directory)
        at java.base/java.io.FileOutputStream.open0(Native Method)
        at java.base/java.io.FileOutputStream.open(FileOutputStream.java:299)
        at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:238)
        at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:188)
        at kotlin.io.FilesKt__FileReadWriteKt.writeBytes(FileReadWrite.kt:74)
        at kotlin.io.FilesKt__FileReadWriteKt.writeText(FileReadWrite.kt:100)
        at kotlin.io.FilesKt__FileReadWriteKt.writeText$default(FileReadWrite.kt:100)
        at org.jmailen.gradle.kotlinter.tasks.FormatTask.run(FormatTask.kt:61)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
        ... 49 more

==============================================================================
./gradlew --version
------------------------------------------------------------
Gradle 4.9
------------------------------------------------------------

Build time:   2018-07-16 08:14:03 UTC
Revision:     efcf8c1cf533b03c70f394f270f46a174c738efc

Kotlin DSL:   0.18.4
Kotlin:       1.2.41
Groovy:       2.4.12
Ant:          Apache Ant(TM) version 1.9.11 compiled on March 23 2018
JVM:          10.0.2 ("Oracle Corporation" 10.0.2+13)
OS:           Mac OS X 10.12.6 x86_64

Provider StandardRuleSetProvider not a subtype

Hi!
I was trying to migrate to most recent version of kotlinter and for most cases it worked as expected, However, there are 2 cases when it fails:

  1. When it's been run on a buildserver which performs completely clean build.
  2. If kotlinter's tasks are run with --rerun-tasks argument. (e.g. ./gradlew lintKotlin --rerun-tasks)

Callstack:

> Task :analytics:lintKotlinMain FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':analytics:lintKotlinMain'.
> There were multiple failures while executing work items
   > A failure occurred while executing org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable
      > com.pinterest.ktlint.core.RuleSetProvider: Provider com.pinterest.ktlint.ruleset.standard.StandardRuleSetProvider not a subtype
   > A failure occurred while executing org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable
      > com.pinterest.ktlint.core.RuleSetProvider: Provider com.pinterest.ktlint.ruleset.standard.StandardRuleSetProvider not a subtype
   > A failure occurred while executing org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable
      > com.pinterest.ktlint.core.RuleSetProvider: Provider com.pinterest.ktlint.ruleset.standard.StandardRuleSetProvider not a subtype
   > A failure occurred while executing org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable
      > com.pinterest.ktlint.core.RuleSetProvider: Provider com.pinterest.ktlint.ruleset.standard.StandardRuleSetProvider not a subtype
   > A failure occurred while executing org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable
      > com.pinterest.ktlint.core.RuleSetProvider: Provider com.pinterest.ktlint.ruleset.standard.StandardRuleSetProvider not a subtype

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':analytics:lintKotlinMain'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.accept(ExecuteActionsTaskExecuter.java:151)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.accept(ExecuteActionsTaskExecuter.java:148)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:191)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:141)
        at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionStateTaskExecuter.execute(ResolveBeforeExecutionStateTaskExecuter.java:75)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:108)
        at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionOutputsTaskExecuter.execute(ResolveBeforeExecutionOutputsTaskExecuter.java:67)
        at org.gradle.api.internal.tasks.execution.ResolveAfterPreviousExecutionStateTaskExecuter.execute(ResolveAfterPreviousExecutionStateTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:94)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:95)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:73)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:49)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:49)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:43)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:134)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:129)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:202)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:193)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:129)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: org.gradle.workers.WorkerExecutionException: There were multiple failures while executing work items
        at org.gradle.workers.internal.DefaultWorkerExecutor.workerExecutionException(DefaultWorkerExecutor.java:160)
        at org.gradle.workers.internal.DefaultWorkerExecutor.await(DefaultWorkerExecutor.java:152)
        at org.jmailen.gradle.kotlinter.tasks.LintTask.run(LintTask.kt:84)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:103)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:48)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:41)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:702)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:669)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$5.run(ExecuteActionsTaskExecuter.java:404)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:393)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:376)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$200(ExecuteActionsTaskExecuter.java:80)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:213)
        at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$1(ExecuteStep.java:33)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:33)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:58)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:35)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:48)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:33)
        at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:39)
        at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
        at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
        at org.gradle.internal.execution.steps.CatchExceptionStep.execute(CatchExceptionStep.java:35)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:45)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:31)
        at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:201)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:70)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:45)
        at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49)
        at org.gradle.internal.execution.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:43)
        at org.gradle.internal.execution.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:32)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:96)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:89)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:54)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:38)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:77)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:90)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:48)
        at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:120)
        ... 35 more
Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable
        at org.gradle.workers.internal.DefaultWorkerExecutor$WorkerExecution.waitForCompletion(DefaultWorkerExecutor.java:285)
        at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:115)
        at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForCompletion(DefaultAsyncWorkTracker.java:87)
        at org.gradle.workers.internal.DefaultWorkerExecutor.await(DefaultWorkerExecutor.java:150)
        ... 88 more
Caused by: java.util.ServiceConfigurationError: com.pinterest.ktlint.core.RuleSetProvider: Provider com.pinterest.ktlint.ruleset.standard.StandardRuleSetProvider not a subtype
        at org.jmailen.gradle.kotlinter.support.RuleSetsKt.resolveRuleSets(ruleSets.kt:25)
        at org.jmailen.gradle.kotlinter.support.RuleSetsKt.resolveRuleSets$default(ruleSets.kt:11)
        at org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable.run(LintWorkerRunnable.kt:47)
        at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:39)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.execute(NoIsolationWorkerFactory.java:61)
        at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44)
        at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:55)
        at org.gradle.workers.internal.DefaultWorkerExecutor$1.call(DefaultWorkerExecutor.java:105)
        at org.gradle.workers.internal.DefaultWorkerExecutor$1.call(DefaultWorkerExecutor.java:99)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:215)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:131)
        ... 3 more

Current setup:

Gradle 5.4.1, Kotlin 1.3.31 (tested on 1.3.21 too), Kotlinter 1.25.0.
I'm applying the plugin within buildsrc by setting:

    pluginManager.apply("org.jmailen.kotlinter")
    extensions.configure(KotlinterExtension::class.java) {
        it.indentSize = 4
        it.continuationIndentSize = 4
        it.reporters = arrayOf("plain")
    }

in custom buildSrc plugin.

While I'll be still trying to reproduce the issue on a new project, I'm reporting this at sight cause I assume that can be fixed on the library side as after downgrading library version down to 1.23.1 everything works like a charm. The issue has been introduced in release 1.24.0

EDIT: Apparently the issue has been introduced earlier, in 1.23.0. Tested on sample project attached below.

Use Worker API for faster task execution

I just spiked some code to experiment with the Worker API for LintTask, and in my sample build it cut task time roughly in half, from 10-11 seconds to 5-6 seconds. If you're open to it, I will submit a PR. Thanks for your consideration.

PS: If this works out, my next step would be to attempt to make the task incremental, meaning it would only process files that had changed, rather than every source file on every invocation.

Only the last issue in the reports files

In 1.23.0, only the last issue for each files is reported inside the report file.
Functional unit test build/reports/ktlint/main-lint.xml contains:

<?xml version="1.0" encoding="utf-8"?>
<checkstyle version="8.0">
	<file name="src/main/kotlin/KotlinClass.kt">
		<error line="3" column="16" severity="error" message="Unexpected spacing before &quot;(&quot;" source="paren-spacing" />
	</file>
</checkstyle>

Same issue with plain and json reports
Version 1.22.0 is clean

Looks like the SortedThreadSafeReporterWrapper delegates only the last LintError added.

Don't use buildscript.classpath configuration for KtLint runtime dependencies

Right now the documentation has:

buildscript {
    configurations.classpath {
        resolutionStrategy { force 'com.github.shyiko:ktlint:0.19.0' }
    }
}

buildscript {
    dependencies {
        classpath files('libs/my-custom-ktlint-rules.jar')
        classpath 'org.other.ktlint:custom-rules:1.0'
    }
}

These dependencies are added as dependencies to the build script itself. These can potentially conflict with other transitive dependencies from other plugins and are also leaked in as compile/runtime dependencies of the build script. (Documentation at https://docs.gradle.org/current/userguide/tutorial_using_tasks.html#sec:build_script_external_dependencies)

Instead, it might be better to follow the Gradle convention of having a configuration specifically to group all Ktlint dependencies:

configurations {
  ktlint
}

Which could then be used normally from the the dependencies {} block:

dependencies {
  ktlint(files(...))
  ktlint('somegroup:someid:1.0.0')
}

This is similar to what Gradle currently does with the FindBugs plugin (https://docs.gradle.org/4.8/userguide/findbugs_plugin.html), JaCoCo (https://docs.gradle.org/4.8/userguide/jacoco_plugin.html), CodeNarc (https://docs.gradle.org/4.8/userguide/codenarc_plugin.html), and other code quality plugins.

Suppressing Warnings

Is there any satisfying way to suppress a certain error using this plugin? I tried using the ktlint disable command, as well as @Suppress in Kotlin and both failed, although I may be inputting the wrong string for @Suppress. Let me know if this is a supported feature.

MethodNotFoundException when reporting build completed?

Hey, this seems like a pretty weird issue I'm having and I wonder if you're able to help diagnose. After applying this plugin to my project, I've started receiving the following error message after gradle prints BUILD SUCCESSFUL. I'm a bit flummoxed as it doesn't seem to be an error from within your code and I've checked and double checked to ensure that kotlin versions are the same in dependencies.

Gradle: v4.0
Kotlin Gradle Plugin: v1.1.2-5
Android Gradle Plugin: v2.3.3

Rough project structure:

Root project 'android-app'
+--- Project ':app' (android-app)
+--- Project ':map-lib' (android-library)
\    \--- Project ':api' (android-library)
java.lang.NoSuchMethodError: org.jetbrains.kotlin.incremental.FileUtilsKt.relativeToRoot(Ljava/io/File;Lorg/gradle/api/Project;)Ljava/lang/String;
	at org.jetbrains.kotlin.gradle.plugin.KotlinGradleBuildServices.buildFinished(KotlinGradleBuildServices.kt:105)
	at sun.reflect.GeneratedMethodAccessor197.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.event.DefaultListenerManager$ListenerDetails.dispatch(DefaultListenerManager.java:371)
	at org.gradle.internal.event.DefaultListenerManager$ListenerDetails.dispatch(DefaultListenerManager.java:353)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:58)
	at org.gradle.internal.event.DefaultListenerManager$EventBroadcast$ListenerDispatch.dispatch(DefaultListenerManager.java:341)
	at org.gradle.internal.event.DefaultListenerManager$EventBroadcast$ListenerDispatch.dispatch(DefaultListenerManager.java:328)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:42)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:230)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:149)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:58)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:324)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:234)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:140)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
	at com.sun.proxy.$Proxy15.buildFinished(Unknown Source)
	at org.gradle.initialization.DefaultGradleLauncher$1.run(DefaultGradleLauncher.java:127)
	at org.gradle.internal.work.DefaultWorkerLeaseService$2.execute(DefaultWorkerLeaseService.java:124)
	at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:116)
	at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:99)
	at org.gradle.launcher.exec.GradleBuildController.run(GradleBuildController.java:66)
	at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$1.run(RunAsBuildOperationBuildActionRunner.java:43)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:317)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:309)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:185)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:95)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:40)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:51)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:44)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:28)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:75)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:49)
	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:51)
	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:32)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:64)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:29)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:55)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:42)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:50)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:30)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
	at org.gradle.util.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:50)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
	at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:46)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
	at java.lang.Thread.run(Thread.java:745)

kotlinter-gradle doesn't work properly when using classpath and apply

When I add the plugin using classpath and apply, it doesn't seem to run any linting:

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "gradle.plugin.org.jmailen.gradle:kotlinter-gradle:1.3.1"
  }
}

apply plugin: "org.jmailen.kotlinter"

The lintKotlin task runs, but doesn't scan any files. (running with -d doesn't show any linting occurances)

The regular plugin { id "org.jmailen.kotlinter" version "1.3.1" } works fine.

Plugin doesn't seem to take account changes to source set after plugin is applied

I'm using this plugin like this:

apply plugin: "com.android.application"
apply plugin: "kotlin-android"
apply plugin: "org.jmailen.kotlinter"

...
android {
    ...
    sourceSets {
        main {
            java.srcDirs += "src/main/kotlin"
        }
        test {
            java.srcDirs += "src/test/kotlin"
        }
        androidTest {
            java.srcDirs += "src/androidTest/kotlin"
        }
    }
}

The problem is kotlinter seems to resolve the source sets and collect the files right away, in the apply step. Changes made later have no effect. I'd like to use "src/group/kotlin" directories since these are pure kotlin projects.

What I'd like to see is the source file discovery deferred until task run time. I think it'd be fine if this plugin still searched for source sets on apply for purpose of creating the tasks, but I think each task should get a list of files from the app at runtime, rather than plugin apply time.

This is a fine plugin all around and I'd like to keep using it. I spent about an hour looking at how to hack a solution in, but it required a decent amount of refactoring and I don't have the time at the moment. I may pick it up in a few weeks when I have some spare time, but for now I'm leaving this issue open to put it on the radar and perhaps see if someone has a quick fix for it.

NoSuchFieldError: OPERATION_REFERENCE error on gradle 5.1.1

Hello, I upgraded Android Studio to 3.4, with gradle android plugin to 3.4 and gradle to 5.1.1 version. After that I cannot use kotliner anymore.

Error:
Caused by: java.lang.NoSuchFieldError: OPERATION_REFERENCE
at com.github.shyiko.ktlint.ruleset.standard.NoUnusedImportsRule$visit$1.invoke(NoUnusedImportsRule.kt:59)
at com.github.shyiko.ktlint.ruleset.standard.NoUnusedImportsRule$visit$1.invoke(NoUnusedImportsRule.kt:13)
at com.github.shyiko.ktlint.ruleset.standard.PackageKt.visit(package.kt:30)
at com.github.shyiko.ktlint.ruleset.standard.NoUnusedImportsRule.visit(NoUnusedImportsRule.kt:52)
at com.github.shyiko.ktlint.core.KtLint$format$1.invoke(KtLint.kt:339)
at com.github.shyiko.ktlint.core.KtLint$format$1.invoke(KtLint.kt:36)
at com.github.shyiko.ktlint.core.KtLint$visitor$2$2.invoke(KtLint.kt:207)
at com.github.shyiko.ktlint.core.KtLint$visitor$2$2.invoke(KtLint.kt:36)
at com.github.shyiko.ktlint.core.KtLint.visit(KtLint.kt:502)
at com.github.shyiko.ktlint.core.KtLint.access$visit(KtLint.kt:36)
at com.github.shyiko.ktlint.core.KtLint$visitor$2.invoke(KtLint.kt:206)
at com.github.shyiko.ktlint.core.KtLint$visitor$2.invoke(KtLint.kt:36)
at com.github.shyiko.ktlint.core.KtLint.format(KtLint.kt:334)
at com.github.shyiko.ktlint.core.KtLint.format(KtLint.kt:285)
at org.jmailen.gradle.kotlinter.tasks.FormatTask.formatKt(FormatTask.kt:72)
at org.jmailen.gradle.kotlinter.tasks.FormatTask.access$formatKt(FormatTask.kt:15)
at org.jmailen.gradle.kotlinter.tasks.FormatTask$run$1$1.invoke(FormatTask.kt:41)
at org.jmailen.gradle.kotlinter.tasks.FormatTask$run$1$1.invoke(FormatTask.kt:15)

Make lint tasks cacheable?

Looking at your LintTask, I see that it is already incremental. Would you object to also making it cacheable? I believe it would be as simple as annotating the class with @Cacheable. And, since that annotation is not inherited by subclasses, you would also need to modify your TaskCreator.createParentTasks() function to make your dynamic tasks cacheable, using Gradle's runtime API. For example:

outputs.cacheIf { true }

I have tested this locally with my custom LintTask, and it works.

task lintKotlinAll(type: LintTask, group: 'verification') {
    outputs.cacheIf { true } // this enables the Gradle build cache
    source files(modulesToCheck.collect { "$it/src" }) // list of Gradle projects
    reports = [
            'plain': file("$buildDir/reports/ktlint/all-lint.txt"),
            'html' : file("$buildDir/reports/ktlint/all-lint.html")
    ]
}

If you're open to this, I would be willing to file a PR.

Could not find gradle.plugin.org.jmailen.gradle:kotlinter-gradle:1.16.0.

I am using the Android Studio 3.2-beta05 and update Kolinter-gradle from 1.15.1 to 1.16.0.
Please check again. Thank you so much.

Could not find gradle.plugin.org.jmailen.gradle:kotlinter-gradle:1.16.0.
Searched in the following locations:
  - https://repo.maven.apache.org/maven2/gradle/plugin/org/jmailen/gradle/kotlinter-gradle/1.16.0/kotlinter-gradle-1.16.0.pom
  - https://repo.maven.apache.org/maven2/gradle/plugin/org/jmailen/gradle/kotlinter-gradle/1.16.0/kotlinter-gradle-1.16.0.jar
  - https://dl.google.com/dl/android/maven2/gradle/plugin/org/jmailen/gradle/kotlinter-gradle/1.16.0/kotlinter-gradle-1.16.0.pom
  - https://dl.google.com/dl/android/maven2/gradle/plugin/org/jmailen/gradle/kotlinter-gradle/1.16.0/kotlinter-gradle-1.16.0.jar
  - https://jcenter.bintray.com/gradle/plugin/org/jmailen/gradle/kotlinter-gradle/1.16.0/kotlinter-gradle-1.16.0.pom
  - https://jcenter.bintray.com/gradle/plugin/org/jmailen/gradle/kotlinter-gradle/1.16.0/kotlinter-gradle-1.16.0.jar
  - https://jitpack.io/gradle/plugin/org/jmailen/gradle/kotlinter-gradle/1.16.0/kotlinter-gradle-1.16.0.pom
  - https://jitpack.io/gradle/plugin/org/jmailen/gradle/kotlinter-gradle/1.16.0/kotlinter-gradle-1.16.0.jar
  - https://maven.fabric.io/public/gradle/plugin/org/jmailen/gradle/kotlinter-gradle/1.16.0/kotlinter-gradle-1.16.0.pom
  - https://maven.fabric.io/public/gradle/plugin/org/jmailen/gradle/kotlinter-gradle/1.16.0/kotlinter-gradle-1.16.0.jar
  - http://oss.sonatype.org/content/repositories/snapshots/gradle/plugin/org/jmailen/gradle/kotlinter-gradle/1.16.0/kotlinter-gradle-1.16.0.pom
  - http://oss.sonatype.org/content/repositories/snapshots/gradle/plugin/org/jmailen/gradle/kotlinter-gradle/1.16.0/kotlinter-gradle-1.16.0.jar
  - https://plugins.gradle.org/m2/gradle/plugin/org/jmailen/gradle/kotlinter-gradle/1.16.0/kotlinter-gradle-1.16.0.pom
  - https://plugins.gradle.org/m2/gradle/plugin/org/jmailen/gradle/kotlinter-gradle/1.16.0/kotlinter-gradle-1.16.0.jar
Required by:
    project :

Is that possible to include custom rule from current project?

Readme states two ways how to add custom rules

buildscript {
    dependencies {
        classpath files('libs/my-custom-ktlint-rules.jar')
        classpath 'org.other.ktlint:custom-rules:1.0'
    }
}

I'd like to have custom rules as separate module in my project. Is that possible to include them directly? Ideally, I'd like that these rules are applied against themselves as well.

Plugin apply should be after android extension setup

This setup does not work, because source set is edited after plugin apply. Lint task just ends with NO_SOURCE result.

apply plugin: 'org.jmailen.kotlinter'
android {
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }
}

And this setup works well.

android {
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }
}
apply plugin: 'org.jmailen.kotlinter'

This is not a bug, because plugin creates tasks right after apply call. But I think, the second configuration example must be documented in README.md, because it can be not obvious enough for new users of plugin (like me), why it does not work.

Thank You

Hey Jeremy,

I've been watching this project for couple of days and I think it's awesome. Just wanted to say Thank You for doing this and let you know that I have added a link to this repo in https://github.com/shyiko/ktlint#-with-gradle.

Keep it up!

Enjoy your weekend,
Stan.

Linter is not working for Android libraries

Project has 2 modules - one is main application module and one is android library - linter tasks are created for library module, but doesn't report any issues in Kotlin files. I've checked by introducing "Needless blank line(s)" lint error.

Multiple sourceSets

Hello,

i have a project with 2 sourceSet directory "java" and "newarchy".
I do it like this :

sourceSets { main.java.srcDirs += 'src/main/newarchy' }

The "newarchy" contains kotlin files and some java files.

But when i run ./gradlew lintKotlin , it check only file in "java" directory

How can i configure my project to check another directory ?

Thanks.

Error thrown by Worker: "changing log factory"

Version 2.0.0, Gradle 5.4.1.

Just got this stacktrace while testing some changes. Not sure what to make of it. Build still passed.

> Task :lintKotlinAll
Changing log factory
java.lang.Throwable
        at org.jetbrains.kotlin.com.intellij.openapi.diagnostic.Logger.setFactory(Logger.java:49)
        at com.pinterest.ktlint.core.KtLint.<clinit>(KtLint.kt:80)
        at org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable.lint(LintWorkerRunnable.kt:64)
        at org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable.lintKt(LintWorkerRunnable.kt:58)
        at org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable.access$lintKt(LintWorkerRunnable.kt:17)
        at org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable$run$1$lintFunc$1.invoke(LintWorkerRunnable.kt:37)
        at org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable$run$1$lintFunc$1.invoke(LintWorkerRunnable.kt:17)
        at org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable.run(LintWorkerRunnable.kt:46)
        at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:41)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.execute(NoIsolationWorkerFactory.java:58)
        at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44)
        at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:51)
        at org.gradle.workers.internal.DefaultWorkerExecutor$1.call(DefaultWorkerExecutor.java:107)
        at org.gradle.workers.internal.DefaultWorkerExecutor$1.call(DefaultWorkerExecutor.java:101)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:215)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:131)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
        at java.lang.Thread.run(Thread.java:748)

Attempting to set custom ktlint version causes error

The README says:

If you need to use a different version of ktlint you can override the dependency.

buildscript {
    configurations.classpath {
        resolutionStrategy { force 'com.github.shyiko:ktlint:0.11.1' }
    }
}

When I add this:

configurations.classpath {
    resolutionStrategy { force 'com.github.shyiko:ktlint:0.15.0' }
}

...to the buildscript section of my build.gradle it fails:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileKotlin'.
> Operation is not supported for read-only collection

Looking for some advice on report customization with multiple lint tasks

Use case: I have four source sets that lintKotlin lints: main, debug, androidTest, and test. Running that task results in the production of four reports. I would like to collate those four reports into one. (not to mention I have four modules in my project, and each has four source sets, ... you see the problem.)

In fact, I have a proof of concept that works, but I've run into a problem -- the lintKotlin task is fail-fast. If any of the sub-tasks fails, the aggregate task fails and my custom Gradle task never runs. I tried using finalizedBy, but conceptually it should be lintKotlin.finalizedBy customTask, and that just doesn't work if a sub-task fails (correct me if I'm wrong).

So, I'm hoping you might have some advice on what's a good hook for running my task, which should run regardless of whether lintKotlin succeeds. If this succeeds, I'd like to turn it into a plugin, perhaps.

Thanks!

NoSuchElementException in LintWorkerRunnable

With 1.25.1, I got the following stacktrace. I cannot reliably reproduce it, which might hint at some concurrency issue.

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':server:core:lintKotlinMain'.
> There were multiple failures while executing work items
   > A failure occurred while executing org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable
      > java.util.NoSuchElementException (no error message)
   > A failure occurred while executing org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable
      > java.util.NoSuchElementException (no error message)

Allow for task dependency order (format before lint for example)

Looking format first and then do the linting in our builds.

lintKotlin current depends on "check" which means we cannot formatKotlin first which is a desired flow.

With kotlinter ignoreFailures = false set, the build will fail due to a style issue. We want to format first and then only fail on things that were not able to be formatted automatically.

Hence the ask to make the lintKotlin attachment to the "check" task by default with an option to change to something else like dependsOn("formatKotlin").

For my situation, I would end up doing the following for my builds:

  • formatKotlin depends on Check
  • lintKotlin depends on formatKotlin

FilenameRule isn't applied when running lintKotlin task

Hi,

If I create a file X.kt with the following contents:

typealias NotX = Map<String, String>

And I run ktlint I get an error:

X.kt:1:1: typealias NotX should be declared in a file named NotX.kt

If I run:

./gradlew lintKotlin --rerun-tasks

BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 executed

No errors... why?

Related issue ticket on ktlint side: pinterest/ktlint#230

exception when using kotlin EAP

using Kotlin 1.3.20 EAP 2 or 1.3.20-eap-52 it fails like this

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':fuel:lintKotlinMain'.
> LONG_STRING_TEMPLATE_ENTRY

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':fuel:lintKotlinMain'.
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:110)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:77)
	at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
	at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:59)
	at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
	at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:59)
	at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:101)
	at org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter.java:44)
	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:91)
	at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:62)
	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:59)
	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
	at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.run(EventFiringTaskExecuter.java:51)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:46)
	at org.gradle.execution.taskgraph.LocalTaskInfoExecutor.execute(LocalTaskInfoExecutor.java:42)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareWorkItemExecutor.execute(DefaultTaskExecutionGraph.java:277)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareWorkItemExecutor.execute(DefaultTaskExecutionGraph.java:262)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:135)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:130)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.execute(DefaultTaskPlanExecutor.java:200)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.executeWithWork(DefaultTaskPlanExecutor.java:191)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.run(DefaultTaskPlanExecutor.java:130)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: java.lang.NoSuchFieldError: LONG_STRING_TEMPLATE_ENTRY
	at com.github.shyiko.ktlint.ruleset.standard.StringTemplateRule.visit(StringTemplateRule.kt:29)
	at com.github.shyiko.ktlint.core.KtLint$lint$1.invoke(KtLint.kt:156)
	at com.github.shyiko.ktlint.core.KtLint$lint$1.invoke(KtLint.kt:36)
	at com.github.shyiko.ktlint.core.KtLint$visitor$2$1.invoke(KtLint.kt:201)
	at com.github.shyiko.ktlint.core.KtLint$visitor$2$1.invoke(KtLint.kt:36)
	at com.github.shyiko.ktlint.core.KtLint.visit(KtLint.kt:502)
	at com.github.shyiko.ktlint.core.KtLint.access$visit(KtLint.kt:36)
	at com.github.shyiko.ktlint.core.KtLint$visitor$2.invoke(KtLint.kt:199)
	at com.github.shyiko.ktlint.core.KtLint$visitor$2.invoke(KtLint.kt:36)
	at com.github.shyiko.ktlint.core.KtLint.lint(KtLint.kt:151)
	at com.github.shyiko.ktlint.core.KtLint.lint(KtLint.kt:106)
	at org.jmailen.gradle.kotlinter.tasks.LintTask.lintKt(LintTask.kt:88)
	at org.jmailen.gradle.kotlinter.tasks.LintTask.access$lintKt(LintTask.kt:24)
	at org.jmailen.gradle.kotlinter.tasks.LintTask$run$2$lintFunc$1.invoke(LintTask.kt:61)
	at org.jmailen.gradle.kotlinter.tasks.LintTask$run$2$lintFunc$1.invoke(LintTask.kt:24)
	at org.jmailen.gradle.kotlinter.tasks.LintTask.run(LintTask.kt:69)
	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:46)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
	at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:801)
	at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:768)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:131)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:120)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:99)
	... 31 more

also reported here: pinterest/ktlint#321

Fails to run when using kotlin 1.2.20-eap-11

Execution failed for task ':xxx-web:formatKotlinMain'.
> Could not initialize class com.github.shyiko.ktlint.core.KtLint

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':xxx-web:formatKotlinMain'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)
        at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ResolveBuildCacheKeyExecuter.execute(ResolveBuildCacheKeyExecuter.java:61)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:60)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:97)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:87)
        at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:123)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:79)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:104)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:98)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:626)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:581)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:98)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.github.shyiko.ktlint.core.KtLint
        at org.jmailen.gradle.kotlinter.tasks.FormatTask.formatKt(FormatTask.kt:70)
        at org.jmailen.gradle.kotlinter.tasks.FormatTask.access$formatKt(FormatTask.kt:15)
        at org.jmailen.gradle.kotlinter.tasks.FormatTask$run$1$formatFunc$1.invoke(FormatTask.kt:36)
        at org.jmailen.gradle.kotlinter.tasks.FormatTask$run$1$formatFunc$1.invoke(FormatTask.kt:15)
        at org.jmailen.gradle.kotlinter.tasks.FormatTask.run(FormatTask.kt:45)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:46)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:780)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:747)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:121)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:110)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:92)
        ... 30 more

More info about 1.2.20-eap-11: https://discuss.kotlinlang.org/t/kotlin-1-2-20-eap/5896

List of all possible rules that can be disabled?

I tried migrating to 2.0.0, and got a LOT of these errors:

Imports must be ordered in lexicographic order without any empty lines in-between

How can I disable that rule? I only see an example for no-wildcard-imports. Is there a list somewhere?

disabled-rules for ktlint in .editorconfig is ignored

Since 0.34, ktlint supports disabling rules globally with a setting in the .editorconfig file:

# Comma-separated list of rules to disable (Since 0.34.0)
# Note that rules in any ruleset other than the standard ruleset will need to be prefixed 
# by the ruleset identifier.
disabled_rules=no-wildcard-imports,experimental:annotation,my-custom-ruleset:my-custom-rule

(see https://github.com/pinterest/ktlint#custom-editorconfig-properties)

It seems like kotlinter does not pick up that configuration setting and it has to be repeated in the corresponding kotlinter configuration that was introduced in version 2.0.0.

Am I missing something or is this duplication necessary?

Upgrading to Kotlin 1.3.30 causes "A failure occurred while executing org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable > PROPERTY_DELEGATE"

When I upgrade from Kotlin 1.3.21 to 1.3.30 I get the followning when execute the gradle check task:

> Task :lintKotlinMain FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':lintKotlinMain'.
> There was a failure while executing work items
   > A failure occurred while executing org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable
      > PROPERTY_DELEGATE

This is using kotlinter 1.23.1.

If I don't apply the kotlinter plugin but keep everything else the same, the check task passes.

Here's the stack trace:

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':lintKotlinMain'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:110)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:59)
        at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:59)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:101)
        at org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter.java:44)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:91)
        at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:59)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.run(EventFiringTaskExecuter.java:51)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:301)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:293)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:46)
        at org.gradle.execution.taskgraph.LocalTaskInfoExecutor.execute(LocalTaskInfoExecutor.java:42)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareWorkItemExecutor.execute(DefaultTaskExecutionGraph.java:277)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareWorkItemExecutor.execute(DefaultTaskExecutionGraph.java:262)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:135)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:130)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.execute(DefaultTaskPlanExecutor.java:200)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.executeWithWork(DefaultTaskPlanExecutor.java:191)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.run(DefaultTaskPlanExecutor.java:130)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: org.gradle.workers.WorkerExecutionException: There was a failure while executing work items
        at org.gradle.workers.internal.DefaultWorkerExecutor.workerExecutionException(DefaultWorkerExecutor.java:155)
        at org.gradle.workers.internal.DefaultWorkerExecutor.await(DefaultWorkerExecutor.java:149)
        at org.jmailen.gradle.kotlinter.tasks.LintTask.run(LintTask.kt:84)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:46)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:801)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:768)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:131)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:301)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:293)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:120)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:99)
        ... 31 more
Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable
        at org.gradle.workers.internal.DefaultWorkerExecutor$WorkerExecution.waitForCompletion(DefaultWorkerExecutor.java:274)
        at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:115)
        at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForCompletion(DefaultAsyncWorkTracker.java:87)
        at org.gradle.workers.internal.DefaultWorkerExecutor.await(DefaultWorkerExecutor.java:147)
        ... 46 more
Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.github.shyiko.ktlint.core.ast.ElementType
        at com.github.shyiko.ktlint.ruleset.standard.ChainWrappingRule.<init>(ChainWrappingRule.kt:36)
        at com.github.shyiko.ktlint.ruleset.standard.StandardRuleSetProvider.get(StandardRuleSetProvider.kt:12)
        at org.jmailen.gradle.kotlinter.support.RuleSetsKt.resolveRuleSets(ruleSets.kt:15)
        at org.jmailen.gradle.kotlinter.support.RuleSetsKt.resolveRuleSets$default(ruleSets.kt:11)
        at org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerRunnable.run(LintWorkerRunnable.kt:47)
        at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:39)
        at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:25)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.call(NoIsolationWorkerFactory.java:69)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.call(NoIsolationWorkerFactory.java:63)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:315)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:305)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:101)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:63)
        at org.gradle.workers.internal.DefaultWorkerExecutor$1.call(DefaultWorkerExecutor.java:102)
        at org.gradle.workers.internal.DefaultWorkerExecutor$1.call(DefaultWorkerExecutor.java:96)
        at org.gradle.internal.work.AbstractConditionalExecution$1.run(AbstractConditionalExecution.java:38)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:212)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:161)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:130)
        ... 3 more

Crash when running Lint task

I've tried to use the plugin in our Android project. We usually extract common scripts in separate files and there the plugin is crashing

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:kotlinLint'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:98)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:68)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
        at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:236)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:228)
        at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:61)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:228)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:215)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:77)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:58)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:46)
Caused by: org.gradle.api.UnknownDomainObjectException: Extension of type 'KotlinterExtension' does not exist. Currently registered extension types: [ExtraPropertiesExtension, DefaultArtifactPublicationSet, ReportingExtension, AppExtension, KotlinProjectExtension, KaptExtension, KotlinterExtension, DownloadExtension, UnMockExtension]
        at org.gradle.api.internal.plugins.ExtensionsStorage.getHolderByType(ExtensionsStorage.java:91)
        at org.gradle.api.internal.plugins.ExtensionsStorage.getByType(ExtensionsStorage.java:78)
        at org.gradle.api.internal.plugins.DefaultConvention.getByType(DefaultConvention.java:171)
        at org.gradle.api.internal.plugins.DefaultConvention.getByType(DefaultConvention.java:166)
        at org.jmailen.gradle.kotlinter.tasks.LintTask.ignoreFailures(LintTask.kt:23)
        at org.jmailen.gradle.kotlinter.tasks.LintTask.run(LintTask.kt:53)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.doExecute(DefaultTaskClassInfoStore.java:141)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:123)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:692)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:675)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.execute(ExecuteActionsTaskExecuter.java:115)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.execute(ExecuteActionsTaskExecuter.java:109)
        at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:109)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:90)
        ... 20 more

The main build script looks something like this

apply some plugins
android { }
apply from: '../gradle/kotlin-lint.gradle' // apply after the android plugin has been configured

The apply from is the problem. If I copy the following script inside of the file, then the task is successful.

That's the complete kotlin-lint.gradle file

import org.jmailen.gradle.kotlinter.tasks.LintTask

kotlinter {
    ignoreFailures = false
}

// buildscript is necessary to find the imports
buildscript {
    repositories {
        jcenter()

        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }

    dependencies {
        classpath "gradle.plugin.org.jmailen.gradle:kotlinter-gradle:$kotlinLintVersion"
    }

    // Enable this in case the gradle plugin is using an older version
    //
    // configurations.classpath {
    //     resolutionStrategy { force 'com.github.shyiko:ktlint:0.6.1' }
    // }
}

apply plugin: 'org.jmailen.kotlinter'

kotlinter {
    // this block does not help
    ignoreFailures = false
}

task kotlinLint(type: LintTask, group: 'verification') {
    FileTree tree = files().asFileTree

    android.sourceSets.each { sourceSet ->
        sourceSet.javaDirectories.each {
            tree += fileTree(dir: it, include: '**/*.kt')
        }
    }

    source tree

    report = file('build/lint-report.txt')
}

check.dependsOn kotlinLint

1.26.0 breaks plugin task by name in kotlin-dsl

section named "kotlinter { ... }" in your build.gradle.kts doesn't work on 1.26.0 but works on 1.25.2

plugins {
    // Apply the Kotlin JVM plugin to add support for Kotlin on the JVM
    val kotlinVersion = "1.3.31"
    kotlin("jvm") version kotlinVersion
    // style check
    id("org.jmailen.kotlinter") version "1.26.0" apply false
}
// all projects will get this whole block applied to them, including the current project
allprojects {
    apply(plugin = "kotlin")
    apply(plugin = "org.jmailen.kotlinter")
    kotlinter {
        ignoreFailures = false
        indentSize = 4
        continuationIndentSize = 4
        reporter = "checkstyle"
        allowWildcardImports = true
    }
    tasks.withType<LintTask> {
        exclude("**/*.Generated.kt")
    }

    tasks.withType<KotlinCompile> {
        dependsOn("formatKotlin")
    }

    tasks.withType<JavaCompile> {
        sourceCompatibility = JavaVersion.VERSION_11.toString()
        targetCompatibility = JavaVersion.VERSION_11.toString()
    }

    tasks.withType<KotlinCompile> {
        sourceCompatibility = JavaVersion.VERSION_11.toString()
        targetCompatibility = JavaVersion.VERSION_11.toString()

        kotlinOptions {
            languageVersion = "1.3"
            jvmTarget = JavaVersion.VERSION_11.toString()
            freeCompilerArgs = listOf("-Xjsr305=strict")
        }
    }

    tasks.withType<Wrapper> {
        gradleVersion = "5.4.1"
    }

    /* defines where we can retrieve general dependencies-- see settings.gradle.kts for plugin retrieval */
    repositories {
        mavenLocal()
        mavenCentral()
        jcenter()
        maven("https://oss.sonatype.org/")
        maven("https://repo.spring.io/milestone")
        maven("https://repo.spring.io/snapshot")

        maven("https://nexus.sdlc.marketplace.ea.com/repository/mrkt/")
    }
 ...
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.