Skip to content

Commit 5aba8bb

Browse files
darthorimarintellij-monorepo-bot
authored andcommitted
[lsp] implement inlay hints
^LSP-205 fixed GitOrigin-RevId: 300d4294c0044f1faeee840aa5cbb74730871411
1 parent a529ec9 commit 5aba8bb

File tree

11 files changed

+473
-9
lines changed

11 files changed

+473
-9
lines changed

api.features/src/com/jetbrains/ls/api/features/LSConfiguration.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import com.jetbrains.ls.api.features.configuration.LSUniqueConfigurationEntry
88
import com.jetbrains.ls.api.features.language.LSLanguage
99
import com.jetbrains.ls.api.features.language.LSLanguageConfiguration
1010
import com.jetbrains.ls.api.features.language.matches
11-
import com.jetbrains.ls.api.features.semanticTokens.LSSemanticTokensProvider
1211
import com.jetbrains.lsp.protocol.TextDocumentIdentifier
1312

1413
class LSConfiguration(
@@ -60,6 +59,13 @@ class LSConfiguration(
6059
return entriesByLanguage[language]?.filterIsInstance<E>() ?: emptyList()
6160
}
6261

62+
inline fun <reified E : LSUniqueConfigurationEntry> entryById(
63+
id: LSUniqueConfigurationEntry.UniqueId,
64+
): E? {
65+
val entries = entries<E>()
66+
return entries.firstOrNull { it.uniqueId == id }
67+
}
68+
6369
fun languageFor(document: TextDocumentIdentifier): LSLanguage? {
6470
return languages.firstOrNull { it.matches(document) }
6571
}
@@ -77,6 +83,10 @@ context(configuration: LSConfiguration)
7783
inline fun <reified E : LSLanguageSpecificConfigurationEntry> entriesFor(language: LSLanguage): List<E> =
7884
configuration.entriesFor(language)
7985

86+
context(configuration: LSConfiguration)
87+
inline fun <reified E : LSUniqueConfigurationEntry> entryById(id: LSUniqueConfigurationEntry.UniqueId): E? =
88+
configuration.entryById<E>(id)
89+
8090
context(configuration: LSConfiguration)
8191
fun commandDescriptorByCommandName(commandName: String): LSCommandDescriptor? =
8292
configuration.commandDescriptorByCommandName(commandName)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
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.inlayHints
3+
4+
import com.jetbrains.ls.api.core.LSServer
5+
import com.jetbrains.ls.api.features.LSConfiguration
6+
import com.jetbrains.ls.api.features.configuration.LSUniqueConfigurationEntry
7+
import com.jetbrains.ls.api.features.entriesFor
8+
import com.jetbrains.ls.api.features.partialResults.LSConcurrentResponseHandler
9+
import com.jetbrains.ls.api.features.resolve.getConfigurationEntryId
10+
import com.jetbrains.ls.api.features.entryById
11+
import com.jetbrains.lsp.protocol.InlayHint
12+
import com.jetbrains.lsp.protocol.InlayHintParams
13+
14+
object LSInlayHints {
15+
context(_: LSServer, _: LSConfiguration)
16+
suspend fun inlayHints(params: InlayHintParams): List<InlayHint> {
17+
return LSConcurrentResponseHandler.respondDirectlyWithResultsCollectedConcurrently(
18+
entriesFor<LSInlayHintsProvider>(params.textDocument),
19+
) {
20+
it.getInlayHints(params)
21+
}
22+
}
23+
context(_: LSServer, _: LSConfiguration)
24+
suspend fun resolveInlayHint(hint: InlayHint): InlayHint {
25+
val uniqueId = getConfigurationEntryId(hint.data) ?: return hint
26+
val entry = entryById<LSInlayHintsProvider>(uniqueId) ?: return hint
27+
return entry.resolveInlayHint(hint) ?: hint
28+
}
29+
}
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.inlayHints
3+
4+
import com.jetbrains.ls.api.core.LSServer
5+
import com.jetbrains.ls.api.features.LSLanguageSpecificConfigurationEntry
6+
import com.jetbrains.ls.api.features.configuration.LSUniqueConfigurationEntry
7+
import com.jetbrains.lsp.protocol.InlayHint
8+
import com.jetbrains.lsp.protocol.InlayHintParams
9+
import kotlinx.coroutines.flow.Flow
10+
11+
interface LSInlayHintsProvider : LSLanguageSpecificConfigurationEntry, LSUniqueConfigurationEntry {
12+
context(_: LSServer)
13+
fun getInlayHints(params: InlayHintParams): Flow<InlayHint>
14+
15+
context(_: LSServer)
16+
suspend fun resolveInlayHint(hint: InlayHint): InlayHint?
17+
}

api.features/src/com/jetbrains/ls/api/features/utils/PsiSerializablePointer.kt

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
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.utils
33

4+
import com.intellij.openapi.project.Project
45
import com.intellij.openapi.vfs.VirtualFile
5-
import com.intellij.psi.PsiElement
6-
import com.intellij.psi.PsiFile
7-
import com.intellij.psi.PsiFileSystemItem
6+
import com.intellij.openapi.vfs.VirtualFileManager
7+
import com.intellij.openapi.vfs.findPsiFile
8+
import com.intellij.psi.*
89
import com.intellij.psi.util.endOffset
910
import com.intellij.psi.util.startOffset
11+
import com.jetbrains.ls.api.core.util.lspUriToIntellijUri
1012
import com.jetbrains.ls.api.core.util.uri
11-
import com.jetbrains.ls.api.core.LSAnalysisContext
12-
import com.jetbrains.ls.api.core.LSServer
1313
import com.jetbrains.lsp.protocol.URI
1414
import kotlinx.serialization.Serializable
1515

@@ -20,7 +20,14 @@ sealed class PsiSerializablePointer {
2020

2121
abstract fun restore(psiFile: PsiFile): PsiElement?
2222

23-
abstract fun matches(element: PsiElement): Boolean
23+
open fun restore(project: Project): PsiElement? {
24+
val intellijUri = uri.lspUriToIntellijUri() ?: return null
25+
val virtualFile = VirtualFileManager.getInstance().refreshAndFindFileByUrl(intellijUri) ?: return null
26+
val psiFile = virtualFile.findPsiFile(project) ?: return null
27+
return restore(psiFile)
28+
}
29+
30+
abstract fun matches(element: PsiElement): Boolean
2431

2532
@Serializable
2633
internal data class PsiFileSerializablePointer(
@@ -63,6 +70,12 @@ sealed class PsiSerializablePointer {
6370
}
6471

6572
companion object {
73+
fun fromPsiPointer(pointer: SmartPsiElementPointer<*>): PsiSerializablePointer {
74+
val file = pointer.containingFile ?: error("File for pointer is null")
75+
val element = pointer.element ?: error("Element for pointer is null")
76+
return create(element, file.virtualFile)
77+
}
78+
6679
fun create(psi: PsiElement, file: VirtualFile): PsiSerializablePointer {
6780
return when (psi) {
6881
is PsiFile -> {
@@ -78,4 +91,9 @@ sealed class PsiSerializablePointer {
7891
}
7992
}
8093
}
94+
}
95+
96+
fun PsiSerializablePointer.toPsiPointer(project: Project): SmartPsiElementPointer<PsiElement> {
97+
val element = restore(project) ?: error("Cannot restore ${this} for pointer")
98+
return element.createSmartPointer()
8199
}

0 commit comments

Comments
 (0)