From e8eab8edcac606d0cd864934daa4a403a4819220 Mon Sep 17 00:00:00 2001 From: tsingbx Date: Thu, 24 Oct 2024 10:21:01 +0800 Subject: [PATCH 1/2] write LLGoPackage to link file --- chore/gogensig/cmptest/test.go | 2 +- chore/gogensig/convert/convert.go | 4 ++++ chore/gogensig/convert/package.go | 24 ++++++++++++++---------- chore/gogensig/gogensig.go | 4 +++- chore/gogensig/processor/processor.go | 7 +++++-- chore/gogensig/unmarshal/unmarshal.go | 4 ++-- 6 files changed, 29 insertions(+), 16 deletions(-) diff --git a/chore/gogensig/cmptest/test.go b/chore/gogensig/cmptest/test.go index 6d5762f2d..4d83fe0a8 100644 --- a/chore/gogensig/cmptest/test.go +++ b/chore/gogensig/cmptest/test.go @@ -70,7 +70,7 @@ func RunTest(t *testing.T, pkgName string, isCpp bool, symbolEntries []config.Sy t.Fatal(err) } - p.ProcessFileSet(inputdata) + p.ProcessFileSet(inputdata, nil) // Note: The converted file path for llcppsigfetch's temp header file is temp.h, genFilePath := filepath.Join(rootDir, "temp.go") diff --git a/chore/gogensig/convert/convert.go b/chore/gogensig/convert/convert.go index 8efb98210..01e063376 100644 --- a/chore/gogensig/convert/convert.go +++ b/chore/gogensig/convert/convert.go @@ -42,6 +42,10 @@ func (p *AstConvert) SetVisitDone(fn func(pkg *Package, docPath string)) { p.visitDone = fn } +func (p *AstConvert) WriteLinkFile() { + p.pkg.WriteLinkFile() +} + func (p *AstConvert) GetPackage() *Package { return p.pkg } diff --git a/chore/gogensig/convert/package.go b/chore/gogensig/convert/package.go index 26e795018..6fa1e2f7a 100644 --- a/chore/gogensig/convert/package.go +++ b/chore/gogensig/convert/package.go @@ -58,13 +58,6 @@ func NewPackage(config *PackageConfig) *Package { panic(fmt.Errorf("failed to prepare output directory: %w", err)) } p.outputDir = dir - - // default file name is the package name - err = p.SetCurFile(config.Name, false) - if err != nil { - panic(fmt.Errorf("SetDefaultFile %s for gogen Fail %w", config.Name+".go", err)) - } - clib := p.p.Import("github.com/goplus/llgo/c") typeMap := NewBuiltinTypeMapWithPkgRefS(clib, p.p.Unsafe()) p.cvt = NewConv(p.p.Types, typeMap) @@ -101,9 +94,6 @@ func (p *Package) SetCppgConf(conf *cppgtypes.Config) { return } p.cvt.SetCppgConf(conf) - if conf.Libs != "" { - p.linkLib(conf.Libs) - } } func (p *Package) GetGenPackage() *gogen.Package { @@ -124,6 +114,9 @@ func (p *Package) Name() string { // todo(zzy):refine logic func (p *Package) linkLib(lib string) error { + if lib == "" { + return fmt.Errorf("empty lib name") + } linkString := fmt.Sprintf("link: %s;", lib) p.p.CB().NewConstStart(types.Typ[types.String], "LLGoPackage").Val(linkString).EndInit(1) return nil @@ -262,6 +255,17 @@ func (p *Package) Write(headerFile string) error { return nil } +func (p *Package) WriteLinkFile() error { + fileName := p.name + "_autogen_link.go" + filePath := filepath.Join(p.outputDir, fileName) + p.p.SetCurFile(fileName, true) + p.linkLib(p.cvt.cppgConf.Libs) + if err := p.p.WriteFile(filePath, fileName); err != nil { + return fmt.Errorf("failed to write file: %w", err) + } + return nil +} + // WriteToBuffer writes the Go file to a buffer. // Include the aliased file for debug func (p *Package) WriteToBuffer(headerFile string) (*bytes.Buffer, error) { diff --git a/chore/gogensig/gogensig.go b/chore/gogensig/gogensig.go index 2a62b0a4e..ae0942bad 100644 --- a/chore/gogensig/gogensig.go +++ b/chore/gogensig/gogensig.go @@ -83,7 +83,9 @@ func main() { inputdata, err := unmarshal.UnmarshalFileSet(data) check(err) - err = p.ProcessFileSet(inputdata) + err = p.ProcessFileSet(inputdata, func() { + astConvert.WriteLinkFile() + }) check(err) } diff --git a/chore/gogensig/processor/processor.go b/chore/gogensig/processor/processor.go index b4443a11e..15f753234 100644 --- a/chore/gogensig/processor/processor.go +++ b/chore/gogensig/processor/processor.go @@ -79,11 +79,14 @@ func (p *DocFileSetProcessor) visitFile(docVisitor *DocVisitorManager, file unma p.visitedFile[file.Path] = struct{}{} } -func (p *DocFileSetProcessor) ProcessFileSet(files unmarshal.FileSet) error { +func (p *DocFileSetProcessor) ProcessFileSet(files unmarshal.FileSet, done func()) error { docVisitor := NewDocVisitorManager(p.docVisitorList) for _, file := range files { p.visitFile(docVisitor, file, files) } + if done != nil { + done() + } return nil } @@ -92,7 +95,7 @@ func (p *DocFileSetProcessor) ProcessFileSetFromByte(data []byte) error { if err != nil { return err } - return p.ProcessFileSet(fileSet) + return p.ProcessFileSet(fileSet, nil) } func (p *DocFileSetProcessor) ProcessFileSetFromPath(filePath string) error { diff --git a/chore/gogensig/unmarshal/unmarshal.go b/chore/gogensig/unmarshal/unmarshal.go index 8fbcd7afe..2dfdfa914 100644 --- a/chore/gogensig/unmarshal/unmarshal.go +++ b/chore/gogensig/unmarshal/unmarshal.go @@ -615,10 +615,10 @@ func UnmarshalFile(data []byte) (ast.Node, error) { Decls: []ast.Decl{}, } - for _, declData := range file.Decls { + for i, declData := range file.Decls { decl, err := UnmarshalNode(declData) if err != nil { - return nil, fmt.Errorf("error unmarshalling Decl in File: %w", err) + return nil, fmt.Errorf("error unmarshalling %d Decl in File: %w", i, err) } result.Decls = append(result.Decls, decl.(ast.Decl)) } From 4ce67e89e0fca1b44eb92bf8c4e63ab1062dfdff Mon Sep 17 00:00:00 2001 From: tsingbx Date: Thu, 24 Oct 2024 10:21:45 +0800 Subject: [PATCH 2/2] add TestLinkFile --- chore/gogensig/convert/package.go | 7 ++--- chore/gogensig/convert/package_test.go | 31 +++++++++++++++++++++- chore/gogensig/unmarshal/unmarshal_test.go | 2 +- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/chore/gogensig/convert/package.go b/chore/gogensig/convert/package.go index 6fa1e2f7a..f3a5e381c 100644 --- a/chore/gogensig/convert/package.go +++ b/chore/gogensig/convert/package.go @@ -62,6 +62,7 @@ func NewPackage(config *PackageConfig) *Package { typeMap := NewBuiltinTypeMapWithPkgRefS(clib, p.p.Unsafe()) p.cvt = NewConv(p.p.Types, typeMap) p.newTypes = make(map[string]struct{}, 0) + p.SetCurFile(p.Name(), false) return p } @@ -255,15 +256,15 @@ func (p *Package) Write(headerFile string) error { return nil } -func (p *Package) WriteLinkFile() error { +func (p *Package) WriteLinkFile() (string, error) { fileName := p.name + "_autogen_link.go" filePath := filepath.Join(p.outputDir, fileName) p.p.SetCurFile(fileName, true) p.linkLib(p.cvt.cppgConf.Libs) if err := p.p.WriteFile(filePath, fileName); err != nil { - return fmt.Errorf("failed to write file: %w", err) + return "", fmt.Errorf("failed to write file: %w", err) } - return nil + return filePath, nil } // WriteToBuffer writes the Go file to a buffer. diff --git a/chore/gogensig/convert/package_test.go b/chore/gogensig/convert/package_test.go index 12a5b7410..5fc613b35 100644 --- a/chore/gogensig/convert/package_test.go +++ b/chore/gogensig/convert/package_test.go @@ -19,6 +19,36 @@ func init() { convert.SetDebug(convert.DbgFlagAll) } +func TestLinkFileOK(t *testing.T) { + tempDir, err := os.MkdirTemp("", "test_package_link") + if err != nil { + t.Fatalf("Failed to create temporary directory: %v", err) + } + defer os.RemoveAll(tempDir) + + pkg := createTestPkg(t, tempDir) + pkg.SetCppgConf(&cppgtypes.Config{ + Libs: "pkg-config --libs libcjson", + }) + filePath, _ := pkg.WriteLinkFile() + _, err = os.Stat(filePath) + if os.IsNotExist(err) { + t.FailNow() + } +} + +func TestLinkFileFail(t *testing.T) { + defer func() { + if e := recover(); e == nil { + t.FailNow() + } else { + t.Log("success!") + } + }() + pkg := createTestPkg(t, "") + pkg.WriteLinkFile() +} + func TestToType(t *testing.T) { pkg := createTestPkg(t, "") @@ -75,7 +105,6 @@ func TestSetCppgConf(t *testing.T) { ` package testpkg import _ "unsafe" - const LLGoPackage string = "link: pkg-config --libs lua5.4;" `) } diff --git a/chore/gogensig/unmarshal/unmarshal_test.go b/chore/gogensig/unmarshal/unmarshal_test.go index 40c9db703..92f6ff73e 100644 --- a/chore/gogensig/unmarshal/unmarshal_test.go +++ b/chore/gogensig/unmarshal/unmarshal_test.go @@ -2086,7 +2086,7 @@ func TestUnmarshalErrors(t *testing.T) { name: "unmarshalFile - Invalid Decl", fn: unmarshal.UnmarshalFile, input: `{"decls": [{"_Type": "InvalidType"}], "includes": [], "macros": []}`, - expectedErr: "error unmarshalling Decl in File", + expectedErr: "error unmarshalling 0 Decl in File", }, }