diff options
| author | DanielGavin <danielgavin5@hotmail.com> | 2025-07-31 21:57:53 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-31 21:57:53 +0200 |
| commit | 9cfe56a78b45546dd569f3604d41ff9db60a3fa0 (patch) | |
| tree | 595893dcfc947c5f2929b574cd78b95aea401771 | |
| parent | 56447447ddb370ea74d66cf27ea5395b432a7700 (diff) | |
| parent | 6cf13706c9c8be50915c76f1c93b15ae8d120a9e (diff) | |
Merge pull request #811 from BradLewis/fix/reference-type-switch-tag
Correctly find references for type switch tags
| -rw-r--r-- | src/server/analysis.odin | 2 | ||||
| -rw-r--r-- | src/server/file_resolve.odin | 1 | ||||
| -rw-r--r-- | tests/references_test.odin | 30 |
3 files changed, 33 insertions, 0 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin index f02448a..86289f5 100644 --- a/src/server/analysis.odin +++ b/src/server/analysis.odin @@ -4080,6 +4080,8 @@ get_locals_type_switch_stmt :: proc( return } + get_locals_stmt(file, stmt.tag, ast_context, document_position, true) + if block, ok := stmt.body.derived.(^Block_Stmt); ok { for block_stmt in block.stmts { if cause, ok := block_stmt.derived.(^Case_Clause); diff --git a/src/server/file_resolve.odin b/src/server/file_resolve.odin index 27ad013..cb77753 100644 --- a/src/server/file_resolve.odin +++ b/src/server/file_resolve.odin @@ -409,6 +409,7 @@ resolve_node :: proc(node: ^ast.Node, data: ^FileResolveData) { case ^Type_Switch_Stmt: data.position_context.switch_type_stmt = n resolve_node(n.label, data) + local_scope(data, n) resolve_node(n.tag, data) resolve_node(n.expr, data) resolve_node(n.body, data) diff --git a/tests/references_test.odin b/tests/references_test.odin index e63c610..a1e8c18 100644 --- a/tests/references_test.odin +++ b/tests/references_test.odin @@ -1074,3 +1074,33 @@ ast_references_inside_where_clause :: proc(t: ^testing.T) { test.expect_reference_locations(t, &source, locations[:]) } +@(test) +ast_references_union_switch_type :: proc(t: ^testing.T) { + source := test.Source { + main = `package test + Foo :: union { + int, + string + } + + main :: proc() { + foo: Foo + #partial switch v{*} in foo { + case int: + bar := v + 1 + case string: + bar := "test" + v + } + } + `, + } + + locations := []common.Location { + {range = {start = {line = 8, character = 19}, end = {line = 8, character = 20}}}, + {range = {start = {line = 10, character = 11}, end = {line = 10, character = 12}}}, + {range = {start = {line = 12, character = 20}, end = {line = 12, character = 21}}}, + } + + test.expect_reference_locations(t, &source, locations[:]) +} + |