| // Copyright 2026 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| //go:build goexperiment.genericmethods |
| |
| package importer |
| |
| import ( |
| "cmd/compile/internal/syntax" |
| "cmd/compile/internal/types2" |
| "internal/testenv" |
| "os" |
| "path/filepath" |
| "runtime" |
| "strings" |
| "testing" |
| ) |
| |
| func TestGenMeth(t *testing.T) { |
| testenv.MustHaveGoBuild(t) |
| |
| // This package only handles gc export data. |
| if runtime.Compiler != "gc" { |
| t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler) |
| } |
| |
| tmpdir := t.TempDir() |
| testoutdir := filepath.Join(tmpdir, "testdata") |
| if err := os.Mkdir(testoutdir, 0700); err != nil { |
| t.Fatalf("making output dir: %v", err) |
| } |
| |
| compile(t, "testdata", "genmeth.go", testoutdir, nil) |
| |
| genmeth, err := Import(make(map[string]*types2.Package), "./testdata/genmeth", tmpdir, nil) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| check := func(pkgname, src string, imports importMap) (*types2.Package, error) { |
| f, err := syntax.Parse(syntax.NewFileBase(pkgname), strings.NewReader(src), nil, nil, 0) |
| if err != nil { |
| return nil, err |
| } |
| config := &types2.Config{ |
| Importer: imports, |
| } |
| return config.Check(pkgname, []*syntax.File{f}, nil) |
| } |
| |
| const pSrc = `package p |
| |
| import "genmeth" |
| |
| func _() { |
| var ex func(int) genmeth.List[int] |
| var fl func(genmeth.List[int]) genmeth.List[int] |
| |
| var l genmeth.List[int] |
| l = l.Map(ex).FlatMap(fl) |
| |
| var bl genmeth.BiList[int, any] |
| bl = bl.MapKeys(ex).Flip().FlatMapValues(fl).Flip() |
| |
| var id func(int) int |
| |
| var op genmeth.Option[int] |
| var _ int = op.MapIfPresent(id).Get() |
| |
| var ol genmeth.OrderedList[int] |
| var _ int = ol.Min().Get() |
| |
| var b genmeth.Box[int] |
| b.Set(42) |
| var _ int = b.Get() |
| } |
| ` |
| |
| importer := importMap{ |
| "genmeth": genmeth, |
| } |
| if _, err := check("p", pSrc, importer); err != nil { |
| t.Errorf("Check failed: %v", err) |
| } |
| } |