From 46aec5fee0fc76c8ac84c95b2d52cb0608c8a396 Mon Sep 17 00:00:00 2001 From: Brad Lewis <22850972+BradLewis@users.noreply.github.com> Date: Tue, 7 Oct 2025 17:12:35 -0400 Subject: Correctly resolve implicit selectors within a binary expr within a call expr --- src/server/analysis.odin | 20 ++++++++++---------- tests/hover_test.odin | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/server/analysis.odin b/src/server/analysis.odin index 41c78d8..3c896fe 100644 --- a/src/server/analysis.odin +++ b/src/server/analysis.odin @@ -2301,6 +2301,16 @@ resolve_implicit_selector :: proc( Symbol, bool, ) { + if position_context.binary != nil { + if position_in_node(position_context.binary, position_context.position) { + // We resolve whichever is not the implicit_selector + if implicit, ok := position_context.binary.left.derived.(^ast.Implicit_Selector_Expr); ok { + return resolve_type_expression(ast_context, position_context.binary.right) + } + return resolve_type_expression(ast_context, position_context.binary.left) + } + } + if position_context.call != nil { if call, ok := position_context.call.derived.(^ast.Call_Expr); ok { parameter_index, parameter_ok := find_position_in_call_param(position_context, call^) @@ -2334,16 +2344,6 @@ resolve_implicit_selector :: proc( } } - if position_context.binary != nil { - if position_in_node(position_context.binary, position_context.position) { - // We resolve whichever is not the implicit_selector - if implicit, ok := position_context.binary.left.derived.(^ast.Implicit_Selector_Expr); ok { - return resolve_type_expression(ast_context, position_context.binary.right) - } - return resolve_type_expression(ast_context, position_context.binary.left) - } - } - if position_context.index != nil { symbol: Symbol ok := false diff --git a/tests/hover_test.odin b/tests/hover_test.odin index 341b641..08c6870 100644 --- a/tests/hover_test.odin +++ b/tests/hover_test.odin @@ -5179,6 +5179,24 @@ ast_hover_using_import_statement_name_conflict :: proc(t: ^testing.T) { } test.expect_hover(t, &source, "my_package.Bar :: struct {\n\tb: string,\n}") } + +@(test) +ast_hover_enum_in_bitset_within_call_expr :: proc(t: ^testing.T) { + source := test.Source { + main = `package test + Foo :: enum {A, B} + Foos :: bit_set[Foo] + + bar :: proc(a: bool) {} + + main :: proc() { + foos: Foos + bar(.A{*} in foos) + } + `, + } + test.expect_hover(t, &source, "test.Foo: .A") +} /* Waiting for odin fix -- cgit v1.2.3