func (g *generator) Generate(pkg *model.Package, pkgName string) error { g.p("// Automatically generated by MockGen. DO NOT EDIT!") if g.filename != "" { g.p("// Source: %v", g.filename) } else { g.p("// Source: %v (interfaces: %v)", g.srcPackage, g.srcInterfaces) } g.p("") // Get all required imports, and generate unique names for them all. im := pkg.Imports() gomockPath := path.Join(*importPrefix, gomockImportPath) im[gomockPath] = true g.packageMap = make(map[string]string, len(im)) localNames := make(map[string]bool, len(im)) for pth := range im { base := sanitize(path.Base(pth)) // Local names for an imported package can usually be the basename of the import path. // A couple of situations don't permit that, such as duplicate local names // (e.g. importing "html/template" and "text/template"), or where the basename is // a keyword (e.g. "foo/case"). // try base0, base1, ... pkgName := base i := 0 for localNames[pkgName] || token.Lookup(pkgName).IsKeyword() { pkgName = base + strconv.Itoa(i) i++ } g.packageMap[pth] = pkgName localNames[pkgName] = true } g.p("package %v", pkgName) g.p("") g.p("import (") g.in() for path, pkg := range g.packageMap { if path == *selfPackage { continue } g.p("%v %q", pkg, path) } for _, path := range pkg.DotImports { g.p(". %q", path) } g.out() g.p(")") for _, intf := range pkg.Interfaces { if err := g.GenerateMockInterface(intf); err != nil { return err } } return nil }
func main() { flag.Usage = usage flag.Parse() var pkg *model.Package var err error if *source != "" { pkg, err = ParseFile(*source) } else { if flag.NArg() != 2 { log.Fatal("Expected exactly two arguments") } pkg, err = Reflect(flag.Arg(0), strings.Split(flag.Arg(1), ",")) } if err != nil { log.Fatalf("Loading input failed: %v", err) } if *debugParser { pkg.Print(os.Stdout) return } dst := os.Stdout if len(*destination) > 0 { f, err := os.Create(*destination) if err != nil { log.Fatalf("Failed opening destination file: %v", err) } defer f.Close() dst = f } packageName := *packageOut if packageName == "" { // pkg.Name in reflect mode is the base name of the import path, // which might have characters that are illegal to have in package names. packageName = "mock_" + sanitize(pkg.Name) } g := new(generator) if *source != "" { g.filename = *source } else { g.srcPackage = flag.Arg(0) g.srcInterfaces = flag.Arg(1) } if err := g.Generate(pkg, packageName); err != nil { log.Fatalf("Failed generating mock: %v", err) } if _, err := dst.Write(g.Output()); err != nil { log.Fatalf("Failed writing to destination: %v", err) } }