function name: getStructFieldType
   0.case
     *ast.SelectorExpr 	 [reflect Array]
     *ast.SelectorExpr 	 [reflect Slice]
     *ast.AssignStmt -> *ast.SelectorExpr 	 [= t Elem]
     *ast.CallExpr -> *ast.SelectorExpr 	 [tc getStructFieldType]
     *ast.CallExpr -> *ast.SelectorExpr 	 [typ field Elem]
     *ast.AssignStmt -> *ast.SelectorExpr 	 [= t Name]
     *ast.CallExpr -> *ast.SelectorExpr 	 [fmt Sprint]
     *ast.BasicLit -> *ast.SelectorExpr 	 [STRING "[]" t Elem]
   1.case
     *ast.SelectorExpr 	 [reflect Ptr]
     *ast.AssignStmt -> *ast.SelectorExpr 	 [= t Elem]
     *ast.CallExpr -> *ast.SelectorExpr 	 [tc getStructFieldType]
     *ast.CallExpr -> *ast.SelectorExpr 	 [typ field Elem]
     *ast.AssignStmt -> *ast.SelectorExpr 	 [= t Name]
     *ast.CallExpr -> *ast.SelectorExpr 	 [fmt Sprint]
     *ast.BasicLit -> *ast.SelectorExpr 	 [STRING "*" t Elem]
   2.case
     *ast.SelectorExpr 	 [reflect Map]
     *ast.AssignStmt -> *ast.SelectorExpr 	 [= t Key]
     *ast.CallExpr -> *ast.SelectorExpr 	 [tc getStructFieldType]
     *ast.CallExpr -> *ast.SelectorExpr 	 [typ field Key]
     *ast.AssignStmt -> *ast.SelectorExpr 	 [= t Elem]
     *ast.CallExpr -> *ast.SelectorExpr 	 [tc getStructFieldType]
     *ast.CallExpr -> *ast.SelectorExpr 	 [typ field Elem]
     *ast.AssignStmt -> *ast.SelectorExpr 	 [= t Name]
     *ast.CallExpr -> *ast.SelectorExpr 	 [fmt Sprintf]
     *ast.BasicLit -> *ast.SelectorExpr 	 [STRING "map[%s]%s" t Key]
     *ast.SelectorExpr 	 [t Elem]
   3.case
     *ast.SelectorExpr 	 [reflect Chan]
     *ast.AssignStmt -> *ast.SelectorExpr 	 [= t Elem]
     *ast.CallExpr -> *ast.SelectorExpr 	 [tc getStructFieldType]
     *ast.CallExpr -> *ast.SelectorExpr 	 [typ field Elem]
     *ast.AssignStmt -> *ast.SelectorExpr 	 [= t Name]
     *ast.CallExpr -> *ast.SelectorExpr 	 [fmt Sprint]
     *ast.BasicLit -> *ast.SelectorExpr 	 [STRING "chan " t Elem]

