From 531b9a0bf8a8083a933bdb4f18c66d7f115495f7 Mon Sep 17 00:00:00 2001 From: Damian Tarnawski Date: Thu, 2 May 2024 22:10:41 +0200 Subject: 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. --- src/server/semantic_tokens.odin | 53 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 4 deletions(-) (limited to 'src/server') 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, -- cgit v1.2.3 From 1005e465f8c70551699abd9e00ab28f676f928e8 Mon Sep 17 00:00:00 2001 From: Damian Tarnawski Date: Thu, 2 May 2024 22:21:29 +0200 Subject: Simplify --- src/server/semantic_tokens.odin | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'src/server') diff --git a/src/server/semantic_tokens.odin b/src/server/semantic_tokens.odin index 732fd96..bddff1c 100644 --- a/src/server/semantic_tokens.odin +++ b/src/server/semantic_tokens.odin @@ -518,29 +518,28 @@ visit_import_decl :: proc(decl: ^ast.Import_Decl, builder: ^SemanticTokenBuilder } else if len(decl.relpath.text) > 2 { - start, end := 1, len(decl.relpath.text) - 1 - i := end + end := len(decl.relpath.text) - 1 + pos := end for { - if i > start { - ch, w := utf8.decode_last_rune_in_string(decl.relpath.text[:i]) + if pos > 1 { + ch, w := utf8.decode_last_rune_in_string(decl.relpath.text[:pos]) switch ch { case ':', '/': // break case: - i -= w + pos -= w continue } } - start = i break } write_semantic_at_pos( builder, - decl.relpath.pos.offset+start, - end-start, + decl.relpath.pos.offset+pos, + end-pos, .Namespace, ) } -- cgit v1.2.3