func (fa *facade) BasicKind() types.BasicKind {
	return fa.basic().Kind()
}
BasicKind returns the kind of basic type.
NOTE: Panic, if TypKind != Basic
package aster
import (
	"fmt"
	"go/types"
)
func (fa *facade) Elem() types.Type {
	typ := fa.typ()
	switch t := typ.(type) {
	default:
		panic(fmt.Sprintf("aster: Elem of non-TypKind(Array, Slice, Map, Chan and Pointer): %T", typ))
	case *types.Array:
		return t.Elem()
	case *types.Slice:
		return t.Elem()
	case *types.Map:
		return t.Elem()
	case *types.Chan:
		return t.Elem()
	case *types.Pointer:
		return t.Elem()
	}
}
func (fa *facade) dict() *types.Map {
	typ := fa.typ()
	t, ok := typ.(*types.Map)
	if !ok {
		panic(fmt.Sprintf("aster: dict of non-Map TypKind: %T", typ))
	}
	return t
}
func (fa *facade) Key() types.Type {
	return fa.dict().Key()
}
func (fa *facade) array() *types.Array {
	typ := fa.typ()
	t, ok := typ.(*types.Array)
	if !ok {
		panic(fmt.Sprintf("aster: array of non-Array TypKind: %T", typ))
	}
	return t
}
func (fa *facade) Len() int64 {
	typ := fa.typ()
	switch t := typ.(type) {
	default:
		panic(fmt.Sprintf("aster: Elem of non-(Array, Slice, Map, Chan and Pointer) TypKind: %T", typ))
	case *types.Array:
		return t.Len()
	case *types.Tuple:
		return int64(t.Len())
	}
}
func (fa *facade) channle() *types.Chan {
	typ := fa.typ()
	t, ok := typ.(*types.Chan)
	if !ok {
		panic(fmt.Sprintf("aster: channle of non-Chan TypKind: %T", typ))
	}
	return t
}
func (fa *facade) ChanDir() types.ChanDir {
	return fa.channle().Dir()
}
func (fa *facade) basic() *types.Basic {
	typ := fa.typ()
	t, ok := typ.(*types.Basic)
	if !ok {
		panic(fmt.Sprintf("aster: basic of non-Basic TypKind: %T", typ))
	}
	return t
}
func (fa *facade) BasicInfo() types.BasicInfo {
	return fa.basic().Info()
}