Skip to content

Commit 925e6cc

Browse files
author
Joseph Cooper
committed
CLI: Use --style=STYLE option to select formatter
1 parent 57a3979 commit 925e6cc

File tree

4 files changed

+45
-23
lines changed

4 files changed

+45
-23
lines changed

core/src/main/java/com/facebook/ktfmt/cli/Main.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ private const val EXIT_CODE_SUCCESS = 0
3737

3838
private val USAGE =
3939
"""
40-
|Usage: ktfmt [--dropbox-style | --google-style | --kotlinlang-style] [--dry-run] [--set-exit-if-changed] [--stdin-name=<name>] [--do-not-remove-unused-imports] File1.kt File2.kt ...
40+
|Usage: ktfmt [--style=<meta | google | kotlinlang>] [--dry-run] [--set-exit-if-changed] [--stdin-name=<name>] [--do-not-remove-unused-imports] File1.kt File2.kt ...
4141
|Or: ktfmt @file
4242
|
4343
|For more detail see ktfmt --help

core/src/main/java/com/facebook/ktfmt/cli/ParsedArgs.kt

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,11 @@ data class ParsedArgs(
7171
| -h, --help Show this help message
7272
| -n, --dry-run Don't write to files, only report files which
7373
| would have changed
74-
| --meta-style Use 2-space block indenting (default)
75-
| --google-style Google internal style (2 spaces)
76-
| --kotlinlang-style Kotlin language guidelines style (4 spaces
74+
| --style=STYLE Format files according to the chosen style
75+
| Accepted options for STYLE are:
76+
| meta Use 2-space block indenting (default)
77+
| google Google internal style (2 spaces)
78+
| kotlinlang Kotlin language guidelines style (4 spaces
7779
| --set-exit-if-changed Sets exit code to 1 if any input code was not
7880
| correctly formatted
7981
| --stdin-name=NAME Name to use when reading from standard input
@@ -108,9 +110,21 @@ data class ParsedArgs(
108110

109111
for (arg in args) {
110112
when {
111-
arg == "--meta-style" -> formattingOptions = Formatter.META_FORMAT
112-
arg == "--google-style" -> formattingOptions = Formatter.GOOGLE_FORMAT
113-
arg == "--kotlinlang-style" -> formattingOptions = Formatter.KOTLINLANG_FORMAT
113+
arg.startsWith("--style=") -> {
114+
val parsedStyle =
115+
parseKeyValueArg("--style", arg)
116+
?: return ParseResult.Error(
117+
unexpectedArg(arg)
118+
)
119+
formattingOptions = when (parsedStyle) {
120+
"meta" -> Formatter.META_FORMAT
121+
"google" -> Formatter.GOOGLE_FORMAT
122+
"kotlinlang" -> Formatter.KOTLINLANG_FORMAT
123+
else -> return ParseResult.Error(
124+
"Unknown style '${parsedStyle}'. Style must be one of [dropbox, google, kotlinlang]."
125+
)
126+
}
127+
}
114128
arg == "--dry-run" || arg == "-n" -> dryRun = true
115129
arg == "--set-exit-if-changed" -> setExitIfChanged = true
116130
arg == "--do-not-remove-unused-imports" -> removeUnusedImports = false
@@ -119,8 +133,8 @@ data class ParsedArgs(
119133
parseKeyValueArg("--stdin-name", arg)
120134
?: return ParseResult.Error(
121135
"Found option '${arg}', expected '${"--stdin-name"}=<value>'")
122-
arg.startsWith("--") -> return ParseResult.Error("Unexpected option: $arg")
123-
arg.startsWith("@") -> return ParseResult.Error("Unexpected option: $arg")
136+
arg.startsWith("--") -> return ParseResult.Error(unexpectedArg(arg))
137+
arg.startsWith("@") -> return ParseResult.Error(unexpectedArg(arg))
124138
else -> fileNames.add(arg)
125139
}
126140
}
@@ -147,6 +161,8 @@ data class ParsedArgs(
147161
))
148162
}
149163

164+
private fun unexpectedArg(arg: String) = "Unexpected option: $arg"
165+
150166
private fun parseKeyValueArg(key: String, arg: String): String? {
151167
val parts = arg.split('=', limit = 2)
152168
return parts[1].takeIf { parts[0] == key || parts.size == 2 }

core/src/test/java/com/facebook/ktfmt/cli/MainTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ class MainTest {
225225
}
226226

227227
@Test
228-
fun `kotlinlang-style is passed to formatter (file)`() {
228+
fun `--style=kotlinlang is passed to formatter (file)`() {
229229
val code =
230230
"""fun f() {
231231
for (child in
@@ -241,14 +241,14 @@ class MainTest {
241241
emptyInput,
242242
PrintStream(out),
243243
PrintStream(err),
244-
arrayOf("--kotlinlang-style", fooBar.toString()))
244+
arrayOf("--style=kotlinlang", fooBar.toString()))
245245
.run()
246246

247247
assertThat(fooBar.readText()).isEqualTo(code)
248248
}
249249

