What’s New

detekt

Developer Tools

Static analysis for Kotlin.

Latest v1.23.8 · by detektWebsitedetekt/detekt

Changelog

v2.0.0-alpha.5

Pre-release
Changed 1
  • Stop accepting unsupported API or language versions passed to CLI
Fixed 2
  • Stop leaking ktlint-repackage as a transitive dependency
  • Exclude gradle-public-api from published POM
2.0.0-alpha.5 - 2026-06-17

This is a hotfix release for 2.0.0-alpha.4 where we fixed 2 bugs that were preventing detekt from running correctly.

Changelog
  • fix: stop leaking ktlint-repackage as a transitive dependency - #9391
  • fix: exclude gradle-public-api from published POM - #9408
  • Stop accepting unsupported API or language versions passed to CLI - #9410

v2.0.0-alpha.4

Pre-release
Added 2
  • Support Kotlin 2.4.0
  • Add new rule LeakingSessionBoundType
Changed 9
  • Apply the indent_style configuration to all the ktlint wrapper rules
  • Expose Glob-to-Regex functions in psi-utils
  • Make Detektion immutable
  • Include ktlint-repackage in ktlint-wrapper JAR
  • Declare DGP compatibility with Gradle's configuration cache
  • Forward languageVersionSettings to KotlinAnalysisApiEngine.compile
Fixed 6
  • Prevent ArrayPrimitive crash on unresolved types
  • Fix PrintStackTrace nested call detection
  • Fix unused import false positive for companion object member extension properties
  • Accept punctuation after a link
  • Fix UnnecessaryFullyQualifiedName false positive with explicit import shadowing
  • Fix UnnecessaryFullyQualifiedName clashes with kotlin package name
Removed 3
  • Stop publishing ktlint-repackage
  • Stop exposing ktlint's StandardRule to detekt-rules-ktlint-wrapper consumers
  • Remove excludeImportStatements from Deprecation rule
2.0.0-alpha.4 - 2026-06-13

This is an alpha release of Detekt 2.0.0. Is built against Kotlin 2.4.0, Gradle 9.5.1, AGP 9.2.1 and is tested against JDK 25.

Notable Changes
  • Support Kotlin 2.4.0 - #9218
  • Add new rule LeakingSessionBoundType - #9242
  • Apply the indent_style configuration to all the ktlint wrapper rules (previsouly this was applied only to the Indentation rule) - #9315
Breaking Changes
  • Expose Glob-to-Regex functions in psi-utils - #9340
  • Make Detektion immutable - #8583
Changelog
  • fix: prevent ArrayPrimitive crash on unresolved types - #9364
  • Update ktlint documentation links - #9354
  • Fix PrintStackTrace nested call detection - #9352
  • Fix unused import false positive for companion object member extension properties - #9349
  • Accept punctuation after a link - #9341
  • Fixes UnnecessaryFullyQualifiedName false positive with explicit import shadowing - #9329
  • docs: fix KMP type resolution task names - #9316
  • Stop publishing ktlint-repackage - #9314
  • Stop exposing ktlint's StandardRule to detekt-rules-ktlint-wrapper consumers - #9313
  • Include ktlint-repackage in ktlint-wrapper JAR - #9312
  • Declare DGP compatibility with Gradle's configuration cache - #9311
  • Forward languageVersionSettings to KotlinAnalysisApiEngine.compile - #9305
  • docs: add ForbiddenImport configuration example - #9302
  • Fix UnnecessaryFullyQualifiedName clashes with kotlin package name - #9289
  • Remove excludeImportStatements from Deprecation rule - #9287
  • Improve repackaging of Analysis API dependencies - #9285
  • MaxChainedCallsOnSameLine - Fix AA type leaks - #9261
  • SuspendFunSwallowedCancellation - Fix AA type leaks - #9256
  • feat: Add exhaustive option to OutdatedDocumentation rule, also improve error messages - #9255
  • Excluding generated sources by default - #9251
  • Move FileProcessListenerExtensions to :detekt-test - #9212
  • Improve SuspendFunSwallowedCancellation - #9208
  • Cli filters - #9200
  • Allow single-argument Boolean generics in NonBooleanPropertyPrefixedWithIs - #9173
  • Remove Config.parentPath - #9036
