Skip to content

Commit cf3fba5

Browse files
Nivaldo Bondançafacebook-github-bot
authored andcommitted
Trailing comma strategy support for IJ plugin + minor issues
Summary: Added support for all trailing comma strategies to the IJ plugin. Also fixing the following errors and warnings: ``` e: KtfmtConfigurable.kt:178:42 Cannot access 'val manageTrailingCommas: Boolean': it is internal in 'com/facebook/ktfmt/format/FormattingOptions'. e: KtfmtSettings.kt:134:79 Cannot access 'val manageTrailingCommas: Boolean': it is internal in 'com/facebook/ktfmt/format/FormattingOptions'. e: KtfmtSettings.kt:141:54 Cannot access 'val manageTrailingCommas: Boolean': it is internal in 'com/facebook/ktfmt/format/FormattingOptions'. w: KotlinInputAstVisitor.kt:1440:25 'val leftParenthesis: PsiElement?' is deprecated. Deprecated in Java. w: KotlinInputAstVisitor.kt:1444:25 'val rightParenthesis: PsiElement?' is deprecated. Deprecated in Java. w: KotlinInputAstVisitor.kt:1950:17 Identity-sensitive operation on an instance of value type 'Optional<String!>!' may cause unexpected behavior or errors. w: KotlinInputAstVisitor.kt:1950:40 Identity-sensitive operation on an instance of value type 'Optional<String>' may cause unexpected behavior or errors. w: FormatterTest.kt:5492:13 'constructor(maxWidth: Int, blockIndent: Int, continuationIndent: Int, manageTrailingCommas: Boolean = ..., removeUnusedImports: Boolean = ..., debuggingPrintOpsAfterFormatting: Boolean = ...): FormattingOptions' is deprecated. Here just for retrocompatibility reasons. Will be removed on 1.0.0. ``` Differential Revision: D80024619 fbshipit-source-id: 86da94918856c6d734fc83208d521ad9697e6fe5
1 parent f767ee8 commit cf3fba5

7 files changed

Lines changed: 105 additions & 32 deletions

File tree

core/src/main/java/com/facebook/ktfmt/format/FormattingOptions.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,4 +110,14 @@ enum class TrailingCommaManagementStrategy(
110110
* force breaking lists to multiple lines.
111111
*/
112112
COMPLETE(removeRedundantTrailingCommas = true),
113+
;
114+
115+
override fun toString(): String {
116+
// NONE -> "None"
117+
// ONLY_ADD -> "Only add"
118+
// COMPLETE -> "Complete"
119+
return name.replace("_", " ").lowercase().replaceFirstChar {
120+
if (it.isLowerCase()) it.titlecase() else it.toString()
121+
}
122+
}
113123
}

core/src/main/java/com/facebook/ktfmt/format/KotlinInputAstVisitor.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import com.google.googlejavaformat.OpsBuilder
2727
import com.google.googlejavaformat.Output.BreakTag
2828
import java.util.ArrayDeque
2929
import java.util.Optional
30+
import kotlin.jvm.optionals.getOrNull
3031
import org.jetbrains.kotlin.com.intellij.psi.PsiComment
3132
import org.jetbrains.kotlin.com.intellij.psi.PsiElement
3233
import org.jetbrains.kotlin.com.intellij.psi.PsiWhiteSpace
@@ -1437,11 +1438,11 @@ class KotlinInputAstVisitor(
14371438
}
14381439

14391440
override fun getLeftParenthesis(): PsiElement? {
1440-
return accessor.leftParenthesis
1441+
return accessor.parameterList?.leftParenthesis
14411442
}
14421443

