Skip to content

Commit da6dc0f

Browse files
committed
Add formatting options
1 parent eee8afa commit da6dc0f

File tree

5 files changed

+91
-16
lines changed

5 files changed

+91
-16
lines changed

server/src/main/kotlin/org/javacs/kt/Configuration.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,18 @@ data class InlayHintsConfiguration(
5757
var chainedHints: Boolean = false
5858
)
5959

60+
data class KtFmtConfiguration(
61+
var style: String = "google",
62+
var indent: Int = 4,
63+
var maxWidth: Int = 100,
64+
var continuationIndent: Int = 8,
65+
var removeUnusedImports: Boolean = true,
66+
)
67+
68+
data class FormattingConfiguration(
69+
var formatter: String = "ktfmt",
70+
var ktFmt: KtFmtConfiguration = KtFmtConfiguration()
71+
)
6072

6173
fun getStoragePath(params: InitializeParams): Path? {
6274
params.initializationOptions?.let { initializationOptions ->
@@ -94,5 +106,6 @@ public data class Configuration(
94106
val scripts: ScriptsConfiguration = ScriptsConfiguration(),
95107
val indexing: IndexingConfiguration = IndexingConfiguration(),
96108
val externalSources: ExternalSourcesConfiguration = ExternalSourcesConfiguration(),
97-
val inlayHints: InlayHintsConfiguration = InlayHintsConfiguration()
109+
val inlayHints: InlayHintsConfiguration = InlayHintsConfiguration(),
110+
val formatting: FormattingConfiguration = FormattingConfiguration(),
98111
)

server/src/main/kotlin/org/javacs/kt/KotlinTextDocumentService.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import org.javacs.kt.codeaction.codeActions
88
import org.javacs.kt.completion.completions
99
import org.javacs.kt.definition.goToDefinition
1010
import org.javacs.kt.diagnostic.convertDiagnostic
11-
import org.javacs.kt.formatting.formatKotlinCode
11+
import org.javacs.kt.formatting.FormattingService
1212
import org.javacs.kt.hover.hoverAt
1313
import org.javacs.kt.position.offset
1414
import org.javacs.kt.position.extractRange
@@ -45,6 +45,7 @@ class KotlinTextDocumentService(
4545
) : TextDocumentService, Closeable {
4646
private lateinit var client: LanguageClient
4747
private val async = AsyncExecutor()
48+
private val formattingService = FormattingService(config.formatting)
4849

4950
var debounceLint = Debouncer(Duration.ofMillis(config.diagnostics.debounceTime))
5051
val lintTodo = mutableSetOf<URI>()
@@ -139,7 +140,7 @@ class KotlinTextDocumentService(
139140
val code = extractRange(params.textDocument.content, params.range)
140141
listOf(TextEdit(
141142
params.range,
142-
formatKotlinCode(code, params.options)
143+
formattingService.formatKotlinCode(code, params.options)
143144
))
144145
}
145146

@@ -215,7 +216,7 @@ class KotlinTextDocumentService(
215216
LOG.info("Formatting {}", describeURI(params.textDocument.uri))
216217
listOf(TextEdit(
217218
Range(Position(0, 0), position(code, code.length)),
218-
formatKotlinCode(code, params.options)
219+
formattingService.formatKotlinCode(code, params.options)
219220
))
220221
}
221222

server/src/main/kotlin/org/javacs/kt/KotlinWorkspaceService.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,22 @@ class KotlinWorkspaceService(
103103
}
104104
}
105105

106+
// Update options for formatting
107+
get("formatting")?.asJsonObject?.apply {
108+
val formatting = config.formatting
109+
get("formatter")?.asString?.let {
110+
formatting.formatter = it
111+
}
112+
get("ktfmt")?.asJsonObject?.apply {
113+
val ktfmt = formatting.ktFmt
114+
get("style")?.asString?.let { ktfmt.style = it }
115+
get("indent")?.asInt?.let { ktfmt.indent = it }
116+
get("maxWidth")?.asInt?.let { ktfmt.maxWidth = it }
117+
get("continuationIndent")?.asInt?.let { ktfmt.continuationIndent = it }
118+
get("removeUnusedImports")?.asBoolean?.let { ktfmt.removeUnusedImports = it }
119+
}
120+
}
121+
106122
// Update options for inlay hints
107123
get("inlayHints")?.asJsonObject?.apply {
108124
val inlayHints = config.inlayHints
Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,31 @@
11
package org.javacs.kt.formatting
22

3-
import com.facebook.ktfmt.format.Formatter
4-
import com.facebook.ktfmt.format.FormattingOptions as KtfmtOptions
5-
import org.eclipse.lsp4j.FormattingOptions
6-
7-
fun formatKotlinCode(
8-
code: String,
9-
options: FormattingOptions = FormattingOptions(4, true)
10-
): String = Formatter.format(KtfmtOptions(
11-
style = KtfmtOptions.Style.GOOGLE,
12-
blockIndent = options.tabSize,
13-
continuationIndent = 2 * options.tabSize
14-
), code)
3+
import org.javacs.kt.Configuration
4+
import org.javacs.kt.FormattingConfiguration
5+
import org.eclipse.lsp4j.FormattingOptions as LspFromattingOptions
6+
7+
private const val DEFAULT_INDENT = 4
8+
9+
class FormattingService(private val config: FormattingConfiguration) {
10+
11+
private val formatter: Formatter get() = when (config.formatter) {
12+
"ktfmt" -> KtFmtFormatter(config.ktFmt)
13+
"none" -> NopFormatter
14+
else -> KtFmtFormatter(config.ktFmt)
15+
}
16+
17+
fun formatKotlinCode(
18+
code: String,
19+
options: LspFromattingOptions = LspFromattingOptions(DEFAULT_INDENT, true)
20+
): String = this.formatter.format(code, options)
21+
}
22+
23+
24+
interface Formatter {
25+
fun format(code: String, options: LspFromattingOptions): String
26+
}
27+
28+
object NopFormatter : Formatter {
29+
override fun format(code: String, options: LspFromattingOptions): String = code
30+
}
31+
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.javacs.kt.formatting
2+
3+
import org.javacs.kt.KtFmtConfiguration
4+
import com.facebook.ktfmt.format.Formatter as KtFmt
5+
import com.facebook.ktfmt.format.FormattingOptions as KtfmtOptions
6+
import org.eclipse.lsp4j.FormattingOptions as LspFormattingOptions
7+
8+
class KtFmtFormatter(private val config: KtFmtConfiguration) : Formatter {
9+
override fun format(
10+
code: String,
11+
options: LspFormattingOptions,
12+
): String {
13+
val style = when (config.style) {
14+
"google" -> KtfmtOptions.Style.GOOGLE
15+
"facebook" -> KtfmtOptions.Style.FACEBOOK
16+
"dropbox" -> KtfmtOptions.Style.DROPBOX
17+
else -> KtfmtOptions.Style.GOOGLE
18+
}
19+
return KtFmt.format(KtfmtOptions(
20+
style = style,
21+
maxWidth = config.maxWidth,
22+
blockIndent = options.tabSize.takeUnless { it == 0 } ?: config.indent,
23+
continuationIndent = config.continuationIndent,
24+
removeUnusedImports = config.removeUnusedImports,
25+
), code)
26+
}
27+
}
28+

0 commit comments

Comments
 (0)