diff options
| author | Brad Lewis <22850972+BradLewis@users.noreply.github.com> | 2025-06-13 21:05:46 -0400 |
|---|---|---|
| committer | Brad Lewis <22850972+BradLewis@users.noreply.github.com> | 2025-06-13 21:05:46 -0400 |
| commit | e31dfce18bd64cbf7dcceb1f8718fc5b1e94450c (patch) | |
| tree | 30df4b989d17d294d56b0405f6dd228022aa2416 | |
| parent | 135e03599cc33831de46181aef69ffce24976f3d (diff) | |
Correctly handle type casts
| -rw-r--r-- | src/server/analysis.odin | 2 | ||||
| -rw-r--r-- | tests/type_definition_test.odin | 29 |
2 files changed, 31 insertions, 0 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin index 08965fb..886e647 100644 --- a/src/server/analysis.odin +++ b/src/server/analysis.odin @@ -2046,6 +2046,8 @@ resolve_location_type_identifier :: proc(ast_context: ^AstContext, node: ast.Ide return resolve_location_type_expression(ast_context, n.elem) case ^ast.Unary_Expr: return resolve_location_type_expression(ast_context, n.expr) + case ^ast.Type_Cast: + return resolve_location_type_expression(ast_context, n.type) } } else if global, ok := ast_context.globals[node.name]; ok { // Ideally we'd have a way to extract the full symbol of a global, but for now diff --git a/tests/type_definition_test.odin b/tests/type_definition_test.odin index e2003df..0e41b5e 100644 --- a/tests/type_definition_test.odin +++ b/tests/type_definition_test.odin @@ -839,3 +839,32 @@ ast_type_definition_array_of_pointers :: proc(t: ^testing.T) { test.expect_type_definition_locations(t, &source, {location}) } + +@(test) +ast_type_definition_type_cast :: proc(t: ^testing.T) { + source := test.Source { + main = `package test + + Foo :: struct { + bar: int, + } + + main :: proc() { + data: ^int + foo := cast(^Foo)data + + bar := fo{*}o.bar + } + `, + } + + location := common.Location { + range = { + start = {line = 2, character = 2}, + end = {line = 2, character = 5}, + }, + } + + test.expect_type_definition_locations(t, &source, {location}) +} + |