// Setup configures a *build.Context to use the given VFS // as its filesystem. func Setup(ctx *build.Context, fs vfs.VFS) { ctx.JoinPath = path.Join ctx.SplitPathList = filepath.SplitList ctx.IsAbsPath = func(p string) bool { return p != "" && p[0] == '/' } ctx.IsDir = func(p string) bool { stat, err := fs.Stat(p) return err == nil && stat.IsDir() } ctx.HasSubdir = func(root, dir string) (string, bool) { root = path.Clean(root) if !strings.HasSuffix(root, separator) { root += separator } dir = path.Clean(dir) if !strings.HasPrefix(dir, root) { return "", false } return dir[len(root):], true } ctx.ReadDir = fs.ReadDir ctx.OpenFile = func(p string) (io.ReadCloser, error) { return fs.Open(p) } }
func (w *Walker) setMemoryContext(ctxt *build.Context) { ctxt.JoinPath = path.Join ctxt.IsAbsPath = path.IsAbs ctxt.IsDir = func(path string) bool { panic("unexpected") } ctxt.HasSubdir = func(root, dir string) (rel string, ok bool) { panic("unexpected") } ctxt.ReadDir = func(dir string) (fi []os.FileInfo, err error) { return w.readDir(dir) } ctxt.OpenFile = func(path string) (r io.ReadCloser, err error) { return w.openFile(path) } }
func (pkg *pkg) parseFile(ctx *build.Context, name string) (*ast.File, error) { f, err := ctx.OpenFile(ctx.JoinPath(pkg.Build.Dir, name)) if err != nil { return nil, err } defer f.Close() p, err := ioutil.ReadAll(f) if err != nil { return nil, err } // overwrite //line comments for _, m := range linePat.FindAllIndex(p, -1) { for i := m[0] + 2; i < m[1]; i++ { p[i] = ' ' } } return parser.ParseFile(pkg.FSet, name, p, parser.ParseComments) }
// Import returns details about the package in the directory. func (dir *Directory) Import(ctx *build.Context, mode build.ImportMode) (*build.Package, error) { safeCopy := *ctx ctx = &safeCopy ctx.JoinPath = path.Join ctx.IsAbsPath = path.IsAbs ctx.SplitPathList = func(list string) []string { return strings.Split(list, ":") } ctx.IsDir = func(path string) bool { return false } ctx.HasSubdir = func(root, dir string) (rel string, ok bool) { return "", false } ctx.ReadDir = dir.readDir ctx.OpenFile = dir.openFile return ctx.ImportDir(".", mode) }
// JoinPath behaves like filepath.Join, // but uses the build context's file system interface, if any. func JoinPath(ctxt *build.Context, path ...string) string { if ctxt.JoinPath != nil { return ctxt.JoinPath(path...) } return filepath.Join(path...) }