aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/completion.odin9
-rw-r--r--src/server/position_context.odin2
-rw-r--r--tests/completions_test.odin30
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"})
+}