// ChanType = ( "chan" [ "<-" ] | "<-" "chan" ) Type . // func (p *parser) parseChanType() types.Type { dir := types.SendRecv if p.tok == scanner.Ident { p.expectKeyword("chan") if p.tok == '<' { p.expectSpecial("<-") dir = types.SendOnly } } else { p.expectSpecial("<-") p.expectKeyword("chan") dir = types.RecvOnly } elem := p.parseType() return types.NewChan(dir, elem) }
// - test hashcodes are consistent with equals for a range of types // (e.g. all types generated by type-checking some body of real code). import ( "testing" "github.com/fzipp/pythia/internal/tools/go/types" "github.com/fzipp/pythia/internal/tools/go/types/typeutil" ) var ( tStr = types.Typ[types.String] // string tPStr1 = types.NewPointer(tStr) // *string tPStr2 = types.NewPointer(tStr) // *string, again tInt = types.Typ[types.Int] // int tChanInt1 = types.NewChan(types.RecvOnly, tInt) // <-chan int tChanInt2 = types.NewChan(types.RecvOnly, tInt) // <-chan int, again ) func checkEqualButNotIdentical(t *testing.T, x, y types.Type, comment string) { if !types.Identical(x, y) { t.Errorf("%s: not equal: %s, %s", comment, x, y) } if x == y { t.Errorf("%s: identical: %v, %v", comment, x, y) } } func TestAxioms(t *testing.T) { checkEqualButNotIdentical(t, tPStr1, tPStr2, "tPstr{1,2}") checkEqualButNotIdentical(t, tChanInt1, tChanInt2, "tChanInt{1,2}")