From 38074195235bdd653de752af11c4a3ca1b77aec3 Mon Sep 17 00:00:00 2001 From: Robert Findley Date: Thu, 11 Aug 2022 09:33:31 -0400 Subject: [PATCH] internal/lsp/cache: validate the range for critical errors in go files This avoids the panic reported in golang/go#54395. Fixes golang/go#54395 Change-Id: Ief35985a503d3cc13971499dc6f4e9c1d1d63ea3 Reviewed-on: https://go-review.googlesource.com/c/tools/+/422894 TryBot-Result: Gopher Robot Reviewed-by: Suzy Mueller gopls-CI: kokoro Run-TryBot: Robert Findley --- gopls/internal/regtest/workspace/broken_test.go | 3 +++ internal/lsp/cache/load.go | 9 ++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/gopls/internal/regtest/workspace/broken_test.go b/gopls/internal/regtest/workspace/broken_test.go index fbc41de161..b06c15580c 100644 --- a/gopls/internal/regtest/workspace/broken_test.go +++ b/gopls/internal/regtest/workspace/broken_test.go @@ -186,6 +186,8 @@ module a.com go 1.12 -- a/a.go -- package a +-- a/empty.go -- +// an empty file -- b/go.mod -- module b.com @@ -202,6 +204,7 @@ package b ver := env.GoVersion() msg := msgForVersion(ver) env.OpenFile("a/a.go") + env.OpenFile("a/empty.go") env.OpenFile("b/go.mod") env.Await( env.DiagnosticAtRegexp("a/a.go", "package a"), diff --git a/internal/lsp/cache/load.go b/internal/lsp/cache/load.go index 7f30939e1c..b15c5374e9 100644 --- a/internal/lsp/cache/load.go +++ b/internal/lsp/cache/load.go @@ -380,9 +380,12 @@ func (s *snapshot) applyCriticalErrorToFiles(ctx context.Context, msg string, fi switch s.view.FileKind(fh) { case source.Go: if pgf, err := s.ParseGo(ctx, fh, source.ParseHeader); err == nil { - pkgDecl := span.NewRange(pgf.Tok, pgf.File.Package, pgf.File.Name.End()) - if spn, err := pkgDecl.Span(); err == nil { - rng, _ = pgf.Mapper.Range(spn) + // Check that we have a valid `package foo` range to use for positioning the error. + if pgf.File.Package.IsValid() && pgf.File.Name != nil && pgf.File.Name.End().IsValid() { + pkgDecl := span.NewRange(pgf.Tok, pgf.File.Package, pgf.File.Name.End()) + if spn, err := pkgDecl.Span(); err == nil { + rng, _ = pgf.Mapper.Range(spn) + } } } case source.Mod: