Skip to content

Commit a529ec9

Browse files
darthorimarintellij-monorepo-bot
authored andcommitted
[lsp] improve API for binding resolve requests with original ones
we should be able to find `LSConfigurationEntry` from the resolve request which created the original GitOrigin-RevId: 34f3db11fb4717e82da67e584a2a688a13fb8bc2
1 parent 9170af3 commit a529ec9

File tree

6 files changed

+42
-15
lines changed

6 files changed

+42
-15
lines changed

api.features/src/com/jetbrains/ls/api/features/completion/LSCompletion.kt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@ package com.jetbrains.ls.api.features.completion
33

44
import com.jetbrains.ls.api.core.LSServer
55
import com.jetbrains.ls.api.features.LSConfiguration
6-
import com.jetbrains.ls.api.features.entries
6+
import com.jetbrains.ls.api.features.configuration.LSUniqueConfigurationEntry
77
import com.jetbrains.ls.api.features.entriesFor
8+
import com.jetbrains.ls.api.features.entryById
9+
import com.jetbrains.ls.api.features.resolve.ResolveDataWithConfigurationEntryId
10+
import com.jetbrains.ls.api.features.resolve.getConfigurationEntryId
811
import com.jetbrains.lsp.protocol.*
912
import kotlinx.serialization.Serializable
1013
import kotlinx.serialization.json.JsonElement
11-
import kotlinx.serialization.json.decodeFromJsonElement
1214

