Mengapa Go Parser Tidak Dapat Mengesan Komen pada Struktur Jenis?

DDD
Lepaskan: 2024-11-07 02:49:03
asal
502 orang telah melayarinya

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

Go Parser tidak Mengesan Komen pada Struktur Jenis

Soalan

Apabila cuba mengekstrak komen dokumentasi yang dikaitkan dengan jenis struct menggunakan parser Go dan pakej ast, komen untuk struktur jenis itu sendiri tidak ditemui. Komen untuk fungsi dan medan ada, tetapi dokumentasi untuk jenis bernama FirstType dan SecondType tiada.

Punca Punca

Isu timbul kerana kelakuan penghuraian lalai penghurai Go tidak kaitkan ulasan dokumentasi dengan nod TypeSpec dalam Pokok Sintaks Abstrak (AST). Apabila menemui TypeSpec, penghurai menggunakan mana-mana nod ulasan Doc yang ada dan mengalih keluarnya daripada AST.

Penyelesaian

Menghuraikan ulasan dengan AST tulen

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
    })
}
Salin selepas log masuk

Tambah kes untuk ast.GenDecl kepada fungsi pemeriksaan AST. Ini akan menyemak ulasan dokumentasi yang dikaitkan dengan nod GenDecl, di mana ulasan untuk definisi jenis disimpan dalam kes khas di mana definisi jenis ialah penguncupan beberapa definisi individu.

Walau bagaimanapun, pendekatan ini tidak memuaskan kerana ulasan dokumentasi tidak dilampirkan pada nod TypeSpec yang sepadan dalam AST.

Penyelesaian Pilihan: Gunakan 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
        })
    }
}
Salin selepas log masuk

Menggunakan go/doc menyediakan cara yang standard dan komprehensif untuk menghuraikan dan mendapatkan semula ulasan dokumentasi untuk semua jenis, termasuk jenis struct. Ia mengendalikan kes di mana ulasan dokumentasi dilampirkan pada nod GenDecl dan memastikan perkaitan komen yang betul dengan nod yang sepadan dalam AST.

Atas ialah kandungan terperinci Mengapa Go Parser Tidak Dapat Mengesan Komen pada Struktur Jenis?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!