Lors de la tentative d'extraction de commentaires de documentation associés aux types de structure à l'aide de l'analyseur Go et des packages ast, les commentaires pour les structures de types elles-mêmes sont introuvables. Les commentaires pour les fonctions et les champs sont présents, mais la documentation pour les types nommés FirstType et SecondType est manquante.
Le problème survient car le comportement d'analyse par défaut de l'analyseur Go ne associer les commentaires de documentation aux nœuds TypeSpec dans l'arbre de syntaxe abstraite (AST). Lorsqu'il rencontre un TypeSpec, l'analyseur consomme tout nœud de commentaire Doc présent et le supprime de l'AST.
Analyser les commentaires avec de l'AST pur
for _, f := range d { ast.Inspect(f, func(n ast.Node) bool { switch x := n.(type) { case *ast.FuncDecl: fmt.Printf("%s:\tFuncDecl %s\t%s\n", fset.Position(n.Pos()), x.Name, x.Doc.Text()) case *ast.TypeSpec: fmt.Printf("%s:\tTypeSpec %s\t%s\n", fset.Position(n.Pos()), x.Name, x.Doc.Text()) case *ast.Field: fmt.Printf("%s:\tField %s\t%s\n", fset.Position(n.Pos()), x.Names, x.Doc.Text()) case *ast.GenDecl: fmt.Printf("%s:\tGenDecl %s\n", fset.Position(n.Pos()), x.Doc.Text()) } return true }) }
Ajouter un cas pour ast.GenDecl à la fonction d’inspection AST. Cela vérifiera les commentaires de documentation associés aux nœuds GenDecl, où les commentaires pour les définitions de type sont stockés dans le cas particulier où une définition de type est une contraction de plusieurs définitions individuelles.
Cependant, cette approche n'est pas satisfaisante car le les commentaires de la documentation ne sont pas attachés aux nœuds TypeSpec correspondants dans l'AST.
Solution préférée : utiliser go/doc
import ( "go/doc" ) func main() { d, err := doc.ParseDir("./", nil, doc.AllDecls) if err != nil { fmt.Println(err) return } for _, info := range d { ast.Inspect(info.Decl, func(n ast.Node) bool { switch x := n.(type) { // ... inspecting cases for functions, fields, etc. case *ast.TypeSpec: fmt.Printf("%s:\tTypeSpec %s\t%s\n", fset.Position(n.Pos()), x.Name, info.Doc) } return true }) } }
L'utilisation de go/doc fournit un moyen standardisé et complet d'analyser et de récupérer commentaires de documentation pour tous les types, y compris les types struct. Il gère le cas où le commentaire de la documentation est attaché au nœud GenDecl et assure la bonne association des commentaires avec les nœuds correspondants dans l'AST.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!