aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorBrad Lewis <22850972+BradLewis@users.noreply.github.com>2025-08-17 20:30:44 -0400
committerBrad Lewis <22850972+BradLewis@users.noreply.github.com>2025-08-17 20:41:54 -0400
commit09f6cfa658b77504f1fd1f7c20eb3e15ef473030 (patch)
tree84b4ff5a39fa5dd2ac096daddb87d43259bd7fa0 /src/server
parent11be114305845bb0bc2674d8c1d8324e1011256a (diff)
Fix completions for soa fields
Diffstat (limited to 'src/server')
-rw-r--r--src/server/analysis.odin1
-rw-r--r--src/server/completion.odin110
2 files changed, 56 insertions, 55 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin
index 47a8c0a..57ad029 100644
--- a/src/server/analysis.odin
+++ b/src/server/analysis.odin
@@ -1312,6 +1312,7 @@ resolve_soa_selector_field :: proc(ast_context: ^AstContext, expr: ^ast.Expr, na
symbol.name = name
symbol.type = .Field
symbol.value = value
+ symbol.range = v.ranges[i]
return symbol, true
}
}
diff --git a/src/server/completion.odin b/src/server/completion.odin
index d126301..ea55091 100644
--- a/src/server/completion.odin
+++ b/src/server/completion.odin
@@ -504,50 +504,24 @@ get_comp_lit_completion :: proc(
return false
}
-add_struct_field_completion :: proc(
- ast_context: ^AstContext,
- position_context: ^DocumentPositionContext,
- results: ^[dynamic]CompletionResult,
- selector: Symbol,
- v: SymbolStructValue,
-) {
- for name, i in v.names {
- if name == "_" {
- continue
- }
-
- if symbol, ok := resolve_type_expression(ast_context, v.types[i]); ok {
- if expr, ok := position_context.selector.derived.(^ast.Selector_Expr); ok {
- if expr.op.text == "->" && symbol.type != .Function {
+add_soa_field_completion :: proc(ast_context: ^AstContext, expr: ^ast.Expr, results: ^[dynamic]CompletionResult, parent_name: string) {
+ if symbol, ok := resolve_type_expression(ast_context, expr); ok {
+ if v, ok := symbol.value.(SymbolStructValue); ok {
+ for name, i in v.names {
+ if name == "_" {
continue
}
- }
- if position_context.arrow {
- if symbol.type != .Function && symbol.type != .Type_Function {
- continue
+ resolved := Symbol {
+ name = name,
+ type = .Field,
+ range = v.ranges[i],
+ pkg = parent_name,
+ value = SymbolMultiPointerValue{expr = v.types[i]},
}
- if .ObjCIsClassMethod in symbol.flags {
- assert(.ObjC in symbol.flags)
- continue
- }
- }
- if !position_context.arrow && .ObjC in selector.flags {
- continue
+ build_documentation(ast_context, &resolved)
+ append(results, CompletionResult{symbol = resolved})
}
-
- construct_struct_field_symbol(&symbol, selector.name, v, i)
- append(results, CompletionResult{symbol = symbol})
- } else {
- //just give some generic symbol with name.
- item := CompletionItem {
- label = symbol.name,
- kind = .Field,
- detail = fmt.tprintf("%v: %v", name, node_to_string(v.types[i])),
- documentation = symbol.doc,
- }
-
- append(results, CompletionResult{completion_item = item})
}
}
}
@@ -703,11 +677,7 @@ get_selector_completion :: proc(
}
}
if .Soa in selector.flags {
- if symbol, ok := resolve_type_expression(ast_context, v.expr); ok {
- if v, ok := symbol.value.(SymbolStructValue); ok {
- add_struct_field_completion(ast_context, position_context, results, symbol, v)
- }
- }
+ add_soa_field_completion(ast_context, v.expr, results, selector.name)
}
case SymbolUnionValue:
is_incomplete = false
@@ -798,7 +768,45 @@ get_selector_completion :: proc(
case SymbolStructValue:
is_incomplete = false
- add_struct_field_completion(ast_context, position_context, results, selector, v)
+ for name, i in v.names {
+ if name == "_" {
+ continue
+ }
+
+ if symbol, ok := resolve_type_expression(ast_context, v.types[i]); ok {
+ if expr, ok := position_context.selector.derived.(^ast.Selector_Expr); ok {
+ if expr.op.text == "->" && symbol.type != .Function {
+ continue
+ }
+ }
+
+ if position_context.arrow {
+ if symbol.type != .Function && symbol.type != .Type_Function {
+ continue
+ }
+ if .ObjCIsClassMethod in symbol.flags {
+ assert(.ObjC in symbol.flags)
+ continue
+ }
+ }
+ if !position_context.arrow && .ObjC in selector.flags {
+ continue
+ }
+
+ construct_struct_field_symbol(&symbol, selector.name, v, i)
+ append(results, CompletionResult{symbol = symbol})
+ } else {
+ //just give some generic symbol with name.
+ item := CompletionItem {
+ label = symbol.name,
+ kind = .Field,
+ detail = fmt.tprintf("%v: %v", name, node_to_string(v.types[i])),
+ documentation = symbol.doc,
+ }
+
+ append(results, CompletionResult{completion_item = item})
+ }
+ }
case SymbolBitFieldValue:
is_incomplete = false
@@ -859,21 +867,13 @@ get_selector_completion :: proc(
is_incomplete = false
append_magic_array_like_completion(position_context, selector, results)
if .Soa in selector.flags {
- if symbol, ok := resolve_type_expression(ast_context, v.expr); ok {
- if v, ok := symbol.value.(SymbolStructValue); ok {
- add_struct_field_completion(ast_context, position_context, results, symbol, v)
- }
- }
+ add_soa_field_completion(ast_context, v.expr, results, selector.name)
}
case SymbolSliceValue:
is_incomplete = false
append_magic_array_like_completion(position_context, selector, results)
if .Soa in selector.flags {
- if symbol, ok := resolve_type_expression(ast_context, v.expr); ok {
- if v, ok := symbol.value.(SymbolStructValue); ok {
- add_struct_field_completion(ast_context, position_context, results, symbol, v)
- }
- }
+ add_soa_field_completion(ast_context, v.expr, results, selector.name)
}
case SymbolMapValue:
is_incomplete = false