@@ -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,6 +84,13 @@ var builtinDefs = [...]struct {
8084 {"bigfloat" , "github.com/goplus/gop/builtin/ng" , "" },
8185 {"int128" , "github.com/goplus/gop/builtin/ng" , "" },
8286 {"uint128" , "github.com/goplus/gop/builtin/ng" , "" },
87+ }
88+
89+ var builtinFuncs = [... ]struct {
90+ name string
91+ pkg string
92+ sym string
93+ }{
8394 {"lines" , "github.com/goplus/gop/builtin/iox" , "" },
8495 {"blines" , "github.com/goplus/gop/builtin/iox" , "BLines" },
8596 {"newRange" , "github.com/goplus/gop/builtin" , "NewRange__0" },
@@ -101,35 +112,46 @@ var builtinDefs = [...]struct {
101112type defSym struct {
102113 name string
103114 sym string
115+ fn bool
104116}
105117
106118var (
107119 builtinSym map [string ][]defSym
108120)
109121
122+ func insertBuiltin (name , pkg , sym string , fn bool ) {
123+ if sym == "" {
124+ sym = string (name [0 ]- ('a' - 'A' )) + name [1 :]
125+ }
126+ builtinSym [pkg ] = append (builtinSym [pkg ], defSym {name : name , sym : sym , fn : fn })
127+ obj := & Builtin {name : name , pkg : pkg , sym : sym , fn : fn }
128+ Universe .Insert (obj )
129+ }
130+
110131func init () {
111132 Universe = types .NewScope (nil , 0 , 0 , "universe" )
112133 builtinSym = make (map [string ][]defSym )
113- for _ , def := range builtinDefs {
114- if def .sym == "" {
115- def .sym = string (def .name [0 ]- ('a' - 'A' )) + def .name [1 :]
116- }
117- builtinSym [def .pkg ] = append (builtinSym [def .pkg ], defSym {name : def .name , sym : def .sym })
118- obj := & Builtin {name : def .name , pkg : def .pkg , sym : def .sym }
119- Universe .Insert (obj )
134+ for _ , def := range builtinTypes {
135+ insertBuiltin (def .name , def .pkg , def .sym , false )
136+ }
137+ for _ , def := range builtinFuncs {
138+ insertBuiltin (def .name , def .pkg , def .sym , true )
120139 }
121140}
122141
123- func initBuiltin (pkg * gogen.Package , builtin * types.Package ) {
142+ func initBuiltin (pkg * gogen.Package , builtin * types.Package , conf * gogen. Config ) {
124143 scope := builtin .Scope ()
125144 for im , defs := range builtinSym {
126145 if p := pkg .TryImport (im ); p .Types != nil {
127146 for _ , def := range defs {
128147 obj := p .Ref (def .sym )
129- if _ , ok := obj .Type ().(* types.Named ); ok {
130- scope .Insert (types .NewTypeName (token .NoPos , builtin , def .name , obj .Type ()))
131- } else {
148+ if def .fn {
132149 scope .Insert (gogen .NewOverloadFunc (token .NoPos , builtin , def .name , obj ))
150+ } else {
151+ scope .Insert (types .NewTypeName (token .NoPos , builtin , def .name , obj .Type ()))
152+ }
153+ if rec , ok := conf .Recorder .(* goxRecorder ); ok {
154+ rec .Builtin (def .name , obj )
133155 }
134156 }
135157 }
@@ -152,7 +174,7 @@ func newBuiltinDefault(pkg *gogen.Package, conf *gogen.Config) *types.Package {
152174 }
153175 }
154176 }
155- initBuiltin (pkg , builtin )
177+ initBuiltin (pkg , builtin , conf )
156178 gogen .InitBuiltin (pkg , builtin , conf )
157179 if strx .Types != nil {
158180 ti := pkg .BuiltinTI (types .Typ [types .String ])
0 commit comments