/
export.go
53 lines (43 loc) · 1.22 KB
/
export.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package main
import (
"fmt"
"os"
"strings"
gos "github.com/ysmood/kit/pkg/os"
"github.com/ysmood/kit/pkg/run"
"github.com/ysmood/kit/pkg/utils"
"golang.org/x/tools/go/packages"
)
// Export all the public members of each package under pkg folfer into kit.go
func export() {
paths := gos.Walk("pkg/*").MustList()
cfg := &packages.Config{Mode: packages.NeedName | packages.NeedDeps | packages.NeedTypes}
pkgs, err := packages.Load(cfg, paths...)
if err != nil {
fmt.Fprintf(os.Stderr, "load: %v\n", err)
os.Exit(1)
}
if packages.PrintErrors(pkgs) > 0 {
os.Exit(1)
}
header := ""
statements := ""
for _, pkg := range pkgs {
header += fmt.Sprintf(" \"github.com/ysmood/kit/pkg/%s\"\n", pkg.Name)
s := pkg.Types.Scope()
for _, n := range s.Names() {
v := s.Lookup(n)
if v.Exported() {
statements += "// " + n + " imported\n"
if strings.HasPrefix(v.String(), "type") {
statements += fmt.Sprintf("type %s = %s.%s\n", n, pkg.Name, n)
} else {
statements += fmt.Sprintf("var %s = %s.%s\n", n, pkg.Name, n)
}
}
}
}
header = "package kit\n\nimport(\n" + header + ")\n\n"
utils.E(gos.OutputFile("kit.go", header+statements, nil))
run.Exec("gofmt", "-w", "kit.go").MustDo()
}