diff options
| author | DanielGavin <danielgavin5@hotmail.com> | 2024-06-08 21:18:13 +0200 |
|---|---|---|
| committer | DanielGavin <danielgavin5@hotmail.com> | 2024-06-08 21:18:13 +0200 |
| commit | 53f42476fc2fe3455f1e899189cb904462502e8c (patch) | |
| tree | 860ea540fdeb5a46c0f83fbc08423ee53a0363a8 /src/server/references.odin | |
| parent | 42fefebdd512958b41948abefb2d52c1b4682aff (diff) | |
First version of selector rename.
Diffstat (limited to 'src/server/references.odin')
| -rw-r--r-- | src/server/references.odin | 96 |
1 files changed, 42 insertions, 54 deletions
diff --git a/src/server/references.odin b/src/server/references.odin index f1939c1..2ab571e 100644 --- a/src/server/references.odin +++ b/src/server/references.odin @@ -45,22 +45,6 @@ walk_directories :: proc( return 0, false } -position_in_struct_names :: proc( - position_context: ^DocumentPositionContext, - type: ^ast.Struct_Type, -) -> bool { - for field in type.fields.list { - for name in field.names { - if position_in_node(name, position_context.position) { - return true - } - } - } - - return false -} - - resolve_references :: proc( document: ^Document, ast_context: ^AstContext, @@ -87,12 +71,26 @@ resolve_references :: proc( reset_ast_context(ast_context) - if position_context.struct_type != nil && - position_in_struct_names( - position_context, - position_context.struct_type, - ) { - return {}, true + if position_context.struct_type != nil { + found := false + done: for field in position_context.struct_type.fields.list { + for name in field.names { + if position_in_node(name, position_context.position) { + symbol = Symbol { + range = common.get_token_range( + name, + string(document.text), + ), + } + found = true + resolve_flag = .Field + break done + } + } + } + if !found { + return {}, false + } } else if position_context.enum_type != nil { return {}, true } else if position_context.bitset_type != nil { @@ -100,53 +98,43 @@ resolve_references :: proc( } else if position_context.union_type != nil { return {}, true } else if position_context.selector_expr != nil { - if resolved, ok := resolve_type_expression( - ast_context, - position_context.selector, - ); ok { - if _, is_package := resolved.value.(SymbolPackageValue); - !is_package { - return {}, true - } - resolve_flag = .Constant - } + resolve_flag = .Field - symbol, ok = resolve_location_selector( - ast_context, - position_context.selector_expr, - ) + base: ^ast.Ident + base, ok = position_context.selector.derived.(^ast.Ident) - if !ok { + if !ok || position_context.identifier == nil { return {}, true } - if ident, ok := position_context.identifier.derived.(^ast.Ident); ok { - reference = ident.name - } else { - return {}, true - } - } else if position_context.implicit { - return {}, true - } else if position_context.identifier != nil { ident := position_context.identifier.derived.(^ast.Ident) - if resolved, ok := resolve_type_identifier(ast_context, ident^); ok { - if resolved.type == .Variable { - resolve_flag = .Variable - } else { - resolve_flag = .Constant + if position_in_node(base, position_context.position) { + symbol, ok = resolve_location_identifier(ast_context, ident^) + + if !ok { + return {}, true } + + resolve_flag = .Base } else { - log.errorf( - "Failed to resolve identifier for indexing: %v", - ident.name, + symbol, ok = resolve_location_selector( + ast_context, + position_context.selector_expr, ) - return {}, true + + resolve_flag = .Field } + } else if position_context.implicit { + return {}, true + } else if position_context.identifier != nil { + ident := position_context.identifier.derived.(^ast.Ident) reference = ident.name symbol, ok = resolve_location_identifier(ast_context, ident^) + resolve_flag = .Identifier + if !ok { return {}, true } |