无法获取parser.ParseDir来解析Import语句

时间:2017-05-11 19:44:55

标签: go

我无法获取parser.ParseDir以返回返回的struct.Imports字段中的任何信息。但是,parser.ParseFile似乎确实有效。我宁愿使用ParseDir而不是必须通过并在每个文件上调用ParseFile。以下是我尝试过的内容:

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
}

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我能够解决这个问题。事实上,如果没有实施,https://golang.org/pkg/go/parser/#ParseDir的go文档应该进行修改,以避免浪费人们的时间。

以下是解决方法:

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