From 0c71283641cab3a9940deb2b6f223c1d75227e2f Mon Sep 17 00:00:00 2001 From: Brad Lewis <22850972+BradLewis@users.noreply.github.com> Date: Sat, 13 Sep 2025 22:12:52 -0400 Subject: Correct selector completions within selector call exprs --- src/server/completion.odin | 9 +++++++-- src/server/position_context.odin | 2 +- tests/completions_test.odin | 30 +++++++++++++++++++++++++++++- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/server/completion.odin b/src/server/completion.odin index 7e789f0..5eb8e64 100644 --- a/src/server/completion.odin +++ b/src/server/completion.odin @@ -96,7 +96,9 @@ get_completion_list :: proc( } if position_context.selector != nil { - if position_context.selector_expr != nil { + if _, ok := position_context.selector.derived.(^ast.Ident); ok { + completion_type = .Selector + } else if position_context.selector_expr != nil { if selector_call, ok := position_context.selector_expr.derived.(^ast.Selector_Call_Expr); ok { if !position_in_node(selector_call.call, position_context.position) { completion_type = .Selector @@ -1401,7 +1403,10 @@ get_implicit_completion :: proc( } if len(position_context.assign.lhs) > rhs_index { - if enum_value, unwrapped_super_enum, ok := unwrap_enum(ast_context, position_context.assign.lhs[rhs_index]); ok { + if enum_value, unwrapped_super_enum, ok := unwrap_enum( + ast_context, + position_context.assign.lhs[rhs_index], + ); ok { for name in enum_value.names { item := CompletionItem { label = name, diff --git a/src/server/position_context.odin b/src/server/position_context.odin index 0417df8..46efce2 100644 --- a/src/server/position_context.odin +++ b/src/server/position_context.odin @@ -138,7 +138,7 @@ get_document_position_context :: proc( position_context.parent_binary = nil } - if hint == .Completion && position_context.selector == nil && position_context.field == nil { + if hint == .Completion { fallback_position_context_completion(document, position, &position_context) } diff --git a/tests/completions_test.odin b/tests/completions_test.odin index 303fd64..a9b24ce 100644 --- a/tests/completions_test.odin +++ b/tests/completions_test.odin @@ -4720,9 +4720,37 @@ ast_completion_selector_within_selector_call_expr :: proc(t: ^testing.T) { bar = print, } - foo->bar(data.x{*}) + foo->bar(data.{*}) } `, } test.expect_completion_docs(t, &source, "", {"Data.x: int", "Data.y: int"}) } + +@(test) +ast_completion_ident_within_selector_call_expr :: proc(t: ^testing.T) { + source := test.Source { + main = `package test + + Data :: struct { + x, y: int, + } + + IFoo :: struct { + bar: proc(self: IFoo, x: int), + } + + print :: proc(self: IFoo, x: int) {} + + main :: proc() { + data := Data{} + foo := IFoo { + bar = print, + } + + foo->bar(d{*}) + } + `, + } + test.expect_completion_docs(t, &source, "", {"test.data: test.Data"}) +} -- cgit v1.2.3