diff --git a/internal/lsp/cache/load.go b/internal/lsp/cache/load.go index 90e13741..cd5c2d36 100644 --- a/internal/lsp/cache/load.go +++ b/internal/lsp/cache/load.go @@ -83,13 +83,13 @@ func (v *view) checkMetadata(ctx context.Context, f *goFile) ([]packages.Error, pkgs, err := packages.Load(v.buildConfig(), fmt.Sprintf("file=%s", f.filename())) if len(pkgs) == 0 { if err == nil { - err = fmt.Errorf("no packages found for %s", f.filename()) + err = fmt.Errorf("go/packages.Load: no packages found for %s", f.filename()) } // Return this error as a diagnostic to the user. return []packages.Error{ { Msg: err.Error(), - Kind: packages.ListError, + Kind: packages.UnknownError, }, }, err } diff --git a/internal/lsp/diagnostics.go b/internal/lsp/diagnostics.go index ba926f41..98d33bf5 100644 --- a/internal/lsp/diagnostics.go +++ b/internal/lsp/diagnostics.go @@ -42,6 +42,7 @@ func (s *Server) Diagnostics(ctx context.Context, v source.View, uri span.URI) { if s.undelivered == nil { s.undelivered = make(map[span.URI][]source.Diagnostic) } + s.session.Logger().Errorf(ctx, "failed to deliver diagnostic for %s (will retry): %v", uri, err) s.undelivered[uri] = diagnostics continue } @@ -51,9 +52,8 @@ func (s *Server) Diagnostics(ctx context.Context, v source.View, uri span.URI) { // Anytime we compute diagnostics, make sure to also send along any // undelivered ones (only for remaining URIs). for uri, diagnostics := range s.undelivered { - err := s.publishDiagnostics(ctx, v, uri, diagnostics) - if err != nil { - s.session.Logger().Errorf(ctx, "failed to deliver diagnostic for %s: %v", uri, err) + if err := s.publishDiagnostics(ctx, v, uri, diagnostics); err != nil { + s.session.Logger().Errorf(ctx, "failed to deliver diagnostic for %s (will not retry): %v", uri, err) } // If we fail to deliver the same diagnostics twice, just give up. delete(s.undelivered, uri) diff --git a/internal/lsp/source/diagnostics.go b/internal/lsp/source/diagnostics.go index f15c6c9a..808cf5a8 100644 --- a/internal/lsp/source/diagnostics.go +++ b/internal/lsp/source/diagnostics.go @@ -63,8 +63,11 @@ func Diagnostics(ctx context.Context, v View, f GoFile, disabledAnalyses map[str } // Prepare any additional reports for the errors in this package. - for _, pkgErr := range pkg.GetErrors() { - addReport(v, reports, packageErrorSpan(pkgErr).URI(), nil) + for _, err := range pkg.GetErrors() { + if err.Kind != packages.ListError { + continue + } + addReport(v, reports, listErrorSpan(err).URI(), nil) } // Run diagnostics for the package that this URI belongs to. @@ -108,7 +111,7 @@ func diagnostics(ctx context.Context, v View, pkg Package, reports map[span.URI] diags = listErrors } for _, diag := range diags { - spn := packageErrorSpan(diag) + spn := listErrorSpan(diag) if spn.IsPoint() && diag.Kind == packages.TypeError { spn = pointToSpan(ctx, v, spn) } @@ -178,7 +181,7 @@ func parseDiagnosticMessage(input string) span.Span { return span.Parse(input[:msgIndex]) } -func packageErrorSpan(pkgErr packages.Error) span.Span { +func listErrorSpan(pkgErr packages.Error) span.Span { if pkgErr.Pos == "" { return parseDiagnosticMessage(pkgErr.Msg) }