From 73c829359bc11dd452e190fc823e10c1ccceb17e Mon Sep 17 00:00:00 2001 From: franklin Date: Fri, 12 Feb 2021 09:12:00 +0100 Subject: [PATCH] add interface support --- servicereader.go | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/servicereader.go b/servicereader.go index 9bf3b5c..d5b0405 100644 --- a/servicereader.go +++ b/servicereader.go @@ -29,8 +29,7 @@ func readServiceFile(file *ast.File, packageName string, services ServiceList) e fileImports := getFileImports(file, packageName) for _, decl := range file.Decls { - if reflect.ValueOf(decl).Type().String() == "*ast.FuncDecl" { - funcDecl := decl.(*ast.FuncDecl) + if funcDecl, ok := decl.(*ast.FuncDecl); ok { if funcDecl.Recv != nil { trace("that is a method named", funcDecl.Name) if len(funcDecl.Recv.List) == 1 { @@ -61,6 +60,36 @@ func readServiceFile(file *ast.File, packageName string, services ServiceList) e } else { trace("no receiver for", funcDecl.Name) } + } else if genDecl, ok := decl.(*ast.GenDecl); ok { + if genDecl.Tok != token.TYPE { + continue + } + for _, spec := range genDecl.Specs { + if typeSpec, ok := spec.(*ast.TypeSpec); ok { + ident := typeSpec.Name + trace("that is an interface named", ident.Name) + if service, ok := findService(ident.Name); ok { + + if iSpec, ok := typeSpec.Type.(*ast.InterfaceType); ok { + for _, fieldDecl := range iSpec.Methods.List { + if funcDecl, ok := fieldDecl.Type.(*ast.FuncType); ok { + if len(fieldDecl.Names) == 0 { + continue + } + mname := fieldDecl.Names[0] + trace(" on sth:", mname.Name) + //fmt.Println("interface:", ident.Name, "method:", mname.Name) + service.Methods = append(service.Methods, &Method{ + Name: mname.Name, + Args: readFields(funcDecl.Params, fileImports), + Return: readFields(funcDecl.Results, fileImports), + }) + } + } + } + } + } + } } } for _, s := range services {