From b5a7a087a5c91ef320eaabf5685604bda83eff68 Mon Sep 17 00:00:00 2001 From: Brad Lewis <22850972+BradLewis@users.noreply.github.com> Date: Tue, 15 Jul 2025 10:20:00 -0400 Subject: Resolve hover for procedure parameter names --- src/server/analysis.odin | 12 ++++++++++++ src/server/hover.odin | 37 +++++++++++++++++++++++++++++++++---- 2 files changed, 45 insertions(+), 4 deletions(-) (limited to 'src/server') diff --git a/src/server/analysis.odin b/src/server/analysis.odin index 0c3178a..2219b98 100644 --- a/src/server/analysis.odin +++ b/src/server/analysis.odin @@ -670,7 +670,19 @@ get_proc_call_argument_type :: proc(value: SymbolProcedureValue, parameter_index index += 1 } } + return nil, false +} +get_proc_arg_type_from_name :: proc(v: SymbolProcedureValue, name: string) -> (^ast.Field, bool) { + for arg in v.arg_types { + for arg_name in arg.names { + if ident, ok := arg_name.derived.(^ast.Ident); ok { + if name == ident.name { + return arg, true + } + } + } + } return nil, false } diff --git a/src/server/hover.odin b/src/server/hover.odin index 9d8519c..4843391 100644 --- a/src/server/hover.odin +++ b/src/server/hover.odin @@ -201,10 +201,8 @@ get_hover_information :: proc(document: ^Document, position: common.Position) -> symbol.type_pkg = symbol.pkg symbol.pkg = bit_field_symbol.name symbol.name = identifier.name - if value, ok := bit_field_symbol.value.(SymbolBitFieldValue); ok { - symbol.comment = get_comment(value.comments[i]) - symbol.doc = get_doc(value.docs[i], context.temp_allocator) - } + symbol.comment = get_comment(value.comments[i]) + symbol.doc = get_doc(value.docs[i], context.temp_allocator) symbol.signature = get_bit_field_field_signature(value, i) hover.contents = write_hover_content(&ast_context, symbol) return hover, true, true @@ -215,6 +213,37 @@ get_hover_information :: proc(document: ^Document, position: common.Position) -> } } } + + if position_context.call != nil { + // Check if we're resolving the name of a parameter being passed to a proc call + if call, ok := position_context.call.derived.(^ast.Call_Expr); ok { + if proc_symbol, ok := resolve_type_expression(&ast_context, call); ok { + if value, ok := proc_symbol.value.(SymbolProcedureValue); ok { + for arg in call.args { + if field_value, ok := arg.derived.(^ast.Field_Value); ok { + if position_in_node(field_value.field, position_context.position) { + if identifier, ok := field_value.field.derived.(^ast.Ident); ok { + if arg_type, arg_type_ok := get_proc_arg_type_from_name(value, identifier.name); ok { + if symbol, ok := resolve_type_expression(&ast_context, arg_type.type); ok { + symbol.range = common.get_token_range(field_value.field, ast_context.file.src) + symbol.type_name = symbol.name + symbol.type_pkg = symbol.pkg + symbol.pkg = proc_symbol.name + symbol.name = identifier.name + symbol.signature = get_signature(&ast_context, symbol) + hover.contents = write_hover_content(&ast_context, symbol) + return hover, true, true + } + } + } + } + break + } + } + } + } + } + } } if position_context.field_value != nil && position_context.comp_lit != nil { -- cgit v1.2.3