Git Product home page Git Product logo

kotlin-auto-formatter's Introduction

Kotlin autoformatter

Actions Status LINE

This is an automated and opinionated tool for reformatting Kotlin source files. Source files are reformatted so that the code fits within a specified column limit (by default, 100 columns, as specified by the Google Kotlin style guide) and line breaks occur at reasonable points.

This tool is still work in progress, but can already handle a wide variety of cases.

Running the tool

The tool can be run as a standalone program, a simple Gradle plugin, or embedded in another program as a library.

When run on a file, the formatter replaces the existing file content. Use a revision control system such as Git to ensure that the original is not lost in case of bugs in the tool.

Standalone

The Gradle target installDist installs the formatter under build/install/kotlin-auto-formatter. To run it, use

./build/install/kotlin-auto-format/bin/kotlin-auto-format <file to be formatted>

As Gradle plugin

This formatter comes with a Gradle plugin adding the following tasks to your project:

  • formatKotlinSource, which runs the formatter on all source files.
  • formatKotlinScript, which runs the formatter on all Kotlin script files, e.g. build.gradle.kts.
  • formatKotlin, which runs both formatKotlinSource and formatKotlinScript.

To use the plugin, add the following to your build.gradle.kts:

plugins {
    id("tech.formatter-kt.formatter") version "0.7.9"
}

Or, if you are using the Groovy DSL, in build.gradle:

plugins {
    id 'tech.formatter-kt.formatter' version '0.7.9'
}

The task formatKotlinSource depends on one of the Kotlin plugins having been previously applied in order to locate the project's Kotlin source files. If the task has the status NO-SOURCE despite the existence of Kotlin source files, check that the Kotlin plugin is applied before the Kotlin auto-formatter plugin.

As a library

It is possible to invoke the formatter directly from other Java/Kotlin code. See the class KotlinFormatter for documentation.

Configuration

Currently, it is only possible to configure the formatter when it is embedded as a library. See KotlinFormatter for details.

Preserving newlines

The formatter contains experimental support for preserving newlines in blocks of code when requested. The formatter normally aggressively removes syntactically unnecessary newlines when no line break is needed to maintain the 100 column limit. This can cause some DSLs to be rendered in a less readable manner. To instruct the formatter to preserve newlines, add the following comment:

// ktformat: start-preserve-newlines

To restore default behaviour, add the following comment:

// ktformat: end-preserve-newlines

Comparison with other tools

Kotlin autoformatter vs. ktlint

  • Can autoformat to fit in a (configurable) column limit; ktlint complains about a violated column limit but cannot reformat to fit.
  • Aggressively reformats ala Google Java formatter, whereas ktlint reformats only lines which violate linting rules.
  • Does not have all of the rules of ktlint, e.g. replacing ${variable} with $variable in a string template.

For the most part, it should be fine to use both ktlint and this formatter in the same project. There is one point where this formatter's output is incompatible with the default settings in ktlint. Namely, ktlint will complain about the newline before the lambda expression in the following:

aFunctionCall(someArgument, someOtherArgument)
    { ...a lambda argument }

If the column limit is right after the closing right parenthesis on the first line, then the above is exactly how this tool will format the code. The recommended solution here, should you be using ktlint and run into this, is to disable the corresponding ktlint rule by adding the line

disabled_rules=curly-spacing

to your project's .editorconfig file.

Kotlin autoformatter vs. ktfmt

  • Output of Kotlin autoformatter is compliant with Kotlin coding conventions; ktfmt output is not.
  • Indentation amount and column limit are configurable in Kotlin autoformatter.
  • Runs on JDK 8+; ktfmt requires JDK 11+.

Kotlin autoformatter vs. IntelliJ

  • IntelliJ autoformatter can autoformat individual sections of a file, but doesn't always produce desirable output.
  • The Kotlin autoformatter can only format full files (unless used as a library) but produces generally better output.

Upcoming work

  • Creation of an IntelliJ plugin.
  • Allow configuration via command line arguments and Gradle plugin.
  • Configuration of the maximum line length from .editorconfig.

License

LGPL 3.0

kotlin-auto-formatter's People

Contributors

hovinen avatar sebruck avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

sebruck zimolab

kotlin-auto-formatter's Issues

Some function expression bodies are wrongly split into lines

This example function with an expression body:

fun something(one: String, two: String, m: Map<Pair<String, String>, String>): String? =
    m[one to two]

Ends up being formatted like this:

fun something(one: String, two: String, m: Map<Pair<String, String>, String>): String? = m[one to
    two]

I am not sure if there are other cases that do that kind of split, we found this one by pure chance.

Annotations in data class parameters not kept in separate lines

Annotations should be placed on a separate line before the annotated element: https://kotlinlang.org/docs/coding-conventions.html#annotations

@Target(AnnotationTarget.VALUE_PARAMETER)
annotation class SomeAnnotation(val str: String)

data class Foo(
    @SomeAnnotation("something")
    val foo: Int,
    val bar: Int
)

When running the formatter on that source, the annotation is left in the same line as foo:

data class Foo(@SomeAnnotation("something") val foo: Int, val bar: Int)

plugin produces uncompilable code for if statement with comment