250250
@Test
251-
fun `kotlinlang-style is passed to formatter (stdin)`() {
251+
fun `--style=kotlinlang is passed to formatter (stdin)`() {
252252
val code =
253253
"""fun f() {
254254
|for (child in
@@ -271,7 +271,7 @@ class MainTest {
271271
code.byteInputStream(),
272272
PrintStream(out),
273273
PrintStream(err),
274-
arrayOf("--kotlinlang-style", "-"))
274+
arrayOf("--style=kotlinlang", "-"))
275275
.run()
276276

277277
assertThat(out.toString(UTF_8)).isEqualTo(formatted)

core/src/test/java/com/facebook/ktfmt/cli/ParsedArgsTest.kt

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,23 +61,29 @@ class ParsedArgsTest {
6161
}
6262

6363
@Test
64-
fun `parseOptions recognizes --meta-style`() {
65-
val parsed = assertSucceeds(ParsedArgs.parseOptions(arrayOf("--meta-style", "foo.kt")))
64+
fun `parseOptions recognizes --style=meta`() {
65+
val parsed = assertSucceeds(ParsedArgs.parseOptions(arrayOf("--style=meta", "foo.kt")))
6666
assertThat(parsed.formattingOptions).isEqualTo(Formatter.META_FORMAT)
6767
}
6868

6969
@Test
70-
fun `parseOptions recognizes --dropbox-style`() {
71-
val parsed = assertSucceeds(ParsedArgs.parseOptions(arrayOf("--kotlinlang-style", "foo.kt")))
70+
fun `parseOptions recognizes --style=kotlinlang`() {
71+
val parsed = assertSucceeds(ParsedArgs.parseOptions(arrayOf("--style=kotlinlang", "foo.kt")))
7272
assertThat(parsed.formattingOptions).isEqualTo(Formatter.KOTLINLANG_FORMAT)
7373
}
7474

7575
@Test
76-
fun `parseOptions recognizes --google-style`() {
77-
val parsed = assertSucceeds(ParsedArgs.parseOptions(arrayOf("--google-style", "foo.kt")))
76+
fun `parseOptions recognizes --style=google`() {
77+
val parsed = assertSucceeds(ParsedArgs.parseOptions(arrayOf("--style=google", "foo.kt")))
7878
assertThat(parsed.formattingOptions).isEqualTo(Formatter.GOOGLE_FORMAT)
7979
}
8080

81+
@Test
82+
fun `parseOptions rejects unknown style`() {
83+
val parseResult = ParsedArgs.parseOptions(arrayOf("--style=custom-style", "foo.kt"))
84+
assertThat(parseResult).isInstanceOf(ParseResult.Error::class.java)
85+
}
86+
8187
@Test
8288
fun `parseOptions recognizes --dry-run`() {
8389
val parsed = assertSucceeds(ParsedArgs.parseOptions(arrayOf("--dry-run", "foo.kt")))
@@ -169,7 +175,7 @@ class ParsedArgsTest {
169175
@Test
170176
fun `processArgs use the @file option with file containing arguments`() {
171177
val file = root.resolve("existing-file")
172-
file.writeText("--google-style\n--dry-run\n--set-exit-if-changed\nFile1.kt\nFile2.kt\n")
178+
file.writeText("--style=google\n--dry-run\n--set-exit-if-changed\nFile1.kt\nFile2.kt\n")
173179

174180
val result = ParsedArgs.processArgs(arrayOf("@" + file.absolutePath))
175181
assertThat(result).isInstanceOf(ParseResult.Ok::class.java)
@@ -186,7 +192,7 @@ class ParsedArgsTest {
186192
fun `parses multiple args successfully`() {
187193
val testResult =
188194
ParsedArgs.parseOptions(
189-
arrayOf("--google-style", "--dry-run", "--set-exit-if-changed", "File.kt"),
195+
arrayOf("--style=google", "--dry-run", "--set-exit-if-changed", "File.kt"),
190196
)
191197
assertThat(testResult)
192198
.isEqualTo(
@@ -201,7 +207,7 @@ class ParsedArgsTest {
201207
@Test
202208
fun `last style in args wins`() {
203209
val testResult =
204-
ParsedArgs.parseOptions(arrayOf("--google-style", "--kotlinlang-style", "File.kt"))
210+
ParsedArgs.parseOptions(arrayOf("--style=google", "--style=kotlinlang", "File.kt"))
205211
assertThat(testResult)
206212
.isEqualTo(
207213
parseResultOk(
@@ -212,7 +218,7 @@ class ParsedArgsTest {
212218

213219
@Test
214220
fun `error when parsing multiple args and one is unknown`() {
215-
val testResult = ParsedArgs.parseOptions(arrayOf("@unknown", "--google-style", "File.kt"))
221+
val testResult = ParsedArgs.parseOptions(arrayOf("@unknown", "--style=google", "File.kt"))
216222
assertThat(testResult).isEqualTo(ParseResult.Error("Unexpected option: @unknown"))
217223
}
218224

0 commit comments

Comments
 (0)