diff options
| author | DanielGavin <danielgavin5@hotmail.com> | 2025-06-25 17:16:48 +0200 |
|---|---|---|
| committer | DanielGavin <danielgavin5@hotmail.com> | 2025-06-25 17:16:48 +0200 |
| commit | 312a15dd5752e8c90b57ea4911e5fb29525deee1 (patch) | |
| tree | cc2ac8bc4534a5e635c88afee69dd725fb254acd /src/server | |
| parent | 077dba63ee6cd73ccd71af71dfca6e691b5feb89 (diff) | |
Improve references/renaming for enums.
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/analysis.odin | 3 | ||||
| -rw-r--r-- | src/server/file_resolve.odin | 9 | ||||
| -rw-r--r-- | src/server/references.odin | 21 |
3 files changed, 18 insertions, 15 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin index 899ba27..2990fe3 100644 --- a/src/server/analysis.odin +++ b/src/server/analysis.odin @@ -1797,6 +1797,9 @@ resolve_implicit_selector :: proc( } } else { symbol, ok = resolve_type_expression(ast_context, position_context.index.expr) + if !ok { + return {}, false + } } if array, ok := symbol.value.(SymbolFixedArrayValue); ok { diff --git a/src/server/file_resolve.odin b/src/server/file_resolve.odin index d3e93fe..3a921d4 100644 --- a/src/server/file_resolve.odin +++ b/src/server/file_resolve.odin @@ -119,6 +119,13 @@ local_scope :: proc(data: ^FileResolveData, stmt: ^ast.Stmt) { add_local_group(data.ast_context, data.ast_context.local_id) data.position_context.position = stmt.end.offset + data.position_context.nested_position = data.position_context.position + + data.ast_context.non_mutable_only = true + + get_locals_stmt(data.ast_context.file, stmt, data.ast_context, data.position_context) + + data.ast_context.non_mutable_only = false get_locals_stmt(data.ast_context.file, stmt, data.ast_context, data.position_context) } @@ -345,6 +352,8 @@ resolve_node :: proc(node: ^ast.Node, data: ^FileResolveData) { resolve_node(arg, data) } case ^Index_Expr: + data.position_context.previous_index = data.position_context.index + data.position_context.index = n resolve_node(n.expr, data) resolve_node(n.index, data) case ^Deref_Expr: diff --git a/src/server/references.odin b/src/server/references.odin index 2b44fc7..f6ab171 100644 --- a/src/server/references.odin +++ b/src/server/references.odin @@ -71,27 +71,23 @@ prepare_references :: proc( return } } else if position_context.enum_type != nil { - /* found := false - done_enum: for field in position_context.struct_type.fields.list { - for name in field.names { - if position_in_node(name, position_context.position) { + done_enum: for field in position_context.enum_type.fields { + if ident, ok := field.derived.(^ast.Ident); ok { + if position_in_node(ident, position_context.position) { symbol = Symbol { - range = common.get_token_range( - name, - string(document.text), - ), + range = common.get_token_range(ident, string(document.text)), } found = true resolve_flag = .Field break done_enum } } + } if !found { - return {}, false + return } - */ } else if position_context.bitset_type != nil { return } else if position_context.union_type != nil { @@ -129,11 +125,6 @@ prepare_references :: proc( return } - //Only support structs for now - if _, ok := symbol.value.(SymbolStructValue); !ok { - return - } - resolve_flag = .Field } else if position_context.selector_expr != nil { if position_in_node(position_context.selector, position_context.position) && |