in my project https://github.com/christophsturm/r2dbcfun

this code:

                if (parameter.name != "id" // Primary key can be a pk class which is currently not handled here
                    && !supportedJavaTypes.contains(clazz)
                )

is converted to this, which does not compile, because it joins the comment with the beginning of the next line

                if (parameter.name != "id"
                    // Primary key can be a pk class which is currently not handled here &&
                    !supportedJavaTypes.contains(clazz)
                )

Formatter chokes at line comment

Kotlin 1.5.31
0.7.7 with Gradle plugin
Gradle 7.2

kotlin-auto-formatter is promising.
It delivers the best results of all Kotlin formatters I've tried on our codebase.

package foo

val idx = 1
val result =
  if (idx > 3) "foo" // formatter doesn't like this comment
  else "bar"
> Task :formatKotlinSource
Could not process /xxx/Test.kt (line 5): Could not match node sequence [PsiElement(if), PsiWhiteSpace, PsiElement(LPAR), Element(CONDITION), PsiElement(RPAR), PsiWhiteSpace, Element(THEN), PsiWhiteSpace, PsiComment(EOL_COMMENT), PsiWhiteSpace, PsiElement(else), PsiWhiteSpace, Element(ELSE)]

used import for java.util.* is removed

in this fragment:

import java.util.*


fun prepareH2(): ConnectionFactory {
    val uuid = UUID.randomUUID()
...
}

the formatter removes the java.util.* import and so the file no longer compiles

also the idea autoformatter keeps changing import java.util.UUID to import java.util.* so this keeps me from using the plugin

plugin version 0.6.6 fails with indexOutOfBoundsException

I can reformat my sourcecode fine with version 0.6.5, but with 0.6.6 I get only this:

Execution failed for task ':formatKotlinSource'.
> begin 1, end 0, length 1

with --stacktrace i get a pretty big stacktrace:

        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:200)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:263)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:198)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:179)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:109)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:372)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:359)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:352)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:338)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
