@@ -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+
481524func (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