I completely missed the .Doc field in the ast.FuncDecl type. That's
perfect. Thanks.

On Sat, 2019-12-07 at 03:47 -0800, Charith Ellawala wrote:
> I am searching for a good way of doing this myself. An approach that
> seems 
> to work reasonably well is to just iterate through the AST files and 
> extract the function declarations:
> 
> cfg := &packages.Config{
>     Mode: packages.NeedName | packages.NeedTypes |
> packages.NeedSyntax | 
> packages.NeedFiles,
>     Dir:  os.Args[1],
> }
> 
> // packages.Load code omitted
> 
> for _, file := range pkg.Syntax {
>     for _, decl := range file.Decls {
>         if fn, ok := decl.(*ast.FuncDecl); ok {
>             fmt.Printf("func %s\n", fn.Name)
>             if fn.Doc != nil {
>                 fmt.Println(fn.Doc.Text())
>             }
>         }
>     }
> }
> 
> 
> I think there are some edge cases that this cannot handle such as 
> "floating" comments. I mainly work with Kubernetes code so I use the
> markers 
> package <https://godoc.org/sigs.k8s.io/controller-tools/pkg/markers>
> from 
> controller-tools -- which seems to handle those cases. The code is
> quite 
> complicated and I haven't had time to dive deeper and understand
> exactly 
> how they do it. Perhaps you will be able to find some pointers there.
> 
> On Friday, December 6, 2019 at 9:38:04 PM UTC, kortschak wrote:
> > 
> > I want to be able to extract function documentation in addition to
> > a 
> > variety of other information. I have a *packages.Package from 
> > packages.Load. Is there an easy way to get the function
> > documentation 
> > from this. At the moment I am obtaining a *doc.Package using the 
> > following code, but it seems more complicated than necessary and
> > it 
> > returns errors (I think) because I do not have an ast.Importer and
> > I 
> > don't see a place to get one. 
> > 
> > files := make(map[string]*ast.File) 
> > for _, f := range pkg.Syntax { 
> >         files[f.Name.Name] = f 
> > } 
> > astPkg, err := ast.NewPackage(pkg.Fset, files, nil,
> > ast.NewScope(nil)) 
> > if err != nil { 
> >         log.Printf("error preparing docs: %v", err) 
> > } 
> > docs := doc.New(astPkg, pkg.PkgPath, doc.PreserveAST) 
> > 
> > Is there a more sensible way to do this? 
> > 
> > thanks 
> > Dan 
> > 
> > 
> 
> 

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/a4005ec22fabf27f9e8584ad940967fdc782b2f1.camel%40kortschak.io.

Reply via email to