Skip to content

Commit a0ae44d

Browse files
committed
Uncoupling parser
1 parent e9c3a35 commit a0ae44d

File tree

6 files changed

+70
-74
lines changed

6 files changed

+70
-74
lines changed

parser.go

Lines changed: 32 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,14 @@ import (
88

99
type parser struct {
1010
importer *Importer
11-
method map[string]types // type method
12-
nameds types // var, func, type, packgae
13-
pkg string
14-
goroot bool
11+
info *info
1512
}
1613

1714
// NewParser
1815
func newParser(i *Importer, pkg string, goroot bool) *parser {
1916
r := &parser{
2017
importer: i,
21-
method: map[string]types{},
22-
nameds: types{},
23-
pkg: pkg,
24-
goroot: goroot,
18+
info: newInfo(pkg, goroot),
2519
}
2620
return r
2721
}
@@ -31,8 +25,8 @@ func (r *parser) ParsePackage(pkg *ast.Package) Type {
3125
for _, file := range pkg.Files {
3226
r.parseFile(file)
3327
}
34-
tt := newTypeScope(pkg.Name, r)
35-
tt = newTypeOrigin(tt, pkg, r.pkg, r.goroot, nil, nil)
28+
tt := newTypeScope(pkg.Name, r.info)
29+
tt = newTypeOrigin(tt, pkg, r.info, nil, nil)
3630
return tt
3731
}
3832

@@ -71,16 +65,16 @@ func (r *parser) parseFunc(decl *ast.FuncDecl) {
7165
}
7266

7367
t := newTypeAlias(decl.Name.Name, f)
74-
t = newTypeOrigin(t, decl, r.pkg, r.goroot, doc, nil)
75-
b := r.method[name]
68+
t = newTypeOrigin(t, decl, r.info, doc, nil)
69+
b := r.info.Methods[name]
7670
b.Add(t)
77-
r.method[name] = b
71+
r.info.Methods[name] = b
7872
return
7973
}
8074

8175
t := newTypeAlias(decl.Name.Name, f)
82-
t = newTypeOrigin(t, decl, r.pkg, r.goroot, doc, nil)
83-
r.nameds.Add(t)
76+
t = newTypeOrigin(t, decl, r.info, doc, nil)
77+
r.info.Named.Add(t)
8478
return
8579
}
8680

@@ -100,13 +94,13 @@ func (r *parser) parseType(decl *ast.GenDecl) {
10094

10195
tt := r.EvalType(s.Type)
10296
if s.Assign == 0 && tt.Kind() != Interface {
103-
tt = newTypeNamed(s.Name.Name, tt, r)
97+
tt = newTypeNamed(s.Name.Name, tt, r.info)
10498
} else {
10599
tt = newTypeAlias(s.Name.Name, tt)
106100
}
107101

108-
tt = newTypeOrigin(tt, s, r.pkg, r.goroot, doc, comment)
109-
r.nameds.Add(tt)
102+
tt = newTypeOrigin(tt, s, r.info, doc, comment)
103+
r.info.Named.Add(tt)
110104
}
111105
}
112106

@@ -134,28 +128,28 @@ func (r *parser) parseImport(decl *ast.GenDecl) {
134128
}
135129