function name: NameOf
   0.case
     *ast.SelectorExpr 	 [reflect Array]
     *ast.SelectorExpr 	 [reflect Slice]
     *ast.AssignStmt -> *ast.SelectorExpr 	 [= t Elem]
     *ast.CallExpr -> *ast.SelectorExpr 	 [tc NameOf]
     *ast.CallExpr -> *ast.SelectorExpr 	 [typ Elem]
     *ast.IfStmt -> *ast.BinaryExpr -> *ast.SelectorExpr 	 [== t Name]
     *ast.BasicLit 	 [STRING ""]
     *ast.BlockStmt -> *ast.AssignStmt -> *ast.SelectorExpr 	 [= t Name]
     *ast.CallExpr -> *ast.SelectorExpr 	 [fmt Sprint]
     *ast.BasicLit -> *ast.SelectorExpr 	 [STRING "[]" t Elem]
   1.case
     *ast.SelectorExpr 	 [reflect Ptr]
     *ast.AssignStmt -> *ast.SelectorExpr 	 [= t Elem]
     *ast.CallExpr -> *ast.SelectorExpr 	 [tc NameOf]
     *ast.CallExpr -> *ast.SelectorExpr 	 [typ Elem]
     *ast.IfStmt -> *ast.BinaryExpr -> *ast.SelectorExpr 	 [== t Name]
     *ast.BasicLit 	 [STRING ""]
     *ast.BlockStmt -> *ast.AssignStmt -> *ast.SelectorExpr 	 [= t Name]
     *ast.CallExpr -> *ast.SelectorExpr 	 [fmt Sprint]
     *ast.BasicLit -> *ast.SelectorExpr 	 [STRING "*" t Elem]
   2.case
     *ast.SelectorExpr 	 [reflect Map]
     *ast.AssignStmt -> *ast.SelectorExpr 	 [= t Key]
     *ast.CallExpr -> *ast.SelectorExpr 	 [tc NameOf]
     *ast.CallExpr -> *ast.SelectorExpr 	 [typ Key]
     *ast.AssignStmt -> *ast.SelectorExpr 	 [= t Elem]
     *ast.CallExpr -> *ast.SelectorExpr 	 [tc NameOf]
     *ast.CallExpr -> *ast.SelectorExpr 	 [typ Elem]
     *ast.IfStmt -> *ast.BinaryExpr -> *ast.SelectorExpr 	 [== t Name]
     *ast.BasicLit 	 [STRING ""]
     *ast.BlockStmt -> *ast.AssignStmt -> *ast.SelectorExpr 	 [= t Name]
     *ast.CallExpr -> *ast.SelectorExpr 	 [fmt Sprintf]
     *ast.BasicLit -> *ast.SelectorExpr 	 [STRING "map[%s]%s" t Key]
     *ast.SelectorExpr 	 [t Elem]
   3.case
     *ast.SelectorExpr 	 [reflect Chan]
     *ast.AssignStmt -> *ast.SelectorExpr 	 [= t Elem]
     *ast.CallExpr -> *ast.SelectorExpr 	 [tc NameOf]
     *ast.CallExpr -> *ast.SelectorExpr 	 [typ Elem]
     *ast.IfStmt -> *ast.BinaryExpr -> *ast.SelectorExpr 	 [== t Name]
     *ast.BasicLit 	 [STRING ""]
     *ast.BlockStmt -> *ast.AssignStmt -> *ast.SelectorExpr 	 [= t Name]
     *ast.CallExpr -> *ast.SelectorExpr 	 [fmt Sprint]
     *ast.BasicLit -> *ast.SelectorExpr 	 [STRING "chan " t Elem]
   4.case
     *ast.SelectorExpr 	 [reflect Struct]
     *ast.ForStmt -> *ast.AssignStmt -> *ast.BasicLit 	 [:= i INT 0]
     *ast.BinaryExpr -> *ast.CallExpr -> *ast.SelectorExpr 	 [< i typ NumField]
     *ast.IncDecStmt 	 [i]
     *ast.BlockStmt -> *ast.AssignStmt -> *ast.CallExpr -> *ast.SelectorExpr 	 [:= f typ Field]
      	 [i]
     *ast.AssignStmt -> *ast.CompositeLit -> *ast.KeyValueExpr -> *ast.SelectorExpr 	 [:= field StructField Name f Name]
     *ast.KeyValueExpr -> *ast.SelectorExpr 	 [PkgPath f PkgPath]
     *ast.KeyValueExpr -> *ast.SelectorExpr 	 [Tag f Tag]
     *ast.KeyValueExpr -> *ast.SelectorExpr 	 [Offset f Offset]
     *ast.KeyValueExpr -> *ast.SelectorExpr 	 [Index f Index]
     *ast.KeyValueExpr -> *ast.SelectorExpr 	 [Anonymous f Anonymous]
     *ast.KeyValueExpr -> *ast.CallExpr -> *ast.SelectorExpr 	 [Type tc getStructFieldType]
     *ast.SelectorExpr 	 [typ f Type]
     *ast.AssignStmt -> *ast.SelectorExpr 	 [= t Fields]
     *ast.CallExpr -> *ast.SelectorExpr 	 [append t Fields]
      	 [field]
   5.case
     *ast.SelectorExpr 	 [reflect Func]
     *ast.ExprStmt -> *ast.CallExpr -> *ast.SelectorExpr 	 [tc fillFunctionSignature]
      	 [t typ]
     *ast.IfStmt -> *ast.BinaryExpr -> *ast.SelectorExpr 	 [== t Name]
     *ast.BasicLit 	 [STRING ""]
     *ast.BlockStmt -> *ast.AssignStmt -> *ast.SelectorExpr 	 [= t Name]
     *ast.CallExpr -> *ast.SelectorExpr 	 [fmt Sprintf]
     *ast.BasicLit -> *ast.CallExpr -> *ast.SelectorExpr 	 [STRING "func(%s)" strings Join]
     *ast.StarExpr -> *ast.CallExpr -> *ast.ParenExpr -> *ast.StarExpr -> *ast.ArrayType 	 [string]
     *ast.CallExpr -> *ast.SelectorExpr 	 [unsafe Pointer]
     *ast.UnaryExpr -> *ast.SelectorExpr 	 [& t In]
     *ast.BasicLit 	 [STRING ", "]
     *ast.IfStmt -> *ast.BinaryExpr -> *ast.CallExpr -> *ast.SelectorExpr 	 [== len t Out]
     *ast.BasicLit 	 [INT 1]
     *ast.BlockStmt -> *ast.AssignStmt -> *ast.SelectorExpr 	 [+= t Name]
     *ast.CallExpr -> *ast.SelectorExpr 	 [fmt Sprintf]
     *ast.BasicLit -> *ast.IndexExpr -> *ast.SelectorExpr 	 [STRING " %s" t Out]
     *ast.BasicLit 	 [INT 0]
     *ast.IfStmt -> *ast.BinaryExpr -> *ast.CallExpr -> *ast.SelectorExpr 	 [> len t Out]
     *ast.BasicLit 	 [INT 1]
     *ast.BlockStmt -> *ast.AssignStmt -> *ast.SelectorExpr 	 [+= t Name]
     *ast.CallExpr -> *ast.SelectorExpr 	 [fmt Sprintf]
     *ast.BasicLit -> *ast.CallExpr -> *ast.SelectorExpr 	 [STRING " (%s)" strings Join]
     *ast.StarExpr -> *ast.CallExpr -> *ast.ParenExpr -> *ast.StarExpr -> *ast.ArrayType 	 [string]
     *ast.CallExpr -> *ast.SelectorExpr 	 [unsafe Pointer]
     *ast.UnaryExpr -> *ast.SelectorExpr 	 [& t Out]
     *ast.BasicLit 	 [STRING ", "]

