Files
Alexander Zolotov b181f5ecc3 [fleet, lsp] multiplatform protocol module
GitOrigin-RevId: d5e04548ba175ff0d1486ef9179394ff05eb16a9
2025-09-18 13:05:51 +00:00

111 lines
3.6 KiB
Kotlin

package com.jetbrains.lsp.protocol
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationException
import kotlinx.serialization.builtins.ListSerializer
import kotlinx.serialization.builtins.nullable
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.JsonContentPolymorphicSerializer
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonObject
import kotlin.jvm.JvmInline
@Serializable
data class DocumentHighlightParams(
override val textDocument: TextDocumentIdentifier,
override val position: Position,
override val workDoneToken: ProgressToken? = null,
override val partialResultToken: ProgressToken? = null,
) : TextDocumentPositionParams, WorkDoneProgressParams, PartialResultParams
/**
* A document highlight is a range inside a text document which deserves
* special attention. Usually a document highlight is visualized by changing
* the background color of its range.
*
*/
@Serializable
data class DocumentHighlight(
/**
* The range this highlight applies to.
*/
val range: Range,
/**
* The highlight kind, default is DocumentHighlightKind.Text.
*/
val kind: DocumentHighlightKind?,
)
/**
* A document highlight kind.
*/
@Serializable(with = DocumentHighlightKind.Serializer::class)
enum class DocumentHighlightKind(val value: Int) {
/**
* A textual occurrence.
*/
Text(1),
/**
* Read-access of a symbol, like reading a variable.
*/
Read(2),
/**
* Write-access of a symbol, like writing to a variable.
*/
Write(3),
;
class Serializer : EnumAsIntSerializer<DocumentHighlightKind>(
serialName = "DocumentHighlightKind",
serialize = DocumentHighlightKind::value,
deserialize = { DocumentHighlightKind.entries[it - 1] },
)
}
@Serializable(with = DocumentSymbolResult.Serializer::class)
sealed interface DocumentSymbolResult {
@Serializable
@JvmInline
value class DocumentSymbols(val value: List<DocumentSymbol>) : DocumentSymbolResult
@Serializable
@JvmInline
value class SymbolInformations(val value: List<SymbolInformation>) : DocumentSymbolResult
class Serializer : JsonContentPolymorphicSerializer<DocumentSymbolResult>(DocumentSymbolResult::class) {
override fun selectDeserializer(element: JsonElement): DeserializationStrategy<DocumentSymbolResult> {
return when (element) {
is JsonArray -> {
if (element.isNotEmpty() && element[0].let { it is JsonObject && it.containsKey("location")}) {
SymbolInformations.serializer()
}
else {
DocumentSymbols.serializer()
}
}
else -> throw SerializationException("Expected an array of DocumentSymbol or SymbolInformation.")
}
}
}
}
object TextDocuments {
val DocumentSymbol: RequestType<DocumentSymbolParams, DocumentSymbolResult?, Unit> =
RequestType(
"textDocument/documentSymbol",
DocumentSymbolParams.serializer(), DocumentSymbolResult.serializer().nullable,
Unit.serializer())
val DocumentHighlightRequestType: RequestType<DocumentHighlightParams, List<DocumentHighlight>?, Unit> =
RequestType(
"textDocument/documentHighlight",
DocumentHighlightParams.serializer(), ListSerializer(DocumentHighlight.serializer()).nullable,
Unit.serializer())
}