Skip to content

Commit b851f17

Browse files
authored
Merge pull request #992 from golangci/detailed-failed-prereq-err
goanalysis: make `failed prerequisites` error detailed
2 parents a2bc9b7 + e464343 commit b851f17

File tree

1 file changed

+50
-7
lines changed

1 file changed

+50
-7
lines changed

pkg/golinters/goanalysis/runner.go

Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,49 @@ func (e *IllTypedError) Error() string {
478478
return fmt.Sprintf("errors in package: %v", e.Pkg.Errors)
479479
}
480480

481+
type FailedPrerequisitesError struct {
482+
errors map[string][]string
483+
}
484+
485+
func (f FailedPrerequisitesError) NotEmpty() bool {
486+
return len(f.errors) > 0
487+
}
488+
489+
func (f *FailedPrerequisitesError) Consume(name string, err error) {
490+
if f.errors == nil {
491+
f.errors = map[string][]string{}
492+
}
493+
k := fmt.Sprintf("%v", err)
494+
f.errors[k] = append(f.errors[k], name)
495+
}
496+
497+
type groupedPrerequisiteErr struct {
498+
names []string
499+
err string
500+
}
501+
502+
func (g groupedPrerequisiteErr) String() string {
503+
if len(g.names) == 1 {
504+
return fmt.Sprintf("%s: %s", g.names[0], g.err)
505+
}
506+
return fmt.Sprintf("(%s): %s", strings.Join(g.names, ", "), g.err)
507+
}
508+
509+
func (f FailedPrerequisitesError) Error() string {
510+
var errs []string
511+
for err := range f.errors {
512+
errs = append(errs, err)
513+
}
514+
var groups []groupedPrerequisiteErr
515+
for _, err := range errs {
516+
groups = append(groups, groupedPrerequisiteErr{
517+
err: err,
518+
names: f.errors[err],
519+
})
520+
}
521+
return fmt.Sprintf("failed prerequisites: %s", groups)
522+
}
523+
481524
func (act *action) analyzeSafe() {
482525
defer func() {
483526
if p := recover(); p != nil {
@@ -501,16 +544,16 @@ func (act *action) analyze() {
501544
analyzeDebugf("go/analysis: %s: %s: analyzed package %q in %s", act.r.prefix, act.a.Name, act.pkg.Name, time.Since(now))
502545
}(time.Now())
503546

504-
// Report an error if any dependency failed.
505-
var failed []string
547+
// Report an error if any dependency failures.
548+
var depErr FailedPrerequisitesError
506549
for _, dep := range act.deps {
507-
if dep.err != nil {
508-
failed = append(failed, dep.String())
550+
if dep.err == nil {
551+
continue
509552
}
553+
depErr.Consume(dep.String(), dep.err)
510554
}
511-
if failed != nil {
512-
sort.Strings(failed)
513-
act.err = fmt.Errorf("failed prerequisites: %s", strings.Join(failed, ", "))
555+
if depErr.NotEmpty() {
556+
act.err = depErr
514557
return
515558
}
516559

0 commit comments

Comments
 (0)