Source file src/go/internal/gcimporter/genmeth_test.go

     1  // Copyright 2026 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build goexperiment.genericmethods
     6  
     7  package gcimporter_test
     8  
     9  import (
    10  	"internal/testenv"
    11  	"os"
    12  	"path/filepath"
    13  	"runtime"
    14  	"testing"
    15  
    16  	"go/ast"
    17  	"go/parser"
    18  	"go/token"
    19  	"go/types"
    20  
    21  	. "go/internal/gcimporter"
    22  )
    23  
    24  func TestGenMeth(t *testing.T) {
    25  	testenv.MustHaveGoBuild(t)
    26  
    27  	// This package only handles gc export data.
    28  	if runtime.Compiler != "gc" {
    29  		t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
    30  	}
    31  
    32  	tmpdir := t.TempDir()
    33  	testoutdir := filepath.Join(tmpdir, "testdata")
    34  	if err := os.Mkdir(testoutdir, 0700); err != nil {
    35  		t.Fatalf("making output dir: %v", err)
    36  	}
    37  
    38  	compile(t, "testdata", "genmeth.go", testoutdir, nil)
    39  
    40  	fset := token.NewFileSet()
    41  
    42  	genmeth, err := Import(fset, make(map[string]*types.Package), "./testdata/genmeth", tmpdir, nil)
    43  	if err != nil {
    44  		t.Fatal(err)
    45  	}
    46  
    47  	check := func(pkgname, src string, imports importMap) (*types.Package, error) {
    48  		f, err := parser.ParseFile(fset, "genmeth.go", src, 0)
    49  		if err != nil {
    50  			return nil, err
    51  		}
    52  		config := &types.Config{
    53  			Importer: imports,
    54  		}
    55  		return config.Check(pkgname, fset, []*ast.File{f}, nil)
    56  	}
    57  
    58  	const pSrc = `package p
    59  
    60  import "genmeth"
    61  
    62  func _() {
    63  	var ex func(int) genmeth.List[int]
    64  	var fl func(genmeth.List[int]) genmeth.List[int]
    65  
    66  	var l genmeth.List[int]
    67  	l = l.Map(ex).FlatMap(fl)
    68  
    69  	var bl genmeth.BiList[int, any]
    70  	bl = bl.MapKeys(ex).Flip().FlatMapValues(fl).Flip()
    71  
    72  	var id func(int) int
    73  
    74  	var op genmeth.Option[int]
    75  	var _ int = op.MapIfPresent(id).Get()
    76  
    77  	var ol genmeth.OrderedList[int]
    78  	var _ int = ol.Min().Get()
    79  
    80  	var b genmeth.Box[int]
    81  	b.Set(42)
    82  	var _ int = b.Get()
    83  }
    84  `
    85  
    86  	importer := importMap{
    87  		"genmeth": genmeth,
    88  	}
    89  	if _, err := check("p", pSrc, importer); err != nil {
    90  		t.Errorf("Check failed: %v", err)
    91  	}
    92  }
    93  

View as plain text