diff options
| author | Brad Lewis <22850972+BradLewis@users.noreply.github.com> | 2025-07-05 19:44:41 -0400 |
|---|---|---|
| committer | Brad Lewis <22850972+BradLewis@users.noreply.github.com> | 2025-07-05 20:31:43 -0400 |
| commit | a1692bc64885ae46f50d00c6426eaf1a96f6e4fa (patch) | |
| tree | 749db06ff709e9809be31f1c2a6d14b2c6284de7 /src/server | |
| parent | 58748c93f2eea884034a128105a54c526edc3048 (diff) | |
Improve resolving enumerated arrays
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/analysis.odin | 12 | ||||
| -rw-r--r-- | src/server/completion.odin | 18 | ||||
| -rw-r--r-- | src/server/hover.odin | 1 |
3 files changed, 30 insertions, 1 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin index 7914d2f..4573f02 100644 --- a/src/server/analysis.odin +++ b/src/server/analysis.odin @@ -305,6 +305,10 @@ resolve_type_comp_literal :: proc( } } } + } else if s, ok := current_symbol.value.(SymbolFixedArrayValue); ok { + if symbol, ok := resolve_type_expression(ast_context, s.expr); ok { + return resolve_type_comp_literal(ast_context, position_context, symbol, comp_lit) + } } } } else if comp_value, ok := elem.derived.(^ast.Comp_Lit); ok { //indexed @@ -4016,6 +4020,14 @@ field_exists_in_comp_lit :: proc(comp_lit: ^ast.Comp_Lit, name: string) -> bool if ident.name == name { return true } + } else if selector, ok := field.field.derived.(^ast.Implicit_Selector_Expr); ok { + if selector.field != nil { + if ident, ok := selector.field.derived.(^ast.Ident); ok { + if ident.name == name { + return true + } + } + } } } } else if selector, ok := elem.derived.(^ast.Implicit_Selector_Expr); ok { diff --git a/src/server/completion.odin b/src/server/completion.odin index 53d4fb9..5c9b53c 100644 --- a/src/server/completion.odin +++ b/src/server/completion.odin @@ -311,6 +311,24 @@ get_comp_lit_completion :: proc( append(&items, item) } } + case SymbolFixedArrayValue: + if symbol, ok := resolve_type_expression(ast_context, v.len); ok { + if v, ok := symbol.value.(SymbolEnumValue); ok { + for name, i in v.names { + if field_exists_in_comp_lit(position_context.comp_lit, name) { + continue + } + + item := CompletionItem { + label = name, + detail = fmt.tprintf(".%s", name), + documentation = symbol.doc, + } + + append(&items, item) + } + } + } } } diff --git a/src/server/hover.odin b/src/server/hover.odin index 7dd1e51..adf8556 100644 --- a/src/server/hover.odin +++ b/src/server/hover.odin @@ -414,7 +414,6 @@ get_hover_information :: proc(document: ^Document, position: common.Position) -> } } } - } } return {}, false, true |