From 15e89a9a8c4ade0da550b4b87936fd137337cc8e Mon Sep 17 00:00:00 2001 From: Alan Donovan Date: Tue, 16 Sep 2014 16:24:52 -0400 Subject: [PATCH] godoc/analysis: log one error per error package. Previously type errors were reported via the web interface but not logged, but this led to confusion as to why SSA construction and/or pointer analysis were not attempted. LGTM=gri R=gri, bradfitz CC=golang-codereviews https://golang.org/cl/136660043 --- godoc/analysis/analysis.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/godoc/analysis/analysis.go b/godoc/analysis/analysis.go index ae84bbcc..c4ba459f 100644 --- a/godoc/analysis/analysis.go +++ b/godoc/analysis/analysis.go @@ -340,7 +340,11 @@ func Run(pta bool, result *Result) { SourceImports: true, AllowErrors: true, } - conf.TypeChecker.Error = func(e error) {} // silence the default error handler + + // Silence the default error handler. + // Don't print all errors; we'll report just + // one per errant package later. + conf.TypeChecker.Error = func(e error) {} var roots, args []string // roots[i] ends with os.PathSeparator @@ -365,6 +369,7 @@ func Run(pta bool, result *Result) { if _, err := conf.FromArgs(args, true); err != nil { // TODO(adonovan): degrade gracefully, not fail totally. + // (The crippling case is a parse error in an external test file.) result.setStatusf("Analysis failed: %s.", err) // import error return } @@ -372,6 +377,13 @@ func Run(pta bool, result *Result) { result.setStatusf("Loading and type-checking packages...") iprog, err := conf.Load() if iprog != nil { + // Report only the first error of each package. + for _, info := range iprog.AllPackages { + for _, err := range info.Errors { + fmt.Fprintln(os.Stderr, err) + break + } + } log.Printf("Loaded %d packages.", len(iprog.AllPackages)) } if err != nil { @@ -394,7 +406,7 @@ func Run(pta bool, result *Result) { mainPkgs = append(mainPkgs, pkg) } } - log.Print("Main packages: ", mainPkgs) + log.Print("Transitively error-free main packages: ", mainPkgs) // Build SSA code for bodies of all functions in the whole program. result.setStatusf("Constructing SSA form...")