126 строки
2,2 КиБ
Go
126 строки
2,2 КиБ
Go
package ast
|
|
|
|
import (
|
|
"fmt"
|
|
"go/ast"
|
|
"go/parser"
|
|
"go/token"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"errors"
|
|
)
|
|
|
|
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 := получитьИмяGoПакетаФайла(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
pkg_name = pkg
|
|
err_ret = nil
|
|
return filepath.SkipDir
|
|
}
|
|
return nil
|
|
})
|
|
|
|
return
|
|
}
|
|
func получитьИмяGoПакетаФайла(fname string) (string, error) {
|
|
fset := token.NewFileSet()
|
|
node, err := parser.ParseFile(fset, fname, nil, parser.AllErrors)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return node.Name.Name, nil
|
|
}
|
|
|
|
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
|
|
}
|