Missing option to define length of a "long supertype list" in Class header
Jetbrains Class header formatting coding conventions They state that:
For multiple interfaces, the superclass constructor call should be located first and then each interface should be located in a different line
and provide a sample
class Person(
id: Int,
name: String,
surname: String
) : Human(id, name),
KotlinMaker { /*...*/ }
But they also state the following:
For classes with a long supertype list put a line break after the colon and align all supertype names horizontally
With the attached code sample
class MyFavouriteVeryLongClassHolder :
MyLongHolder<MyFavouriteVeryLongClass>(),
SomeOtherInterface,
AndAnotherOne {
fun foo() { /*...*/ }
}
But they don't mention what is considered a long supertype list and what is not, which means it should be opened for discussion and an option to change that number. I personally would love to change the number of interfaces.
Another issue is that it's very hard to understand the issue with the current message:
Indentetation: Missing newline after ":"
I think it should have a proper message along the lines of
Long supertype list: Too many interfaces ($num$ / $max$), align all supertype names horizontally.
I second this. I do not really know what exactly "too long" is, but I see constructors with 200+ characters in a single line which definitely is violating the style guide.
I second this. I do not really know what exactly "too long" is, but I see constructors with 200+ characters in a single line which definitely is violating the style guide.
The max-line-length rule will disallow such constructors if the corresponding .editorconfig property has been set. This issue should be solved as part of the bigger issue #1349.
The new class-signature will wrap the super types depending on the code style. For code style ktlint_official the super type will always be wrapped. For the other code styles, wrapping of the super type is done for classes having multiple super types or when exceeding the max_line_length.
Given input below:
class Foo {
// body
}
class Foo() {
// body
}
class Foo(val bar1: Bar) {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) {
// body
}
class Foo : FooBar("bar") {
// body
}
class Foo : FooBar("bar1", "bar2") {
// body
}
class Foo : FooBar(
"bar1",
"bar2",
) {
// body
}
class Foo :
FooBar(
"bar1",
"bar2",
) {
// body
}
class Foo(val bar1: Bar) : FooBar(bar1) {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) : FooBar(bar1) {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) : FooBar(bar1, bar2) {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) : FooBar(
bar1,
bar2,
) {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) : FooBar(
bar1,
bar2,
) {
// body
}
class Foo : FooBar("bar"), BarFoo1, BarFoo2 {
// body
}
class Foo : FooBar("bar1", "bar2"), BarFoo1, BarFoo2 {
// body
}
class Foo : FooBar(
"bar1",
"bar2"
), BarFoo1, BarFoo2 {
// body
}
class Foo : FooBar(
"bar1",
"bar2"
),
BarFoo1,
BarFoo2 {
// body
}
class Foo :
FooBar(
"bar1",
"bar2",
),
BarFoo1,
BarFoo2 {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) : FooBar(bar1, bar2),
BarFoo1,
BarFoo2 {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) : FooBar(
bar1,
bar2,
),
BarFoo1,
BarFoo2 {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) : FooBar(
bar1,
bar2,
),
BarFoo1,
BarFoo2 {
// body
}
class Foo
constructor(
val bar1: Bar,
val bar2: Bar,
) : FooBar(bar1, bar2),
BarFoo1,
BarFoo2 {
// body
}
will be formatted in ktlint_official as:
class Foo {
// body
}
class Foo {
// body
}
class Foo(
val bar1: Bar,
) {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) {
// body
}
class Foo : FooBar("bar") {
// body
}
class Foo : FooBar("bar1", "bar2") {
// body
}
class Foo :
FooBar(
"bar1",
"bar2",
) {
// body
}
class Foo :
FooBar(
"bar1",
"bar2",
) {
// body
}
class Foo(
val bar1: Bar,
) : FooBar(bar1) {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) : FooBar(bar1) {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) : FooBar(bar1, bar2) {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) : FooBar(
bar1,
bar2,
) {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) : FooBar(
bar1,
bar2,
) {
// body
}
class Foo :
FooBar("bar"),
BarFoo1,
BarFoo2 {
// body
}
class Foo :
FooBar("bar1", "bar2"),
BarFoo1,
BarFoo2 {
// body
}
class Foo :
FooBar(
"bar1",
"bar2",
),
BarFoo1,
BarFoo2 {
// body
}
class Foo :
FooBar(
"bar1",
"bar2",
),
BarFoo1,
BarFoo2 {
// body
}
class Foo :
FooBar(
"bar1",
"bar2",
),
BarFoo1,
BarFoo2 {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) : FooBar(bar1, bar2),
BarFoo1,
BarFoo2 {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) : FooBar(
bar1,
bar2,
),
BarFoo1,
BarFoo2 {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) : FooBar(
bar1,
bar2,
),
BarFoo1,
BarFoo2 {
// body
}
class Foo
constructor(
val bar1: Bar,
val bar2: Bar,
) : FooBar(bar1, bar2),
BarFoo1,
BarFoo2 {
// body
}
while in code styles intellij_idea and android_studio it is formatted as:
class Foo {
// body
}
class Foo {
// body
}
class Foo(val bar1: Bar) {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) {
// body
}
class Foo : FooBar("bar") {
// body
}
class Foo : FooBar("bar1", "bar2") {
// body
}
class Foo :
FooBar(
"bar1",
"bar2",
) {
// body
}
class Foo :
FooBar(
"bar1",
"bar2",
) {
// body
}
class Foo(val bar1: Bar) : FooBar(bar1) {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) : FooBar(bar1) {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) : FooBar(bar1, bar2) {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) : FooBar(
bar1,
bar2,
) {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) : FooBar(
bar1,
bar2,
) {
// body
}
class Foo :
FooBar("bar"),
BarFoo1,
BarFoo2 {
// body
}
class Foo :
FooBar("bar1", "bar2"),
BarFoo1,
BarFoo2 {
// body
}
class Foo :
FooBar(
"bar1",
"bar2",
),
BarFoo1,
BarFoo2 {
// body
}
class Foo :
FooBar(
"bar1",
"bar2",
),
BarFoo1,
BarFoo2 {
// body
}
class Foo :
FooBar(
"bar1",
"bar2",
),
BarFoo1,
BarFoo2 {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) : FooBar(bar1, bar2),
BarFoo1,
BarFoo2 {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) : FooBar(
bar1,
bar2,
),
BarFoo1,
BarFoo2 {
// body
}
class Foo(
val bar1: Bar,
val bar2: Bar,
) : FooBar(
bar1,
bar2,
),
BarFoo1,
BarFoo2 {
// body
}
class Foo
constructor(
val bar1: Bar,
val bar2: Bar,
) : FooBar(bar1, bar2),
BarFoo1,
BarFoo2 {
// body
}