Skip to content

Commit efb8cd1

Browse files
committed
Improve trailing lambda completions
Fix #122
1 parent 3cae1ea commit efb8cd1

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

server/src/main/kotlin/org/javacs/kt/completion/RenderCompletionItem.kt

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import org.eclipse.lsp4j.CompletionItemKind.Function
66
import org.eclipse.lsp4j.InsertTextFormat.PlainText
77
import org.eclipse.lsp4j.InsertTextFormat.Snippet
88
import org.jetbrains.kotlin.descriptors.*
9+
import org.jetbrains.kotlin.builtins.isFunctionType
910
import org.jetbrains.kotlin.renderer.ClassifierNamePolicy
1011
import org.jetbrains.kotlin.renderer.DescriptorRenderer
1112
import org.jetbrains.kotlin.renderer.ParameterNameRenderingPolicy
@@ -92,13 +93,26 @@ class RenderCompletionItem(val snippetsEnabled: Boolean) : DeclarationDescriptor
9293
private fun functionInsertText(desc: FunctionDescriptor): String {
9394
val name = escape(desc.label()!!)
9495

95-
return when {
96-
!snippetsEnabled -> name
97-
desc.valueParameters.isEmpty() -> "$name()"
98-
else -> "$name(${desc.valueParameters.mapIndexed { index, vpd -> "\${${index + 1}:${vpd.name}}" }.joinToString()})\$0"
96+
return if (snippetsEnabled) {
97+
val parameters = desc.valueParameters
98+
val hasTrailingLambda = parameters.lastOrNull()?.type?.isFunctionType ?: false
99+
100+
if (hasTrailingLambda) {
101+
val parenthesizedParams = parameters.dropLast(1).ifEmpty { null }?.let { "(${valueParametersSnippet(it)})" } ?: ""
102+
"$name$parenthesizedParams { \${${parameters.size}:${parameters.last().name}} }\$0"
103+
} else {
104+
"$name(${valueParametersSnippet(parameters)})\$0"
105+
}
106+
} else {
107+
name
99108
}
100109
}
101110

111+
private fun valueParametersSnippet(parameters: List<ValueParameterDescriptor>) = parameters
112+
.asSequence()
113+
.mapIndexed { index, vpd -> "\${${index + 1}:${vpd.name}}" }
114+
.joinToString()
115+
102116
override fun visitModuleDeclaration(desc: ModuleDescriptor, nothing: Unit?): CompletionItem {
103117
setDefaults(desc)
104118

0 commit comments

Comments
 (0)