diff --git a/cl/internal/convert/convert.go b/cl/internal/convert/convert.go index 111c60c1..7cf44f67 100644 --- a/cl/internal/convert/convert.go +++ b/cl/internal/convert/convert.go @@ -1,12 +1,14 @@ package convert import ( + "fmt" "log" "strings" "github.com/goplus/llcppg/ast" cfg "github.com/goplus/llcppg/cmd/gogensig/config" llconfig "github.com/goplus/llcppg/config" + "github.com/goplus/mod/gopmod" ) type dbgFlags = int @@ -72,6 +74,10 @@ type Converter struct { } func NewConverter(config *Config) (*Converter, error) { + mod, err := gopmod.Load(config.OutputDir) + if err != nil { + return nil, fmt.Errorf("failed to load mod: %w", err) + } pkg, err := NewPackage(&PackageConfig{ PkgBase: PkgBase{ PkgPath: config.PkgPath, @@ -79,11 +85,11 @@ func NewConverter(config *Config) (*Converter, error) { Pubs: config.TypeMap, }, Name: config.PkgName, - OutputDir: config.OutputDir, ConvSym: config.ConvSym, LibCommand: config.Libs, TrimPrefixes: config.TrimPrefixes, KeepUnderScore: config.KeepUnderScore, + Mod: mod, }) if err != nil { return nil, err diff --git a/cl/internal/convert/convert_builtin_test.go b/cl/internal/convert/convert_builtin_test.go index 708f00a7..38ac0030 100644 --- a/cl/internal/convert/convert_builtin_test.go +++ b/cl/internal/convert/convert_builtin_test.go @@ -50,7 +50,6 @@ func basicConverter() *Converter { func TestPkgFail(t *testing.T) { converter := basicConverter() - defer os.RemoveAll(converter.GenPkg.conf.OutputDir) t.Run("ProcessFail", func(t *testing.T) { defer func() { checkPanic(t, recover(), "File \"noexist.h\" not found in FileMap") diff --git a/cl/internal/convert/convert_test.go b/cl/internal/convert/convert_test.go index 3c168fe0..08770e07 100644 --- a/cl/internal/convert/convert_test.go +++ b/cl/internal/convert/convert_test.go @@ -309,7 +309,6 @@ func testFrom(t *testing.T, dir string, gen bool, validateFunc func(t *testing.T } func TestNewConvert(t *testing.T) { - // todo: remove this,convert will not read llcppg.cfg directly cfg := &llcppg.Config{ Libs: "${pkg-config --libs xxx}", } @@ -330,6 +329,15 @@ func TestNewConvert(t *testing.T) { } } +func TestNewConverterFail(t *testing.T) { + _, err := convert.NewConverter(&convert.Config{ + OutputDir: "/invalid/path", + }) + if err == nil { + t.Fatal("Expected error, but got nil") + } +} + func TestModInitFail(t *testing.T) { tempDir, err := os.MkdirTemp("", "gogensig-test") if err != nil { diff --git a/cl/internal/convert/package.go b/cl/internal/convert/package.go index 3dc6a3e5..9f283529 100644 --- a/cl/internal/convert/package.go +++ b/cl/internal/convert/package.go @@ -50,7 +50,7 @@ type Package struct { type PackageConfig struct { PkgBase Name string // current package name - OutputDir string + Mod *gopmod.Module ConvSym func(name *ast.Object, mangleName string) (goName string, err error) GenConf *gogen.Config TrimPrefixes []string @@ -87,15 +87,10 @@ func NewPackage(config *PackageConfig) (*Package, error) { config.Deps = append([]string{"c"}, config.Deps...) } - mod, err := gopmod.Load(config.OutputDir) - if err != nil { - return nil, fmt.Errorf("failed to load mod: %w", err) - } - p.PkgInfo = NewPkgInfo(config.PkgPath, config.Deps, config.Pubs) - pkgManager := NewPkgDepLoader(mod, p.p) - err = pkgManager.InitDeps(p.PkgInfo) + pkgManager := NewPkgDepLoader(config.Mod, p.p) + err := pkgManager.InitDeps(p.PkgInfo) if err != nil { return nil, fmt.Errorf("failed to init deps: %w", err) } diff --git a/cl/internal/convert/package_bulitin_test.go b/cl/internal/convert/package_bulitin_test.go index 6af627be..c02b6b6e 100644 --- a/cl/internal/convert/package_bulitin_test.go +++ b/cl/internal/convert/package_bulitin_test.go @@ -11,17 +11,22 @@ import ( "github.com/goplus/llcppg/cl/internal/cltest" llcppg "github.com/goplus/llcppg/config" ctoken "github.com/goplus/llcppg/token" + "github.com/goplus/mod/gopmod" ) func emptyPkg() *Package { + mod, err := gopmod.Load(".") + if err != nil { + panic(err) + } pkg, err := NewPackage(&PackageConfig{ PkgBase: PkgBase{ PkgPath: ".", Pubs: make(map[string]string), }, Name: "testpkg", + Mod: mod, GenConf: &gogen.Config{}, - OutputDir: "", ConvSym: cltest.NewConvSym(), LibCommand: "${pkg-config --libs xxx}", }) @@ -156,6 +161,10 @@ func TestGetNameType(t *testing.T) { } func TestTrimPrefixes(t *testing.T) { + mod, err := gopmod.Load(".") + if err != nil { + panic(err) + } pkg, err := NewPackage(&PackageConfig{ PkgBase: PkgBase{ PkgPath: ".", @@ -163,10 +172,10 @@ func TestTrimPrefixes(t *testing.T) { }, Name: "testpkg", GenConf: &gogen.Config{}, - OutputDir: "", ConvSym: cltest.NewConvSym(), TrimPrefixes: []string{"prefix1", "prefix2"}, LibCommand: "${pkg-config --libs xxx}", + Mod: mod, }) if err != nil { t.Fatal("NewPackage failed:", err) diff --git a/cl/internal/convert/package_test.go b/cl/internal/convert/package_test.go index a5fefd97..af08b0a3 100644 --- a/cl/internal/convert/package_test.go +++ b/cl/internal/convert/package_test.go @@ -2,6 +2,7 @@ package convert_test import ( "bytes" + "fmt" "os" "strings" "testing" @@ -108,7 +109,6 @@ type U struct { func TestToType(t *testing.T) { pkg, err := createTestPkg(&convert.PackageConfig{ - OutputDir: "", LibCommand: "${pkg-config --libs libcjson}", }) if err != nil { @@ -151,9 +151,7 @@ func TestToType(t *testing.T) { } func TestToTypeFail(t *testing.T) { - pkg, err := createTestPkg(&convert.PackageConfig{ - OutputDir: "", - }) + pkg, err := createTestPkg(&convert.PackageConfig{}) if err != nil { t.Fatal("NewPackage failed:", err) } @@ -1081,7 +1079,6 @@ type Foo func(a c.Int, b c.Int) c.Int // Test Redefine error func TestRedef(t *testing.T) { pkg, err := createTestPkg(&convert.PackageConfig{ - OutputDir: "", ConvSym: cltest.NewConvSym( cltest.SymbolEntry{ CppName: "Bar", MangleName: "Bar", GoName: "Bar", @@ -1710,7 +1707,6 @@ type Foo struct { func TestForwardDecl(t *testing.T) { pkg, err := createTestPkg(&convert.PackageConfig{ - OutputDir: "", ConvSym: cltest.NewConvSym( cltest.SymbolEntry{ CppName: "Bar", MangleName: "Bar", GoName: "Bar", @@ -1857,6 +1853,13 @@ func createTestPkg(cfg *convert.PackageConfig) (*convert.Package, error) { if cfg.LibCommand == "" { cfg.LibCommand = "${pkg-config --libs xxx}" } + if cfg.Mod == nil { + mod, err := gopmod.Load(".") + if err != nil { + return nil, fmt.Errorf("failed to load mod: %w", err) + } + cfg.Mod = mod + } return convert.NewPackage(&convert.PackageConfig{ PkgBase: convert.PkgBase{ PkgPath: ".", @@ -1865,11 +1868,11 @@ func createTestPkg(cfg *convert.PackageConfig) (*convert.Package, error) { }, Name: "testpkg", GenConf: &gogen.Config{}, - OutputDir: cfg.OutputDir, ConvSym: cfg.ConvSym, LibCommand: cfg.LibCommand, TrimPrefixes: cfg.TrimPrefixes, KeepUnderScore: cfg.KeepUnderScore, + Mod: cfg.Mod, }) } @@ -1893,7 +1896,6 @@ func comparePackageOutput(t *testing.T, pkg *convert.Package, expect string) { func TestTypeClean(t *testing.T) { pkg, err := createTestPkg(&convert.PackageConfig{ - OutputDir: "", ConvSym: cltest.NewConvSym( cltest.SymbolEntry{CppName: "Func1", MangleName: "Func1", GoName: "Func1"}, cltest.SymbolEntry{CppName: "Func2", MangleName: "Func2", GoName: "Func2"}, @@ -2036,7 +2038,6 @@ func TestImport(t *testing.T) { }) t.Run("invalid pub file", func(t *testing.T) { _, err := createTestPkg(&convert.PackageConfig{ - OutputDir: ".", PkgBase: convert.PkgBase{ Deps: []string{ "github.com/goplus/llcppg/cl/internal/convert/testdata/invalidpub", @@ -2049,7 +2050,6 @@ func TestImport(t *testing.T) { }) t.Run("invalid dep", func(t *testing.T) { _, err := createTestPkg(&convert.PackageConfig{ - OutputDir: ".", PkgBase: convert.PkgBase{ Deps: []string{ "github.com/goplus/llcppg/cl/internal/convert/testdata/invaliddep", @@ -2062,7 +2062,6 @@ func TestImport(t *testing.T) { }) t.Run("same type register", func(t *testing.T) { _, err := createTestPkg(&convert.PackageConfig{ - OutputDir: ".", PkgBase: convert.PkgBase{ Deps: []string{ "github.com/goplus/llcppg/cl/internal/convert/testdata/cjson", @@ -2086,11 +2085,16 @@ func TestUnkownHfile(t *testing.T) { } func TestNewPackageLinkFail(t *testing.T) { - _, err := convert.NewPackage(&convert.PackageConfig{ + mod, err := gopmod.Load(".") + if err != nil { + t.Fatal(err) + } + _, err = convert.NewPackage(&convert.PackageConfig{ PkgBase: convert.PkgBase{ PkgPath: ".", }, Name: "testpkg", + Mod: mod, GenConf: &gogen.Config{}, }) if err == nil { diff --git a/cl/internal/convert/type_builtin_test.go b/cl/internal/convert/type_builtin_test.go index 54190194..e7001884 100644 --- a/cl/internal/convert/type_builtin_test.go +++ b/cl/internal/convert/type_builtin_test.go @@ -8,6 +8,7 @@ import ( "github.com/goplus/gogen" "github.com/goplus/llcppg/ast" "github.com/goplus/llcppg/cl/internal/cltest" + "github.com/goplus/mod/gopmod" ) func TestIdentRef(t *testing.T) { @@ -19,15 +20,19 @@ func TestIdentRef(t *testing.T) { } func TestSubstObj(t *testing.T) { + mod, err := gopmod.Load(".") + if err != nil { + panic(err) + } pkg, err := NewPackage(&PackageConfig{ PkgBase: PkgBase{ PkgPath: ".", }, Name: "testpkg", GenConf: &gogen.Config{}, - OutputDir: "", ConvSym: cltest.NewConvSym(), LibCommand: "${pkg-config --libs xxx}", + Mod: mod, }) if err != nil { t.Fatal("NewPackage failed")