aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorDanielGavin <danielgavin5@hotmail.com>2025-06-25 01:02:29 +0200
committerDanielGavin <danielgavin5@hotmail.com>2025-06-25 01:02:29 +0200
commit2af06b9566c8db5292c33724a0098fc988135fd7 (patch)
tree1f56d1b24a43c5e5f27384f57605f79388ca2d31 /src/server
parent27d80646e4861b2cd6e7d8c392b1de8991f992b4 (diff)
Add hover and definition on comp literals with enumerated arrays.
Diffstat (limited to 'src/server')
-rw-r--r--src/server/analysis.odin36
1 files changed, 25 insertions, 11 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin
index 53546cc..3d5cbc1 100644
--- a/src/server/analysis.odin
+++ b/src/server/analysis.odin
@@ -1874,6 +1874,8 @@ resolve_implicit_selector :: proc(
if position_context.field_value != nil {
if field, ok := position_context.field_value.field.derived.(^ast.Ident); ok {
field_name = field.name
+ } else if field, ok := position_context.field_value.field.derived.(^ast.Implicit_Selector_Expr); ok {
+ field_name = field.field.name
} else {
return {}, false
}
@@ -1943,6 +1945,15 @@ resolve_implicit_selector :: proc(
}
return resolve_type_expression(ast_context, type)
+ } else if s, ok := comp_symbol.value.(SymbolFixedArrayValue); ok {
+ /*
+ This will be a comp_lit for an enumerated array
+ EnumIndexedArray :: [TestEnum]u32 {
+ .valueOne = 1,
+ .valueTwo = 2,
+ }
+ */
+ return resolve_type_expression(ast_context, s.len)
}
}
}
@@ -2141,22 +2152,25 @@ resolve_location_comp_lit_field :: proc(
symbol = resolve_comp_literal(ast_context, position_context) or_return
- field := position_context.field_value.field.derived.(^ast.Ident) or_return
-
- if struct_value, ok := symbol.value.(SymbolStructValue); ok {
- for name, i in struct_value.names {
- if name == field.name {
- symbol.range = struct_value.ranges[i]
+ if field, ok := position_context.field_value.field.derived.(^ast.Ident); ok {
+ if struct_value, ok := symbol.value.(SymbolStructValue); ok {
+ for name, i in struct_value.names {
+ if name == field.name {
+ symbol.range = struct_value.ranges[i]
+ }
}
- }
- } else if bit_field_value, ok := symbol.value.(SymbolBitFieldValue); ok {
- for name, i in bit_field_value.names {
- if name == field.name {
- symbol.range = bit_field_value.ranges[i]
+ } else if bit_field_value, ok := symbol.value.(SymbolBitFieldValue); ok {
+ for name, i in bit_field_value.names {
+ if name == field.name {
+ symbol.range = bit_field_value.ranges[i]
+ }
}
}
+ } else if field, ok := position_context.field_value.field.derived.(^ast.Implicit_Selector_Expr); ok {
+ return resolve_location_implicit_selector(ast_context, position_context, field)
}
+
return symbol, true
}