/
interface.go
55 lines (48 loc) · 1.71 KB
/
interface.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
54
55
package parser
import (
"go/ast"
"go/types"
"github.com/Joffref/genz/pkg/models"
"golang.org/x/tools/go/packages"
)
// parseInterface parses the given interface and returns a models.Element.
// It also parses the subInterfaces of the given interface and the methods of the subInterfaces recursively.
func parseInterface(pkg *packages.Package, interfaceName string, interfaceType *ast.InterfaceType) (models.Element, error) {
parsedInterface, err := parseElementType(pkg, interfaceName)
if err != nil {
return models.Element{}, err
}
var methods []models.Method
for _, method := range interfaceType.Methods.List {
switch pkg.TypesInfo.TypeOf(method.Type).(type) {
case *types.Signature:
methodModel, err := parseMethod(method.Names[0].Name, pkg.TypesInfo.TypeOf(method.Type).(*types.Signature))
if err != nil {
return models.Element{}, err
}
if method.Doc != nil {
for _, comment := range method.Doc.List {
methodModel.Comments = append(methodModel.Comments, comment.Text[2:])
}
}
methods = append(methods, methodModel)
case *types.Named: // Embedded interface
namedType := pkg.TypesInfo.TypeOf(method.Type).(*types.Named)
iface := namedType.Origin().Underlying().(*types.Interface).Complete()
for i := 0; i < iface.NumMethods(); i++ {
methodModel, err := parseMethod(iface.Method(i).Name(), iface.Method(i).Type().(*types.Signature))
if err != nil {
return models.Element{}, err
}
if method.Doc != nil {
for _, comment := range method.Doc.List {
methodModel.Comments = append(methodModel.Comments, comment.Text[2:])
}
}
methods = append(methods, methodModel)
}
}
}
parsedInterface.Methods = methods
return parsedInterface, nil
}