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 @@ import ( "flag" "fmt" "go/ast" - "go/build" - "go/importer" "go/types" "io/ioutil" "log" @@ -74,6 +72,7 @@ func run() { if err != nil { log.Fatal(err) } + jrefs, err := importers.AnalyzePackages(allPkg, "Java/") if err != nil { log.Fatal(err) @@ -102,21 +101,7 @@ func run() { } } - 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 @@ func run() { 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 @@ func run() { 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 {