all: improve compiler error handling

Most of these errors are actually "todo" or "unimplemented" errors, so
the return type is known. This means that compilation can proceed (with
errors) even though the output will be incorrect. This is useful because
this way, all errors in a compilation unit can be shown together to the
user.
This commit is contained in:
Ayke van Laethem
2019-04-21 16:20:25 +02:00
committed by Ron Evans
parent 45cacda7b3
commit d155e31b64
5 changed files with 65 additions and 55 deletions
+17 -3
View File
@@ -33,6 +33,16 @@ func (e *commandError) Error() string {
return e.Msg + " " + e.File + ": " + e.Err.Error()
}
// multiError is a list of multiple errors (actually: diagnostics) returned
// during LLVM IR generation.
type multiError struct {
Errs []error
}
func (e *multiError) Error() string {
return e.Errs[0].Error()
}
type BuildConfig struct {
opt string
gc string
@@ -77,9 +87,9 @@ func Compile(pkgName, outpath string, spec *TargetSpec, config *BuildConfig, act
}
// Compile Go code to IR.
err = c.Compile(pkgName)
if err != nil {
return err
errs := c.Compile(pkgName)
if errs != nil {
return &multiError{errs}
}
if config.printIR {
fmt.Println("Generated LLVM IR:")
@@ -498,6 +508,10 @@ func handleCompilerError(err error) {
for _, err := range errLoader.Errs {
fmt.Fprintln(os.Stderr, err)
}
} else if errMulti, ok := err.(*multiError); ok {
for _, err := range errMulti.Errs {
fmt.Fprintln(os.Stderr, err)
}
} else {
fmt.Fprintln(os.Stderr, "error:", err)
}