aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDamian Tarnawski <gthetarnav@gmail.com>2024-05-03 22:32:42 +0200
committerDamian Tarnawski <gthetarnav@gmail.com>2024-05-05 23:28:56 +0200
commit895fa6e43078ed41e07ff0485d56982a440dee20 (patch)
tree5bc1290040fb30cd04169ce2fa6dd4ca4d1fdb22 /src
parent33a6d8c802f8e1147838f97bd52839b6414a2d5c (diff)
Add a symbol for explicit `enum.member` selectors
Diffstat (limited to 'src')
-rw-r--r--src/server/analysis.odin10
-rw-r--r--src/server/semantic_tokens.odin21
2 files changed, 11 insertions, 20 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin
index 09a0d3e..2f1035d 100644
--- a/src/server/analysis.odin
+++ b/src/server/analysis.odin
@@ -1156,6 +1156,10 @@ internal_resolve_type_expression :: proc(
} else {
return Symbol{}, false
}
+ case SymbolEnumValue:
+ // enum members probably require own symbol value
+ selector.type = .EnumMember
+ return selector, true
}
}
case:
@@ -1856,9 +1860,9 @@ resolve_implicit_selector :: proc(
proc_value.arg_types[parameter_index].type,
)
} else if enum_value, ok := symbol.value.(SymbolEnumValue);
- ok {
- return symbol, true
- }
+ ok {
+ return symbol, true
+ }
}
}
}
diff --git a/src/server/semantic_tokens.odin b/src/server/semantic_tokens.odin
index f0fa465..ce7476f 100644
--- a/src/server/semantic_tokens.odin
+++ b/src/server/semantic_tokens.odin
@@ -109,7 +109,6 @@ SemanticTokenBuilder :: struct {
current_start: int,
tokens: [dynamic]u32,
symbols: map[uintptr]SymbolAndNode,
- selector: bool,
src: string,
}
@@ -216,8 +215,8 @@ visit_node :: proc(node: ^ast.Node, builder: ^SemanticTokenBuilder) {
case ^Ident:
visit_ident(n, n, {}, builder)
case ^Selector_Expr:
- visit_selector(cast(^Selector_Expr)node, builder)
- builder.selector = false
+ visit_node(n.expr, builder)
+ visit_ident(n.field, n, {}, builder)
case ^When_Stmt:
visit_node(n.cond, builder)
visit_node(n.body, builder)
@@ -494,20 +493,6 @@ visit_bit_field_fields :: proc(
}
}
-visit_selector :: proc(
- selector: ^ast.Selector_Expr,
- builder: ^SemanticTokenBuilder,
-) {
- if v, ok := selector.expr.derived.(^ast.Selector_Expr); ok {
- visit_selector(v, builder)
- } else {
- visit_node(selector.expr, builder)
- builder.selector = true
- }
-
- visit_ident(selector.field, selector, {}, builder)
-}
-
visit_import_decl :: proc(
decl: ^ast.Import_Decl,
builder: ^SemanticTokenBuilder,
@@ -592,6 +577,8 @@ visit_ident :: proc(
}
case .Type_Function:
write_semantic_node(builder, ident, .Type, modifiers)
+ case .EnumMember:
+ write_semantic_node(builder, ident, .EnumMember, modifiers)
}
switch v in symbol.value {