14431444
override fun getRightParenthesis(): PsiElement? {
1444-
return accessor.rightParenthesis
1445+
return accessor.parameterList?.rightParenthesis
14451446
}
14461447
}
14471448
}
@@ -1947,7 +1948,7 @@ class KotlinInputAstVisitor(
19471948
builder.breakOp(Doc.FillMode.UNIFIED, "", ZERO)
19481949
for (value in enumEntryList.enumEntries) {
19491950
visit(value)
1950-
if (builder.peekToken() == Optional.of(",")) {
1951+
if (builder.peekToken().getOrNull() == ",") {
19511952
builder.token(",")
19521953
builder.forcedBreak()
19531954
}

core/src/test/java/com/facebook/ktfmt/format/FormatterTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5493,7 +5493,7 @@ class FormatterTest {
54935493
maxWidth = 35,
54945494
blockIndent = 4,
54955495
continuationIndent = 4,
5496-
manageTrailingCommas = false,
5496+
trailingCommaManagementStrategy = TrailingCommaManagementStrategy.NONE,
54975497
),
54985498
)
54995499
.isEqualTo(code)

ktfmt_idea_plugin/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ plugins {
2424
}
2525

2626
val ktfmtVersion = rootProject.version
27-
val pluginVersion = "1.2"
27+
val pluginVersion = "1.3"
2828

2929
group = "com.facebook"
3030

ktfmt_idea_plugin/src/main/kotlin/com/facebook/ktfmt/intellij/KtfmtConfigurable.kt

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.facebook.ktfmt.intellij
1818

1919
import com.facebook.ktfmt.format.FormattingOptions
20+
import com.facebook.ktfmt.format.TrailingCommaManagementStrategy
2021
import com.facebook.ktfmt.intellij.KtfmtSettings.EnabledState.Disabled
2122
import com.facebook.ktfmt.intellij.KtfmtSettings.EnabledState.Enabled
2223
import com.facebook.ktfmt.intellij.UiFormatterStyle.Custom
@@ -36,6 +37,7 @@ import com.intellij.ui.dsl.builder.panel
3637
import com.intellij.ui.layout.selected
3738
import com.intellij.ui.layout.selectedValueMatches
3839
import javax.swing.JCheckBox
40+
import javax.swing.JComboBox
3941
import javax.swing.JTextField
4042

4143
@Suppress("DialogTitleCapitalization")
@@ -100,11 +102,14 @@ class KtfmtConfigurable(project: Project) :
100102
.component
101103
}
102104

103-
lateinit var manageTrailingCommas: JCheckBox
104-
row {
105-
manageTrailingCommas =
106-
checkBox("Manage trailing commas")
107-
.bindSelected(settings::customManageTrailingCommas)
105+
lateinit var trailingCommaManagementStrategy: JComboBox<String>
106+
row("Trailing commas management") {
107+
trailingCommaManagementStrategy =
108+
comboBox(TrailingCommaManagementStrategy.values().map { it.toString() })
109+
.bindItem(
110+
getter = { settings.customTrailingCommaManagementStrategy },
111+
setter = { settings.customTrailingCommaManagementStrategy = it.orEmpty() },
112+
)
108113
.component
109114
}
110115

@@ -126,7 +131,7 @@ class KtfmtConfigurable(project: Project) :
126131
maxLineLength,
127132
blockIndent,
128133
continuationIndent,
129-
manageTrailingCommas,
134+
trailingCommaManagementStrategy,
130135
removeUnusedImports,
131136
)
132137
}
@@ -139,7 +144,7 @@ class KtfmtConfigurable(project: Project) :
139144
maxLineLength,
140145
blockIndent,
141146
continuationIndent,
142-
manageTrailingCommas,
147+
trailingCommaManagementStrategy,
143148
removeUnusedImports,
144149
)
145150
}
@@ -152,7 +157,7 @@ class KtfmtConfigurable(project: Project) :
152157
maxLineLength,
153158
blockIndent,
154159
continuationIndent,
155-
manageTrailingCommas,
160+
trailingCommaManagementStrategy,
156161
removeUnusedImports,
157162
)
158163
}
@@ -169,13 +174,13 @@ private fun FormattingOptions.updateFields(
169174
maxLineLength: JTextField,
170175
blockIndent: JTextField,
171176
continuationIndent: JTextField,
172-
manageTrailingCommas: JCheckBox,
177+
trailingCommaManagementStrategy: JComboBox<String>,
173178
removeUnusedImports: JCheckBox,
174179
) {
175180
maxLineLength.text = maxWidth.toString()
176181
blockIndent.text = this.blockIndent.toString()
177182
continuationIndent.text = this.continuationIndent.toString()
178-
manageTrailingCommas.isSelected = this.manageTrailingCommas
183+
trailingCommaManagementStrategy.selectedItem = this.trailingCommaManagementStrategy.toString()
179184
removeUnusedImports.isSelected = this.removeUnusedImports
180185
}
181186

ktfmt_idea_plugin/src/main/kotlin/com/facebook/ktfmt/intellij/KtfmtSettings.kt

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package com.facebook.ktfmt.intellij
1818

