diff options
| author | DanielGavin <danielgavin5@hotmail.com> | 2025-09-24 20:38:16 +0200 |
|---|---|---|
| committer | DanielGavin <danielgavin5@hotmail.com> | 2025-09-24 20:38:16 +0200 |
| commit | e50bcf94367f594e76628cae8751b6f00911a4b8 (patch) | |
| tree | 4c7dbb2c9f755123323fa9faa0e5ec7f3f795f52 /src | |
| parent | 188d6784c40af350d574523837bbbea23b73d216 (diff) | |
Use client capabilities to check if range semantic token is supported.
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/requests.odin | 6 | ||||
| -rw-r--r-- | src/server/semantic_tokens.odin | 8 | ||||
| -rw-r--r-- | src/server/types.odin | 1 | ||||
| -rw-r--r-- | src/server/unmarshal.odin | 13 |
4 files changed, 23 insertions, 5 deletions
diff --git a/src/server/requests.odin b/src/server/requests.odin index 17597be..f03750c 100644 --- a/src/server/requests.odin +++ b/src/server/requests.odin @@ -697,6 +697,8 @@ request_initialize :: proc( signatureTriggerCharacters := []string{"(", ","} signatureRetriggerCharacters := []string{","} + semantic_range_support := initialize_params.capabilities.textDocument.semanticTokens.requests.range + response := make_response_message( params = ResponseInitializeParams { capabilities = ServerCapabilities { @@ -716,8 +718,8 @@ request_initialize :: proc( retriggerCharacters = signatureRetriggerCharacters, }, semanticTokensProvider = SemanticTokensOptions { - range = config.enable_semantic_tokens, - full = false, + range = config.enable_semantic_tokens && semantic_range_support, + full = config.enable_semantic_tokens && !semantic_range_support, legend = SemanticTokensLegend { tokenTypes = semantic_token_type_names, tokenModifiers = semantic_token_modifier_names, diff --git a/src/server/semantic_tokens.odin b/src/server/semantic_tokens.odin index 669ff99..d237109 100644 --- a/src/server/semantic_tokens.odin +++ b/src/server/semantic_tokens.odin @@ -65,10 +65,12 @@ SemanticTokenModifier :: enum u8 { semantic_token_modifier_names: []string = {"declaration", "definition", "deprecated", "readonly"} SemanticTokenModifiers :: bit_set[SemanticTokenModifier;u32] +SemanticTokensRequest :: struct { + range: bool, +} + SemanticTokensClientCapabilities :: struct { - requests: struct { - range: bool, - }, + requests: SemanticTokensRequest, tokenTypes: []string, tokenModifiers: []string, formats: []string, diff --git a/src/server/types.odin b/src/server/types.odin index 6442503..0f16b2e 100644 --- a/src/server/types.odin +++ b/src/server/types.odin @@ -190,6 +190,7 @@ TextDocumentClientCapabilities :: struct { signatureHelp: SignatureHelpClientCapabilities, documentSymbol: DocumentSymbolClientCapabilities, codeAction: CodeActionClientCapabilities, + semanticTokens: SemanticTokensClientCapabilities, } StaleRequestSupport :: struct { diff --git a/src/server/unmarshal.odin b/src/server/unmarshal.odin index d7efe63..d93663c 100644 --- a/src/server/unmarshal.odin +++ b/src/server/unmarshal.odin @@ -60,6 +60,19 @@ unmarshal :: proc(json_value: json.Value, v: any, allocator: mem.Allocator) -> j } case json.Array: #partial switch variant in type_info.variant { + case Type_Info_Slice: + array := (^mem.Raw_Slice)(v.data) + data := mem.alloc(variant.elem.size * int(len(j)), variant.elem.align, allocator) or_else panic("OOM") + array.data = data + array.len = len(j) + + for i in 0 ..< array.len { + a := any{rawptr(uintptr(array.data) + uintptr(variant.elem_size * i)), variant.elem.id} + + if ret := unmarshal(j[i], a, allocator); ret != nil { + return ret + } + } case Type_Info_Dynamic_Array: array := (^mem.Raw_Dynamic_Array)(v.data) if array.data == nil { |