diff --git a/.github/workflows/build-and-check.yml b/.github/workflows/build-and-check.yml index 0d7fb3f9..0f4ff13d 100644 --- a/.github/workflows/build-and-check.yml +++ b/.github/workflows/build-and-check.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: # https://michaelheap.com/dynamic-matrix-generation-github-actions/ - id: set-matrix - run: echo "::set-output name=version_matrix::$(curl https://endoflife.date/api/java.json | jq -c '[.[] | select(.eol > (now | strftime("%Y-%m-%d"))) | .cycle]' | sed 's/ //g')" + run: echo "::set-output name=version_matrix::$(curl https://endoflife.date/api/oracle-jdk.json | jq -c '[.[] | select(.extendedSupport > (now | strftime("%Y-%m-%d"))) | .cycle]' | sed 's/ //g')" - name: verify-matrix run: echo "The selected java versions are ${{ steps.set-matrix.outputs.version_matrix }}" outputs: diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml new file mode 100644 index 00000000..bc6cb781 --- /dev/null +++ b/.github/workflows/scorecard.yml @@ -0,0 +1,72 @@ +# This workflow uses actions that are not certified by GitHub. They are provided +# by a third-party and are governed by separate terms of service, privacy +# policy, and support documentation. + +name: Scorecard supply-chain security +on: + # For Branch-Protection check. Only the default branch is supported. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection + branch_protection_rule: + # To guarantee Maintained check is occasionally updated. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained + schedule: + - cron: '40 1 * * 0' + push: + branches: [ "main" ] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecard analysis + runs-on: ubuntu-latest + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Needed to publish results and get a badge (see publish_results below). + id-token: write + # Uncomment the permissions below if installing in a private repository. + # contents: read + # actions: read + + steps: + - name: "Checkout code" + uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@e38b1902ae4f44df626f11ba0734b14fb91f8f86 # v2.1.2 + with: + results_file: results.sarif + results_format: sarif + # (Optional) "write" PAT token. Uncomment the `repo_token` line below if: + # - you want to enable the Branch-Protection check on a *public* repository, or + # - you are installing Scorecard on a *private* repository + # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat. + # repo_token: ${{ secrets.SCORECARD_TOKEN }} + + # Public repositories: + # - Publish results to OpenSSF REST API for easy access by consumers + # - Allows the repository to include the Scorecard badge. + # - See https://github.com/ossf/scorecard-action#publishing-results. + # For private repositories: + # - `publish_results` will always be set to `false`, regardless + # of the value entered here. + publish_results: true + + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF + # format to the repository Actions tab. + - name: "Upload artifact" + uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard. + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@17573ee1cc1b9d061760f3a006fc4aac4f944fd5 # v2.2.4 + with: + sarif_file: results.sarif diff --git a/CHANGELOG.md b/CHANGELOG.md index 151c332e..35c79d01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/). ## [Unreleased] +## [12.0.0] - 2023-11-28 + +- update latest version text file manually [#716](https://github.com/JLLeitschuh/ktlint-gradle/pull/716) +- Fix configuration cache for relative paths [#722](https://github.com/JLLeitschuh/ktlint-gradle/pull/722) +- Drop support for Gradle 6 and ktlint < 0.47.1 [#720](https://github.com/JLLeitschuh/ktlint-gradle/pull/720) + +## [11.6.1] - 2023-10-10 + +- fix "additionalEditorconfig not supported until ktlint 0.49" warning [#712](https://github.com/JLLeitschuh/ktlint-gradle/pull/712) +- update latest version text file manually [#709](https://github.com/JLLeitschuh/ktlint-gradle/pull/709) +- Improve error logging [#711](https://github.com/JLLeitschuh/ktlint-gradle/pull/711) + +## [11.6.0] - 2023-09-18 + +- ktlint 1.0 support [#708](https://github.com/JLLeitschuh/ktlint-gradle/pull/708) +- Allow editorconfig overrides in ktlint 0.49+ [#708](https://github.com/JLLeitschuh/ktlint-gradle/pull/708) - update latest version text file manually [#700](https://github.com/JLLeitschuh/ktlint-gradle/pull/700) ## [11.5.1] - 2023-08-07 @@ -684,7 +700,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/). - Renamed task with name `ktlint` to `ktlintCheck` (#3) - Renamed tasks with names `ktlint[source set name]` to `ktlint[source set name]Check` (#3) -[Unreleased]: https://github.com/JLLeitschuh/ktlint-gradle/compare/v11.5.1...HEAD +[Unreleased]: https://github.com/JLLeitschuh/ktlint-gradle/compare/v12.0.0...HEAD + +[12.0.0]: https://github.com/JLLeitschuh/ktlint-gradle/compare/v11.6.1...v12.0.0 + +[11.6.1]: https://github.com/JLLeitschuh/ktlint-gradle/compare/v11.6.0...v11.6.1 + +[11.6.0]: https://github.com/JLLeitschuh/ktlint-gradle/compare/v11.5.1...v11.6.0 [11.5.1]: https://github.com/JLLeitschuh/ktlint-gradle/compare/v11.5.0...v11.5.1 diff --git a/README.md b/README.md index 077028e9..19e69d11 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,13 @@ **Provides a convenient wrapper plugin over the [ktlint](https://github.com/pinterest/ktlint) project.** -Latest plugin version: [11.5.1](/CHANGELOG.md#---20230807) +Latest plugin version: [12.0.0](/CHANGELOG.md#---20231128) [![Join the chat at https://kotlinlang.slack.com](https://img.shields.io/badge/slack-@kotlinlang/ktlint-yellow.svg?logo=slack)](https://kotlinlang.slack.com/messages/CKS3XG0LS) [![Build and Check](https://github.com/JLLeitschuh/ktlint-gradle/actions/workflows/build-and-check.yml/badge.svg)](https://github.com/JLLeitschuh/ktlint-gradle/actions/workflows/build-and-check.yml) [![ktlint](https://img.shields.io/badge/code%20style-%E2%9D%A4-FF4081.svg)](https://ktlint.github.io/) [![Gradle Plugin Portal](https://img.shields.io/maven-metadata/v/https/plugins.gradle.org/m2/org/jlleitschuh/gradle/ktlint/org.jlleitschuh.gradle.ktlint.gradle.plugin/maven-metadata.xml.svg?colorB=007ec6&label=gradlePluginPortal)](https://plugins.gradle.org/plugin/org.jlleitschuh.gradle.ktlint) +[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/JLLeitschuh/ktlint-gradle/badge)](https://securityscorecards.dev/viewer/?uri=github.com/JLLeitschuh/ktlint-gradle) This plugin creates convenient tasks in your Gradle project that run [ktlint](https://github.com/pinterest/ktlint) checks or do code @@ -63,12 +64,11 @@ open a [new issue](https://github.com/JLLeitschuh/ktlint-gradle/issues/new). This plugin was written using the new API available for the Gradle script Kotlin builds. This API is available in new versions of Gradle. -Minimal supported [Gradle](https://www.gradle.org) version: `6.8` +Minimal supported [Gradle](https://www.gradle.org) version: `7.4` Minimal supported [Kotlin](https://kotlinlang.org) version: `1.4` -Minimal supported [ktlint](https://github.com/pinterest/ktlint) version: `0.34.0` -(additionally excluding `0.37.0` on Windows OS and `0.38.0`, `0.43.0`, `0.43.1` on all OS types) +Minimal supported [ktlint](https://github.com/pinterest/ktlint) version: `0.47.1` ### Ktlint plugin @@ -271,6 +271,8 @@ object will be used. The version of ktlint used by default _may change_ between patch versions of this plugin. If you don't want to inherit these changes then make sure you lock your version here. +Consult the [ktlint release notes](https://github.com/pinterest/ktlint/releases) for more information about the differences between ktlint versions. +
Groovy @@ -287,6 +289,9 @@ ktlint { ignoreFailures = true enableExperimentalRules = true additionalEditorconfigFile = file("/some/additional/.editorconfig") // not supported with ktlint 0.47+ + additionalEditorconfig = [ // not supported until ktlint 0.49 + "max_line_length": "20" + ] disabledRules = ["final-newline"] // not supported with ktlint 0.48+ baseline = file("my-project-ktlint-baseline.xml") reporters { @@ -339,6 +344,11 @@ configure { ignoreFailures.set(true) enableExperimentalRules.set(true) additionalEditorconfigFile.set(file("/some/additional/.editorconfig")) // not supported with ktlint 0.47+ + additionalEditorconfig.set( // not supported until ktlint 0.49 + mapOf( + "max_line_length" to "20" + ) + ) disabledRules.set(setOf("final-newline")) // not supported with ktlint 0.48+ baseline.set(file("my-project-ktlint-baseline.xml")) reporters { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 59250647..5b5c106f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=b586e04868a22fd817c8971330fec37e298f3242eb85c374181b12d637f80302 -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionSha256Sum=3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/plugin/VERSION_CURRENT.txt b/plugin/VERSION_CURRENT.txt index 326ba189..4044f908 100644 --- a/plugin/VERSION_CURRENT.txt +++ b/plugin/VERSION_CURRENT.txt @@ -1 +1 @@ -11.5.1 +12.0.0 diff --git a/plugin/VERSION_LATEST_RELEASE.txt b/plugin/VERSION_LATEST_RELEASE.txt index 326ba189..1a31377d 100644 --- a/plugin/VERSION_LATEST_RELEASE.txt +++ b/plugin/VERSION_LATEST_RELEASE.txt @@ -1 +1 @@ -11.5.1 +11.6.1 diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts index 6b155721..b9084835 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -1,19 +1,18 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import com.gradle.enterprise.gradleplugin.testretry.retry import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.gradle.api.tasks.testing.logging.TestLogEvent import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.util.prefixIfNot plugins { - kotlin("jvm") id("com.gradle.plugin-publish") - `java-gradle-plugin` + `kotlin-dsl` `maven-publish` id("org.jlleitschuh.gradle.ktlint") id("com.github.johnrengelman.shadow") id("com.github.breadmoirai.github-release") - id("org.gradle.test-retry") } val pluginGroup = "org.jlleitschuh.gradle" @@ -60,22 +59,6 @@ configurations["testImplementation"].extendsFrom(shadowImplementation) sourceSets { val adapter by creating { } - val adapter34 by creating { - compileClasspath += adapter.output - } - val adapter34Test by creating { - compileClasspath += adapter.output + adapter34.output - runtimeClasspath += adapter.output + adapter34.output - } - val adapter41 by creating { - compileClasspath += adapter.output - } - val adapter45 by creating { - compileClasspath += adapter.output - } - val adapter46 by creating { - compileClasspath += adapter.output - } val adapter47 by creating { compileClasspath += adapter.output } @@ -88,16 +71,16 @@ sourceSets { val adapter50 by creating { compileClasspath += adapter.output } + val adapter100 by creating { + compileClasspath += adapter.output + } val adapters = listOf( adapter, - adapter34, - adapter41, - adapter45, - adapter46, adapter47, adapter48, adapter49, - adapter50 + adapter50, + adapter100 ) val main by getting { kotlin { @@ -114,37 +97,21 @@ sourceSets { } val adapterSources = listOf( sourceSets.named("adapter"), - sourceSets.named("adapter34"), - sourceSets.named("adapter41"), - sourceSets.named("adapter45"), - sourceSets.named("adapter46"), sourceSets.named("adapter47"), sourceSets.named("adapter48"), sourceSets.named("adapter49"), - sourceSets.named("adapter50") + sourceSets.named("adapter50"), + sourceSets.named("adapter100") ) tasks.named("shadowJar") { this.from(adapterSources.map { sourceSet -> sourceSet.map { it.output.classesDirs } }) } -val test34Task = tasks.register("test34") { - classpath = sourceSets.named("adapter34Test").get().runtimeClasspath - testClassesDirs = sourceSets.named("adapter34Test").get().output.classesDirs -} -tasks.named("test") { - dependsOn(test34Task) -} - dependencies { - compileOnly(gradleApi()) add("adapterCompileOnly", "com.pinterest.ktlint:ktlint-core:0.34.0") add("adapterImplementation", libs.commons.io) add("adapterImplementation", libs.semver) - add("adapter34Implementation", kotlin("reflect")) - add("adapter34CompileOnly", "com.pinterest.ktlint:ktlint-core:0.34.0") - add("adapter41CompileOnly", "com.pinterest.ktlint:ktlint-core:0.41.0") - add("adapter45CompileOnly", "com.pinterest.ktlint:ktlint-core:0.45.2") - add("adapter46CompileOnly", "com.pinterest.ktlint:ktlint-core:0.46.1") + add("adapter47CompileOnly", "com.pinterest.ktlint:ktlint-core:0.47.1") add("adapter48CompileOnly", "com.pinterest.ktlint:ktlint-core:0.48.2") @@ -159,6 +126,11 @@ dependencies { add("adapter50CompileOnly", "com.pinterest.ktlint:ktlint-ruleset-standard:0.50.0") add("adapter50CompileOnly", "com.pinterest.ktlint:ktlint-reporter-baseline:0.50.0") + add("adapter100CompileOnly", "com.pinterest.ktlint:ktlint-cli-reporter-core:1.0.0") + add("adapter100CompileOnly", "com.pinterest.ktlint:ktlint-rule-engine:1.0.0") + add("adapter100CompileOnly", "com.pinterest.ktlint:ktlint-ruleset-standard:1.0.0") + add("adapter100CompileOnly", "com.pinterest.ktlint:ktlint-cli-reporter-baseline:1.0.0") + compileOnly(libs.kotlin.gradle.plugin) compileOnly(libs.android.gradle.plugin) compileOnly(kotlin("stdlib-jdk8")) @@ -174,19 +146,11 @@ dependencies { * https://github.com/JLLeitschuh/ktlint-gradle/issues/9 */ - testImplementation(gradleTestKit()) testImplementation(libs.junit.jupiter) testImplementation(libs.assertj.core) testImplementation(libs.kotlin.reflect) testImplementation(libs.ktlint.core) testImplementation(libs.archunit.junit5) - - add("adapter34TestImplementation", "com.pinterest.ktlint:ktlint-core:0.34.0") - add("adapter34TestImplementation", libs.commons.io) - add("adapter34TestImplementation", gradleTestKit()) - add("adapter34TestImplementation", libs.junit.jupiter) - add("adapter34TestImplementation", libs.assertj.core) - add("adapter34TestImplementation", libs.kotlin.reflect) } kotlin { @@ -202,11 +166,11 @@ kotlin { } // Test tasks loods plugin from local maven repository -tasks.named("test").configure { +tasks.named("test") { dependsOn("publishToMavenLocal") } -tasks.withType().configureEach { +tasks.withType { useJUnitPlatform() maxParallelForks = (Runtime.getRuntime().availableProcessors() / 2).takeIf { it > 0 } ?: 1 doFirst { @@ -214,7 +178,6 @@ tasks.withType().configureEach { } testLogging { events( - TestLogEvent.STARTED, TestLogEvent.FAILED, TestLogEvent.PASSED, TestLogEvent.SKIPPED @@ -382,9 +345,6 @@ pluginBundle { "ktlintPlugin" { displayName = "Ktlint Gradle Plugin" } - "ktlintIdeaPlugin" { - displayName = "Ktlint Gradle IntelliJ Configuration Plugin" - } } } diff --git a/plugin/gradle/libs.versions.toml b/plugin/gradle/libs.versions.toml index 9632b546..bc77e984 100644 --- a/plugin/gradle/libs.versions.toml +++ b/plugin/gradle/libs.versions.toml @@ -1,12 +1,12 @@ [versions] kotlin = "1.5.31" -ktlint = "0.45.2" # last version prior to API changes. we can increase this more once we drop support for the old API. +ktlint = "0.47.1" # last version prior to API changes. we can increase this more once we drop support for the old API. androidPlugin = "7.0.0" semver = "1.1.1" jgit = "5.6.0.201912101111-r" sl4fj = "1.7.30" -gradleWrapper = "7.3.3" -gradleWrapperSha = "b586e04868a22fd817c8971330fec37e298f3242eb85c374181b12d637f80302" +gradleWrapper = "8.4" +gradleWrapperSha = "3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae" junit5 = "5.5.2" assertJ = "3.11.1" commonsIo = "2.8.0" diff --git a/plugin/gradle/wrapper/gradle-wrapper.properties b/plugin/gradle/wrapper/gradle-wrapper.properties index 59250647..5b5c106f 100644 --- a/plugin/gradle/wrapper/gradle-wrapper.properties +++ b/plugin/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=b586e04868a22fd817c8971330fec37e298f3242eb85c374181b12d637f80302 -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionSha256Sum=3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/plugin/settings.gradle.kts b/plugin/settings.gradle.kts index ed652bc2..653cff13 100644 --- a/plugin/settings.gradle.kts +++ b/plugin/settings.gradle.kts @@ -2,20 +2,18 @@ pluginManagement { val latestRelease = file("VERSION_LATEST_RELEASE.txt").readText().trim() plugins { id("org.jlleitschuh.gradle.ktlint") version latestRelease - id("org.jetbrains.kotlin.jvm") version "1.7.21" + id("org.jetbrains.kotlin.jvm") version "1.9.10" id("com.gradle.plugin-publish") version "0.15.0" `java-gradle-plugin` `maven-publish` id("com.github.johnrengelman.shadow") version "7.0.0" id("com.github.breadmoirai.github-release") version "2.3.7" - id("org.gradle.test-retry") version "1.3.1" } } -enableFeaturePreview("VERSION_CATALOGS") - plugins { `gradle-enterprise` + id("org.gradle.toolchains.foojay-resolver-convention") version "0.7.0" } gradleEnterprise { diff --git a/plugin/src/adapter100/kotlin/org/jlleitschuh/gradle/ktlint/worker/KtLintInvocation100.kt b/plugin/src/adapter100/kotlin/org/jlleitschuh/gradle/ktlint/worker/KtLintInvocation100.kt new file mode 100644 index 00000000..d3b60c6f --- /dev/null +++ b/plugin/src/adapter100/kotlin/org/jlleitschuh/gradle/ktlint/worker/KtLintInvocation100.kt @@ -0,0 +1,69 @@ +package org.jlleitschuh.gradle.ktlint.worker + +import com.pinterest.ktlint.cli.ruleset.core.api.RuleSetProviderV3 +import com.pinterest.ktlint.rule.engine.api.Code +import com.pinterest.ktlint.rule.engine.api.EditorConfigOverride +import com.pinterest.ktlint.rule.engine.api.EditorConfigPropertyRegistry +import com.pinterest.ktlint.rule.engine.api.KtLintRuleEngine +import com.pinterest.ktlint.rule.engine.api.LintError +import com.pinterest.ktlint.rule.engine.core.api.RuleProvider +import java.io.File +import java.util.ServiceLoader + +class KtLintInvocation100( + private val engine: KtLintRuleEngine +) : KtLintInvocation { + companion object Factory : KtLintInvocationFactory { + fun initialize(editorConfigOverrides: Map): KtLintInvocation { + val ruleProviders = loadRuleSetsFromClasspathWithRuleSetProviderV3() + val editorConfigPropertyRegistry = EditorConfigPropertyRegistry(ruleProviders) + val engine = if (editorConfigOverrides.isEmpty()) { + KtLintRuleEngine(ruleProviders = ruleProviders) + } else { + KtLintRuleEngine( + ruleProviders = ruleProviders, + editorConfigOverride = EditorConfigOverride.from( + *editorConfigOverrides + .mapKeys { editorConfigPropertyRegistry.find(it.key) } + .entries + .map { it.key to it.value } + .toTypedArray() + ) + ) + } + return KtLintInvocation100(engine) + } + + private fun loadRuleSetsFromClasspathWithRuleSetProviderV3(): Set { + return ServiceLoader + .load(RuleSetProviderV3::class.java) + .flatMap { it.getRuleProviders() } + .toSet() + } + } + + override fun invokeLint(file: File): LintErrorResult { + val errors = mutableListOf>() + engine.lint(Code.fromFile(file)) { le: LintError -> + errors.add(le.toSerializable() to false) + } + return LintErrorResult(file, errors) + } + + override fun invokeFormat(file: File): Pair { + val errors = mutableListOf>() + val newCode = + engine.format(Code.fromFile(file)) { le, boolean -> + errors.add(le.toSerializable() to boolean) + } + return newCode to LintErrorResult(file, errors) + } + + override fun trimMemory() { + engine.trimMemory() + } +} + +internal fun LintError.toSerializable(): SerializableLintError { + return SerializableLintError(line, col, ruleId.value, detail, canBeAutoCorrected) +} diff --git a/plugin/src/adapter34/kotlin/org/jlleitschuh/gradle/ktlint/reporter/Ktlint34ReporterProvider.kt b/plugin/src/adapter34/kotlin/org/jlleitschuh/gradle/ktlint/reporter/Ktlint34ReporterProvider.kt deleted file mode 100644 index 7e0470e1..00000000 --- a/plugin/src/adapter34/kotlin/org/jlleitschuh/gradle/ktlint/reporter/Ktlint34ReporterProvider.kt +++ /dev/null @@ -1,13 +0,0 @@ -package org.jlleitschuh.gradle.ktlint.reporter - -import com.pinterest.ktlint.core.ReporterProvider -import java.io.PrintStream - -class Ktlint34ReporterProvider(val reporterProvider: ReporterProvider) : GenericReporterProvider { - override fun get(outputStream: PrintStream, opt: Map): Ktlint34Reporter { - return Ktlint34Reporter(reporterProvider.get(outputStream, opt)) - } - - override val id: String - get() = reporterProvider.id -} diff --git a/plugin/src/adapter34/kotlin/org/jlleitschuh/gradle/ktlint/reporter/SerializableReporterProvider.kt b/plugin/src/adapter34/kotlin/org/jlleitschuh/gradle/ktlint/reporter/SerializableReporterProvider.kt deleted file mode 100644 index eac809ee..00000000 --- a/plugin/src/adapter34/kotlin/org/jlleitschuh/gradle/ktlint/reporter/SerializableReporterProvider.kt +++ /dev/null @@ -1,38 +0,0 @@ -package org.jlleitschuh.gradle.ktlint.reporter - -import com.pinterest.ktlint.core.ReporterProvider -import java.io.IOException -import java.io.ObjectInputStream -import java.io.ObjectOutputStream -import java.io.Serializable -import kotlin.reflect.jvm.jvmName - -/** - * Special wrapper around [ReporterProvider] allowing to serialize/deserialize it into file. - * - * Should be removed once KtLint will add interface implementation into [ReporterProvider]. - */ -class SerializableReporterProvider( - reporterProvider: ReporterProvider -) : Serializable { - @Transient - var reporterProvider: ReporterProvider = reporterProvider - private set - - @Throws(IOException::class) - private fun writeObject(out: ObjectOutputStream) { - out.writeUTF(reporterProvider::class.jvmName) - } - - @Throws(IOException::class, ClassNotFoundException::class) - private fun readObject(oin: ObjectInputStream) { - val reporterProviderClassName = oin.readUTF() - val classLoader = this.javaClass.classLoader - val reporterProviderClass = classLoader.loadClass(reporterProviderClassName) - reporterProvider = reporterProviderClass.newInstance() as ReporterProvider - } - - companion object { - private const val serialVersionUID: Long = 2012021L - } -} diff --git a/plugin/src/adapter34/kotlin/org/jlleitschuh/gradle/ktlint/reporter/SerializableReportersProviderLoader.kt b/plugin/src/adapter34/kotlin/org/jlleitschuh/gradle/ktlint/reporter/SerializableReportersProviderLoader.kt deleted file mode 100644 index 63eb64d8..00000000 --- a/plugin/src/adapter34/kotlin/org/jlleitschuh/gradle/ktlint/reporter/SerializableReportersProviderLoader.kt +++ /dev/null @@ -1,77 +0,0 @@ -package org.jlleitschuh.gradle.ktlint.reporter - -import com.pinterest.ktlint.core.Reporter -import com.pinterest.ktlint.core.ReporterProvider -import java.io.File -import java.io.ObjectInputStream -import java.util.ServiceLoader - -class SerializableReportersProviderLoader : - ReportersLoaderAdapter { - override fun loadAllReporterProviders(): List> = ServiceLoader - .load(ReporterProvider::class.java) - .toList().map { - ReporterProviderWrapper(it.id, SerializableReporterProvider(it)) - } - - override fun loadReporterProviders(serializedReporterProviders: File): List { - return ObjectInputStream( - serializedReporterProviders.inputStream().buffered() - ).use { - @Suppress("UNCHECKED_CAST") - it.readObject() as List - }.map { Ktlint34ReporterProvider(it.reporterProvider) } - } - - override fun loadAllGenericReporterProviders(): List = ServiceLoader - .load(ReporterProvider::class.java) - .toList().map { - Ktlint34ReporterProvider(it) - } - - override fun filterEnabledBuiltInProviders( - enabledReporters: Set, - allProviders: List> - ): List> { - val enabledProviders = allProviders - .filter { reporterProvider -> - enabledReporters.any { - reporterProvider.id == it.reporterName - } - } - return enabledReporters - .map { reporterType -> - val provider = enabledProviders.find { reporterType.reporterName == it.id } - ?: throw RuntimeException( - "KtLint plugin failed to load reporter ${reporterType.reporterName}." - ) - - val options = if (reporterType == ReporterType.PLAIN_GROUP_BY_FILE) { - reporterType.options.associateWith { "true" } - } else { - emptyMap() - } - - LoadedReporter(provider.id, reporterType.fileExtension, options) to provider.reporterProvider - } - } - - override fun filterCustomProviders( - customReporters: Set, - allProviders: List - ): List> { - val customProviders = allProviders - .filter { reporterProvider -> - customReporters.any { reporterProvider.reporterProvider.id == it.reporterId } - } - - return customReporters - .map { customReporter -> - val provider = customProviders.find { customReporter.reporterId == it.reporterProvider.id } - ?: throw RuntimeException( - "KtLint plugin failed to load ${customReporter.reporterId} custom reporter." - ) - LoadedReporter(customReporter.reporterId, customReporter.fileExtension, emptyMap()) to provider - } - } -} diff --git a/plugin/src/adapter34Test/kotlin/org/jlleitschuh/gradle/ktlint/reporter/SerializableReporterProviderTest.kt b/plugin/src/adapter34Test/kotlin/org/jlleitschuh/gradle/ktlint/reporter/SerializableReporterProviderTest.kt deleted file mode 100644 index 3dd679ee..00000000 --- a/plugin/src/adapter34Test/kotlin/org/jlleitschuh/gradle/ktlint/reporter/SerializableReporterProviderTest.kt +++ /dev/null @@ -1,45 +0,0 @@ -package org.jlleitschuh.gradle.ktlint.reporter - -import com.pinterest.ktlint.core.Reporter -import com.pinterest.ktlint.core.ReporterProvider -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.io.TempDir -import java.io.File -import java.io.ObjectInputStream -import java.io.ObjectOutputStream -import java.io.PrintStream - -internal class SerializableReporterProviderTest { - @TempDir - lateinit var temporaryFolder: File - - @Test - internal fun `Should correctly serialize and deserialize ReporterProvider`() { - val reporterProvider: ReporterProvider = TestReporterProvider() - val wrappedReporterProvider = SerializableReporterProvider(reporterProvider) - val serializeIntoFile = temporaryFolder.resolve("reporters.test") - - ObjectOutputStream(serializeIntoFile.outputStream()).use { - it.writeObject(wrappedReporterProvider) - } - - ObjectInputStream(serializeIntoFile.inputStream()).use { - val restoredWrappedReporterProvider = it.readObject() as SerializableReporterProvider - assertThat(restoredWrappedReporterProvider.reporterProvider).isInstanceOf(TestReporterProvider::class.java) - assertThat(restoredWrappedReporterProvider.reporterProvider.id) - .isEqualTo(reporterProvider.id) - } - } - - private class TestReporterProvider : ReporterProvider { - override val id: String = "test-reporter-provider" - - override fun get( - out: PrintStream, - opt: Map - ): Reporter { - TODO("Not yet implemented") - } - } -} diff --git a/plugin/src/adapter41/kotlin/org/jlleitschuh/gradle/ktlint/reporter/Ktlint41Reporter.kt b/plugin/src/adapter41/kotlin/org/jlleitschuh/gradle/ktlint/reporter/Ktlint41Reporter.kt deleted file mode 100644 index ad73b06f..00000000 --- a/plugin/src/adapter41/kotlin/org/jlleitschuh/gradle/ktlint/reporter/Ktlint41Reporter.kt +++ /dev/null @@ -1,30 +0,0 @@ -package org.jlleitschuh.gradle.ktlint.reporter - -import com.pinterest.ktlint.core.Reporter -import org.jlleitschuh.gradle.ktlint.worker.SerializableLintError -import org.jlleitschuh.gradle.ktlint.worker.toCore - -/** - * implementation of GenericReporter for the Reporter ktlint class - */ -class Ktlint41Reporter(val reporter: Reporter) : GenericReporter { - override fun beforeAll() { - reporter.beforeAll() - } - - override fun before(file: String) { - reporter.before(file) - } - - override fun onLintError(file: String, err: SerializableLintError, corrected: Boolean) { - reporter.onLintError(file, err.toCore(), corrected) - } - - override fun after(file: String) { - reporter.after(file) - } - - override fun afterAll() { - reporter.afterAll() - } -} diff --git a/plugin/src/adapter41/kotlin/org/jlleitschuh/gradle/ktlint/reporter/Ktlint41ReporterProvider.kt b/plugin/src/adapter41/kotlin/org/jlleitschuh/gradle/ktlint/reporter/Ktlint41ReporterProvider.kt deleted file mode 100644 index 0f7331db..00000000 --- a/plugin/src/adapter41/kotlin/org/jlleitschuh/gradle/ktlint/reporter/Ktlint41ReporterProvider.kt +++ /dev/null @@ -1,13 +0,0 @@ -package org.jlleitschuh.gradle.ktlint.reporter - -import com.pinterest.ktlint.core.ReporterProvider -import java.io.PrintStream - -class Ktlint41ReporterProvider(val reporterProvider: ReporterProvider) : GenericReporterProvider { - override fun get(outputStream: PrintStream, opt: Map): Ktlint41Reporter { - return Ktlint41Reporter(reporterProvider.get(outputStream, opt)) - } - - override val id: String - get() = reporterProvider.id -} diff --git a/plugin/src/adapter45/kotlin/org/jlleitschuh/gradle/ktlint/worker/BaselineLoader45.kt b/plugin/src/adapter45/kotlin/org/jlleitschuh/gradle/ktlint/worker/BaselineLoader45.kt deleted file mode 100644 index 8d82a82d..00000000 --- a/plugin/src/adapter45/kotlin/org/jlleitschuh/gradle/ktlint/worker/BaselineLoader45.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.jlleitschuh.gradle.ktlint.worker - -import com.pinterest.ktlint.core.internal.loadBaseline - -class BaselineLoader45 : BaselineLoader { - override fun loadBaselineRules(path: String): Map> { - return loadBaseline(path).baselineRules?.mapValues { it.value.map { it.toSerializable() } } ?: emptyMap() - } -} diff --git a/plugin/src/adapter45/kotlin/org/jlleitschuh/gradle/ktlint/worker/KtLintInvocation45.kt b/plugin/src/adapter45/kotlin/org/jlleitschuh/gradle/ktlint/worker/KtLintInvocation45.kt deleted file mode 100644 index c42e1e18..00000000 --- a/plugin/src/adapter45/kotlin/org/jlleitschuh/gradle/ktlint/worker/KtLintInvocation45.kt +++ /dev/null @@ -1,80 +0,0 @@ -package org.jlleitschuh.gradle.ktlint.worker - -import com.pinterest.ktlint.core.KtLint -import com.pinterest.ktlint.core.LintError -import com.pinterest.ktlint.core.RuleSet -import com.pinterest.ktlint.core.RuleSetProvider -import java.io.File -import java.util.ServiceLoader - -class KtLintInvocation45( - private val editorConfigPath: String?, - private val ruleSets: Set, - private val userData: Map, - private val debug: Boolean -) : KtLintInvocation { - companion object Factory : KtLintInvocationFactory { - fun initialize( - editorConfigPath: String?, - enableExperimental: Boolean, - disabledRules: Set, - userData: Map, - debug: Boolean - ): KtLintInvocation = KtLintInvocation45( - editorConfigPath = editorConfigPath, - ruleSets = loadRuleSetsFromClasspathWithRuleSetProvider() - .filterRules(enableExperimental, disabledRules), - userData = userData, - debug = debug - ) - } - - private fun buildParams(file: File, cb: (LintError, Boolean) -> Unit): KtLint.Params { - val script = !file.name.endsWith(".kt", ignoreCase = true) - return KtLint.Params( - fileName = file.absolutePath, - text = file.readText(), - ruleSets = ruleSets, - userData = userData, - debug = debug, - editorConfigPath = editorConfigPath, - script = script, - cb = cb - ) - } - - override fun invokeLint(file: File): LintErrorResult { - val errors = mutableListOf>() - KtLint.lint( - buildParams(file) { le, boolean -> - errors.add(le.toSerializable() to boolean) - } - ) - return LintErrorResult(file, errors) - } - - override fun invokeFormat(file: File): Pair { - val errors = mutableListOf>() - val newCode = KtLint.format( - buildParams(file) { le, boolean -> - errors.add(le.toSerializable() to boolean) - } - ) - return newCode to LintErrorResult(file, errors) - } - - override fun trimMemory() { - KtLint.trimMemory() - } -} - -private fun loadRuleSetsFromClasspathWithRuleSetProvider(): Map { - return ServiceLoader - .load(RuleSetProvider::class.java) - .associateBy { - val key = it.get().id - // Adapted from KtLint CLI module - if (key == "standard") "\u0000$key" else key - } - .mapValues { it.value.get() } -} diff --git a/plugin/src/adapter46/kotlin/org/jlleitschuh/gradle/ktlint/worker/BaselineLoader46.kt b/plugin/src/adapter46/kotlin/org/jlleitschuh/gradle/ktlint/worker/BaselineLoader46.kt deleted file mode 100644 index 0ea676e5..00000000 --- a/plugin/src/adapter46/kotlin/org/jlleitschuh/gradle/ktlint/worker/BaselineLoader46.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.jlleitschuh.gradle.ktlint.worker - -import com.pinterest.ktlint.core.internal.loadBaseline - -class BaselineLoader46 : BaselineLoader { - override fun loadBaselineRules(path: String): Map> { - return loadBaseline(path).baselineRules?.mapValues { it.value.map { it.toSerializable() } } ?: emptyMap() - } -} diff --git a/plugin/src/adapter46/kotlin/org/jlleitschuh/gradle/ktlint/worker/KtLintInvocation46.kt b/plugin/src/adapter46/kotlin/org/jlleitschuh/gradle/ktlint/worker/KtLintInvocation46.kt deleted file mode 100644 index 19ff2ff8..00000000 --- a/plugin/src/adapter46/kotlin/org/jlleitschuh/gradle/ktlint/worker/KtLintInvocation46.kt +++ /dev/null @@ -1,103 +0,0 @@ -package org.jlleitschuh.gradle.ktlint.worker - -import com.pinterest.ktlint.core.KtLint -import com.pinterest.ktlint.core.LintError -import com.pinterest.ktlint.core.RuleSetProvider -import com.pinterest.ktlint.core.api.DefaultEditorConfigProperties -import com.pinterest.ktlint.core.api.EditorConfigOverride -import java.io.File -import java.util.ServiceLoader - -class KtLintInvocation46( - private val editorConfigPath: String?, - private val ruleSets: Set, - private val userData: Map, - private val debug: Boolean -) : KtLintInvocation { - companion object Factory : KtLintInvocationFactory { - fun initialize( - editorConfigPath: String?, - enableExperimental: Boolean, - disabledRules: Set, - userData: Map, - debug: Boolean - ): KtLintInvocation = KtLintInvocation46( - editorConfigPath = editorConfigPath, - ruleSets = loadRuleSetsFromClasspathWithRuleSetProvider() - .filterRules(enableExperimental, disabledRules), - userData = userData, - debug = debug - ) - } - - private fun buildParams( - file: File, - cb: (LintError, Boolean) -> Unit - ): KtLint.ExperimentalParams { - val script = !file.name.endsWith(".kt", ignoreCase = true) - return KtLint.ExperimentalParams( - fileName = file.absolutePath, - text = file.readText(), - ruleSets = ruleSets, - cb = cb, - script = script, - editorConfigPath = editorConfigPath, - debug = debug, - editorConfigOverride = userDataToEditorConfigOverride(userData) - ) - } - - override fun invokeLint(file: File): LintErrorResult { - val errors = mutableListOf>() - KtLint.lint( - buildParams(file) { le, boolean -> - errors.add(le.toSerializable() to boolean) - } - ) - return LintErrorResult(file, errors) - } - - override fun invokeFormat(file: File): Pair { - val errors = mutableListOf>() - val newCode = KtLint.format( - buildParams(file) { le, boolean -> - errors.add(le.toSerializable() to boolean) - } - ) - return newCode to LintErrorResult(file, errors) - } - - override fun trimMemory() { - KtLint.trimMemory() - } -} - -internal fun LintError.toSerializable(): SerializableLintError { - return SerializableLintError(line, col, ruleId, detail, canBeAutoCorrected) -} - -private fun userDataToEditorConfigOverride(userData: Map): EditorConfigOverride { - val codeStyle = if (userData["android"]?.toBoolean() == true) { - DefaultEditorConfigProperties.CodeStyleValue.android - } else { - DefaultEditorConfigProperties.CodeStyleValue.official - } - if (!userData["disabled_rules"].isNullOrBlank()) { - return EditorConfigOverride.from( - DefaultEditorConfigProperties.codeStyleSetProperty to codeStyle, - DefaultEditorConfigProperties.disabledRulesProperty to userData["disabled_rules"] - ) - } - return EditorConfigOverride.from(DefaultEditorConfigProperties.codeStyleSetProperty to codeStyle) -} - -private fun loadRuleSetsFromClasspathWithRuleSetProvider(): Map { - return ServiceLoader - .load(RuleSetProvider::class.java) - .associateBy { - val key = it.get().id - // Adapted from KtLint CLI module - if (key == "standard") "\u0000$key" else key - } - .mapValues { it.value.get() } -} diff --git a/plugin/src/adapter34/kotlin/org/jlleitschuh/gradle/ktlint/reporter/Ktlint34Reporter.kt b/plugin/src/adapter47/kotlin/org/jlleitschuh/gradle/ktlint/reporter/LegacyKtlintReporter.kt similarity index 89% rename from plugin/src/adapter34/kotlin/org/jlleitschuh/gradle/ktlint/reporter/Ktlint34Reporter.kt rename to plugin/src/adapter47/kotlin/org/jlleitschuh/gradle/ktlint/reporter/LegacyKtlintReporter.kt index 783e45a9..cce983b2 100644 --- a/plugin/src/adapter34/kotlin/org/jlleitschuh/gradle/ktlint/reporter/Ktlint34Reporter.kt +++ b/plugin/src/adapter47/kotlin/org/jlleitschuh/gradle/ktlint/reporter/LegacyKtlintReporter.kt @@ -7,7 +7,7 @@ import org.jlleitschuh.gradle.ktlint.worker.toCore /** * implementation of GenericReporter for the Reporter ktlint class */ -class Ktlint34Reporter(val reporter: Reporter) : GenericReporter { +class LegacyKtlintReporter(val reporter: Reporter) : GenericReporter { override fun beforeAll() { reporter.beforeAll() } diff --git a/plugin/src/adapter47/kotlin/org/jlleitschuh/gradle/ktlint/reporter/LegacyKtlintReporterProvider.kt b/plugin/src/adapter47/kotlin/org/jlleitschuh/gradle/ktlint/reporter/LegacyKtlintReporterProvider.kt new file mode 100644 index 00000000..56fad011 --- /dev/null +++ b/plugin/src/adapter47/kotlin/org/jlleitschuh/gradle/ktlint/reporter/LegacyKtlintReporterProvider.kt @@ -0,0 +1,16 @@ +package org.jlleitschuh.gradle.ktlint.reporter + +import com.pinterest.ktlint.core.Reporter +import com.pinterest.ktlint.core.ReporterProvider +import java.io.PrintStream + +class LegacyKtlintReporterProvider( + val reporterProvider: ReporterProvider +) : GenericReporterProvider { + override fun get(outputStream: PrintStream, opt: Map): LegacyKtlintReporter { + return LegacyKtlintReporter(reporterProvider.get(outputStream, opt)) + } + + override val id: String + get() = reporterProvider.id +} diff --git a/plugin/src/adapter41/kotlin/org/jlleitschuh/gradle/ktlint/reporter/ReportersProviderLoader.kt b/plugin/src/adapter47/kotlin/org/jlleitschuh/gradle/ktlint/reporter/ReportersProviderLoader.kt similarity index 78% rename from plugin/src/adapter41/kotlin/org/jlleitschuh/gradle/ktlint/reporter/ReportersProviderLoader.kt rename to plugin/src/adapter47/kotlin/org/jlleitschuh/gradle/ktlint/reporter/ReportersProviderLoader.kt index 1a0013e2..616da1af 100644 --- a/plugin/src/adapter41/kotlin/org/jlleitschuh/gradle/ktlint/reporter/ReportersProviderLoader.kt +++ b/plugin/src/adapter47/kotlin/org/jlleitschuh/gradle/ktlint/reporter/ReportersProviderLoader.kt @@ -7,32 +7,32 @@ import java.io.ObjectInputStream import java.util.ServiceLoader class ReportersProviderLoader : - ReportersLoaderAdapter { - override fun loadAllReporterProviders(): List> = ServiceLoader + ReportersLoaderAdapter, LegacyKtlintReporter, LegacyKtlintReporterProvider> { + override fun loadAllReporterProviders(): List>> = ServiceLoader .load(ReporterProvider::class.java) .toList().map { ReporterProviderWrapper(it.id, it) } - override fun loadAllGenericReporterProviders(): List = ServiceLoader + override fun loadAllGenericReporterProviders(): List = ServiceLoader .load(ReporterProvider::class.java) .toList().map { - Ktlint41ReporterProvider(it) + LegacyKtlintReporterProvider(it) } - override fun loadReporterProviders(serializedReporterProviders: File): List { + override fun loadReporterProviders(serializedReporterProviders: File): List { return ObjectInputStream( serializedReporterProviders.inputStream().buffered() ).use { @Suppress("UNCHECKED_CAST") - it.readObject() as List - }.map { Ktlint41ReporterProvider(it) } + it.readObject() as List> + }.map { LegacyKtlintReporterProvider(it) } } override fun filterEnabledBuiltInProviders( enabledReporters: Set, - allProviders: List> - ): List> { + allProviders: List>> + ): List>> { val enabledProviders = allProviders .filter { reporterProvider -> enabledReporters.any { @@ -58,8 +58,8 @@ class ReportersProviderLoader : override fun filterCustomProviders( customReporters: Set, - allProviders: List - ): List> { + allProviders: List> + ): List>> { val customProviders = allProviders .filter { reporterProvider -> customReporters.any { reporterProvider.id == it.reporterId } diff --git a/plugin/src/adapter49/kotlin/org/jlleitschuh/gradle/ktlint/worker/KtLintInvocation49.kt b/plugin/src/adapter49/kotlin/org/jlleitschuh/gradle/ktlint/worker/KtLintInvocation49.kt index 28c5bd04..c84b9340 100644 --- a/plugin/src/adapter49/kotlin/org/jlleitschuh/gradle/ktlint/worker/KtLintInvocation49.kt +++ b/plugin/src/adapter49/kotlin/org/jlleitschuh/gradle/ktlint/worker/KtLintInvocation49.kt @@ -2,9 +2,11 @@ package org.jlleitschuh.gradle.ktlint.worker import com.pinterest.ktlint.cli.ruleset.core.api.RuleSetProviderV3 import com.pinterest.ktlint.rule.engine.api.Code +import com.pinterest.ktlint.rule.engine.api.EditorConfigOverride import com.pinterest.ktlint.rule.engine.api.KtLintRuleEngine import com.pinterest.ktlint.rule.engine.api.LintError import com.pinterest.ktlint.rule.engine.core.api.RuleProvider +import com.pinterest.ktlint.rule.engine.core.api.editorconfig.EditorConfigProperty import java.io.File import java.util.ServiceLoader @@ -12,10 +14,22 @@ class KtLintInvocation49( private val engine: KtLintRuleEngine ) : KtLintInvocation { companion object Factory : KtLintInvocationFactory { - fun initialize(): KtLintInvocation { - val engine = KtLintRuleEngine( - ruleProviders = loadRuleSetsFromClasspathWithRuleSetProviderV3() - ) + fun initialize(editorConfigOverrides: Map): KtLintInvocation { + val ruleProviders = loadRuleSetsFromClasspathWithRuleSetProviderV3() + val engine = if (editorConfigOverrides.isEmpty()) { + KtLintRuleEngine(ruleProviders = ruleProviders) + } else { + KtLintRuleEngine( + ruleProviders = ruleProviders, + editorConfigOverride = EditorConfigOverride.from( + *editorConfigOverrides + .mapKeys { ruleProviders.findEditorConfigProperty(it.key) } + .entries + .map { it.key to it.value } + .toTypedArray() + ) + ) + } return KtLintInvocation49(engine) } @@ -52,3 +66,21 @@ class KtLintInvocation49( internal fun LintError.toSerializable(): SerializableLintError { return SerializableLintError(line, col, ruleId.value, detail, canBeAutoCorrected) } + +private fun Set.findEditorConfigProperty(propertyName: String): EditorConfigProperty<*> { + val properties = + map { it.createNewRuleInstance() } + .flatMap { it.usesEditorConfigProperties } + .distinct() + return properties + .find { it.type.name == propertyName } + ?: throw RuntimeException( + properties + .map { it.type.name } + .sorted() + .joinToString( + prefix = "Property with name '$propertyName' is not found in any of given rules. Available properties:\n\t", + separator = "\n\t" + ) { "- $it" } + ) +} diff --git a/plugin/src/adapter50/kotlin/org/jlleitschuh/gradle/ktlint/worker/KtLintInvocation50.kt b/plugin/src/adapter50/kotlin/org/jlleitschuh/gradle/ktlint/worker/KtLintInvocation50.kt index eb505023..f98bf2e0 100644 --- a/plugin/src/adapter50/kotlin/org/jlleitschuh/gradle/ktlint/worker/KtLintInvocation50.kt +++ b/plugin/src/adapter50/kotlin/org/jlleitschuh/gradle/ktlint/worker/KtLintInvocation50.kt @@ -2,9 +2,11 @@ package org.jlleitschuh.gradle.ktlint.worker import com.pinterest.ktlint.cli.ruleset.core.api.RuleSetProviderV3 import com.pinterest.ktlint.rule.engine.api.Code +import com.pinterest.ktlint.rule.engine.api.EditorConfigOverride import com.pinterest.ktlint.rule.engine.api.KtLintRuleEngine import com.pinterest.ktlint.rule.engine.api.LintError import com.pinterest.ktlint.rule.engine.core.api.RuleProvider +import com.pinterest.ktlint.rule.engine.core.api.editorconfig.EditorConfigProperty import java.io.File import java.util.ServiceLoader @@ -12,10 +14,22 @@ class KtLintInvocation50( private val engine: KtLintRuleEngine ) : KtLintInvocation { companion object Factory : KtLintInvocationFactory { - fun initialize(): KtLintInvocation { - val engine = KtLintRuleEngine( - ruleProviders = loadRuleSetsFromClasspathWithRuleSetProviderV3() - ) + fun initialize(editorConfigOverrides: Map): KtLintInvocation { + val ruleProviders = loadRuleSetsFromClasspathWithRuleSetProviderV3() + val engine = if (editorConfigOverrides.isEmpty()) { + KtLintRuleEngine(ruleProviders = ruleProviders) + } else { + KtLintRuleEngine( + ruleProviders = ruleProviders, + editorConfigOverride = EditorConfigOverride.from( + *editorConfigOverrides + .mapKeys { ruleProviders.findEditorConfigProperty(it.key) } + .entries + .map { it.key to it.value } + .toTypedArray() + ) + ) + } return KtLintInvocation50(engine) } @@ -52,3 +66,21 @@ class KtLintInvocation50( internal fun LintError.toSerializable(): SerializableLintError { return SerializableLintError(line, col, ruleId.value, detail, canBeAutoCorrected) } + +private fun Set.findEditorConfigProperty(propertyName: String): EditorConfigProperty<*> { + val properties = + map { it.createNewRuleInstance() } + .flatMap { it.usesEditorConfigProperties } + .distinct() + return properties + .find { it.type.name == propertyName } + ?: throw RuntimeException( + properties + .map { it.type.name } + .sorted() + .joinToString( + prefix = "Property with name '$propertyName' is not found in any of given rules. Available properties:\n\t", + separator = "\n\t" + ) { "- $it" } + ) +} diff --git a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/Configurations.kt b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/Configurations.kt index c7ea296a..d3a368bd 100644 --- a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/Configurations.kt +++ b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/Configurations.kt @@ -3,12 +3,8 @@ package org.jlleitschuh.gradle.ktlint import net.swiftzer.semver.SemVer import org.gradle.api.Project import org.gradle.api.artifacts.Configuration -import org.gradle.api.artifacts.component.ModuleComponentIdentifier -import org.gradle.api.artifacts.component.ModuleComponentSelector -import org.gradle.api.artifacts.component.ProjectComponentIdentifier -import org.gradle.api.artifacts.result.ResolvedDependencyResult +import org.gradle.api.artifacts.Dependency import org.gradle.api.attributes.Bundling -import org.gradle.util.GradleVersion internal const val KTLINT_CONFIGURATION_NAME = "ktlint" internal const val KTLINT_CONFIGURATION_DESCRIPTION = "Main ktlint-gradle configuration" @@ -33,25 +29,35 @@ internal fun createKtlintConfiguration(target: Project, extension: KtlintExtensi // Starting from KtLint 0.41.0 version published artifact has two variants: "external" and "shadowed" attributes { - it.attribute(Bundling.BUNDLING_ATTRIBUTE, target.objects.named(Bundling::class.java, Bundling.EXTERNAL)) + attribute(Bundling.BUNDLING_ATTRIBUTE, target.objects.named(Bundling::class.java, Bundling.EXTERNAL)) } - val dependencyProvider = target.provider { - val ktlintVersion = extension.version.get() - target.logger.info("Add dependency: ktlint version $ktlintVersion") - target.dependencies.create("${resolveGroup(ktlintVersion)}:ktlint:$ktlintVersion") - } - dependencies.addLater(dependencyProvider) + // Workaround for gradle 6 https://github.com/gradle/gradle/issues/13255 + val oldProp = target.objects.listProperty(Dependency::class.java) + dependencies.addAllLater( + oldProp.value( + extension.version.map { + if (SemVer.parse(it) < SemVer(1, 0, 0)) { + target.logger.info("Add dependency: ktlint version $it") + listOf(target.dependencies.create("com.pinterest:ktlint:$it")) + } else { + target.logger.info("Add dependencies: ktlint version $it") + listOf( + target.dependencies.create("com.pinterest.ktlint:ktlint-cli:$it"), + // these transitive deps were introduced in ktlint 1.0, but for some reason not picked up automatically + target.dependencies.create("io.github.oshai:kotlin-logging:5.1.0"), + target.dependencies.create("io.github.detekt.sarif4k:sarif4k:0.5.0") + ) + } + } + ) + ) } -private fun resolveGroup(ktlintVersion: String) = when { - SemVer.parse(ktlintVersion) < SemVer(0, 32, 0) -> "com.github.shyiko" - else -> "com.pinterest" -} - internal fun createKtlintRulesetConfiguration( target: Project, - ktLintConfiguration: Configuration + ktLintConfiguration: Configuration, + extension: KtlintExtension ): Configuration = target .configurations.maybeCreate(KTLINT_RULESET_CONFIGURATION_NAME).apply { description = KTLINT_RULESET_CONFIGURATION_DESCRIPTION @@ -61,6 +67,12 @@ internal fun createKtlintRulesetConfiguration( isVisible = false ensureConsistencyWith(target, ktLintConfiguration) + dependencies.addLater( + target.provider { + val ktlintVersion = extension.version.get() + target.dependencies.create("com.pinterest.ktlint:ktlint-ruleset-standard:$ktlintVersion") + } + ) } internal fun createKtLintReporterConfiguration( @@ -80,10 +92,21 @@ internal fun createKtLintReporterConfiguration( ensureConsistencyWith(target, ktLintConfiguration) withDependencies { + // this transitive dep was introduced in ktlint 1.0, but for some reason, it is not picked up automatically + dependencies.addAllLater( + target.provider { + if (SemVer.parse(extension.version.get()) >= SemVer(1, 0, 0)) { + listOf(target.dependencies.create("io.github.detekt.sarif4k:sarif4k:0.5.0")) + } else { + listOf() + } + } + ) + extension .reporterExtension .customReporters - .all { + .forEach { dependencies.addLater( target.provider { val reporterDependency = it.dependency @@ -95,6 +118,21 @@ internal fun createKtLintReporterConfiguration( ) } } + + // Workaround for gradle 6 https://github.com/gradle/gradle/issues/13255 + val oldProp = target.objects.listProperty(Dependency::class.java) + dependencies.addAllLater( + oldProp.value( + extension.version.map { version -> + if (SemVer.parse(version) >= SemVer(1, 0, 0)) { + // this transitive dep was introduced in ktlint 1.0, but for some reason, it is not picked up automatically + listOf(target.dependencies.create("io.github.oshai:kotlin-logging:5.1.0")) + } else { + listOf() + } + } + ) + ) } internal fun createKtLintBaselineReporterConfiguration( @@ -113,76 +151,34 @@ internal fun createKtLintBaselineReporterConfiguration( ensureConsistencyWith(target, ktLintConfiguration) - withDependencies { - dependencies.addLater( - target.provider { + // withDependencies { + // Workaround for gradle 6 https://github.com/gradle/gradle/issues/13255 + val oldProp = target.objects.listProperty(Dependency::class.java) + dependencies.addAllLater( + oldProp.value( + extension.version.map { version -> val ktlintVersion = extension.version.get() - // Baseline reporter is only available starting 0.41.0 release - if (SemVer.parse(ktlintVersion) >= SemVer(0, 41, 0)) { - target.dependencies.create( - "com.pinterest.ktlint:ktlint-reporter-baseline:${extension.version.get()}" + val ktlintSemver = SemVer.parse(ktlintVersion) + if (ktlintSemver >= SemVer(1, 0, 0)) { + // Baseline reporter maven coordinates changed in 1.0 + listOf( + target.dependencies.create("com.pinterest.ktlint:ktlint-cli-reporter-baseline:$version"), + // this transitive dep was introduced in ktlint 1.0, but for some reason, it is not picked up automatically + target.dependencies.create("io.github.oshai:kotlin-logging:5.1.0") ) } else { - // Adding fake plain reporter as addLater() does not accept `null` value - // Generate baseline tasks anyway will not run on KtLint versions < 0.41.0 - target.dependencies.create( - "com.pinterest.ktlint:ktlint-reporter-plain:${extension.version.get()}" - ) + // Baseline reporter is only available starting 0.41.0 release + listOf(target.dependencies.create("com.pinterest.ktlint:ktlint-reporter-baseline:$version")) } } ) - } + ) + // } } private fun Configuration.ensureConsistencyWith( target: Project, otherConfiguration: Configuration ) { - if (GradleVersion.version(target.gradle.gradleVersion) >= GradleVersion.version("6.8")) { - shouldResolveConsistentlyWith(otherConfiguration) - } else { - // Inspired by - // https://android.googlesource.com/platform/tools/base/+/refs/heads/mirror-goog-studio-master-dev/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dependency/ConstraintHandler.kt - incoming.beforeResolve { - val configName = it.name - otherConfiguration.incoming.resolutionResult.allDependencies { dependency -> - if (dependency is ResolvedDependencyResult) { - val id = dependency.selected.id - if (id is ModuleComponentIdentifier) { - // using a repository with a flatDir to stock local AARs will result in an - // external module dependency with no version. - if (!id.version.isNullOrEmpty()) { - if (id.module != "listenablefuture" || - id.group != "com.google.guava" || - id.version != "1.0" - ) { - target.dependencies.constraints.add( - configName, - "${id.group}:${id.module}:${id.version}" - ) { constraint -> - constraint.because("${otherConfiguration.name} uses version ${id.version}") - constraint.version { versionConstraint -> - versionConstraint.strictly(id.version) - } - } - } - } - } else if (id is ProjectComponentIdentifier && - id.build.isCurrentBuild && - dependency.requested is ModuleComponentSelector - ) { - // Requested external library has been replaced with the project dependency, so - // add the project dependency to the target configuration, so it can be chosen - // instead of the external library as well. - // We should avoid doing this for composite builds, so we check if the selected - // project is from the current build. - target.dependencies.add( - configName, - target.dependencies.project(mapOf("path" to id.projectPath)) - ) - } - } - } - } - } + shouldResolveConsistentlyWith(otherConfiguration) } diff --git a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/GitHook.kt b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/GitHook.kt index 607874ae..af168342 100644 --- a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/GitHook.kt +++ b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/GitHook.kt @@ -114,12 +114,12 @@ private fun KtlintPlugin.PluginHolder.addInstallGitHookFormatTask() { INSTALL_GIT_HOOK_FORMAT_TASK, KtlintInstallGitHookTask::class.java ) { - it.description = "Adds git hook to run ktlintFormat on changed files" - it.group = HELP_GROUP - it.taskName.set(FORMAT_PARENT_TASK_NAME) + description = "Adds git hook to run ktlintFormat on changed files" + group = HELP_GROUP + taskName.set(FORMAT_PARENT_TASK_NAME) // Format git hook will automatically add back updated files to git commit - it.shouldUpdateCommit.set(true) - it.hookName.set("pre-commit") + shouldUpdateCommit.set(true) + hookName.set("pre-commit") } } @@ -128,11 +128,11 @@ private fun KtlintPlugin.PluginHolder.addInstallGitHookCheckTask() { INSTALL_GIT_HOOK_CHECK_TASK, KtlintInstallGitHookTask::class.java ) { - it.description = "Adds git hook to run ktlintCheck on changed files" - it.group = HELP_GROUP - it.taskName.set(CHECK_PARENT_TASK_NAME) - it.shouldUpdateCommit.set(false) - it.hookName.set("pre-commit") + description = "Adds git hook to run ktlintCheck on changed files" + group = HELP_GROUP + taskName.set(CHECK_PARENT_TASK_NAME) + shouldUpdateCommit.set(false) + hookName.set("pre-commit") } } diff --git a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtLintCompatibility.kt b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtLintCompatibility.kt index 609221f4..f2251dee 100644 --- a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtLintCompatibility.kt +++ b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtLintCompatibility.kt @@ -5,15 +5,11 @@ import org.gradle.api.GradleException import org.jlleitschuh.gradle.ktlint.reporter.ReportersLoaderAdapter import org.jlleitschuh.gradle.ktlint.reporter.ReportersProviderLoader import org.jlleitschuh.gradle.ktlint.reporter.ReportersProviderV2Loader -import org.jlleitschuh.gradle.ktlint.reporter.SerializableReportersProviderLoader import org.jlleitschuh.gradle.ktlint.worker.BaselineLoader -import org.jlleitschuh.gradle.ktlint.worker.BaselineLoader45 -import org.jlleitschuh.gradle.ktlint.worker.BaselineLoader46 import org.jlleitschuh.gradle.ktlint.worker.BaselineLoader47 import org.jlleitschuh.gradle.ktlint.worker.BaselineLoader48 import org.jlleitschuh.gradle.ktlint.worker.BaselineLoader49 -import org.jlleitschuh.gradle.ktlint.worker.KtLintInvocation45 -import org.jlleitschuh.gradle.ktlint.worker.KtLintInvocation46 +import org.jlleitschuh.gradle.ktlint.worker.KtLintInvocation100 import org.jlleitschuh.gradle.ktlint.worker.KtLintInvocation47 import org.jlleitschuh.gradle.ktlint.worker.KtLintInvocation48 import org.jlleitschuh.gradle.ktlint.worker.KtLintInvocation49 @@ -24,11 +20,7 @@ import java.io.Serializable internal fun selectInvocation(version: String): KtLintInvocationFactory { val semVer = SemVer.parse(version) return if (semVer.major == 0) { - if (semVer.minor < 46) { - KtLintInvocation45 - } else if (semVer.minor == 46) { - KtLintInvocation46 - } else if (semVer.minor == 47) { + if (semVer.minor == 47) { KtLintInvocation47 } else if (semVer.minor == 48) { KtLintInvocation48 @@ -38,18 +30,14 @@ internal fun selectInvocation(version: String): KtLintInvocationFactory { KtLintInvocation50 } } else { - KtLintInvocation50 + KtLintInvocation100 } } internal fun selectBaselineLoader(version: String): BaselineLoader { val semVer = SemVer.parse(version) return if (semVer.major == 0) { - if (semVer.minor < 46) { - BaselineLoader45() - } else if (semVer.minor == 46) { - BaselineLoader46() - } else if (semVer.minor == 47) { + if (semVer.minor == 47) { BaselineLoader47() } else if (semVer.minor == 48) { BaselineLoader48() @@ -70,9 +58,7 @@ internal fun selectBaselineLoader(version: String): BaselineLoader { internal fun selectReportersLoaderAdapter(version: String): ReportersLoaderAdapter<*, out Serializable, *, *> { val semVer = SemVer.parse(version) return if (semVer.major == 0) { - if (semVer.minor < 41) { - SerializableReportersProviderLoader() - } else if (semVer.minor < 49) { + if (semVer.minor < 49) { ReportersProviderLoader() } else { ReportersProviderV2Loader() diff --git a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtlintApplyToIdeaTask.kt b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtlintApplyToIdeaTask.kt deleted file mode 100644 index f5322429..00000000 --- a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtlintApplyToIdeaTask.kt +++ /dev/null @@ -1,76 +0,0 @@ -package org.jlleitschuh.gradle.ktlint - -import net.swiftzer.semver.SemVer -import org.gradle.api.DefaultTask -import org.gradle.api.file.ConfigurableFileCollection -import org.gradle.api.model.ObjectFactory -import org.gradle.api.provider.Property -import org.gradle.api.tasks.Classpath -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.TaskAction -import javax.inject.Inject - -@Suppress("UnstableApiUsage") -open class KtlintApplyToIdeaTask @Inject constructor( - objectFactory: ObjectFactory -) : DefaultTask() { - - @get:Classpath - val classpath: ConfigurableFileCollection = project.files() - - @get:Input - val android: Property = objectFactory.property() - - @get:Input - val globally: Property = objectFactory.property() - - @get:Input - val ktlintVersion: Property = objectFactory.property() - - @TaskAction - fun generate() { - // this option was removed and will cause errors in ktlint >= 0.47.0 - if (SemVer.parse(ktlintVersion.get()) < SemVer(0, 47, 0)) { - project.javaexec { - it.classpath = classpath - it.main = "com.pinterest.ktlint.Main" - - // Global flags - if (android.get()) { - it.args( - "--android" - ) - } - - // Subcommand - if (globally.get()) { - it.args(getApplyToIdeaCommand()) - } else { - it.args(getApplyToProjectCommand()) - } - - // Subcommand parameters - // -y here to auto-overwrite existing IDEA code style. - it.args("-y") - } - } else { - project.logger.warn( - "Skipping ${this.name}. The applyToIDEA functionality was removed from ktlint in 0.47.0. Use .editorconfig to synchronize formatting rules between IDEA and ktlint." - ) - } - } - - private fun getApplyToIdeaCommand() = - if (SemVer.parse(ktlintVersion.get()) >= SemVer(0, 35, 0)) { - "applyToIDEA" - } else { - "--apply-to-idea" - } - - private fun getApplyToProjectCommand() = - if (SemVer.parse(ktlintVersion.get()) >= SemVer(0, 35, 0)) { - "applyToIDEAProject" - } else { - "--apply-to-idea-project" - } -} diff --git a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtlintBasePlugin.kt b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtlintBasePlugin.kt index ce84ff20..86af4757 100644 --- a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtlintBasePlugin.kt +++ b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtlintBasePlugin.kt @@ -30,8 +30,8 @@ open class KtlintBasePlugin : Plugin { } val kotlinScriptAdditionalPathApplier: KotlinScriptAdditionalPathApplier = { additionalFileTree -> - val configureAction = Action { task -> - with(task as BaseKtLintCheckTask) { + val configureAction = Action { + with(this as BaseKtLintCheckTask) { source( additionalFileTree.also { it.include("*.kts") @@ -63,6 +63,6 @@ open class KtlintBasePlugin : Plugin { } companion object { - const val LOWEST_SUPPORTED_GRADLE_VERSION = "6.8" + const val LOWEST_SUPPORTED_GRADLE_VERSION = "7.4.2" } } diff --git a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtlintExtension.kt b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtlintExtension.kt index 36fe4d3e..afd86506 100644 --- a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtlintExtension.kt +++ b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtlintExtension.kt @@ -7,6 +7,7 @@ import org.gradle.api.file.ConfigurableFileTree import org.gradle.api.file.ProjectLayout import org.gradle.api.file.RegularFileProperty import org.gradle.api.model.ObjectFactory +import org.gradle.api.provider.MapProperty import org.gradle.api.provider.Property import org.gradle.api.provider.SetProperty import org.gradle.api.tasks.util.PatternFilterable @@ -35,7 +36,7 @@ internal constructor( /** * The version of KtLint to use. */ - val version: Property = objectFactory.property { set("0.47.1") } + val version: Property = objectFactory.property { set("1.0.1") } /** * Enable relative paths in reports @@ -103,10 +104,13 @@ internal constructor( } /** - * Provide additional `.editorconfig` file, that are not in the project or project parent folders. + * Provide additional `.editorconfig` properties, that are not in the project or project parent folders. */ - @Deprecated("not supported with ktlint 0.47+") - val additionalEditorconfigFile: RegularFileProperty = objectFactory.fileProperty() + val additionalEditorconfig: MapProperty = + objectFactory.mapProperty(String::class.java, String::class.java) + .apply { + convention(emptyMap()) + } /** * Disable particular rules, by default enabled in ktlint, using rule id. diff --git a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtlintIdeaPlugin.kt b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtlintIdeaPlugin.kt deleted file mode 100644 index 96e29006..00000000 --- a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtlintIdeaPlugin.kt +++ /dev/null @@ -1,44 +0,0 @@ -package org.jlleitschuh.gradle.ktlint - -import org.gradle.api.Plugin -import org.gradle.api.Project - -/** - * Adds tasks associated with configuring IntelliJ IDEA. - */ -open class KtlintIdeaPlugin : Plugin { - override fun apply(target: Project) { - val extension = target.plugins.apply(KtlintBasePlugin::class.java).extension - - if (target == target.rootProject) { - /* - * Only add these tasks if we are applying to the root project. - */ - addApplyToIdeaTasks(target, extension) - } - } - - private fun addApplyToIdeaTasks(rootProject: Project, extension: KtlintExtension) { - val ktLintConfig = createKtlintConfiguration(rootProject, extension) - - rootProject.registerTask(APPLY_TO_IDEA_TASK_NAME) { - group = HELP_GROUP - description = "Generates IDEA built-in formatter rules and apply them to the project." + - "It will overwrite existing ones." - classpath.setFrom(ktLintConfig) - android.set(extension.android) - globally.set(rootProject.provider { false }) - ktlintVersion.set(extension.version) - } - - rootProject.registerTask(APPLY_TO_IDEA_GLOBALLY_TASK_NAME) { - group = HELP_GROUP - description = "Generates IDEA built-in formatter rules and apply them globally " + - "(in IDEA user settings folder). It will overwrite existing ones." - classpath.setFrom(ktLintConfig) - android.set(extension.android) - globally.set(rootProject.provider { true }) - ktlintVersion.set(extension.version) - } - } -} diff --git a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtlintPlugin.kt b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtlintPlugin.kt index 2daeb194..f3b7c689 100644 --- a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtlintPlugin.kt +++ b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/KtlintPlugin.kt @@ -20,9 +20,6 @@ open class KtlintPlugin : Plugin { override fun apply(target: Project) { val holder = PluginHolder(target) - // Apply the idea plugin - target.plugins.apply(KtlintIdeaPlugin::class.java) - holder.addKotlinScriptTasks() holder.addKtLintTasksToKotlinPlugin() holder.addGenerateBaselineTask() @@ -42,7 +39,7 @@ open class KtlintPlugin : Plugin { private fun PluginHolder.applyKtlintMultiplatform(): (Plugin) -> Unit = { val multiplatformExtension = target.extensions.getByType(KotlinMultiplatformExtension::class.java) - multiplatformExtension.sourceSets.all { sourceSet -> + multiplatformExtension.sourceSets.forEach { sourceSet -> val checkTask = createCheckTask( this, sourceSet.name, @@ -73,7 +70,7 @@ open class KtlintPlugin : Plugin { addGenerateReportsTaskToProjectMetaFormatTask(generateReportsFormatTask) } - multiplatformExtension.targets.all { kotlinTarget -> + multiplatformExtension.targets.forEach { kotlinTarget -> if (kotlinTarget.platformType == KotlinPlatformType.androidJvm) { applyKtLintToAndroid() } @@ -81,16 +78,16 @@ open class KtlintPlugin : Plugin { } private fun PluginHolder.applyKtLint(): (Plugin) -> Unit = { - target.extensions.configure("kotlin") { extension -> - extension.sourceSets.all { sourceSet -> + target.extensions.configure(KotlinProjectExtension::class.java) { + sourceSets.forEach { sourceSet -> val kotlinSourceDirectories = sourceSet.kotlin.sourceDirectories val checkTask = createCheckTask( - this, + this@applyKtLint, sourceSet.name, kotlinSourceDirectories ) val generateReportsCheckTask = createGenerateReportsTask( - this, + this@applyKtLint, checkTask, GenerateReportsTask.LintType.CHECK, sourceSet.name @@ -100,12 +97,12 @@ open class KtlintPlugin : Plugin { setCheckTaskDependsOnGenerateReportsTask(generateReportsCheckTask) val formatTask = createFormatTask( - this, + this@applyKtLint, sourceSet.name, kotlinSourceDirectories ) val generateReportsFormatTask = createGenerateReportsTask( - this, + this@applyKtLint, formatTask, GenerateReportsTask.LintType.FORMAT, sourceSet.name @@ -165,7 +162,11 @@ open class KtlintPlugin : Plugin { } val ktlintConfiguration: Configuration = createKtlintConfiguration(target, extension) - val ktlintRulesetConfiguration: Configuration = createKtlintRulesetConfiguration(target, ktlintConfiguration) + val ktlintRulesetConfiguration: Configuration = createKtlintRulesetConfiguration( + target, + ktlintConfiguration, + extension + ) val ktlintReporterConfiguration: Configuration = createKtLintReporterConfiguration(target, extension, ktlintConfiguration) val ktlintBaselineReporterConfiguration: Configuration = createKtLintBaselineReporterConfiguration( target, diff --git a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/PluginUtil.kt b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/PluginUtil.kt index 6a7b19c8..406d5f5c 100644 --- a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/PluginUtil.kt +++ b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/PluginUtil.kt @@ -15,6 +15,7 @@ import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import org.gradle.api.provider.SetProperty import org.gradle.api.tasks.TaskProvider +import org.gradle.kotlin.dsl.register import org.gradle.language.base.plugins.LifecycleBasePlugin import java.io.File import java.nio.file.Files @@ -26,9 +27,9 @@ internal inline fun Project.registerTask( noinline configuration: T.() -> Unit ): TaskProvider { return tasks - .register(name, T::class.java, *constructorArguments) + .register(name, *constructorArguments) .apply { - configure { configuration(it) } + this.configure(configuration) } } @@ -86,8 +87,6 @@ internal const val FORMATTING_GROUP = "Formatting" internal const val HELP_GROUP = HelpTasksPlugin.HELP_GROUP internal const val CHECK_PARENT_TASK_NAME = "ktlintCheck" internal const val FORMAT_PARENT_TASK_NAME = "ktlintFormat" -internal const val APPLY_TO_IDEA_TASK_NAME = "ktlintApplyToIdea" -internal const val APPLY_TO_IDEA_GLOBALLY_TASK_NAME = "ktlintApplyToIdeaGlobally" internal const val INSTALL_GIT_HOOK_CHECK_TASK = "addKtlintCheckGitPreCommitHook" internal const val INSTALL_GIT_HOOK_FORMAT_TASK = "addKtlintFormatGitPreCommitHook" internal val KOTLIN_EXTENSIONS = listOf("kt", "kts") @@ -125,9 +124,9 @@ internal fun Logger.logKtLintDebugMessage( } internal fun checkMinimalSupportedKtLintVersion(ktLintVersion: String) { - if (SemVer.parse(ktLintVersion) < SemVer(0, 34, 0)) { + if (SemVer.parse(ktLintVersion) < SemVer(0, 47, 1)) { throw GradleException( - "KtLint versions less than 0.34.0 are not supported. " + + "KtLint versions less than 0.47.1 are not supported. " + "Detected KtLint version: $ktLintVersion." ) } diff --git a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/TaskCreation.kt b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/TaskCreation.kt index 0fed6554..1b9d9c92 100644 --- a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/TaskCreation.kt +++ b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/TaskCreation.kt @@ -5,6 +5,7 @@ import org.gradle.api.file.FileTree import org.gradle.api.tasks.TaskCollection import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.util.PatternSet +import org.gradle.kotlin.dsl.register import org.gradle.language.base.plugins.LifecycleBasePlugin import org.jlleitschuh.gradle.ktlint.tasks.BaseKtLintCheckTask import org.jlleitschuh.gradle.ktlint.tasks.GenerateBaselineTask @@ -16,13 +17,13 @@ import org.jlleitschuh.gradle.ktlint.tasks.LoadReportersTask internal fun KtlintPlugin.PluginHolder.addGenerateReportsTaskToProjectMetaCheckTask( generatesReportsTask: TaskProvider ) { - metaKtlintCheckTask.configure { it.dependsOn(generatesReportsTask) } + metaKtlintCheckTask.configure { dependsOn(generatesReportsTask) } } internal fun KtlintPlugin.PluginHolder.addGenerateReportsTaskToProjectMetaFormatTask( generateReportsTask: TaskProvider ) { - metaKtlintFormatTask.configure { it.dependsOn(generateReportsTask) } + metaKtlintFormatTask.configure { dependsOn(generateReportsTask) } } internal fun createFormatTask( @@ -103,26 +104,25 @@ internal fun KtlintPlugin.PluginHolder.setCheckTaskDependsOnGenerateReportsTask( generateReportsTask: TaskProvider ) { target.plugins.withType(LifecycleBasePlugin::class.java) { - target.tasks.named(LifecycleBasePlugin.CHECK_TASK_NAME).configure { task -> - task.dependsOn(generateReportsTask) + target.tasks.named(LifecycleBasePlugin.CHECK_TASK_NAME) { + dependsOn(generateReportsTask) } } } internal fun createLoadReportersTask( pluginHolder: KtlintPlugin.PluginHolder -): TaskProvider = pluginHolder.target.registerTask( - LoadReportersTask.TASK_NAME -) { - description = LoadReportersTask.DESCRIPTION - - ktLintClasspath.setFrom(pluginHolder.ktlintConfiguration) - reportersClasspath.setFrom(pluginHolder.ktlintReporterConfiguration) - debug.set(pluginHolder.extension.debug) - ktLintVersion.set(pluginHolder.extension.version) - enabledReporters.set(pluginHolder.extension.reporterExtension.reporters) - customReporters.set(pluginHolder.extension.reporterExtension.customReporters) -} +): TaskProvider = + pluginHolder.target.tasks.register(LoadReportersTask.TASK_NAME) { + description = LoadReportersTask.DESCRIPTION + + ktLintClasspath.setFrom(pluginHolder.ktlintConfiguration) + reportersClasspath.setFrom(pluginHolder.ktlintReporterConfiguration) + debug.set(pluginHolder.extension.debug) + ktLintVersion.set(pluginHolder.extension.version) + enabledReporters.set(pluginHolder.extension.reporterExtension.reporters) + customReporters.set(pluginHolder.extension.reporterExtension.customReporters) + } private fun BaseKtLintCheckTask.configureBaseCheckTask( pluginHolder: KtlintPlugin.PluginHolder, @@ -130,7 +130,7 @@ private fun BaseKtLintCheckTask.configureBaseCheckTask( ) { ktLintClasspath.setFrom(pluginHolder.ktlintConfiguration) ktLintVersion.set(pluginHolder.extension.version) - additionalEditorconfigFile.set(pluginHolder.extension.additionalEditorconfigFile) + additionalEditorconfig.set(pluginHolder.extension.additionalEditorconfig) debug.set(pluginHolder.extension.debug) ruleSetsClasspath.setFrom(pluginHolder.ktlintRulesetConfiguration) android.set(pluginHolder.extension.android) diff --git a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/android/AndroidPluginsApplier.kt b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/android/AndroidPluginsApplier.kt index a0085f5a..2c70fdd1 100644 --- a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/android/AndroidPluginsApplier.kt +++ b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/android/AndroidPluginsApplier.kt @@ -51,10 +51,10 @@ private typealias AndroidCommonExtension = private fun androidPluginConfigureAction( pluginHolder: KtlintPlugin.PluginHolder ): (Plugin) -> Unit = { - pluginHolder.target.extensions.configure(CommonExtension::class.java) { ext -> - val androidCommonExtension = ext as AndroidCommonExtension + pluginHolder.target.extensions.configure(CommonExtension::class.java) { + val androidCommonExtension = this as AndroidCommonExtension - androidCommonExtension.sourceSets.all { sourceSet -> + androidCommonExtension.sourceSets.all { // https://issuetracker.google.com/u/1/issues/170650362 val androidSourceSet = sourceSet.kotlin as DefaultAndroidSourceDirectorySet // Passing Callable, so returned FileCollection, will lazy evaluate it @@ -63,7 +63,7 @@ private fun androidPluginConfigureAction( // current AndroidSourceSet, that are not available on eager // evaluation. pluginHolder.createAndroidTasks( - sourceSet.name, + name, pluginHolder.target.files(Callable { androidSourceSet.srcDirs }) ) } diff --git a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/tasks/BaseKtLintCheckTask.kt b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/tasks/BaseKtLintCheckTask.kt index 7871cf78..8f2fecd4 100644 --- a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/tasks/BaseKtLintCheckTask.kt +++ b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/tasks/BaseKtLintCheckTask.kt @@ -1,9 +1,7 @@ package org.jlleitschuh.gradle.ktlint.tasks import groovy.lang.Closure -import net.swiftzer.semver.SemVer import org.gradle.api.DefaultTask -import org.gradle.api.GradleException import org.gradle.api.JavaVersion import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.FileCollection @@ -12,6 +10,7 @@ import org.gradle.api.file.FileType import org.gradle.api.file.ProjectLayout import org.gradle.api.file.RegularFileProperty import org.gradle.api.model.ObjectFactory +import org.gradle.api.provider.MapProperty import org.gradle.api.provider.Property import org.gradle.api.provider.SetProperty import org.gradle.api.specs.Spec @@ -56,6 +55,9 @@ abstract class BaseKtLintCheckTask @Inject constructor( @get:Internal internal abstract val additionalEditorconfigFile: RegularFileProperty + @get:Internal + internal abstract val additionalEditorconfig: MapProperty + @get:Incremental @get:PathSensitive(PathSensitivity.RELATIVE) @get:InputFiles @@ -184,8 +186,6 @@ abstract class BaseKtLintCheckTask @Inject constructor( protected fun runLint( inputChanges: InputChanges ) { - checkDisabledRulesSupportedKtLintVersion() - val editorConfigUpdated = wasEditorConfigFilesUpdated(inputChanges) val filesToCheck = if (editorConfigUpdated) { source.files @@ -215,8 +215,6 @@ abstract class BaseKtLintCheckTask @Inject constructor( inputChanges: InputChanges, formatSnapshot: File ) { - checkDisabledRulesSupportedKtLintVersion() - val editorConfigUpdated = wasEditorConfigFilesUpdated(inputChanges) val filesToCheck = if (editorConfigUpdated) { source.files @@ -265,31 +263,32 @@ abstract class BaseKtLintCheckTask @Inject constructor( // Process isolation is used here to run KtLint in a separate java process. // This allows to better isolate work actions from different projects tasks between each other // and to not pollute Gradle daemon heap, which otherwise greatly increases GC time. - val queue = workerExecutor.processIsolation { spec -> - spec.classpath.from(ktLintClasspath, ruleSetsClasspath) - spec.forkOptions { options -> - options.maxHeapSize = workerMaxHeapSize.get() + val queue = workerExecutor.processIsolation { + classpath.from(ktLintClasspath, ruleSetsClasspath) + forkOptions { + maxHeapSize = workerMaxHeapSize.get() // Work around ktlint triggering reflective access errors from the embedded Kotlin // compiler. See https://youtrack.jetbrains.com/issue/KT-43704 for details. if (JavaVersion.current() >= JavaVersion.VERSION_16) { - options.jvmArgs("--add-opens", "java.base/java.lang=ALL-UNNAMED") + jvmArgs("--add-opens", "java.base/java.lang=ALL-UNNAMED") } } } - queue.submit(KtLintWorkAction::class.java) { params -> - params.filesToLint.from(filesToCheck) - params.enableExperimental.set(enableExperimentalRules) - params.android.set(android) - params.disabledRules.set(disabledRules) - params.debug.set(debug) - params.additionalEditorconfigFile.set(additionalEditorconfigFile) - params.formatSource.set(formatSources) - params.discoveredErrorsFile.set(discoveredErrors) - params.ktLintVersion.set(ktLintVersion) - params.editorconfigFilesWereChanged.set(editorConfigUpdated) - params.formatSnapshot.set(formatSnapshot) + queue.submit(KtLintWorkAction::class.java) { + val task = this@BaseKtLintCheckTask + filesToLint.from(filesToCheck) + enableExperimental.set(task.enableExperimentalRules) + android.set(task.android) + disabledRules.set(task.disabledRules) + debug.set(task.debug) + additionalEditorconfig.set(task.additionalEditorconfig) + formatSource.set(formatSources) + discoveredErrorsFile.set(task.discoveredErrors) + ktLintVersion.set(task.ktLintVersion) + editorconfigFilesWereChanged.set(editorConfigUpdated) + this.formatSnapshot.set(formatSnapshot) } } @@ -310,12 +309,4 @@ abstract class BaseKtLintCheckTask @Inject constructor( } .map { it.file } .toSet() - - private fun checkDisabledRulesSupportedKtLintVersion() { - if (disabledRules.get().isNotEmpty() && - SemVer.parse(ktLintVersion.get()) < SemVer(0, 34, 2) - ) { - throw GradleException("Rules disabling is supported since 0.34.2 ktlint version.") - } - } } diff --git a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/tasks/GenerateBaselineTask.kt b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/tasks/GenerateBaselineTask.kt index 0f293246..c78641f1 100644 --- a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/tasks/GenerateBaselineTask.kt +++ b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/tasks/GenerateBaselineTask.kt @@ -1,6 +1,5 @@ package org.jlleitschuh.gradle.ktlint.tasks -import net.swiftzer.semver.SemVer import org.gradle.api.DefaultTask import org.gradle.api.Task import org.gradle.api.file.ConfigurableFileCollection @@ -50,28 +49,20 @@ abstract class GenerateBaselineTask @Inject constructor( super.onlyIf(spec) } - init { - onlyIf { - val isEnabled = SemVer.parse(ktLintVersion.get()) >= SemVer(0, 41, 0) - if (!isEnabled) logger.warn("Generate baseline only works starting from KtLint 0.41.0 version") - isEnabled - } - } - @Suppress("UnstableApiUsage") @TaskAction fun generateBaseline() { // Classloader isolation is enough here as we just want to use some classes from KtLint classpath // to get errors and generate files/console reports. No KtLint main object is initialized/used in this case. - val queue = workerExecutor.classLoaderIsolation { spec -> - spec.classpath.from(ktLintClasspath, baselineReporterClasspath) + val queue = workerExecutor.classLoaderIsolation { + classpath.from(ktLintClasspath, baselineReporterClasspath) } - - queue.submit(GenerateBaselineWorkAction::class.java) { param -> - param.discoveredErrors.setFrom(discoveredErrors) - param.ktLintVersion.set(ktLintVersion) - param.baselineFile.set(baselineFile) - param.projectDirectory.set(projectLayout.projectDirectory) + val task = this + queue.submit(GenerateBaselineWorkAction::class.java) { + discoveredErrors.setFrom(task.discoveredErrors) + ktLintVersion.set(task.ktLintVersion) + baselineFile.set(task.baselineFile) + projectDirectory.set(projectLayout.projectDirectory) } } diff --git a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/tasks/GenerateReportsTask.kt b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/tasks/GenerateReportsTask.kt index 813eab7e..75077060 100644 --- a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/tasks/GenerateReportsTask.kt +++ b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/tasks/GenerateReportsTask.kt @@ -1,8 +1,6 @@ package org.jlleitschuh.gradle.ktlint.tasks -import net.swiftzer.semver.SemVer import org.gradle.api.DefaultTask -import org.gradle.api.GradleException import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.DirectoryProperty import org.gradle.api.file.ProjectLayout @@ -90,6 +88,13 @@ abstract class GenerateReportsTask @Inject constructor( @get:Optional internal abstract val baseline: RegularFileProperty + /** + * Reading a project's rootDir within a task's action is not allowed for configuration + * cache, so read it eagerly on task initialization. + * see: https://docs.gradle.org/current/userguide/configuration_cache.html#config_cache + */ + private val rootDir: File = project.rootDir + init { // Workaround for https://github.com/gradle/gradle/issues/2919 onlyIf { @@ -118,12 +123,10 @@ abstract class GenerateReportsTask @Inject constructor( @Suppress("UnstableApiUsage") @TaskAction fun generateReports() { - checkBaselineSupportedKtLintVersion() - // Classloader isolation is enough here as we just want to use some classes from KtLint classpath // to get errors and generate files/console reports. No KtLint main object is initialized/used in this case. - val queue = workerExecutor.classLoaderIsolation { spec -> - spec.classpath.from(ktLintClasspath, reportersClasspath) + val queue = workerExecutor.classLoaderIsolation { + classpath.from(ktLintClasspath, reportersClasspath) } val loadedReporters = loadLoadedReporters() @@ -131,31 +134,32 @@ abstract class GenerateReportsTask @Inject constructor( reportsOutputDirectory.file("${reportsName.get()}.${it.fileExtension}") } + val task = this loadedReporters.forEach { (loadedReporter, reporterOutput) -> - queue.submit(GenerateReportsWorkAction::class.java) { param -> - param.discoveredErrorsFile.set(discoveredErrors) - param.loadedReporterProviders.set(loadedReporterProviders) - param.reporterId.set(loadedReporter.reporterId) - param.reporterOutput.set(reporterOutput) - param.reporterOptions.set(generateReporterOptions(loadedReporter)) - param.ktLintVersion.set(ktLintVersion) - param.baseline.set(baseline) - param.projectDirectory.set(projectLayout.projectDirectory) - if (relative.get()) { - param.filePathsRelativeTo.set(project.rootDir) + queue.submit(GenerateReportsWorkAction::class.java) { + discoveredErrorsFile.set(task.discoveredErrors) + loadedReporterProviders.set(task.loadedReporterProviders) + reporterId.set(loadedReporter.reporterId) + this.reporterOutput.set(reporterOutput) + reporterOptions.set(generateReporterOptions(loadedReporter)) + ktLintVersion.set(task.ktLintVersion) + baseline.set(task.baseline) + projectDirectory.set(task.projectLayout.projectDirectory) + if (task.relative.get()) { + filePathsRelativeTo.set(rootDir) } } } - queue.submit(ConsoleReportWorkAction::class.java) { param -> - param.discoveredErrors.set(discoveredErrors) - param.outputToConsole.set(outputToConsole) - param.ignoreFailures.set(ignoreFailures) - param.verbose.set(verbose) - param.generatedReportsPaths.from(loadedReporters.values) - param.ktLintVersion.set(ktLintVersion) - param.baseline.set(baseline) - param.projectDirectory.set(projectLayout.projectDirectory) + queue.submit(ConsoleReportWorkAction::class.java) { + discoveredErrors.set(task.discoveredErrors) + outputToConsole.set(task.outputToConsole) + ignoreFailures.set(task.ignoreFailures) + verbose.set(task.verbose) + generatedReportsPaths.from(loadedReporters.values) + ktLintVersion.set(task.ktLintVersion) + baseline.set(task.baseline) + projectDirectory.set(projectLayout.projectDirectory) } } @@ -183,12 +187,6 @@ abstract class GenerateReportsTask @Inject constructor( return options.toMap() } - private fun checkBaselineSupportedKtLintVersion() { - if (baseline.isPresent && SemVer.parse(ktLintVersion.get()) < SemVer(0, 41, 0)) { - throw GradleException("Baseline support is only enabled for KtLint versions 0.41.0+.") - } - } - internal enum class LintType( val suffix: String ) { diff --git a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/tasks/LoadReportersTask.kt b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/tasks/LoadReportersTask.kt index 30314fb6..4f4ca497 100644 --- a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/tasks/LoadReportersTask.kt +++ b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/tasks/LoadReportersTask.kt @@ -63,22 +63,23 @@ internal abstract class LoadReportersTask @Inject constructor( // Classloader isolation is enough here as we just want to use some classes from KtLint classpath // to load reporters. No KtLint main object is initialized/used in this case. - val queue = workerExecutor.classLoaderIsolation { spec -> - spec.classpath.from(ktLintClasspath, reportersClasspath) + val queue = workerExecutor.classLoaderIsolation { + classpath.from(ktLintClasspath, reportersClasspath) } - queue.submit(LoadReportersWorkAction::class.java) { param -> - param.debug.set(debug) - param.enabledReporters.set( - enabledReporters + queue.submit(LoadReportersWorkAction::class.java) { + val task = this@LoadReportersTask + debug.set(task.debug) + enabledReporters.set( + task.enabledReporters .map { reporters -> reporters.filter { it.isAvailable() } } ) - param.customReporters.set(customReporters) - param.loadedReporters.set(loadedReporters) - param.loadedReporterProviders.set(loadedReporterProviders) - param.ktLintVersion.set(ktLintVersion) + customReporters.set(task.customReporters) + loadedReporters.set(task.loadedReporters) + loadedReporterProviders.set(task.loadedReporterProviders) + ktLintVersion.set(task.ktLintVersion) } } diff --git a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/worker/KtLintWorkAction.kt b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/worker/KtLintWorkAction.kt index ec905088..d0a6fc46 100644 --- a/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/worker/KtLintWorkAction.kt +++ b/plugin/src/main/kotlin/org/jlleitschuh/gradle/ktlint/worker/KtLintWorkAction.kt @@ -6,6 +6,7 @@ import org.gradle.api.GradleException import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.RegularFileProperty import org.gradle.api.logging.Logging +import org.gradle.api.provider.MapProperty import org.gradle.api.provider.Property import org.gradle.api.provider.SetProperty import org.gradle.workers.WorkAction @@ -23,49 +24,23 @@ abstract class KtLintWorkAction : WorkAction() val formattedFiles = mutableMapOf() - if (parameters.additionalEditorconfigFile.isPresent && - parameters.ktLintVersion.map { SemVer.parse(it) }.get() >= SemVer(0, 47) + if (parameters.additionalEditorconfig.isPresent && + parameters.additionalEditorconfig.get().isNotEmpty() && + parameters.ktLintVersion.map { SemVer.parse(it) }.get() < SemVer(0, 49) ) { - logger.warn("additionalEditorconfigFile no longer supported in ktlint 0.47+") + logger.warn("additionalEditorconfig not supported until ktlint 0.49") } val ktlintInvoker: KtLintInvocation = when ( val ktlintInvokerFactory = selectInvocation(parameters.ktLintVersion.get()) ) { - is KtLintInvocation45.Factory -> { - ktlintInvokerFactory.initialize( - editorConfigPath = additionalEditorConfig, - - parameters.enableExperimental.getOrElse(false), - parameters.disabledRules.getOrElse(emptySet()), - - userData = userData, - debug = debug - ) - } - - is KtLintInvocation46.Factory -> { - ktlintInvokerFactory.initialize( - editorConfigPath = additionalEditorConfig, - enableExperimental = parameters.enableExperimental.getOrElse(false), - disabledRules = parameters.disabledRules.getOrElse(emptySet()), - userData = userData, - debug = debug - ) - } - is KtLintInvocation47.Factory -> { ktlintInvokerFactory.initialize( - editorConfigPath = additionalEditorConfig, + editorConfigPath = null, userData = userData, debug = debug, parameters.enableExperimental.getOrElse(false), @@ -82,12 +57,17 @@ abstract class KtLintWorkAction : WorkAction { - ktlintInvokerFactory.initialize() + ktlintInvokerFactory.initialize(parameters.additionalEditorconfig.get()) } is KtLintInvocation50.Factory -> { - ktlintInvokerFactory.initialize() + ktlintInvokerFactory.initialize(parameters.additionalEditorconfig.get()) + } + + is KtLintInvocation100.Factory -> { + ktlintInvokerFactory.initialize(parameters.additionalEditorconfig.get()) } + else -> { throw GradleException("Incompatible ktlint version ${parameters.ktLintVersion}") } @@ -112,6 +92,7 @@ abstract class KtLintWorkAction : WorkAction val enableExperimental: Property val debug: Property - val additionalEditorconfigFile: RegularFileProperty + val additionalEditorconfig: MapProperty val formatSource: Property val discoveredErrorsFile: RegularFileProperty val ktLintVersion: Property diff --git a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/ConfigurationCacheTest.kt b/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/ConfigurationCacheTest.kt index 5b882d91..112f8e0b 100644 --- a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/ConfigurationCacheTest.kt +++ b/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/ConfigurationCacheTest.kt @@ -13,7 +13,6 @@ import org.junit.jupiter.api.DisplayName @GradleTestVersions class ConfigurationCacheTest : AbstractPluginTest() { private val configurationCacheFlag = "--configuration-cache" - private val configurationCacheWarnFlag = "--configuration-cache-problems=warn" @DisplayName("Should support configuration cache without errors on running linting") @CommonTest @@ -29,7 +28,6 @@ class ConfigurationCacheTest : AbstractPluginTest() { build( configurationCacheFlag, - configurationCacheWarnFlag, CHECK_PARENT_TASK_NAME ) { assertThat(task(":$mainSourceSetCheckTaskName")?.outcome).isEqualTo(TaskOutcome.SUCCESS) @@ -37,7 +35,6 @@ class ConfigurationCacheTest : AbstractPluginTest() { build( configurationCacheFlag, - configurationCacheWarnFlag, CHECK_PARENT_TASK_NAME ) { assertThat(task(":$mainSourceSetCheckTaskName")?.outcome).isEqualTo(TaskOutcome.UP_TO_DATE) @@ -50,15 +47,10 @@ class ConfigurationCacheTest : AbstractPluginTest() { @CommonTest fun configurationCacheForFormatTasks(gradleVersion: GradleVersion) { project(gradleVersion) { - val sourceFile = "\nval foo = \"bar\"\n" - createSourceFile( - "src/main/kotlin/CleanSource.kt", - sourceFile - ) + withCleanSources() val formatTaskName = KtLintFormatTask.buildTaskNameForSourceSet("main") build( configurationCacheFlag, - configurationCacheWarnFlag, FORMAT_PARENT_TASK_NAME ) { assertThat(task(":$formatTaskName")?.outcome).isEqualTo(TaskOutcome.SUCCESS) @@ -66,7 +58,6 @@ class ConfigurationCacheTest : AbstractPluginTest() { } build( configurationCacheFlag, - configurationCacheWarnFlag, FORMAT_PARENT_TASK_NAME, "--debug" ) { @@ -77,6 +68,46 @@ class ConfigurationCacheTest : AbstractPluginTest() { } } + @DisplayName("Should support configuration cache on running format tasks with relative paths") + @CommonTest + fun configurationCacheForFormatTasksWithRelativePaths(gradleVersion: GradleVersion) { + project(gradleVersion) { + buildGradle.appendText( + //language=Groovy + """ + repositories { + jcenter() + } + + ktlint { + relative = true + reporters { + reporter "plain" + reporter "checkstyle" + } + } + """.trimIndent() + ) + withCleanSources() + val formatTaskName = KtLintFormatTask.buildTaskNameForSourceSet("main") + build( + configurationCacheFlag, + FORMAT_PARENT_TASK_NAME + ) { + assertThat(task(":$formatTaskName")?.outcome).isEqualTo(TaskOutcome.SUCCESS) + assertThat(task(":$mainSourceSetFormatTaskName")?.outcome).isEqualTo(TaskOutcome.SUCCESS) + } + build( + configurationCacheFlag, + FORMAT_PARENT_TASK_NAME + ) { + assertThat(task(":$formatTaskName")?.outcome).isEqualTo(TaskOutcome.UP_TO_DATE) + assertThat(task(":$mainSourceSetFormatTaskName")?.outcome).isEqualTo(TaskOutcome.UP_TO_DATE) + assertThat(output).contains("Reusing configuration cache.") + } + } + } + @DisplayName("Should support configuration cache for git hook format install task") @CommonTest internal fun configurationCacheForGitHookFormatInstallTask(gradleVersion: GradleVersion) { @@ -85,7 +116,6 @@ class ConfigurationCacheTest : AbstractPluginTest() { build( configurationCacheFlag, - configurationCacheWarnFlag, INSTALL_GIT_HOOK_FORMAT_TASK ) { assertThat(task(":$INSTALL_GIT_HOOK_FORMAT_TASK")?.outcome).isEqualTo(TaskOutcome.SUCCESS) @@ -93,7 +123,6 @@ class ConfigurationCacheTest : AbstractPluginTest() { build( configurationCacheFlag, - configurationCacheWarnFlag, INSTALL_GIT_HOOK_FORMAT_TASK ) { assertThat(task(":$INSTALL_GIT_HOOK_FORMAT_TASK")?.outcome).isEqualTo(TaskOutcome.SUCCESS) @@ -110,7 +139,6 @@ class ConfigurationCacheTest : AbstractPluginTest() { build( configurationCacheFlag, - configurationCacheWarnFlag, INSTALL_GIT_HOOK_CHECK_TASK ) { assertThat(task(":$INSTALL_GIT_HOOK_CHECK_TASK")?.outcome).isEqualTo(TaskOutcome.SUCCESS) @@ -118,7 +146,6 @@ class ConfigurationCacheTest : AbstractPluginTest() { build( configurationCacheFlag, - configurationCacheWarnFlag, INSTALL_GIT_HOOK_CHECK_TASK ) { assertThat(task(":$INSTALL_GIT_HOOK_CHECK_TASK")?.outcome).isEqualTo(TaskOutcome.SUCCESS) diff --git a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/DisabledRulesTest.kt b/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/DisabledRulesTest.kt index 7c797317..14074344 100644 --- a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/DisabledRulesTest.kt +++ b/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/DisabledRulesTest.kt @@ -5,11 +5,9 @@ import org.assertj.core.api.Assertions.assertThat import org.gradle.api.logging.Logging import org.gradle.testkit.runner.TaskOutcome import org.gradle.util.GradleVersion -import org.jlleitschuh.gradle.ktlint.tasks.KtLintCheckTask import org.jlleitschuh.gradle.ktlint.testdsl.CommonTest import org.jlleitschuh.gradle.ktlint.testdsl.GradleTestVersions import org.jlleitschuh.gradle.ktlint.testdsl.build -import org.jlleitschuh.gradle.ktlint.testdsl.buildAndFail import org.jlleitschuh.gradle.ktlint.testdsl.project import org.junit.jupiter.api.DisplayName import org.junit.jupiter.params.ParameterizedTest @@ -40,13 +38,7 @@ class DisabledRulesTest : AbstractPluginTest() { "val foo = \"bar\"" ) - if (SemVer.parse(ktLintVersion) < SemVer.parse("0.34.2")) { - buildAndFail(CHECK_PARENT_TASK_NAME) { - assertThat(task(":runKtlintCheckOverMainSourceSet")?.outcome) - .`as`("Rules disabling is supported since 0.34.2 ktlint version") - .isEqualTo(TaskOutcome.FAILED) - } - } else if (SemVer.parse(ktLintVersion) < SemVer.parse("0.48.0")) { + if (SemVer.parse(ktLintVersion) < SemVer.parse("0.48.0")) { build(CHECK_PARENT_TASK_NAME) { assertThat(task(":$mainSourceSetCheckTaskName")?.outcome).isEqualTo(TaskOutcome.SUCCESS) assertThat(output).doesNotContain("Property 'ktlint_disabled_rules' is deprecated") @@ -69,55 +61,43 @@ class DisabledRulesTest : AbstractPluginTest() { @ParameterizedTest(name = "{0} with KtLint {1}: {displayName}") @ArgumentsSource(KtLintSupportedVersionsTest.SupportedKtlintVersionsProvider::class) fun lintDisabledRuleFinalNewlineEditorconfig(gradleVersion: GradleVersion, ktLintVersion: String) { - if (SemVer.parse(ktLintVersion) >= SemVer.parse("0.34.2")) { - // Rules disabling is supported since 0.34.2 ktlint version - project(gradleVersion) { - if (SemVer.parse(ktLintVersion) >= SemVer.parse("0.48.0")) { - // new way of disabling rules introduced in 0.48 - editorConfig.appendText( - """ + project(gradleVersion) { + if (SemVer.parse(ktLintVersion) >= SemVer.parse("0.48.0")) { + // new way of disabling rules introduced in 0.48 + editorConfig.appendText( + """ root = true [*.kt] ktlint_standard_final-newline = disabled - """.trimIndent() - ) - } else if (SemVer.parse(ktLintVersion) >= SemVer.parse("0.47.0")) { - // disabled rules property renamed in 0.47 (disabled_rules is still honored, but will print a warning) - editorConfig.appendText( - """ + """.trimIndent() + ) + } else { + // disabled rules property renamed in 0.47 (disabled_rules is still honored, but will print a warning) + editorConfig.appendText( + """ root = true [*.kt] ktlint_disabled_rules = final-newline - """.trimIndent() - ) - } else { - editorConfig.appendText( - """ - root = true - - [*.kt] - disabled_rules = final-newline - """.trimIndent() - ) - } - //language=Groovy - buildGradle.appendText( - """ - ktlint.version = "$ktLintVersion" """.trimIndent() ) + } + //language=Groovy + buildGradle.appendText( + """ + ktlint.version = "$ktLintVersion" + """.trimIndent() + ) - createSourceFile( - "src/main/kotlin/CleanSource.kt", - "val foo = \"bar\"" - ) + createSourceFile( + "src/main/kotlin/CleanSource.kt", + "val foo = \"bar\"" + ) - build(CHECK_PARENT_TASK_NAME) { - assertThat(task(":$mainSourceSetCheckTaskName")?.outcome).isEqualTo(TaskOutcome.SUCCESS) - assertThat(output).doesNotContain("Property 'ktlint_disabled_rules' is deprecated") - assertThat(output).doesNotContain("Property 'disabled_rules' is deprecated") - } + build(CHECK_PARENT_TASK_NAME) { + assertThat(task(":$mainSourceSetCheckTaskName")?.outcome).isEqualTo(TaskOutcome.SUCCESS) + assertThat(output).doesNotContain("Property 'ktlint_disabled_rules' is deprecated") + assertThat(output).doesNotContain("Property 'disabled_rules' is deprecated") } } } @@ -129,7 +109,7 @@ class DisabledRulesTest : AbstractPluginTest() { //language=Groovy buildGradle.appendText( """ - + ktlint.version = "0.47.1" ktlint.disabledRules = ["final-newline", "no-consecutive-blank-lines"] """.trimIndent() ) @@ -156,6 +136,12 @@ class DisabledRulesTest : AbstractPluginTest() { @CommonTest fun lintRuleDisabledInTheCode(gradleVersion: GradleVersion) { project(gradleVersion) { + //language=Groovy + buildGradle.appendText( + """ + ktlint.version = "0.47.1" + """.trimIndent() + ) createSourceFile( "src/main/kotlin/CleanSource.kt", """ @@ -177,28 +163,4 @@ class DisabledRulesTest : AbstractPluginTest() { } } } - - @DisplayName("Should fail if KtLint version is lower then 0.34.2 and disabled rules configuration is set") - @CommonTest - fun lintShouldFailOnUnsupportedVersion(gradleVersion: GradleVersion) { - project(gradleVersion) { - //language=Groovy - buildGradle.appendText( - """ - - ktlint.version = "0.34.0" - ktlint.disabledRules = ["final-newline"] - """.trimIndent() - ) - - withCleanSources() - - buildAndFail(CHECK_PARENT_TASK_NAME) { - assertThat( - task(":${KtLintCheckTask.buildTaskNameForSourceSet("main")}")?.outcome - ).isEqualTo(TaskOutcome.FAILED) - assertThat(output).contains("Rules disabling is supported since 0.34.2 ktlint version.") - } - } - } } diff --git a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/KtLintSupportedVersionsTest.kt b/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/KtLintSupportedVersionsTest.kt index 05a49739..9ecd938e 100644 --- a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/KtLintSupportedVersionsTest.kt +++ b/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/KtLintSupportedVersionsTest.kt @@ -6,13 +6,11 @@ import org.gradle.testkit.runner.TaskOutcome import org.gradle.util.GradleVersion import org.jlleitschuh.gradle.ktlint.testdsl.GradleArgumentsProvider import org.jlleitschuh.gradle.ktlint.testdsl.GradleTestVersions -import org.jlleitschuh.gradle.ktlint.testdsl.TestProject import org.jlleitschuh.gradle.ktlint.testdsl.TestVersions import org.jlleitschuh.gradle.ktlint.testdsl.build import org.jlleitschuh.gradle.ktlint.testdsl.buildAndFail import org.jlleitschuh.gradle.ktlint.testdsl.project import org.junit.jupiter.api.DisplayName -import org.junit.jupiter.api.condition.OS import org.junit.jupiter.api.extension.ExtensionContext import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments @@ -72,10 +70,10 @@ class KtLintSupportedVersionsTest : AbstractPluginTest() { } } - @DisplayName("Lint should use editorconfig override") + @DisplayName("Lint should use editorconfig override (standard rule)") @ParameterizedTest(name = "{0} with KtLint {1}: {displayName}") @ArgumentsSource(SupportedKtlintVersionsProvider::class) - internal fun `Lint should use editorconfig override`( + internal fun `Lint should use editorconfig override standard rule`( gradleVersion: GradleVersion, ktLintVersion: String ) { @@ -83,17 +81,27 @@ class KtLintSupportedVersionsTest : AbstractPluginTest() { //language=Groovy buildGradle.appendText( """ - ktlint.version = "$ktLintVersion" - ktlint.additionalEditorconfigFile = project.file("${TestProject.ADDITIONAL_EDITOR_CONFIG}/.editorconfig") + ktlint.additionalEditorconfig = [ + "ktlint_standard_no-multi-spaces": "disabled" + ] """.trimIndent() ) - withAdditionalEditorConfig() withFailingSources() - if (SemVer.parse(ktLintVersion) >= SemVer(0, 47)) { + if (SemVer.parse(ktLintVersion) < SemVer(0, 49, 0)) { + buildAndFail(CHECK_PARENT_TASK_NAME) { + assertThat(task(":$mainSourceSetCheckTaskName")?.outcome) + .`as`("additionalEditorconfig not supported until ktlint 0.49") + .isEqualTo(TaskOutcome.FAILED) + assertThat(output).contains("additionalEditorconfig not supported until ktlint 0.49") + } + } else if (SemVer.parse(ktLintVersion) < SemVer(1, 0)) { buildAndFail(CHECK_PARENT_TASK_NAME) { - assertThat(task(":$mainSourceSetCheckTaskName")?.outcome).isEqualTo(TaskOutcome.FAILED) - assertThat(output.contains("additionalEditorconfigFile no longer supported in ktlint 0.47+")) + assertThat(task(":runKtlintCheckOverMainSourceSet")?.outcome) + .`as`("standard rules not supported by additionalEditorconfig until 1.0") + .isEqualTo(TaskOutcome.FAILED) + assertThat(output) + .contains("Property with name 'ktlint_standard_no-multi-spaces' is not found") } } else { build(CHECK_PARENT_TASK_NAME) { @@ -103,6 +111,42 @@ class KtLintSupportedVersionsTest : AbstractPluginTest() { } } + @DisplayName("Lint should use editorconfig override") + @ParameterizedTest(name = "{0} with KtLint {1}: {displayName}") + @ArgumentsSource(SupportedKtlintVersionsProvider::class) + internal fun `Lint should use editorconfig override`( + gradleVersion: GradleVersion, + ktLintVersion: String + ) { + project(gradleVersion) { + //language=Groovy + buildGradle.appendText( + """ + + ktlint.version = "$ktLintVersion" + ktlint.additionalEditorconfig = [ + "max_line_length": "20" + ] + """.trimIndent() + ) + withFailingMaxLineSources() + if (SemVer.parse(ktLintVersion) < SemVer(0, 49)) { + build(CHECK_PARENT_TASK_NAME) { + assertThat(task(":$mainSourceSetCheckTaskName")?.outcome).isEqualTo(TaskOutcome.SUCCESS) + assertThat(output).contains("additionalEditorconfig not supported until ktlint 0.49") + } + } else { + buildAndFail(CHECK_PARENT_TASK_NAME) { + assertThat(task(":$mainSourceSetCheckTaskName")?.outcome) + .`as`("additionalEditorconfig takes effect") + .isEqualTo(TaskOutcome.FAILED) + assertThat(output).doesNotContain("additionalEditorconfig not supported until ktlint 0.49") + assertThat(output).contains("Exceeded max line length (20) (cannot be auto-corrected)") + } + } + } + } + @DisplayName("Format should successfully finish on sources with style violations") @ParameterizedTest(name = "{0} with KtLint {1}: {displayName}") @ArgumentsSource(SupportedKtlintVersionsProvider::class) @@ -129,36 +173,16 @@ class KtLintSupportedVersionsTest : AbstractPluginTest() { class SupportedKtlintVersionsProvider : GradleArgumentsProvider() { private val supportedKtlintVersions = mutableListOf( - "0.34.0", - "0.34.2", - "0.35.0", - "0.36.0", - "0.37.1", - "0.37.2", - "0.38.0", - "0.38.1", - "0.39.0", - "0.40.0", - "0.41.0", - "0.42.0", - "0.42.1", - // "0.43.0" does not work on JDK1.8 - // "0.43.1" asked not to use it - "0.43.2", - "0.44.0", - "0.45.2", - "0.46.1", "0.47.1", "0.48.0", "0.48.1", "0.48.2", // "0.49.0" did not expose needed baseline classes "0.49.1", - "0.50.0" - ).also { - // "0.37.0" is failing on Windows machines that is fixed in the next version - if (!OS.WINDOWS.isCurrentOs) it.add("0.37.0") - } + "0.50.0", + "1.0.0", + "1.0.1" + ) override fun provideArguments( context: ExtensionContext diff --git a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/KtlintBaselineSupportTest.kt b/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/KtlintBaselineSupportTest.kt index 43be8fed..1677a87f 100644 --- a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/KtlintBaselineSupportTest.kt +++ b/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/KtlintBaselineSupportTest.kt @@ -1,6 +1,5 @@ package org.jlleitschuh.gradle.ktlint -import net.swiftzer.semver.SemVer import org.assertj.core.api.Assertions.assertThat import org.gradle.testkit.runner.TaskOutcome import org.gradle.util.GradleVersion @@ -59,13 +58,12 @@ class KtlintBaselineSupportTest : AbstractPluginTest() { | | | - | - | + | | | - | - | - | + | + | + | | | | @@ -101,49 +99,23 @@ class KtlintBaselineSupportTest : AbstractPluginTest() { } } - @DisplayName("Generate baseline task should work only when KtLint version is higher then 0.41.0") - @CommonTest - fun generateBaselineMinVersion(gradleVersion: GradleVersion) { - project(gradleVersion) { - withFailingSources() - - //language=Groovy - buildGradle.appendText( - """ - - ktlint { - version.set("0.40.0") - } - """.trimIndent() - ) - - build(GenerateBaselineTask.NAME) { - assertThat(task(":${GenerateBaselineTask.NAME}")?.outcome).isEqualTo(TaskOutcome.SKIPPED) - assertThat(output).containsSequence("Generate baseline only works starting from KtLint 0.41.0 version") - } - } - } - @DisplayName("Should consider existing issues in baseline") @ParameterizedTest(name = "{0} with KtLint {1}: {displayName}") @ArgumentsSource(KtLintSupportedVersionsTest.SupportedKtlintVersionsProvider::class) fun existingIssueFilteredByBaseline(gradleVersion: GradleVersion, ktLintVersion: String) { - if (SemVer.parse(ktLintVersion) >= SemVer(0, 41, 0)) { - // baseline support was added in 0.41.0 - project(gradleVersion) { - //language=Groovy - buildGradle.appendText( - """ + project(gradleVersion) { + //language=Groovy + buildGradle.appendText( + """ ktlint.version = "$ktLintVersion" ktlint.debug = true - """.trimIndent() - ) - withFailingSources() + """.trimIndent() + ) + withFailingSources() - build(GenerateBaselineTask.NAME) - build(CHECK_PARENT_TASK_NAME) { - assertThat(task(":$mainSourceSetCheckTaskName")?.outcome).isEqualTo(TaskOutcome.SUCCESS) - } + build(GenerateBaselineTask.NAME) + build(CHECK_PARENT_TASK_NAME) { + assertThat(task(":$mainSourceSetCheckTaskName")?.outcome).isEqualTo(TaskOutcome.SUCCESS) } } } @@ -162,30 +134,6 @@ class KtlintBaselineSupportTest : AbstractPluginTest() { } } - @DisplayName("Should fail the build if baseline file is present and ktlint version is less then 0.41.0") - @CommonTest - fun failBuildOnOldKtlintVersionsAndBaselinePresent(gradleVersion: GradleVersion) { - project(gradleVersion) { - withCleanSources() - build(GenerateBaselineTask.NAME) - - //language=Groovy - buildGradle.appendText( - """ - - ktlint { - version.set("0.40.0") - } - """.trimIndent() - ) - - buildAndFail(CHECK_PARENT_TASK_NAME) { - assertThat(task(":$mainSourceSetCheckTaskName")?.outcome).isEqualTo(TaskOutcome.FAILED) - assertThat(output).contains("Baseline support is only enabled for KtLint versions 0.41.0+.") - } - } - } - private val File.defaultBaselineFile get() = resolve("config") .resolve("ktlint") diff --git a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/KtlintIdeaPluginTest.kt b/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/KtlintIdeaPluginTest.kt deleted file mode 100644 index 513924bb..00000000 --- a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/KtlintIdeaPluginTest.kt +++ /dev/null @@ -1,54 +0,0 @@ -package org.jlleitschuh.gradle.ktlint - -import org.assertj.core.api.Assertions.assertThat -import org.gradle.util.GradleVersion -import org.jlleitschuh.gradle.ktlint.testdsl.TestVersions -import org.jlleitschuh.gradle.ktlint.testdsl.build -import org.jlleitschuh.gradle.ktlint.testdsl.project -import org.junit.jupiter.api.DisplayName -import org.junit.jupiter.api.Test - -class KtlintIdeaPluginTest : AbstractPluginTest() { - - @DisplayName("Applying helper plugin does not add KtLint check task") - @Test - fun applyDoesNotAddCheckTask() { - project( - GradleVersion.version(TestVersions.maxSupportedGradleVersion), - projectSetup = { - //language=Groovy - it.resolve("settings.gradle").writeText( - """ - pluginManagement { - repositories { - mavenLocal() - gradlePluginPortal() - } - - plugins { - id 'org.jetbrains.kotlin.jvm' version '${TestVersions.maxSupportedKotlinPluginVersion()}' - id 'org.jlleitschuh.gradle.ktlint-idea' version '${TestVersions.pluginVersion}' - } - } - """.trimIndent() - ) - - //language=Groovy - it.resolve("build.gradle").writeText( - """ - plugins { - id 'org.jetbrains.kotlin.jvm' - id 'org.jlleitschuh.gradle.ktlint-idea' - } - """.trimIndent() - ) - } - ) { - build(":tasks") { - assertThat(output).doesNotContain(CHECK_PARENT_TASK_NAME) - // With space to not interfere with ktlintApplyToIdeaGlobally tasks - assertThat(output).containsIgnoringCase(APPLY_TO_IDEA_TASK_NAME) - } - } - } -} diff --git a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/KtlintPluginTest.kt b/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/KtlintPluginTest.kt index 1ff5f3ff..47253ce5 100644 --- a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/KtlintPluginTest.kt +++ b/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/KtlintPluginTest.kt @@ -45,86 +45,6 @@ class KtlintPluginTest : AbstractPluginTest() { } } - @DisplayName("Should generate code style files in project < 0.47.0") - @CommonTest - fun generateIdeaCodeStyle(gradleVersion: GradleVersion) { - project(gradleVersion) { - buildGradle.appendText( - """ - ktlint.version = "0.46.1" - - """.trimIndent() - ) - withCleanSources() - val ideaRootDir = projectPath.resolve(".idea").apply { mkdir() } - - build(APPLY_TO_IDEA_TASK_NAME) { - assertThat(task(":$APPLY_TO_IDEA_TASK_NAME")?.outcome).isEqualTo(TaskOutcome.SUCCESS) - assertThat(ideaRootDir.listFiles()?.isNullOrEmpty()).isFalse() - } - } - } - - @DisplayName("Should not generate code style files in project >= 0.47.0") - @CommonTest - fun generateIdeaCodeStyleNew(gradleVersion: GradleVersion) { - project(gradleVersion) { - buildGradle.appendText( - """ - ktlint.version = "0.47.1" - - """.trimIndent() - ) - withCleanSources() - val ideaRootDir = projectPath.resolve(".idea").apply { mkdir() } - - build(APPLY_TO_IDEA_TASK_NAME) { - assertThat(task(":$APPLY_TO_IDEA_TASK_NAME")?.outcome).isEqualTo(TaskOutcome.SUCCESS) - assertThat(output).contains("Skipping ktlintApplyToIdea. The applyToIDEA functionality was removed from ktlint in 0.47.0.") - assertThat(ideaRootDir.listFiles()?.isNullOrEmpty()).isTrue() - } - } - } - - @DisplayName("Should generate code style file globally < 0.47.0") - @CommonTest - fun generateIdeaCodeStyleGloballyOld(gradleVersion: GradleVersion) { - project(gradleVersion) { - buildGradle.appendText( - """ - ktlint.version = "0.46.1" - - """.trimIndent() - ) - val ideaRootDir = projectPath.resolve(".idea").apply { mkdir() } - - build(APPLY_TO_IDEA_GLOBALLY_TASK_NAME) { - assertThat(task(":$APPLY_TO_IDEA_GLOBALLY_TASK_NAME")?.outcome).isEqualTo(TaskOutcome.SUCCESS) - assertThat(ideaRootDir.listFiles()?.isNullOrEmpty()).isFalse() - } - } - } - - @DisplayName("Should not generate code style file globally >= 0.47.0") - @CommonTest - fun generateIdeaCodeStyleGloballyNew(gradleVersion: GradleVersion) { - project(gradleVersion) { - buildGradle.appendText( - """ - ktlint.version = "0.47.1" - - """.trimIndent() - ) - val ideaRootDir = projectPath.resolve(".idea").apply { mkdir() } - - build(APPLY_TO_IDEA_GLOBALLY_TASK_NAME) { - assertThat(task(":$APPLY_TO_IDEA_GLOBALLY_TASK_NAME")?.outcome).isEqualTo(TaskOutcome.SUCCESS) - assertThat(output).contains("Skipping ktlintApplyToIdeaGlobally. The applyToIDEA functionality was removed from ktlint in 0.47.0.") - assertThat(ideaRootDir.listFiles()?.isNullOrEmpty()).isTrue() - } - } - } - @DisplayName("Should show only plugin meta tasks in task output") @CommonTest fun showOnlyMetaTasks(gradleVersion: GradleVersion) { @@ -137,11 +57,9 @@ class KtlintPluginTest : AbstractPluginTest() { .filter { it.startsWith("ktlint", ignoreCase = true) } .toList() - assertThat(ktlintTasks).hasSize(5) + assertThat(ktlintTasks).hasSize(3) assertThat(ktlintTasks).anyMatch { it.startsWith(CHECK_PARENT_TASK_NAME) } assertThat(ktlintTasks).anyMatch { it.startsWith(FORMAT_PARENT_TASK_NAME) } - assertThat(ktlintTasks).anyMatch { it.startsWith(APPLY_TO_IDEA_TASK_NAME) } - assertThat(ktlintTasks).anyMatch { it.startsWith(APPLY_TO_IDEA_GLOBALLY_TASK_NAME) } assertThat(ktlintTasks).anyMatch { it.startsWith(GenerateBaselineTask.NAME) } } } @@ -159,11 +77,9 @@ class KtlintPluginTest : AbstractPluginTest() { // Plus for main and test sources format and check tasks // Plus two kotlin script tasks - assertThat(ktlintTasks).hasSize(11) + assertThat(ktlintTasks).hasSize(9) assertThat(ktlintTasks).anyMatch { it.startsWith(CHECK_PARENT_TASK_NAME) } assertThat(ktlintTasks).anyMatch { it.startsWith(FORMAT_PARENT_TASK_NAME) } - assertThat(ktlintTasks).anyMatch { it.startsWith(APPLY_TO_IDEA_TASK_NAME) } - assertThat(ktlintTasks).anyMatch { it.startsWith(APPLY_TO_IDEA_GLOBALLY_TASK_NAME) } assertThat(ktlintTasks).anyMatch { it.startsWith(kotlinScriptCheckTaskName) } assertThat(ktlintTasks).anyMatch { it.startsWith( @@ -451,7 +367,7 @@ class KtlintPluginTest : AbstractPluginTest() { """ ktlint.enableExperimentalRules = true - ktlint.version = "0.34.0" + ktlint.version = "0.47.1" """.trimIndent() ) @@ -671,13 +587,13 @@ class KtlintPluginTest : AbstractPluginTest() { """ dependencies { - $KTLINT_RULESET_CONFIGURATION_NAME "com.pinterest.ktlint:ktlint-core:0.34.2" + $KTLINT_RULESET_CONFIGURATION_NAME "com.pinterest.ktlint:ktlint-cli-ruleset-core:1.0.0" } """.trimIndent() ) build(":dependencies", "--configuration", KTLINT_RULESET_CONFIGURATION_NAME) { - assertThat(output).contains("com.pinterest.ktlint:ktlint-core:0.34.2 -> 0.47.1") + assertThat(output).contains("com.pinterest.ktlint:ktlint-cli-ruleset-core:1.0.0 -> 1.0.1") } } } @@ -693,13 +609,13 @@ class KtlintPluginTest : AbstractPluginTest() { """ dependencies { - $KTLINT_REPORTER_CONFIGURATION_NAME "com.pinterest.ktlint:ktlint-core:0.34.2" + $KTLINT_REPORTER_CONFIGURATION_NAME "com.pinterest.ktlint:ktlint-cli-ruleset-core:1.0.0" } """.trimIndent() ) build(":dependencies", "--configuration", KTLINT_REPORTER_CONFIGURATION_NAME) { - assertThat(output).contains("com.pinterest.ktlint:ktlint-core:0.34.2 -> 0.47.1") + assertThat(output).contains("com.pinterest.ktlint:ktlint-cli-ruleset-core:1.0.0 -> 1.0.1") } } } diff --git a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/KtlintPluginVersionTest.kt b/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/KtlintPluginVersionTest.kt index 7c0d0751..a169e9f0 100644 --- a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/KtlintPluginVersionTest.kt +++ b/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/KtlintPluginVersionTest.kt @@ -28,12 +28,12 @@ class KtlintPluginVersionTest : AbstractPluginTest() { ) } - @DisplayName("Should allow to use KtLint version 0.34.0") + @DisplayName("Should allow to use KtLint version 0.47.1") @CommonTest fun allowSupportedMinimalKtLintVersion(gradleVersion: GradleVersion) { project(gradleVersion) { withCleanSources() - buildGradle.useKtlintVersion("0.34.0") + buildGradle.useKtlintVersion("0.47.1") build(CHECK_PARENT_TASK_NAME) { assertThat(task(":$mainSourceSetCheckTaskName")?.outcome).isEqualTo(TaskOutcome.SUCCESS) @@ -41,12 +41,12 @@ class KtlintPluginVersionTest : AbstractPluginTest() { } } - @DisplayName("Should fail the build on using KtLint version <0.34.0") + @DisplayName("Should fail the build on using KtLint version <0.47.0") @CommonTest fun failOnUnsupportedOldKtLintVersion(gradleVersion: GradleVersion) { project(gradleVersion) { withCleanSources() - buildGradle.useKtlintVersion("0.33.0") + buildGradle.useKtlintVersion("0.46.1") buildAndFail(CHECK_PARENT_TASK_NAME) { assertThat(task(":${LoadReportersTask.TASK_NAME}")?.outcome).isEqualTo(TaskOutcome.FAILED) } diff --git a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/ReportersTest.kt b/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/ReportersTest.kt index 15bb6c50..8adb26ff 100644 --- a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/ReportersTest.kt +++ b/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/ReportersTest.kt @@ -11,8 +11,6 @@ import org.jlleitschuh.gradle.ktlint.testdsl.build import org.jlleitschuh.gradle.ktlint.testdsl.buildAndFail import org.jlleitschuh.gradle.ktlint.testdsl.project import org.junit.jupiter.api.DisplayName -import org.junit.jupiter.api.condition.DisabledOnOs -import org.junit.jupiter.api.condition.OS @GradleTestVersions class ReportersTest : AbstractPluginTest() { @@ -208,31 +206,6 @@ class ReportersTest : AbstractPluginTest() { } } - @DisplayName("Should ignore html reporter on KtLint versions less then 0.36.0") - @CommonTest - @DisabledOnOs(OS.WINDOWS) - internal fun ignoreHtmlOnOldVersions(gradleVersion: GradleVersion) { - project(gradleVersion) { - withCleanSources() - - //language=Groovy - buildGradle.appendText( - """ - - ktlint.version = "0.35.0" - ktlint.reporters { - reporter "html" - } - """.trimIndent() - ) - - build(CHECK_PARENT_TASK_NAME) { - assertThat(task(":$mainSourceSetCheckTaskName")?.outcome).isEqualTo(TaskOutcome.SUCCESS) - assertReportNotCreated(ReporterType.HTML.fileExtension, mainSourceSetCheckTaskName) - } - } - } - @DisplayName("Should allow to set custom location for generated reports") @CommonTest internal fun customReportsLocation(gradleVersion: GradleVersion) { diff --git a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/UnsupportedGradleTest.kt b/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/UnsupportedGradleTest.kt index 4037623c..13913896 100644 --- a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/UnsupportedGradleTest.kt +++ b/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/UnsupportedGradleTest.kt @@ -14,7 +14,7 @@ class UnsupportedGradleTest : AbstractPluginTest() { @Test @DisabledOnOs(OS.WINDOWS) internal fun errorOnOldGradleVersion() { - project(GradleVersion.version("5.6.4")) { + project(GradleVersion.version("6.9.2")) { buildAndFail(CHECK_PARENT_TASK_NAME) { assertThat(output).contains( "Current version of plugin supports minimal Gradle version: " + diff --git a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/testdsl/TestAnnotations.kt b/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/testdsl/TestAnnotations.kt index 290f9bf0..e3416888 100644 --- a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/testdsl/TestAnnotations.kt +++ b/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/testdsl/TestAnnotations.kt @@ -12,17 +12,10 @@ import kotlin.streams.asStream object TestVersions { const val minSupportedGradleVersion = KtlintBasePlugin.LOWEST_SUPPORTED_GRADLE_VERSION - const val maxSupportedGradleVersion = "8.1.1" + const val maxSupportedGradleVersion = "8.4" val pluginVersion = File("VERSION_CURRENT.txt").readText().trim() const val minSupportedKotlinPluginVersion = "1.4.32" - - fun maxSupportedKotlinPluginVersion( - gradleVersion: GradleVersion = GradleVersion.version(maxSupportedGradleVersion) - ): String = when (gradleVersion) { - in (GradleVersion.version("6.8.3")..GradleVersion.version(maxSupportedGradleVersion)) -> "1.8.10" - in (GradleVersion.version("6.7.1")..GradleVersion.version("7.1.1")) -> "1.7.21" - else -> minSupportedKotlinPluginVersion - } + const val maxSupportedKotlinPluginVersion = "1.9.10" } @Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS) diff --git a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/testdsl/TestDsl.kt b/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/testdsl/TestDsl.kt index 97c2ae80..2594d3ff 100644 --- a/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/testdsl/TestDsl.kt +++ b/plugin/src/test/kotlin/org/jlleitschuh/gradle/ktlint/testdsl/TestDsl.kt @@ -4,6 +4,7 @@ import org.gradle.testkit.runner.BuildResult import org.gradle.testkit.runner.GradleRunner import org.gradle.util.GradleVersion import org.jlleitschuh.gradle.ktlint.AbstractPluginTest +import org.jlleitschuh.gradle.ktlint.testdsl.TestVersions.maxSupportedKotlinPluginVersion import java.io.File fun AbstractPluginTest.project( @@ -59,6 +60,18 @@ class TestProject( ) } + fun withFailingMaxLineSources() { + createSourceFile( + FAIL_SOURCE_FILE, + buildString { + append("val nameOfVariable =") + append("\n") + append(" listOf(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2)") + append("\n") + } + ) + } + fun withAdditionalEditorConfig() { createSourceFile( ADDITIONAL_EDITOR_CONFIG + "/.editorconfig", @@ -142,14 +155,11 @@ fun TestProject.buildAndFail( fun defaultProjectSetup(gradleVersion: GradleVersion): (File) -> Unit = projectSetup("jvm", gradleVersion) -private val GradleVersion.supportedKotlinVersion - get() = TestVersions.maxSupportedKotlinPluginVersion(this) - fun projectSetup( kotlinPluginType: String, gradleVersion: GradleVersion ): (File) -> Unit = { - val kotlinPluginVersion = gradleVersion.supportedKotlinVersion + val kotlinPluginVersion = maxSupportedKotlinPluginVersion //language=Groovy it.resolve("build.gradle").writeText( """ diff --git a/samples/android-app/src/main/java/org/jlleitschuh/gradle/ktlint/android/ItemDetailActivity.kt b/samples/android-app/src/main/java/org/jlleitschuh/gradle/ktlint/android/ItemDetailActivity.kt index 8d0a0fd8..d09736de 100644 --- a/samples/android-app/src/main/java/org/jlleitschuh/gradle/ktlint/android/ItemDetailActivity.kt +++ b/samples/android-app/src/main/java/org/jlleitschuh/gradle/ktlint/android/ItemDetailActivity.kt @@ -44,10 +44,7 @@ class ItemDetailActivity : AppCompatActivity() { // Create the detail fragment and add it to the activity // using a fragment transaction. val arguments = Bundle() - arguments.putString( - ItemDetailFragment.ARG_ITEM_ID, - intent.getStringExtra(ItemDetailFragment.ARG_ITEM_ID) - ) + arguments.putString(ItemDetailFragment.ARG_ITEM_ID, intent.getStringExtra(ItemDetailFragment.ARG_ITEM_ID)) val fragment = ItemDetailFragment() fragment.arguments = arguments supportFragmentManager.beginTransaction() diff --git a/samples/android-app/src/main/java/org/jlleitschuh/gradle/ktlint/android/ItemDetailFragment.kt b/samples/android-app/src/main/java/org/jlleitschuh/gradle/ktlint/android/ItemDetailFragment.kt index 9d0de354..f2e1ccbb 100644 --- a/samples/android-app/src/main/java/org/jlleitschuh/gradle/ktlint/android/ItemDetailFragment.kt +++ b/samples/android-app/src/main/java/org/jlleitschuh/gradle/ktlint/android/ItemDetailFragment.kt @@ -15,7 +15,6 @@ import org.jlleitschuh.gradle.ktlint.android.dummy.DummyContent * on handsets. */ class ItemDetailFragment : Fragment() { - /** * The dummy content this fragment is presenting. */ @@ -40,7 +39,7 @@ class ItemDetailFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View? { viewBinding = ItemDetailBinding.inflate(inflater, container, false) diff --git a/samples/android-app/src/main/java/org/jlleitschuh/gradle/ktlint/android/ItemListActivity.kt b/samples/android-app/src/main/java/org/jlleitschuh/gradle/ktlint/android/ItemListActivity.kt index 56b1f868..22f1aeac 100644 --- a/samples/android-app/src/main/java/org/jlleitschuh/gradle/ktlint/android/ItemListActivity.kt +++ b/samples/android-app/src/main/java/org/jlleitschuh/gradle/ktlint/android/ItemListActivity.kt @@ -22,7 +22,6 @@ import org.jlleitschuh.gradle.ktlint.android.dummy.DummyContent * item details side-by-side using two vertical panes. */ class ItemListActivity : AppCompatActivity() { - private var viewBinding: ActivityItemListBinding? = null override fun onCreate(savedInstanceState: Bundle?) { @@ -46,28 +45,36 @@ class ItemListActivity : AppCompatActivity() { } class SimpleItemRecyclerViewAdapter( - private val mValues: List + private val mValues: List, ) : RecyclerView.Adapter() { - private val mOnClickListener: View.OnClickListener init { - mOnClickListener = View.OnClickListener { v -> - val item = v.tag as DummyContent.DummyItem - val intent = Intent(v.context, ItemDetailActivity::class.java).apply { - putExtra(ItemDetailFragment.ARG_ITEM_ID, item.id) + mOnClickListener = + View.OnClickListener { v -> + val item = v.tag as DummyContent.DummyItem + val intent = + Intent(v.context, ItemDetailActivity::class.java).apply { + putExtra(ItemDetailFragment.ARG_ITEM_ID, item.id) + } + v.context.startActivity(intent) } - v.context.startActivity(intent) - } } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val view = LayoutInflater.from(parent.context) - .inflate(R.layout.item_list_content, parent, false) + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int, + ): ViewHolder { + val view = + LayoutInflater.from(parent.context) + .inflate(R.layout.item_list_content, parent, false) return ViewHolder(view) } - override fun onBindViewHolder(holder: ViewHolder, position: Int) { + override fun onBindViewHolder( + holder: ViewHolder, + position: Int, + ) { val item = mValues[position] holder.mIdView.text = item.id holder.mContentView.text = item.content diff --git a/samples/android-app/src/main/java/org/jlleitschuh/gradle/ktlint/android/dummy/DummyContent.kt b/samples/android-app/src/main/java/org/jlleitschuh/gradle/ktlint/android/dummy/DummyContent.kt index edcdc279..7974a04e 100644 --- a/samples/android-app/src/main/java/org/jlleitschuh/gradle/ktlint/android/dummy/DummyContent.kt +++ b/samples/android-app/src/main/java/org/jlleitschuh/gradle/ktlint/android/dummy/DummyContent.kt @@ -10,7 +10,6 @@ import java.util.HashMap * TODO: Replace all uses of this class before publishing your app. */ object DummyContent { - /** * An array of sample (dummy) items. */ diff --git a/samples/android-app/src/main/kotlin/org/jlleitschuh/gradle/ktlint/android/AlternativeSample.kt b/samples/android-app/src/main/kotlin/org/jlleitschuh/gradle/ktlint/android/AlternativeSample.kt index d46d6972..921fee7a 100644 --- a/samples/android-app/src/main/kotlin/org/jlleitschuh/gradle/ktlint/android/AlternativeSample.kt +++ b/samples/android-app/src/main/kotlin/org/jlleitschuh/gradle/ktlint/android/AlternativeSample.kt @@ -1,5 +1,3 @@ package org.jlleitschuh.gradle.ktlint.android -data class AlternativeSample( - val one: Int = 1 -) +data class AlternativeSample(val one: Int = 1) diff --git a/samples/kotlin-js/src/main/kotlin/org/jlleitschuh/gradle/ktlint/sample/js/Main.kt b/samples/kotlin-js/src/main/kotlin/org/jlleitschuh/gradle/ktlint/sample/js/Main.kt index bec537f3..0afc6cec 100644 --- a/samples/kotlin-js/src/main/kotlin/org/jlleitschuh/gradle/ktlint/sample/js/Main.kt +++ b/samples/kotlin-js/src/main/kotlin/org/jlleitschuh/gradle/ktlint/sample/js/Main.kt @@ -3,9 +3,11 @@ package org.jlleitschuh.gradle.ktlint.sample.js import kotlinx.browser.document import org.w3c.dom.Node -val secondDiv: dynamic = document.createElement("div").apply { - innerHTML = "

Hello second time!

" -} +val secondDiv: dynamic = + document.createElement("div") + .apply { + innerHTML = "

Hello second time!

" + } fun main() { val firstDiv = document.createElement("div").apply { innerHTML = "

Hello!

" } diff --git a/samples/kotlin-mpp-android/src/commonMain/kotlin/org/jlleitschuh/gradle/ktlint/sample/mppandroid/LocationProvider.kt b/samples/kotlin-mpp-android/src/commonMain/kotlin/org/jlleitschuh/gradle/ktlint/sample/mppandroid/LocationProvider.kt index 393ca61b..b0a3d529 100644 --- a/samples/kotlin-mpp-android/src/commonMain/kotlin/org/jlleitschuh/gradle/ktlint/sample/mppandroid/LocationProvider.kt +++ b/samples/kotlin-mpp-android/src/commonMain/kotlin/org/jlleitschuh/gradle/ktlint/sample/mppandroid/LocationProvider.kt @@ -2,11 +2,13 @@ package org.jlleitschuh.gradle.ktlint.sample.mppandroid interface LocationProvider { fun startLocationFix() + fun stopLocationFix() + fun getCurrentLocation(): Location data class Location( val latitude: Long, - val longitude: Long + val longitude: Long, ) } diff --git a/samples/kotlin-mpp/src/commonMain/kotlin/org/jlleitschuh/gradle/ktlint/sample/mpp/CommonInterface.kt b/samples/kotlin-mpp/src/commonMain/kotlin/org/jlleitschuh/gradle/ktlint/sample/mpp/CommonInterface.kt index d62b392b..14c2b6d4 100644 --- a/samples/kotlin-mpp/src/commonMain/kotlin/org/jlleitschuh/gradle/ktlint/sample/mpp/CommonInterface.kt +++ b/samples/kotlin-mpp/src/commonMain/kotlin/org/jlleitschuh/gradle/ktlint/sample/mpp/CommonInterface.kt @@ -2,5 +2,6 @@ package org.jlleitschuh.gradle.ktlint.sample.mpp interface CommonInterface { fun init() + fun getName(): String } diff --git a/samples/kotlin-reporter-creating/build.gradle.kts b/samples/kotlin-reporter-creating/build.gradle.kts index 45030a8c..99ebbfbe 100644 --- a/samples/kotlin-reporter-creating/build.gradle.kts +++ b/samples/kotlin-reporter-creating/build.gradle.kts @@ -4,5 +4,9 @@ plugins { } dependencies { - compileOnly(pluginLibs.ktlint.core) + compileOnly("com.pinterest.ktlint:ktlint-cli-reporter-core:1.0.1") +} + +ktlint { + version = "1.0.1" } diff --git a/samples/kotlin-reporter-creating/src/main/kotlin/org/jlleitschuh/gradle/ktlint/sample/CsvReporter.kt b/samples/kotlin-reporter-creating/src/main/kotlin/org/jlleitschuh/gradle/ktlint/sample/CsvReporter.kt index f90cb1fe..581d47a8 100644 --- a/samples/kotlin-reporter-creating/src/main/kotlin/org/jlleitschuh/gradle/ktlint/sample/CsvReporter.kt +++ b/samples/kotlin-reporter-creating/src/main/kotlin/org/jlleitschuh/gradle/ktlint/sample/CsvReporter.kt @@ -1,13 +1,16 @@ package org.jlleitschuh.gradle.ktlint.sample -import com.pinterest.ktlint.core.LintError -import com.pinterest.ktlint.core.Reporter +import com.pinterest.ktlint.cli.reporter.core.api.KtlintCliError +import com.pinterest.ktlint.cli.reporter.core.api.ReporterV2 import java.io.PrintStream -class CsvReporter( - private val out: PrintStream -) : Reporter { - override fun onLintError(file: String, err: LintError, corrected: Boolean) { - out.println("$file;${err.line};${err.col};${err.ruleId};${err.detail};$corrected") +class CsvReporter(private val out: PrintStream) : ReporterV2 { + override fun onLintError( + file: String, + ktlintCliError: KtlintCliError, + ) { + out.println( + "$file;${ktlintCliError.line};${ktlintCliError.col};${ktlintCliError.ruleId};${ktlintCliError.detail}", + ) } } diff --git a/samples/kotlin-reporter-creating/src/main/kotlin/org/jlleitschuh/gradle/ktlint/sample/CsvReporterProvider.kt b/samples/kotlin-reporter-creating/src/main/kotlin/org/jlleitschuh/gradle/ktlint/sample/CsvReporterProvider.kt index 746a3e60..09e5ad31 100644 --- a/samples/kotlin-reporter-creating/src/main/kotlin/org/jlleitschuh/gradle/ktlint/sample/CsvReporterProvider.kt +++ b/samples/kotlin-reporter-creating/src/main/kotlin/org/jlleitschuh/gradle/ktlint/sample/CsvReporterProvider.kt @@ -1,14 +1,14 @@ package org.jlleitschuh.gradle.ktlint.sample -import com.pinterest.ktlint.core.Reporter -import com.pinterest.ktlint.core.ReporterProvider +import com.pinterest.ktlint.cli.reporter.core.api.ReporterProviderV2 +import com.pinterest.ktlint.cli.reporter.core.api.ReporterV2 import java.io.PrintStream -class CsvReporterProvider : ReporterProvider { +class CsvReporterProvider : ReporterProviderV2 { override val id: String = "csv" override fun get( out: PrintStream, - opt: Map - ): Reporter = CsvReporter(out) + opt: Map, + ): ReporterV2 = CsvReporter(out) } diff --git a/samples/kotlin-reporter-creating/src/main/resources/META-INF/services/com.pinterest.ktlint.core.ReporterProvider b/samples/kotlin-reporter-creating/src/main/resources/META-INF/services/com.pinterest.ktlint.cli.reporter.core.api.ReporterProviderV2 similarity index 100% rename from samples/kotlin-reporter-creating/src/main/resources/META-INF/services/com.pinterest.ktlint.core.ReporterProvider rename to samples/kotlin-reporter-creating/src/main/resources/META-INF/services/com.pinterest.ktlint.cli.reporter.core.api.ReporterProviderV2 diff --git a/samples/kotlin-reporter-using/build.gradle.kts b/samples/kotlin-reporter-using/build.gradle.kts index 82b25161..bf60f02e 100644 --- a/samples/kotlin-reporter-using/build.gradle.kts +++ b/samples/kotlin-reporter-using/build.gradle.kts @@ -27,7 +27,10 @@ ktlint { } } -// TODO: fix it -tasks.named("loadKtlintReporters").configure { - dependsOn(projects.samples.kotlinReporterCreating) +tasks.named("loadKtlintReporters") { + dependsOn(":samples:kotlin-rulesets-creating:build") +} + +ktlint { + version = "1.0.1" } diff --git a/samples/kotlin-rulesets-creating/build.gradle.kts b/samples/kotlin-rulesets-creating/build.gradle.kts index 6ca7c02a..a051f354 100644 --- a/samples/kotlin-rulesets-creating/build.gradle.kts +++ b/samples/kotlin-rulesets-creating/build.gradle.kts @@ -8,3 +8,7 @@ dependencies { compileOnly(pluginLibs.kotlin.script.runtime) compileOnly("com.pinterest.ktlint:ktlint-cli-ruleset-core:0.50.0") } + +ktlint { + version = "1.0.1" +} diff --git a/samples/kotlin-rulesets-creating/src/main/kotlin/org/jlleitschuh/gradle/ktlint/sample/kotlin/CustomRuleSetProvider.kt b/samples/kotlin-rulesets-creating/src/main/kotlin/org/jlleitschuh/gradle/ktlint/sample/kotlin/CustomRuleSetProvider.kt index 945e3c8e..2c798e45 100644 --- a/samples/kotlin-rulesets-creating/src/main/kotlin/org/jlleitschuh/gradle/ktlint/sample/kotlin/CustomRuleSetProvider.kt +++ b/samples/kotlin-rulesets-creating/src/main/kotlin/org/jlleitschuh/gradle/ktlint/sample/kotlin/CustomRuleSetProvider.kt @@ -5,7 +5,6 @@ import com.pinterest.ktlint.rule.engine.core.api.RuleProvider import com.pinterest.ktlint.rule.engine.core.api.RuleSetId class CustomRuleSetProvider : RuleSetProviderV3(RuleSetId("custom")) { - override fun getRuleProviders(): Set { return setOf(RuleProvider { NoVarRule() }) } diff --git a/samples/kotlin-rulesets-creating/src/main/kotlin/org/jlleitschuh/gradle/ktlint/sample/kotlin/NoVarRule.kt b/samples/kotlin-rulesets-creating/src/main/kotlin/org/jlleitschuh/gradle/ktlint/sample/kotlin/NoVarRule.kt index 6f373bec..4ea50193 100644 --- a/samples/kotlin-rulesets-creating/src/main/kotlin/org/jlleitschuh/gradle/ktlint/sample/kotlin/NoVarRule.kt +++ b/samples/kotlin-rulesets-creating/src/main/kotlin/org/jlleitschuh/gradle/ktlint/sample/kotlin/NoVarRule.kt @@ -7,14 +7,11 @@ import org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.LeafPsiElement import org.jetbrains.kotlin.com.intellij.psi.util.PsiTreeUtil.getNonStrictParentOfType import org.jetbrains.kotlin.psi.KtStringTemplateEntry -class NoVarRule : Rule( - RuleId("test:novar"), - About() -) { +class NoVarRule : Rule(RuleId("test:novar"), About()) { override fun beforeVisitChildNodes( node: ASTNode, autoCorrect: Boolean, - emit: (offset: Int, errorMessage: String, canBeAutoCorrected: Boolean) -> Unit + emit: (offset: Int, errorMessage: String, canBeAutoCorrected: Boolean) -> Unit, ) { if (node is LeafPsiElement && node.textMatches("var") && getNonStrictParentOfType(node, KtStringTemplateEntry::class.java) == null diff --git a/settings.gradle.kts b/settings.gradle.kts index 245ec8cb..ce826a9b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -24,7 +24,6 @@ pluginManagement { } } -enableFeaturePreview("VERSION_CATALOGS") enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") dependencyResolutionManagement { @@ -62,6 +61,7 @@ fun isAndroidSdkInLocalPropertiesSet(): Boolean { } fun isAndroidSdkVariableSet(): Boolean = System.getenv().containsKey("ANDROID_HOME") + fun isAndroidSdkAvailable(): Boolean = isAndroidSdkVariableSet() || isAndroidSdkInLocalPropertiesSet() include("samples:kotlin-ks")