2
0

plugin_gen.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. package ast
  2. import (
  3. "go/ast"
  4. "go/token"
  5. "io"
  6. )
  7. type PluginGen struct {
  8. Base
  9. Type Type // 类型
  10. Path string // 文件路径
  11. ImportPath string // 导包路径
  12. RelativePath string // 相对路径
  13. StructName string // 结构体名称
  14. PackageName string // 包名
  15. IsNew bool // 是否使用new关键字
  16. }
  17. func (a *PluginGen) Parse(filename string, writer io.Writer) (file *ast.File, err error) {
  18. if filename == "" {
  19. if a.RelativePath == "" {
  20. filename = a.Path
  21. a.RelativePath = a.Base.RelativePath(a.Path)
  22. return a.Base.Parse(filename, writer)
  23. }
  24. a.Path = a.Base.AbsolutePath(a.RelativePath)
  25. filename = a.Path
  26. }
  27. return a.Base.Parse(filename, writer)
  28. }
  29. func (a *PluginGen) Rollback(file *ast.File) error {
  30. for i := 0; i < len(file.Decls); i++ {
  31. v1, o1 := file.Decls[i].(*ast.FuncDecl)
  32. if o1 {
  33. for j := 0; j < len(v1.Body.List); j++ {
  34. v2, o2 := v1.Body.List[j].(*ast.ExprStmt)
  35. if o2 {
  36. v3, o3 := v2.X.(*ast.CallExpr)
  37. if o3 {
  38. v4, o4 := v3.Fun.(*ast.SelectorExpr)
  39. if o4 {
  40. if v4.Sel.Name != "ApplyBasic" {
  41. continue
  42. }
  43. for k := 0; k < len(v3.Args); k++ {
  44. v5, o5 := v3.Args[k].(*ast.CallExpr)
  45. if o5 {
  46. v6, o6 := v5.Fun.(*ast.Ident)
  47. if o6 {
  48. if v6.Name != "new" {
  49. continue
  50. }
  51. for l := 0; l < len(v5.Args); l++ {
  52. v7, o7 := v5.Args[l].(*ast.SelectorExpr)
  53. if o7 {
  54. v8, o8 := v7.X.(*ast.Ident)
  55. if o8 {
  56. if v8.Name == a.PackageName && v7.Sel.Name == a.StructName {
  57. v3.Args = append(v3.Args[:k], v3.Args[k+1:]...)
  58. continue
  59. }
  60. }
  61. }
  62. }
  63. }
  64. }
  65. if k >= len(v3.Args) {
  66. break
  67. }
  68. v6, o6 := v3.Args[k].(*ast.CompositeLit)
  69. if o6 {
  70. v7, o7 := v6.Type.(*ast.SelectorExpr)
  71. if o7 {
  72. v8, o8 := v7.X.(*ast.Ident)
  73. if o8 {
  74. if v8.Name == a.PackageName && v7.Sel.Name == a.StructName {
  75. v3.Args = append(v3.Args[:k], v3.Args[k+1:]...)
  76. continue
  77. }
  78. }
  79. }
  80. }
  81. }
  82. if len(v3.Args) == 0 {
  83. _ = NewImport(a.ImportPath).Rollback(file)
  84. }
  85. }
  86. }
  87. }
  88. }
  89. }
  90. }
  91. return nil
  92. }
  93. func (a *PluginGen) Injection(file *ast.File) error {
  94. _ = NewImport(a.ImportPath).Injection(file)
  95. for i := 0; i < len(file.Decls); i++ {
  96. v1, o1 := file.Decls[i].(*ast.FuncDecl)
  97. if o1 {
  98. for j := 0; j < len(v1.Body.List); j++ {
  99. v2, o2 := v1.Body.List[j].(*ast.ExprStmt)
  100. if o2 {
  101. v3, o3 := v2.X.(*ast.CallExpr)
  102. if o3 {
  103. v4, o4 := v3.Fun.(*ast.SelectorExpr)
  104. if o4 {
  105. if v4.Sel.Name != "ApplyBasic" {
  106. continue
  107. }
  108. var has bool
  109. for k := 0; k < len(v3.Args); k++ {
  110. v5, o5 := v3.Args[k].(*ast.CallExpr)
  111. if o5 {
  112. v6, o6 := v5.Fun.(*ast.Ident)
  113. if o6 {
  114. if v6.Name != "new" {
  115. continue
  116. }
  117. for l := 0; l < len(v5.Args); l++ {
  118. v7, o7 := v5.Args[l].(*ast.SelectorExpr)
  119. if o7 {
  120. v8, o8 := v7.X.(*ast.Ident)
  121. if o8 {
  122. if v8.Name == a.PackageName && v7.Sel.Name == a.StructName {
  123. has = true
  124. break
  125. }
  126. }
  127. }
  128. }
  129. }
  130. }
  131. v6, o6 := v3.Args[k].(*ast.CompositeLit)
  132. if o6 {
  133. v7, o7 := v6.Type.(*ast.SelectorExpr)
  134. if o7 {
  135. v8, o8 := v7.X.(*ast.Ident)
  136. if o8 {
  137. if v8.Name == a.PackageName && v7.Sel.Name == a.StructName {
  138. has = true
  139. break
  140. }
  141. }
  142. }
  143. }
  144. }
  145. if !has {
  146. if a.IsNew {
  147. arg := &ast.CallExpr{
  148. Fun: &ast.Ident{Name: "\n\t\tnew"},
  149. Args: []ast.Expr{
  150. &ast.SelectorExpr{
  151. X: &ast.Ident{Name: a.PackageName},
  152. Sel: &ast.Ident{Name: a.StructName},
  153. },
  154. },
  155. }
  156. v3.Args = append(v3.Args, arg)
  157. v3.Args = append(v3.Args, &ast.BasicLit{
  158. Kind: token.STRING,
  159. Value: "\n",
  160. })
  161. break
  162. }
  163. arg := &ast.CompositeLit{
  164. Type: &ast.SelectorExpr{
  165. X: &ast.Ident{Name: a.PackageName},
  166. Sel: &ast.Ident{Name: a.StructName},
  167. },
  168. }
  169. v3.Args = append(v3.Args, arg)
  170. }
  171. }
  172. }
  173. }
  174. }
  175. }
  176. }
  177. return nil
  178. }
  179. func (a *PluginGen) Format(filename string, writer io.Writer, file *ast.File) error {
  180. if filename == "" {
  181. filename = a.Path
  182. }
  183. return a.Base.Format(filename, writer, file)
  184. }