Heim > Artikel > Backend-Entwicklung > Warum kann Go Parser keine Kommentare zu Typstrukturen erkennen?
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.
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.
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!