1package main 2 3import ( 4 "flag" 5 "fmt" 6 "go/ast" 7 "go/format" 8 "go/parser" 9 "go/token" 10 "log" 11 "os" 12 13 "golang.org/x/tools/go/ast/astutil" 14) 15 16// https://github.com/shirou/gopsutil/issues/429 17func issue429() error { 18 f := func(filename string) error { 19 fset := token.NewFileSet() 20 expr, err := parser.ParseFile(fset, filename, nil, parser.ParseComments) 21 if err != nil { 22 return err 23 } 24 n := astutil.Apply(expr, func(cr *astutil.Cursor) bool { 25 if cr.Name() == "Decls" { 26 switch n := cr.Node().(type) { 27 case *ast.FuncDecl: 28 if n.Name.Name == "NetIOCounters" || n.Name.Name == ("NetIOCountersWithContext") { 29 cr.Delete() 30 } 31 } 32 } 33 return true 34 }, nil) 35 return replace(filename, fset, n) 36 } 37 38 root := "process/" 39 fnames := []string{"process.go", "process_darwin.go", "process_fallback.go", "process_freebsd.go", "process_linux.go", "process_openbsd.go", "process_bsd.go", "process_posix.go", "process_windows.go", "process_test.go"} 40 for _, fname := range fnames { 41 if err := f(root + fname); err != nil { 42 log.Fatalln("run 429:", err) 43 } 44 } 45 return nil 46} 47 48func issueRemoveUnusedValue() error { 49 f := func(filename string) error { 50 fset := token.NewFileSet() 51 expr, err := parser.ParseFile(fset, filename, nil, parser.ParseComments) 52 if err != nil { 53 return err 54 } 55 n := astutil.Apply(expr, func(cr *astutil.Cursor) bool { 56 if cr.Name() == "Decls" { 57 switch n := cr.Node().(type) { 58 case *ast.GenDecl: 59 if n.Tok != token.TYPE { 60 break 61 } 62 ts := n.Specs[0].(*ast.TypeSpec) 63 if ts.Name.Name == "SystemProcessInformation" { 64 cr.Delete() 65 } 66 } 67 } 68 return true 69 }, nil) 70 return replace(filename, fset, n) 71 } 72 73 if err := f("process/process_windows.go"); err != nil { 74 log.Fatalln("run 429:", err) 75 } 76 return nil 77} 78 79func replace(filename string, fset *token.FileSet, n ast.Node) error { 80 if err := os.Remove(filename); err != nil { 81 return err 82 } 83 fp, err := os.Create(filename) 84 if err != nil { 85 return err 86 } 87 defer fp.Close() 88 if err := format.Node(fp, fset, n); err != nil { 89 return err 90 } 91 fp.WriteString("\n") 92 return nil 93} 94 95func main() { 96 flag.Parse() 97 for _, n := range flag.Args() { 98 fmt.Println("issue:" + n) 99 switch n { 100 case "429": 101 issue429() 102 case "issueRemoveUnusedValue": 103 issueRemoveUnusedValue() 104 } 105 } 106 107} 108