aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorDanielGavin <danielgavin5@hotmail.com>2025-06-25 17:16:48 +0200
committerDanielGavin <danielgavin5@hotmail.com>2025-06-25 17:16:48 +0200
commit312a15dd5752e8c90b57ea4911e5fb29525deee1 (patch)
treecc2ac8bc4534a5e635c88afee69dd725fb254acd /src/server
parent077dba63ee6cd73ccd71af71dfca6e691b5feb89 (diff)
Improve references/renaming for enums.
Diffstat (limited to 'src/server')
-rw-r--r--src/server/analysis.odin3
-rw-r--r--src/server/file_resolve.odin9
-rw-r--r--src/server/references.odin21
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) &&