12 "golang.org/x/tools/go/types/typeutil"
15 func TestIntuitiveMethodSet(t *testing.T) {
23 fset := token.NewFileSet()
24 f, err := parser.ParseFile(fset, "hello.go", source, 0)
30 pkg, err := conf.Check("P", fset, []*ast.File{f}, nil)
34 qual := types.RelativeTo(pkg)
36 for _, test := range []struct {
37 expr string // type expression
38 want string // intuitive method set
40 {"A", "(A).f (*A).g"},
41 {"*A", "(*A).f (*A).g"},
42 {"error", "(error).Error"},
44 {"struct{A}", "(struct{A}).f (*struct{A}).g"},
45 {"*struct{A}", "(*struct{A}).f (*struct{A}).g"},
47 tv, err := types.Eval(fset, pkg, 0, test.expr)
49 t.Errorf("Eval(%s) failed: %v", test.expr, err)
52 for _, m := range typeutil.IntuitiveMethodSet(tv.Type, nil) {
53 name := fmt.Sprintf("(%s).%s", types.TypeString(m.Recv(), qual), m.Obj().Name())
54 names = append(names, name)
56 got := strings.Join(names, " ")
58 t.Errorf("IntuitiveMethodSet(%s) = %q, want %q", test.expr, got, test.want)