Dependency Updates
  • Update Poko to v0.23.1 - #9371
  • Update slf4j monorepo to v2.0.18 - #9324
  • Update agp to v9.2.1 - #9268
Housekeeping & Refactorings
  • Update test to avoid typealias to compiler-required annotation - #9361
  • Remove unnecessary compileOnly dependencies - #9318
Contributors

We would like to thank the following contributors that made this release possible: @3flex, @BraisGabin, @ChristophyBarth, @FletchMcKee, @Lucas-FManager, @ShubhamWorks02, @Will-thom, @e5l, @fru1tworld, @jonapoul, @luanpotter, @matejdro, @mirkoalicastro, @nchen000, @ninebolt6, @paulkagiri, @travisMiehm

v2.0.0-alpha.3

Pre-release
2.0.0-alpha.3 - 2026-04-24

This is an alpha release of Detekt 2.0.0. Is built against Kotlin 2.3.21, Gradle 9.3.1, AGP 9.1.1 and is tested against JDK 25.

As of this release, the workaround of disabling the new DSL and built-in Kotlin via gradle.properties for AGP 9.x projects is no longer required.

Notable Changes
  • Bump Kotlin to v2.3.21 - #9272
  • Bump AGP to v9.1.1 - #9244
  • Add support for AGP 9 built-in Kotlin - #9100
  • Rule UnnecessaryFullyQualifiedName now requires full mode to run - #9061
  • Add new rule: UnnecessaryRun - #7428
Breaking Changes
  • Remove DetektProgressListener from our public API - #9221
  • Remove InvalidConfigurationError from our public API - #8994
Changelog
  • UseOrEmpty - Fix AA type leaks - #9263
  • ForbiddenNamedParam - Fix AA type leaks - #9262
  • UnusedVariable - Fix AA type leaks - #9260
  • UnnecessaryNotNullOperator - Fix AA type leaks - #9259
  • Deprecation - Fix AA type leaks - #9258
  • NestedScopeFunctions - Fix AA type leaks - #9257
  • Suggest similar property names for misspelled config properties - #9250
  • MagicNumber DslGradleRunner test fix - #9245
  • Don't forbid use of java.lang.annotation.Inherited annotation by default - #9224
  • Fixes #9017 - false positive with name collisions - #9223
  • Optimize how we get project statistics - #9217
  • Rename ProjectComplexityProcessor to ProjectCyclomaticComplexityProcessor - #9213
  • Add ignoreClass config to MissingUseCall - #9205
  • Remove LicenseHeaderLoaderExtension from the list of processors - #9204
  • cli: Improve messages and exception types of --report - #9203
  • Validate --classpath with JCommander - #9202
  • System-dependent path separators - #9199
  • Do not report IgnoredReturnValue on lambda invocation that returns Unit - #9192
  • Point to valOrVarKeyword for reporting the issue - #9191
  • Check Throwable class - #9190
  • Do no report when parent has class - #9189
  • Add support of indent_style in ktlint Indention rule - #9180
  • Add severity to different md, html reports - #9167
  • Check local class which can't be converted to interface - #9166
  • Inline yaml config in the test - #9154
  • Tests: Don't check compilation errors with compile-test-snippets=false - #9153
  • YamlConfig.load returns YamlConfig instead of Config - #9151
  • Generator: The --config flag value should be a directory or it shouldn't exist - #9131
  • Fix broken test JvmSpec - #9129
  • Performance improvement - consolidated KaLibraryModules - #9127
  • Print cli arguments with debug = true - #9126
  • MissingUseCall: Fix false negative for checkNotNull/requireNotNull - #9123
  • Make functionalTest os dependent - #9098
  • Fix false positive for ExplicitCollectionElementAccessMethod with lambdas - #9096
  • Expose only LanguageVersionSettings instead of CompilerConfiguration - #9092
  • Remove project from EnvironmentFacade - #9089
  • Ensure that AA knows types of excluded files - #9082
  • Updated to using Gradle's lazy APIs - #9080
  • Simplify KotlinEnvironmentContainer - #9077
  • Reduce calls to analyze in MapGetWithNotNullAssertionOperator - #9067
  • Report MapGetWithNonNullAssertionOperator violations on MutableMaps - #9065
  • Fix ExplicitCollectionElementAccessMethodSpec for unresolved types - #9059
  • Allow external dependencies in analysis tests - #9051
  • Improve exception handling on YamlConfig - #9048
  • Remove YamlConfig.load(Path) - #9047
  • Refine AbstractClassCanBeInterface treatment of open properties - #9043
  • rename Claude.md to CLAUDE.md for cross-platform compatibility - #9033
  • Clarify CommentOverPrivate... renames in detekt 2 - #9025
  • Exclude generated sources from default sources - #9019
  • fix(UnusedVariable): recognize destructured lambda parameters as used - #9015
  • Replace Lifecycle.bindingProvider by a private function and rename it to validateClasspath - #9003
  • Remove unnecessary interface - #9002
  • Remove dependecy of :detekt-test with :detekt-core - #8987
  • Move yamlConfig functions to :detekt-core - #8976
  • Only print paths of reports when detektion fails - #8560
Dependency Updates
  • Bump Kotlin 2.3.20 - #8959
  • Bump AGP to v9.1.0 - #9110
  • Add coroutinesCore Intellij to the classpath - #9176
  • chore: update Kotlin 2.3.20-RC2 → 2.3.20 - #9160
  • chore(deps): update plugin dev.drewhamilton.poko to v0.22.0 - #9159
  • Make KotlinAnalysisApiEngine AutoCloseable - #9144
  • fix(deps): update kotlin monorepo to v2.3.10 - #9037
Housekeeping & Refactorings
  • Don't use paths to read files from resources/ - #9175
  • Remove unnecessary test nesting - #9150
Contributors

We would like to thank the following contributors that made this release possible: @3flex, @BraisGabin, @FletchMcKee, @TWiStErRob, @UnguidedFreedom, @atulgpt, @cortinico, @fru1tworld, @jonapoul, @matejdro, @mirkoalicastro, @picklebento, @t-kameyama, @travisMiehm

v2.0.0-alpha.2

Pre-release
2.0.0-alpha.2 - 2026-01-27

This is an alpha release of Detekt 2.0.0. It's built against Kotlin 2.3.0, Gradle 9.3.0, AGP 9.0.0 and is tested against JDK 25.

Please note that in order for this alpha of Detekt to run in an AGP 9.0.0 project, you will need to disable the new DSL and built-in Kotlin by adding these properties to gradle.properties:

android.newDsl=false
android.builtInKotlin=false

Further updates on builtInKotlin support in Detekt Gradle Plugin will be available here.

Notable Changes
  • Bump Kotlin to 2.3.0 - #8743
  • Bump Gradle to 9.3.0 - #8982
  • Bump AGP to 9 - #8553
  • Bump minimum AGP to 8.2.2 - #8931
  • Enable rules by default that are now standard in ktlint 1.8.0 - #8849
  • Bump KtLint to v1.8.0 - #8843
  • New ktlint Rule: ThenSpacingRule - #8850
  • New Rule: UnnecessaryInitOnArray - #8784
  • New Rule: UnnecessaryFullyQualifiedName - #8917
Breaking Changes
  • Rename documentation to comments - #8889
  • Rename empty to emptyblocks - #8888
  • Rename bugs rules to potentialbugs - #8887
  • Remove UnnecessaryAnnotationUseSiteTarget rule - #8861
  • Rename RuleSet.Id to RuleSetId - #8810
  • Rename rule CommentOverPrivateMethod to DocumentationOverPrivateMethod - #8778
  • Refactor AbsentOrWrongFileLicense - #8969
  • Compile DGP against kotlin-plugin-api only not KGP itself - #8756
  • Change configuration options for ForbiddenImport rule - #8747
Changelog
  • fix(UnusedImport): detect named companion objects correctly - #9005
  • Remove unnecessary tests - #8985
  • Pass the correct type to TestConfig - #8984
  • Remove special case for active at TestConfig - #8983
  • TestConfig over yamlConfigFromContent - #8974
  • Skip underscore placeholders for unused variables on NonNameShadowing rule (#8962) - #8965
  • docs: clarify function type handling in ForbiddenMethodCall - #8964
  • Check if there suspend function in try block before reporting - #8950
  • Fix SubpluginArtifact coordinates for dev.detekt:detekt-compiler-plugin - #8938
  • Handle case when inner is required as parent is inner - #8927
  • Add paragraph on AI contributed PR - #8922
  • Handle case when reference is provided - #8895
  • Don't enable rules by default that are only enabled when using ktlint_official code style - #8845
  • Filter operations which are terminal as they don't continue sequence - #8804
  • Add modality check from analysis api - #8803
  • Update getPropertyAccessorSymbol method to correctly return getter … - #8787
  • Fix #8160 - Exclude classes in NamedArguments rule - #8782
  • remove suppression - #8736
  • Remove "V2" from DGP plugin display name and description - #8628
Dependency Updates
  • Bump Kotlin to v2.2.21 - #8807
  • Bump AGP to 8.13.2 - #8914
  • Add transitive assertj dep of assertj core in detekt-test-assertj - #8923
  • chore(deps): update gradle to v9.2.1 - #8868
  • fix(deps): update dependency com.android.tools.build:gradle to v8.13.1 - #8838
  • chore(deps): update gradle to v9.2.0 - #8820
Housekeeping & Refactorings
  • Bump min Node version for website build - #8875
  • Enable ValueArgumentComment for detekt project - #8854
Contributors

We would like to thank the following contributors that made this release possible: @3flex, @BraisGabin, @atulgpt, @chao2zhang, @cortinico, @csbiy, @forketyfork, @marschwar, @rschattauer

v2.0.0-alpha.1

Pre-release
2.0.0-alpha.1 - 2025-10-21

This is an alpha release of Detekt 2.0.0. Is built against Kotlin 2.2.20, Gradle 9.1.0 and is tested against JDK 25.

Full changelog is available here: https://detekt.dev/changelog-2.0.0

Requirements
Detekt VersionGradleKotlinAGPJava Target LevelJDK Max Version
2.0.0-alpha.19.1.02.2.208.13.01.825
Contributors

We would like to thank the following contributors that made this release possible: @3flex @BraisGabin @Copilot @CziSKY @atulgpt @jonapoul @marschwar @mikaelreiersolmoen

See all issues at: 2.0.0

v2.0.0-alpha.0

Pre-release
2.0.0-alpha.0 - 2025-09-04

This is an initial alpha release of Detekt 2.0.0.

Full changelog is available here: https://detekt.dev/changelog-2.0.0

Requirements
Detekt VersionGradleKotlinAGPJava Target LevelJDK Max Version
2.0.0-alpha.08.13.02.2.108.13.01.821
Contributors

We would like to thank the following contributors that made this release possible: @3flex, @BraisGabin, @ErdoganSeref, @GeorgCantor, @Goooler, @Gosunet, @Hexcles, @JordanLongstaff, @LeoColman, @MaximSysoev, @Nava2, @PStrelchenko, @PhilippNowak96, @PoisonedYouth, @TWiStErRob, @VirtualParticle, @VovaStelmashchuk, @arturbosch, @atulgpt, @baseballyama, @bmuschko, @bomiyr, @bric3, @brunoescalona, @chao2zhang, @cortinico, @dzirbel, @eygraber, @hirokinoue, @hudson155, @ilim-ablyaev, @inorichi, @kkocel, @lexa-diky, @marschwar, @matejdro, @mdemianova, @mgroth0, @neugartf, @noar-t, @pablobaxter, @paolorotolo, @psuzn, @rhazarian, @rmarquis, @robholmes, @schalkms, @segunfamisa, @severn-everett, @stellingsimon, @t-kameyama, @tfcporciuncula, @xouabita.

See all issues at: 2.0.0

v1.23.8

1.23.8 - 2025-02-20

This is a point release for Detekt 1.23.0, built against Kotlin 2.0.21, with fixes for several bugs that got reported by the community.

Notable Changes
  • fix(deps): Update kotlin to 2.0.21 - #7580
  • fix(deps): Update AGP to v8.8.1 - #7879
  • fix(deps): update Gradle to v8.12.1 - #7780
Changelog
  • UseDataClass: do not report on expect classes - #7857
  • Fix InjectDispatcher false positives - #7797
  • [UnnecessaryParentheses] Allow float/double without integer part - #7751
  • Fix ThrowingExceptionsWithoutMessageOrCause false positive - #7715
  • Issue #7634: Make UndocumentedPublicClass configurable to flag `com… - #7635
  • Fix redundant empty tags in baseline XML - #7625
  • MatchingDeclarationName now supports platofrm suffixes - #6426
Contributors

We would like to thank the following contributors that made this release possible: @BraisGabin, @JordanLongstaff, @Nava2, @atulgpt, @eygraber, @lexa-diky, @t-kameyama

v1.23.7

1.23.7 - 2024-09-08

This is a point release for Detekt 1.23.0, built against Kotlin 2.0.10, with fixes for several bugs that got reported by the community.

Notable Changes
  • fix(deps): update kotlin monorepo to v2.0.10 - #7517
  • Update to Kotlin 2.0.0 #6640
  • fix(deps): update kotlin monorepo to v1.9.24 - #7264
  • fix(deps): update dependency com.android.tools.build:gradle to v8.5.2 - #7525
  • chore(deps): update dependency gradle to v8.10 - #7546
Changelog
  • Add basic support for isolated projects to 1.x - #7526
  • ExplicitCollectionElementAccessMethod: fix false positive when Map put has 3 arguments - #7563
  • BracesOnIfStatements: fix false-positive when chained - #7444
  • Add enum entry check in UndocumentedPublicProperty - #7426
  • Use the anchor which is already present before - #7423
  • Fix small corner-case in "SerialVersionUIDInSerializableClass" rule, … - #7346
  • SwallowedException: fix false positive when exception is used as a receiver - #7288
  • NamedArguments: fix false positive on spread varargs - #7283
  • MultilineLambdaItParameter: fix false negative with single statement on multiple lines - #7221
  • Check for root of receiver in selector expression - #7220
  • Check for public companion object for UndocumentedPublicClass - #7219
  • fix: TopLevelPropertyNaming also detecting extension property name - #7212
  • Publish detekt-compiler-plugin-all to Maven and GH Releases - #7179
  • versioned default detekt config file link - #7161
  • Support rangeUntil operator for UnusedImport rule - #7104
  • Fix false positive on it usages when type parameter is specified - #6850
Housekeeping/Docs
  • [bugfix] AnnotationOnSeparateLine in snippets - #6526
  • Add docs about using the Compiler Plugin with the Kotlin CLI compiler - #7184

v1.23.6

1.23.6 - 2024-03-23

This is a point release for Detekt 1.23.0, where we added support for Kotlin 1.9.23 and fixed several bugs that got reported by the community.

Changelog
  • UselessPostfixExpression - Fix #7037 false positive postfix - #7084
  • Don't allow invalid Source Locations - #7030
  • UnusedPrivateClass: don't report if private classes are used for type conversion - #6995
  • RedundantSuspendModifier: do not report when the function has 'actual' modifier - #6951
  • Update dependency gradle to v8.7 - #7080
  • Update kotlin monorepo to v1.9.23 - #7027
  • Update dependency gradle to v8.6 - #6939
  • Update dependency com.android.tools.build:gradle to v8.3.1 - #7070
Contributors

We would like to thank the following contributors that made this release possible: @BraisGabin, @psuzn, @t-kameyama.

v1.23.5

This is a point release for Detekt 1.23.0, where we added support for Kotlin 1.9.22 and fixed several bugs that got reported by the community.

Notable Changes
  • Test Gradle plugin with AGP 8.2.0 - #6672
  • chore(deps): update dependency gradle to v8.5 - #6663
  • fix(deps): update kotlin monorepo to v1.9.22 - #6746
Changelog
  • Report rule's default severity in sarif backport - #6916
  • Add ignoreAnnotatedFunctions to TooManyFunctions - #6875
  • Fix by checking the existence of label in previous statements - #6671
  • Also check USELESS_ELVIS in UnreachableCode - #6624
  • Fix by adding last method call to the set - #6567
Housekeeping & Refactorings
  • Opt in to ExperimentalCompilerApi in all compilations in compiler-plugin - #6534
Contributors

We would like to thank the following contributors that made this release possible: @3flex, @TWiStErRob, @atulgpt, @matejdro

Discussion