@@ -6,6 +6,7 @@ import org.eclipse.lsp4j.CompletionItemKind.Function
6
6
import org.eclipse.lsp4j.InsertTextFormat.PlainText
7
7
import org.eclipse.lsp4j.InsertTextFormat.Snippet
8
8
import org.jetbrains.kotlin.descriptors.*
9
+ import org.jetbrains.kotlin.builtins.isFunctionType
9
10
import org.jetbrains.kotlin.renderer.ClassifierNamePolicy
10
11
import org.jetbrains.kotlin.renderer.DescriptorRenderer
11
12
import org.jetbrains.kotlin.renderer.ParameterNameRenderingPolicy
@@ -92,13 +93,26 @@ class RenderCompletionItem(val snippetsEnabled: Boolean) : DeclarationDescriptor
92
93
private fun functionInsertText (desc : FunctionDescriptor ): String {
93
94
val name = escape(desc.label()!! )
94
95
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
99
108
}
100
109
}
101
110
111
+ private fun valueParametersSnippet (parameters : List <ValueParameterDescriptor >) = parameters
112
+ .asSequence()
113
+ .mapIndexed { index, vpd -> " \$ {${index + 1 } :${vpd.name} }" }
114
+ .joinToString()
115
+
102
116
override fun visitModuleDeclaration (desc : ModuleDescriptor , nothing : Unit? ): CompletionItem {
103
117
setDefaults(desc)
104
118
0 commit comments