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  }