cmd/protoc-gen-go: generate blank imports for unused proto dependencies

Generate Go imports for all packages imported by the .proto source file,
even if they are not referenced.

Change-Id: I116bdf460ab441d205b42606b2b05b315ed68954
Reviewed-on: https://go-review.googlesource.com/136358
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/protogen/protogen.go b/protogen/protogen.go
index 753325e..9db98b1 100644
--- a/protogen/protogen.go
+++ b/protogen/protogen.go
@@ -706,6 +706,7 @@
 	buf              bytes.Buffer
 	packageNames     map[GoImportPath]GoPackageName
 	usedPackageNames map[GoPackageName]bool
+	manualImports    map[GoImportPath]bool
 }
 
 // NewGeneratedFile creates a new generated file with the given filename
@@ -716,6 +717,7 @@
 		goImportPath:     goImportPath,
 		packageNames:     make(map[GoImportPath]GoPackageName),
 		usedPackageNames: make(map[GoPackageName]bool),
+		manualImports:    make(map[GoImportPath]bool),
 	}
 	gen.genFiles = append(gen.genFiles, g)
 	return g
@@ -759,6 +761,15 @@
 	return string(packageName) + "." + ident.GoName
 }
 
+// Import ensures a package is imported by the generated file.
+//
+// Packages referenced by QualifiedGoIdent are automatically imported.
+// Explicitly importing a package with Import is generally only necessary
+// when the import will be blank (import _ "package").
+func (g *GeneratedFile) Import(importPath GoImportPath) {
+	g.manualImports[importPath] = true
+}
+
 // Write implements io.Writer.
 func (g *GeneratedFile) Write(p []byte) (n int, err error) {
 	return g.buf.Write(p)
@@ -795,6 +806,12 @@
 	for _, importPath := range importPaths {
 		astutil.AddNamedImport(fset, file, string(g.packageNames[GoImportPath(importPath)]), importPath)
 	}
+	for importPath := range g.manualImports {
+		if _, ok := g.packageNames[importPath]; ok {
+			continue
+		}
+		astutil.AddNamedImport(fset, file, "_", string(importPath))
+	}
 	ast.SortImports(fset, file)
 
 	var out bytes.Buffer