diff options
| author | Bradley Lewis <22850972+BradLewis@users.noreply.github.com> | 2025-08-28 20:33:30 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-28 20:33:30 -0400 |
| commit | 9812f909aa58ed4a1c7f57ed35cd00cce4b06bc1 (patch) | |
| tree | efa6052a920ac301e14cd5d8a09fb109c89001ec /src | |
| parent | 9f911012c3496fdc5e56733f0e7e52229ec37726 (diff) | |
| parent | d36eccd1ed440c14f6b0138daeaebd206cd1d208 (diff) | |
Merge pull request #943 from BradLewis/fix/resolve-implicit-context-in-switch
Correctly resolve implicit selector within a switch case
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/analysis.odin | 25 | ||||
| -rw-r--r-- | src/server/file_resolve.odin | 8 |
2 files changed, 28 insertions, 5 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin index cde9c5d..9afdbc2 100644 --- a/src/server/analysis.odin +++ b/src/server/analysis.odin @@ -1454,7 +1454,6 @@ internal_resolve_type_identifier :: proc(ast_context: ^AstContext, node: ast.Ide set_ast_package_scoped(ast_context) - if v, ok := keyword_map[node.name]; ok { //keywords ident := new_type(Ident, node.pos, node.end, ast_context.allocator) @@ -2133,9 +2132,9 @@ resolve_implicit_selector :: proc( if position_context.binary != nil { if position_in_node(position_context.binary.left, position_context.position) { - return resolve_type_expression(ast_context, position_context.binary.right) - } else { return resolve_type_expression(ast_context, position_context.binary.left) + } else if position_in_node(position_context.binary.left, position_context.position) { + return resolve_type_expression(ast_context, position_context.binary.right) } } @@ -2180,8 +2179,24 @@ resolve_implicit_selector :: proc( } if position_context.switch_stmt != nil { - if symbol, ok := resolve_type_expression(ast_context, position_context.switch_stmt.cond); ok { - return symbol, ok + ast_context.use_locals = true + if position_in_node(position_context.switch_stmt.cond, position_context.position) { + if symbol, ok := resolve_type_expression(ast_context, position_context.switch_stmt.cond); ok { + return symbol, ok + } + } + if body, ok := position_context.switch_stmt.body.derived.(^ast.Block_Stmt); ok { + for stmt in body.stmts { + if cc, ok := stmt.derived.(^ast.Case_Clause); ok { + for item in cc.list { + if position_in_node(item, position_context.position) { + if symbol, ok := resolve_type_expression(ast_context, position_context.switch_stmt.cond); ok { + return symbol, ok + } + } + } + } + } } } diff --git a/src/server/file_resolve.odin b/src/server/file_resolve.odin index cb77753..d4db280 100644 --- a/src/server/file_resolve.odin +++ b/src/server/file_resolve.odin @@ -277,6 +277,10 @@ resolve_node :: proc(node: ^ast.Node, data: ^FileResolveData) { resolve_node(n.expr, data) resolve_node(n.body, data) case ^Switch_Stmt: + old_switch := data.position_context.switch_stmt + defer { + data.position_context.switch_stmt = old_switch + } local_scope(data, n) data.position_context.switch_stmt = n resolve_node(n.label, data) @@ -407,6 +411,10 @@ resolve_node :: proc(node: ^ast.Node, data: ^FileResolveData) { resolve_nodes(n.list, data) resolve_nodes(n.body, data) case ^Type_Switch_Stmt: + old_switch := data.position_context.switch_type_stmt + defer { + data.position_context.switch_type_stmt = old_switch + } data.position_context.switch_type_stmt = n resolve_node(n.label, data) local_scope(data, n) |