detekt/detekt
### [`v1.22.0`](https://togithub.com/detekt/detekt/releases/tag/v1.22.0)
We're extremely excited to announce the next upcoming stable release of Detekt: 1.22.0 🚀
This release is coming with 16 new rules, 2 new rulesets and several new functionalities & APIs.
We've also introduced the [**Detekt Marketplace**](https://detekt.dev/marketplace), a place for users to share their 3rd party rules and extensions.
We want to take the opportunity to thank [our Sponsors](https://togithub.com/sponsors/detekt) and our Contributors for testing, bug reporting and helping us release this new version of Detekt. You're more than welcome to join our community on the [#detekt](https://kotlinlang.slack.com/archives/C88E12QH4) channel on KotlinLang's Slack (you can [get an invite here](https://surveys.jetbrains.com/s3/kotlin-slack-sign-up)).
##### Notable Changes
- We're introducing the [**Detekt Marketplace**](https://detekt.dev/marketplace), a place where you can add your own 3rd party extension such as rule, plugins, custom reporter, etc. - [#5191](https://togithub.com/detekt/detekt/pull/5191)
- Our website is now versioned. You can find the changes for each version using the dropdown menu on the top bar. Documentation for the upcoming version (next) [can be found here](https://detekt.dev/docs/next/intro).
- We added **16** new Rules to Detekt
- `AlsoCouldBeApply` - [#5333](https://togithub.com/detekt/detekt/pull/5333)
- `MultilineRawStringIndentation` - [#5058](https://togithub.com/detekt/detekt/pull/5058)
- `TrimMultilineRawString` - [#5051](https://togithub.com/detekt/detekt/pull/5051)
- `UnnecessaryNotNullCheck` - [#5218](https://togithub.com/detekt/detekt/pull/5218)
- `UnnecessaryPartOfBinaryExpression` - [#5203](https://togithub.com/detekt/detekt/pull/5203)
- `UseSumOfInsteadOfFlatMapSize` - [#5405](https://togithub.com/detekt/detekt/pull/5405)
- `FunctionReturnTypeSpacing` from KtLint - [#5256](https://togithub.com/detekt/detekt/pull/5256)
- `FunctionSignature` from KtLint - [#5256](https://togithub.com/detekt/detekt/pull/5256)
- `FunctionStartOfBodySpacing` from KtLint - [#5256](https://togithub.com/detekt/detekt/pull/5256)
- `NullableTypeSpacing` from KtLint - [#5256](https://togithub.com/detekt/detekt/pull/5256)
- `ParameterListSpacing` from KtLint - [#5256](https://togithub.com/detekt/detekt/pull/5256)
- `SpacingBetweenFunctionNameAndOpeningParenthesis` from KtLint - [#5256](https://togithub.com/detekt/detekt/pull/5256)
- `TrailingCommaOnCallSite` from KtLint - [#5312](https://togithub.com/detekt/detekt/pull/5312)
- `TrailingCommaOnDeclarationSite` from KtLint - [#5312](https://togithub.com/detekt/detekt/pull/5312)
- `TypeParameterListSpacing` from KtLint - [#5256](https://togithub.com/detekt/detekt/pull/5256)
- We added a new ruleset called `detekt-rules-ruleauthors` containing rules for Rule Authors to enforce best practices on Detekt rules such as the new `ViolatesTypeResolutionRequirements` - [#5129](https://togithub.com/detekt/detekt/pull/5129) [#5182](https://togithub.com/detekt/detekt/pull/5182)
- We added a new ruleset called `detekt-rules-libraries` containing rules mostly useful for Library Authors - We moved the following rules inside `ForbiddenPublicDataClass`, `LibraryCodeMustSpecifyReturnType`, `LibraryEntitiesShouldNotBePublic` this new ruleset - See Migration below on how to migrate [#5360](https://togithub.com/detekt/detekt/pull/5360)
- We added support for JVM toolchain. This means that Detekt will now respect the JDK toolchain you specify on your Gradle configuration. You will also be able to specify a custom JDK home with the `--jdk-home` CLI parameter - [#5269](https://togithub.com/detekt/detekt/pull/5269)
- Improvement for Type Resolution
- We will now skip rules annotated with `@RequiresTypeResolution` when without Type Resolution - [#5176](https://togithub.com/detekt/detekt/pull/5176)
- We will warn users if they run rules requiring Type Resolution when Type Resolution is disabled, so they're not silently skipped - [#5226](https://togithub.com/detekt/detekt/pull/5226)
- Improvement for Config Management
- We added exhaustiveness check during config validation. You can enable it `checkExhaustiveness: true` in your config file. This is disabled by default. - [#5089](https://togithub.com/detekt/detekt/pull/5089)
- We added support for generating custom configuration for rule authors - [#5080](https://togithub.com/detekt/detekt/pull/5080)
- Deprecations & Removals
- We deprecated the MultiRule class as it was overly complicated. The suggested approach is to just provide separated rules. - [#5161](https://togithub.com/detekt/detekt/pull/5161)
- The `--fail-fast` CLI flag (and `failFast` Gradle property) has been removed. It was deprecated since 1.16.x - [#5290](https://togithub.com/detekt/detekt/pull/5290)
- We **deprecated** the following rules `DuplicateCaseInWhenExpression`, `MissingWhenCase`, `RedundantElseInWhen` as the Kotlin Compiler is already reporting errors for those scenarios - [#5309](https://togithub.com/detekt/detekt/pull/5309)
- We removed the `--print-ast` CLI flag as [PsiViewer](https://www.jetbrains.com/help/idea/psi-viewer.html) provides the same features - [#5418](https://togithub.com/detekt/detekt/pull/5418)
- Notable changes to existing rules
- `ArrayPrimitive` is now working only with Type Resolution - [#5175](https://togithub.com/detekt/detekt/pull/5175)
- `WildcardImport` is now running also on tests by default - [#5121](https://togithub.com/detekt/detekt/pull/5121)
- `ForbiddenImport` allows now to specify a reason for every forbidden import - [#4909](https://togithub.com/detekt/detekt/pull/4909)
- `IgnoredReturnValue`: option `restrictToAnnotatedMethods` is now deprecated in favor of `restrictToConfig` - [#4922](https://togithub.com/detekt/detekt/pull/4922)
- This version of Detekt is built with Gradle `v7.5.1`, AGP `7.3.1`, Kotlin `1.7.21` and KtLint `0.47.1` (see [#5363](https://togithub.com/detekt/detekt/pull/5363) [#5189](https://togithub.com/detekt/detekt/pull/5189) [#5411](https://togithub.com/detekt/detekt/pull/5411) [#5312](https://togithub.com/detekt/detekt/pull/5312) [#5519](https://togithub.com/detekt/detekt/pull/5519))
- The minimum supported Gradle version is now `v6.7.1` - [#4964](https://togithub.com/detekt/detekt/pull/4964)
##### Migration
We deprecated a number of rules in this release.
You should update your config file as follows:
```diff
potential-bugs:
active: true
...
- DuplicateCaseInWhenExpression:
- active: true
...
- MissingWhenCase:
- active: true
- allowElseExpression: true
...
- RedundantElseInWhen:
- active: true
style:
active: true
...
- ForbiddenPublicDataClass:
- active: true
- excludes: ['**']
- ignorePackages:
- - '*.internal'
- - '*.internal.*'
...
- LibraryCodeMustSpecifyReturnType:
- active: true
- excludes: ['**']
...
- LibraryEntitiesShouldNotBePublic:
- active: true
- excludes: ['**']
```
If you wish to use the `libraries` ruleset we introduced you should add the following to your config file:
```diff
+ libraries:
+ active: true
+ ForbiddenPublicDataClass:
+ active: false
+ LibraryEntitiesShouldNotBePublic:
+ active: false
+ LibraryCodeMustSpecifyReturnType:
+ active: true
```
and add the following to you `build.gradle` file:
```kotlin
detektPlugins("io.gitlab.arturbosch.detekt:detekt-rules-libraries:$version")
```
If you're using our KtLint wrapper (i.e. `detekt-formatting`) you should also update your config file as follows:
```diff
formatting:
active: true
...
- TrailingComma:
- active: false
- autoCorrect: true
- allowTrailingComma: false
- allowTrailingCommaOnCallSite: false
...
+ TrailingCommaOnCallSite:
+ active: false
+ autoCorrect: true
+ useTrailingCommaOnCallSite: false
+ TrailingCommaOnDeclarationSite:
+ active: false
+ autoCorrect: true
+ useTrailingCommaOnDeclarationSite: false
```
##### Changelog
- ReturnCount: correctly count assignment expressions with elvis return as guard clauses - [#5539](https://togithub.com/detekt/detekt/pull/5539)
- UnnecessaryPartOfBinaryExpression: fix false positive with pair creation - [#5516](https://togithub.com/detekt/detekt/pull/5516)
- False positive at `UnnecessaryPartOfBinaryExpression` - [#5514](https://togithub.com/detekt/detekt/issues/5514)
- Update documentation for TrailingComma rules - [#5513](https://togithub.com/detekt/detekt/pull/5513)
- `TrimMultilineRawString` false-positive on annotation parameters - [#5476](https://togithub.com/detekt/detekt/issues/5476)
- Detekt 1.22.0-RC1 -> 1.22.0-RC2 breaks UnreachableCode - [#5435](https://togithub.com/detekt/detekt/issues/5435)
- Detekt 1.22.0-RC1 -> 1.22.0-RC2 breaks ignoreAnnotated - [#5427](https://togithub.com/detekt/detekt/issues/5427)
- Fix issues introduced by [#5152](https://togithub.com/detekt/detekt/issues/5152) - [#5508](https://togithub.com/detekt/detekt/pull/5508)
- MultilineLambdaItParameter: fix false positive for one-line statements with a lambda argument - [#5505](https://togithub.com/detekt/detekt/pull/5505)
- UseArrayLiteralsInAnnotations: fix false negative with primitive array factory calls - [#5482](https://togithub.com/detekt/detekt/pull/5482)
- TrimMultilineRawString: fix false positive when it's expected as constant - [#5480](https://togithub.com/detekt/detekt/pull/5480)
- Fix false negative `SafeCast` with no braces - [#5479](https://togithub.com/detekt/detekt/pull/5479)
- Update gradle/wrapper-validation-action digest to [`55e685c`](https://togithub.com/detekt/detekt/commit/55e685c) - [#5472](https://togithub.com/detekt/detekt/pull/5472)
- Grant permission for type resolution Gradle job - [#5470](https://togithub.com/detekt/detekt/pull/5470)
- Fix ObjectPropertyNaming Rule false positive - [#5466](https://togithub.com/detekt/detekt/pull/5466)
- Fix LambdaParameterNaming rule false positive - [#5465](https://togithub.com/detekt/detekt/pull/5465)
- Fix ReturnCount false positive when excludeReturnFromLambda is enabled - [#5459](https://togithub.com/detekt/detekt/pull/5459)
- CognitiveComplexity: count else/else-if as one complexity - [#5458](https://togithub.com/detekt/detekt/pull/5458)
- Fix false positive MultilineRawStringIndentation with tab indentation - [#5453](https://togithub.com/detekt/detekt/pull/5453)
- Don't show the number of issues generating the BindingContext - [#5449](https://togithub.com/detekt/detekt/pull/5449)
- Make detekt less noisy - [#5448](https://togithub.com/detekt/detekt/pull/5448)
- New ruleauthors rule for Entity.from(x.nameIdentifier ?: x) -> Entity.atName(x) - [#5444](https://togithub.com/detekt/detekt/pull/5444)
- Separating ComplexMethod rule into CyclomaticComplexMethod and CognitiveComplexMethod - [#5442](https://togithub.com/detekt/detekt/pull/5442)
- Improve error reporting for CascadingCallWrapping - [#5439](https://togithub.com/detekt/detekt/pull/5439)
- TrimMultilineRawString: fix false positive with not a raw string - [#5438](https://togithub.com/detekt/detekt/pull/5438)
- BooleanPropertyNaming highlight only the name of the variable - [#5431](https://togithub.com/detekt/detekt/pull/5431)
- Deprecate `TrailingComma` as it's now split in two rules - [#5423](https://togithub.com/detekt/detekt/pull/5423)
- Remove unused constant - [#5421](https://togithub.com/detekt/detekt/pull/5421)
- Report if/else as issue location instead of block - [#5407](https://togithub.com/detekt/detekt/pull/5407)
- Remove some unnecessary suppressions - [#5400](https://togithub.com/detekt/detekt/pull/5400)
- Check FormattingRule is auto-correctable by information provided by ktlint - [#5398](https://togithub.com/detekt/detekt/pull/5398)
- Fix false negative MultilineLambdaItParameter on complex multiline single statement - [#5397](https://togithub.com/detekt/detekt/pull/5397)
- ObjectPropertyNaming: fix false positive with top level properties - [#5390](https://togithub.com/detekt/detekt/pull/5390)
- Remove usage of MPP targets function for JVM-only projects - [#5383](https://togithub.com/detekt/detekt/pull/5383)
- UnnecessaryNotNullCheck: fix false negative with smart casted arguments - [#5380](https://togithub.com/detekt/detekt/pull/5380)
- Add missing overlapping info & fix rules URLs - [#5378](https://togithub.com/detekt/detekt/pull/5378)
- AlsoCouldBeApply: fix false positive when all statements are not `it`-started expressions - [#5376](https://togithub.com/detekt/detekt/pull/5376)
- UnusedPrivateMember: fix false negative with named arguments - [#5374](https://togithub.com/detekt/detekt/pull/5374)
- Change requires type resolution rule warning to debug level to not spam the user console - [#5353](https://togithub.com/detekt/detekt/pull/5353)
- Report UseDataClass findings on class name - [#5352](https://togithub.com/detekt/detekt/pull/5352)
- Report LabeledExpression as the label instead of the whole expression - [#5351](https://togithub.com/detekt/detekt/pull/5351)
- Report CastToNullableType at the cast operator instead of the whole expression - [#5350](https://togithub.com/detekt/detekt/pull/5350)
- Convert previously known string property to list based on default value - [#5347](https://togithub.com/detekt/detekt/pull/5347)
- CastToNullableType: highlights too much - [#5346](https://togithub.com/detekt/detekt/issues/5346)
- UseDataClass flags the whole class body, not just the name - [#5338](https://togithub.com/detekt/detekt/issues/5338)
- CanBeNonNullable: explain why the rule does what it does. - [#5332](https://togithub.com/detekt/detekt/pull/5332)
- Differentiate between correctable and non-correctable KtLint rules - [#5324](https://togithub.com/detekt/detekt/pull/5324)
- ReturnCount 1.22.0 crashes on valid 1.21.0 config property excludedFunctions when using --all-rules cli flag - [#5323](https://togithub.com/detekt/detekt/issues/5323)
- LabeledExpression to highlight only label - [#5316](https://togithub.com/detekt/detekt/issues/5316)
- Use the correct source directory set on JVM - [#5163](https://togithub.com/detekt/detekt/pull/5163)
- Get Android variant compile classpath from compileConfiguration - [#5152](https://togithub.com/detekt/detekt/pull/5152)
- Use list config for `FunctionOnlyReturningConstant>excludedFunctions` - [#5120](https://togithub.com/detekt/detekt/pull/5120)
- MaxLineLength: raw typo and test cleanup - [#5315](https://togithub.com/detekt/detekt/pull/5315)
- EndOfSentenceFormat: fix HTML tag heuristic - [#5313](https://togithub.com/detekt/detekt/pull/5313)
- Fix EndOfSentenceFormat highlight - [#5311](https://togithub.com/detekt/detekt/pull/5311)
- Introduce configFile property on DetektGenerateTask - [#5308](https://togithub.com/detekt/detekt/pull/5308)
- Improve debug suggestion message - [#5300](https://togithub.com/detekt/detekt/pull/5300)
- Fat-Jar version of detekt-generator module - [#5297](https://togithub.com/detekt/detekt/pull/5297)
- Toolchains docs - [#5293](https://togithub.com/detekt/detekt/pull/5293)
- Adopt new AGP dsl - [#5288](https://togithub.com/detekt/detekt/pull/5288)
- NonBooleanPropertyPrefixedWithIs: Allow boolean functions - [#5285](https://togithub.com/detekt/detekt/pull/5285)
- Provide the current classpath inside `KotlinEnvironmentResolver` - [#5275](https://togithub.com/detekt/detekt/pull/5275)
- Fix false-positive on `NestedScopeFunctions` - [#5274](https://togithub.com/detekt/detekt/pull/5274)
- Use convention method to set task property defaults - [#5272](https://togithub.com/detekt/detekt/pull/5272)
- Update docusaurus monorepo to v2.1.0 - [#5270](https://togithub.com/detekt/detekt/pull/5270)
- detektVersionReplace.js plugin is not replacing all \[detekt_version] tags on website - [#5266](https://togithub.com/detekt/detekt/pull/5266)
- Update ktlint rule doc links - [#5258](https://togithub.com/detekt/detekt/pull/5258)
- Remove redundant rule config for rules enabled by default - [#5257](https://togithub.com/detekt/detekt/pull/5257)
- UnusedPrivateMember: fix false positive with backtick parameters - [#5252](https://togithub.com/detekt/detekt/pull/5252)
- Improve MultilineRawStringIndentation - [#5245](https://togithub.com/detekt/detekt/pull/5245)
- UnnecessaryLet: fix false positive with with invoke operator calls - [#5240](https://togithub.com/detekt/detekt/pull/5240)
- Introduce baseline tooling api - [#5239](https://togithub.com/detekt/detekt/pull/5239)
- Allow secondary constructors to reference CoroutineDispatchers - [#5227](https://togithub.com/detekt/detekt/pull/5227)
- Update `UnnecessaryAbstractClass` issue description to be less verbose - [#5224](https://togithub.com/detekt/detekt/pull/5224)
- Update plugin com.gradle.common-custom-user-data-gradle-plugin to v1.8.0 - [#5223](https://togithub.com/detekt/detekt/pull/5223)
- Pin dependencies - [#5222](https://togithub.com/detekt/detekt/pull/5222)
- Remove rule from NamingRules multi rule - [#5212](https://togithub.com/detekt/detekt/pull/5212)
- Run all rules from EmptyBlocks multi rule individually - [#5208](https://togithub.com/detekt/detekt/pull/5208)
- Run all rules from KDocStyle multi rule individually - [#5207](https://togithub.com/detekt/detekt/pull/5207)
- Docs: GitHub - Add link to configure Sarif severity alert level - [#5206](https://togithub.com/detekt/detekt/pull/5206)
- Fix errors with `detektGenerateConfig` - [#5199](https://togithub.com/detekt/detekt/pull/5199)
- Forbid constructors with `ForbiddenMethodCall` - [#5195](https://togithub.com/detekt/detekt/pull/5195)
- Update github/codeql-action digest to [`2ca79b6`](https://togithub.com/detekt/detekt/commit/2ca79b6) - [#5177](https://togithub.com/detekt/detekt/pull/5177)
- Allow to ignore overloaded methods for the complex interface rule ([#5165](https://togithub.com/detekt/detekt/issues/5165)) - [#5173](https://togithub.com/detekt/detekt/pull/5173)
- Add excludesRawStrings in MaxLineLength - [#5171](https://togithub.com/detekt/detekt/pull/5171)
- Enable Predictive Test Selection for local builds - [#5170](https://togithub.com/detekt/detekt/pull/5170)
- Update dependency org.kohsuke:github-api to v1.307 - [#5168](https://togithub.com/detekt/detekt/pull/5168)
- Update dependency com.github.ajalt:clikt to v2.8.0 - [#5167](https://togithub.com/detekt/detekt/pull/5167)
- Update docusaurus monorepo to v2.0.1 - [#5166](https://togithub.com/detekt/detekt/pull/5166)
- Run build-logic Kotlin compilation out of process on CI - [#5162](https://togithub.com/detekt/detekt/pull/5162)
- Add information about exhaustiveness check to documentation - [#5160](https://togithub.com/detekt/detekt/pull/5160)
- Use getter when determining whether custom config path is set in DetektGenerateConfigTask - [#5157](https://togithub.com/detekt/detekt/pull/5157)
- Limit Kotlin version warning suppression scope in build - [#5156](https://togithub.com/detekt/detekt/pull/5156)
- Re-enable warnings as errors for detekt-gradle-plugin - [#5155](https://togithub.com/detekt/detekt/pull/5155)
- Bundle slf4j-nop in detekt-formatting JAR - [#5153](https://togithub.com/detekt/detekt/pull/5153)
- Fix false negative for UseRequire when thrown in conditional block - [#5147](https://togithub.com/detekt/detekt/pull/5147)
- Allow parentheses for unclear precedence with range operator - [#5143](https://togithub.com/detekt/detekt/pull/5143)
- Mark apiDump task as incompatible with configuration cache - [#5134](https://togithub.com/detekt/detekt/pull/5134)
- Improve binding context management - [#5130](https://togithub.com/detekt/detekt/pull/5130)
- `RedundantExplicitType` add annotation `@RequiresTypeResolution` - [#5128](https://togithub.com/detekt/detekt/pull/5128)
- Disable `ExitOutsideMain` if `contextBinding` is empty - [#5127](https://togithub.com/detekt/detekt/pull/5127)
- Use list config for `DataClassContainsFunctions>conversionFunctionPrefix` - [#5119](https://togithub.com/detekt/detekt/pull/5119)
- Support proper globbing in `ReturnCount` - [#5118](https://togithub.com/detekt/detekt/pull/5118)
- Improve finding message of ExplicitItLambdaParameter - [#5117](https://togithub.com/detekt/detekt/pull/5117)
- Update JamesIves/github-pages-deploy-action digest to [`13046b6`](https://togithub.com/detekt/detekt/commit/13046b6) - [#5110](https://togithub.com/detekt/detekt/pull/5110)
- UnusedUnaryOperator: fix false positive with var assignment and if expression - [#5106](https://togithub.com/detekt/detekt/pull/5106)
- Tag publishPlugins task as incompatible with configuration cache - [#5101](https://togithub.com/detekt/detekt/pull/5101)
- Make verifyGeneratorOutput task configuration cache compatible - [#5100](https://togithub.com/detekt/detekt/pull/5100)
- Remove obsolete FeatureInAlphaState opt in - [#5099](https://togithub.com/detekt/detekt/pull/5099)
- Remove explicit RequiresOptIn compiler flag - [#5098](https://togithub.com/detekt/detekt/pull/5098)
- Use Gradle's configuration cache by default - [#5095](https://togithub.com/detekt/detekt/pull/5095)
- Detect undocumented protected classes, properties, and functions - [#5083](https://togithub.com/detekt/detekt/pull/5083)
- ReturnCount.excludedFunctions should be a List\ - [#5081](https://togithub.com/detekt/detekt/pull/5081)
- Make ForbiddenMethodCall to support property getters/setters and method references - [#5078](https://togithub.com/detekt/detekt/pull/5078)
- Refactor Gradle tasks to use Gradle's managed properties - [#4966](https://togithub.com/detekt/detekt/pull/4966)
- Add option to add a reason to `ForbiddenMethodCall` - [#4910](https://togithub.com/detekt/detekt/pull/4910)
- UnnecessaryParentheses: add options to allow in ambiguous cases - [#4881](https://togithub.com/detekt/detekt/pull/4881)
##### Dependency Updates
- Update dependency com.android.tools.build:gradle to v7.3.1 - [#5411](https://togithub.com/detekt/detekt/pull/5411)
- Update plugin com.gradle.enterprise to v3.11.2 - [#5406](https://togithub.com/detekt/detekt/pull/5406)
- Update dependency org.jetbrains.dokka to v1.7.20 - [#5401](https://togithub.com/detekt/detekt/pull/5401)
- Update dependency org.yaml:snakeyaml to v1.33 - [#5354](https://togithub.com/detekt/detekt/pull/5354)
- Update dependency org.spekframework.spek2:spek-dsl-jvm to v2.0.19 - [#5237](https://togithub.com/detekt/detekt/pull/5237)
- Update dependency com.android.tools.build:gradle to v7.2.2 - [#5178](https://togithub.com/detekt/detekt/pull/5178)
- Update org.jetbrains.kotlinx - [#5072](https://togithub.com/detekt/detekt/pull/5072)
- Update dependency org.jetbrains.dokka to v1.7.10 - [#5070](https://togithub.com/detekt/detekt/pull/5070)
- Bump ktlint to version 0.46.1 - [#5044](https://togithub.com/detekt/detekt/pull/5044)
- AssertJ 3.23.1 - [#4265](https://togithub.com/detekt/detekt/pull/4265)
##### Housekeeping & Refactorings
- Document and test edge cases for ForbiddenMethodCall function signatures - [#5495](https://togithub.com/detekt/detekt/pull/5495)
- Fix invalid syntaxes in test code - [#5446](https://togithub.com/detekt/detekt/pull/5446)
- Improve raw strings format - [#5244](https://togithub.com/detekt/detekt/pull/5244)
- Enable trim multiline raw string - [#5243](https://togithub.com/detekt/detekt/pull/5243)
- Remove old configurations - [#5198](https://togithub.com/detekt/detekt/pull/5198)
- Improve tests in UnnecessaryParenthesesSpec - [#5197](https://togithub.com/detekt/detekt/pull/5197)
- Remove multi rule FileParsingRule - [#5193](https://togithub.com/detekt/detekt/pull/5193)
- Remove unused dry run properties from baseline/config tasks - [#5158](https://togithub.com/detekt/detekt/pull/5158)
- remove SimpleGlob in favor of String.simplePatternToRegex() - [#5144](https://togithub.com/detekt/detekt/pull/5144)
- Remove unused property - [#5135](https://togithub.com/detekt/detekt/pull/5135)
- Assert end source locations - [#5116](https://togithub.com/detekt/detekt/pull/5116)
- Forbid usage of DiagnosticUtils.getLineAndColumnInPsiFile - [#5109](https://togithub.com/detekt/detekt/pull/5109)
- Configure 'ForbiddenImport' to use value and reason - [#5105](https://togithub.com/detekt/detekt/pull/5105)
- Enable Kotlin's new approach to incremental compilation - [#5092](https://togithub.com/detekt/detekt/pull/5092)
- Fix current indentation - [#5059](https://togithub.com/detekt/detekt/pull/5059)
See all issues at: [1.22.0](https://togithub.com/detekt/detekt/milestone/87)
Configuration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
[ ] If you want to rebase/retry this PR, check this box
This PR has been generated by Mend Renovate. View repository job log here.
This PR contains the following updates:
1.21.0
->1.22.0
1.21.0
->1.22.0
Release Notes
detekt/detekt
### [`v1.22.0`](https://togithub.com/detekt/detekt/releases/tag/v1.22.0) We're extremely excited to announce the next upcoming stable release of Detekt: 1.22.0 🚀 This release is coming with 16 new rules, 2 new rulesets and several new functionalities & APIs. We've also introduced the [**Detekt Marketplace**](https://detekt.dev/marketplace), a place for users to share their 3rd party rules and extensions. We want to take the opportunity to thank [our Sponsors](https://togithub.com/sponsors/detekt) and our Contributors for testing, bug reporting and helping us release this new version of Detekt. You're more than welcome to join our community on the [#detekt](https://kotlinlang.slack.com/archives/C88E12QH4) channel on KotlinLang's Slack (you can [get an invite here](https://surveys.jetbrains.com/s3/kotlin-slack-sign-up)). ##### Notable Changes - We're introducing the [**Detekt Marketplace**](https://detekt.dev/marketplace), a place where you can add your own 3rd party extension such as rule, plugins, custom reporter, etc. - [#5191](https://togithub.com/detekt/detekt/pull/5191) - Our website is now versioned. You can find the changes for each version using the dropdown menu on the top bar. Documentation for the upcoming version (next) [can be found here](https://detekt.dev/docs/next/intro). - We added **16** new Rules to Detekt - `AlsoCouldBeApply` - [#5333](https://togithub.com/detekt/detekt/pull/5333) - `MultilineRawStringIndentation` - [#5058](https://togithub.com/detekt/detekt/pull/5058) - `TrimMultilineRawString` - [#5051](https://togithub.com/detekt/detekt/pull/5051) - `UnnecessaryNotNullCheck` - [#5218](https://togithub.com/detekt/detekt/pull/5218) - `UnnecessaryPartOfBinaryExpression` - [#5203](https://togithub.com/detekt/detekt/pull/5203) - `UseSumOfInsteadOfFlatMapSize` - [#5405](https://togithub.com/detekt/detekt/pull/5405) - `FunctionReturnTypeSpacing` from KtLint - [#5256](https://togithub.com/detekt/detekt/pull/5256) - `FunctionSignature` from KtLint - [#5256](https://togithub.com/detekt/detekt/pull/5256) - `FunctionStartOfBodySpacing` from KtLint - [#5256](https://togithub.com/detekt/detekt/pull/5256) - `NullableTypeSpacing` from KtLint - [#5256](https://togithub.com/detekt/detekt/pull/5256) - `ParameterListSpacing` from KtLint - [#5256](https://togithub.com/detekt/detekt/pull/5256) - `SpacingBetweenFunctionNameAndOpeningParenthesis` from KtLint - [#5256](https://togithub.com/detekt/detekt/pull/5256) - `TrailingCommaOnCallSite` from KtLint - [#5312](https://togithub.com/detekt/detekt/pull/5312) - `TrailingCommaOnDeclarationSite` from KtLint - [#5312](https://togithub.com/detekt/detekt/pull/5312) - `TypeParameterListSpacing` from KtLint - [#5256](https://togithub.com/detekt/detekt/pull/5256) - We added a new ruleset called `detekt-rules-ruleauthors` containing rules for Rule Authors to enforce best practices on Detekt rules such as the new `ViolatesTypeResolutionRequirements` - [#5129](https://togithub.com/detekt/detekt/pull/5129) [#5182](https://togithub.com/detekt/detekt/pull/5182) - We added a new ruleset called `detekt-rules-libraries` containing rules mostly useful for Library Authors - We moved the following rules inside `ForbiddenPublicDataClass`, `LibraryCodeMustSpecifyReturnType`, `LibraryEntitiesShouldNotBePublic` this new ruleset - See Migration below on how to migrate [#5360](https://togithub.com/detekt/detekt/pull/5360) - We added support for JVM toolchain. This means that Detekt will now respect the JDK toolchain you specify on your Gradle configuration. You will also be able to specify a custom JDK home with the `--jdk-home` CLI parameter - [#5269](https://togithub.com/detekt/detekt/pull/5269) - Improvement for Type Resolution - We will now skip rules annotated with `@RequiresTypeResolution` when without Type Resolution - [#5176](https://togithub.com/detekt/detekt/pull/5176) - We will warn users if they run rules requiring Type Resolution when Type Resolution is disabled, so they're not silently skipped - [#5226](https://togithub.com/detekt/detekt/pull/5226) - Improvement for Config Management - We added exhaustiveness check during config validation. You can enable it `checkExhaustiveness: true` in your config file. This is disabled by default. - [#5089](https://togithub.com/detekt/detekt/pull/5089) - We added support for generating custom configuration for rule authors - [#5080](https://togithub.com/detekt/detekt/pull/5080) - Deprecations & Removals - We deprecated the MultiRule class as it was overly complicated. The suggested approach is to just provide separated rules. - [#5161](https://togithub.com/detekt/detekt/pull/5161) - The `--fail-fast` CLI flag (and `failFast` Gradle property) has been removed. It was deprecated since 1.16.x - [#5290](https://togithub.com/detekt/detekt/pull/5290) - We **deprecated** the following rules `DuplicateCaseInWhenExpression`, `MissingWhenCase`, `RedundantElseInWhen` as the Kotlin Compiler is already reporting errors for those scenarios - [#5309](https://togithub.com/detekt/detekt/pull/5309) - We removed the `--print-ast` CLI flag as [PsiViewer](https://www.jetbrains.com/help/idea/psi-viewer.html) provides the same features - [#5418](https://togithub.com/detekt/detekt/pull/5418) - Notable changes to existing rules - `ArrayPrimitive` is now working only with Type Resolution - [#5175](https://togithub.com/detekt/detekt/pull/5175) - `WildcardImport` is now running also on tests by default - [#5121](https://togithub.com/detekt/detekt/pull/5121) - `ForbiddenImport` allows now to specify a reason for every forbidden import - [#4909](https://togithub.com/detekt/detekt/pull/4909) - `IgnoredReturnValue`: option `restrictToAnnotatedMethods` is now deprecated in favor of `restrictToConfig` - [#4922](https://togithub.com/detekt/detekt/pull/4922) - This version of Detekt is built with Gradle `v7.5.1`, AGP `7.3.1`, Kotlin `1.7.21` and KtLint `0.47.1` (see [#5363](https://togithub.com/detekt/detekt/pull/5363) [#5189](https://togithub.com/detekt/detekt/pull/5189) [#5411](https://togithub.com/detekt/detekt/pull/5411) [#5312](https://togithub.com/detekt/detekt/pull/5312) [#5519](https://togithub.com/detekt/detekt/pull/5519)) - The minimum supported Gradle version is now `v6.7.1` - [#4964](https://togithub.com/detekt/detekt/pull/4964) ##### Migration We deprecated a number of rules in this release. You should update your config file as follows: ```diff potential-bugs: active: true ... - DuplicateCaseInWhenExpression: - active: true ... - MissingWhenCase: - active: true - allowElseExpression: true ... - RedundantElseInWhen: - active: true style: active: true ... - ForbiddenPublicDataClass: - active: true - excludes: ['**'] - ignorePackages: - - '*.internal' - - '*.internal.*' ... - LibraryCodeMustSpecifyReturnType: - active: true - excludes: ['**'] ... - LibraryEntitiesShouldNotBePublic: - active: true - excludes: ['**'] ``` If you wish to use the `libraries` ruleset we introduced you should add the following to your config file: ```diff + libraries: + active: true + ForbiddenPublicDataClass: + active: false + LibraryEntitiesShouldNotBePublic: + active: false + LibraryCodeMustSpecifyReturnType: + active: true ``` and add the following to you `build.gradle` file: ```kotlin detektPlugins("io.gitlab.arturbosch.detekt:detekt-rules-libraries:$version") ``` If you're using our KtLint wrapper (i.e. `detekt-formatting`) you should also update your config file as follows: ```diff formatting: active: true ... - TrailingComma: - active: false - autoCorrect: true - allowTrailingComma: false - allowTrailingCommaOnCallSite: false ... + TrailingCommaOnCallSite: + active: false + autoCorrect: true + useTrailingCommaOnCallSite: false + TrailingCommaOnDeclarationSite: + active: false + autoCorrect: true + useTrailingCommaOnDeclarationSite: false ``` ##### Changelog - ReturnCount: correctly count assignment expressions with elvis return as guard clauses - [#5539](https://togithub.com/detekt/detekt/pull/5539) - UnnecessaryPartOfBinaryExpression: fix false positive with pair creation - [#5516](https://togithub.com/detekt/detekt/pull/5516) - False positive at `UnnecessaryPartOfBinaryExpression` - [#5514](https://togithub.com/detekt/detekt/issues/5514) - Update documentation for TrailingComma rules - [#5513](https://togithub.com/detekt/detekt/pull/5513) - `TrimMultilineRawString` false-positive on annotation parameters - [#5476](https://togithub.com/detekt/detekt/issues/5476) - Detekt 1.22.0-RC1 -> 1.22.0-RC2 breaks UnreachableCode - [#5435](https://togithub.com/detekt/detekt/issues/5435) - Detekt 1.22.0-RC1 -> 1.22.0-RC2 breaks ignoreAnnotated - [#5427](https://togithub.com/detekt/detekt/issues/5427) - Fix issues introduced by [#5152](https://togithub.com/detekt/detekt/issues/5152) - [#5508](https://togithub.com/detekt/detekt/pull/5508) - MultilineLambdaItParameter: fix false positive for one-line statements with a lambda argument - [#5505](https://togithub.com/detekt/detekt/pull/5505) - UseArrayLiteralsInAnnotations: fix false negative with primitive array factory calls - [#5482](https://togithub.com/detekt/detekt/pull/5482) - TrimMultilineRawString: fix false positive when it's expected as constant - [#5480](https://togithub.com/detekt/detekt/pull/5480) - Fix false negative `SafeCast` with no braces - [#5479](https://togithub.com/detekt/detekt/pull/5479) - Update gradle/wrapper-validation-action digest to [`55e685c`](https://togithub.com/detekt/detekt/commit/55e685c) - [#5472](https://togithub.com/detekt/detekt/pull/5472) - Grant permission for type resolution Gradle job - [#5470](https://togithub.com/detekt/detekt/pull/5470) - Fix ObjectPropertyNaming Rule false positive - [#5466](https://togithub.com/detekt/detekt/pull/5466) - Fix LambdaParameterNaming rule false positive - [#5465](https://togithub.com/detekt/detekt/pull/5465) - Fix ReturnCount false positive when excludeReturnFromLambda is enabled - [#5459](https://togithub.com/detekt/detekt/pull/5459) - CognitiveComplexity: count else/else-if as one complexity - [#5458](https://togithub.com/detekt/detekt/pull/5458) - Fix false positive MultilineRawStringIndentation with tab indentation - [#5453](https://togithub.com/detekt/detekt/pull/5453) - Don't show the number of issues generating the BindingContext - [#5449](https://togithub.com/detekt/detekt/pull/5449) - Make detekt less noisy - [#5448](https://togithub.com/detekt/detekt/pull/5448) - New ruleauthors rule for Entity.from(x.nameIdentifier ?: x) -> Entity.atName(x) - [#5444](https://togithub.com/detekt/detekt/pull/5444) - Separating ComplexMethod rule into CyclomaticComplexMethod and CognitiveComplexMethod - [#5442](https://togithub.com/detekt/detekt/pull/5442) - Improve error reporting for CascadingCallWrapping - [#5439](https://togithub.com/detekt/detekt/pull/5439) - TrimMultilineRawString: fix false positive with not a raw string - [#5438](https://togithub.com/detekt/detekt/pull/5438) - BooleanPropertyNaming highlight only the name of the variable - [#5431](https://togithub.com/detekt/detekt/pull/5431) - Deprecate `TrailingComma` as it's now split in two rules - [#5423](https://togithub.com/detekt/detekt/pull/5423) - Remove unused constant - [#5421](https://togithub.com/detekt/detekt/pull/5421) - Report if/else as issue location instead of block - [#5407](https://togithub.com/detekt/detekt/pull/5407) - Remove some unnecessary suppressions - [#5400](https://togithub.com/detekt/detekt/pull/5400) - Check FormattingRule is auto-correctable by information provided by ktlint - [#5398](https://togithub.com/detekt/detekt/pull/5398) - Fix false negative MultilineLambdaItParameter on complex multiline single statement - [#5397](https://togithub.com/detekt/detekt/pull/5397) - ObjectPropertyNaming: fix false positive with top level properties - [#5390](https://togithub.com/detekt/detekt/pull/5390) - Remove usage of MPP targets function for JVM-only projects - [#5383](https://togithub.com/detekt/detekt/pull/5383) - UnnecessaryNotNullCheck: fix false negative with smart casted arguments - [#5380](https://togithub.com/detekt/detekt/pull/5380) - Add missing overlapping info & fix rules URLs - [#5378](https://togithub.com/detekt/detekt/pull/5378) - AlsoCouldBeApply: fix false positive when all statements are not `it`-started expressions - [#5376](https://togithub.com/detekt/detekt/pull/5376) - UnusedPrivateMember: fix false negative with named arguments - [#5374](https://togithub.com/detekt/detekt/pull/5374) - Change requires type resolution rule warning to debug level to not spam the user console - [#5353](https://togithub.com/detekt/detekt/pull/5353) - Report UseDataClass findings on class name - [#5352](https://togithub.com/detekt/detekt/pull/5352) - Report LabeledExpression as the label instead of the whole expression - [#5351](https://togithub.com/detekt/detekt/pull/5351) - Report CastToNullableType at the cast operator instead of the whole expression - [#5350](https://togithub.com/detekt/detekt/pull/5350) - Convert previously known string property to list based on default value - [#5347](https://togithub.com/detekt/detekt/pull/5347) - CastToNullableType: highlights too much - [#5346](https://togithub.com/detekt/detekt/issues/5346) - UseDataClass flags the whole class body, not just the name - [#5338](https://togithub.com/detekt/detekt/issues/5338) - CanBeNonNullable: explain why the rule does what it does. - [#5332](https://togithub.com/detekt/detekt/pull/5332) - Differentiate between correctable and non-correctable KtLint rules - [#5324](https://togithub.com/detekt/detekt/pull/5324) - ReturnCount 1.22.0 crashes on valid 1.21.0 config property excludedFunctions when using --all-rules cli flag - [#5323](https://togithub.com/detekt/detekt/issues/5323) - LabeledExpression to highlight only label - [#5316](https://togithub.com/detekt/detekt/issues/5316) - Use the correct source directory set on JVM - [#5163](https://togithub.com/detekt/detekt/pull/5163) - Get Android variant compile classpath from compileConfiguration - [#5152](https://togithub.com/detekt/detekt/pull/5152) - Use list config for `FunctionOnlyReturningConstant>excludedFunctions` - [#5120](https://togithub.com/detekt/detekt/pull/5120) - MaxLineLength: raw typo and test cleanup - [#5315](https://togithub.com/detekt/detekt/pull/5315) - EndOfSentenceFormat: fix HTML tag heuristic - [#5313](https://togithub.com/detekt/detekt/pull/5313) - Fix EndOfSentenceFormat highlight - [#5311](https://togithub.com/detekt/detekt/pull/5311) - Introduce configFile property on DetektGenerateTask - [#5308](https://togithub.com/detekt/detekt/pull/5308) - Improve debug suggestion message - [#5300](https://togithub.com/detekt/detekt/pull/5300) - Fat-Jar version of detekt-generator module - [#5297](https://togithub.com/detekt/detekt/pull/5297) - Toolchains docs - [#5293](https://togithub.com/detekt/detekt/pull/5293) - Adopt new AGP dsl - [#5288](https://togithub.com/detekt/detekt/pull/5288) - NonBooleanPropertyPrefixedWithIs: Allow boolean functions - [#5285](https://togithub.com/detekt/detekt/pull/5285) - Provide the current classpath inside `KotlinEnvironmentResolver` - [#5275](https://togithub.com/detekt/detekt/pull/5275) - Fix false-positive on `NestedScopeFunctions` - [#5274](https://togithub.com/detekt/detekt/pull/5274) - Use convention method to set task property defaults - [#5272](https://togithub.com/detekt/detekt/pull/5272) - Update docusaurus monorepo to v2.1.0 - [#5270](https://togithub.com/detekt/detekt/pull/5270) - detektVersionReplace.js plugin is not replacing all \[detekt_version] tags on website - [#5266](https://togithub.com/detekt/detekt/pull/5266) - Update ktlint rule doc links - [#5258](https://togithub.com/detekt/detekt/pull/5258) - Remove redundant rule config for rules enabled by default - [#5257](https://togithub.com/detekt/detekt/pull/5257) - UnusedPrivateMember: fix false positive with backtick parameters - [#5252](https://togithub.com/detekt/detekt/pull/5252) - Improve MultilineRawStringIndentation - [#5245](https://togithub.com/detekt/detekt/pull/5245) - UnnecessaryLet: fix false positive with with invoke operator calls - [#5240](https://togithub.com/detekt/detekt/pull/5240) - Introduce baseline tooling api - [#5239](https://togithub.com/detekt/detekt/pull/5239) - Allow secondary constructors to reference CoroutineDispatchers - [#5227](https://togithub.com/detekt/detekt/pull/5227) - Update `UnnecessaryAbstractClass` issue description to be less verbose - [#5224](https://togithub.com/detekt/detekt/pull/5224) - Update plugin com.gradle.common-custom-user-data-gradle-plugin to v1.8.0 - [#5223](https://togithub.com/detekt/detekt/pull/5223) - Pin dependencies - [#5222](https://togithub.com/detekt/detekt/pull/5222) - Remove rule from NamingRules multi rule - [#5212](https://togithub.com/detekt/detekt/pull/5212) - Run all rules from EmptyBlocks multi rule individually - [#5208](https://togithub.com/detekt/detekt/pull/5208) - Run all rules from KDocStyle multi rule individually - [#5207](https://togithub.com/detekt/detekt/pull/5207) - Docs: GitHub - Add link to configure Sarif severity alert level - [#5206](https://togithub.com/detekt/detekt/pull/5206) - Fix errors with `detektGenerateConfig` - [#5199](https://togithub.com/detekt/detekt/pull/5199) - Forbid constructors with `ForbiddenMethodCall` - [#5195](https://togithub.com/detekt/detekt/pull/5195) - Update github/codeql-action digest to [`2ca79b6`](https://togithub.com/detekt/detekt/commit/2ca79b6) - [#5177](https://togithub.com/detekt/detekt/pull/5177) - Allow to ignore overloaded methods for the complex interface rule ([#5165](https://togithub.com/detekt/detekt/issues/5165)) - [#5173](https://togithub.com/detekt/detekt/pull/5173) - Add excludesRawStrings in MaxLineLength - [#5171](https://togithub.com/detekt/detekt/pull/5171) - Enable Predictive Test Selection for local builds - [#5170](https://togithub.com/detekt/detekt/pull/5170) - Update dependency org.kohsuke:github-api to v1.307 - [#5168](https://togithub.com/detekt/detekt/pull/5168) - Update dependency com.github.ajalt:clikt to v2.8.0 - [#5167](https://togithub.com/detekt/detekt/pull/5167) - Update docusaurus monorepo to v2.0.1 - [#5166](https://togithub.com/detekt/detekt/pull/5166) - Run build-logic Kotlin compilation out of process on CI - [#5162](https://togithub.com/detekt/detekt/pull/5162) - Add information about exhaustiveness check to documentation - [#5160](https://togithub.com/detekt/detekt/pull/5160) - Use getter when determining whether custom config path is set in DetektGenerateConfigTask - [#5157](https://togithub.com/detekt/detekt/pull/5157) - Limit Kotlin version warning suppression scope in build - [#5156](https://togithub.com/detekt/detekt/pull/5156) - Re-enable warnings as errors for detekt-gradle-plugin - [#5155](https://togithub.com/detekt/detekt/pull/5155) - Bundle slf4j-nop in detekt-formatting JAR - [#5153](https://togithub.com/detekt/detekt/pull/5153) - Fix false negative for UseRequire when thrown in conditional block - [#5147](https://togithub.com/detekt/detekt/pull/5147) - Allow parentheses for unclear precedence with range operator - [#5143](https://togithub.com/detekt/detekt/pull/5143) - Mark apiDump task as incompatible with configuration cache - [#5134](https://togithub.com/detekt/detekt/pull/5134) - Improve binding context management - [#5130](https://togithub.com/detekt/detekt/pull/5130) - `RedundantExplicitType` add annotation `@RequiresTypeResolution` - [#5128](https://togithub.com/detekt/detekt/pull/5128) - Disable `ExitOutsideMain` if `contextBinding` is empty - [#5127](https://togithub.com/detekt/detekt/pull/5127) - Use list config for `DataClassContainsFunctions>conversionFunctionPrefix` - [#5119](https://togithub.com/detekt/detekt/pull/5119) - Support proper globbing in `ReturnCount` - [#5118](https://togithub.com/detekt/detekt/pull/5118) - Improve finding message of ExplicitItLambdaParameter - [#5117](https://togithub.com/detekt/detekt/pull/5117) - Update JamesIves/github-pages-deploy-action digest to [`13046b6`](https://togithub.com/detekt/detekt/commit/13046b6) - [#5110](https://togithub.com/detekt/detekt/pull/5110) - UnusedUnaryOperator: fix false positive with var assignment and if expression - [#5106](https://togithub.com/detekt/detekt/pull/5106) - Tag publishPlugins task as incompatible with configuration cache - [#5101](https://togithub.com/detekt/detekt/pull/5101) - Make verifyGeneratorOutput task configuration cache compatible - [#5100](https://togithub.com/detekt/detekt/pull/5100) - Remove obsolete FeatureInAlphaState opt in - [#5099](https://togithub.com/detekt/detekt/pull/5099) - Remove explicit RequiresOptIn compiler flag - [#5098](https://togithub.com/detekt/detekt/pull/5098) - Use Gradle's configuration cache by default - [#5095](https://togithub.com/detekt/detekt/pull/5095) - Detect undocumented protected classes, properties, and functions - [#5083](https://togithub.com/detekt/detekt/pull/5083) - ReturnCount.excludedFunctions should be a List\Configuration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
This PR has been generated by Mend Renovate. View repository job log here.