From b3e707cf662d99474e3be27f37f536d289813b80 Mon Sep 17 00:00:00 2001 From: "Vitaly V. Pinchuk" Date: Sat, 24 Sep 2022 17:22:35 +0300 Subject: [PATCH 1/4] Create Rule Set For Libraries --- .../src/main/kotlin/releasing.gradle.kts | 2 ++ config/detekt/detekt.yml | 4 ---- .../main/resources/default-detekt-config.yml | 12 ---------- detekt-generator/build.gradle.kts | 4 ++++ .../detekt/generator/DetektPrinter.kt | 9 ++++++- .../printer/defaultconfig/Exclusion.kt | 12 +--------- detekt-rules-libraries/build.gradle.kts | 9 +++++++ .../libraries}/ForbiddenPublicDataClass.kt | 2 +- .../LibraryCodeMustSpecifyReturnType.kt | 2 +- .../LibraryEntitiesShouldNotBePublic.kt | 2 +- .../detekt/libraries/RuleLibrariesProvider.kt | 24 +++++++++++++++++++ ...tlab.arturbosch.detekt.api.RuleSetProvider | 1 + .../src/main/resources/config/config.yml | 11 +++++++++ .../ForbiddenPublicDataClassSpec.kt | 2 +- .../LibraryCodeMustSpecifyReturnTypeSpec.kt | 2 +- .../LibraryEntitiesShouldNotBePublicSpec.kt | 2 +- .../detekt/rules/style/StyleGuideProvider.kt | 3 --- settings.gradle.kts | 1 + 18 files changed, 67 insertions(+), 37 deletions(-) create mode 100644 detekt-rules-libraries/build.gradle.kts rename {detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style => detekt-rules-libraries/src/main/kotlin/io/gitlab/arturbosch/detekt/libraries}/ForbiddenPublicDataClass.kt (98%) rename {detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style => detekt-rules-libraries/src/main/kotlin/io/gitlab/arturbosch/detekt/libraries}/LibraryCodeMustSpecifyReturnType.kt (98%) rename {detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style => detekt-rules-libraries/src/main/kotlin/io/gitlab/arturbosch/detekt/libraries}/LibraryEntitiesShouldNotBePublic.kt (97%) create mode 100644 detekt-rules-libraries/src/main/kotlin/io/gitlab/arturbosch/detekt/libraries/RuleLibrariesProvider.kt create mode 100644 detekt-rules-libraries/src/main/resources/META-INF/services/io.gitlab.arturbosch.detekt.api.RuleSetProvider create mode 100644 detekt-rules-libraries/src/main/resources/config/config.yml rename {detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style => detekt-rules-libraries/src/test/kotlin/io/gitlab/arturbosch/detekt/libraries}/ForbiddenPublicDataClassSpec.kt (98%) rename {detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style => detekt-rules-libraries/src/test/kotlin/io/gitlab/arturbosch/detekt/libraries}/LibraryCodeMustSpecifyReturnTypeSpec.kt (99%) rename {detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style => detekt-rules-libraries/src/test/kotlin/io/gitlab/arturbosch/detekt/libraries}/LibraryEntitiesShouldNotBePublicSpec.kt (98%) diff --git a/build-logic/src/main/kotlin/releasing.gradle.kts b/build-logic/src/main/kotlin/releasing.gradle.kts index 46a92d5b390..31884360c0a 100644 --- a/build-logic/src/main/kotlin/releasing.gradle.kts +++ b/build-logic/src/main/kotlin/releasing.gradle.kts @@ -40,6 +40,8 @@ project.afterEvaluate { cliBuildDir.resolve("distributions/detekt-cli-${project.version}.zip"), project(":detekt-formatting").buildDir.resolve("libs/detekt-formatting-${project.version}.jar"), project(":detekt-generator").buildDir.resolve("libs/detekt-generator-${project.version}-all.jar"), + project(":detekt-rules-libraries").buildDir + .resolve("libs/detekt-rules-libraries-${project.version}.jar"), project(":detekt-rules-ruleauthors").buildDir .resolve("libs/detekt-rules-ruleauthors-${project.version}.jar") ) diff --git a/config/detekt/detekt.yml b/config/detekt/detekt.yml index 5237f6c5f66..d8971e230ef 100644 --- a/config/detekt/detekt.yml +++ b/config/detekt/detekt.yml @@ -190,10 +190,6 @@ style: - 'org.jetbrains.kotlin.diagnostics.DiagnosticUtils.getLineAndColumnInPsiFile' ForbiddenVoid: active: true - LibraryCodeMustSpecifyReturnType: - active: true - excludes: ['**/*.kt'] - includes: ['**/detekt-api/src/main/**/api/*.kt'] MagicNumber: excludes: ['**/test/**', '**/*Test.kt', '**/*Spec.kt'] ignorePropertyDeclaration: true diff --git a/detekt-core/src/main/resources/default-detekt-config.yml b/detekt-core/src/main/resources/default-detekt-config.yml index 764ba811aa5..a4397721937 100644 --- a/detekt-core/src/main/resources/default-detekt-config.yml +++ b/detekt-core/src/main/resources/default-detekt-config.yml @@ -547,12 +547,6 @@ style: value: 'kotlin.io.print' - reason: 'println does not allow you to configure the output stream. Use a logger instead.' value: 'kotlin.io.println' - ForbiddenPublicDataClass: - active: true - excludes: ['**'] - ignorePackages: - - '*.internal' - - '*.internal.*' ForbiddenSuppress: active: false rules: [] @@ -565,12 +559,6 @@ style: ignoreOverridableFunction: true ignoreActualFunction: true excludedFunctions: [] - LibraryCodeMustSpecifyReturnType: - active: true - excludes: ['**'] - LibraryEntitiesShouldNotBePublic: - active: true - excludes: ['**'] LoopWithTooManyJumpStatements: active: true maxJumpCount: 1 diff --git a/detekt-generator/build.gradle.kts b/detekt-generator/build.gradle.kts index 747a38e48a5..45d1671ae70 100644 --- a/detekt-generator/build.gradle.kts +++ b/detekt-generator/build.gradle.kts @@ -26,6 +26,7 @@ val cliOptionsFile = "${rootProject.rootDir}/website/docs/gettingstarted/_cli-op val defaultConfigFile = "$configDir/default-detekt-config.yml" val deprecationFile = "$configDir/deprecation.properties" val formattingConfigFile = "${rootProject.rootDir}/detekt-formatting/src/main/resources/config/config.yml" +val librariesConfigFile = "${rootProject.rootDir}/detekt-rules-libraries/src/main/resources/config/config.yml" val ruleauthorsConfigFile = "${rootProject.rootDir}/detekt-rules-ruleauthors/src/main/resources/config/config.yml" val ruleModules = rootProject.subprojects @@ -41,6 +42,7 @@ val generateDocumentation by tasks.registering(JavaExec::class) { inputs.files( ruleModules.map { fileTree(it) }, + fileTree("${rootProject.rootDir}/detekt-rules-libraries/src/main/kotlin"), fileTree("${rootProject.rootDir}/detekt-rules-ruleauthors/src/main/kotlin"), fileTree("${rootProject.rootDir}/detekt-formatting/src/main/kotlin"), file("${rootProject.rootDir}/detekt-generator/build/libs/detekt-generator-${Versions.DETEKT}-all.jar"), @@ -50,6 +52,7 @@ val generateDocumentation by tasks.registering(JavaExec::class) { fileTree(documentationDir), file(defaultConfigFile), file(formattingConfigFile), + file(librariesConfigFile), file(ruleauthorsConfigFile), file(deprecationFile), file(cliOptionsFile), @@ -64,6 +67,7 @@ val generateDocumentation by tasks.registering(JavaExec::class) { args = listOf( "--input", ruleModules + .plus("${rootProject.rootDir}/detekt-rules-libraries/src/main/kotlin") .plus("${rootProject.rootDir}/detekt-rules-ruleauthors/src/main/kotlin") .plus("${rootProject.rootDir}/detekt-formatting/src/main/kotlin") .joinToString(","), diff --git a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/DetektPrinter.kt b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/DetektPrinter.kt index 7fd4075a4af..64a6df03f12 100644 --- a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/DetektPrinter.kt +++ b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/DetektPrinter.kt @@ -24,7 +24,9 @@ class DetektPrinter(private val arguments: GeneratorArgs) { } } yamlWriter.write(arguments.configPath, "default-detekt-config") { - ConfigPrinter.print(pages.filterNot { it.ruleSet.name == "formatting" || it.ruleSet.name == "ruleauthors" }) + ConfigPrinter.print( + pages.filterNot { it.ruleSet.name in listOf("formatting", "libraries", "ruleauthors") } + ) } propertiesWriter.write(arguments.configPath, "deprecation") { // We intentionally not filter for "formatting" as we want to be able to deprecate @@ -36,6 +38,11 @@ class DetektPrinter(private val arguments: GeneratorArgs) { printRuleSetPage(pages.first { it.ruleSet.name == "formatting" }) } } + yamlWriter.write(Paths.get("../detekt-rules-libraries/src/main/resources/config"), "config") { + yaml { + printRuleSetPage(pages.first { it.ruleSet.name == "libraries" }) + } + } yamlWriter.write(Paths.get("../detekt-rules-ruleauthors/src/main/resources/config"), "config") { yaml { printRuleSetPage(pages.first { it.ruleSet.name == "ruleauthors" }) diff --git a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/Exclusion.kt b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/Exclusion.kt index b2c6f392714..91a4a5df19e 100644 --- a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/Exclusion.kt +++ b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/Exclusion.kt @@ -5,7 +5,7 @@ import io.gitlab.arturbosch.detekt.generator.collection.Rule /** * Holds a list of extra exclusions for rules and rule sets. */ -val exclusions = arrayOf(TestExclusions, KotlinScriptExclusions, KotlinScriptAndTestExclusions, LibraryExclusions) +val exclusions = arrayOf(TestExclusions, KotlinScriptExclusions, KotlinScriptAndTestExclusions) /** * Tracks rules and rule sets which needs an extra `excludes: $pattern` property @@ -56,13 +56,3 @@ private object KotlinScriptAndTestExclusions : Exclusions() { "'**/*.kts']" override val rules = setOf("MagicNumber") } - -private object LibraryExclusions : Exclusions() { - - override val pattern = "['**']" - override val rules = setOf( - "ForbiddenPublicDataClass", - "LibraryCodeMustSpecifyReturnType", - "LibraryEntitiesShouldNotBePublic", - ) -} diff --git a/detekt-rules-libraries/build.gradle.kts b/detekt-rules-libraries/build.gradle.kts new file mode 100644 index 00000000000..e0469ce857e --- /dev/null +++ b/detekt-rules-libraries/build.gradle.kts @@ -0,0 +1,9 @@ +plugins { + id("module") +} + +dependencies { + compileOnly(projects.detektApi) + testImplementation(projects.detektTest) + testImplementation(libs.assertj) +} diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenPublicDataClass.kt b/detekt-rules-libraries/src/main/kotlin/io/gitlab/arturbosch/detekt/libraries/ForbiddenPublicDataClass.kt similarity index 98% rename from detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenPublicDataClass.kt rename to detekt-rules-libraries/src/main/kotlin/io/gitlab/arturbosch/detekt/libraries/ForbiddenPublicDataClass.kt index 53c0a73067a..925cf5886bf 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenPublicDataClass.kt +++ b/detekt-rules-libraries/src/main/kotlin/io/gitlab/arturbosch/detekt/libraries/ForbiddenPublicDataClass.kt @@ -1,4 +1,4 @@ -package io.gitlab.arturbosch.detekt.rules.style +package io.gitlab.arturbosch.detekt.libraries import io.gitlab.arturbosch.detekt.api.CodeSmell import io.gitlab.arturbosch.detekt.api.Config diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/LibraryCodeMustSpecifyReturnType.kt b/detekt-rules-libraries/src/main/kotlin/io/gitlab/arturbosch/detekt/libraries/LibraryCodeMustSpecifyReturnType.kt similarity index 98% rename from detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/LibraryCodeMustSpecifyReturnType.kt rename to detekt-rules-libraries/src/main/kotlin/io/gitlab/arturbosch/detekt/libraries/LibraryCodeMustSpecifyReturnType.kt index 711bb43bbcd..42479869f3c 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/LibraryCodeMustSpecifyReturnType.kt +++ b/detekt-rules-libraries/src/main/kotlin/io/gitlab/arturbosch/detekt/libraries/LibraryCodeMustSpecifyReturnType.kt @@ -1,4 +1,4 @@ -package io.gitlab.arturbosch.detekt.rules.style +package io.gitlab.arturbosch.detekt.libraries import io.gitlab.arturbosch.detekt.api.CodeSmell import io.gitlab.arturbosch.detekt.api.Config diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/LibraryEntitiesShouldNotBePublic.kt b/detekt-rules-libraries/src/main/kotlin/io/gitlab/arturbosch/detekt/libraries/LibraryEntitiesShouldNotBePublic.kt similarity index 97% rename from detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/LibraryEntitiesShouldNotBePublic.kt rename to detekt-rules-libraries/src/main/kotlin/io/gitlab/arturbosch/detekt/libraries/LibraryEntitiesShouldNotBePublic.kt index c821ccc8ff7..5da067fe9c3 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/LibraryEntitiesShouldNotBePublic.kt +++ b/detekt-rules-libraries/src/main/kotlin/io/gitlab/arturbosch/detekt/libraries/LibraryEntitiesShouldNotBePublic.kt @@ -1,4 +1,4 @@ -package io.gitlab.arturbosch.detekt.rules.style +package io.gitlab.arturbosch.detekt.libraries import io.gitlab.arturbosch.detekt.api.CodeSmell import io.gitlab.arturbosch.detekt.api.Config diff --git a/detekt-rules-libraries/src/main/kotlin/io/gitlab/arturbosch/detekt/libraries/RuleLibrariesProvider.kt b/detekt-rules-libraries/src/main/kotlin/io/gitlab/arturbosch/detekt/libraries/RuleLibrariesProvider.kt new file mode 100644 index 00000000000..bcd8657cb66 --- /dev/null +++ b/detekt-rules-libraries/src/main/kotlin/io/gitlab/arturbosch/detekt/libraries/RuleLibrariesProvider.kt @@ -0,0 +1,24 @@ +package io.gitlab.arturbosch.detekt.libraries + +import io.gitlab.arturbosch.detekt.api.Config +import io.gitlab.arturbosch.detekt.api.RuleSet +import io.gitlab.arturbosch.detekt.api.RuleSetProvider +import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault + +/** + * Rules in this rule set report issues related to libraries API exposure. + */ +@ActiveByDefault("1.16.0") +class RuleLibrariesProvider : RuleSetProvider { + + override val ruleSetId: String = "libraries" + + override fun instance(config: Config) = RuleSet( + ruleSetId, + listOf( + ForbiddenPublicDataClass(config), + LibraryEntitiesShouldNotBePublic(config), + LibraryCodeMustSpecifyReturnType(config), + ) + ) +} diff --git a/detekt-rules-libraries/src/main/resources/META-INF/services/io.gitlab.arturbosch.detekt.api.RuleSetProvider b/detekt-rules-libraries/src/main/resources/META-INF/services/io.gitlab.arturbosch.detekt.api.RuleSetProvider new file mode 100644 index 00000000000..f51700f443f --- /dev/null +++ b/detekt-rules-libraries/src/main/resources/META-INF/services/io.gitlab.arturbosch.detekt.api.RuleSetProvider @@ -0,0 +1 @@ +io.gitlab.arturbosch.detekt.libraries.RuleLibrariesProvider diff --git a/detekt-rules-libraries/src/main/resources/config/config.yml b/detekt-rules-libraries/src/main/resources/config/config.yml new file mode 100644 index 00000000000..3d06584277c --- /dev/null +++ b/detekt-rules-libraries/src/main/resources/config/config.yml @@ -0,0 +1,11 @@ +libraries: + active: true + ForbiddenPublicDataClass: + active: true + ignorePackages: + - '*.internal' + - '*.internal.*' + LibraryCodeMustSpecifyReturnType: + active: true + LibraryEntitiesShouldNotBePublic: + active: true diff --git a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenPublicDataClassSpec.kt b/detekt-rules-libraries/src/test/kotlin/io/gitlab/arturbosch/detekt/libraries/ForbiddenPublicDataClassSpec.kt similarity index 98% rename from detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenPublicDataClassSpec.kt rename to detekt-rules-libraries/src/test/kotlin/io/gitlab/arturbosch/detekt/libraries/ForbiddenPublicDataClassSpec.kt index 8900bd700bc..1a93cef521a 100644 --- a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenPublicDataClassSpec.kt +++ b/detekt-rules-libraries/src/test/kotlin/io/gitlab/arturbosch/detekt/libraries/ForbiddenPublicDataClassSpec.kt @@ -1,4 +1,4 @@ -package io.gitlab.arturbosch.detekt.rules.style +package io.gitlab.arturbosch.detekt.libraries import io.gitlab.arturbosch.detekt.api.Config import io.gitlab.arturbosch.detekt.test.TestConfig diff --git a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/LibraryCodeMustSpecifyReturnTypeSpec.kt b/detekt-rules-libraries/src/test/kotlin/io/gitlab/arturbosch/detekt/libraries/LibraryCodeMustSpecifyReturnTypeSpec.kt similarity index 99% rename from detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/LibraryCodeMustSpecifyReturnTypeSpec.kt rename to detekt-rules-libraries/src/test/kotlin/io/gitlab/arturbosch/detekt/libraries/LibraryCodeMustSpecifyReturnTypeSpec.kt index fd580d16d27..b03c6c6a306 100644 --- a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/LibraryCodeMustSpecifyReturnTypeSpec.kt +++ b/detekt-rules-libraries/src/test/kotlin/io/gitlab/arturbosch/detekt/libraries/LibraryCodeMustSpecifyReturnTypeSpec.kt @@ -1,4 +1,4 @@ -package io.gitlab.arturbosch.detekt.rules.style +package io.gitlab.arturbosch.detekt.libraries import io.gitlab.arturbosch.detekt.api.Config import io.gitlab.arturbosch.detekt.rules.KotlinCoreEnvironmentTest diff --git a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/LibraryEntitiesShouldNotBePublicSpec.kt b/detekt-rules-libraries/src/test/kotlin/io/gitlab/arturbosch/detekt/libraries/LibraryEntitiesShouldNotBePublicSpec.kt similarity index 98% rename from detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/LibraryEntitiesShouldNotBePublicSpec.kt rename to detekt-rules-libraries/src/test/kotlin/io/gitlab/arturbosch/detekt/libraries/LibraryEntitiesShouldNotBePublicSpec.kt index 7cd20e4a41e..279d36b9260 100644 --- a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/LibraryEntitiesShouldNotBePublicSpec.kt +++ b/detekt-rules-libraries/src/test/kotlin/io/gitlab/arturbosch/detekt/libraries/LibraryEntitiesShouldNotBePublicSpec.kt @@ -1,4 +1,4 @@ -package io.gitlab.arturbosch.detekt.rules.style +package io.gitlab.arturbosch.detekt.libraries import io.gitlab.arturbosch.detekt.api.Config import io.gitlab.arturbosch.detekt.test.TestConfig diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/StyleGuideProvider.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/StyleGuideProvider.kt index f505fac8a03..f18b8ff5cc7 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/StyleGuideProvider.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/StyleGuideProvider.kt @@ -41,7 +41,6 @@ class StyleGuideProvider : DefaultRuleSetProvider { ForbiddenComment(config), ForbiddenImport(config), ForbiddenMethodCall(config), - ForbiddenPublicDataClass(config), ForbiddenSuppress(config), FunctionOnlyReturningConstant(config), SpacingBetweenPackageAndImports(config), @@ -89,8 +88,6 @@ class StyleGuideProvider : DefaultRuleSetProvider { UseCheckOrError(config), UseIfInsteadOfWhen(config), RedundantExplicitType(config), - LibraryEntitiesShouldNotBePublic(config), - LibraryCodeMustSpecifyReturnType(config), UseArrayLiteralsInAnnotations(config), UseEmptyCounterpart(config), UseCheckNotNull(config), diff --git a/settings.gradle.kts b/settings.gradle.kts index e34b56f29b4..b2bf7ee4b27 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -28,6 +28,7 @@ include("detekt-rules-documentation") include("detekt-rules-empty") include("detekt-rules-errorprone") include("detekt-rules-exceptions") +include("detekt-rules-libraries") include("detekt-rules-naming") include("detekt-rules-performance") include("detekt-rules-ruleauthors") From fdd71ef554904436f88ff517940797af0cfdb9e7 Mon Sep 17 00:00:00 2001 From: "Vitaly V. Pinchuk" Date: Tue, 4 Oct 2022 19:43:22 +0300 Subject: [PATCH 2/4] Warn users of migrated rules Hardcoded strings of migrated rules are added to deprecation.properties. --- .../src/main/resources/deprecation.properties | 3 +++ .../generator/printer/DeprecatedPrinter.kt | 17 +++++++++++++---- .../generator/printer/DeprecatedPrinterSpec.kt | 3 +-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/detekt-core/src/main/resources/deprecation.properties b/detekt-core/src/main/resources/deprecation.properties index 806f7a37515..6fcf5c93d11 100644 --- a/detekt-core/src/main/resources/deprecation.properties +++ b/detekt-core/src/main/resources/deprecation.properties @@ -13,3 +13,6 @@ style>UnnecessaryAbstractClass>excludeAnnotatedClasses=Use `ignoreAnnotated` ins style>UseDataClass>excludeAnnotatedClasses=Use `ignoreAnnotated` instead formatting>Indentation>continuationIndentSize=`continuationIndentSize` is ignored by KtLint and will have no effect formatting>ParameterListWrapping>indentSize=`indentSize` is ignored by KtLint and will have no effect +style>ForbiddenPublicDataClass=Rule migrated to `libraries` ruleset plugin +style>LibraryCodeMustSpecifyReturnType=Rule migrated to `libraries` ruleset plugin +style>LibraryEntitiesShouldNotBePublic=Rule migrated to `libraries` ruleset plugin diff --git a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/DeprecatedPrinter.kt b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/DeprecatedPrinter.kt index 0d0a0e02401..1acf5bf9ff7 100644 --- a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/DeprecatedPrinter.kt +++ b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/DeprecatedPrinter.kt @@ -11,7 +11,7 @@ object DeprecatedPrinter : DocumentationPrinter> { item.forEach { ruleSet -> ruleSet.rules.forEach { rule -> if (rule.isDeprecated()) { - builder.appendLine(writeRuleProperty(ruleSet, rule)) + builder.appendLine(writeRule(ruleSet, rule)) } rule.configuration.forEach { configuration -> if (configuration.isDeprecated()) { @@ -20,16 +20,25 @@ object DeprecatedPrinter : DocumentationPrinter> { } } } + builder.appendLine(writeMigratedRules()) return builder.toString() } } +private fun writeRule(ruleSet: RuleSetPage, rule: Rule): String { + @Suppress("UnsafeCallOnNullableType") + return "${ruleSet.ruleSet.name}>${rule.name}=${rule.deprecationMessage!!}" +} + private fun writeProperty(ruleSet: RuleSetPage, rule: Rule, configuration: Configuration): String { @Suppress("UnsafeCallOnNullableType") return "${ruleSet.ruleSet.name}>${rule.name}>${configuration.name}=${configuration.deprecated!!}" } -private fun writeRuleProperty(ruleSet: RuleSetPage, rule: Rule): String { - @Suppress("UnsafeCallOnNullableType") - return "${ruleSet.ruleSet.name}>${rule.name}=${rule.deprecationMessage!!}" +internal fun writeMigratedRules(): String { + return """ + style>ForbiddenPublicDataClass=Rule migrated to `libraries` ruleset plugin + style>LibraryCodeMustSpecifyReturnType=Rule migrated to `libraries` ruleset plugin + style>LibraryEntitiesShouldNotBePublic=Rule migrated to `libraries` ruleset plugin + """.trimIndent() } diff --git a/detekt-generator/src/test/kotlin/io/gitlab/arturbosch/detekt/generator/printer/DeprecatedPrinterSpec.kt b/detekt-generator/src/test/kotlin/io/gitlab/arturbosch/detekt/generator/printer/DeprecatedPrinterSpec.kt index ec694b070b9..072ac2892ed 100644 --- a/detekt-generator/src/test/kotlin/io/gitlab/arturbosch/detekt/generator/printer/DeprecatedPrinterSpec.kt +++ b/detekt-generator/src/test/kotlin/io/gitlab/arturbosch/detekt/generator/printer/DeprecatedPrinterSpec.kt @@ -13,8 +13,7 @@ class DeprecatedPrinterSpec { style>MagicNumber>conf2=use conf1 instead style>MagicNumber>conf4=use conf3 instead style>DuplicateCaseInWhenExpression=is deprecated - - """.trimIndent() + """.trimIndent() + "\n${writeMigratedRules()}\n" assertThat(markdownString).isEqualTo(expectedMarkdownString) } } From 8ea3ede2c27c391e8821848d358c5267ae5eac67 Mon Sep 17 00:00:00 2001 From: "Vitaly V. Pinchuk" Date: Fri, 7 Oct 2022 13:15:27 +0300 Subject: [PATCH 3/4] Warn users of migrated rules Hardcoded strings of migrated rules are added to deprecation.properties. --- config/detekt/detekt.yml | 10 ++++++++++ detekt-cli/build.gradle.kts | 10 ++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/config/detekt/detekt.yml b/config/detekt/detekt.yml index d8971e230ef..c95a34898a2 100644 --- a/config/detekt/detekt.yml +++ b/config/detekt/detekt.yml @@ -267,3 +267,13 @@ style: WildcardImport: active: true excludeImports: [] + +libraries: + ForbiddenPublicDataClass: + active: false + LibraryEntitiesShouldNotBePublic: + active: false + LibraryCodeMustSpecifyReturnType: + active: true + excludes: ['**/*.kt'] + includes: ['**/detekt-api/src/main/**/api/*.kt'] diff --git a/detekt-cli/build.gradle.kts b/detekt-cli/build.gradle.kts index d14b3203fe9..84eff4213cd 100644 --- a/detekt-cli/build.gradle.kts +++ b/detekt-cli/build.gradle.kts @@ -8,7 +8,7 @@ application { mainClass.set("io.gitlab.arturbosch.detekt.cli.Main") } -val formattingJar by configurations.creating { +val pluginsJar: Configuration by configurations.creating { isTransitive = false } @@ -27,7 +27,9 @@ dependencies { testImplementation(projects.detektTestUtils) testImplementation(libs.assertj) - formattingJar(projects.detektFormatting) + pluginsJar(projects.detektFormatting) + pluginsJar(projects.detektRulesLibraries) + pluginsJar(projects.detektRulesRuleauthors) } val javaComponent = components["java"] as AdhocComponentWithVariants @@ -54,11 +56,11 @@ tasks { val runWithArgsFile by registering(JavaExec::class) { // The task generating these jar files run first. - inputs.files(formattingJar) + inputs.files(pluginsJar) doNotTrackState("The entire root directory is read as the input source.") classpath = files(shadowJar) workingDir = rootDir - args = listOf("@./config/detekt/argsfile", "-p", formattingJar.singleFile.path) + args = listOf("@./config/detekt/argsfile", "-p", pluginsJar.files.joinToString(",") { it.path }) } check { From e792b9f44ffecf60edef8c4b2f58b32cb3a2aba6 Mon Sep 17 00:00:00 2001 From: "Vitaly V. Pinchuk" Date: Fri, 7 Oct 2022 13:38:12 +0300 Subject: [PATCH 4/4] Fix dependency bug Include :detekt-rules-libraries project in the root build.gradle.kts --- build.gradle.kts | 1 + detekt-generator/build.gradle.kts | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 67b953611db..cb365b52646 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -27,6 +27,7 @@ allprojects { dependencies { detekt(project(":detekt-cli")) detektPlugins(project(":detekt-formatting")) + detektPlugins(project(":detekt-rules-libraries")) detektPlugins(project(":detekt-rules-ruleauthors")) } diff --git a/detekt-generator/build.gradle.kts b/detekt-generator/build.gradle.kts index 81c6040123a..8c04b028340 100644 --- a/detekt-generator/build.gradle.kts +++ b/detekt-generator/build.gradle.kts @@ -36,7 +36,13 @@ val ruleModules = rootProject.subprojects .map { "${rootProject.rootDir}/$it/src/main/kotlin" } val generateDocumentation by tasks.registering(JavaExec::class) { - dependsOn(tasks.assemble, ":detekt-api:dokkaHtml", tasks.shadowJar, ":detekt-rules-ruleauthors:sourcesJar") + dependsOn( + tasks.assemble, + tasks.shadowJar, + ":detekt-api:dokkaHtml", + ":detekt-rules-libraries:sourcesJar", + ":detekt-rules-ruleauthors:sourcesJar", + ) description = "Generates detekt documentation and the default config.yml based on Rule KDoc" group = "documentation"