118 строки
2 КиБ
Go
118 строки
2 КиБ
Go
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
|
|
}
|