@@ -478,6 +478,49 @@ func (e *IllTypedError) Error() string {
478
478
return fmt .Sprintf ("errors in package: %v" , e .Pkg .Errors )
479
479
}
480
480
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
+
481
524
func (act * action ) analyzeSafe () {
482
525
defer func () {
483
526
if p := recover (); p != nil {
@@ -501,16 +544,16 @@ func (act *action) analyze() {
501
544
analyzeDebugf ("go/analysis: %s: %s: analyzed package %q in %s" , act .r .prefix , act .a .Name , act .pkg .Name , time .Since (now ))
502
545
}(time .Now ())
503
546
504
- // Report an error if any dependency failed .
505
- var failed [] string
547
+ // Report an error if any dependency failures .
548
+ var depErr FailedPrerequisitesError
506
549
for _ , dep := range act .deps {
507
- if dep .err ! = nil {
508
- failed = append ( failed , dep . String ())
550
+ if dep .err = = nil {
551
+ continue
509
552
}
553
+ depErr .Consume (dep .String (), dep .err )
510
554
}
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
514
557
return
515
558
}
516
559
0 commit comments