func TestLoad_ParseError_AllowErrors(t *testing.T) { var conf loader.Config conf.AllowErrors = true conf.CreateFromFilenames("badpkg", "testdata/badpkgdecl.go") prog, err := conf.Load() if err != nil { t.Errorf("Load failed unexpectedly: %v", err) } if prog == nil { t.Fatalf("Load returned a nil Program") } if got, want := created(prog), "badpkg"; got != want { t.Errorf("Created = %s, want %s", got, want) } badpkg := prog.Created[0] if len(badpkg.Files) != 1 { t.Errorf("badpkg has %d files, want 1", len(badpkg.Files)) } wantErr := filepath.Join("testdata", "badpkgdecl.go") + ":1:34: expected 'package', found 'EOF'" if !hasError(badpkg.Errors, wantErr) { t.Errorf("badpkg.Errors = %v, want %s", badpkg.Errors, wantErr) } }
// loadWithSoftErrors calls lconf.Load, suppressing "soft" errors. (See Go issue 16530.) // TODO(adonovan): Once the loader has an option to allow soft errors, // replace calls to loadWithSoftErrors with loader calls with that parameter. func loadWithSoftErrors(lconf *loader.Config) (*loader.Program, error) { lconf.AllowErrors = true // Ideally we would just return conf.Load() here, but go/types // reports certain "soft" errors that gc does not (Go issue 14596). // As a workaround, we set AllowErrors=true and then duplicate // the loader's error checking but allow soft errors. // It would be nice if the loader API permitted "AllowErrors: soft". prog, err := lconf.Load() if err != nil { return nil, err } var errpkgs []string // Report hard errors in indirectly imported packages. for _, info := range prog.AllPackages { if containsHardErrors(info.Errors) { errpkgs = append(errpkgs, info.Pkg.Path()) } else { // Enable SSA construction for packages containing only soft errors. info.TransitivelyErrorFree = true } } if errpkgs != nil { var more string if len(errpkgs) > 3 { more = fmt.Sprintf(" and %d more", len(errpkgs)-3) errpkgs = errpkgs[:3] } return nil, fmt.Errorf("couldn't load packages due to errors: %s%s", strings.Join(errpkgs, ", "), more) } return prog, err }
// allowErrors causes type errors to be silently ignored. // (Not suitable if SSA construction follows.) func allowErrors(lconf *loader.Config) { ctxt := *lconf.Build // copy ctxt.CgoEnabled = false lconf.Build = &ctxt lconf.AllowErrors = true // AllErrors makes the parser always return an AST instead of // bailing out after 10 errors and returning an empty ast.File. lconf.ParserMode = parser.AllErrors lconf.TypeChecker.Error = func(err error) {} }
func TestLoad_MissingInitialPackage_AllowErrors(t *testing.T) { var conf loader.Config conf.AllowErrors = true conf.Import("nosuchpkg") conf.ImportWithTests("errors") prog, err := conf.Load() if err != nil { t.Errorf("Load failed unexpectedly: %v", err) } if prog == nil { t.Fatalf("Load returned a nil Program") } if got, want := created(prog), "errors_test"; got != want { t.Errorf("Created = %s, want %s", got, want) } if got, want := imported(prog), "errors"; got != want { t.Errorf("Imported = %s, want %s", got, want) } }