github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgGoSource/kmgGoParser/typeWriter.go (about) 1 package kmgGoParser 2 3 import ( 4 "fmt" 5 "path" 6 ) 7 8 func MustWriteGoTypes(thisPackagePath string, typi Type) (s string, addPkgPathList []string) { 9 switch typ := typi.(type) { 10 case FuncType: 11 panic("TODO") 12 case *NamedType: 13 if thisPackagePath == typ.PackagePath { 14 return typ.Name, nil 15 } 16 return path.Base(typ.PackagePath) + "." + typ.Name, []string{typ.PackagePath} 17 case PointerType: 18 s, addPkgPathList = MustWriteGoTypes(thisPackagePath, typ.Elem) 19 return "*" + s, addPkgPathList 20 case SliceType: 21 s, addPkgPathList = MustWriteGoTypes(thisPackagePath, typ.Elem) 22 return "[]" + s, addPkgPathList 23 case MapType: 24 ks, kaddPkgPathList := MustWriteGoTypes(thisPackagePath, typ.Key) 25 vs, vaddPkgPathList := MustWriteGoTypes(thisPackagePath, typ.Value) 26 return "map[" + ks + "]" + vs, append(kaddPkgPathList, vaddPkgPathList...) 27 case BuiltinType: 28 return string(typ), nil 29 /* 30 case *types.Basic: 31 return typ.String(), nil 32 case *types.Named: 33 if typ.Obj().Pkg() == nil { 34 return typ.Obj().Name(), nil 35 } 36 typPkgPath := typ.Obj().Pkg().Path() 37 if thisPackagePath == typPkgPath { 38 return typ.Obj().Name(), nil 39 } 40 return path.Base(typPkgPath) + "." + typ.Obj().Name(), []string{typPkgPath} 41 case *types.Pointer: 42 s, addPkgPathList = MustWriteGoTypes(thisPackagePath, typ.Elem()) 43 return "*" + s, addPkgPathList 44 case *types.Slice: 45 s, addPkgPathList = MustWriteGoTypes(thisPackagePath, typ.Elem()) 46 return "[]" + s, addPkgPathList 47 case *types.Interface: 48 return typ.String(), nil 49 //s, addPkgPathList = MustWriteGoTypes(thisPackagePath, typ.Elem()) 50 //return "[]" + s, addPkgPathList 51 */ 52 default: 53 panic(fmt.Errorf("[MustWriteGoTypes] Not implement go/types [%T]", 54 typi)) 55 } 56 return "", nil 57 }