2017-10-05 3 views
1

Je travaille actuellement sur un générateur de documentation qui va analyser le code Go pour produire une documentation personnalisée. J'ai besoin d'accéder aux commentaires écrits à l'intérieur d'une fonction. Mais je ne peux pas récupérer ces commentaires dans l'AST, ni avec go/doc. Voici un exemple:Accéder à un commentaire dans une fonction dans 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) 
     } 
    } 
} 

Il est facile de trouver GetFoo comments I can find easely mais pas Comment I would like to access Je l'ai vu ce post tout à fait de la même question Go parser not detecting Doc comments on struct type mais pour les types exportés

Est-il possible de le faire? Je vous remercie !

+0

Vous devriez trouver ce commentaire sur le premier noeud du corps de la fonction (l'initialiseur de 'test'). – Peter

+0

si je itère sur le corps de la fonction 'x.Body.List' je ne trouve rien, peut-être que je ne cherche pas au bon endroit? – al3x

+1

Vous voudrez peut-être vérifier ast paquet et l'exemple https://golang.org/pkg/go/ast/#example_CommentMap – Ravi

Répondre

2

Le problème est que la fonctionnalité doc.New analyse uniquement les chaînes de documentation et que le commentaire à l'intérieur de la fonction ne fait pas partie de la "documentation".

Vous devez directement parcourir l'ensemble des fichiers du package.

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

merci, je dois juste comprendre comment je peux repérer que ce commentaire est dans une fonction – al3x

+1

@ al3x utiliser 'FuncDecl'' Pos' et 'End' pour déterminer le début et la fin du corps, puis boucle sur le' * ast.Package.Files []. Commentaires []. Liste [] 'champs pour faire une boucle sur tous les commentaires dans le paquet, chaque commentaire a une position 'Slash', si c'est> start et mkopriva

+2

@ al3x [Exemple de travail] (https://play.golang.org/p/nK_ZOeZ6gC) – mkopriva