diff --git a/go/packages/golist_fallback.go b/go/packages/golist_fallback.go index 55fe8058..79b12071 100644 --- a/go/packages/golist_fallback.go +++ b/go/packages/golist_fallback.go @@ -194,15 +194,21 @@ func golistDriverFallback(cfg *Config, words ...string) (*driverResponse, error) response.Packages = append(response.Packages, testmainPkg) outdir, err := getOutdir() if err != nil { - testmainPkg.Errors = append(testmainPkg.Errors, - Error{"-", fmt.Sprintf("failed to generate testmain: %v", err)}) + testmainPkg.Errors = append(testmainPkg.Errors, Error{ + Pos: "-", + Msg: fmt.Sprintf("failed to generate testmain: %v", err), + Kind: ListError, + }) return } testmain := filepath.Join(outdir, "testmain.go") extraimports, extradeps, err := generateTestmain(testmain, testPkg, xtestPkg) if err != nil { - testmainPkg.Errors = append(testmainPkg.Errors, - Error{"-", fmt.Sprintf("failed to generate testmain: %v", err)}) + testmainPkg.Errors = append(testmainPkg.Errors, Error{ + Pos: "-", + Msg: fmt.Sprintf("failed to generate testmain: %v", err), + Kind: ListError, + }) } deps = append(deps, extradeps...) for _, imp := range extraimports { // testing, testing/internal/testdeps, and maybe os diff --git a/go/packages/packages.go b/go/packages/packages.go index 7e799801..023d2196 100644 --- a/go/packages/packages.go +++ b/go/packages/packages.go @@ -238,10 +238,23 @@ type Package struct { // An Error describes a problem with a package's metadata, syntax, or types. type Error struct { - Pos string // "file:line:col" or "file:line" or "" or "-" - Msg string + Pos string // "file:line:col" or "file:line" or "" or "-" + Msg string + Kind ErrorKind } +// ErrorKind describes the source of the error, allowing the user to +// differentiate between errors generated by the driver, the parser, or the +// type-checker. +type ErrorKind int + +const ( + UnknownError ErrorKind = iota + ListError + ParserError + TypeError +) + func (err Error) Error() string { pos := err.Pos if pos == "" { @@ -572,31 +585,35 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) { case *os.PathError: // from parser errs = append(errs, Error{ - Pos: err.Path + ":1", - Msg: err.Err.Error(), + Pos: err.Path + ":1", + Msg: err.Err.Error(), + Kind: ParserError, }) case scanner.ErrorList: // from parser for _, err := range err { errs = append(errs, Error{ - Pos: err.Pos.String(), - Msg: err.Msg, + Pos: err.Pos.String(), + Msg: err.Msg, + Kind: ParserError, }) } case types.Error: // from type checker errs = append(errs, Error{ - Pos: err.Fset.Position(err.Pos).String(), - Msg: err.Msg, + Pos: err.Fset.Position(err.Pos).String(), + Msg: err.Msg, + Kind: TypeError, }) default: // unexpected impoverished error from parser? errs = append(errs, Error{ - Pos: "-", - Msg: err.Error(), + Pos: "-", + Msg: err.Error(), + Kind: UnknownError, }) // If you see this error message, please file a bug.