访问Go中函数内的注释

时间:2017-10-05 14:39:24

标签: parsing go

我目前正在开发文档生成器,它将解析Go代码以生成自定义文档。我需要访问函数内部的注释。但我无法在go / doc中检索AST中的这些注释。这是一个例子:

package main

import (
    "fmt"
    "go/doc"
    "go/parser"
    "go/token"
)

// GetFoo comments I can find easely
func GetFoo() {
    // Comment I would like to access
    test := 1
    fmt.Println(test)
}

func main() {
    fset := token.NewFileSet() // positions are relative to fset
    d, err := parser.ParseDir(fset, "./", nil, parser.ParseComments)
    if err != nil {
        fmt.Println(err)
        return
    }
    for k, f := range d {
        fmt.Println("package", k)
        p := doc.New(f, "./", 2)

        for _, t := range p.Types {
            fmt.Println("type", t.Name)
            fmt.Println("docs:", t.Doc)
        }

        for _, v := range p.Vars {
            fmt.Println("type", v.Names)
            fmt.Println("docs:", v.Doc)
        }

        for _, f := range p.Funcs {
            fmt.Println("type", f.Name)
            fmt.Println("docs:", f.Doc)
        }

        for _, n := range p.Notes {
            fmt.Println("body", n[0].Body)
        }
    }
}

很容易找到GetFoo comments I can find easely但不是Comment I would like to access 我看过这篇文章非常相似的问题Go parser not detecting Doc comments on struct type,但对于导出的类型

有没有办法做到这一点?谢谢!

1 个答案:

答案 0 :(得分:2)

问题是doc.New功能只解析文档字符串,函数内的注释不是“文档”的一部分。

您需要直接迭代包中的文件。

package main

import (
        "fmt"
        "go/parser"
        "go/token"
)

// GetFoo comments I can find easely
func GetFoo() {
        // Comment I would like to access
        test := 1
        fmt.Println(test)
}

func main() {
        fset := token.NewFileSet() // positions are relative to fset
        d, err := parser.ParseDir(fset, "./", nil, parser.ParseComments)
        if err != nil {
                fmt.Println(err)
                return
        }
        for k, f := range d {
                fmt.Println("package", k)
                for n, f := range f.Files {
                        fmt.Printf("File name: %q\n", n)
                        for i, c := range f.Comments {
                                fmt.Printf("Comment Group %d\n", i)
                                for i2, c1 := range c.List {
                                        fmt.Printf("Comment %d: Position: %d, Text: %q\n", i2, c1.Slash, c1.Text)
                                }
                        }
                }

        }
}