2017-05-11 122 views
1

我無法讓parser.ParseDir返回返回的struct.Imports字段中的任何信息。但parser.ParseFile似乎工作。我寧願使用ParseDir,而不必在每個文件上通過並調用ParseFile。以下是我所嘗試的:無法獲取parser.ParseDir來解析導入語句

package crawlers 

import (
    "fmt" 
    "go/parser" 
    "go/token" 
    "os" 
    "path/filepath" 
) 

type GoImports struct { 
    //imports []*string 
} 

//returns fullpaths 
func (g *GoImports) Crawl(entry string) ([]*string, error) { 
    fp, err := filepath.Abs(entry) 
    if err != nil { 
    return nil, err 
    } 
    info, err := os.Stat(fp) 
    if err != nil { 
    return nil, err 
    } 
    if !info.IsDir() { 
    return nil, fmt.Errorf("Entry point should be a path to a directory of a go package.") 
    } 
    fset := token.NewFileSet() 
    //foo, err := parser.ParseDir(fset, fp, nil, parser.ImportsOnly) 
    //foo, err := parser.ParseDir(fset, "/Users/dowen00/local/go/src/got/crawlers/testdata/barpackage", nil, parser.ImportsOnly) 
    foo, err := parser.ParseDir(fset, "/Users/dowen00/local/go/src/opscli", func(os.FileInfo) bool { return true }, parser.ImportsOnly) 
    //_, err = parser.ParseDir(fset, "/Users/dowen00/local/go/src/got/crawlers/testdata", nil, parser.ImportsOnly) 
    //foo, err := parser.ParseFile(fset, "/Users/dowen00/local/go/src/got/crawlers/testdata/barpackage/bar.go", nil, parser.ImportsOnly) 
    if err != nil { 
    return nil, err 
    } 
    //fmt.Printf("%c\n", foo) 
    //fmt.Printf("%c\n", fset) 
    for k, v := range foo { 
    //for kv, vv := range v.Imports { 
    //fmt.Printf("%s: %c\n", kv, vv) 
    //} 
    fmt.Printf("%s: %c\n", k, v.Imports) 
    } 
    return nil, nil 
} 

我在做什麼錯?

+0

沒用過解析器包,但有一點我注意到的是,它看起來像的文檔表明,如果你不打算使用你可以設置過濾器,以零它:https://golang.org/pkg/go/parser/#ParseDir。這只是你不必擔心的一件事。 –

+0

跟進;這似乎適用於我,都使用過濾器和沒有;如果你做了k和v的打印,你會看到一張地圖被返回。 –

+0

是的,我看到地圖。但地圖是空的。我肯定會在我嘗試過的每個軟件包上導入內容,這兩個軟件包都包含在軟件包和我自己的軟件包中。在任何情況下,返回的地圖都是空的。直接使用ParseFile時,導入地圖不是空的。 – Dale

回答

0

我能夠解決這個問題。如果這實際上還沒有實施,那麼https://golang.org/pkg/go/parser/#ParseDir的go doc文件可能應該修改以避免浪費人們的時間。

這裏的工作都是圍繞:

for _, v := range foo { 
    //for kv, vv := range v.Imports { 
    //fmt.Printf("%s: %c\n", kv, vv) 
    //} 
    for kk, vv := range v.Files { 
     for _, i := range vv.Imports { 
     fmt.Printf("%s: %s\n", kk, i.Path.Value) 
     } 
    } 
    //fmt.Printf("%s: %c\n", k, v.Files) 
    } 
相關問題