1919
import com.facebook.ktfmt.format.Formatter
2020
import com.facebook.ktfmt.format.FormattingOptions
21+
import com.facebook.ktfmt.format.TrailingCommaManagementStrategy
2122
import com.facebook.ktfmt.intellij.KtfmtSettings.EnabledState.Disabled
2223
import com.facebook.ktfmt.intellij.KtfmtSettings.EnabledState.Enabled
2324
import com.facebook.ktfmt.intellij.KtfmtSettings.EnabledState.Unknown
@@ -48,11 +49,12 @@ internal class KtfmtSettings(private val project: Project) :
4849
var customFormattingOptions: FormattingOptions
4950
get() =
5051
FormattingOptions(
51-
state.customMaxLineLength,
52-
state.customBlockIndent,
53-
state.customContinuationIndent,
54-
state.customManageTrailingCommas,
55-
state.customRemoveUnusedImports,
52+
maxWidth = state.customMaxLineLength,
53+
blockIndent = state.customBlockIndent,
54+
continuationIndent = state.customContinuationIndent,
55+
trailingCommaManagementStrategy =
56+
state.customTrailingCommaManagementStrategy.toTrailingCommaManagementStrategy(),
57+
removeUnusedImports = state.customRemoveUnusedImports,
5658
)
5759
set(customFormattingOptions) {
5860
state.applyCustomFormattingOptions(customFormattingOptions)
@@ -76,10 +78,10 @@ internal class KtfmtSettings(private val project: Project) :
7678
state.customContinuationIndent = continuationIndent.coerceAtLeast(1)
7779
}
7880