Caused by: java.lang.StringIndexOutOfBoundsException: begin 1, end 0, length 1
        at org.kotlin.formatter.scanning.KDocScanner.trimOneWhitespace(KDocScanner.kt:49)
        at org.kotlin.formatter.scanning.KDocScanner.access$trimOneWhitespace(KDocScanner.kt:17)
        at org.kotlin.formatter.scanning.KDocScanner$nodePattern$1$3.invoke(KDocScanner.kt:30)
        at org.kotlin.formatter.scanning.KDocScanner$nodePattern$1$3.invoke(KDocScanner.kt:17)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:201)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:181)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.FinalPathStep.runActions(NodePattern.kt:150)
        at org.kotlin.formatter.scanning.nodepattern.NodePattern.matchSequence(NodePattern.kt:43)
        at org.kotlin.formatter.scanning.KDocScanner.scan(KDocScanner.kt:112)
        at org.kotlin.formatter.scanning.KotlinScanner.scanInState$formatter(KotlinScanner.kt:47)
        at org.kotlin.formatter.scanning.KotlinScanner.scanSingleNode(KotlinScanner.kt:80)
        at org.kotlin.formatter.scanning.KotlinScanner.access$scanSingleNode(KotlinScanner.kt:28)
        at org.kotlin.formatter.scanning.KotlinScanner$scanNodes$1.invoke(KotlinScanner.kt:58)
        at org.kotlin.formatter.scanning.KotlinScanner$scanNodes$1.invoke(KotlinScanner.kt:28)
        at org.kotlin.formatter.scanning.KotlinScanner$nodePattern$1$1$2$1.invoke(KotlinScanner.kt:69)
        at org.kotlin.formatter.scanning.KotlinScanner$nodePattern$1$1$2$1.invoke(KotlinScanner.kt:28)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:201)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:181)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.FinalPathStep.runActions(NodePattern.kt:150)
        at org.kotlin.formatter.scanning.nodepattern.NodePattern.matchSequence(NodePattern.kt:43)
        at org.kotlin.formatter.scanning.KotlinScanner.scanNodes$formatter(KotlinScanner.kt:59)
        at org.kotlin.formatter.scanning.KotlinScanner.scanNodes$formatter$default(KotlinScanner.kt:58)
        at org.kotlin.formatter.scanning.ModifierListScanner$nodePattern$1$2$1.invoke(ModifierListScanner.kt:43)
        at org.kotlin.formatter.scanning.ModifierListScanner$nodePattern$1$2$1.invoke(ModifierListScanner.kt:25)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:201)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:181)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.FinalPathStep.runActions(NodePattern.kt:150)
        at org.kotlin.formatter.scanning.nodepattern.NodePattern.matchSequence(NodePattern.kt:43)
        at org.kotlin.formatter.scanning.ModifierListScanner.scan(ModifierListScanner.kt:73)
        at org.kotlin.formatter.scanning.ClassScanner$nodePattern$1$1$1.invoke(ClassScanner.kt:37)
        at org.kotlin.formatter.scanning.ClassScanner$nodePattern$1$1$1.invoke(ClassScanner.kt:24)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:201)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:181)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.FinalPathStep.runActions(NodePattern.kt:150)
        at org.kotlin.formatter.scanning.nodepattern.NodePattern.matchSequence(NodePattern.kt:43)
        at org.kotlin.formatter.scanning.ClassScanner.scan(ClassScanner.kt:137)
        at org.kotlin.formatter.scanning.KotlinScanner.scanInState$formatter(KotlinScanner.kt:47)
        at org.kotlin.formatter.scanning.KotlinScanner.scanSingleNode(KotlinScanner.kt:80)
        at org.kotlin.formatter.scanning.KotlinScanner.access$scanSingleNode(KotlinScanner.kt:28)
        at org.kotlin.formatter.scanning.KotlinScanner$scanNodes$1.invoke(KotlinScanner.kt:58)
        at org.kotlin.formatter.scanning.KotlinScanner$scanNodes$1.invoke(KotlinScanner.kt:28)
        at org.kotlin.formatter.scanning.KotlinScanner$nodePattern$1$1$2$1.invoke(KotlinScanner.kt:69)
        at org.kotlin.formatter.scanning.KotlinScanner$nodePattern$1$1$2$1.invoke(KotlinScanner.kt:28)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:201)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:181)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.FinalPathStep.runActions(NodePattern.kt:150)
        at org.kotlin.formatter.scanning.nodepattern.NodePattern.matchSequence(NodePattern.kt:43)
        at org.kotlin.formatter.scanning.KotlinScanner.scanNodes$formatter(KotlinScanner.kt:59)
        at org.kotlin.formatter.scanning.KotlinScanner.scanNodes$formatter$default(KotlinScanner.kt:58)
        at org.kotlin.formatter.scanning.BlockScanner$nodePattern$1$1$2.invoke(BlockScanner.kt:23)
        at org.kotlin.formatter.scanning.BlockScanner$nodePattern$1$1$2.invoke(BlockScanner.kt:16)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:201)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:181)
        at org.kotlin.formatter.scanning.nodepattern.StateKt$andThen$1.invoke(State.kt:149)
        at org.kotlin.formatter.scanning.nodepattern.StateKt$andThen$1.invoke(State.kt)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.FinalPathStep.runActions(NodePattern.kt:150)
        at org.kotlin.formatter.scanning.nodepattern.NodePattern.matchSequence(NodePattern.kt:43)
        at org.kotlin.formatter.scanning.BlockScanner.scan(BlockScanner.kt:41)
        at org.kotlin.formatter.scanning.KotlinScanner.scanInState$formatter(KotlinScanner.kt:47)
        at org.kotlin.formatter.scanning.KotlinScanner.scanSingleNode(KotlinScanner.kt:80)
        at org.kotlin.formatter.scanning.KotlinScanner.access$scanSingleNode(KotlinScanner.kt:28)
        at org.kotlin.formatter.scanning.KotlinScanner$scanNodes$1.invoke(KotlinScanner.kt:58)
        at org.kotlin.formatter.scanning.KotlinScanner$scanNodes$1.invoke(KotlinScanner.kt:28)
        at org.kotlin.formatter.scanning.KotlinScanner$nodePattern$1$1$2$1.invoke(KotlinScanner.kt:69)
        at org.kotlin.formatter.scanning.KotlinScanner$nodePattern$1$1$2$1.invoke(KotlinScanner.kt:28)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:201)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:181)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.FinalPathStep.runActions(NodePattern.kt:150)
        at org.kotlin.formatter.scanning.nodepattern.NodePattern.matchSequence(NodePattern.kt:43)
        at org.kotlin.formatter.scanning.KotlinScanner.scanNodes$formatter(KotlinScanner.kt:59)
        at org.kotlin.formatter.scanning.KotlinScanner.scanNodes$formatter$default(KotlinScanner.kt:58)
        at org.kotlin.formatter.scanning.FunctionDeclarationScanner$nodePattern$1$1$1.invoke(FunctionDeclarationScanner.kt:33)
        at org.kotlin.formatter.scanning.FunctionDeclarationScanner$nodePattern$1$1$1.invoke(FunctionDeclarationScanner.kt:19)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:201)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:181)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.FinalPathStep.runActions(NodePattern.kt:150)
        at org.kotlin.formatter.scanning.nodepattern.NodePattern.matchSequence(NodePattern.kt:43)
        at org.kotlin.formatter.scanning.FunctionDeclarationScanner.scan(FunctionDeclarationScanner.kt:47)
        at org.kotlin.formatter.scanning.KotlinScanner.scanInState$formatter(KotlinScanner.kt:47)
        at org.kotlin.formatter.scanning.KotlinScanner.scanSingleNode(KotlinScanner.kt:80)
        at org.kotlin.formatter.scanning.KotlinScanner.access$scanSingleNode(KotlinScanner.kt:28)
        at org.kotlin.formatter.scanning.KotlinScanner$scanNodes$1.invoke(KotlinScanner.kt:58)
        at org.kotlin.formatter.scanning.KotlinScanner$scanNodes$1.invoke(KotlinScanner.kt:28)
        at org.kotlin.formatter.scanning.KotlinScanner$nodePattern$1$1$2$1.invoke(KotlinScanner.kt:69)
        at org.kotlin.formatter.scanning.KotlinScanner$nodePattern$1$1$2$1.invoke(KotlinScanner.kt:28)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:201)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:181)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.FinalPathStep.runActions(NodePattern.kt:150)
        at org.kotlin.formatter.scanning.nodepattern.NodePattern.matchSequence(NodePattern.kt:43)
        at org.kotlin.formatter.scanning.KotlinScanner.scanNodes$formatter(KotlinScanner.kt:59)
        at org.kotlin.formatter.scanning.KotlinScanner.scanNodes$formatter$default(KotlinScanner.kt:58)
        at org.kotlin.formatter.scanning.ClassScanner$classBodyNodePattern$1$2$3.invoke(ClassScanner.kt:123)
        at org.kotlin.formatter.scanning.ClassScanner$classBodyNodePattern$1$2$3.invoke(ClassScanner.kt:24)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:201)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:181)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.FinalPathStep.runActions(NodePattern.kt:150)
        at org.kotlin.formatter.scanning.nodepattern.NodePattern.matchSequence(NodePattern.kt:43)
        at org.kotlin.formatter.scanning.ClassScanner$nodePattern$1$5$1$2.invoke(ClassScanner.kt:78)
        at org.kotlin.formatter.scanning.ClassScanner$nodePattern$1$5$1$2.invoke(ClassScanner.kt:24)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:201)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:181)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.FinalPathStep.runActions(NodePattern.kt:150)
        at org.kotlin.formatter.scanning.nodepattern.NodePattern.matchSequence(NodePattern.kt:43)
        at org.kotlin.formatter.scanning.ClassScanner.scan(ClassScanner.kt:137)
        at org.kotlin.formatter.scanning.KotlinScanner.scanInState$formatter(KotlinScanner.kt:47)
        at org.kotlin.formatter.scanning.KotlinScanner.scanSingleNode(KotlinScanner.kt:80)
        at org.kotlin.formatter.scanning.KotlinScanner.access$scanSingleNode(KotlinScanner.kt:28)
        at org.kotlin.formatter.scanning.KotlinScanner$scanNodes$1.invoke(KotlinScanner.kt:58)
        at org.kotlin.formatter.scanning.KotlinScanner$scanNodes$1.invoke(KotlinScanner.kt:28)
        at org.kotlin.formatter.scanning.KotlinScanner$nodePattern$1$1$2$1.invoke(KotlinScanner.kt:69)
        at org.kotlin.formatter.scanning.KotlinScanner$nodePattern$1$1$2$1.invoke(KotlinScanner.kt:28)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:201)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:181)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.FinalPathStep.runActions(NodePattern.kt:150)
        at org.kotlin.formatter.scanning.nodepattern.NodePattern.matchSequence(NodePattern.kt:43)
        at org.kotlin.formatter.scanning.KotlinScanner.scanNodes$formatter(KotlinScanner.kt:59)
        at org.kotlin.formatter.scanning.KotlinScanner.scanNodes$formatter$default(KotlinScanner.kt:58)
        at org.kotlin.formatter.scanning.BlockScanner$nodePattern$1$2$2.invoke(BlockScanner.kt:31)
        at org.kotlin.formatter.scanning.BlockScanner$nodePattern$1$2$2.invoke(BlockScanner.kt:16)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:201)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:181)
        at org.kotlin.formatter.scanning.nodepattern.StateKt$andThen$1.invoke(State.kt:149)
        at org.kotlin.formatter.scanning.nodepattern.StateKt$andThen$1.invoke(State.kt)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.FinalPathStep.runActions(NodePattern.kt:150)
        at org.kotlin.formatter.scanning.nodepattern.NodePattern.matchSequence(NodePattern.kt:43)
        at org.kotlin.formatter.scanning.BlockScanner.scan(BlockScanner.kt:41)
        at org.kotlin.formatter.scanning.KotlinScanner.scanInState$formatter(KotlinScanner.kt:47)
        at org.kotlin.formatter.scanning.KotlinScanner.scanSingleNode(KotlinScanner.kt:80)
        at org.kotlin.formatter.scanning.KotlinScanner.access$scanSingleNode(KotlinScanner.kt:28)
        at org.kotlin.formatter.scanning.KotlinScanner$scanNodes$1.invoke(KotlinScanner.kt:58)
        at org.kotlin.formatter.scanning.KotlinScanner$scanNodes$1.invoke(KotlinScanner.kt:28)
        at org.kotlin.formatter.scanning.KotlinScanner$nodePattern$1$1$2$1.invoke(KotlinScanner.kt:69)
        at org.kotlin.formatter.scanning.KotlinScanner$nodePattern$1$1$2$1.invoke(KotlinScanner.kt:28)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:201)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:181)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.FinalPathStep.runActions(NodePattern.kt:150)
        at org.kotlin.formatter.scanning.nodepattern.NodePattern.matchSequence(NodePattern.kt:43)
        at org.kotlin.formatter.scanning.KotlinScanner.scanNodes$formatter(KotlinScanner.kt:59)
        at org.kotlin.formatter.scanning.KotlinScanner.scanNodes$formatter$default(KotlinScanner.kt:58)
        at org.kotlin.formatter.scanning.SimpleScanner.scan(SimpleScanner.kt:13)
        at org.kotlin.formatter.scanning.KotlinScanner.scanInState$formatter(KotlinScanner.kt:47)
        at org.kotlin.formatter.scanning.KotlinScanner.scanSingleNode(KotlinScanner.kt:80)
        at org.kotlin.formatter.scanning.KotlinScanner.access$scanSingleNode(KotlinScanner.kt:28)
        at org.kotlin.formatter.scanning.KotlinScanner$scanNodes$1.invoke(KotlinScanner.kt:58)
        at org.kotlin.formatter.scanning.KotlinScanner$scanNodes$1.invoke(KotlinScanner.kt:28)
        at org.kotlin.formatter.scanning.KotlinScanner$nodePattern$1$1$2$1.invoke(KotlinScanner.kt:69)
        at org.kotlin.formatter.scanning.KotlinScanner$nodePattern$1$1$2$1.invoke(KotlinScanner.kt:28)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:201)
        at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:181)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
        at org.kotlin.formatter.scanning.nodepattern.FinalPathStep.runActions(NodePattern.kt:150)
        at org.kotlin.formatter.scanning.nodepattern.NodePattern.matchSequence(NodePattern.kt:43)
        at org.kotlin.formatter.scanning.KotlinScanner.scanNodes$formatter(KotlinScanner.kt:59)
        at org.kotlin.formatter.scanning.KotlinScanner.scanNodes$formatter$default(KotlinScanner.kt:58)
        at org.kotlin.formatter.scanning.SimpleScanner.scan(SimpleScanner.kt:13)
        at org.kotlin.formatter.scanning.KotlinScanner.scanInState$formatter(KotlinScanner.kt:47)
        at org.kotlin.formatter.scanning.KotlinScanner.scan(KotlinScanner.kt:36)
        at org.kotlin.formatter.KotlinFormatter.format(KotlinFormatter.kt:47)
        at org.kotlin.formatter.KotlinFormatter.formatFile(KotlinFormatter.kt:57)
        at org.kotlin.formatter.plugin.FormatKotlinTask.format(FormatKotlinTask.kt:22)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.run(ExecuteActionsTaskExecuter.java:555)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:540)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:523)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:108)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:271)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:260)
        at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$1(ExecuteStep.java:34)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:34)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:67)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:36)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:49)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:34)
        at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:43)
        at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
        at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:44)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:54)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:38)
        at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:42)
        at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:159)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:72)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:43)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:44)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:33)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:92)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:85)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:39)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:76)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:94)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:79)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:53)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:74)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28)
        at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:187)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:179)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:109)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:372)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:359)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:352)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:338)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)


