package ast import ( "fmt" "go/ast" "os" "path/filepath" "time" "errors" "git.golang1.ru/softonik/godog/pkg/lib" ) const ( BACKUP_DIR = ".back" ) func получитьИмяGoПакетаВЭтойДире() (pkg_name string, err_ret error) { err_ret = errors.New("not found") filepath.WalkDir(".", func(path string, info os.DirEntry, err error) error { if err != nil { return err } if !info.IsDir() && filepath.Ext(path) == ".go" { pkg, err := lib.ПолучитьИмяGoПакетаФайла(path) if err != nil { return err } pkg_name = pkg err_ret = nil return filepath.SkipDir } return nil }) return } func переименоватьФайлСоВременем(fname string) error { os.MkdirAll(BACKUP_DIR, 0755) currentTime := time.Now() timestamp := currentTime.Format("20060102_150405") new_fname := fmt.Sprintf(BACKUP_DIR+"/%v_%v", fname, timestamp) return os.Rename(fname, new_fname) } func являетсяЛиШагомсТакойЖеФункцией(stmt ast.Stmt, step *ast.ExprStmt) bool { e, ok := stmt.(*ast.ExprStmt) if !ok { return false } e_name, err := имяШага(e) if err != nil { return false } step_name, err := имяШага(step) if err != nil { return false } return e_name == step_name } func являетсяЛиШагом(stmt ast.Stmt) bool { e, ok := stmt.(*ast.ExprStmt) if !ok { return false } e_name, err := имяШага(e) if err != nil { return false } return len(e_name) > 0 } func имяШага(step *ast.ExprStmt) (res string, err error) { err = errors.New("not found") call, ok := step.X.(*ast.CallExpr) if !ok { return } selector, ok := call.Fun.(*ast.SelectorExpr) if !ok { return } ctx, ok := selector.X.(*ast.Ident) if !ok { return } if ctx.Name != "ctx" { return } if selector.Sel.Name != "Step" { return } if len(call.Args) < 2 { return } fn, ok := call.Args[1].(*ast.Ident) if !ok { return } return fn.Name, nil }