ast_auto_enter.go 990 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package ast
  2. import (
  3. "bytes"
  4. "fmt"
  5. "go/ast"
  6. "go/parser"
  7. "go/printer"
  8. "go/token"
  9. "os"
  10. )
  11. func ImportForAutoEnter(path string, funcName string, code string) {
  12. src, err := os.ReadFile(path)
  13. if err != nil {
  14. fmt.Println(err)
  15. }
  16. fileSet := token.NewFileSet()
  17. astFile, err := parser.ParseFile(fileSet, "", src, 0)
  18. ast.Inspect(astFile, func(node ast.Node) bool {
  19. if typeSpec, ok := node.(*ast.TypeSpec); ok {
  20. if typeSpec.Name.Name == funcName {
  21. if st, ok := typeSpec.Type.(*ast.StructType); ok {
  22. for i := range st.Fields.List {
  23. if t, ok := st.Fields.List[i].Type.(*ast.Ident); ok {
  24. if t.Name == code {
  25. return false
  26. }
  27. }
  28. }
  29. sn := &ast.Field{
  30. Type: &ast.Ident{Name: code},
  31. }
  32. st.Fields.List = append(st.Fields.List, sn)
  33. }
  34. }
  35. }
  36. return true
  37. })
  38. var out []byte
  39. bf := bytes.NewBuffer(out)
  40. err = printer.Fprint(bf, fileSet, astFile)
  41. if err != nil {
  42. return
  43. }
  44. _ = os.WriteFile(path, bf.Bytes(), 0666)
  45. }