diff --git a/cl/rewrite_internal_test.go b/cl/rewrite_internal_test.go new file mode 100644 index 00000000..6c542bc3 --- /dev/null +++ b/cl/rewrite_internal_test.go @@ -0,0 +1,67 @@ +//go:build !llgo +// +build !llgo + +package cl + +import ( + "go/ast" + "go/parser" + "go/token" + "go/types" + "runtime" + "strings" + "testing" + + gpackages "github.com/goplus/gogen/packages" + llssa "github.com/goplus/llgo/ssa" + "github.com/goplus/llgo/ssa/ssatest" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" +) + +func init() { + llssa.Initialize(llssa.InitAll | llssa.InitNative) +} + +func compileWithRewrites(t *testing.T, src string, rewrites map[string]string) string { + t.Helper() + fset := token.NewFileSet() + file, err := parser.ParseFile(fset, "rewrite.go", src, 0) + if err != nil { + t.Fatalf("parse failed: %v", err) + } + importer := gpackages.NewImporter(fset) + mode := ssa.SanityCheckFunctions | ssa.InstantiateGenerics + pkg, _, err := ssautil.BuildPackage(&types.Config{Importer: importer}, fset, + types.NewPackage(file.Name.Name, file.Name.Name), []*ast.File{file}, mode) + if err != nil { + t.Fatalf("build package failed: %v", err) + } + prog := ssatest.NewProgramEx(t, nil, importer) + prog.TypeSizes(types.SizesFor("gc", runtime.GOARCH)) + ret, _, err := NewPackageEx(prog, nil, rewrites, pkg, []*ast.File{file}) + if err != nil { + t.Fatalf("NewPackageEx failed: %v", err) + } + return ret.String() +} + +func TestRewriteGlobalStrings(t *testing.T) { + const src = `package rewritepkg +var VarInit = "original_value" +var VarPlain string +func Use() string { return VarInit + VarPlain } +` + ir := compileWithRewrites(t, src, map[string]string{ + "VarInit": "rewrite_init", + "VarPlain": "rewrite_plain", + }) + if strings.Contains(ir, "original_value") { + t.Fatalf("original initializer still present:\n%s", ir) + } + for _, want := range []string{`c"rewrite_init"`, `c"rewrite_plain"`} { + if !strings.Contains(ir, want) { + t.Fatalf("missing %s in IR:\n%s", want, ir) + } + } +}