github.com/johnnyeven/libtools@v0.0.0-20191126065708-61829c1adf46/codegen/loaderx/query.go (about)

     1  package loaderx
     2  
     3  import (
     4  	"go/types"
     5  
     6  	"golang.org/x/tools/go/loader"
     7  )
     8  
     9  func NewQuery(program *loader.Program, pkgImportPath string) *Query {
    10  	pkgInfo := program.Package(pkgImportPath)
    11  
    12  	return &Query{
    13  		pkgInfo: pkgInfo,
    14  	}
    15  }
    16  
    17  type Query struct {
    18  	pkgInfo *loader.PackageInfo
    19  }
    20  
    21  func (q *Query) Const(name string) *types.Const {
    22  	for ident, def := range q.pkgInfo.Defs {
    23  		if typeConst, ok := def.(*types.Const); ok {
    24  			if ident.Name == name {
    25  				return typeConst
    26  			}
    27  		}
    28  	}
    29  	return nil
    30  }
    31  
    32  func (q *Query) TypeName(name string) *types.TypeName {
    33  	for ident, def := range q.pkgInfo.Defs {
    34  		if typeName, ok := def.(*types.TypeName); ok {
    35  			if ident.Name == name {
    36  				return typeName
    37  			}
    38  		}
    39  	}
    40  	return nil
    41  }
    42  
    43  func (q *Query) Var(name string) *types.Var {
    44  	for ident, def := range q.pkgInfo.Defs {
    45  		if typeVar, ok := def.(*types.Var); ok {
    46  			if ident.Name == name {
    47  				return typeVar
    48  			}
    49  		}
    50  	}
    51  	return nil
    52  }
    53  
    54  func (q *Query) Func(name string) *types.Func {
    55  	for ident, def := range q.pkgInfo.Defs {
    56  		if typeFunc, ok := def.(*types.Func); ok {
    57  			if ident.Name == name {
    58  				return typeFunc
    59  			}
    60  		}
    61  	}
    62  	return nil
    63  }