ホームページ >バックエンド開発 >Golang >Go Parser が型構造に関するコメントを検出できないのはなぜですか?

Go Parser が型構造に関するコメントを検出できないのはなぜですか?

DDD
DDDオリジナル
2024-11-07 02:49:03585ブラウズ

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

Go パーサーが型構造体のコメントを検出しない

質問

Go のパーサーと ast パッケージを使用して構造体型に関連付けられたドキュメント コメントを抽出しようとすると、型構造自体のコメントは見つかりません。関数とフィールドのコメントは存在しますが、FirstType と SecondType という名前の型のドキュメントがありません。

根本原因

この問題は、Go パーサーのデフォルトの解析動作が機能しないために発生します。ドキュメントのコメントを抽象構文ツリー (AST) の TypeSpec ノードに関連付けます。 TypeSpec に遭遇すると、パーサーは現在の Doc コメント ノードを消費し、AST から削除します。

ソリューション

純粋な AST でコメントを解析します

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

ケースを追加ast.GenDecl を AST 検査関数に渡します。これにより、GenDecl ノードに関連付けられたドキュメント コメントがチェックされます。ここには、型定義が複数の個別の定義の短縮形である特殊なケースで、型定義のコメントが保存されます。

ただし、このアプローチは満足のいくものではありません。ドキュメントのコメントは、AST 内の対応する TypeSpec ノードに添付されません。

推奨される解決策: 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
        })
    }
}

go/doc を使用すると、解析および取得するための標準化された包括的な方法が提供されます。構造体の型を含むすべての型のドキュメント コメント。これは、ドキュメント コメントが GenDecl ノードにアタッチされている場合を処理し、コメントと AST 内の対応するノードとの適切な関連付けを保証します。

以上がGo Parser が型構造に関するコメントを検出できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。