diff options
| author | Brad Lewis <22850972+BradLewis@users.noreply.github.com> | 2025-08-17 20:54:10 -0400 |
|---|---|---|
| committer | Brad Lewis <22850972+BradLewis@users.noreply.github.com> | 2025-08-17 20:54:10 -0400 |
| commit | ad58adbd01d1f0481feceb5381f53adba541d021 (patch) | |
| tree | c55293c89b386dab5f7551840d0e9db0c657ff65 /src/server/analysis.odin | |
| parent | c96f264f8df3e83d82471f54b63e872ce5116f01 (diff) | |
Correctly handle fixed array #soa
Diffstat (limited to 'src/server/analysis.odin')
| -rw-r--r-- | src/server/analysis.odin | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin index 19c4e0a..d1282bb 100644 --- a/src/server/analysis.odin +++ b/src/server/analysis.odin @@ -1301,17 +1301,24 @@ resolve_type_assertion_expr :: proc(ast_context: ^AstContext, v: ^ast.Type_Asser return symbol, ok } -resolve_soa_selector_field :: proc(ast_context: ^AstContext, expr: ^ast.Expr, name: string) -> (Symbol, bool) { +resolve_soa_selector_field :: proc(ast_context: ^AstContext, expr: ^ast.Expr, size: ^ast.Expr, name: string) -> (Symbol, bool) { if symbol, ok := resolve_type_expression(ast_context, expr); ok { if v, ok := symbol.value.(SymbolStructValue); ok { for n, i in v.names { if n == name { - value := SymbolMultiPointerValue { - expr = v.types[i], + if size != nil { + symbol.value = SymbolFixedArrayValue{ + expr = v.types[i], + len = size, + } + } else { + symbol.value = SymbolMultiPointerValue { + expr = v.types[i], + } } + symbol.name = name symbol.type = .Field - symbol.value = value symbol.range = v.ranges[i] return symbol, true } @@ -1333,7 +1340,7 @@ resolve_selector_expression :: proc(ast_context: ^AstContext, node: ^ast.Selecto #partial switch s in selector.value { case SymbolFixedArrayValue: if .Soa in selector.flags { - return resolve_soa_selector_field(ast_context, s.expr, node.field.name) + return resolve_soa_selector_field(ast_context, s.expr, s.len, node.field.name) } components_count := 0 for c in node.field.name { @@ -1409,11 +1416,11 @@ resolve_selector_expression :: proc(ast_context: ^AstContext, node: ^ast.Selecto return selector, true case SymbolSliceValue: if .Soa in selector.flags { - return resolve_soa_selector_field(ast_context, s.expr, node.field.name) + return resolve_soa_selector_field(ast_context, s.expr, nil, node.field.name) } case SymbolDynamicArrayValue: if .Soa in selector.flags { - return resolve_soa_selector_field(ast_context, s.expr, node.field.name) + return resolve_soa_selector_field(ast_context, s.expr, nil, node.field.name) } } } @@ -2632,15 +2639,15 @@ resolve_symbol_selector :: proc( } case SymbolSliceValue: if .Soa in symbol.flags { - return resolve_soa_selector_field(ast_context, v.expr, field) + return resolve_soa_selector_field(ast_context, v.expr, nil, field) } case SymbolDynamicArrayValue: if .Soa in symbol.flags { - return resolve_soa_selector_field(ast_context, v.expr, field) + return resolve_soa_selector_field(ast_context, v.expr, nil, field) } case SymbolFixedArrayValue: if .Soa in symbol.flags { - return resolve_soa_selector_field(ast_context, v.expr, field) + return resolve_soa_selector_field(ast_context, v.expr, v.len, field) } } |