136130
if s.Name == nil {
137-
tt := newTypeImport("", path, r.pkg, r.importer)
138-
tt = newTypeOrigin(tt, s, r.pkg, r.goroot, doc, comment)
139-
r.nameds.AddNoRepeat(tt)
131+
tt := newTypeImport("", path, r.info.PkgPath, r.importer)
132+
tt = newTypeOrigin(tt, s, r.info, doc, comment)
133+
r.info.Named.AddNoRepeat(tt)
140134
} else {
141135
switch s.Name.Name {
142136
case "_":
143137
case ".":
144-
p, err := r.importer.impor(path, r.pkg)
138+
p, err := r.importer.impor(path, r.info.PkgPath)
145139
if err != nil {
146140
r.importer.errorHandler(err)
147141
continue
148142
}
149143
l := p.NumChild()
150144
for i := 0; i != l; i++ {
151145
tt := p.Child(i)
152-
tt = newTypeOrigin(tt, s, r.pkg, r.goroot, doc, comment)
153-
r.nameds.AddNoRepeat(tt)
146+
tt = newTypeOrigin(tt, s, r.info, doc, comment)
147+
r.info.Named.AddNoRepeat(tt)
154148
}
155149
default:
156-
tt := newTypeImport(s.Name.Name, path, r.pkg, r.importer)
157-
tt = newTypeOrigin(tt, s, r.pkg, r.goroot, doc, comment)
158-
r.nameds.AddNoRepeat(tt)
150+
tt := newTypeImport(s.Name.Name, path, r.info.PkgPath, r.importer)
151+
tt = newTypeOrigin(tt, s, r.info, doc, comment)
152+
r.info.Named.AddNoRepeat(tt)
159153
}
160154
}
161155
}
@@ -201,8 +195,8 @@ loop:
201195
break
202196
}
203197
tt := newTypeVar(v.Name, tup.all.Index(i))
204-
tt = newTypeOrigin(tt, s, r.pkg, r.goroot, doc, comment)
205-
r.nameds.Add(tt)
198+
tt = newTypeOrigin(tt, s, r.info, doc, comment)
199+
r.info.Named.Add(tt)
206200
}
207201
continue loop
208202
}
@@ -217,8 +211,8 @@ loop:
217211
}
218212
val := r.EvalType(s.Values[i])
219213
tt := newTypeVar(v.Name, val)
220-
tt = newTypeOrigin(tt, s, r.pkg, r.goroot, doc, comment)
221-
r.nameds.Add(tt)
214+
tt = newTypeOrigin(tt, s, r.info, doc, comment)
215+
r.info.Named.Add(tt)
222216
}
223217
continue loop
224218
}
@@ -234,21 +228,21 @@ loop:
234228
if typ == nil {
235229
if val != nil {
236230
tt := newTypeVar(v.Name, val)
237-
tt = newTypeOrigin(tt, s, r.pkg, r.goroot, doc, comment)
238-
r.nameds.Add(tt)
231+
tt = newTypeOrigin(tt, s, r.info, doc, comment)
232+
r.info.Named.Add(tt)
239233
} else {
240234
// No action
241235
}
242236
} else {
243237
if val == nil {
244238
tt := newTypeVar(v.Name, typ)
245-
tt = newTypeOrigin(tt, s, r.pkg, r.goroot, doc, comment)
246-
r.nameds.Add(tt)
239+
tt = newTypeOrigin(tt, s, r.info, doc, comment)
240+
r.info.Named.Add(tt)
247241
} else {
248242
tt := newTypeVar(v.Name, typ)
249-
tt = newTypeOrigin(tt, s, r.pkg, r.goroot, doc, comment)
250-
tt = newTypeValueBind(tt, val, r.pkg, r.goroot)
251-
r.nameds.Add(tt)
243+
tt = newTypeOrigin(tt, s, r.info, doc, comment)
244+
tt = newTypeValueBind(tt, val, r.info)
245+
r.info.Named.Add(tt)
252246
}
253247
}
254248

