diff options
| author | Damian Tarnawski <gthetarnav@gmail.com> | 2024-05-03 22:32:42 +0200 |
|---|---|---|
| committer | Damian Tarnawski <gthetarnav@gmail.com> | 2024-05-05 23:28:56 +0200 |
| commit | 895fa6e43078ed41e07ff0485d56982a440dee20 (patch) | |
| tree | 5bc1290040fb30cd04169ce2fa6dd4ca4d1fdb22 /src/server | |
| parent | 33a6d8c802f8e1147838f97bd52839b6414a2d5c (diff) | |
Add a symbol for explicit `enum.member` selectors
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/analysis.odin | 10 | ||||
| -rw-r--r-- | src/server/semantic_tokens.odin | 21 |
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 { |