cmd/gotext: factor out common loader code

Change-Id: I5aa45d17c01c6aacf2b9d10cdeea5b92ae79c246
Reviewed-on: https://go-review.googlesource.com/82197
Run-TryBot: Marcel van Lohuizen <mpvl@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Nigel Tao <nigeltao@golang.org>
diff --git a/cmd/gotext/common.go b/cmd/gotext/common.go
new file mode 100644
index 0000000..6496a21
--- /dev/null
+++ b/cmd/gotext/common.go
@@ -0,0 +1,30 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+	"go/build"
+	"go/parser"
+
+	"golang.org/x/tools/go/loader"
+)
+
+func loadPackages(conf *loader.Config, args []string) (*loader.Program, error) {
+	if len(args) == 0 {
+		args = []string{"."}
+	}
+
+	conf.Build = &build.Default
+	conf.ParserMode = parser.ParseComments
+
+	// Use the initial packages from the command line.
+	args, err := conf.FromArgs(args, false)
+	if err != nil {
+		return nil, err
+	}
+
+	// Load, parse and type-check the whole program.
+	return conf.Load()
+}
diff --git a/cmd/gotext/extract.go b/cmd/gotext/extract.go
index 2a3d5b3..b5cd65b 100644
--- a/cmd/gotext/extract.go
+++ b/cmd/gotext/extract.go
@@ -9,10 +9,8 @@
 	"encoding/json"
 	"fmt"
 	"go/ast"
-	"go/build"
 	"go/constant"
 	"go/format"
-	"go/parser"
 	"go/token"
 	"go/types"
 	"io/ioutil"
@@ -52,23 +50,8 @@
 }
 
 func runExtract(cmd *Command, args []string) error {
-	if len(args) == 0 {
-		args = []string{"."}
-	}
-
-	conf := loader.Config{
-		Build:      &build.Default,
-		ParserMode: parser.ParseComments,
-	}
-
-	// Use the initial packages from the command line.
-	args, err := conf.FromArgs(args, false)
-	if err != nil {
-		return err
-	}
-
-	// Load, parse and type-check the whole program.
-	iprog, err := conf.Load()
+	conf := loader.Config{}
+	prog, err := loadPackages(&conf, args)
 	if err != nil {
 		return err
 	}
@@ -82,10 +65,10 @@
 
 	var messages []Message
 
-	for _, info := range iprog.AllPackages {
+	for _, info := range prog.AllPackages {
 		for _, f := range info.Files {
 			// Associate comments with nodes.
-			cmap := ast.NewCommentMap(iprog.Fset, f, f.Comments)
+			cmap := ast.NewCommentMap(prog.Fset, f, f.Comments)
 			getComment := func(n ast.Node) string {
 				cs := cmap.Filter(n).Comments()
 				if len(cs) > 0 {
diff --git a/cmd/gotext/rewrite.go b/cmd/gotext/rewrite.go
index af97d41..e1c4833 100644
--- a/cmd/gotext/rewrite.go
+++ b/cmd/gotext/rewrite.go
@@ -8,10 +8,8 @@
 	"bytes"
 	"fmt"
 	"go/ast"
-	"go/build"
 	"go/constant"
 	"go/format"
-	"go/parser"
 	"go/token"
 	"log"
 	"os"
@@ -38,7 +36,7 @@
 
 var cmdRewrite = &Command{
 	Run:       runRewrite,
-	UsageLine: "rewrite <package>*",
+	UsageLine: "rewrite <package>",
 	Short:     "rewrite rewrites fmt functions to use a message Printer",
 	Long: `
 rewrite is typically done once for a project. It rewrites all usages of
@@ -49,34 +47,20 @@
 }
 
 func runRewrite(cmd *Command, args []string) error {
-	if len(args) == 0 {
-		args = []string{"."}
-	}
-
-	conf := loader.Config{
-		Build:       &build.Default,
-		ParserMode:  parser.ParseComments,
+	conf := &loader.Config{
 		AllowErrors: true, // Allow unused instances of message.Printer.
 	}
-
-	// Use the initial packages from the command line.
-	args, err := conf.FromArgs(args, false)
+	prog, err := loadPackages(conf, args)
 	if err != nil {
 		return err
 	}
 
-	// Load, parse and type-check the whole program.
-	iprog, err := conf.Load()
-	if err != nil {
-		return err
-	}
-
-	for _, info := range iprog.InitialPackages() {
+	for _, info := range prog.InitialPackages() {
 		for _, f := range info.Files {
 			// Associate comments with nodes.
 
 			// Pick up initialized Printers at the package level.
-			r := rewriter{info: info, conf: &conf}
+			r := rewriter{info: info, conf: conf}
 			for _, n := range info.InitOrder {
 				if t := r.info.Types[n.Rhs].Type.String(); strings.HasSuffix(t, printerType) {
 					r.printerVar = n.Lhs[0].Name()