OXIESEC PANEL
- Current Dir:
/
/
opt
/
golang
/
1.19.4
/
src
/
go
/
types
Server IP: 2a02:4780:11:1084:0:327f:3464:10
Upload:
Create Dir:
Name
Size
Modified
Perms
📁
..
-
12/01/2022 06:13:56 PM
rwxr-xr-x
📄
api.go
17.05 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
api_test.go
81.16 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
array.go
802 bytes
12/01/2022 06:12:58 PM
rw-r--r--
📄
assignments.go
12.86 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
basic.go
1.48 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
builtins.go
24.28 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
builtins_test.go
9.7 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
call.go
22.29 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
chan.go
909 bytes
12/01/2022 06:12:58 PM
rw-r--r--
📄
check.go
17.32 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
check_test.go
12.11 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
context.go
4.34 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
context_test.go
2.33 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
conversions.go
8.28 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
decl.go
28.77 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
errorcodes.go
31.51 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
errorcodes_test.go
4.95 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
errors.go
9.87 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
errors_test.go
1 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
eval.go
3.05 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
eval_test.go
7.4 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
example_test.go
9.03 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
expr.go
51.97 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
exprstring.go
4.81 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
exprstring_test.go
2.36 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
gccgosizes.go
1.02 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
gotype.go
8.33 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
hilbert_test.go
3.61 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
index.go
11.03 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
infer.go
25.18 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
initorder.go
9.48 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
instantiate.go
9.94 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
instantiate_test.go
6.02 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
interface.go
8.08 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
issues_test.go
17.49 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
labels.go
7.17 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
lookup.go
16.93 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
main_test.go
335 bytes
12/01/2022 06:12:58 PM
rw-r--r--
📄
map.go
658 bytes
12/01/2022 06:12:58 PM
rw-r--r--
📄
methodset.go
6.75 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
methodset_test.go
5.75 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
mono.go
9.05 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
mono_test.go
2.63 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
named.go
22.37 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
named_test.go
2.69 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
object.go
17.92 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
object_test.go
5.21 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
objset.go
927 bytes
12/01/2022 06:12:58 PM
rw-r--r--
📄
operand.go
10 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
package.go
2.38 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
pointer.go
634 bytes
12/01/2022 06:12:58 PM
rw-r--r--
📄
predicates.go
14.71 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
resolver.go
24.38 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
resolver_test.go
4.58 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
return.go
4.21 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
scope.go
9.33 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
selection.go
3.99 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
self_test.go
2.57 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
signature.go
12.49 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
sizeof_test.go
1.26 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
sizes.go
7.56 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
sizes_test.go
3.33 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
slice.go
576 bytes
12/01/2022 06:12:58 PM
rw-r--r--
📄
stdlib_test.go
9.45 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
stmt.go
26.17 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
struct.go
6.04 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
subst.go
10.76 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
termlist.go
3.68 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
termlist_test.go
7.18 KB
12/01/2022 06:12:58 PM
rw-r--r--
📁
testdata
-
12/01/2022 06:13:56 PM
rwxr-xr-x
📄
token_test.go
1.21 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
tuple.go
928 bytes
12/01/2022 06:12:58 PM
rw-r--r--
📄
type.go
2.92 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
typelists.go
1.84 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
typeparam.go
4.74 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
typeset.go
14.22 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
typeset_test.go
2.34 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
typestring.go
10.64 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
typestring_test.go
4.21 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
typeterm.go
3.52 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
typeterm_test.go
5.1 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
typexpr.go
14.64 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
unify.go
18.35 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
union.go
6.22 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
universe.go
7.66 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
validtype.go
7.77 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
version.go
2.2 KB
12/01/2022 06:12:58 PM
rw-r--r--
Editing: eval_test.go
Close
// Copyright 2013 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. // This file contains tests for Eval. package types_test import ( "fmt" "go/ast" "go/importer" "go/parser" "go/token" "internal/goexperiment" "internal/testenv" "strings" "testing" . "go/types" ) func testEval(t *testing.T, fset *token.FileSet, pkg *Package, pos token.Pos, expr string, typ Type, typStr, valStr string) { gotTv, err := Eval(fset, pkg, pos, expr) if err != nil { t.Errorf("Eval(%q) failed: %s", expr, err) return } if gotTv.Type == nil { t.Errorf("Eval(%q) got nil type but no error", expr) return } // compare types if typ != nil { // we have a type, check identity if !Identical(gotTv.Type, typ) { t.Errorf("Eval(%q) got type %s, want %s", expr, gotTv.Type, typ) return } } else { // we have a string, compare type string gotStr := gotTv.Type.String() if gotStr != typStr { t.Errorf("Eval(%q) got type %s, want %s", expr, gotStr, typStr) return } } // compare values gotStr := "" if gotTv.Value != nil { gotStr = gotTv.Value.ExactString() } if gotStr != valStr { t.Errorf("Eval(%q) got value %s, want %s", expr, gotStr, valStr) } } func TestEvalBasic(t *testing.T) { fset := token.NewFileSet() for _, typ := range Typ[Bool : String+1] { testEval(t, fset, nil, token.NoPos, typ.Name(), typ, "", "") } } func TestEvalComposite(t *testing.T) { fset := token.NewFileSet() for _, test := range independentTestTypes { testEval(t, fset, nil, token.NoPos, test.src, nil, test.str, "") } } func TestEvalArith(t *testing.T) { var tests = []string{ `true`, `false == false`, `12345678 + 87654321 == 99999999`, `10 * 20 == 200`, `(1<<500)*2 >> 100 == 2<<400`, `"foo" + "bar" == "foobar"`, `"abc" <= "bcd"`, `len([10]struct{}{}) == 2*5`, } fset := token.NewFileSet() for _, test := range tests { testEval(t, fset, nil, token.NoPos, test, Typ[UntypedBool], "", "true") } } func TestEvalPos(t *testing.T) { testenv.MustHaveGoBuild(t) // The contents of /*-style comments are of the form // expr => value, type // where value may be the empty string. // Each expr is evaluated at the position of the comment // and the result is compared with the expected value // and type. var sources = []string{ ` package p import "fmt" import m "math" const c = 3.0 type T []int func f(a int, s string) float64 { fmt.Println("calling f") _ = m.Pi // use package math const d int = c + 1 var x int x = a + len(s) return float64(x) /* true => true, untyped bool */ /* fmt.Println => , func(a ...any) (n int, err error) */ /* c => 3, untyped float */ /* T => , p.T */ /* a => , int */ /* s => , string */ /* d => 4, int */ /* x => , int */ /* d/c => 1, int */ /* c/2 => 3/2, untyped float */ /* m.Pi < m.E => false, untyped bool */ } `, ` package p /* c => 3, untyped float */ type T1 /* T1 => , p.T1 */ struct {} var v1 /* v1 => , int */ = 42 func /* f1 => , func(v1 float64) */ f1(v1 float64) { /* f1 => , func(v1 float64) */ /* v1 => , float64 */ var c /* c => 3, untyped float */ = "foo" /* c => , string */ { var c struct { c /* c => , string */ int } /* c => , struct{c int} */ _ = c } _ = func(a, b, c int) /* c => , string */ { /* c => , int */ } _ = c type FT /* FT => , p.FT */ interface{} } `, ` package p /* T => , p.T */ `, ` package p import "io" type R = io.Reader func _() { /* interface{R}.Read => , func(_ interface{io.Reader}, p []byte) (n int, err error) */ _ = func() { /* interface{io.Writer}.Write => , func(_ interface{io.Writer}, p []byte) (n int, err error) */ type io interface {} // must not shadow io in line above } type R interface {} // must not shadow R in first line of this function body } `, } fset := token.NewFileSet() var files []*ast.File for i, src := range sources { file, err := parser.ParseFile(fset, "p", src, parser.ParseComments) if err != nil { t.Fatalf("could not parse file %d: %s", i, err) } files = append(files, file) } conf := Config{Importer: importer.Default()} pkg, err := conf.Check("p", fset, files, nil) if err != nil { t.Fatal(err) } for _, file := range files { for _, group := range file.Comments { for _, comment := range group.List { s := comment.Text if len(s) >= 4 && s[:2] == "/*" && s[len(s)-2:] == "*/" { str, typ := split(s[2:len(s)-2], ", ") str, val := split(str, "=>") testEval(t, fset, pkg, comment.Pos(), str, nil, typ, val) } } } } } // split splits string s at the first occurrence of s, trimming spaces. func split(s, sep string) (string, string) { before, after, _ := strings.Cut(s, sep) return strings.TrimSpace(before), strings.TrimSpace(after) } func TestCheckExpr(t *testing.T) { testenv.MustHaveGoBuild(t) // Each comment has the form /* expr => object */: // expr is an identifier or selector expression that is passed // to CheckExpr at the position of the comment, and object is // the string form of the object it denotes. src := ` package p import "fmt" const c = 3.0 type T []int type S struct{ X int } func f(a int, s string) S { /* fmt.Println => func fmt.Println(a ...any) (n int, err error) */ /* fmt.Stringer.String => func (fmt.Stringer).String() string */ fmt.Println("calling f") var fmt struct{ Println int } /* fmt => var fmt struct{Println int} */ /* fmt.Println => field Println int */ /* f(1, "").X => field X int */ fmt.Println = 1 /* append => builtin append */ /* new(S).X => field X int */ return S{} }` // The unified IR importer always sets interface method receiver // parameters to point to the Interface type, rather than the Named. // See #49906. if goexperiment.Unified { src = strings.ReplaceAll(src, "func (fmt.Stringer).", "func (interface).") } fset := token.NewFileSet() f, err := parser.ParseFile(fset, "p", src, parser.ParseComments) if err != nil { t.Fatal(err) } conf := Config{Importer: importer.Default()} pkg, err := conf.Check("p", fset, []*ast.File{f}, nil) if err != nil { t.Fatal(err) } checkExpr := func(pos token.Pos, str string) (Object, error) { expr, err := parser.ParseExprFrom(fset, "eval", str, 0) if err != nil { return nil, err } info := &Info{ Uses: make(map[*ast.Ident]Object), Selections: make(map[*ast.SelectorExpr]*Selection), } if err := CheckExpr(fset, pkg, pos, expr, info); err != nil { return nil, fmt.Errorf("CheckExpr(%q) failed: %s", str, err) } switch expr := expr.(type) { case *ast.Ident: if obj, ok := info.Uses[expr]; ok { return obj, nil } case *ast.SelectorExpr: if sel, ok := info.Selections[expr]; ok { return sel.Obj(), nil } if obj, ok := info.Uses[expr.Sel]; ok { return obj, nil // qualified identifier } } return nil, fmt.Errorf("no object for %s", str) } for _, group := range f.Comments { for _, comment := range group.List { s := comment.Text if len(s) >= 4 && strings.HasPrefix(s, "/*") && strings.HasSuffix(s, "*/") { pos := comment.Pos() expr, wantObj := split(s[2:len(s)-2], "=>") obj, err := checkExpr(pos, expr) if err != nil { t.Errorf("%s: %s", fset.Position(pos), err) continue } if obj.String() != wantObj { t.Errorf("%s: checkExpr(%s) = %s, want %v", fset.Position(pos), expr, obj, wantObj) } } } } }