internal/lsp: fix data race in Templates code

The snapshot should be locked before iterating through the files.

Fixes golang/go#49072

Change-Id: I1bc805cbb760a9ad113064603863f030ef0ddda7
Reviewed-on: https://go-review.googlesource.com/c/tools/+/356911
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/cache/snapshot.go b/internal/lsp/cache/snapshot.go
index 453db5a..90304cb 100644
--- a/internal/lsp/cache/snapshot.go
+++ b/internal/lsp/cache/snapshot.go
@@ -159,10 +159,15 @@
 }
 
 func (s *snapshot) Templates() map[span.URI]source.VersionedFileHandle {
-	if !s.view.options.ExperimentalTemplateSupport {
+	if !s.view.Options().ExperimentalTemplateSupport {
 		return nil
 	}
+
 	ans := map[span.URI]source.VersionedFileHandle{}
+
+	s.mu.Lock()
+	defer s.mu.Unlock()
+
 	for k, x := range s.files {
 		if strings.HasSuffix(filepath.Ext(k.Filename()), "tmpl") {
 			ans[k] = x