diff options
| author | DanielGavin <danielgavin5@hotmail.com> | 2025-06-25 01:02:29 +0200 |
|---|---|---|
| committer | DanielGavin <danielgavin5@hotmail.com> | 2025-06-25 01:02:29 +0200 |
| commit | 2af06b9566c8db5292c33724a0098fc988135fd7 (patch) | |
| tree | 1f56d1b24a43c5e5f27384f57605f79388ca2d31 /src/server | |
| parent | 27d80646e4861b2cd6e7d8c392b1de8991f992b4 (diff) | |
Add hover and definition on comp literals with enumerated arrays.
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/analysis.odin | 36 |
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 } |