From 70a04f6880a2082a76f6282361b607f859db950f Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Tue, 13 Feb 2018 16:37:51 -0800 Subject: [PATCH] go/types: make gotype continue after syntax errors This avoids odd behavior where sometimes a lot of useful errors are not reported simply because of a small syntax error. Tested manually with non-existing files. (We cannot easily add an automatic test because this is a stand-alone binary in this directory that must be built manually.) Fixes #23593. Change-Id: Iff90f95413bed7d1023fa0a5c9eb0414144428a9 Reviewed-on: https://go-review.googlesource.com/93815 Reviewed-by: Alan Donovan --- src/go/types/gotype.go | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/go/types/gotype.go b/src/go/types/gotype.go index 196fc9bbd6..2efb4c0ac9 100644 --- a/src/go/types/gotype.go +++ b/src/go/types/gotype.go @@ -209,14 +209,30 @@ func parseFiles(dir string, filenames []string) ([]*ast.File, error) { } wg.Wait() - // if there are errors, return the first one for deterministic results + // If there are errors, return the first one for deterministic results. + var first error for _, err := range errors { if err != nil { - return nil, err + first = err + // If we have an error, some files may be nil. + // Remove them. (The go/parser always returns + // a possibly partial AST even in the presence + // of errors, except if the file doesn't exist + // in the first place, in which case it cannot + // matter.) + i := 0 + for _, f := range files { + if f != nil { + files[i] = f + i++ + } + } + files = files[:i] + break } } - return files, nil + return files, first } func parseDir(dir string) ([]*ast.File, error) { @@ -318,7 +334,7 @@ func main() { files, err := getPkgFiles(flag.Args()) if err != nil { report(err) - os.Exit(2) + // ok to continue (files may be empty, but not nil) } checkPkgFiles(files) -- 2.50.0