GoPLS Viewer

Home|gopls/go/ssa/parameterized_test.go
1// Copyright 2022 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
5package ssa
6
7import (
8    "go/ast"
9    "go/parser"
10    "go/token"
11    "go/types"
12    "testing"
13
14    "golang.org/x/tools/internal/typeparams"
15)
16
17func TestIsParameterized(t *testing.T) {
18    if !typeparams.Enabled {
19        return
20    }
21
22    const source = `
23package P
24type A int
25func (A) f()
26func (*A) g()
27
28type fer interface { f() }
29
30func Apply[T fer](x T) T {
31    x.f()
32    return x
33}
34
35type V[T any] []T
36func (v *V[T]) Push(x T) { *v = append(*v, x) }
37`
38
39    fset := token.NewFileSet()
40    ferr := parser.ParseFile(fset"hello.go"source0)
41    if err != nil {
42        t.Fatal(err)
43    }
44
45    var conf types.Config
46    pkgerr := conf.Check("P"fset, []*ast.File{f}, nil)
47    if err != nil {
48        t.Fatal(err)
49    }
50
51    for _test := range []struct {
52        expr string // type expression
53        want bool   // expected isParameterized value
54    }{
55        {"A"false},
56        {"*A"false},
57        {"error"false},
58        {"*error"false},
59        {"struct{A}"false},
60        {"*struct{A}"false},
61        {"fer"false},
62        {"Apply"true},
63        {"Apply[A]"false},
64        {"V"true},
65        {"V[A]"false},
66        {"*V[A]"false},
67        {"(*V[A]).Push"false},
68    } {
69        tverr := types.Eval(fsetpkg0test.expr)
70        if err != nil {
71            t.Errorf("Eval(%s) failed: %v"test.exprerr)
72        }
73
74        param := tpWalker{seenmake(map[types.Type]bool)}
75        if got := param.isParameterized(tv.Type); got != test.want {
76            t.Logf("Eval(%s) returned the type %s"test.exprtv.Type)
77            t.Errorf("isParameterized(%s) = %v, want %v"test.exprgottest.want)
78        }
79    }
80}
81
MembersX
TestIsParameterized.source
TestIsParameterized.f
TestIsParameterized.RangeStmt_815.test
TestIsParameterized.RangeStmt_815.BlockStmt.tv
TestIsParameterized.conf
TestIsParameterized.pkg
TestIsParameterized.RangeStmt_815.BlockStmt.err
TestIsParameterized.RangeStmt_815.BlockStmt.param
TestIsParameterized
TestIsParameterized.t
TestIsParameterized.fset
TestIsParameterized.err
TestIsParameterized.RangeStmt_815.BlockStmt.got
Members
X