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()