From 81dbc8fb4b198314bc774ea9acd7d699ee81e167 Mon Sep 17 00:00:00 2001 From: Joseph Shapiro Date: Tue, 18 Nov 2025 21:13:04 -0600 Subject: [PATCH] semantically tokenize export comments --- gopls/internal/golang/semtok.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/gopls/internal/golang/semtok.go b/gopls/internal/golang/semtok.go index d41996cc352..5a9b5c62d6a 100644 --- a/gopls/internal/golang/semtok.go +++ b/gopls/internal/golang/semtok.go @@ -164,6 +164,9 @@ func (tv *tokenVisitor) comment(c *ast.Comment, importByName map[string]*types.P if strings.HasPrefix(c.Text, "//go:") { tv.godirective(c) return + } else if strings.HasPrefix(c.Text, "//export") { + tv.goexport(c) + return } pkgScope := tv.pkg.Types().Scope() @@ -923,6 +926,21 @@ func (tv *tokenVisitor) godirective(c *ast.Comment) { } } +func (tv *tokenVisitor) goexport(c *ast.Comment) { + funcName := strings.TrimPrefix(c.Text, "//export ") + + // Make the 'export func' part stand out, the rest is comments. + tv.token(c.Pos(), len("//"), semtok.TokComment) + + exportStart := c.Pos() + token.Pos(len("//")) + tv.token(exportStart, len("export "), semtok.TokNamespace) + + if len(funcName) > 0 { + funcStart := c.Pos() + token.Pos(len("//export ")) + tv.token(funcStart, len(funcName), semtok.TokFunction) + } +} + // Go 1.20 strings.CutPrefix. func stringsCutPrefix(s, prefix string) (after string, found bool) { if !strings.HasPrefix(s, prefix) {