GoPLS Viewer

Home|gopls/go/ssa/const_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_test
6
7import (
8    "go/ast"
9    "go/constant"
10    "go/parser"
11    "go/token"
12    "go/types"
13    "math/big"
14    "strings"
15    "testing"
16
17    "golang.org/x/tools/go/ssa"
18    "golang.org/x/tools/internal/typeparams"
19)
20
21func TestConstString(t *testing.T) {
22    if !typeparams.Enabled {
23        t.Skip("TestConstString requires type parameters.")
24    }
25
26    const source = `
27    package P
28
29    type Named string
30
31    func fn() (int, bool, string) 
32    func gen[T int]() {}
33    `
34    fset := token.NewFileSet()
35    ferr := parser.ParseFile(fset"p.go"source0)
36    if err != nil {
37        t.Fatal(err)
38    }
39
40    var conf types.Config
41    pkgerr := conf.Check("P"fset, []*ast.File{f}, nil)
42    if err != nil {
43        t.Fatal(err)
44    }
45
46    for _test := range []struct {
47        expr     string      // type expression
48        constant interface{} // constant value
49        want     string      // expected String() value
50    }{
51        {"int"int64(0), "0:int"},
52        {"int64"int64(0), "0:int64"},
53        {"float32"int64(0), "0:float32"},
54        {"float32"big.NewFloat(1.5), "1.5:float32"},
55        {"bool"false"false:bool"},
56        {"string"""`"":string`},
57        {"Named"""`"":P.Named`},
58        {"struct{x string}"nil"struct{x string}{}:struct{x string}"},
59        {"[]int"nil"nil:[]int"},
60        {"[3]int"nil"[3]int{}:[3]int"},
61        {"*int"nil"nil:*int"},
62        {"interface{}"nil"nil:interface{}"},
63        {"interface{string}"nil`"":interface{string}`},
64        {"interface{int|int64}"nil"0:interface{int|int64}"},
65        {"interface{bool}"nil"false:interface{bool}"},
66        {"interface{bool|int}"nil"nil:interface{bool|int}"},
67        {"interface{int|string}"nil"nil:interface{int|string}"},
68        {"interface{bool|string}"nil"nil:interface{bool|string}"},
69        {"interface{struct{x string}}"nil"nil:interface{struct{x string}}"},
70        {"interface{int|int64}"int64(1), "1:interface{int|int64}"},
71        {"interface{~bool}"true"true:interface{~bool}"},
72        {"interface{Named}""lorem ipsum"`"lorem ipsum":interface{P.Named}`},
73        {"func() (int, bool, string)"nil"nil:func() (int, bool, string)"},
74    } {
75        // Eval() expr for its type.
76        tverr := types.Eval(fsetpkg0test.expr)
77        if err != nil {
78            t.Fatalf("Eval(%s) failed: %v"test.exprerr)
79        }
80        var val constant.Value
81        if test.constant != nil {
82            val = constant.Make(test.constant)
83        }
84        c := ssa.NewConst(valtv.Type)
85        got := strings.ReplaceAll(c.String(), " | ""|"// Accept both interface{a | b} and interface{a|b}.
86        if got != test.want {
87            t.Errorf("ssa.NewConst(%v, %s).String() = %v, want %v"valtv.Typegottest.want)
88        }
89    }
90
91    // Test tuples
92    fn := pkg.Scope().Lookup("fn")
93    tup := fn.Type().(*types.Signature).Results()
94    if gotwant := ssa.NewConst(niltup).String(), `(0, false, ""):(int, bool, string)`got != want {
95        t.Errorf("ssa.NewConst(%v, %s).String() = %v, want %v"niltupgotwant)
96    }
97
98    // Test type-param
99    gen := pkg.Scope().Lookup("gen")
100    tp := typeparams.ForSignature(gen.Type().(*types.Signature)).At(0)
101    if gotwant := ssa.NewConst(niltp).String(), "0:T"got != want {
102        t.Errorf("ssa.NewConst(%v, %s).String() = %v, want %v"niltupgotwant)
103    }
104}
105
MembersX
TestConstString.fn
TestConstString.want
big
TestConstString
TestConstString.pkg
TestConstString.RangeStmt_820.BlockStmt.tv
TestConstString.RangeStmt_820.BlockStmt.c
TestConstString.RangeStmt_820.BlockStmt.got
TestConstString.tp
TestConstString.source
TestConstString.f
TestConstString.got
TestConstString.gen
TestConstString.t
TestConstString.fset
TestConstString.conf
TestConstString.RangeStmt_820.BlockStmt.err
TestConstString.tup
TestConstString.err
TestConstString.RangeStmt_820.test
TestConstString.RangeStmt_820.BlockStmt.val
Members
X