package compiler import ( "go/ast" "go/types" ) func (c *codegen) typeAndValueOf(e ast.Expr) types.TypeAndValue { return c.typeInfo.Types[e] } func (c *codegen) typeOf(e ast.Expr) types.Type { return c.typeAndValueOf(e).Type } func isBasicTypeOfKind(typ types.Type, ks ...types.BasicKind) bool { if t, ok := typ.Underlying().(*types.Basic); ok { k := t.Kind() for i := range ks { if k == ks[i] { return true } } } return false } func isByte(typ types.Type) bool { return isBasicTypeOfKind(typ, types.Uint8, types.Int8) } func isString(typ types.Type) bool { return isBasicTypeOfKind(typ, types.String) } func isCompoundSlice(typ types.Type) bool { t, ok := typ.Underlying().(*types.Slice) return ok && !isByte(t.Elem()) } func isByteSlice(typ types.Type) bool { t, ok := typ.Underlying().(*types.Slice) return ok && isByte(t.Elem()) }