From a779903291b1a49b8f0535d07c1c19c8de503549 Mon Sep 17 00:00:00 2001 From: Micro Liu Date: Mon, 29 Sep 2025 14:19:29 +0800 Subject: [PATCH 1/3] chore: unify symbol declaration location --- _xtool/pydump/pydump.go | 22 +++++----------------- tool/pygen/symbol.go => ast/ast.go | 8 ++++---- tool/pygen/genfunc.go | 5 +++-- tool/pygen/pygen.go | 9 +++++---- 4 files changed, 17 insertions(+), 27 deletions(-) rename tool/pygen/symbol.go => ast/ast.go (64%) diff --git a/_xtool/pydump/pydump.go b/_xtool/pydump/pydump.go index dd44292..3776566 100644 --- a/_xtool/pydump/pydump.go +++ b/_xtool/pydump/pydump.go @@ -8,21 +8,9 @@ import ( "github.com/goplus/lib/py/inspect" "os" "strings" + "github.com/goplus/llpyg/ast" ) -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 *ast.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) (*ast.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 := &ast.Module{ Name: moduleName, } // get symbols @@ -99,7 +87,7 @@ func pydump(moduleName string) (*module, error) { continue } // define symbol - sym := &symbol{} + sym := &ast.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/ast/ast.go similarity index 64% rename from tool/pygen/symbol.go rename to ast/ast.go index 8dc30ca..f89bc71 100644 --- a/tool/pygen/symbol.go +++ b/ast/ast.go @@ -1,14 +1,14 @@ -package pygen +package ast -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..47bd85a 100644 --- a/tool/pygen/genfunc.go +++ b/tool/pygen/genfunc.go @@ -5,9 +5,10 @@ import ( "go/ast" "go/token" "go/types" + pyast "github.com/goplus/llpyg/ast" ) -func (ctx *context) genFunc(pkg *gogen.Package, sym *symbol) { +func (ctx *context) genFunc(pkg *gogen.Package, sym *pyast.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 *pyast.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..4ae9ae8 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" + pyast "github.com/goplus/llpyg/ast" ) @@ -23,7 +24,7 @@ type context struct { objPtr *types.Pointer ret *types.Tuple py gogen.PkgRef - skips []symbol + skips []pyast.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 pyast.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 pyast.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 *pyast.Module) { // global functions funcMap := make(map[string]bool) for _, sym := range mod.Functions { From edbc090c41f684a3ff5148cf59a0b02a4676efcd Mon Sep 17 00:00:00 2001 From: Micro Liu Date: Mon, 29 Sep 2025 14:27:55 +0800 Subject: [PATCH 2/3] chore: group imports following Go conventions --- _xtool/pydump/pydump.go | 6 +++--- tool/pygen/genfunc.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/_xtool/pydump/pydump.go b/_xtool/pydump/pydump.go index 3776566..3c0bf2c 100644 --- a/_xtool/pydump/pydump.go +++ b/_xtool/pydump/pydump.go @@ -1,13 +1,13 @@ 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/ast" ) diff --git a/tool/pygen/genfunc.go b/tool/pygen/genfunc.go index 47bd85a..b6a6555 100644 --- a/tool/pygen/genfunc.go +++ b/tool/pygen/genfunc.go @@ -1,10 +1,10 @@ package pygen import ( - "github.com/goplus/gogen" "go/ast" "go/token" "go/types" + "github.com/goplus/gogen" pyast "github.com/goplus/llpyg/ast" ) From ae3169e0a6955b6b021d6ed4e8fb4f227bf4c0a5 Mon Sep 17 00:00:00 2001 From: Micro Liu Date: Mon, 29 Sep 2025 16:02:58 +0800 Subject: [PATCH 3/3] chore: modify pkgname from ast to symbol --- _xtool/pydump/pydump.go | 10 +++++----- ast/ast.go => symbol/symbol.go | 2 +- tool/pygen/genfunc.go | 6 +++--- tool/pygen/pygen.go | 10 +++++----- 4 files changed, 14 insertions(+), 14 deletions(-) rename ast/ast.go => symbol/symbol.go (95%) diff --git a/_xtool/pydump/pydump.go b/_xtool/pydump/pydump.go index 3c0bf2c..7b8be43 100644 --- a/_xtool/pydump/pydump.go +++ b/_xtool/pydump/pydump.go @@ -8,7 +8,7 @@ import ( "github.com/goplus/lib/c" "github.com/goplus/lib/py" "github.com/goplus/lib/py/inspect" - "github.com/goplus/llpyg/ast" + "github.com/goplus/llpyg/symbol" ) var pyFuncTypes = map[string]bool{ @@ -38,7 +38,7 @@ func extractSignatureFromDoc(doc, funcName string) string { return strings.Join(fields, " ") } -func getSignature(val *py.Object, sym *ast.Symbol) string { +func getSignature(val *py.Object, sym *symbol.Symbol) string { // function, method, class, or implement __call__ if val.Callable() == 0 { return "" @@ -64,7 +64,7 @@ func getSignature(val *py.Object, sym *ast.Symbol) string { } // moduleName: Python module name -func pydump(moduleName string) (*ast.Module, error) { +func pydump(moduleName string) (*symbol.Module, error) { // import module mod := py.ImportModule(c.AllocaCStr(moduleName)) if mod == nil { @@ -76,7 +76,7 @@ func pydump(moduleName string) (*ast.Module, error) { return nil, fmt.Errorf("failed to get dict keys of %s", moduleName) } // create module instance - modInstance := &ast.Module{ + modInstance := &symbol.Module{ Name: moduleName, } // get symbols @@ -87,7 +87,7 @@ func pydump(moduleName string) (*ast.Module, error) { continue } // define symbol - sym := &ast.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/ast/ast.go b/symbol/symbol.go similarity index 95% rename from ast/ast.go rename to symbol/symbol.go index f89bc71..e0e5d2b 100644 --- a/ast/ast.go +++ b/symbol/symbol.go @@ -1,4 +1,4 @@ -package ast +package symbol type Symbol struct { Name string `json:"name"` diff --git a/tool/pygen/genfunc.go b/tool/pygen/genfunc.go index b6a6555..9474b7d 100644 --- a/tool/pygen/genfunc.go +++ b/tool/pygen/genfunc.go @@ -5,10 +5,10 @@ import ( "go/token" "go/types" "github.com/goplus/gogen" - pyast "github.com/goplus/llpyg/ast" + "github.com/goplus/llpyg/symbol" ) -func (ctx *context) genFunc(pkg *gogen.Package, sym *pyast.Symbol) { +func (ctx *context) genFunc(pkg *gogen.Package, sym *symbol.Symbol) { name, symSig := sym.Name, sym.Sig if len(name) == 0 || name[0] == '_' { return @@ -31,6 +31,6 @@ func (ctx *context) genFunc(pkg *gogen.Package, sym *pyast.Symbol) { fn.SetComments(pkg, &ast.CommentGroup{List: docList}) } -func (ctx *context) genLinkname(name string, sym *pyast.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 4ae9ae8..905398d 100644 --- a/tool/pygen/pygen.go +++ b/tool/pygen/pygen.go @@ -14,7 +14,7 @@ import ( "go/types" "github.com/goplus/gogen" "github.com/goplus/llpyg/tool/pysig" - pyast "github.com/goplus/llpyg/ast" + "github.com/goplus/llpyg/symbol" ) @@ -24,7 +24,7 @@ type context struct { objPtr *types.Pointer ret *types.Tuple py gogen.PkgRef - skips []pyast.Symbol + skips []symbol.Symbol } @@ -51,7 +51,7 @@ func GenLLGoBindings(moduleName string, outFile io.Writer) { ctx.pkg.WriteTo(outFile) } -func pydump(moduleName string) (mod pyast.Module, err error) { +func pydump(moduleName string) (mod symbol.Module, err error) { var out bytes.Buffer cmd := exec.Command("pydump", moduleName) cmd.Stdout = &out @@ -70,7 +70,7 @@ func pydump(moduleName string) (mod pyast.Module, err error) { return mod, nil } -func createGoPackage(mod pyast.Module) (ctx *context) { +func createGoPackage(mod symbol.Module) (ctx *context) { parts := strings.Split(mod.Name, ".") pkgName := parts[len(parts)-1] if goKeywords[pkgName] { @@ -93,7 +93,7 @@ func createGoPackage(mod pyast.Module) (ctx *context) { return ctx } -func (ctx *context) genMod(pkg *gogen.Package, mod *pyast.Module) { +func (ctx *context) genMod(pkg *gogen.Package, mod *symbol.Module) { // global functions funcMap := make(map[string]bool) for _, sym := range mod.Functions {