aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDanielGavin <danielgavin5@hotmail.com>2025-07-31 21:57:53 +0200
committerGitHub <noreply@github.com>2025-07-31 21:57:53 +0200
commit9cfe56a78b45546dd569f3604d41ff9db60a3fa0 (patch)
tree595893dcfc947c5f2929b574cd78b95aea401771
parent56447447ddb370ea74d66cf27ea5395b432a7700 (diff)
parent6cf13706c9c8be50915c76f1c93b15ae8d120a9e (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.odin2
-rw-r--r--src/server/file_resolve.odin1
-rw-r--r--tests/references_test.odin30
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[:])
+}
+