diff options
| author | Brad Lewis <22850972+BradLewis@users.noreply.github.com> | 2025-08-17 20:30:44 -0400 |
|---|---|---|
| committer | Brad Lewis <22850972+BradLewis@users.noreply.github.com> | 2025-08-17 20:41:54 -0400 |
| commit | 09f6cfa658b77504f1fd1f7c20eb3e15ef473030 (patch) | |
| tree | 84b4ff5a39fa5dd2ac096daddb87d43259bd7fa0 /src | |
| parent | 11be114305845bb0bc2674d8c1d8324e1011256a (diff) | |
Fix completions for soa fields
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/analysis.odin | 1 | ||||
| -rw-r--r-- | src/server/completion.odin | 110 |
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 |