parser_types.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
func (r *parser) EvalType(expr ast.Expr) (ret Type) {
1111
defer func() {
1212
if ret != nil {
13-
ret = newTypeOrigin(ret, expr, r.pkg, r.goroot, nil, nil)
13+
ret = newTypeOrigin(ret, expr, r.info, nil, nil)
1414
}
1515
}()
1616
switch t := expr.(type) {
@@ -21,7 +21,7 @@ func (r *parser) EvalType(expr ast.Expr) (ret Type) {
2121
s := newTypeBuiltin(k, "")
2222
return s
2323
}
24-
s := newTypeNamed(t.Name, nil, r)
24+
s := newTypeNamed(t.Name, nil, r.info)
2525
return s
2626
case *ast.BasicLit:
2727
if k := tokenTypes[t.Kind]; k != 0 {
@@ -42,7 +42,7 @@ func (r *parser) EvalType(expr ast.Expr) (ret Type) {
4242
d := r.EvalType(v)
4343
pairs.li.Add(d)
4444
}
45-
return newTypeValueBind(typ, pairs, r.pkg, r.goroot)
45+
return newTypeValueBind(typ, pairs, r.info)
4646
case *ast.ParenExpr:
4747
return r.EvalType(t.X)
4848
case *ast.SelectorExpr:
@@ -130,7 +130,7 @@ func (r *parser) EvalType(expr ast.Expr) (ret Type) {
130130
elem: ty,
131131
tag: tag,
132132
}
133-
tt := newTypeOrigin(t, v, r.pkg, r.goroot, v.Doc, v.Comment)
133+
tt := newTypeOrigin(t, v, r.info, v.Doc, v.Comment)
134134
s.anonymo.Add(tt)
135135
continue
136136
}
@@ -140,7 +140,7 @@ func (r *parser) EvalType(expr ast.Expr) (ret Type) {
140140
elem: ty,
141141
tag: tag,
142142
}
143-
tt := newTypeOrigin(t, v, r.pkg, r.goroot, v.Doc, v.Comment)
143+
tt := newTypeOrigin(t, v, r.info, v.Doc, v.Comment)
144144
s.fields.Add(tt)
145145
}
146146
}
@@ -164,7 +164,7 @@ func (r *parser) EvalType(expr ast.Expr) (ret Type) {
164164
}
165165
for _, name := range v.Names {
166166
t := newTypeVar(name.Name, ty)
167-
tt := newTypeOrigin(t, v, r.pkg, r.goroot, v.Doc, v.Comment)
167+
tt := newTypeOrigin(t, v, r.info, v.Doc, v.Comment)
168168
s.params = append(s.params, tt)
169169
}
170170
}
@@ -183,7 +183,7 @@ func (r *parser) EvalType(expr ast.Expr) (ret Type) {
183183
}
184184
for _, name := range v.Names {
185185
t := newTypeVar(name.Name, ty)
186-
tt := newTypeOrigin(t, v, r.pkg, r.goroot, v.Doc, v.Comment)
186+
tt := newTypeOrigin(t, v, r.info, v.Doc, v.Comment)
187187
s.results = append(s.results, tt)
188188
}
189189
}
@@ -208,7 +208,7 @@ func (r *parser) EvalType(expr ast.Expr) (ret Type) {
208208

209209
for _, name := range v.Names {
210210
t := newTypeAlias(name.Name, ty)
211-
tt := newTypeOrigin(t, v, r.pkg, r.goroot, v.Doc, v.Comment)
211+
tt := newTypeOrigin(t, v, r.info, v.Doc, v.Comment)
212212
s.methods.Add(tt)
213213
}
214214
}

types_named.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,24 @@ import (
55
"reflect"
66
)
77

