aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorBrad Lewis <22850972+BradLewis@users.noreply.github.com>2025-07-01 10:16:01 -0400
committerBrad Lewis <22850972+BradLewis@users.noreply.github.com>2025-07-01 10:16:01 -0400
commit0405de03a31b02ab9b7e5233b01c31da588857ee (patch)
tree65dcc71b87d3995c9b8befd10497a5a74fbc32b4 /src/server
parent75bc2135dbc17e2770c3ec8e3585d481a0b100bb (diff)
Improve resolution of poly struct fields
Diffstat (limited to 'src/server')
-rw-r--r--src/server/analysis.odin26
-rw-r--r--src/server/completion.odin2
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 {