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  }