2017-10-05 10 views
1

私は現在、Goのコードを解析してカスタムドキュメントを生成するドキュメントジェネレータに取り組んでいます。私は関数内に書かれたコメントにアクセスする必要があります。しかし、私はASTでこれらのコメントを取得することはできません。go/docでは取得できません。ここでは一例です:?Go内の関数内のコメントへのアクセス

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) 
     } 
    } 
} 

それは私がこの記事は非常に類似した質問Go parser not detecting Doc comments on struct typeを見てきましたが、エクスポートされたタイプのため

はそれを行うにはどのような方法がありますGetFoo comments I can find easelyではなくComment I would like to access を見つけるのは簡単ですかありがとうございました !

+0

関数本体の最初のノード( 'test'の初期化子)のコメントを見つける必要があります。 – Peter

+0

func 'x.Body.List'の本体を反復処理しても何も見つからない場合は、適切な場所で検索しないでください。 – al3x

+1

astパッケージと、https://golang.org/pkg/go/ast/#example_CommentMap – Ravi

答えて

2

問題は、doc.New機能がドキュメント文字列の解析のみであり、関数内のコメントが「ドキュメント」の一部ではないという点です。

パッケージ内のファイルのastを直接反復したいと思うでしょう。

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) 
           } 
         } 
       } 

     } 
} 
+0

ありがとう、私はちょうどこのコメントが関数内にあることがわかります – al3x

+1

@ al3x 'FuncDecl'の' Pos'と 'End'を使ってボディの開始と終了を決定し、' *パッケージ内のすべてのコメントをループするための[]。リスト[] 'フィールド。それぞれのコメントは、スラッシュの位置にあります。開始><終了の場合は、あなたのコメントがあります。 – mkopriva

+2

@ al3x [動作例](https://play.golang.org/p/nK_ZOeZ6gC) – mkopriva

関連する問題