aboutsummaryrefslogtreecommitdiff
path: root/src/server/requests.odin
diff options
context:
space:
mode:
authorBrad Lewis <22850972+BradLewis@users.noreply.github.com>2025-06-09 14:32:59 -0400
committerBrad Lewis <22850972+BradLewis@users.noreply.github.com>2025-06-13 15:23:36 -0400
commit8816d531da666959b7df0c64401b8fa064b0cd3d (patch)
tree893cf9b15bb610f13b2c6cf3c2c3148166341ed4 /src/server/requests.odin
parent023c8a0fd1d8d8e54b38bf990a74816a31dee68e (diff)
Add textDocument/typeDefinition support
Diffstat (limited to 'src/server/requests.odin')
-rw-r--r--src/server/requests.odin42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/server/requests.odin b/src/server/requests.odin
index d5a3481..837bc9b 100644
--- a/src/server/requests.odin
+++ b/src/server/requests.odin
@@ -228,6 +228,7 @@ call_map: map[string]proc(_: json.Value, _: RequestId, _: ^common.Config, _: ^Wr
"textDocument/didClose" = notification_did_close,
"textDocument/didSave" = notification_did_save,
"textDocument/definition" = request_definition,
+ "textDocument/typeDefinition" = request_type_definition,
"textDocument/completion" = request_completion,
"textDocument/signatureHelp" = request_signature_help,
"textDocument/documentSymbol" = request_document_symbols,
@@ -680,6 +681,7 @@ request_initialize :: proc(
workspaceSymbolProvider = true,
referencesProvider = config.enable_references,
definitionProvider = true,
+ typeDefinitionProvider = true,
completionProvider = CompletionOptions {
resolveProvider = false,
triggerCharacters = completionTriggerCharacters,
@@ -813,6 +815,46 @@ request_definition :: proc(
return .None
}
+request_type_definition :: proc(
+ params: json.Value,
+ id: RequestId,
+ config: ^common.Config,
+ writer: ^Writer,
+) -> common.Error {
+ params_object, ok := params.(json.Object)
+
+ if !ok {
+ return .ParseError
+ }
+
+ definition_params: TextDocumentPositionParams
+
+ if unmarshal(params, definition_params, context.temp_allocator) != nil {
+ return .ParseError
+ }
+
+ document := document_get(definition_params.textDocument.uri)
+
+ if document == nil {
+ return .InternalError
+ }
+
+ locations, ok2 := get_type_definition_locations(document, definition_params.position)
+ if !ok2 {
+ log.warn("Failed to get type definition location")
+ }
+
+ if len(locations) == 1 {
+ response := make_response_message(params = locations[0], id = id)
+ send_response(response, writer)
+ } else {
+ response := make_response_message(params = locations, id = id)
+ send_response(response, writer)
+ }
+
+ return .None
+}
+
request_completion :: proc(
params: json.Value,
id: RequestId,