aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDanielGavin <danielgavin5@hotmail.com>2025-09-24 20:38:16 +0200
committerDanielGavin <danielgavin5@hotmail.com>2025-09-24 20:38:16 +0200
commite50bcf94367f594e76628cae8751b6f00911a4b8 (patch)
tree4c7dbb2c9f755123323fa9faa0e5ec7f3f795f52
parent188d6784c40af350d574523837bbbea23b73d216 (diff)
Use client capabilities to check if range semantic token is supported.
-rw-r--r--src/server/requests.odin6
-rw-r--r--src/server/semantic_tokens.odin8
-rw-r--r--src/server/types.odin1
-rw-r--r--src/server/unmarshal.odin13
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 {