diff options
| author | Brad Lewis <22850972+BradLewis@users.noreply.github.com> | 2025-07-01 10:16:01 -0400 |
|---|---|---|
| committer | Brad Lewis <22850972+BradLewis@users.noreply.github.com> | 2025-07-01 10:16:01 -0400 |
| commit | 0405de03a31b02ab9b7e5233b01c31da588857ee (patch) | |
| tree | 65dcc71b87d3995c9b8befd10497a5a74fbc32b4 /src/server | |
| parent | 75bc2135dbc17e2770c3ec8e3585d481a0b100bb (diff) | |
Improve resolution of poly struct fields
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/analysis.odin | 26 | ||||
| -rw-r--r-- | src/server/completion.odin | 2 |
2 files changed, 27 insertions, 1 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin index 9ac88fe..621f6dd 100644 --- a/src/server/analysis.odin +++ b/src/server/analysis.odin @@ -193,6 +193,31 @@ set_ast_package_from_symbol_scoped :: proc(ast_context: ^AstContext, symbol: Sym } } +set_ast_package_from_node_deferred :: proc(ast_context: ^AstContext, node: ast.Node) { + if ast_context.deferred_count <= 0 { + return + } + ast_context.deferred_count -= 1 + ast_context.current_package = ast_context.deferred_package[ast_context.deferred_count] +} + +@(deferred_in = set_ast_package_from_node_deferred) +set_ast_package_from_node_scoped :: proc(ast_context: ^AstContext, node: ast.Node) { + if ast_context.deferred_count >= DeferredDepth { + return + } + + ast_context.deferred_package[ast_context.deferred_count] = ast_context.current_package + ast_context.deferred_count += 1 + pkg := get_package_from_node(node) + + if pkg != "" { + ast_context.current_package = pkg + } else { + ast_context.current_package = ast_context.document_package + } +} + reset_ast_context :: proc(ast_context: ^AstContext) { ast_context.use_locals = true clear(&ast_context.recursion_map) @@ -1133,6 +1158,7 @@ resolve_selector_expression :: proc(ast_context: ^AstContext, node: ^ast.Selecto case SymbolStructValue: for name, i in s.names { if node.field != nil && name == node.field.name { + set_ast_package_from_node_scoped(ast_context, s.types[i]) ast_context.field_name = node.field^ symbol, ok := internal_resolve_type_expression(ast_context, s.types[i]) symbol.type = .Variable diff --git a/src/server/completion.odin b/src/server/completion.odin index 12c4205..ca47056 100644 --- a/src/server/completion.odin +++ b/src/server/completion.odin @@ -562,7 +562,7 @@ get_selector_completion :: proc( continue } - set_ast_package_from_symbol_scoped(ast_context, selector) + set_ast_package_from_node_scoped(ast_context, v.types[i]) if symbol, ok := resolve_type_expression(ast_context, v.types[i]); ok { if expr, ok := position_context.selector.derived.(^ast.Selector_Expr); ok { |