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
Libérer: 2024-11-07 02:49:03
original
607 Les gens l'ont consulté

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
    })
}
Copier après la connexion

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
        })
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal