diff options
| author | Damian Tarnawski <gthetarnav@gmail.com> | 2024-05-02 22:10:41 +0200 |
|---|---|---|
| committer | Damian Tarnawski <gthetarnav@gmail.com> | 2024-05-02 22:10:41 +0200 |
| commit | 531b9a0bf8a8083a933bdb4f18c66d7f115495f7 (patch) | |
| tree | 3caea18400914123dcef5411a77abb55b3042790 /src/server | |
| parent | db1941ff2fe38dea52ad522566c75fc861ddabc1 (diff) | |
Highlight import namespace using semantic tokens
Removes highlighting the namespace in import path from
tm grammars, and added it instead to the semantic tokens.
So it works the same way between editors.
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/semantic_tokens.odin | 53 |
1 files changed, 49 insertions, 4 deletions
diff --git a/src/server/semantic_tokens.odin b/src/server/semantic_tokens.odin index d2240f8..732fd96 100644 --- a/src/server/semantic_tokens.odin +++ b/src/server/semantic_tokens.odin @@ -9,6 +9,7 @@ package server import "core:fmt" import "core:log" +import "core:unicode/utf8" import "core:odin/ast" import "core:odin/tokenizer" @@ -353,10 +354,7 @@ visit_node :: proc(node: ^ast.Node, builder: ^SemanticTokenBuilder) { case ^Defer_Stmt: visit_node(n.stmt, builder) case ^Import_Decl: - if n.name.text != "" { - write_semantic_token(builder, n.name, .Namespace) - } - + visit_import_decl(n, builder) case ^Or_Return_Expr: visit_node(n.expr, builder) case ^Or_Else_Expr: @@ -501,6 +499,53 @@ visit_selector :: proc(selector: ^ast.Selector_Expr, builder: ^SemanticTokenBuil visit_ident(selector.field, selector, {}, builder) } +visit_import_decl :: proc(decl: ^ast.Import_Decl, builder: ^SemanticTokenBuilder) { + /* + hightlight the namespace in the import declaration + + import "pkg" + ^^^ + import "core:fmt" + ^^^ + import "core:odin/ast" + ^^^ + import foo "core:fmt" + ^^^ + */ + + if decl.name.text != "" { + write_semantic_token(builder, decl.name, .Namespace) + } + else if len(decl.relpath.text) > 2 { + + start, end := 1, len(decl.relpath.text) - 1 + i := end + + for { + if i > start { + ch, w := utf8.decode_last_rune_in_string(decl.relpath.text[:i]) + + switch ch { + case ':', '/': // break + case: + i -= w + continue + } + } + + start = i + break + } + + write_semantic_at_pos( + builder, + decl.relpath.pos.offset+start, + end-start, + .Namespace, + ) + } +} + visit_ident :: proc( ident: ^ast.Ident, symbol_ptr: rawptr, |