Advertisement
Guest User

Untitled

a guest
Apr 19th, 2015
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.17 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "go/ast"
  6. "go/build"
  7. "go/format"
  8. "go/parser"
  9. "go/token"
  10. "log"
  11. "os"
  12. "path/filepath"
  13. )
  14.  
  15. func main() {
  16. if err := process(os.Args[1]); err != nil {
  17. log.Fatal(err)
  18. }
  19. }
  20.  
  21. func process(path string) error {
  22. pkg, err := build.Import(path, "", 0)
  23. if err != nil {
  24. return err
  25. }
  26.  
  27. fset := token.NewFileSet()
  28. var files []*ast.File
  29. for _, file := range pkg.GoFiles {
  30. f, err := parser.ParseFile(fset, filepath.Join(pkg.Dir, file), nil, parser.ParseComments)
  31. if err != nil {
  32. return err
  33. }
  34. files = append(files, f)
  35. }
  36.  
  37. for _, file := range files {
  38. var changed bool
  39. ast.Inspect(file, func(n ast.Node) bool {
  40. bs, ok := n.(*ast.BlockStmt)
  41. if !ok {
  42. return true
  43. }
  44.  
  45. for i := range bs.List {
  46. if i < 2 {
  47. continue
  48. }
  49. ds, ok := bs.List[i-2].(*ast.DeclStmt)
  50. if !ok {
  51. continue
  52. }
  53. as, ok := bs.List[i-1].(*ast.AssignStmt)
  54. if !ok {
  55. continue
  56. }
  57. ret, ok := bs.List[i].(*ast.ReturnStmt)
  58. if !ok {
  59. continue
  60. }
  61. if as.Tok != token.ADD_ASSIGN {
  62. continue
  63. }
  64. gd, ok := ds.Decl.(*ast.GenDecl)
  65. if !ok {
  66. continue
  67. }
  68. if len(gd.Specs) != 1 {
  69. continue
  70. }
  71. vs, ok := gd.Specs[0].(*ast.ValueSpec)
  72. if !ok {
  73. continue
  74. }
  75. if len(vs.Names) != 1 {
  76. continue
  77. }
  78. if len(as.Lhs) != 1 {
  79. continue
  80. }
  81. id, ok := as.Lhs[0].(*ast.Ident)
  82. if !ok {
  83. continue
  84. }
  85. if vs.Names[0].Obj != id.Obj {
  86. continue
  87. }
  88. if len(ret.Results) != 1 {
  89. fmt.Println(len(ret.Results))
  90. continue
  91. }
  92. retid, ok := ret.Results[0].(*ast.Ident)
  93. if !ok {
  94. continue
  95. }
  96. if retid.Obj != id.Obj {
  97. fmt.Println("diffobj")
  98. continue
  99. }
  100. copy(bs.List[i-2:], bs.List[i:])
  101. bs.List = bs.List[:len(bs.List)-2]
  102. ret.Results = as.Rhs
  103. changed = true
  104. f := fset.File(bs.Pos())
  105. f.MergeLine(fset.Position(as.Pos()).Line)
  106. f.MergeLine(fset.Position(bs.Pos()).Line)
  107. }
  108. return true
  109. })
  110.  
  111. if changed {
  112. fname := fset.Position(file.Pos()).Filename
  113. c, err := os.Create(fname)
  114. if err != nil {
  115. log.Fatal(err)
  116. }
  117.  
  118. err = format.Node(c, fset, file)
  119. if err != nil {
  120. log.Fatal(err)
  121. }
  122. }
  123. }
  124.  
  125. return nil
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement