cmd/gobind: remove go/build and go/import usages from main.go

This change removes the usages of go/build and go/import, that don't
work with Go module.

Before this change:

  1) Package information is retrieved by go/packages
  2) Files for reverse bindings are generated
  3) Package information is retrieved by go/imports

After this change, only 3) will be changed:

  3) Package information is retrieved by go/packages again only when
     reverse binding is used.

This is preparation to support Go modules.

Updates golang/go#27234

Change-Id: I1997f71f23455fdd3b3c6b2643d35ec33ad147a3
Reviewed-on: https://go-review.googlesource.com/c/mobile/+/203399
Run-TryBot: Hajime Hoshi <hajimehoshi@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
diff --git a/cmd/gobind/main.go b/cmd/gobind/main.go
index 2546f37..88a6c6e 100644
--- a/cmd/gobind/main.go
+++ b/cmd/gobind/main.go
@@ -9,8 +9,6 @@
 	"flag"
 	"fmt"
 	"go/ast"
-	"go/build"
-	"go/importer"
 	"go/types"
 	"io/ioutil"
 	"log"
@@ -74,6 +72,7 @@
 	if err != nil {
 		log.Fatal(err)
 	}
+
 	jrefs, err := importers.AnalyzePackages(allPkg, "Java/")
 	if err != nil {
 		log.Fatal(err)
@@ -102,21 +101,7 @@
 		}
 	}
 
-	ctx := build.Default
-	if *tags != "" {
-		ctx.BuildTags = append(ctx.BuildTags, strings.Split(*tags, ",")...)
-	}
-
-	// Determine GOPATH from go env GOPATH in case the default $HOME/go GOPATH
-	// is in effect.
-	if out, err := exec.Command(goBin(), "env", "GOPATH").Output(); err != nil {
-		log.Fatal(err)
-	} else {
-		ctx.GOPATH = string(bytes.TrimSpace(out))
-	}
 	if len(classes) > 0 || len(otypes) > 0 {
-		// After generation, reverse bindings needs to be in the GOPATH
-		// for user packages to build.
 		srcDir := *outdir
 		if srcDir == "" {
 			srcDir, err = ioutil.TempDir(os.TempDir(), "gobind-")
@@ -130,10 +115,6 @@
 				log.Fatal(err)
 			}
 		}
-		if ctx.GOPATH != "" {
-			ctx.GOPATH = string(filepath.ListSeparator) + ctx.GOPATH
-		}
-		ctx.GOPATH = srcDir + ctx.GOPATH
 		if len(classes) > 0 {
 			if err := genJavaPackages(srcDir, classes, jrefs.Embedders); err != nil {
 				log.Fatal(err)
@@ -144,24 +125,34 @@
 				log.Fatal(err)
 			}
 		}
+
+		// Add a new directory to GOPATH where the file for reverse bindings exist, and recreate allPkg.
+		// It is because the current allPkg did not solve imports for reverse bindings.
+		var gopath string
+		if out, err := exec.Command(goBin(), "env", "GOPATH").Output(); err != nil {
+			log.Fatal(err)
+		} else {
+			gopath = string(bytes.TrimSpace(out))
+		}
+		if gopath != "" {
+			gopath = string(filepath.ListSeparator) + gopath
+		}
+		gopath = srcDir + gopath
+		cfg.Env = append(os.Environ(), "GOPATH="+gopath)
+		allPkg, err = packages.Load(cfg, flag.Args()...)
+		if err != nil {
+			log.Fatal(err)
+		}
 	}
 
 	typePkgs := make([]*types.Package, len(allPkg))
 	astPkgs := make([][]*ast.File, len(allPkg))
-	// The "source" go/importer package implicitly uses build.Default.
-	oldCtx := build.Default
-	build.Default = ctx
-	defer func() {
-		build.Default = oldCtx
-	}()
-	imp := importer.For("source", nil)
 	for i, pkg := range allPkg {
-		var err error
-		typePkgs[i], err = imp.Import(pkg.PkgPath)
-		if err != nil {
-			errorf("%v\n", err)
+		if len(pkg.Errors) > 0 {
+			errorf("%v", pkg.Errors)
 			return
 		}
+		typePkgs[i] = pkg.Types
 		astPkgs[i] = pkg.Syntax
 	}
 	for _, l := range langs {