Heim  >  Artikel  >  Backend-Entwicklung  >  Warum kann Go Parser keine Kommentare zu Typstrukturen erkennen?

Warum kann Go Parser keine Kommentare zu Typstrukturen erkennen?

DDD
DDDOriginal
2024-11-07 02:49:03497Durchsuche

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

Go-Parser erkennt keine Kommentare zu Typstrukturen

Frage

Beim Versuch, mit Strukturtypen verknüpfte Dokumentationskommentare mithilfe der Parser- und AAST-Pakete von Go zu extrahieren, Die Kommentare für die Typstrukturen selbst wurden nicht gefunden. Die Kommentare für Funktionen und Felder sind vorhanden, aber die Dokumentation für die Typen „FirstType“ und „SecondType“ fehlt.

Ursache

Das Problem entsteht, weil das Standard-Parsing-Verhalten des Go-Parsers dies nicht tut Verknüpfen Sie Dokumentationskommentare mit TypeSpec-Knoten im Abstract Syntax Tree (AST). Wenn er auf eine TypeSpec stößt, verbraucht der Parser alle vorhandenen Doc-Kommentarknoten und entfernt sie aus dem AST.

Lösung

Kommentare mit reinem AST analysieren

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

Fall hinzufügen für ast.GenDecl zur AST-Inspektionsfunktion. Dadurch wird nach Dokumentationskommentaren gesucht, die mit GenDecl-Knoten verknüpft sind. Dort werden Kommentare für Typdefinitionen gespeichert, für den Sonderfall, dass eine Typdefinition eine Zusammenfassung mehrerer einzelner Definitionen ist.

Dieser Ansatz ist jedoch unbefriedigend, da die Dokumentationskommentare werden nicht an die entsprechenden TypeSpec-Knoten im AST angehängt.

Bevorzugte Lösung: Verwenden Sie 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
        })
    }
}

Die Verwendung von go/doc bietet eine standardisierte und umfassende Möglichkeit zum Parsen und Abrufen Dokumentationskommentare für alle Typen, einschließlich Strukturtypen. Es behandelt den Fall, in dem der Dokumentationskommentar an den GenDecl-Knoten angehängt wird, und stellt die ordnungsgemäße Zuordnung von Kommentaren zu den entsprechenden Knoten im AST sicher.

Das obige ist der detaillierte Inhalt vonWarum kann Go Parser keine Kommentare zu Typstrukturen erkennen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn