| // Copyright 2020 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package driverutil |
| |
| // This file defines helpers for implementing [analysis.Pass.ReadFile]. |
| |
| import ( |
| "fmt" |
| "slices" |
| |
| "golang.org/x/tools/go/analysis" |
| ) |
| |
| // A ReadFileFunc is a function that returns the |
| // contents of a file, such as [os.ReadFile]. |
| type ReadFileFunc = func(filename string) ([]byte, error) |
| |
| // CheckedReadFile returns a wrapper around a Pass.ReadFile |
| // function that performs the appropriate checks. |
| func CheckedReadFile(pass *analysis.Pass, readFile ReadFileFunc) ReadFileFunc { |
| return func(filename string) ([]byte, error) { |
| if err := CheckReadable(pass, filename); err != nil { |
| return nil, err |
| } |
| return readFile(filename) |
| } |
| } |
| |
| // CheckReadable enforces the access policy defined by the ReadFile field of [analysis.Pass]. |
| func CheckReadable(pass *analysis.Pass, filename string) error { |
| if slices.Contains(pass.OtherFiles, filename) || |
| slices.Contains(pass.IgnoredFiles, filename) { |
| return nil |
| } |
| for _, f := range pass.Files { |
| if pass.Fset.File(f.FileStart).Name() == filename { |
| return nil |
| } |
| } |
| return fmt.Errorf("Pass.ReadFile: %s is not among OtherFiles, IgnoredFiles, or names of Files", filename) |
| } |