本文整理汇总了Golang中golang.org/x/tools/go/types.Type类的典型用法代码示例。如果您正苦于以下问题:Golang Type类的具体用法?Golang Type怎么用?Golang Type使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Type类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: MustWriteGoTypes
func MustWriteGoTypes(thisPackagePath string, typi types.Type) (s string, addPkgPathList []string) {
switch typ := typi.(type) {
case *types.Basic:
return typ.String(), nil
case *types.Named:
if typ.Obj().Pkg() == nil {
return typ.Obj().Name(), nil
}
typPkgPath := typ.Obj().Pkg().Path()
if thisPackagePath == typPkgPath {
return typ.Obj().Name(), nil
}
return path.Base(typPkgPath) + "." + typ.Obj().Name(), []string{typPkgPath}
case *types.Pointer:
s, addPkgPathList = MustWriteGoTypes(thisPackagePath, typ.Elem())
return "*" + s, addPkgPathList
case *types.Slice:
s, addPkgPathList = MustWriteGoTypes(thisPackagePath, typ.Elem())
return "[]" + s, addPkgPathList
case *types.Interface:
return typ.String(), nil
//s, addPkgPathList = MustWriteGoTypes(thisPackagePath, typ.Elem())
//return "[]" + s, addPkgPathList
default:
panic(fmt.Errorf("[MustWriteGoTypes] Not implement go/types [%T] [%s]",
typi, typi.String()))
}
return "", nil
}
示例2: dump
func dump(path string, typ types.Type, st reflect.StructTag) IObj {
named, _ := typ.(*types.Named)
if named != nil {
typ = typ.Underlying()
}
if strings.Split(st.Get("json"), ",")[0] == "" {
if _, ok := typ.(*types.Struct); !ok {
if _, ok := typ.(*types.Pointer); !ok {
return nil
}
}
}
switch u := typ.(type) {
case *types.Struct:
return Struct(path, st, u, named)
case *types.Map:
return Map(path, st, u, named)
case *types.Slice:
return Slice(path, st, u)
case *types.Pointer:
return Pointer(path, st, u)
case *types.Basic:
return Basic(path, st, u, named)
default:
panic("unsupported")
}
}
示例3: lockPath
// lockPath returns a typePath describing the location of a lock value
// contained in typ. If there is no contained lock, it returns nil.
func lockPath(tpkg *types.Package, typ types.Type) typePath {
if typ == nil {
return nil
}
// We're only interested in the case in which the underlying
// type is a struct. (Interfaces and pointers are safe to copy.)
styp, ok := typ.Underlying().(*types.Struct)
if !ok {
return nil
}
// We're looking for cases in which a reference to this type
// can be locked, but a value cannot. This differentiates
// embedded interfaces from embedded values.
if plock := types.NewMethodSet(types.NewPointer(typ)).Lookup(tpkg, "Lock"); plock != nil {
if lock := types.NewMethodSet(typ).Lookup(tpkg, "Lock"); lock == nil {
return []types.Type{typ}
}
}
nfields := styp.NumFields()
for i := 0; i < nfields; i++ {
ftyp := styp.Field(i).Type()
subpath := lockPath(tpkg, ftyp)
if subpath != nil {
return append(subpath, typ)
}
}
return nil
}
示例4: genWrite
func (g *goGen) genWrite(valName, seqName string, T types.Type) {
if isErrorType(T) {
g.Printf("if %s == nil {\n", valName)
g.Printf(" %s.WriteString(\"\");\n", seqName)
g.Printf("} else {\n")
g.Printf(" %s.WriteString(%s.Error());\n", seqName, valName)
g.Printf("}\n")
return
}
switch T := T.(type) {
case *types.Pointer:
// TODO(crawshaw): test *int
// TODO(crawshaw): test **Generator
switch T := T.Elem().(type) {
case *types.Named:
obj := T.Obj()
if obj.Pkg() != g.pkg {
g.errorf("type %s not defined in package %s", T, g.pkg)
return
}
g.Printf("%s.WriteGoRef(%s)\n", seqName, valName)
default:
g.errorf("unsupported type %s", T)
}
case *types.Named:
switch u := T.Underlying().(type) {
case *types.Interface, *types.Pointer:
g.Printf("%s.WriteGoRef(%s)\n", seqName, valName)
default:
g.errorf("unsupported, direct named type %s: %s", T, u)
}
default:
g.Printf("%s.Write%s(%s);\n", seqName, seqType(T), valName)
}
}
示例5: sizeof
func sizeof(t types.Type) uint {
switch t := t.(type) {
case *types.Tuple:
// TODO: usage of reflect most likely wrong!
// uint(reflect.TypeOf(t).Elem().Size())
panic("Tuples are unsupported")
case *types.Basic:
return sizeBasic(t.Kind())
case *types.Pointer:
return sizePtr()
case *types.Slice:
return sizeSlice(t)
case *types.Array:
return sizeArray(t)
case *types.Named:
if sse2, ok := sse2Info(t); ok {
return sse2.size
} else if info, ok := simdInfo(t); ok {
return info.size
} else {
panic(ice(fmt.Sprintf("unknown named type \"%v\"", t.String())))
}
}
panic(ice(fmt.Sprintf("unknown type: %v", t)))
}
示例6: needWrapType
func needWrapType(typ types.Type) bool {
switch typ := typ.(type) {
case *types.Basic:
return false
case *types.Struct:
return true
case *types.Named:
switch ut := typ.Underlying().(type) {
case *types.Basic:
return false
default:
return needWrapType(ut)
}
case *types.Array:
return true
case *types.Map:
return true
case *types.Slice:
return true
case *types.Interface:
wrap := true
if typ.Underlying() == universe.syms["error"].GoType().Underlying() {
wrap = false
}
return wrap
case *types.Signature:
return true
case *types.Pointer:
return needWrapType(typ.Elem())
}
return false
}
示例7: MethodSet
// MethodSet returns the method set of type T. It is thread-safe.
//
// If cache is nil, this function is equivalent to types.NewMethodSet(T).
// Utility functions can thus expose an optional *MethodSetCache
// parameter to clients that care about performance.
//
func (cache *MethodSetCache) MethodSet(T types.Type) *types.MethodSet {
if cache == nil {
return types.NewMethodSet(T)
}
cache.mu.Lock()
defer cache.mu.Unlock()
switch T := T.(type) {
case *types.Named:
return cache.lookupNamed(T).value
case *types.Pointer:
if N, ok := T.Elem().(*types.Named); ok {
return cache.lookupNamed(N).pointer
}
}
// all other types
// (The map uses pointer equivalence, not type identity.)
mset := cache.others[T]
if mset == nil {
mset = types.NewMethodSet(T)
if cache.others == nil {
cache.others = make(map[types.Type]*types.MethodSet)
}
cache.others[T] = mset
}
return mset
}
示例8: addInterfaceType
func (sym *symtab) addInterfaceType(pkg *types.Package, obj types.Object, t types.Type, kind symkind, id, n string) {
fn := sym.typename(t, nil)
typ := t.Underlying().(*types.Interface)
kind |= skInterface
// special handling of 'error'
if isErrorType(typ) {
return
}
sym.syms[fn] = &symbol{
gopkg: pkg,
goobj: obj,
gotyp: t,
kind: kind,
id: id,
goname: n,
cgoname: "cgo_type_" + id,
cpyname: "cpy_type_" + id,
pyfmt: "O&",
pybuf: "P",
pysig: "object",
c2py: "cgopy_cnv_c2py_" + id,
py2c: "cgopy_cnv_py2c_" + id,
pychk: fmt.Sprintf("cpy_func_%[1]s_check(%%s)", id),
}
}
示例9: getStructType
func getStructType(t types.Type) string {
ts := t.String()
if ts != "time.Time" && ts != "bson.ObjectId" {
return "struct"
}
return ts
}
示例10: makeInterface
func (fr *frame) makeInterface(llv llvm.Value, vty types.Type, iface types.Type) *govalue {
if _, ok := vty.Underlying().(*types.Pointer); !ok {
ptr := fr.createTypeMalloc(vty)
fr.builder.CreateStore(llv, ptr)
llv = ptr
}
return fr.makeInterfaceFromPointer(llv, vty, iface)
}
示例11: hash
func (x array) hash(t types.Type) int {
h := 0
tElt := t.Underlying().(*types.Array).Elem()
for _, xi := range x {
h += hash(tElt, xi)
}
return h
}
示例12: typefmt
func typefmt(typ types.Type) string {
// Ugh.
typename := typ.String()
for _, p := range strings.Split(os.Getenv("GOPATH"), ":") {
typename = strings.Replace(typename, p+"/src/", "", -1)
}
return typename
}
示例13: getInterfaceValue
// Reads the value from the given interface type, assuming that the
// interface holds a value of the correct type.
func (fr *frame) getInterfaceValue(v *govalue, ty types.Type) *govalue {
val := fr.builder.CreateExtractValue(v.value, 1, "")
if _, ok := ty.Underlying().(*types.Pointer); !ok {
typedval := fr.builder.CreateBitCast(val, llvm.PointerType(fr.types.ToLLVM(ty), 0), "")
val = fr.builder.CreateLoad(typedval, "")
}
return newValue(val, ty)
}
示例14: signed
func signed(t types.Type) bool {
switch t := t.(type) {
case *types.Basic:
return signedBasic(t.Kind())
}
panic(ice(fmt.Sprintf("unknown type: %v", t)))
}
示例15: catchReferencedTypes
func catchReferencedTypes(et types.Type) {
id := LogTypeUse(et)
_, seen := catchReferencedTypesSeen[id]
if seen {
return
}
catchReferencedTypesSeen[id] = true
// check that we have all the required methods?
/*
for t := 1; t < NextTypeID; t++ { // make sure we do this in a consistent order
for _, k := range TypesEncountered.Keys() {
if TypesEncountered.At(k).(int) == t {
switch k.(type) {
case *types.Interface:
if types.Implements(et,k.(*types.Interface)) {
// TODO call missing method?
}
}
}
}
}
*/
//LogTypeUse(types.NewPointer(et))
switch et.(type) {
case *types.Named:
catchReferencedTypes(et.Underlying())
for m := 0; m < et.(*types.Named).NumMethods(); m++ {
catchReferencedTypes(et.(*types.Named).Method(m).Type())
}
case *types.Array:
catchReferencedTypes(et.(*types.Array).Elem())
//catchReferencedTypes(types.NewSlice(et.(*types.Array).Elem()))
case *types.Pointer:
catchReferencedTypes(et.(*types.Pointer).Elem())
case *types.Slice:
catchReferencedTypes(et.(*types.Slice).Elem())
case *types.Struct:
for f := 0; f < et.(*types.Struct).NumFields(); f++ {
if et.(*types.Struct).Field(f).IsField() {
catchReferencedTypes(et.(*types.Struct).Field(f).Type())
}
}
case *types.Map:
catchReferencedTypes(et.(*types.Map).Key())
catchReferencedTypes(et.(*types.Map).Elem())
case *types.Signature:
for i := 0; i < et.(*types.Signature).Params().Len(); i++ {
catchReferencedTypes(et.(*types.Signature).Params().At(i).Type())
}
for o := 0; o < et.(*types.Signature).Results().Len(); o++ {
catchReferencedTypes(et.(*types.Signature).Results().At(o).Type())
}
case *types.Chan:
catchReferencedTypes(et.(*types.Chan).Elem())
}
}