function name: Complete
   0.case
     *ast.SelectorExpr 	 [reflect Struct]
     *ast.AssignStmt -> *ast.TypeAssertExpr -> *ast.CallExpr -> *ast.SelectorExpr 	 [:= o ok obj Type]
     *ast.StarExpr -> *ast.SelectorExpr 	 [types Named]
     *ast.IfStmt -> *ast.UnaryExpr 	 [! ok]
     *ast.BlockStmt -> *ast.BranchStmt 	 []
     *ast.AssignStmt -> *ast.TypeAssertExpr -> *ast.CallExpr -> *ast.SelectorExpr 	 [:= st ok o Underlying]
     *ast.StarExpr -> *ast.SelectorExpr 	 [types Struct]
     *ast.IfStmt -> *ast.UnaryExpr 	 [! ok]
     *ast.BlockStmt -> *ast.BranchStmt 	 []
     *ast.ForStmt -> *ast.AssignStmt -> *ast.BasicLit 	 [:= i INT 0]
     *ast.BinaryExpr -> *ast.CallExpr -> *ast.SelectorExpr 	 [< i st NumFields]
     *ast.IncDecStmt 	 [i]
     *ast.BlockStmt -> *ast.AssignStmt -> *ast.CallExpr -> *ast.SelectorExpr 	 [:= field st Field]
      	 [i]
     *ast.ForStmt -> *ast.AssignStmt -> *ast.BasicLit 	 [:= j INT 0]
     *ast.BinaryExpr -> *ast.CallExpr -> *ast.SelectorExpr 	 [< j len typ Fields]
     *ast.IncDecStmt 	 [j]
     *ast.BlockStmt -> *ast.IfStmt -> *ast.BinaryExpr -> *ast.SelectorExpr -> *ast.IndexExpr -> *ast.SelectorExpr 	 [== typ Fields]
      	 [j]
      	 [Name]
     *ast.CallExpr -> *ast.SelectorExpr 	 [field Name]
     *ast.BlockStmt -> *ast.IfStmt -> *ast.AssignStmt -> *ast.CallExpr -> *ast.SelectorExpr 	 [:= comments analyzer Comments]
     *ast.SelectorExpr 	 [typ PkgPath]
     *ast.CallExpr -> *ast.SelectorExpr 	 [field Pos]
     *ast.BinaryExpr 	 [!= comments nil]
     *ast.BlockStmt -> *ast.AssignStmt -> *ast.SelectorExpr -> *ast.IndexExpr -> *ast.SelectorExpr 	 [= typ Fields]
      	 [j]
      	 [Comments]
     *ast.CallExpr -> *ast.SelectorExpr 	 [comments Text]
     *ast.BranchStmt 	 []
   1.case
     *ast.SelectorExpr 	 [reflect Func]
     *ast.AssignStmt -> *ast.TypeAssertExpr -> *ast.CallExpr -> *ast.SelectorExpr 	 [:= o ok obj Type]
     *ast.StarExpr -> *ast.SelectorExpr 	 [types Signature]
     *ast.IfStmt -> *ast.UnaryExpr 	 [! ok]
     *ast.BlockStmt -> *ast.BranchStmt 	 []
     *ast.ForStmt -> *ast.AssignStmt -> *ast.BasicLit 	 [:= i INT 0]
     *ast.BinaryExpr -> *ast.CallExpr -> *ast.SelectorExpr -> *ast.CallExpr -> *ast.SelectorExpr 	 [< i o Params]
      	 [Len]
     *ast.IncDecStmt 	 [i]
     *ast.BlockStmt -> *ast.AssignStmt -> *ast.CallExpr -> *ast.SelectorExpr -> *ast.CallExpr -> *ast.SelectorExpr 	 [:= param o Params]
      	 [At]
      	 [i]
     *ast.AssignStmt -> *ast.SelectorExpr -> *ast.IndexExpr -> *ast.SelectorExpr 	 [= typ In]
      	 [i]
      	 [Name]
     *ast.CallExpr -> *ast.SelectorExpr 	 [param Name]
     *ast.ForStmt -> *ast.AssignStmt -> *ast.BasicLit 	 [:= i INT 0]
     *ast.BinaryExpr -> *ast.CallExpr -> *ast.SelectorExpr -> *ast.CallExpr -> *ast.SelectorExpr 	 [< i o Results]
      	 [Len]
     *ast.IncDecStmt 	 [i]
     *ast.BlockStmt -> *ast.AssignStmt -> *ast.CallExpr -> *ast.SelectorExpr -> *ast.CallExpr -> *ast.SelectorExpr 	 [:= result o Results]
      	 [At]
      	 [i]
     *ast.AssignStmt -> *ast.SelectorExpr -> *ast.IndexExpr -> *ast.SelectorExpr 	 [= typ Out]
      	 [i]
      	 [Name]
     *ast.CallExpr -> *ast.SelectorExpr 	 [result Name]

