// isBytestring returns true if T has the same terms as interface{[]byte | string}. // These act like a core type for some operations: slice expressions, append and copy. // // See https://go.dev/ref/spec#Core_types for the details on bytestring. func isBytestring(T types.Type) bool { … } type termList … func (s termList) Len() int { … } func (s termList) At(i int) types.Type { … } // typeSetOf returns the type set of typ. Returns an empty typeset on an error. func typeSetOf(typ types.Type) termList { … } // underIs calls f with the underlying types of the specific type terms // of s and reports whether all calls to f returned true. If there are // no specific terms, underIs returns the result of f(nil). func underIs(s termList, f func(types.Type) bool) bool { … } // indexType returns the element type and index mode of a IndexExpr over a type. // It returns (nil, invalid) if the type is not indexable; this should never occur in a well-typed program. func indexType(typ types.Type) (types.Type, indexMode) { … } type indexMode … const ixInvalid … const ixValue … const ixArrVar … const ixVar … const ixMap … // meet is the address type that is constrained by both x and y. func (x indexMode) meet(y indexMode) indexMode { … }