internal/cmd/qgo: port qgo from loader to packages

exclude ReplaceAll, for now

Change-Id: I2574bbbb3e1d72b64770fdee759c2d68b272902c
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/2322
Reviewed-by: Marcel van Lohuizen <mpvl@google.com>
diff --git a/internal/cmd/qgo/qgo.go b/internal/cmd/qgo/qgo.go
index 7c2cbdf..4d5e57d 100644
--- a/internal/cmd/qgo/qgo.go
+++ b/internal/cmd/qgo/qgo.go
@@ -22,7 +22,6 @@
 	"go/ast"
 	"go/constant"
 	"go/format"
-	"go/parser"
 	"go/printer"
 	"go/token"
 	"go/types"
@@ -34,7 +33,7 @@
 	"regexp"
 	"strings"
 
-	"golang.org/x/tools/go/loader"
+	"golang.org/x/tools/go/packages"
 )
 
 const help = `
@@ -129,24 +128,22 @@
 }
 
 type extracter struct {
-	prog *loader.Program
-	pkg  *loader.PackageInfo
+	pkg *packages.Package
 }
 
 func extract(args []string) {
-
-	cfg := loader.Config{
-		ParserMode: parser.ParseComments,
+	cfg := &packages.Config{
+		Mode: packages.LoadFiles |
+			packages.LoadAllSyntax |
+			packages.LoadTypes,
 	}
-	cfg.FromArgs(args, false)
-
-	e := extracter{}
-	var err error
-	e.prog, err = cfg.Load()
+	pkgs, err := packages.Load(cfg, args...)
 	if err != nil {
 		log.Fatal(err)
 	}
 
+	e := extracter{}
+
 	lastPkg := ""
 	var w *bytes.Buffer
 	initExclusions()
@@ -165,18 +162,18 @@
 		w = &bytes.Buffer{}
 	}
 
-	for _, p := range e.prog.InitialPackages() {
+	for _, p := range pkgs {
 		e.pkg = p
-		for _, f := range p.Files {
-			if lastPkg != p.Pkg.Name() {
+		for _, f := range p.Syntax {
+			if lastPkg != p.Name {
 				flushFile()
-				lastPkg = p.Pkg.Name()
+				lastPkg = p.Name
 				fmt.Fprintln(w, copyright)
 				fmt.Fprintln(w, genLine)
 				fmt.Fprintln(w)
 				fmt.Fprintf(w, "package %s\n", pkgName())
 				fmt.Fprintln(w)
-				fmt.Fprintf(w, "import %q", p.Pkg.Path())
+				fmt.Fprintf(w, "import %q", p.PkgPath)
 				fmt.Fprintln(w)
 			}
 
@@ -197,7 +194,7 @@
 	if filter(x.Name.Name) {
 		return
 	}
-	pkgName := e.pkg.Pkg.Name()
+	pkgName := e.pkg.Name
 	override := ""
 	params := []ast.Expr{}
 	if x.Type.Params != nil {
@@ -261,14 +258,14 @@
 		default:
 			fmt.Printf("Skipping ")
 			x.Doc = nil
-			printer.Fprint(os.Stdout, e.prog.Fset, x)
+			printer.Fprint(os.Stdout, e.pkg.Fset, x)
 			fmt.Println()
 			return
 		}
 	}
 	fmt.Fprintln(w)
-	printer.Fprint(w, e.prog.Fset, x.Doc)
-	printer.Fprint(w, e.prog.Fset, x)
+	printer.Fprint(w, e.pkg.Fset, x.Doc)
+	printer.Fprint(w, e.pkg.Fset, x)
 	fmt.Fprint(w, "\n")
 	if override != "" {
 		fmt.Fprintf(w, "var %s = %s.%s\n\n", override, pkgName, x.Name.Name)
@@ -290,7 +287,7 @@
 				if _, ok := v.Values[i].(*ast.BasicLit); ok {
 					continue
 				}
-				tv, _ := types.Eval(e.prog.Fset, e.pkg.Pkg, v.Pos(), v.Names[0].Name)
+				tv, _ := types.Eval(e.pkg.Fset, e.pkg.Types, v.Pos(), v.Names[0].Name)
 				tok := token.ILLEGAL
 				switch tv.Value.Kind() {
 				case constant.Bool:
@@ -322,6 +319,6 @@
 		return
 	}
 	fmt.Fprintln(w)
-	printer.Fprint(w, e.prog.Fset, x)
+	printer.Fprint(w, e.pkg.Fset, x)
 	fmt.Fprintln(w)
 }