aboutsummaryrefslogtreecommitdiff
path: root/src/server/references.odin
diff options
context:
space:
mode:
authorDanielGavin <danielgavin5@hotmail.com>2024-06-08 21:18:13 +0200
committerDanielGavin <danielgavin5@hotmail.com>2024-06-08 21:18:13 +0200
commit53f42476fc2fe3455f1e899189cb904462502e8c (patch)
tree860ea540fdeb5a46c0f83fbc08423ee53a0363a8 /src/server/references.odin
parent42fefebdd512958b41948abefb2d52c1b4682aff (diff)
First version of selector rename.
Diffstat (limited to 'src/server/references.odin')
-rw-r--r--src/server/references.odin96
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
}