to reproduce you can use https://github.com/christophsturm/r2dbcfun

Add option to disable line break removal

Currently the formatter removes line breaks when the code still fits into the configured maxLineLength.

This can be suboptimal especially when writing DSL-Like code with Typesafe Builders.

For example

html {
        head {
            title {+"The title"}
        }
}

should not be reformatted to

html { head { title {+"The title"} } }

It would be useful to have an option to deactivate the line break removal for a block of code. Maybe an annotation which can be applied to classes and function could make sense.

KDocFormatter is not Daring Fireball syntax compatible for code blocks

According to the Daring Fireball syntax, code blocks must be indented.

To produce a code block in Markdown, simply indent every line of the block by at least 4 spaces or 1 tab

The KDocFormatter requires code blocks to be enclosed by three backticks ``` which leads to code blocks which use the indention to be reformatted.

Is this an intended deviation from the Daring Fireball syntax? Should we maybe support both versions (backticks and indention)?

KDoc and attribute for constructor parameter

I'm not sure if it bug or feature.

Original code:

@Serializable
data class Message(
    @SerialName("id")
    val id: Int,

    /**
     * Origin ID and some more description
     */ 
    @SerialName("origin_id")
    val originId: Int = 0,
    val anotherProp: String
)

After formatter:

@Serializable
data class Message(
    @SerialName("id")
    val id: Int,

    /**
     * Origin ID and some more description
     */ @SerialName("origin_id") <-- this line moved
    val originId: Int = 0,
    val anotherProp: String
)

As you see it moved @SerialName(...) next to KDoc.

Formatter attempts to format raw strings

The formatter seems to format Kotlin raw strings, which modifies the code's behavior.
Initial code:

throw UnauthorizedException(
    """
    The client $inetAddress is attempting to read on node ${nodeConfiguration.tag}
    at address {${nodeConfiguration.modbusNode.address.start}.
    """.trimIndent()
)

Formatted code:

throw UnauthorizedException(
    """
        The client $inetAddress is attempting to read on node ${nodeConfiguration.tag}
                                            at address {${nodeConfiguration.modbusNode.address.start}.
    """.trimIndent()
)

Very long method / property access not split

In very extreme cases, where a name.accessor expression is too long, it is not split and it overflows the max column value. See this example code:

object ThisObjectHasAVeryLongNameAndShouldNotExist {
    fun thisFunctionHasAnotherVeryLongNameAndThisShouldNeverHappen() {
    }
}

fun foo() {
    ThisObjectHasAVeryLongNameAndShouldNotExist
        .thisFunctionHasAnotherVeryLongNameAndThisShouldNeverHappen()
}

After formatting, we get this:

fun foo() {
   ThisObjectHasAVeryLongNameAndShouldNotExist.thisFunctionHasAnotherVeryLongNameAndThisShouldNeverHappen()
}

The line with the method call is longer than 100 columns, and could even trigger a linter error if it's used in combination with the formatter.

Can't format in case of newline after "if" opening parenthesis

Trying to format the below code snippet runs into Could not process after.kt (line 1): Could not match node sequence [PsiElement(if), PsiWhiteSpace, PsiElement(LPAR), PsiWhiteSpace, Element(CONDITION), PsiWhiteSpace, PsiElement(RPAR), PsiWhiteSpace, Element(THEN)].

if (
  1 == 2
) {
}

cannot process annotation, kdoc, data

the formatter cannot handle code like this:

        @Serializable
        /** */
        data class SerializableUserPK(override val id: Long) : PK

the error message is "Could not match node sequence [Element(ANNOTATION_ENTRY), PsiWhiteSpace, KDoc, PsiWhiteSpace, PsiElement(data)]"

it should probably reformat the code to and move the annotation after the kdoc, but this code is totally valid.

Formatting of Lambda expressions not spec compliant

The Kotlinlang Coding Conventions specify the follow for the lambda formatting:

...
If a call takes a single lambda, it should be passed outside of parentheses whenever possible.
...
When declaring parameter names in a multiline lambda, put the names on the first line, followed by the arrow and the newline:
...

This is violated by the formatter when the line is too long, so that it adds a line break.

Example (100 chars line width)

fun testABCtestABCtestABCtestABCtestABC(foo: String, block: (String) -> String): String = TODO()
fun foo() {
    testABCtestABCtestABCtestABCtestABC("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") { adasd -> adasd }
}

Gets reformatted to

fun testABCtestABCtestABCtestABCtestABC(foo: String, block: (String) -> String): String = TODO()
fun foo() {
    testABCtestABCtestABCtestABCtestABC("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
        { adasd -> adasd }
}

This violates the rules stated by the coding style convention, and also ktLint complains about it:

./formatter.kt:6:9: Unexpected newline before "{"

The desired output would be:

fun testABCtestABCtestABCtestABCtestABC(foo: String, block: (String) -> String): String = TODO()
fun foo() {
    testABCtestABCtestABCtestABCtestABC(
        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    ) { adasd ->
        adasd
    }
}

Crash while parsing a generic type parameter on a type alias

Hi,

I'm getting the following error:

org.kotlin.formatter.scanning.nodepattern.NodeSequenceNotMatchedException: Could not match node sequence [KDoc, PsiWhiteSpace, PsiElement(typealias), PsiWhiteSpace, PsiElement(IDENTIFIER), Element(TYPE_PARAMETER_LIST), PsiWhiteSpace, PsiElement(EQ), PsiWhiteSpace, Element(TYPE_REFERENCE)]
	at org.kotlin.formatter.scanning.nodepattern.NodePattern.matchSequence(NodePattern.kt:44)
	at org.kotlin.formatter.scanning.TypealiasScanner.scan(TypealiasScanner.kt:44)
	at org.kotlin.formatter.scanning.KotlinScanner.scanInState$formatter(KotlinScanner.kt:47)
	at org.kotlin.formatter.scanning.KotlinScanner.scanSingleNode(KotlinScanner.kt:80)
	at org.kotlin.formatter.scanning.KotlinScanner.access$scanSingleNode(KotlinScanner.kt:28)
	at org.kotlin.formatter.scanning.KotlinScanner$scanNodes$1.invoke(KotlinScanner.kt:58)
	at org.kotlin.formatter.scanning.KotlinScanner$scanNodes$1.invoke(KotlinScanner.kt:28)
	at org.kotlin.formatter.scanning.KotlinScanner$nodePattern$1$1$2$1.invoke(KotlinScanner.kt:69)
	at org.kotlin.formatter.scanning.KotlinScanner$nodePattern$1$1$2$1.invoke(KotlinScanner.kt:28)
	at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:201)
	at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:181)
	at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
	at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
	at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
	at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
	at org.kotlin.formatter.scanning.nodepattern.FinalPathStep.runActions(NodePattern.kt:150)
	at org.kotlin.formatter.scanning.nodepattern.NodePattern.matchSequence(NodePattern.kt:43)
	at org.kotlin.formatter.scanning.KotlinScanner.scanNodes$formatter(KotlinScanner.kt:59)
	at org.kotlin.formatter.scanning.KotlinScanner.scanNodes$formatter$default(KotlinScanner.kt:58)
	at org.kotlin.formatter.scanning.BlockScanner$nodePattern$1$2$2.invoke(BlockScanner.kt:31)
	at org.kotlin.formatter.scanning.BlockScanner$nodePattern$1$2$2.invoke(BlockScanner.kt:16)
	at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:201)
	at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:181)
	at org.kotlin.formatter.scanning.nodepattern.StateKt$andThen$1.invoke(State.kt:149)
	at org.kotlin.formatter.scanning.nodepattern.StateKt$andThen$1.invoke(State.kt)
	at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
	at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
	at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
	at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
	at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
	at org.kotlin.formatter.scanning.nodepattern.FinalPathStep.runActions(NodePattern.kt:150)
	at org.kotlin.formatter.scanning.nodepattern.NodePattern.matchSequence(NodePattern.kt:43)
	at org.kotlin.formatter.scanning.BlockScanner.scan(BlockScanner.kt:41)
	at org.kotlin.formatter.scanning.KotlinScanner.scanInState$formatter(KotlinScanner.kt:47)
	at org.kotlin.formatter.scanning.KotlinScanner.scanSingleNode(KotlinScanner.kt:80)
	at org.kotlin.formatter.scanning.KotlinScanner.access$scanSingleNode(KotlinScanner.kt:28)
	at org.kotlin.formatter.scanning.KotlinScanner$scanNodes$1.invoke(KotlinScanner.kt:58)
	at org.kotlin.formatter.scanning.KotlinScanner$scanNodes$1.invoke(KotlinScanner.kt:28)
	at org.kotlin.formatter.scanning.KotlinScanner$nodePattern$1$1$2$1.invoke(KotlinScanner.kt:69)
	at org.kotlin.formatter.scanning.KotlinScanner$nodePattern$1$1$2$1.invoke(KotlinScanner.kt:28)
	at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:201)
	at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:181)
	at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
	at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
	at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
	at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
	at org.kotlin.formatter.scanning.nodepattern.FinalPathStep.runActions(NodePattern.kt:150)
	at org.kotlin.formatter.scanning.nodepattern.NodePattern.matchSequence(NodePattern.kt:43)
	at org.kotlin.formatter.scanning.KotlinScanner.scanNodes$formatter(KotlinScanner.kt:59)
	at org.kotlin.formatter.scanning.KotlinScanner.scanNodes$formatter$default(KotlinScanner.kt:58)
	at org.kotlin.formatter.scanning.SimpleScanner.scan(SimpleScanner.kt:13)
	at org.kotlin.formatter.scanning.KotlinScanner.scanInState$formatter(KotlinScanner.kt:47)
	at org.kotlin.formatter.scanning.KotlinScanner.scanSingleNode(KotlinScanner.kt:80)
	at org.kotlin.formatter.scanning.KotlinScanner.access$scanSingleNode(KotlinScanner.kt:28)
	at org.kotlin.formatter.scanning.KotlinScanner$scanNodes$1.invoke(KotlinScanner.kt:58)
	at org.kotlin.formatter.scanning.KotlinScanner$scanNodes$1.invoke(KotlinScanner.kt:28)
	at org.kotlin.formatter.scanning.KotlinScanner$nodePattern$1$1$2$1.invoke(KotlinScanner.kt:69)
	at org.kotlin.formatter.scanning.KotlinScanner$nodePattern$1$1$2$1.invoke(KotlinScanner.kt:28)
	at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:201)
	at org.kotlin.formatter.scanning.nodepattern.Evaluation$Companion$consumingAction$1.invoke(State.kt:181)
	at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
	at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
	at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
	at org.kotlin.formatter.scanning.nodepattern.ContinuingPathStep.runActions(NodePattern.kt:136)
	at org.kotlin.formatter.scanning.nodepattern.FinalPathStep.runActions(NodePattern.kt:150)
	at org.kotlin.formatter.scanning.nodepattern.NodePattern.matchSequence(NodePattern.kt:43)
	at org.kotlin.formatter.scanning.KotlinScanner.scanNodes$formatter(KotlinScanner.kt:59)
	at org.kotlin.formatter.scanning.KotlinScanner.scanNodes$formatter$default(KotlinScanner.kt:58)
	at org.kotlin.formatter.scanning.SimpleScanner.scan(SimpleScanner.kt:13)
	at org.kotlin.formatter.scanning.KotlinScanner.scanInState$formatter(KotlinScanner.kt:47)
	at org.kotlin.formatter.scanning.KotlinScanner.scan(KotlinScanner.kt:36)
	at org.kotlin.formatter.KotlinFormatter.format(KotlinFormatter.kt:47)
	... 102 more

While parsing the following code:

typealias AlertComputationFunction<T> = (value: T, changeDate: Instant) -> Alert?

The crash seems to be caused by the generic parameter.

Odd indentation with object expressions

Please see the below snippets. The surprising part is the closing brace of the required empty body of OtherClass ending up at the beginning of the next line. I expected it to be aligned with either return or OtherClass.

Before:

class OtherClass(
    val one: String,
    val two: String,
    val three: String,
    val four: String,
    val five: String
)

class Sample {
    fun test() {
        return object :
            OtherClass(
              one = "ONE",
              two = "TWO",
              three = "THREE",
              four = "FROUR",
              five = "FIVE") {}
    }
}

After:

class OtherClass(
    val one: String,
    val two: String,
    val three: String,
    val four: String,
    val five: String
)

class Sample {
    fun test() {
        return object :
            OtherClass(one = "ONE", two = "TWO", three = "THREE", four = "FROUR", five = "FIVE") {
}
    }
}

Provide --check

I'd like to be able to ensure in CI that this was run in development. Do you have a way to do that, similar to spotless --check?

The formatKotlin is not compatible with ktlintCheck

The formatter’s output causes ktlint to complain, where it did not complain previously.

NB! Created a single ticket for the problems encountered. Let me know if it is wrong, will create separate tickets for each problem.

Code before the formatter:

requeueService.invokeAction(
    onError = { _, _ -> },
)

Code after the formatter:

requeueService.invokeAction(
    onError = { _, _ ->},
)

Error from ktlintCheck after the formatKotlin:

Missing spacing after "->"
Missing spacing before "}"

Code before the formatter:

/**
 * @param accessToken the token that grant access and identify the user.
 */
constructor(
    accessToken: String
) : this(accessToken)

Code after the formatter:

/**
 * @param accessToken the token that grant access and identify the user.
 */ constructor(
    accessToken: String
) : this(accessToken)

Error from ktlintCheck after the formatKotlin:

Unexpected indentation (expected 9, actual 8)

./gradlew formatKotlin produces output that appears to conflict with ktlint

with the gradle dependency specified as:

id("tech.formatter-kt.formatter") version "0.7.7"

Given the following input (abbreviated):

internal class AttributeExtensionsTest {

    @TestFactory
    fun `isAbsencePlannedDays should return true for absence planned days attribute and false for any other attribute`() =
        listOf(
            "absence_1:planned_days" to true,
            "absence_12345:planned_days" to true,
            "absence_5:taken_days" to false,
            "absence_123:contractual_hours" to false,
            "first_name" to false,
            "contractual_hours" to false,
            "attendance_contractual_target_hours" to false
        )
            .map { (attribute, result) ->
                DynamicTest.dynamicTest("$attribute is an absence planned days attribute: $result") {
                    attribute.isAbsencePlannedDays() `should be equal to` result
                }            
}

after running: ./gradlew formatKotlin

produces:

internal class AttributeExtensionsTest {

    @TestFactory
    fun `isAbsencePlannedDays should return true for absence planned days attribute and false for any other attribute`() =
        listOf(
            "absence_1:planned_days" to true,
            "absence_12345:planned_days" to true,
            "absence_5:taken_days" to false,
            "absence_123:contractual_hours" to false,
            "first_name" to false,
            "contractual_hours" to false,
            "attendance_contractual_target_hours" to false
        )
            .map { (attribute, result) ->
                DynamicTest.dynamicTest("$attribute is an absence planned days attribute: $result")
                    { attribute.isAbsencePlannedDays() `should be equal to` result }
            
}

which leads to a ktlint error:

> Task :ktlintMainSourceSetCheck
.../extensions/AttributeExtensionsTest.kt:26:21: Unexpected newline before "{"
.../extensions/AttributeExtensionsTest.kt:206:21: Unexpected newline before "{"

Our current workflow/usage is based on the assumption that these tools can be used together as mentioned in the kotlin-auto-formatter readme.

It should be fine to use both ktlint and this formatter in the same project.

please let me know if I should clarify anything.
Kind Regards

Statement suppressions are inactivated

We experienced the following example

    @Suppress("UNCHECKED_CAST")
    it as EventProcessor<Any>

to be reformatted as

    @Suppress("UNCHECKED_CAST") it as EventProcessor<Any>

This actually "inactivates" the suppression and spawns yet another unchecked cast warning. The @Suppress annotation should stay positioned in the line before the statement.

Long function signatures not properly broken down in lines

Long function signatures need to be split with one argument per line, like this example:

fun something(
    thisIsOneLongParameter: String,
    thisIsAnotherLongParameter: Map<String, String>
): String {
    val somethingElse = thisIsOneLongParameter.toUpperCase()

    return thisIsAnotherLongParameter[somethingElse]!!
}

When running the formatter, only the return type is moved to a different line:

fun something(thisIsOneLongParameter: String, thisIsAnotherLongParameter: Map<String, String>):
    String {
        val somethingElse = thisIsOneLongParameter.toUpperCase()

        return thisIsAnotherLongParameter[somethingElse]!!
    }

In the case of an expression body, the expression is left on the same line that the return type. On a strict interpretation of the coding conventions, the expression's first line doesn't fit on the same line as the declaration, as the declaration has more than one line.

Thus, a function with a long signature and an expression body should be formatted like this:

fun something(
    thisIsOneLongParameter: String,
    thisIsAnotherLongParameter: Map<String, String>
): String =
    thisIsAnotherLongParameter[thisIsOneLongParameter]!!

The formatter produces this output:

fun something(thisIsOneLongParameter: String, thisIsAnotherLongParameter: Map<String, String>):
    String = thisIsAnotherLongParameter[thisIsOneLongParameter]!!

Formatter does not wrap braces onto the next line

Hello,
The formatter seems to not always wrap the closing brace of a function to the next line.
Minimal example:

package app
class Test {
    fun foo() {
        bar()}

    fun bar() {
    }
}

I expect a newline before the curly brace in the fourth line.

Shouldn't it add one? AFAIK the Kotlin conventions require the closing brace to be horizontally aligned with the function head.

I found this by accident and thought I should report it.

Re/dual license under Apache 2

Legal departments go bananas whenever they hear "GPL".
Arguing "it's LGPL" or "it's only a tool" often doesn't make a difference.

Re-licensing or dual-licensing this project under Apache 2 (same as Kotlin itself) would make it far easier to adopt.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.