Как изящно пропустить идентичность пакета, когда я анализирую исходный файл пакета парсера? - PullRequest
0 голосов
/ 20 мая 2019

Когда я анализирую исходный файл с пакетом parser, оператор package xxx считается нормальным *ast.Ident. Есть ли способ отличить его от других деклараций? Или изящно игнорировать оператор пакета при разборе?

func walk(node ast.Node) bool {
    switch n := node.(type) {
    case *ast.File:
        return true
    case *ast.Ident:
        // I want to check whether it is a package statement 
    case *ast.GenDecl:
        return true
    case *ast.TypeSpec:
        return true
    case *ast.StructType:
        return true
    case *ast.FieldList:
        return true
    case *ast.Field:
        if len(n.Names) > 0 {
            fmt.Println(n.Names[0].String())
        }
    default:
        fmt.Printf("%T\n", node)
    }
    return false
}

func parseFile(filename string) error {
    fs := token.NewFileSet()
    f, err := parser.ParseFile(fs, filename, nil, parser.ParseComments)
    if err != nil {
        return err
    }
    ast.Inspect(f, walk)
    return nil
}

1 Ответ

0 голосов
/ 20 мая 2019

Чтобы пропустить идентификатор пакета, приложение должно написать код для перебора дочерних элементов * ast.File и пропустить идентификатор пакета в этом коде:

func walk(node ast.Node) bool {
    switch n := node.(type) {
    case *ast.File:
        walkFileNoPackageName(n)
        // Return false to prevent caller from also 
        // walking children of n.
        return false 
    ... other cases as in question


func walkFileNoPackageName(n *ast.File) {
    if n.Doc != nil {
        ast.Inspect(n.Doc, walk)
    }
    // ast.Inspect(n.Name, walk)  Skip over name
    for _, x := range n.Decls {
        ast.Inspect(x, walk)
    }
}

Запустить его надетская площадка .

Если вас интересуют только объявления уровня пакета в файле, начните проверку с этих объявлений:

f, err := parser.ParseFile(fs, filename, nil, parser.ParseComments)
if err != nil {
    return err
}
for _, n := range f.Decls {
    ast.Inspect(n, walk)
}

Используйте функцию walk извопрос как есть.

Запустите его на детской площадке .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...