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 54 55 56 57 58 59
|
package main
import (
"go/ast"
"go/build"
"go/importer"
"go/parser"
"go/printer"
"go/token"
"go/types"
"os"
"path/filepath"
"github.com/neelance/astrewrite"
)
func main() {
importPath := os.Args[1]
pkg, err := build.Import(importPath, "", 0)
if err != nil {
panic(err)
}
fset := token.NewFileSet()
files := make([]*ast.File, len(pkg.GoFiles))
for i, name := range pkg.GoFiles {
file, err := parser.ParseFile(fset, filepath.Join(pkg.Dir, name), nil, parser.ParseComments)
if err != nil {
panic(err)
}
files[i] = file
}
typesInfo := &types.Info{
Types: make(map[ast.Expr]types.TypeAndValue),
Defs: make(map[*ast.Ident]types.Object),
Uses: make(map[*ast.Ident]types.Object),
Scopes: make(map[ast.Node]*types.Scope),
}
config := &types.Config{
Importer: importer.Default(),
}
if _, err := config.Check(importPath, fset, files, typesInfo); err != nil {
panic(err)
}
for i, file := range files {
simplifiedFile := astrewrite.Simplify(file, typesInfo, false)
out, err := os.Create(filepath.Join("goroot", "src", importPath, pkg.GoFiles[i]))
if err != nil {
panic(err)
}
if err := printer.Fprint(out, fset, simplifiedFile); err != nil {
panic(err)
}
out.Close()
}
}
|