Maison >développement back-end >Golang >Pourquoi Go Parser ne peut-il pas détecter les commentaires sur les structures de types ?

Pourquoi Go Parser ne peut-il pas détecter les commentaires sur les structures de types ?

DDD
DDDoriginal
2024-11-07 02:49:03659parcourir

Why Can't Go Parser Detect Comments on Type Structures?

Go Parser ne détecte pas les commentaires sur les structures de type

Question

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.

Cause première

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.

Solution

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn