Skip to content
Permalink
master
Switch branches/tags
Go to file
* Fix regression on command line argument "--disabled_rules" and align code other unit tests

Closes #1520
23 contributors

Users who have contributed to this file

@paul-dingemans @shyiko @shashachu @Tapchicoma @romtsn @t-kameyama @Goooler @chao2zhang @PaulWoitaschek @tasomaniac @petertrr @michael-johansen
1211 lines (923 sloc) 71.1 KB

Changelog

All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning.

Unreleased

Added

Fixed

  • Fix cli argument "--disabled_rules" (#1520).

Changed

Removed

0.46.1 - 2022-06-21

Minor release to address some regressions introduced in 0.46.0

Fixed

  • Remove experimental flag -Xuse-k2 as it forces API Consumers to compile their projects with this same flag (#1506).
  • Account for separating spaces when parsing the disabled rules (#1508).
  • Do not remove space before a comment in a parameter list (#1509).
  • A delegate property which starts on the same line as the property declaration should not have an extra indentation indent (#1510)

0.46.0 - 2022-06-18

Promoting experimental rules to standard

The rules below are promoted from the experimental ruleset to the standard ruleset.

  • annotation
  • annotation-spacing
  • argument-list-wrapping
  • double-colon-spacing
  • enum-entry-name-case
  • multiline-if-else
  • no-empty-first-line-in-method-block
  • package-name
  • trailing-comma
  • spacing-around-angle-brackets
  • spacing-between-declarations-with-annotations
  • spacing-between-declarations-with-comments
  • unary-op-spacing

Note that as a result of moving the rules that the prefix experimental: has to be removed from all references to this rule. Check references in:

  • The .editorconfig setting disabled_rules.
  • KtLint disable and enable directives.
  • The VisitorModifier.RunAfterRule.

If your project did not run with the experimental ruleset enabled before, you might expect new lint violations to be reported. Please note that rules can be disabled via the the .editorconfig in case you do not want the rules to be applied on your project.

API Changes & RuleSet providers

If you are not an API user nor a RuleSet provider, then you can safely skip this section. Otherwise, please read below carefully and upgrade your usage of ktlint. In this and coming releases, we are changing and adapting important parts of our API in order to increase maintainability and flexibility for future changes. Please avoid skipping a releases as that will make it harder to migrate.

Lint and formatting functions

The lint and formatting changes no longer accept parameters of type Params but only ExperimentalParams. Also, the VisitorProvider parameter has been removed. Because of this, your integration with KtLint breaks. Based on feedback with ktlint 0.45.x, we now prefer to break at compile time instead of trying to keep the interface backwards compatible. Please raise an issue, in case you help to convert to the new API.

Use of ".editorconfig" properties & userData

The interface UsesEditorConfigProperties provides method getEditorConfigValue to retrieve a named .editorconfig property for a given ASTNode. When implementing this interface, the value editorConfigProperties needs to be overridden. Previously it was not checked whether a retrieved property was actually recorded in this list. Now, retrieval of unregistered properties results in an exception.

Property Ktlint.DISABLED has been removed. The property value can now be retrieved as follows:

astNode
    .getEditorConfigValue(DefaultEditorConfigProperties.disabledRulesProperty)
    .split(",")

and be supplied via the ExperimentalParams as follows:

ExperimentalParams(
    ...
    editorConfigOverride =  EditorConfigOverride.from(
      DefaultEditorConfigProperties.disabledRulesProperty to "some-rule-id,experimental:some-other-rule-id"
    )
    ...
)

Property Ktlint.ANDROID_USER_DATA_KEY has been removed. The property value can now be retrieved as follows:

astNode
    .getEditorConfigValue(DefaultEditorConfigProperties.codeStyleProperty)

and be supplied via the ExperimentalParams as follows:

ExperimentalParams(
    ...
    editorConfigOverride =  EditorConfigOverride.from(
      DefaultEditorConfigProperties.codeStyleProperty to "android" 
    )
    ...
)

This property defaults to the official Kotlin code style when not set.

Testing KtLint rules

An AssertJ style API for testing KtLint rules (#1444) has been added. Usage of this API is encouraged in favor of using the old RuleExtension API. For more information, see KtLintAssertThat API

Added

  • Add experimental rule for unexpected spacing between function name and opening parenthesis (spacing-between-function-name-and-opening-parenthesis) (#1341)
  • Add experimental rule for unexpected spacing in the parameter list (parameter-list-spacing) (#1341)
  • Add experimental rule for incorrect spacing around the function return type (function-return-type-spacing) (#1341)
  • Add experimental rule for unexpected spaces in a nullable type (nullable-type-spacing) (#1341)
  • Do not add a space after the typealias name (type-parameter-list-spacing) (#1435)
  • Add experimental rule for consistent spacing before the start of the function body (function-start-of-body-spacing) (#1341)
  • Suppress ktlint rules using @Suppress (more information) (#765)
  • Add experimental rule for rewriting the function signature (function-signature) (#1341)

Fixed

  • Move disallowing blank lines in chained method calls from no-consecutive-blank-lines to new rule (no-blank-lines-in-chained-method-calls) (#1248)
  • Fix check of spacing in the receiver type of an anonymous function (#1440)
  • Allow comment on same line as super class in class declaration wrapping (#1457)
  • Respect git hooksPath setting (#1465)
  • Fix formatting of a property delegate with a dot-qualified-expression indent (#1340)
  • Keep formatting of for-loop in sync with default IntelliJ formatter (indent) and a newline in the expression in a for-statement should not force to wrap it wrapping (#1350)
  • Fix indentation of property getter/setter when the property has an initializer on a separate line indent (#1335)
  • When .editorconfig setting indentSize is set to value tab then return the default tab width as value for indentSize (#1485)
  • Allow suppressing all rules or a list of specific rules in the entire file with @file:Suppress(...) (#1029)

Changed

  • Update Kotlin development version to 1.7.0 and Kotlin version to 1.7.0.
  • Update shadow plugin to 7.1.2 release
  • Update picocli to 4.6.3 release
  • A file containing only one (non private) top level declaration (class, interface, object, type alias or function) must be named after that declaration. The name also must comply with the Pascal Case convention. The same applies to a file containing one single top level class declaration and one ore more extension functions for that class. filename (#1004)
  • Promote experimental rules to standard rules set: annotation, annotation-spacing, argument-list-wrapping, double-colon-spacing, enum-entry-name-case, multiline-if-else, no-empty-first-line-in-method-block, package-name, traling-comma, spacing-around-angle-brackets, spacing-between-declarations-with-annotations, spacing-between-declarations-with-comments, unary-op-spacing (#1481)
  • The CLI parameter --android can be omitted when the .editorconfig property ktlint_code_style = android is defined

0.45.2 - 2022-04-06

Fixed

Changed

  • Set Kotlin development version to 1.6.20 and Kotlin version to 1.6.20.

0.45.1 - 2022-03-21

Minor release to fix a breaking issue with ktlint API consumers

Fixed

  • Remove logback dependency from ktlint-core module (#1421)

0.45.0 - 2022-03-18

API Changes & RuleSet providers

If you are not an API user nor a RuleSet provider, then you can safely skip this section. Otherwise, please read below carefully and upgrade your usage of ktlint. In this and coming releases, we are changing and adapting important parts of our API in order to increase maintainability and flexibility for future changes. Please avoid skipping a releases as that will make it harder to migrate.

Retrieving ".editorconfig" property value

This section is applicable when providing rules that depend on one or more values of ".editorconfig" properties. Property values should no longer be retrieved via EditConfig or directly via userData[EDITOR_CONFIG_USER_DATA_KEY]. Property values should now only be retrieved using method ASTNode.getEditorConfigValue(editorConfigProperty) of interface UsesEditorConfigProperties which is provided in this release. Starting from next release after the current release, the EditConfig and/or userData[EDITOR_CONFIG_USER_DATA_KEY] may be removed without further notice which will break your API or rule. To prevent disruption of your end user, you should migrate a.s.a.p.

Added

  • Add experimental rule for unexpected spaces in a type reference before a function identifier (function-type-reference-spacing) (#1341)
  • Add experimental rule for incorrect spacing after a type parameter list (type-parameter-list-spacing) (#1366)
  • Add experimental rule to detect discouraged comment locations (discouraged-comment-location) (#1365)
  • Add rule to check spacing after fun keyword (fun-keyword-spacing) (#1362)
  • Add experimental rules for unnecessary spacing between modifiers in and after the last modifier in a modifier list (#1361)
  • New experimental rule for aligning the initial stars in a block comment when present (experimental:block-comment-initial-star-alignment (#297)
  • Respect .editorconfig property ij_kotlin_packages_to_use_import_on_demand (no-wildcard-imports) (#1272)
  • Add new experimental rules for wrapping of block comment (comment-wrapping) (#1403)
  • Add new experimental rules for wrapping of KDoc comment (kdoc-wrapping) (#1403)
  • Add experimental rule for incorrect spacing after a type parameter list (type-parameter-list-spacing) (#1366)
  • Expand check task to run tests on JDK 17 - "testOnJdk17"

Fixed

  • Fix lint message to "Unnecessary long whitespace" (no-multi-spaces) (#1394)
  • Do not remove trailing comma after a parameter of type array in an annotation (experimental:trailing-comma) (#1379)
  • Do not delete blank lines in KDoc (no-trailing-spaces) (#1376)
  • Do not indent raw string literals that are not followed by either trimIndent() or trimMargin() (indent) (#1375)
  • Revert remove unnecessary wildcard imports as introduced in Ktlint 0.43.0 (no-unused-imports) (#1277), (#1393), (#1256)
  • (Possibly) resolve memory leak (#1216)
  • Initialize loglevel in Main class after parsing the CLI parameters (#1412)

Changed

  • Print the rule id always in the PlainReporter (#1121)
  • All wrapping logic is moved from the indent rule to the new rule wrapping (as part of the standard ruleset). In case you currently have disabled the indent rule, you may want to reconsider whether this is still necessary or that you also want to disable the new wrapping rule to keep the status quo. Both rules can be run independent of each other. (#835)

0.44.0 - 2022-02-15

Please welcome paul-dingemans as an official maintainer of ktlint!

Added

  • Use Gradle JVM toolchain with language version 8 to compile the project
  • Basic tests for CLI (#540)
  • Add experimental rule for unnecessary parentheses in function call followed by lambda (#1068)

Fixed

  • Fix indentation of function literal (#1247)
  • Fix false positive in rule spacing-between-declarations-with-annotations (#1281)
  • Do not remove imports for same class when different alias is used (#1243)
  • Fix NoSuchElementException for property accessor (trailing-comma) (#1280)
  • Fix ClassCastException using ktlintFormat on class with KDoc (no-trailing-spaces) (#1270)
  • Do not remove trailing comma in annotation (#1297)
  • Do not remove import which is used as markdown link in KDoc only (no-unused-imports) (#1282)
  • Fix indentation of secondary constructor (indent) (#1222)
  • Custom gradle tasks with custom ruleset results in warning (#1269)
  • Fix alignment of arrow when trailing comma is missing in when entry (trailing-comma) (#1312)
  • Fix indent of delegated super type entry (indent) (#1210)
  • Improve indentation of closing quotes of a multiline raw string literal (indent) (#1262)
  • Trailing space should not lead to delete of indent of next line (no-trailing-spaces) (#1334)
  • Force a single line function type inside a nullable type to a separate line when the max line length is exceeded (parameter-list-wrapping) (#1255)
  • A single line function with a parameter having a lambda as default argument does not throw error (indent) (#1330)
  • Fix executable jar on Java 16+ (#1195)
  • Fix false positive unused import after autocorrecting a trailing comma (#1367)
  • Fix false positive indentation (parameter-list-wrapping, argument-list-wrapping) (#897, #1045, #1119, #1255, #1267, #1319, #1320, #1337
  • Force a single line function type inside a nullable type to a separate line when the max line length is exceeded (parameter-list-wrapping) (#1255)

Changed

  • Update Kotlin version to 1.6.0 release
  • Add separate tasks to run tests on JDK 11 - "testOnJdk11"
  • Update Dokka to 1.6.0 release
  • Apply ktlint experimental rules on the ktlint code base itself.
  • Update shadow plugin to 7.1.1 release
  • Add Kotlin-logging backed by logback as logging framework (#589)
  • Update Gradle to 7.4 version

0.43.2 - 2021-12-01

Fixed

  • KtLint CLI 0.43 doesn't work with JDK 1.8 (#1271)

0.43.0 - 2021-11-02

Added

Fixed

  • Fix false positive with lambda argument and call chain (indent) (#1202)
  • Fix trailing spaces not formatted inside block comments (no-trailing-spaces) (#1197)
  • Do not check for .idea folder presence when using applyToIDEA globally (#1186)
  • Remove spaces before primary constructor (paren-spacing) (#1207)
  • Fix false positive for delegated properties with a lambda argument (indent) (#1210)
  • (REVERTED in Ktlint 0.45.0) Remove unnecessary wildcard imports (no-unused-imports) (#1256)
  • Fix indentation of KDoc comment when using tab indentation style (indent) (#850)

Changed

  • Support absolute paths for globs (#1131)
  • Fix regression from 0.41 with argument list wrapping after dot qualified expression (argument-list-wrapping)(#1159)
  • Update Gradle to 7.2 version
  • Update Gradle shadow plugin to 7.1 version
  • Update Kotlin version to 1.5.31 version. Default Kotlin API version was changed to 1.4!

0.42.1 - 2021-08-06

Dot release to fix regressions in indent rule introduced in 0.42.0 release. Thanks to t-kameyama for the fixes!

Fixed

  • Fix false positive with delegated properties (indent) (#1189)
  • Fix false positive with lambda argument in super type entry (indent) (#1188)

0.42.0 - 2021-07-29

Thank you to the following contributors for this release:

Added

  • SARIF output support (#1102)

Fixed

  • Remove needless blank lines in dot qualified expression (#1077)
  • Fix false positives for SpacingBetweenDeclarationsWithAnnotationsRule (#1125)
  • Fix false positive with eol comment (annotation-spacing) (#1124)
  • Fix KtLint dependency variant selection (#1114)
  • Fix false positive with 'by lazy {}' (indent) (#1162)
  • Fix false positive with value argument list has lambda (indent) (#764)
  • Fix false positive in lambda in dot qualified expression (argument-list-wrapping) (#1112)
  • Fix false positive with multiline expression with elvis operator in assignment (indent) (#1165)
  • Ignore backticks in imports for ordering purposes (import-ordering) (#1106)
  • Fix false positive with elvis operator and comment (chain-wrapping) (#1055)
  • Fix false negative in when conditions (chain-wrapping) (#1130)
  • Fix the Html reporter Chinese garbled (#1140)
  • Performance regression introduced in 0.41.0 (#1135)

Changed

  • Updated to dokka 1.4.32 (#1148)
  • Updated Kotlin to 1.5.20 version

0.41.0 - 2021-03-16

Note: This release contains breaking changes to globs passed to ktlint via the command line. See (#999) and the README.

Thank you to t-kameyama and paul-dingemans for your contributions to this release!

Added

  • New ktlint_ignore_back_ticked_identifier EditorConfig option for max-line-length rule to ignore long method names inside backticks (primarily used in tests) (#1007)
  • Allow to add/replace loaded .editorconfig values via ExperimentalParams#editorConfigOverride (#1016)
  • ReporterProvider, LintError, RuleSetProvider now implement Serializable interface

Fixed

  • Incorrect indentation with multiple interfaces (#1003)
  • Empty line before primary constructor is not reported and formatted-out (#1004)
  • Fix '.editorconfig' generation for "import-ordering" rule (#1011)
  • Fix "filename" rule will not work when '.editorconfig' file is not found (#997)
  • EditorConfig generation for import-ordering (#1011)
  • Internal error (no-unused-imports) (#996)
  • Fix false positive when argument list is after multiline dot-qualified expression (argument-list-wrapping) (#893)
  • Fix indentation for function types after a newline (indent) (#918)
  • Don't remove the equals sign for a default argument (no-line-break-before-assignment) (#1039)
  • Fix internal error in no-unused-imports (#1040)
  • Fix false positives when declaration has tail comments (spacing-between-declarations-with-comments) (#1053)
  • Fix false positive after else keyword (argument-list-wrapping) (#1047)
  • Fix formatting with comments (colon-spacing) (#1057)
  • Fix IndexOutOfBoundsException in argument-list-wrapping-rule formatting file with many corrections (#1081)
  • Fix formatting in arguments (multiline-if-else) (#1079)
  • Fix experimental:annotation-spacing-rule autocorrection with comments
  • Migrate from klob dependency and fix negated globs passed to CLI are no longer worked (#999) Breaking: absolute paths globs will no longer work, check updated README

Changed

  • Update Gradle shadow plugin to 6.1.0 version
  • Align with Kotlin plugin on how alias pattern is represented for imports layout rule (#753)
  • Align with Kotlin plugin on how subpackages are represented (#753)
  • Deprecated custom kotlin_imports_layout EditorConfig property. Please use ij_kotlin_imports_layout to ensure that the Kotlin IDE plugin and ktlint use same imports layout (#753)
  • Deprecated idea and ascii shortcuts as the ij_kotlin_imports_layout property does not support those. Please check README on how to achieve those with patterns (#753)
  • Update Gradle to 6.8.3 version
  • Update Kotlin to 1.4.31 version. Fixes #1063.

0.40.0 - 2020-12-04

Special thanks to t-kameyama for the huge number of bugfixes in this release!

Added

  • Initial implementation IDE integration via '.editorconfig' based on rules default values (#701)
  • CLI subcommand generateEditorConfig to generate '.editorconfig' content for Kotlin files (#701)
  • A new capability to generate baseline and run ktlint against it with --baseline cli option (#707)

Fixed

  • Do not report when semicolon is before annotation/comment/kdoc and lambda (#825)
  • Fix false positive when import directive has backticks and alias (#910)
  • @receiver annotations with parameters are not required to be on a separate line (#885)
  • Fix false positive "File annotations should be separated from file contents with a blank line" in kts files (#914)
  • Fix false positive Missing newline after "->" when when entry has a nested if/else block (#901)
  • Allow an inline block comment in argument-list-wrapping (#926)
  • Fix false positive for line-breaks inside lambdas in argument-list-wrapping (#861) (#870)
  • Fix wrong indentation inside an if-condition in argument-list-wrapping (#854) (#864)
  • Fix false positive for method after string template in argument-list-wrapping (#842) (#859)
  • Fix false positive when a comment is not between declarations in spacing-between-declarations-with-comments(#865)
  • Fix formatting with comments (multiline-if-else) (#944)
  • Do not insert unnecessary spacings inside multiline if-else condition (indent) (#871) (#900)
  • Correctly indent primary constructor parameters when class has multiline type parameter (parameter-list-wrapping) (#921) (#938)
  • Correctly indent property delegates (indent) (#939)
  • Fix false positive for semicolon between empty enum entry and member (no-semicolons) (#957)
  • Fix wrong indentation for class delegates (indent) (#960) (#963) (#877)
  • Fix wrong indentation in named arguments (indent) (#964)
  • Fix wrong indentation when a function has multiline type arguments (parameter-list-wrapping) (#965)
  • Fix false positive for spacing-between-declarations-with-annotations (#970)
  • Fix ParseException when an assigment contains comments (no-line-break-before-assignment) (#956)
  • Fix false positive when right brace is after a try-catch block (spacing-around-keyword) (#978)
  • Fix false positive for control flow with empty body (no-semicolons) (#955)
  • Fix incorrect indentation for multi-line call expressions in conditions (indent) (#959)
  • Fix false positive for trailing comma before right parentheses|bracket|angle (spacing-around-comma) (#975)
  • Fix ktlint CLI could skip checking some of explicetly passed files (#942)

Changed

  • 'import-ordering' now supports `.editorconfig' default value generation (#701)
  • Update Gradle to 6.7.1 version

0.39.0 - 2020-09-14

Added

  • Add new applyToIDEA location for IDEA 2020.1.x and above on MacOs
  • Debug output: print loaded .editorconfig content
  • Extract argument-list-wrapping rule into experimental ruleset
  • Split annotation-spacing into separate experimental rule

Fixed

  • Do not enforce raw strings opening quote to be on a separate line (#711)
  • False negative with multiline type parameter list in function signature for parameter-list-wrapping(#680)
  • Alternative .editorconfig path is ignored on stdin input (#869)
  • False positive with semicolons before annotations/comments/kdoc (#825)
  • Do not report when string-template expression is a keyword (#883)
  • False positive for subclass imports in no-unused-imports (#845)
  • False positive for static java function imports in no-unused-imports (#872)
  • Missing signature for KtLint CLI artifact published to Github release (#895)
  • Crash in annotation rule (#868)
  • False-positive unused import violation (#902)

Changed

  • Ktlint object internal code cleanup
  • Deprecate some of public methods in Ktlint object that should not be exposed as public api
  • Update Kotlin to 1.4.10 version
  • Make RuleSet class open so it can be inherited

0.38.1 - 2020-08-24

Minor release to support projects using mixed 1.3/1.4 Kotlin versions (e.g. Gradle plugins)

Changed

  • Compile with apiLevel = 1.3

0.38.0 - 2020-08-21

New release with Kotlin 1.4.0 support and several enhancements and bugfixes.

Added

  • Experimental SpacingAroundAngleBracketsRule (#769)
  • Checksum generation for executable Jar (#695)
  • Enable Gradle dependency verification
  • parameter-list-wrapping rule now also considers function arguments while wrapping (#620)
  • Publish snapshots built against kotlin development versions
  • Initial support for tab-based indentation (#128)

Fixed

  • Safe-called wrapped trailing lambdas indented correctly (#776)
  • provideDelegate imports are not marked as unused anymore (#669)
  • Set continuation indent to 4 in IDE integration codestyle (#775)
  • No empty lines between annotation and annotated target (#688)
  • Unused imports reported correctly (#526) (#405)
  • No false empty lines inserted in multiline if-else block (#793)
  • No-wildcard-imports properly handles custom infix function with asterisk (#799)
  • Do not require else to be in the same line of a right brace if the right brace is not part of the if statement (#756)
  • Brace-less if-else bodies starting with parens indented correctly (#829)
  • If-condition with multiline call expression inside indented correctly (#796)

Changed

  • Update Gradle to 6.6 version
  • Update ec4j to 0.2.2 version. Now it should report path to .editorconfig file on failed parsing and allow empty .editorconfig files.
  • Update Kotlin to 1.4.0 version (#830)

0.37.2 - 2020-06-16

Minor release to fix further bugs in ImportOrderingRule.

Fixed

  • Imports with aliases no longer removed (#766)

0.37.1 - 2020-06-08

Minor release to fix some bugs in the 0.37.0 release.

Fixed

  • Invalid path exception error on Windows machines when loading properties from .editorconfig (#761)
  • Imports with as no longer removed (#766)
  • The contents of raw strings are no longer modified by the indent rule (#682)

0.37.0 - 2020-06-02

Thank you to Tapchicoma and romtsn for all their hard work on this release!

Added

  • Gradle wrapper validation (#684)
  • Experimental SpacingAroundDoubleColon rule (#722]
  • Experimental SpacingBetweenDeclarationsWithCommentsRule and SpacingBetweenDeclarationsWithAnnotationsRule. Fixes ([#721]#721)
  • kotlin_imports_layout config for .editorconfig file so that import ordering is configurable. Fixes (#527)

Changed

  • Kotlin was updated to 1.3.70 version
  • Loading properties from .editorconfig was fully delegated to ec4j library. This fixes ability to override properties for specific files/directories (#742)
  • Promote experimental "indent" rule to standard one, old standard "indent" rule is removed
  • Functions to calculate line/column are now public so they can be used by 3rd party tools (#725)
  • AnnotationRule now handles file annotations as well (#714)

Fixed

  • Ignore keywords in KDoc comments (#671)
  • Allow multiple spaces in KDoc comments (#706)
  • Trailing comment no longer reported as incorrect indentation (#710]
  • Annotated function types no longer reported as an error (#737)
  • FinalNewlineRule no longer reports error for empty files (#723)
  • EOL comments will no longer cause AnnotationRule to report an error (#736)
  • Formatter will no longer break class declaration with trailing comment (#728)
  • Formatting for single line if/else statements (#174)
  • Exception in NoLineBreakBeforeAssignmentRule (#693)

Removed

  • Removed Maven; builds all run under Gradle (#445)
  • Old standard IndentRule

0.36.0 - 2019-12-03

Added

  • HTML reporter (#641)
  • Experimental rule to lint enum entry names (#638)
  • @Suppress("RemoveCurlyBracesFromTemplate") now respected (#263)

Upgraded

  • Gradle version to 5.6.2 (#616)
  • Kotlin to 1.3.60 (#658)

Fixed

  • .git directory now discovered instead of hardcoded (#623)
  • Several bugs with the experimental annotation rule (#628) (#642) (#654) (#624)
  • Allow newline after lambda return type (#643)
  • Allow empty first line in a function that returns an anonymous object (#655)
  • Indentation with lambda argument (#627)
  • ktlint can now lint UTF-8 files with BOM (#630
  • Indentation with newline before return type (#663)
  • Build/tests on Windows (#640)
  • Allow whitespace after ( followed by a comment (#664)

0.35.0 - 2019-10-12

Added

  • Support for specifying color for output via --color-name command line flag. (#585)
  • Support for custom rulesets and providers on Java 9+ (#573)

Deprecated

  • --apply-to-idea flag; use applyToIDEA subcommand instead (#554)
  • --apply-to-idea-project flag; use applyToIDEAProject subcommand instead (#593)
  • 0.0.0-SNAPSHOT builds; snapshot builds are now versioned, e.g. 0.35.0-SNAPSHOT (#588)
    • Note: When using the new snapshot builds, you may need to add an explicit dependency on kotlin-compiler-embeddable to your ruleset project.

Removed

  • Support for loading 3rd party rulesets via Maven (#566)

Upgraded

  • Kotlin version to 1.3.50 (#565) (#611)

Fixed

  • Bugs with spacing in experimental AnnotationRule (#552) (#601
  • Brackets would be removed from empty companion object (#600)
  • Bugs with experimental IndentationRule (#597) (#599)
  • Erroneous space between } and ] (#596)
  • Spacing around multiplication sign in lambdas (#598)
  • --version output with gradle-built JAR (#613)

0.34.2 - 2019-07-22

Minor bugfix release for 0.34.0. (Note: 0.34.1 deprecated/deleted due to regression in disabled_flags .editorconfig support.)

Added

  • Support for globally disabling rules via --disabled_rules command line flag. (#534)

Fixed

  • Regression with --stdin flag for printAST command (#528)
  • Regressions with NoUnusedImports rule (#531, #526)
    • Note: this re-introduces #405
  • Indentation for enums with multi-line initializers (#518)

0.34.0 - 2019-07-15

Added

  • Support for Kotlin 1.3.41
  • Support for globally disabling rules via custom disabled_rules property in .editorconfig (#503)
  • experimental:no-empty-first-line-in-method-block (#474)
  • Unit tests for ruleset providers

Upgraded

  • AssertJ from 3.9.0 to 3.12.2 (#520)

Enabled

  • Final newline by default (#446)
  • no-wildcard-import (Re-enabled after temporarily disabling in 0.33.0)
  • experimental:annotation (#509)
  • experimental:multiline-if-else (no autocorrection)
  • experimental:package-name (currently only disallows underscores in package names)

Deprecated

  • MavenDependencyResolver. Scheduled to be removed in 0.35.0 (#468)
  • --install-git-pre-commit-hook flag; use installGitPreCommitHook subcommand instead (#487)
  • --print-ast flag; use printAST subcommand instead (#500)

Removed

  • Support for --ruleset-repository and --ruleset-update flags

Fixed

  • import-ordering will now refuse to format import lists that contain top-level comments (#408)
  • no-unused-imports reporting false negatives or false positives in some cases (#405) and (#506)
  • experimental:indent incorrectly formatting a lambda's closing brace (#479)

0.33.0 - 2019-05-28

Added

  • Support for Kotlin 1.3.31

Disabled

  • No wildcard imports rule (#48). Developers wishing to still enforce this rule should add the code into a custom ruleset.

Fixed

  • Spec file parsing is now platform-agnostic (#365)
  • Unnecessary newline after -> in some cases (#403)
  • SpacingAroundCommaRule will no longer move code into comments
  • Made newlines after = less aggressive (#368) (#380)
  • Erroneous newline when parameter comments are used (#433)

0.32.0 - 2019-04-22

Added

  • experimental/import-ordering rule (#189). Use ktlint --experimental to enabled.
  • Support for Kotlin 1.3.30
  • Build now compatible with jitpack
  • ktlint now part of Homebrew core (shyiko/ktlint tap deprecated)

Fixed

  • Incorrectly flagging a missing newline for functions with no parameters (#327).
  • Semicolons now allowed in KDocs (#362).
  • Spaces now disallowed after super (#369).
  • Annotations in function parameters now checked for indentation (#374]

Changed

  • Code now lives in com.pinterest package
  • groupId now com.pinterest
  • Custom ruleset META-INF.services file must be renamed to com.pinterest.ktlint.core.RuleSetProvider

0.31.0 - 2019-03-10

Added

  • dot-spacing rule (#293).
  • experimental/indent rule (#338).
    Use ktlint --experimental to enable.

Fixed

  • Spacing check around < & > operators.

Changed

  • no-multi-spaces rule (horizontal alignment of comments is no longer allowed) (#269).
  • colon-spacing rule (: must not appear at the beginning of the line).
  • package-name rule (disabled until #208 is resolved).
  • --print-ast to output com.pinterest.ktlint.core.ast.ElementType.* as node.elementType, e.g.
$ echo 'fun f() {}' | ./ktlint/target/ktlint --print-ast --color --stdin
1: ~.psi.KtFile (FILE)
1:   ~.psi.KtPackageDirective (PACKAGE_DIRECTIVE) ""
1:   ~.psi.KtImportList (IMPORT_LIST) ""
1:   ~.psi.KtScript (SCRIPT)
1:     ~.psi.KtBlockExpression (BLOCK)
1:       ~.psi.KtNamedFunction (FUN)
1:         ~.c.i.p.impl.source.tree.LeafPsiElement (FUN_KEYWORD) "fun"
1:         ~.c.i.p.impl.source.tree.PsiWhiteSpaceImpl (WHITE_SPACE) " "
1:         ~.c.i.p.impl.source.tree.LeafPsiElement (IDENTIFIER) "f"
1:         ~.psi.KtParameterList (VALUE_PARAMETER_LIST)
1:           ~.c.i.p.impl.source.tree.LeafPsiElement (LPAR) "("
1:           ~.c.i.p.impl.source.tree.LeafPsiElement (RPAR) ")"
1:         ~.c.i.p.impl.source.tree.PsiWhiteSpaceImpl (WHITE_SPACE) " "
1:         ~.psi.KtBlockExpression (BLOCK)
1:           ~.c.i.p.impl.source.tree.LeafPsiElement (LBRACE) "{"
1:           ~.c.i.p.impl.source.tree.LeafPsiElement (RBRACE) "}"
1:       ~.c.i.p.impl.source.tree.PsiWhiteSpaceImpl (WHITE_SPACE) "\n"

   format: <line_number:> <node.psi::class> (<node.elementType>) "<node.text>"
   legend: ~ = org.jetbrains.kotlin, c.i.p = com.intellij.psi
  • kotlin-compiler version to 1.3.21 (from 1.3.20).

Removed

  • Dependency on JCenter (#349).

0.30.0 - 2019-02-03

Fixed

  • Missing newline before ")" (#327).

Changed

  • kotlin-compiler version to 1.3.20 (from 1.2.71) (#331).

Security

  • --ruleset/--reporter switched to HTTPS (#332).

0.29.0 - 2018-10-02

Fixed

  • no-semi rule to preserve semicolon after companion object; (see #281 for details).
  • "line number off by one" when end_of_line=CRLF is used (#286).

Changed

  • package-name rule not to check file location (until #280 can be properly addressed).
  • comment-spacing rule not to flag //region & //endregion comments (#278).
  • kotlin-compiler version to 1.2.71 (from 1.2.51).

0.28.0 - 2018-09-05

Fixed

  • ktlint hanging in case of unhandled exception in a reporter (#277).

Changed

  • package-name rule (directories containing . in their names are no longer considered to be invalid) (#276).

0.27.0 - 2018-08-06

Changed

  • ktlint output (report location is now printed only if there are style violations) (#267).

0.26.0 - 2018-07-30

Changed

  • max-line-length rule (multi-line strings are no longer checked) (#262).

0.25.1 - 2018-07-25

Fixed

  • json reporter \ and control characters escaping (#256).

0.25.0 - 2018-07-25

Added

  • package-name rule (#246).
  • --editorconfig=path/to/.editorconfig (#250).
  • Support for end_of_line=native (.editorconfig) (#225).
  • tab -> space * indent_size auto-correction (--format/-F).

Fixed

  • "Unnecessary semicolon" false positive (#255).
  • (cannot be auto-corrected) reporting.
  • OOM in --debug mode while trying to print root=true <- root=false .editorconfig chain.

Changed

  • kotlin-compiler version to 1.2.51 (from 1.2.50).

0.24.0 - 2018-06-22

Added

  • paren-spacing rule (#223).
  • Report location output (#218, #224).
  • An indication that some lint errors cannot be auto-corrected (#219).
  • Git hook to automatically check files for style violations on push (an alternative to existing ktlint --install-git-pre-commit-hook)
    (execute ktlint --install-git-pre-push-hook to install) (#229).
  • Support for end_of_line=crlf (.editorconfig) (#225).

Fixed

  • .editorconfig path resolution
    (you no longer need to be inside project directory for .editorconfig to be loaded) (#207).
  • NPE in case of I/O error (klob@0.2.1).

Changed

  • comment-spacing rule to exclude //noinspection (#212).
  • kotlin-compiler version to 1.2.50 (from 1.2.41) (#226).

0.23.1 - 2018-05-04

Fixed

  • ClassCastException: cannot be cast to LeafPsiElement (#205).

0.23.0 - 2018-05-02

Added

  • comment-spacing (#198),
    filename (#194) rules.
  • parameter-list-wrapping left parenthesis placement check (#201).
  • parameter-list-wrapping auto-correction when max_line_length is exceeded (#200).

Fixed

  • "Unused import" false positive (x.y.zNNN import inside x.y.z package) (#204).

Changed

  • kotlin-compiler version to 1.2.41 (from 1.2.40).

0.22.0 - 2018-04-22

Added

  • --apply-to-idea-project (as an alternative to (global) --apply-to-idea) (#178).
  • Check to verify that annotations are placed before the modifiers (#183).
  • Access to PsiFile location information (#194).

Fixed

  • --format commenting out operators (chain-wrapping rule) (#193).

Changed

  • indent rule (continuation_indent_size is now ignored) (#171).
    NOTE: if you have a custom continuation_indent_size (and gcd(indent_size, continuation_indent_size) == 1) ktlint won't check the indentation.
  • --apply-to-idea to inherit "Predefined style / Kotlin style guide" (Kotlin plugin 1.2.20+).
  • kotlin-compiler version to 1.2.40 (from 1.2.30).

0.21.0 - 2018-03-29

Changed

  • indent rule to ignore where <type constraint list> clause (#180).

0.20.0 - 2018-03-20

Added

  • Ability to load 3rd party reporters from the command-line (e.g. --reporter=<name>,artifact=<group_id>:<artifact_id>:<version>) (#176).
  • --ruleset/--reporter dependency tree validation.

Fixed

  • Handling of spaces in --reporter=...,output=<path_to_a_file> (#177).
  • +, -, *, /, %, &&, || wrapping (#168).

Changed

  • comma-spacing rule to be more strict (#173).
  • no-line-break-after-else rule to allow multi-line if/else without curly braces.

0.19.0 - 2018-03-04

Changed

  • Lambda formatting: if lambda is assigned a label, there should be no space between the label and the opening curly brace (#167).

0.18.0 - 2018-03-01

Added

  • Java 9 support (#152).

Changed

  • kotlin-compiler version to 1.2.30 (from 1.2.20).

0.17.1 - 2018-02-28

Fixed

  • Internal Error (parameter-list-wrapping) when indent_size=unset (#165).

0.17.0 - 2018-02-28

Fixed

  • +/- wrapping inside catch block, after else and if (..) (#160).
  • Multi-line parameter declaration indentation (#161).
  • Expected indentation reported by indent rule.

Changed

  • Error code returned by ktlint --format/-F when some of the errors cannot be auto-corrected (previously it was 0 instead of expected 1) (#162).

0.16.1 - 2018-02-27

Fixed

  • Handling of negative number condition in when block (#160).

0.16.0 - 2018-02-27

Added

  • parameter-list-wrapping rule (#130).
  • +, -, *, /, %, &&, || wrapping check (now part of chain-wrapping rule).

Fixed

  • Unused componentN import (where N > 5) false positive (#142).
  • max-line-length error suppression (#158).

Changed

0.15.1 - 2018-02-14

Fixed

  • Race condition when multiple rules try to modify AST node that gets detached as a result of mutation (#154).

0.15.0 - 2018-01-18

Added

  • no-line-break-after-else rule (#125).

Changed

  • kotlin-compiler version to 1.2.20 (from 1.2.0).

0.14.0 - 2017-11-30

Changed

Fixed

  • Maven integration (#117).

0.13.0 - 2017-11-28

Added

  • no-line-break-before-assignment (#105),
    chain-wrapping (#23) (when wrapping chained calls ., ?. and ?: should be placed on the next line),
    range-spacing (no spaces around range (..) operator) rules.
  • --print-ast CLI option which can be used to dump AST of the file
    (see README / Creating a ruleset / AST for more details)
  • --color CLI option for colored output (where supported, e.g. --print-ast, default (plain) reporter, etc)

Changed

  • .editorconfig property resolution.
    An explicit [*.{kt,kts}] is not required anymore (ktlint looks for sections containing *.kt (or *.kts) and will fallback to [*] whenever property cannot be found elsewhere).
    Also, a search for .editorconfig will no longer stop on first (closest) .editorconfig (unless it contains root=true).
  • max-line-length rule to assume max_line_length=100 when ktlint --android ... is used
    (per Android Kotlin Style Guide).
  • kotlin-compiler version to 1.2.0 (from 1.1.51).

Fixed

  • no-empty-class-body auto-correction at the end of file (#109).
  • max-line-length rule when applied to KDoc (#112)
    (previously KDoc was subject to max-line-length even though regular comments were not).
  • Spacing around = in @annotation|s (op-spacing).
  • Spacing around generic type parameters of functions (e.g. fun <T>f(): T {} -> fun <T> f(): T {}).
  • no-consecutive-blank-lines not triggering at the end of file (when exactly 2 blank lines are present) (#108)
  • indent continuation_indent_size % indent_size != 0 case (#76)
  • indent rule skipping first parameter indentation check.
  • final-newline rule in the context of kotlin script.
  • Git hook (previously files containing space character (among others) in their names were ignored)
  • Exit code when file cannot be linted due to the invalid syntax or internal error.

0.12.1 - 2017-11-13

Fixed

  • A conflict between org.eclipse.aether:aether-*:1.1.0 and org.eclipse.aether:aether-*:1.0.0.v20140518 (#100).

0.12.0 - 2017-11-10

Added

  • --android (-a) CLI option (turns on Android Kotlin Style Guide compatibility)
    (right now it's used only by ktlint --apply-to-idea).

Changed

  • ktlint --apply-to-idea to account for indent_size & continuation_indent_size in .editorconfig (if any).

Removed

  • ktlint-intellij-idea-integration binary (deprecated in 0.9.0).

Fixed

  • "Unused import" false positive (component1..component5).

0.11.1 - 2017-10-26

Fixed

  • --reporter's output handling (previously parent directory was expected to exist) (#97).

0.11.0 - 2017-10-25

Added

  • no-blank-line-before-rbrace rule (#65).

Fixed

  • Redundant space inserted between } and :: (curly-spacing).

0.10.2 - 2017-10-25 [YANKED]

This release contains changes that were meant for 0.11.0 and so it was retagged as such.

0.10.1 - 2017-10-22

Fixed

  • Redundant space inserted between } and [key]/(...) (curly-spacing) (#91).

0.10.0 - 2017-10-10

Added

  • Git hook to automatically check files for style violations on commit
    (execute ktlint --install-git-pre-commit-hook to install).
  • Ability to specify multiple reporters
    (output can be controlled with --reporter=<name>,output=<path/to/file>) (#71).
  • Support for indent_size=unset (.editorconfig) (#70).

Fixed

  • ( { formatting
    (previously both ( { and ({ were accepted as correct, while only ({ should be) (curly-spacing rule) (#80).
  • if\nfn {}\nelse formatting (curly-spacing rule).
  • max_line_length=off & max_line_length=unset handling (.editorconfig).

Changed

  • kotlin-compiler version to 1.1.51 (from 1.1.3-2).
  • ktlint --apply-to-idea to include OPTIMIZE_IMPORTS_ON_THE_FLY=true.

0.9.2 - 2017-09-01

Fixed

  • : Unit = formatting (: Unit is no longer dropped when = is used) (#77).

0.9.1 - 2017-07-30

Fixed

  • ${super.toString()} linting (string-template rule) (#69).

0.9.0 - 2017-07-23

Added

  • Reporter API.
    ktlint comes with 3 built-in reporters: plain (default; ?group_by_file can be appended to enable grouping by file (shown below)), json and checkstyle.
$ ktlint --reporter=plain?group_by_file
path/to/file.kt
  1:10 Unused import.
  2:10 Unnecessary "Unit" return type.
path/to/another-file.kt
  1:10 Unnecessary semicolon.
  • string-template,
    no-empty-class-body,
    max-line-length (#47),
    final-newline (activated only if insert_final_newline is set in .editorconfig (under [*.{kt,kts}])) rules.
  • --limit CLI option (e.g. use --limit=10 to limit the number of errors to display).
  • --relative CLI flag which makes ktlint output file paths relative to working directory (e.g. dir/file.kt instead of /home/269/project/dir/file.kt).

Changed

  • BREAKING: JDK version to 1.8 (as a result of upgrading kotlin-compiler to 1.1.3-2 (from 1.1.0)).
  • File matching (offloaded to klob).

Deprecated

  • --ruleset-repository and --ruleset-update CLI arguments in favour of --repository and --repository-update respectively (--ruleset-* will be removed in 1.0.0).
  • ktlint-intellij-idea-integration binary
    (Intellij IDEA integration task is now included in ktlint (as ktlint --apply-to-idea)).

0.8.3 - 2017-06-19

Fixed

  • "Missing spacing after ";"" at the end of package declaration (#59).
  • "Unused import" false positive (setValue) (#55).
  • get/setter spacing (#56).

0.8.2 - 2017-06-06

Fixed

  • "Unused import" false positive (getValue) (#54).

0.8.1 - 2017-05-30

Fixed

  • ktlint --stdin (#51).

0.8.0 - 2017-05-30

Added

Fixed

  • ktlint-ruleset-standard ("no-unit-return" & "modifier-order" where not included).

0.7.1 - 2017-05-29

Fixed

  • Triggering of "Unused import" when element is referenced in KDoc(s) only (#46).

0.7.0 - 2017-05-28

Added

  • no-unit-return rule.
  • modifier-order rule (#42).
  • else/catch/finally on the same line as } check (now part of "keyword-spacing" rule).
  • ktlint-intellij-idea-integration binary for easy Intellij IDEA config injection.

0.6.2 - 2017-05-22

Fixed

  • Unused "iterator" extension function import false positive (#40).

0.6.1 - 2017-03-06

Fixed

  • Detection of unnecessary "same package" imports (no-unused-imports).
  • FileNotFoundException while scanning FS (#36).

0.6.0 - 2017-03-01

Changed

  • kotlin-compiler version to 1.1.0 (from 1.1-M04).

0.5.1 - 2017-02-28

Fixed

  • Unnecessary spacing around angle brackets in case of super<T> (#34).

0.5.0 - 2017-02-20

Fixed

  • Redundant space inserted between } and !! (curly-spacing).

Changed

  • indent rule to allow "Method declaration parameters -> Align when multiline" (as this option is (unfortunately) "on" by default in Intellij IDEA) (#26).

0.4.0 - 2017-02-01

Fixed

  • NPE in case of "Permission denied" (while scanning the file system).

Changed

  • kotlin-compiler version to 1.1-M04 (from 1.0.6).

0.3.1 - 2017-01-25

Fixed

  • Unused infix function call import false positive (#25).

0.3.0 - 2017-01-11

Added

  • *.kts (script) support.

Changed

  • kotlin-compiler version to 1.0.6 (from 1.0.3).

0.2.2 - 2016-10-11

Fixed

  • no-wildcard-imports rule (kotlinx.android.synthetic excluded from check) (#16).

0.2.1 - 2016-09-13

Fixed

  • curly-spacing false negative in case of }?..

0.2.0 - 2016-09-05

Added

  • Support for 3rd party "ruleset"s.

Changed

  • ktlint -F output (it now includes lint errors that cannot be fixed automatically).

Fixed

  • ktlint -F --debug error count.
  • Glob implementation (previously it was prone to catastrophic backtracking).
  • Redundant semicolon false positive in case of enum (#12).
  • Unused operator import false positive (#13).

0.1.2 - 2016-08-05

Fixed

  • "in-use" escaped imports detection (#7) (no-unused-imports).

0.1.1 - 2016-08-01

Fixed

  • Incorrect spacing around curly braces (curly-spacing).

0.1.0 - 2016-07-27