Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Go Parser Tidak Dapat Mengesan Komen pada Struktur Jenis?

Mengapa Go Parser Tidak Dapat Mengesan Komen pada Struktur Jenis?

DDD
DDDasal
2024-11-07 02:49:03497semak imbas

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

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

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!

Kenyataan:
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