// 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. package types_test import ( "go/parser" "testing" . "go/types" ) var testExprs = []testEntry{ // basic type literals dup("x"), dup("true"), dup("42"), dup("3.1415"), dup("2.71828i"), dup(`'a'`), dup(`"foo"`), dup("`bar`"), // func and composite literals {"func(){}", "(func() literal)"}, {"func(x int) complex128 {}", "(func(x int) complex128 literal)"}, {"[]int{1, 2, 3}", "([]int literal)"}, // type expressions dup("[1 << 10]byte"), dup("[]int"), dup("*int"), dup("struct{x int}"), dup("func()"), dup("func(int, float32) string"), dup("interface{m()}"), dup("interface{m() string; n(x int)}"), dup("interface{~int}"), dup("map[string]int"), dup("chan E"), dup("<-chan E"), dup("chan<- E"), // new interfaces dup("interface{int}"), dup("interface{~int}"), dup("interface{~int}"), dup("interface{int | string}"), dup("interface{~int | ~string; float64; m()}"), // See above. // dup("interface{type a, b, c; ~int | ~string; float64; m()}"), dup("interface{~T[int, string] | string}"), // non-type expressions dup("(x)"), dup("x.f"), dup("a[i]"), dup("s[:]"), dup("s[i:]"), dup("s[:j]"), dup("s[i:j]"), dup("s[:j:k]"), dup("s[i:j:k]"), dup("x.(T)"), dup("x.([10]int)"), dup("x.([...]int)"), dup("x.(struct{})"), dup("x.(struct{x int; y, z float32; E})"), dup("x.(func())"), dup("x.(func(x int))"), dup("x.(func() int)"), dup("x.(func(x, y int, z float32) (r int))"), dup("x.(func(a, b, c int))"), dup("x.(func(x ...T))"), dup("x.(interface{})"), dup("x.(interface{m(); n(x int); E})"), dup("x.(interface{m(); n(x int) T; E; F})"), dup("x.(map[K]V)"), dup("x.(chan E)"), dup("x.(<-chan E)"), dup("x.(chan<- chan int)"), dup("x.(chan<- <-chan int)"), dup("x.(<-chan chan int)"), dup("x.(chan (<-chan int))"), dup("f()"), dup("f(x)"), dup("int(x)"), dup("f(x, x + y)"), dup("f(s...)"), dup("f(a, s...)"), dup("*x"), dup("&x"), dup("x + y"), dup("x + y << (2 * s)"), } func TestExprString(t *testing.T) { for _, test := range testExprs { x, err := parser.ParseExpr(test.src) if err != nil { t.Errorf("%s: %s", test.src, err) continue } if got := ExprString(x); got != test.str { t.Errorf("%s: got %s, want %s", test.src, got, test.str) } } }