diff --git a/parser/parser.go b/parser/parser.go index b8b9852..1c0b94c 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -1,13 +1,9 @@ package parser import ( - "fmt" "go/ast" "go/parser" "go/token" - "os" - "path" - "path/filepath" "strings" ) @@ -93,29 +89,3 @@ func (p *Parser) Parse(fname string, isDir bool) error { } return nil } - -func getPkgPath(fname string, isDir bool) (string, error) { - fname, err := filepath.Abs(fname) - if err != nil { - return "", err - } - - for _, p := range filepath.SplitList(os.Getenv("GOPATH")) { - gopath := filepath.Join(p, "src") - pkg, err := filepath.Rel(gopath, fname) - if err != nil { - continue - } - - if pkg != fname { - p := normalizePath(pkg) - - if !isDir { - return path.Dir(p), nil - } - return p, nil - } - } - - return "", fmt.Errorf("file '%v' is not in GOPATH", fname) -} diff --git a/parser/parser_test.go b/parser/parser_test.go deleted file mode 100644 index 7be4654..0000000 --- a/parser/parser_test.go +++ /dev/null @@ -1,26 +0,0 @@ -package parser - -import "testing" - -func TestGetPkgPath(t *testing.T) { - cases := []struct { - fname string - isDir bool - }{ - {"parser.go", false}, - {".", true}, - } - exp := "github.com/mailru/easyjson/parser" - - for _, tc := range cases { - - pkg, err := getPkgPath(tc.fname, tc.isDir) - if err != nil { - t.Error(err) - } - if pkg != exp { - t.Errorf("in: \"%s\" isDir: %v want: %s got: %s", tc.fname, tc.isDir, exp, pkg) - } - } - -} diff --git a/parser/parser_unix.go b/parser/parser_unix.go index a5a9451..a1b9d84 100644 --- a/parser/parser_unix.go +++ b/parser/parser_unix.go @@ -2,6 +2,32 @@ package parser -func normalizePath(path string) string { - return path +import ( + "fmt" + "os" + "path" + "strings" +) + +func getPkgPath(fname string, isDir bool) (string, error) { + if !path.IsAbs(fname) { + pwd, err := os.Getwd() + if err != nil { + return "", err + } + fname = path.Join(pwd, fname) + } + + for _, p := range strings.Split(os.Getenv("GOPATH"), ":") { + prefix := path.Join(p, "src") + "/" + if rel := strings.TrimPrefix(fname, prefix); rel != fname { + if !isDir { + return path.Dir(rel), nil + } else { + return path.Clean(rel), nil + } + } + } + + return "", fmt.Errorf("file '%v' is not in GOPATH", fname) } diff --git a/parser/parser_windows.go b/parser/parser_windows.go index cd4be7c..64974aa 100644 --- a/parser/parser_windows.go +++ b/parser/parser_windows.go @@ -1,9 +1,37 @@ -package parser - -import ( - "strings" -) - -func normalizePath(path string) string { - return strings.Replace(path, "\\", "/", -1) -} +package parser + +import ( + "fmt" + "os" + "path" + "strings" +) + +func normalizePath(path string) string { + return strings.Replace(path, "\\", "/", -1) +} + +func getPkgPath(fname string, isDir bool) (string, error) { + if !path.IsAbs(fname) { + pwd, err := os.Getwd() + if err != nil { + return "", err + } + fname = path.Join(pwd, fname) + } + + fname = normalizePath(fname) + + for _, p := range strings.Split(os.Getenv("GOPATH"), ";") { + prefix := path.Join(normalizePath(p), "src") + "/" + if rel := strings.TrimPrefix(fname, prefix); rel != fname { + if !isDir { + return path.Dir(rel), nil + } else { + return path.Clean(rel), nil + } + } + } + + return "", fmt.Errorf("file '%v' is not in GOPATH", fname) +}