@@ -239,34 +239,11 @@ func (lp *loadingPackage) loadFromExportData() error {
239239 return fmt .Errorf ("dependency %q hasn't been loaded yet" , path )
240240 }
241241 }
242- if pkg .ExportFile == "" {
243- seen := make (map [string ]struct {})
244242
245- count := 0
246- var sb strings.Builder
247- packages .Visit ([]* packages.Package {pkg }, func (p * packages.Package ) bool {
248- if _ , ok := seen [p .ID ]; ok {
249- return false
250- }
251- if count >= 3 {
252- return false
253- }
254- seen [p .ID ] = struct {}{}
255- // Optionally skip test variants:
256- if p .ForTest == "" && ! strings .HasSuffix (p .PkgPath , ".test" ) {
257- for _ , e := range p .Errors {
258- fmt .Fprintf (& sb , "error in package %q: %v\n " , p .ID , e .Msg )
259- count ++
260- }
261- }
262- return true // keep walking into p.Imports
263- }, nil )
264- err := fmt .Sprintf ("no export data for %q" , pkg .ID )
265- if sb .Len () > 0 {
266- err += fmt .Sprintf (" because of error in imported package(s): %v" , sb .String ())
267- }
268- return errors .New (err )
243+ if pkg .ExportFile == "" {
244+ return noExportDataError (pkg )
269245 }
246+
270247 f , err := os .Open (pkg .ExportFile )
271248 if err != nil {
272249 return err
@@ -357,6 +334,7 @@ func (lp *loadingPackage) loadImportedPackageWithFacts(loadMode LoadMode) error
357334 if srcErr := lp .loadFromSource (loadMode ); srcErr != nil {
358335 return srcErr
359336 }
337+
360338 // Make sure this package can't be imported successfully
361339 pkg .Errors = append (pkg .Errors , packages.Error {
362340 Pos : "-" ,
@@ -578,3 +556,39 @@ func sizeOfReflectValueTreeBytes(rv reflect.Value, visitedPtrs map[uintptr]struc
578556 panic ("unknown rv of type " + rv .String ())
579557 }
580558}
559+
560+ func noExportDataError (pkg * packages.Package ) error {
561+ seen := make (map [string ]struct {})
562+
563+ const limit = 3
564+
565+ var count int
566+
567+ var sb strings.Builder
568+
569+ packages .Visit ([]* packages.Package {pkg }, func (p * packages.Package ) bool {
570+ if count >= limit {
571+ return false
572+ }
573+
574+ if _ , ok := seen [p .ID ]; ok {
575+ return false
576+ }
577+
578+ seen [p .ID ] = struct {}{}
579+
580+ for _ , e := range p .Errors {
581+ fmt .Fprintf (& sb , "\t error in package %q: %s\n " , p .ID , e .Msg )
582+ count ++
583+ }
584+
585+ return true
586+ }, nil )
587+
588+ msg := fmt .Sprintf ("no export data for %q" , pkg .ID )
589+ if sb .Len () > 0 {
590+ msg += fmt .Sprintf (", maybe because of error(s) in imported package(s):\n %s" , sb .String ())
591+ }
592+
593+ return errors .New (msg )
594+ }
0 commit comments