facebook / ktfmt

A program that reformats Kotlin source code to comply with the common community standard for Kotlin code conventions.
https://facebook.github.io/ktfmt/
Apache License 2.0
857 stars 66 forks source link

Trailing comma gets removed if there is only one parameter and it is formatted to be on its own line #461

Open hongping-quora opened 2 months ago

hongping-quora commented 2 months ago

Using the ktfmt IntelliJ plugin 1.1.0.47 in Android Studio, setting "Code style" to "Google (internal)"

image image
  1. The following code with a single parameter will get the trailing comma removed.
    
    import android.content.SharedPreferences

private class AllowlistedDiskReadsSharedPreferences( private val wrappedPreferences: SharedPreferences, ) : SharedPreferences by wrappedPreferences


2. This code with two parameters will not.

import android.content.SharedPreferences

private class AllowlistedDiskReadsSharedPreferences( private val wrappedPreferences: SharedPreferences, private val wrappedPreferences2: SharedPreferences, ) : SharedPreferences by wrappedPreferences



Since one of the reasons of using trailing comma is to avoid having to modify an existing line when adding another parameter (https://kotlinlang.org/docs/coding-conventions.html#trailing-commas), perhaps even when there is only one parameter but it has to be on its own line, it should also have a trailing comma?

Thanks!
hick209 commented 2 months ago

@nreid260, do you think this is a bug or within your expectations?

nreid260 commented 2 months ago

This is working as intended, at least for now. The Google Kotlin style committee preferred that single-element lists never got trailing commas. However, there's no technical reason to do this, only aesthetic, so they could be convinced otherwise.

One technical constraint was that I explicitly wanted to remove the "hinting" behaviour or trailing commas. --google-style totally manages trailing commas, based on the rest of the code. If you really want to force a line-break, // is still available.