go/packages: add ErrorKind field to differentiate error sources

Some applications (for example, diagnostics shown to a user in an
editor) may want to distinguish between errors generated by
the driver, parser, and type-checker. The Error struct did not have any
mechanism for doing this, so add an ErrorKind field and set it in
appendError.

Change-Id: If347163225d1e3a567e98610e9ba8a0930e4659c
Reviewed-on: https://go-review.googlesource.com/139317
Run-TryBot: Rebecca Stambler <rstambler@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Alan Donovan <adonovan@google.com>
This commit is contained in:
Rebecca Stambler 2018-10-03 12:52:17 -04:00
parent c930a8531d
commit 9599141856
2 changed files with 37 additions and 14 deletions

View File

@ -194,15 +194,21 @@ func golistDriverFallback(cfg *Config, words ...string) (*driverResponse, error)
response.Packages = append(response.Packages, testmainPkg) response.Packages = append(response.Packages, testmainPkg)
outdir, err := getOutdir() outdir, err := getOutdir()
if err != nil { if err != nil {
testmainPkg.Errors = append(testmainPkg.Errors, testmainPkg.Errors = append(testmainPkg.Errors, Error{
Error{"-", fmt.Sprintf("failed to generate testmain: %v", err)}) Pos: "-",
Msg: fmt.Sprintf("failed to generate testmain: %v", err),
Kind: ListError,
})
return return
} }
testmain := filepath.Join(outdir, "testmain.go") testmain := filepath.Join(outdir, "testmain.go")
extraimports, extradeps, err := generateTestmain(testmain, testPkg, xtestPkg) extraimports, extradeps, err := generateTestmain(testmain, testPkg, xtestPkg)
if err != nil { if err != nil {
testmainPkg.Errors = append(testmainPkg.Errors, testmainPkg.Errors = append(testmainPkg.Errors, Error{
Error{"-", fmt.Sprintf("failed to generate testmain: %v", err)}) Pos: "-",
Msg: fmt.Sprintf("failed to generate testmain: %v", err),
Kind: ListError,
})
} }
deps = append(deps, extradeps...) deps = append(deps, extradeps...)
for _, imp := range extraimports { // testing, testing/internal/testdeps, and maybe os for _, imp := range extraimports { // testing, testing/internal/testdeps, and maybe os

View File

@ -238,10 +238,23 @@ type Package struct {
// An Error describes a problem with a package's metadata, syntax, or types. // An Error describes a problem with a package's metadata, syntax, or types.
type Error struct { type Error struct {
Pos string // "file:line:col" or "file:line" or "" or "-" Pos string // "file:line:col" or "file:line" or "" or "-"
Msg string 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 { func (err Error) Error() string {
pos := err.Pos pos := err.Pos
if pos == "" { if pos == "" {
@ -572,31 +585,35 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) {
case *os.PathError: case *os.PathError:
// from parser // from parser
errs = append(errs, Error{ errs = append(errs, Error{
Pos: err.Path + ":1", Pos: err.Path + ":1",
Msg: err.Err.Error(), Msg: err.Err.Error(),
Kind: ParserError,
}) })
case scanner.ErrorList: case scanner.ErrorList:
// from parser // from parser
for _, err := range err { for _, err := range err {
errs = append(errs, Error{ errs = append(errs, Error{
Pos: err.Pos.String(), Pos: err.Pos.String(),
Msg: err.Msg, Msg: err.Msg,
Kind: ParserError,
}) })
} }
case types.Error: case types.Error:
// from type checker // from type checker
errs = append(errs, Error{ errs = append(errs, Error{
Pos: err.Fset.Position(err.Pos).String(), Pos: err.Fset.Position(err.Pos).String(),
Msg: err.Msg, Msg: err.Msg,
Kind: TypeError,
}) })
default: default:
// unexpected impoverished error from parser? // unexpected impoverished error from parser?
errs = append(errs, Error{ errs = append(errs, Error{
Pos: "-", Pos: "-",
Msg: err.Error(), Msg: err.Error(),
Kind: UnknownError,
}) })
// If you see this error message, please file a bug. // If you see this error message, please file a bug.