@@ -36,6 +36,7 @@ type Builtin struct {
3636 name string
3737 pkg string
3838 sym string
39+ fn bool
3940}
4041
4142func (t * Builtin ) Parent () * types.Scope {
@@ -65,12 +66,15 @@ func (t *Builtin) String() string {
6566func (t * Builtin ) Sym () string {
6667 return t .pkg + "." + t .sym
6768}
69+ func (t * Builtin ) IsFunc () bool {
70+ return t .fn
71+ }
6872
6973var (
7074 Universe * types.Scope
7175)
7276
73- var builtinDefs = [... ]struct {
77+ var builtinTypes = [... ]struct {
7478 name string
7579 pkg string
7680 sym string
@@ -80,9 +84,16 @@ var builtinDefs = [...]struct {
8084 {"bigfloat" , "github.com/qiniu/x/gop/ng" , "" },
8185 {"int128" , "github.com/qiniu/x/gop/ng" , "" },
8286 {"uint128" , "github.com/qiniu/x/gop/ng" , "" },
83- {"lines" , "github.com/qiniu/x/gop/osx" , "" },
87+ }
88+
89+ var builtinFuncs = [... ]struct {
90+ name string
91+ pkg string
92+ sym string
93+ }{
8494 {"errorln" , "github.com/qiniu/x/gop/osx" , "" },
8595 {"fatal" , "github.com/qiniu/x/gop/osx" , "" },
96+ {"lines" , "github.com/qiniu/x/gop/osx" , "" },
8697 {"blines" , "github.com/qiniu/x/gop/osx" , "BLines" },
8798 {"newRange" , "github.com/qiniu/x/gop" , "NewRange__0" },
8899 {"echo" , "fmt" , "Println" },
@@ -103,35 +114,46 @@ var builtinDefs = [...]struct {
103114type defSym struct {
104115 name string
105116 sym string
117+ fn bool
106118}
107119
108120var (
109121 builtinSym map [string ][]defSym
110122)
111123
124+ func insertBuiltin (name , pkg , sym string , fn bool ) {
125+ if sym == "" {
126+ sym = string (name [0 ]- ('a' - 'A' )) + name [1 :]
127+ }
128+ builtinSym [pkg ] = append (builtinSym [pkg ], defSym {name : name , sym : sym , fn : fn })
129+ obj := & Builtin {name : name , pkg : pkg , sym : sym , fn : fn }
130+ Universe .Insert (obj )
131+ }
132+
112133func init () {
113134 Universe = types .NewScope (nil , 0 , 0 , "universe" )
114135 builtinSym = make (map [string ][]defSym )
115- for _ , def := range builtinDefs {
116- if def .sym == "" {
117- def .sym = string (def .name [0 ]- ('a' - 'A' )) + def .name [1 :]
118- }
119- builtinSym [def .pkg ] = append (builtinSym [def .pkg ], defSym {name : def .name , sym : def .sym })
120- obj := & Builtin {name : def .name , pkg : def .pkg , sym : def .sym }
121- Universe .Insert (obj )
136+ for _ , def := range builtinTypes {
137+ insertBuiltin (def .name , def .pkg , def .sym , false )
138+ }
139+ for _ , def := range builtinFuncs {
140+ insertBuiltin (def .name , def .pkg , def .sym , true )
122141 }
123142}
124143
125- func initBuiltin (pkg * gogen.Package , builtin * types.Package ) {
144+ func initBuiltin (pkg * gogen.Package , builtin * types.Package , conf * gogen. Config ) {
126145 scope := builtin .Scope ()
127146 for im , defs := range builtinSym {
128147 if p := pkg .TryImport (im ); p .Types != nil {
129148 for _ , def := range defs {
130149 obj := p .Ref (def .sym )
131- if _ , ok := obj .Type ().(* types.Named ); ok {
132- scope .Insert (types .NewTypeName (token .NoPos , builtin , def .name , obj .Type ()))
133- } else {
150+ if def .fn {
134151 scope .Insert (gogen .NewOverloadFunc (token .NoPos , builtin , def .name , obj ))
152+ } else {
153+ scope .Insert (types .NewTypeName (token .NoPos , builtin , def .name , obj .Type ()))
154+ }
155+ if rec , ok := conf .Recorder .(* goxRecorder ); ok {
156+ rec .Builtin (def .name , obj )
135157 }
136158 }
137159 }
@@ -158,7 +180,7 @@ func newBuiltinDefault(pkg *gogen.Package, conf *gogen.Config) *types.Package {
158180 }
159181 }
160182 }
161- initBuiltin (pkg , builtin )
183+ initBuiltin (pkg , builtin , conf )
162184 gogen .InitBuiltin (pkg , builtin , conf )
163185 if strx .Types != nil {
164186 ti := pkg .BuiltinTI (types .Typ [types .String ])
0 commit comments