github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/gen_method/scanner.go (about) 1 package gen_method 2 3 import ( 4 "go/parser" 5 "go/types" 6 7 "golang.org/x/tools/go/loader" 8 ) 9 10 func NewScanner(packagePath string) *Scanner { 11 ldr := loader.Config{} 12 ldr.AllowErrors = true 13 14 ldr.ParserMode = parser.ParseComments 15 ldr.Import(packagePath) 16 17 prog, err := ldr.Load() 18 if err != nil { 19 panic(err) 20 } 21 22 return &Scanner{ 23 packagePath: packagePath, 24 prog: prog, 25 } 26 } 27 28 type Scanner struct { 29 packagePath string 30 prog *loader.Program 31 } 32 33 func (s *Scanner) Output(modelName string, ignoreTable bool) { 34 for pkg, packageInfo := range s.prog.AllPackages { 35 if packageInfo.Pkg.Path() == s.packagePath { 36 for ident, def := range packageInfo.Defs { 37 if ident.Name == modelName { 38 if typeName, ok := def.(*types.TypeName); ok { 39 if typeStruct, ok := typeName.Type().Underlying().(*types.Struct); ok { 40 m := Model{ 41 Pkg: pkg, 42 Name: modelName, 43 UniqueIndex: make(map[string][]Field), 44 NormalIndex: make(map[string][]Field), 45 FuncMapContent: make(map[string]string), 46 } 47 48 m.collectInfoFromStructType(typeStruct) 49 m.Output(packageInfo.Pkg.Name(), ignoreTable) 50 } 51 } 52 } 53 } 54 } 55 } 56 }