aboutsummaryrefslogtreecommitdiff
path: root/src/server/completion.odin
diff options
context:
space:
mode:
authorBrad Lewis <22850972+BradLewis@users.noreply.github.com>2025-12-17 07:05:34 +1100
committerBrad Lewis <22850972+BradLewis@users.noreply.github.com>2025-12-17 07:05:34 +1100
commit78f76c1090f91cf2a09e95b1885b23ecd17cad9a (patch)
tree27eb1456c036fbfca3068115ed3cf28f3fad1dde /src/server/completion.odin
parent8090d72884fda0aaee3e28beca6a898bd6955060 (diff)
Fix implicit selector completions for proc call args within assignments
Diffstat (limited to 'src/server/completion.odin')
-rw-r--r--src/server/completion.odin153
1 files changed, 77 insertions, 76 deletions
diff --git a/src/server/completion.odin b/src/server/completion.odin
index 7c30f78..282b7d7 100644
--- a/src/server/completion.odin
+++ b/src/server/completion.odin
@@ -1206,35 +1206,6 @@ get_implicit_completion :: proc(
}
}
- if position_context.assign != nil &&
- position_context.assign.lhs != nil &&
- len(position_context.assign.lhs) == 1 &&
- is_bitset_assignment_operator(position_context.assign.op.text) {
- //bitsets
- if symbol, ok := resolve_type_expression(ast_context, position_context.assign.lhs[0]); ok {
- set_ast_package_set_scoped(ast_context, symbol.pkg)
- if value, ok := unwrap_bitset(ast_context, symbol); ok {
- for name in value.names {
- if position_context.comp_lit != nil && field_exists_in_comp_lit(position_context.comp_lit, name) {
- continue
- }
-
- item := CompletionItem {
- label = name,
- kind = .EnumMember,
- detail = name,
- }
-
- append(results, CompletionResult{completion_item = item})
- }
-
- return is_incomplete
- }
- }
-
- reset_ast_context(ast_context)
- }
-
if position_context.comp_lit != nil &&
position_context.parent_binary != nil &&
is_bitset_binary_operator(position_context.binary.op.text) {
@@ -1332,53 +1303,6 @@ get_implicit_completion :: proc(
}
}
- if position_context.assign != nil && position_context.assign.rhs != nil && position_context.assign.lhs != nil {
- rhs_index: int
-
- for elem in position_context.assign.rhs {
- if position_in_node(elem, position_context.position) {
- break
- } else {
- //procedures are the only types that can return more than one value
- if symbol, ok := resolve_type_expression(ast_context, elem); ok {
- if procedure, ok := symbol.value.(SymbolProcedureValue); ok {
- if procedure.return_types == nil {
- return is_incomplete
- }
-
- rhs_index += len(procedure.return_types)
- } else {
- rhs_index += 1
- }
- }
- }
- }
-
- 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 {
- for name in enum_value.names {
- item := CompletionItem {
- label = name,
- kind = .EnumMember,
- detail = name,
- }
- if unwrapped_super_enum {
- add_implicit_selector_remove_edit(position_context, &item, name, enum_value.names)
- }
-
- append(results, CompletionResult{completion_item = item})
- }
-
- return is_incomplete
- }
- }
-
- reset_ast_context(ast_context)
- }
-
if position_context.returns != nil && position_context.function != nil {
return_index: int
@@ -1551,6 +1475,83 @@ get_implicit_completion :: proc(
reset_ast_context(ast_context)
}
+
+ if position_context.assign != nil &&
+ position_context.assign.lhs != nil &&
+ len(position_context.assign.lhs) == 1 &&
+ is_bitset_assignment_operator(position_context.assign.op.text) {
+ //bitsets
+ if symbol, ok := resolve_type_expression(ast_context, position_context.assign.lhs[0]); ok {
+ set_ast_package_set_scoped(ast_context, symbol.pkg)
+ if value, ok := unwrap_bitset(ast_context, symbol); ok {
+ for name in value.names {
+ if position_context.comp_lit != nil && field_exists_in_comp_lit(position_context.comp_lit, name) {
+ continue
+ }
+
+ item := CompletionItem {
+ label = name,
+ kind = .EnumMember,
+ detail = name,
+ }
+
+ append(results, CompletionResult{completion_item = item})
+ }
+
+ return is_incomplete
+ }
+ }
+
+ reset_ast_context(ast_context)
+ }
+
+ if position_context.assign != nil && position_context.assign.rhs != nil && position_context.assign.lhs != nil {
+ rhs_index: int
+
+ for elem in position_context.assign.rhs {
+ if position_in_node(elem, position_context.position) {
+ break
+ } else {
+ //procedures are the only types that can return more than one value
+ if symbol, ok := resolve_type_expression(ast_context, elem); ok {
+ if procedure, ok := symbol.value.(SymbolProcedureValue); ok {
+ if procedure.return_types == nil {
+ return is_incomplete
+ }
+
+ rhs_index += len(procedure.return_types)
+ } else {
+ rhs_index += 1
+ }
+ }
+ }
+ }
+
+ 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 {
+ for name in enum_value.names {
+ item := CompletionItem {
+ label = name,
+ kind = .EnumMember,
+ detail = name,
+ }
+ if unwrapped_super_enum {
+ add_implicit_selector_remove_edit(position_context, &item, name, enum_value.names)
+ }
+
+ append(results, CompletionResult{completion_item = item})
+ }
+
+ return is_incomplete
+ }
+ }
+
+ reset_ast_context(ast_context)
+ }
+
return is_incomplete
}