1 env GOEXPERIMENT=golistexportnewformat
2
3 # "go list -export" should prefix paths for packages in GOROOT.
4 go list -export -json fmt
5 cp stdout out.json
6 go run q.go out.json Println
7 stdout '^\$GOROOT'
8
9 # "go list -export" should not prefix paths for packages not in GOROOT.
10 go list -export -json p.go
11 cp stdout out.json
12 go run q.go out.json V
13 ! stdout '^\$GOROOT'
14
15 -- p.go --
16 package p
17
18 var V = 42
19
20 -- q.go --
21 package main
22
23 import (
24 "encoding/json"
25 "fmt"
26 "go/importer"
27 "go/token"
28 "io"
29 "log"
30 "os"
31 )
32
33 func main() {
34 data, err := os.ReadFile(os.Args[1])
35 if err != nil {
36 log.Fatal(err)
37 }
38 // This is a minimal output of go list -export -json.
39 type output struct {
40 ImportPath string
41 Export string
42 }
43 var out output
44 if err := json.Unmarshal(data, &out); err != nil {
45 log.Fatal(err)
46 }
47 fset := token.NewFileSet()
48 imp := importer.ForCompiler(fset, "gc", func(path string) (io.ReadCloser, error) {
49 if path != out.ImportPath {
50 log.Fatalf("unexpected import: %q", path)
51 }
52 return os.Open(out.Export)
53 })
54 pkg, err := imp.Import(out.ImportPath)
55 if err != nil {
56 log.Fatal(err)
57 }
58 fmt.Println(fset.Position(pkg.Scope().Lookup(os.Args[2]).Pos()).Filename)
59 }
60
View as plain text