aboutsummaryrefslogtreecommitdiff
path: root/src/server/file_resolve.odin
diff options
context:
space:
mode:
authorDanielGavin <danielgavin5@hotmail.com>2024-06-11 21:59:11 +0200
committerDanielGavin <danielgavin5@hotmail.com>2024-06-11 21:59:11 +0200
commita7bb78679028f2ade9c0975c4ec895db3fd62d9e (patch)
treebf57262f2fbfb696d353fc21bdac7282935706c4 /src/server/file_resolve.odin
parentb88ec3cd61dddb43f2434e270835ba341ba31b3f (diff)
Add more stability to prevent crashes + more tests with renaming
Diffstat (limited to 'src/server/file_resolve.odin')
-rw-r--r--src/server/file_resolve.odin79
1 files changed, 61 insertions, 18 deletions
diff --git a/src/server/file_resolve.odin b/src/server/file_resolve.odin
index 3c1ed17..ebf984d 100644
--- a/src/server/file_resolve.odin
+++ b/src/server/file_resolve.odin
@@ -30,6 +30,8 @@ reset_position_context :: proc(position_context: ^DocumentPositionContext) {
position_context.parent_comp_lit = nil
position_context.identifier = nil
position_context.call = nil
+ position_context.binary = nil
+ position_context.parent_binary = nil
}
resolve_entire_file :: proc(
@@ -170,6 +172,23 @@ resolve_node :: proc(node: ^ast.Node, data: ^FileResolveData) {
resolve_node(n.expr, data)
resolve_node(n.call, data)
+ case ^Implicit_Selector_Expr:
+ data.position_context.implicit = true
+ data.position_context.implicit_selector_expr = n
+ if data.flag != .None {
+ data.position_context.position = n.pos.offset
+ if symbol, ok := resolve_location_implicit_selector(
+ data.ast_context,
+ data.position_context,
+ n,
+ ); ok {
+ data.symbols[cast(uintptr)node] = SymbolAndNode {
+ node = n,
+ symbol = symbol,
+ }
+ }
+ }
+ resolve_node(n.field, data)
case ^Selector_Expr:
data.position_context.selector = n.expr
data.position_context.field = n.field
@@ -408,20 +427,6 @@ resolve_node :: proc(node: ^ast.Node, data: ^FileResolveData) {
case ^Attribute:
resolve_nodes(n.elems, data)
case ^Field:
- if data.flag != .None {
- for name in n.names {
- data.symbols[cast(uintptr)node] = SymbolAndNode {
- node = name,
- symbol = Symbol {
- range = common.get_token_range(
- name,
- string(data.document.text),
- ),
- },
- }
- }
- }
-
resolve_nodes(n.names, data)
resolve_node(n.type, data)
resolve_node(n.default_value, data)
@@ -453,15 +458,57 @@ resolve_node :: proc(node: ^ast.Node, data: ^FileResolveData) {
resolve_node(n.poly_params, data)
resolve_node(n.align, data)
resolve_node(n.fields, data)
+
+ if data.flag != .None {
+ for field in n.fields.list {
+ for name in field.names {
+ data.symbols[cast(uintptr)name] = SymbolAndNode {
+ node = name,
+ symbol = Symbol {
+ range = common.get_token_range(
+ name,
+ string(data.document.text),
+ ),
+ },
+ }
+ }
+ }
+ }
case ^Union_Type:
data.position_context.union_type = n
resolve_node(n.poly_params, data)
resolve_node(n.align, data)
resolve_nodes(n.variants, data)
+
+ if data.flag != .None {
+ for variant in n.variants {
+ data.symbols[cast(uintptr)variant] = SymbolAndNode {
+ node = variant,
+ symbol = Symbol {
+ range = common.get_token_range(
+ variant,
+ string(data.document.text),
+ ),
+ },
+ }
+ }
+ }
case ^Enum_Type:
data.position_context.enum_type = n
resolve_node(n.base_type, data)
resolve_nodes(n.fields, data)
+
+ for field in n.fields {
+ data.symbols[cast(uintptr)field] = SymbolAndNode {
+ node = field,
+ symbol = Symbol {
+ range = common.get_token_range(
+ field,
+ string(data.document.text),
+ ),
+ },
+ }
+ }
case ^Bit_Set_Type:
data.position_context.bitset_type = n
resolve_node(n.elem, data)
@@ -469,10 +516,6 @@ resolve_node :: proc(node: ^ast.Node, data: ^FileResolveData) {
case ^Map_Type:
resolve_node(n.key, data)
resolve_node(n.value, data)
- case ^Implicit_Selector_Expr:
- data.position_context.implicit = true
- data.position_context.implicit_selector_expr = n
- resolve_node(n.field, data)
case ^ast.Or_Else_Expr:
resolve_node(n.x, data)
resolve_node(n.y, data)