diff --git a/_xtool/pydump/pydump.go b/_xtool/pydump/pydump.go index dd44292..7b8be43 100644 --- a/_xtool/pydump/pydump.go +++ b/_xtool/pydump/pydump.go @@ -1,28 +1,16 @@ package main import ( - "encoding/json" + "os" "fmt" + "strings" + "encoding/json" "github.com/goplus/lib/c" "github.com/goplus/lib/py" "github.com/goplus/lib/py/inspect" - "os" - "strings" + "github.com/goplus/llpyg/symbol" ) -type symbol struct { - Name string `json:"name"` - Type string `json:"type"` - Doc string `json:"doc"` - Sig string `json:"sig"` -} - -type module struct { - Name string `json:"name"` // python module name - Functions []*symbol `json:"functions"` // package functions - // TODO: variables, classes, etc. -} - var pyFuncTypes = map[string]bool{ "ufunc": true, "method": true, @@ -50,7 +38,7 @@ func extractSignatureFromDoc(doc, funcName string) string { return strings.Join(fields, " ") } -func getSignature(val *py.Object, sym *symbol) string { +func getSignature(val *py.Object, sym *symbol.Symbol) string { // function, method, class, or implement __call__ if val.Callable() == 0 { return "" @@ -76,7 +64,7 @@ func getSignature(val *py.Object, sym *symbol) string { } // moduleName: Python module name -func pydump(moduleName string) (*module, error) { +func pydump(moduleName string) (*symbol.Module, error) { // import module mod := py.ImportModule(c.AllocaCStr(moduleName)) if mod == nil { @@ -88,7 +76,7 @@ func pydump(moduleName string) (*module, error) { return nil, fmt.Errorf("failed to get dict keys of %s", moduleName) } // create module instance - modInstance := &module{ + modInstance := &symbol.Module{ Name: moduleName, } // get symbols @@ -99,7 +87,7 @@ func pydump(moduleName string) (*module, error) { continue } // define symbol - sym := &symbol{} + sym := &symbol.Symbol{} sym.Name = c.GoString(key.CStr()) sym.Type = c.GoString(val.Type().TypeName().CStr()) doc := val.GetAttrString(c.Str("__doc__")) diff --git a/tool/pygen/symbol.go b/symbol/symbol.go similarity index 63% rename from tool/pygen/symbol.go rename to symbol/symbol.go index 8dc30ca..e0e5d2b 100644 --- a/tool/pygen/symbol.go +++ b/symbol/symbol.go @@ -1,14 +1,14 @@ -package pygen +package symbol -type symbol struct { +type Symbol struct { Name string `json:"name"` Type string `json:"type"` Doc string `json:"doc"` Sig string `json:"sig"` } -type module struct { +type Module struct { Name string `json:"name"` // python module name - Functions []*symbol `json:"functions"` // package functions + Functions []*Symbol `json:"functions"` // package functions // TODO: variables, classes, etc. } diff --git a/tool/pygen/genfunc.go b/tool/pygen/genfunc.go index 3176f74..9474b7d 100644 --- a/tool/pygen/genfunc.go +++ b/tool/pygen/genfunc.go @@ -1,13 +1,14 @@ package pygen import ( - "github.com/goplus/gogen" "go/ast" "go/token" "go/types" + "github.com/goplus/gogen" + "github.com/goplus/llpyg/symbol" ) -func (ctx *context) genFunc(pkg *gogen.Package, sym *symbol) { +func (ctx *context) genFunc(pkg *gogen.Package, sym *symbol.Symbol) { name, symSig := sym.Name, sym.Sig if len(name) == 0 || name[0] == '_' { return @@ -30,6 +31,6 @@ func (ctx *context) genFunc(pkg *gogen.Package, sym *symbol) { fn.SetComments(pkg, &ast.CommentGroup{List: docList}) } -func (ctx *context) genLinkname(name string, sym *symbol) *ast.Comment { +func (ctx *context) genLinkname(name string, sym *symbol.Symbol) *ast.Comment { return &ast.Comment{Text: "//go:linkname " + name + " py." + sym.Name} } diff --git a/tool/pygen/pygen.go b/tool/pygen/pygen.go index 3615f55..905398d 100644 --- a/tool/pygen/pygen.go +++ b/tool/pygen/pygen.go @@ -14,6 +14,7 @@ import ( "go/types" "github.com/goplus/gogen" "github.com/goplus/llpyg/tool/pysig" + "github.com/goplus/llpyg/symbol" ) @@ -23,7 +24,7 @@ type context struct { objPtr *types.Pointer ret *types.Tuple py gogen.PkgRef - skips []symbol + skips []symbol.Symbol } @@ -50,7 +51,7 @@ func GenLLGoBindings(moduleName string, outFile io.Writer) { ctx.pkg.WriteTo(outFile) } -func pydump(moduleName string) (mod module, err error) { +func pydump(moduleName string) (mod symbol.Module, err error) { var out bytes.Buffer cmd := exec.Command("pydump", moduleName) cmd.Stdout = &out @@ -69,7 +70,7 @@ func pydump(moduleName string) (mod module, err error) { return mod, nil } -func createGoPackage(mod module) (ctx *context) { +func createGoPackage(mod symbol.Module) (ctx *context) { parts := strings.Split(mod.Name, ".") pkgName := parts[len(parts)-1] if goKeywords[pkgName] { @@ -92,7 +93,7 @@ func createGoPackage(mod module) (ctx *context) { return ctx } -func (ctx *context) genMod(pkg *gogen.Package, mod *module) { +func (ctx *context) genMod(pkg *gogen.Package, mod *symbol.Module) { // global functions funcMap := make(map[string]bool) for _, sym := range mod.Functions {