aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrad Lewis <22850972+BradLewis@users.noreply.github.com>2025-06-13 21:05:46 -0400
committerBrad Lewis <22850972+BradLewis@users.noreply.github.com>2025-06-13 21:05:46 -0400
commite31dfce18bd64cbf7dcceb1f8718fc5b1e94450c (patch)
tree30df4b989d17d294d56b0405f6dd228022aa2416
parent135e03599cc33831de46181aef69ffce24976f3d (diff)
Correctly handle type casts
-rw-r--r--src/server/analysis.odin2
-rw-r--r--tests/type_definition_test.odin29
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})
+}
+