aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBradley Lewis <22850972+BradLewis@users.noreply.github.com>2025-08-28 20:33:30 -0400
committerGitHub <noreply@github.com>2025-08-28 20:33:30 -0400
commit9812f909aa58ed4a1c7f57ed35cd00cce4b06bc1 (patch)
treeefa6052a920ac301e14cd5d8a09fb109c89001ec /src
parent9f911012c3496fdc5e56733f0e7e52229ec37726 (diff)
parentd36eccd1ed440c14f6b0138daeaebd206cd1d208 (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.odin25
-rw-r--r--src/server/file_resolve.odin8
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)