internal/lsp: handle nil pointer in semantic tokens

Fixes golang/go#41873

Change-Id: I877478632654cee4210ab46daae45e4aa315c892
Reviewed-on: https://go-review.googlesource.com/c/tools/+/260806
Trust: Rebecca Stambler <rstambler@golang.org>
Run-TryBot: Rebecca Stambler <rstambler@golang.org>
gopls-CI: kokoro <noreply+kokoro@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Peter Weinberger <pjw@google.com>
diff --git a/internal/lsp/semantic.go b/internal/lsp/semantic.go
index 71dd320..7d3b343 100644
--- a/internal/lsp/semantic.go
+++ b/internal/lsp/semantic.go
@@ -23,7 +23,7 @@
 func (s *Server) semanticTokensFull(ctx context.Context, p *protocol.SemanticTokensParams) (*protocol.SemanticTokens, error) {
 	now := time.Now()
 	ret, err := s.computeSemanticTokens(ctx, p.TextDocument, nil)
-	if err == nil {
+	if ret != nil && err == nil {
 		event.Log(ctx, fmt.Sprintf("Full(%v): %d items for %s in %s",
 			s.session.Options().SemanticTokens, len(ret.Data)/5, p.TextDocument.URI.SpanURI().Filename(), time.Since(now)))
 	} else {
@@ -39,7 +39,7 @@
 func (s *Server) semanticTokensRange(ctx context.Context, p *protocol.SemanticTokensRangeParams) (*protocol.SemanticTokens, error) {
 	now := time.Now()
 	ret, err := s.computeSemanticTokens(ctx, p.TextDocument, &p.Range)
-	if err == nil {
+	if ret != nil && err == nil {
 		event.Log(ctx, fmt.Sprintf("Range(%v): %d items for %s %s in %s",
 			s.session.Options().SemanticTokens, len(ret.Data)/5, p.TextDocument.URI.SpanURI().Filename(),
 			p.Range, time.Since(now)))