79-
var customManageTrailingCommas: Boolean
80-
get() = state.customManageTrailingCommas
81-
set(manageTrailingCommas) {
82-
state.customManageTrailingCommas = manageTrailingCommas
81+
var customTrailingCommaManagementStrategy: String
82+
get() = state.customTrailingCommaManagementStrategy
83+
set(value) {
84+
state.customTrailingCommaManagementStrategy = value
8385
}
8486

8587
var customRemoveUnusedImports: Boolean
@@ -108,7 +110,8 @@ internal class KtfmtSettings(private val project: Project) :
108110

109111
return when (val stateVersion = migrationSettings.stateVersion) {
110112
KtfmtSettingsMigration.CURRENT_VERSION -> state
111-
1 -> migrationSettings.migrateFromV1ToCurrent(state)
113+
1,
114+
2 -> migrationSettings.migrateToCurrent(state)
112115
else -> {
113116
thisLogger().error("Cannot migrate settings from $stateVersion. Using defaults.")
114117
State()
@@ -123,28 +126,50 @@ internal class KtfmtSettings(private val project: Project) :
123126
}
124127

125128
internal class State : BaseState() {
126-
@Deprecated("Deprecated in V2. Use enableKtfmt instead.") var enabled: String? by string()
129+
@Deprecated(
130+
"Deprecated in V2. Use enableKtfmt instead.",
131+
replaceWith = ReplaceWith("enableKtfmt"),
132+
)
133+
var enabled: String? by string()
134+
@Deprecated(
135+
"Deprecated in V3. Use customTrailingCommaManagementStrategy instead.",
136+
replaceWith = ReplaceWith("customTrailingCommaManagementStrategy"),
137+
)
138+
var customManageTrailingCommas: Boolean by
139+
property(
140+
Formatter.META_FORMAT.trailingCommaManagementStrategy !=
141+
TrailingCommaManagementStrategy.NONE)
127142

128143
var enableKtfmt: EnabledState by enum(Unknown)
129144
var uiFormatterStyle: UiFormatterStyle by enum(Meta)
130145

131146
var customMaxLineLength: Int by property(Formatter.META_FORMAT.maxWidth)
132147
var customBlockIndent: Int by property(Formatter.META_FORMAT.blockIndent)
133148
var customContinuationIndent: Int by property(Formatter.META_FORMAT.continuationIndent)
134-
var customManageTrailingCommas: Boolean by property(Formatter.META_FORMAT.manageTrailingCommas)
149+
var customTrailingCommaManagementStrategy: String by
150+
property(
151+
Formatter.META_FORMAT.trailingCommaManagementStrategy.name,
152+
isDefault = { it == Formatter.META_FORMAT.trailingCommaManagementStrategy.name },
153+
)
135154
var customRemoveUnusedImports: Boolean by property(Formatter.META_FORMAT.removeUnusedImports)
136155

137156
fun applyCustomFormattingOptions(formattingOptions: FormattingOptions) {
138157
customMaxLineLength = formattingOptions.maxWidth
139158
customBlockIndent = formattingOptions.blockIndent
140159
customContinuationIndent = formattingOptions.continuationIndent
141-
customManageTrailingCommas = formattingOptions.manageTrailingCommas
160+
customTrailingCommaManagementStrategy = formattingOptions.trailingCommaManagementStrategy.name
142161
customRemoveUnusedImports = formattingOptions.removeUnusedImports
143162

144163
incrementModificationCount()
145164
}
146165
}
147166

167+
private fun String.toTrailingCommaManagementStrategy(
168+
defaultValue: TrailingCommaManagementStrategy = TrailingCommaManagementStrategy.NONE,
169+
): TrailingCommaManagementStrategy =
170+
runCatching { TrailingCommaManagementStrategy.valueOf(this.uppercase()) }
171+
.getOrDefault(defaultValue)
172+
148173
companion object {
149174
@JvmStatic
150175
fun getInstance(project: Project): KtfmtSettings = project.getService(KtfmtSettings::class.java)

ktfmt_idea_plugin/src/main/kotlin/com/facebook/ktfmt/intellij/KtfmtSettingsMigration.kt

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.facebook.ktfmt.intellij
1818

19+
import com.facebook.ktfmt.format.TrailingCommaManagementStrategy
1920
import com.facebook.ktfmt.intellij.KtfmtSettings.EnabledState.Disabled
2021
import com.facebook.ktfmt.intellij.KtfmtSettings.EnabledState.Enabled
2122
import com.facebook.ktfmt.intellij.KtfmtSettings.EnabledState.Unknown
@@ -36,6 +37,7 @@ internal class KtfmtSettingsMigration :
3637
// Changelog
3738
// ---------
3839
//
40+
// v3 manageTrailingCommas -> trailingCommaManagementStrategy (0.57+)
3941
// v2 enabled [bool] -> enableKtfmt [enum], custom styles (0.52+)
4042
// v1 initial version - enabled is a boolean, only preset styles
4143
var stateVersion: Int
@@ -44,21 +46,51 @@ internal class KtfmtSettingsMigration :
4446
state.stateVersion = value
4547
}
4648

47-
@Suppress("DEPRECATION") // Accessing deprecated properties
48-
fun migrateFromV1ToCurrent(v1State: KtfmtSettings.State): KtfmtSettings.State {
49+
fun migrateToCurrent(oldState: KtfmtSettings.State): KtfmtSettings.State {
50+
var migratedState = oldState
51+
if (state.stateVersion == 1) {
52+
migratedState = migrateFromV1(migratedState)
53+
}
54+
if (state.stateVersion == 2) {
55+
migratedState = migrateFromV2(migratedState)
56+
}
57+
return migratedState
58+
}
59+
60+
fun migrateFromV1(v1State: KtfmtSettings.State): KtfmtSettings.State {
61+
check(state.stateVersion == 1) { "Should only be called when stateVersion is 1" }
4962
val migrated =
5063
KtfmtSettings.State().apply {
5164
copyFrom(v1State)
5265

5366
enableKtfmt =
67+
@Suppress("DEPRECATION")
5468
when (v1State.enabled) {
5569
"true" -> Enabled
5670
"false" -> Disabled
5771
else -> Unknown
5872
}
73+
@Suppress("DEPRECATION")
5974
enabled = null
6075
}
61-
state.stateVersion = CURRENT_VERSION
76+
state.stateVersion = 2
77+
return migrated
78+
}
79+
80+
fun migrateFromV2(v2State: KtfmtSettings.State): KtfmtSettings.State {
81+
check(state.stateVersion == 2) { "Should only be called when stateVersion is 2" }
82+
val migrated =
83+
KtfmtSettings.State().apply {
84+
copyFrom(v2State)
85+
86+
customTrailingCommaManagementStrategy =
87+
@Suppress("DEPRECATION")
88+
when (v2State.customManageTrailingCommas) {
89+
true -> TrailingCommaManagementStrategy.COMPLETE
90+
else -> TrailingCommaManagementStrategy.NONE
91+
}.name
92+
}
93+
state.stateVersion = 3
6294
return migrated
6395
}
6496

@@ -67,6 +99,6 @@ internal class KtfmtSettingsMigration :
6799
}
68100

69101
companion object {
70-
const val CURRENT_VERSION = 2
102+
const val CURRENT_VERSION = 3
71103
}
72104
}

0 commit comments

Comments
 (0)