8-
func newTypeNamed(name string, typ Type, parser *parser) Type {
8+
func newTypeNamed(name string, typ Type, info *info) Type {
99
return &typeNamed{
10-
name: name,
11-
typ: typ,
12-
parser: parser,
10+
name: name,
11+
typ: typ,
12+
info: info,
1313
}
1414
}
1515

1616
type typeNamed struct {
17-
name string
18-
parser *parser
19-
typ Type
17+
name string
18+
info *info
19+
typ Type
2020
}
2121

2222
func (t *typeNamed) ToChild() (Type, bool) {
2323
if t.typ == nil {
2424
var ok bool
25-
t.typ, ok = t.parser.nameds.Search(t.Name())
25+
t.typ, ok = t.info.Named.Search(t.Name())
2626
return t.typ, ok
2727
}
2828
return t.typ, true
@@ -173,29 +173,29 @@ func (t *typeNamed) IsVariadic() bool {
173173
}
174174

175175
func (t *typeNamed) NumMethods() int {
176-
if t.parser == nil {
176+
if t.info == nil {
177177
return 0
178178
}
179-
b := t.parser.method[t.Name()]
179+
b := t.info.Methods[t.Name()]
180180
return b.Len()
181181
}
182182

183183
func (t *typeNamed) Methods(i int) Type {
184-
if t.parser == nil {
184+
if t.info == nil {
185185
return nil
186186
}
187-
b := t.parser.method[t.Name()]
187+
b := t.info.Methods[t.Name()]
188188
if b.Len() <= i {
189189
return nil
190190
}
191191
return b.Index(i)
192192
}
193193

194194
func (t *typeNamed) MethodsByName(name string) (Type, bool) {
195-
if t.parser == nil {
195+
if t.info == nil {
196196
return nil, false
197197
}
198-
b := t.parser.method[t.Name()]
198+
b := t.info.Methods[t.Name()]
199199
m, ok := b.Search(name)
200200
if ok {
201201
return m, true

types_origin.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ import (
44
"go/ast"
55
)
66

7-
func newTypeOrigin(v Type, ori ast.Node, pkg string, goroot bool, doc, comment *ast.CommentGroup) Type {
7+
func newTypeOrigin(v Type, ori ast.Node, info *info, doc, comment *ast.CommentGroup) Type {
8+
pkg := info.PkgPath
9+
goroot := info.Goroot
810
if p := v.PkgPath(); p != "" {
911
pkg = p
1012
}

types_scope.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,32 @@
11
package gotype
22

3-
func newTypeScope(name string, parser *parser) Type {
3+
func newTypeScope(name string, info *info) Type {
44
return &typeScope{
5-
name: name,
6-
parser: parser,
5+
name: name,
6+
info: info,
77
}
88
}
99

1010
type typeScope struct {
1111
typeBase
12-
name string
13-
parser *parser
12+
name string
13+
info *info
1414
}
1515

1616
func (t *typeScope) String() string {
1717
return t.name
1818
}
1919

2020
func (t *typeScope) ChildByName(name string) (Type, bool) {
21-
return t.parser.nameds.Search(name)
21+
return t.info.Named.Search(name)
2222
}
2323

2424
func (t *typeScope) Child(i int) Type {
25-
return t.parser.nameds.Index(i)
25+
return t.info.Named.Index(i)
2626
}
2727

2828
func (t *typeScope) NumChild() int {
29-
return t.parser.nameds.Len()
29+
return t.info.Named.Len()
3030
}
3131

3232
func (t *typeScope) Name() string {

types_value_bind.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package gotype
22

3-
func newTypeValueBind(typ, val Type, pkg string, goroot bool) Type {
3+
func newTypeValueBind(typ, val Type, info *info) Type {
44
switch typ.Kind() {
55
case Struct:
66
if v, ok := val.(*typeValuePairs); ok {
@@ -11,7 +11,7 @@ func newTypeValueBind(typ, val Type, pkg string, goroot bool) Type {
1111
name := f.Name()
1212
b := f
1313
if val, ok := v.li.Search(name); ok {
14-
b = newTypeValueBind(f, val, pkg, goroot)
14+
b = newTypeValueBind(f, val, info)
1515
}
1616
nt.fields = append(nt.fields, b)
1717
}
@@ -21,17 +21,17 @@ func newTypeValueBind(typ, val Type, pkg string, goroot bool) Type {
2121
name := f.Name()
2222
b := f
2323
if val, ok := v.li.Search(name); ok {
24-
b = newTypeValueBind(f, val, pkg, goroot)
24+
b = newTypeValueBind(f, val, info)
2525
}
2626
nt.anonymo = append(nt.anonymo, b)
2727
}
2828
return nt
2929
}
3030
case Var:
3131
name := typ.Name()
32-
t := newTypeValueBind(typ.Elem(), val, pkg, goroot)
32+
t := newTypeValueBind(typ.Elem(), val, info)
3333
if typ.Origin() != nil {
34-
t = newTypeOrigin(t, typ.Origin(), pkg, goroot, typ.Doc(), typ.Comment())
34+
t = newTypeOrigin(t, typ.Origin(), info, typ.Doc(), typ.Comment())
3535
}
3636
return newTypeVar(name, t)
3737
}

0 commit comments

Comments
 (0)