/
methods.go
53 lines (45 loc) · 1.44 KB
/
methods.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package parser
import (
"go/ast"
"go/doc"
"go/types"
"strconv"
"strings"
"github.com/Joffref/genz/pkg/models"
)
func parseMethod(name string, signature *types.Signature) (models.Method, error) {
return parseMethodWithComments(nil, name, signature)
}
func parseMethodWithComments(doc *doc.Func, name string, signature *types.Signature) (models.Method, error) {
comments := []string{}
if doc != nil && doc.Doc != "" {
comments = strings.Split(strings.Trim(doc.Doc, "\n"), "\n")
}
params := map[string]models.Type{}
if signature.Params() != nil {
params = make(map[string]models.Type, signature.Params().Len())
for j := 0; j < signature.Params().Len(); j++ {
if signature.Params().At(j).Name() == "" { // unnamed parameter
params[strconv.Itoa(j)] = parseType(signature.Params().At(j).Type())
continue
}
params[signature.Params().At(j).Name()] = parseType(signature.Params().At(j).Type())
}
}
returns := []models.Type{}
if signature.Results() != nil {
returns = make([]models.Type, signature.Results().Len())
for j := 0; j < signature.Results().Len(); j++ {
returns[j] = parseType(signature.Results().At(j).Type())
}
}
_, isPointerReceiver := signature.Recv().Type().(*types.Pointer)
return models.Method{
Name: name,
IsExported: ast.IsExported(name),
IsPointerReceiver: isPointerReceiver,
Params: params,
Returns: returns,
Comments: comments,
}, nil
}