1315
object LSCompletion {
1416
context(_: LSServer, _: LSConfiguration)
@@ -19,12 +21,10 @@ object LSCompletion {
1921
}
2022

2123
context(_: LSServer, _: LSConfiguration)
22-
suspend fun resolveCompletion(params: CompletionItem): CompletionItem {
23-
val data: CompletionItemData = runCatching {
24-
val data = params.data ?: return params
25-
LSP.json.decodeFromJsonElement<CompletionItemData>(data)
26-
}.getOrNull() ?: return params
27-
return entries<LSCompletionProvider>().firstOrNull { it.uniqueId == data.providerId }?.resolveCompletion(params) ?: params
24+
suspend fun resolveCompletion(item: CompletionItem): CompletionItem {
25+
val uniqueId = getConfigurationEntryId(item.data) ?: return item
26+
val entry = entryById<LSCompletionProvider>(uniqueId) ?: return item
27+
return entry.resolveCompletion(item) ?: item
2828
}
2929

3030
private fun List<CompletionList>.combined(): CompletionList {
@@ -43,7 +43,7 @@ object LSCompletion {
4343
//todo should be later moved to a common features module
4444
@Serializable
4545
data class CompletionItemData(
46-
val providerId: String,
4746
val params: CompletionParams,
4847
val additionalData: JsonElement,
49-
)
48+
override val configurationEntryId: LSUniqueConfigurationEntry.UniqueId,
49+
) : ResolveDataWithConfigurationEntryId
Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
22
package com.jetbrains.ls.api.features.configuration
33

4-
interface LSUniqueConfigurationEntry {
5-
val uniqueId: String
4+
import com.jetbrains.ls.api.features.LSConfigurationEntry
5+
import kotlinx.serialization.Serializable
6+
7+
interface LSUniqueConfigurationEntry : LSConfigurationEntry {
8+
val uniqueId: UniqueId
9+
10+
@Serializable
11+
@JvmInline
12+
value class UniqueId(val value: String)
613
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
2+
package com.jetbrains.ls.api.features.resolve
3+
4+
import com.jetbrains.ls.api.features.configuration.LSUniqueConfigurationEntry
5+
import kotlinx.serialization.json.JsonElement
6+
import kotlinx.serialization.json.JsonObject
7+
import kotlinx.serialization.json.JsonPrimitive
8+
9+
interface ResolveDataWithConfigurationEntryId {
10+
val configurationEntryId: LSUniqueConfigurationEntry.UniqueId
11+
}
12+
13+
fun getConfigurationEntryId(data: JsonElement?): LSUniqueConfigurationEntry.UniqueId? {
14+
if (data !is JsonObject) return null
15+
val idElement = data[ResolveDataWithConfigurationEntryId::configurationEntryId.name] as? JsonPrimitive ?: return null
16+
return LSUniqueConfigurationEntry.UniqueId(idElement.content)
17+
}

features-impl/common/src/com/jetbrains/ls/api/features/impl/common/completion/LSAbstractCompletionProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ abstract class LSAbstractCompletionProvider : LSCompletionProvider {
4141
val completionItems = lookupElements.mapIndexed { i, lookup ->
4242
val lookupPresentation = LookupElementPresentation().also { lookup.renderElement(it) }
4343
val additionalData = createAdditionalData(lookup, completionProcess.arranger.itemMatcher(lookup)) ?: return@mapIndexed null
44-
val data = CompletionItemData(uniqueId, params, additionalData)
44+
val data = CompletionItemData(params, additionalData, uniqueId)
4545
CompletionItem(
4646
label = lookupPresentation.itemText ?: lookup.lookupString,
4747
sortText = getSortedFieldByIndex(i),

features-impl/kotlin/src/com/jetbrains/ls/api/features/impl/common/kotlin/completion/LSCompletionProviderKotlinImpl.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import com.jetbrains.ls.api.core.util.findVirtualFile
1717
import com.jetbrains.ls.api.core.util.offsetByPosition
1818
import com.jetbrains.ls.api.core.withAnalysisContext
1919
import com.jetbrains.ls.api.features.completion.CompletionItemData
20+
import com.jetbrains.ls.api.features.configuration.LSUniqueConfigurationEntry
2021
import com.jetbrains.ls.api.features.impl.common.completion.LSAbstractCompletionProvider
2122
import com.jetbrains.ls.api.features.impl.common.hover.AbstractLSHoverProvider.LSMarkdownDocProvider.Companion.getMarkdownDoc
2223
import com.jetbrains.ls.api.features.impl.common.kotlin.language.LSKotlinLanguage
@@ -37,7 +38,7 @@ import org.jetbrains.kotlin.psi.KtFile
3738
import org.jetbrains.kotlin.psi.KtPsiFactory
3839

3940
object LSCompletionProviderKotlinImpl : LSAbstractCompletionProvider() {
40-
override val uniqueId: String = "KotlinCompletionProvider"
41+
override val uniqueId: LSUniqueConfigurationEntry.UniqueId = LSUniqueConfigurationEntry.UniqueId("KotlinCompletionProvider")
4142
override val supportedLanguages: Set<LSLanguage> = setOf(LSKotlinLanguage)
4243

4344

features-impl/kotlin/src/com/jetbrains/ls/api/features/impl/common/kotlin/completion/rekot/LSRekotBasedKotlinCompletionProviderImpl.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import com.jetbrains.ls.api.core.util.offsetByPosition
1414
import com.jetbrains.ls.api.core.util.positionByOffset
1515
import com.jetbrains.ls.api.core.withAnalysisContext
1616
import com.jetbrains.ls.api.features.completion.LSCompletionProvider
17+
import com.jetbrains.ls.api.features.configuration.LSUniqueConfigurationEntry
1718
import com.jetbrains.ls.api.features.impl.common.kotlin.language.LSKotlinLanguage
1819
import com.jetbrains.ls.api.features.language.LSLanguage
1920
import com.jetbrains.ls.api.features.utils.isSource
@@ -35,7 +36,8 @@ import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatformAnalyzerServices
3536
* Taken from https://github.com/darthorimar/rekot
3637
*/
3738
internal object LSRekotBasedKotlinCompletionProviderImpl : LSCompletionProvider {
38-
override val uniqueId: String get() = this::class.java.name
39+
override val uniqueId: LSUniqueConfigurationEntry.UniqueId = LSUniqueConfigurationEntry.UniqueId(this::class.java.name)
40+
3941
override val supportedLanguages: Set<LSLanguage> = setOf(LSKotlinLanguage)
4042
override val supportsResolveRequest: Boolean get() = false
4143

0 commit comments

Comments
 (0)