summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBradley Lewis <22850972+BradLewis@users.noreply.github.com>2025-12-30 09:11:44 +1100
committerGitHub <noreply@github.com>2025-12-30 09:11:44 +1100
commit16cd61e0f5ad5409f1747c24bdca545423892fdb (patch)
tree5c3cf75d2c3002b4a31a298733fd1a2f0956f11c
parente7b8ab905f842fd1996c6dec4f80ed0f615d5200 (diff)
parentddc4a61653f0dc620bfa565c598f92b840500a9a (diff)
Merge pull request #1238 from BradLewis/fix/completions-bit-set-proc-group
Improve bitset completions with proc groups
-rw-r--r--src/server/analysis.odin5
-rw-r--r--src/server/completion.odin5
-rw-r--r--tests/completions_test.odin25
-rw-r--r--tests/hover_test.odin26
4 files changed, 61 insertions, 0 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin
index 2c7f4f4..3ced0ad 100644
--- a/src/server/analysis.odin
+++ b/src/server/analysis.odin
@@ -2451,6 +2451,11 @@ resolve_implicit_selector :: proc(
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^)
+ old := ast_context.resolve_specific_overload
+ ast_context.resolve_specific_overload = true
+ defer {
+ ast_context.resolve_specific_overload = old
+ }
if symbol, ok := resolve_type_expression(ast_context, call.expr); ok && parameter_ok {
if proc_value, ok := symbol.value.(SymbolProcedureValue); ok {
if len(proc_value.arg_types) <= parameter_index {
diff --git a/src/server/completion.odin b/src/server/completion.odin
index 2fcd7be..31ecf0e 100644
--- a/src/server/completion.odin
+++ b/src/server/completion.odin
@@ -1423,6 +1423,11 @@ get_implicit_completion :: proc(
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^)
+ old := ast_context.resolve_specific_overload
+ ast_context.resolve_specific_overload = true
+ defer {
+ ast_context.resolve_specific_overload = old
+ }
if symbol, ok := resolve_type_expression(ast_context, call.expr); ok && parameter_ok {
set_ast_package_set_scoped(ast_context, symbol.pkg)
diff --git a/tests/completions_test.odin b/tests/completions_test.odin
index 6e1eba6..033813b 100644
--- a/tests/completions_test.odin
+++ b/tests/completions_test.odin
@@ -5233,7 +5233,32 @@ ast_completion_proc_arg_default_enum_alias :: proc(t: ^testing.T) {
main :: proc() {
foo(.{*})
}
+ `,
+ }
+ test.expect_completion_docs(t, &source, "", {"A", "B"})
+}
+
+@(test)
+ast_completion_proc_group_bitset :: proc(t: ^testing.T) {
+ source := test.Source {
+ main = `package test
+ Foo :: enum {
+ A,
+ B,
+ }
+
+ Foos :: bit_set[Foo]
+ foo_one :: proc(i: int, foos: Foos) {}
+ foo_two :: proc(s: string, foos: Foos) {}
+ foo :: proc {
+ foo_one,
+ foo_two,
+ }
+
+ main :: proc() {
+ foo(1, {.{*}})
+ }
`,
}
test.expect_completion_docs(t, &source, "", {"A", "B"})
diff --git a/tests/hover_test.odin b/tests/hover_test.odin
index 6f8cecf..8c39b0f 100644
--- a/tests/hover_test.odin
+++ b/tests/hover_test.odin
@@ -5960,6 +5960,32 @@ ast_hover_directives_config_info :: proc(t: ^testing.T) {
}
test.expect_hover(t, &source, "#config(<identifier>, default)\n\nChecks if an identifier is defined through the command line, or gives a default value instead.\n\nValues can be set with the `-define:NAME=VALUE` command line flag.")
}
+
+@(test)
+ast_hover_proc_group_bitset :: proc(t: ^testing.T) {
+ source := test.Source {
+ main = `package test
+ Foo :: enum {
+ A,
+ B,
+ }
+
+ Foos :: bit_set[Foo]
+
+ foo_one :: proc(i: int, foos: Foos) {}
+ foo_two :: proc(s: string, foos: Foos) {}
+ foo :: proc {
+ foo_one,
+ foo_two,
+ }
+
+ main :: proc() {
+ foo(1, {.A{*}})
+ }
+ `,
+ }
+ test.expect_hover(t, &source, "test.Foo: .A")
+}
/*
Waiting for odin fix