From 6716d242a443db6b50fc69b66c27749f97039d59 Mon Sep 17 00:00:00 2001 From: visualfc Date: Fri, 8 Nov 2024 11:42:00 +0800 Subject: [PATCH] fix autoNames check importName --- import.go | 9 +++--- package.go | 2 +- package_test.go | 82 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 6 deletions(-) diff --git a/import.go b/import.go index f18d63c4..ccada72b 100644 --- a/import.go +++ b/import.go @@ -585,7 +585,6 @@ func (p *Package) big() PkgRef { type null struct{} type autoNames struct { names map[string]null - reqIdx int autoIdx int } @@ -611,14 +610,14 @@ func (p *autoNames) hasName(name string) bool { return ok } -func (p *autoNames) requireName(name string) (ret string, renamed bool) { +func (p *autoNames) importName(name string) (ret string, renamed bool) { ret = name + var idx int for p.hasName(ret) { - p.reqIdx++ - ret = name + strconv.Itoa(p.reqIdx) + idx++ + ret = name + strconv.Itoa(idx) renamed = true } - p.useName(ret) return } diff --git a/package.go b/package.go index 9e54cd8a..d06b7c27 100644 --- a/package.go +++ b/package.go @@ -192,7 +192,7 @@ func (p astVisitor) Visit(node ast.Node) (w ast.Visitor) { if id, ok := x.(*ast.Ident); ok && id.Obj != nil { if used, ok := id.Obj.Data.(importUsed); ok && bool(!used) { id.Obj.Data = importUsed(true) - if name, renamed := p.this.requireName(id.Name); renamed { + if name, renamed := p.this.importName(id.Name); renamed { id.Name = name id.Obj.Name = name } diff --git a/package_test.go b/package_test.go index db6729d9..e421786e 100644 --- a/package_test.go +++ b/package_test.go @@ -2563,6 +2563,88 @@ func main() { `) } +func TestMultiFiles(t *testing.T) { + pkg := newMainPackage() + + _, err := pkg.SetCurFile("a.go", true) + if err != nil { + t.Fatal("pkg.SetCurFile failed:", err) + } + fmt := pkg.Import("fmt") + pkg.NewFunc(nil, "main", nil, nil, false).BodyStart(pkg). + Val(fmt.Ref("Println")).Val("Hello").Call(1).EndStmt(). + End() + + _, err = pkg.SetCurFile("b.go", true) + if err != nil { + t.Fatal("pkg.SetCurFile failed:", err) + } + pkg.NewFunc(nil, "demo", nil, nil, false).BodyStart(pkg). + Val(fmt.Ref("Println")).Val("Hello").Call(1).EndStmt(). + End() + + domTestEx(t, pkg, `package main + +import "fmt" + +func main() { + fmt.Println("Hello") +} +`, "a.go") + + domTestEx(t, pkg, `package main + +import "fmt" + +func demo() { + fmt.Println("Hello") +} +`, "b.go") +} + +func TestImportMultiFiles(t *testing.T) { + pkg := newMainPackage() + + _, err := pkg.SetCurFile("a.go", true) + if err != nil { + t.Fatal("pkg.SetCurFile failed:", err) + } + fmt := pkg.Import("fmt") + v := pkg.NewParam(token.NoPos, "v", types.NewSlice(gogen.TyByte)) + pkg.NewFunc(nil, "fmt", gogen.NewTuple(v), nil, false).BodyStart(pkg).End() + pkg.NewFunc(nil, "main", nil, nil, false).BodyStart(pkg). + Val(fmt.Ref("Println")).Val("Hello").Call(1).EndStmt(). + End() + + _, err = pkg.SetCurFile("b.go", true) + if err != nil { + t.Fatal("pkg.SetCurFile failed:", err) + } + pkg.NewFunc(nil, "demo", nil, nil, false).BodyStart(pkg). + Val(fmt.Ref("Println")).Val("Hello").Call(1).EndStmt(). + End() + + domTestEx(t, pkg, `package main + +import fmt1 "fmt" + +func fmt(v []byte) { +} +func main() { + fmt1.Println("Hello") +} +`, "a.go") + + domTestEx(t, pkg, `package main + +import fmt1 "fmt" + +func demo() { + fmt1.Println("Hello") +} +`, "b.go") +} + func TestImportUnused(t *testing.T) { pkg := newMainPackage() pkg.Import("fmt")