| // Copyright 2018 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 cache |
| |
| import ( |
| "context" |
| "go/token" |
| "path/filepath" |
| "strings" |
| "sync" |
| |
| "golang.org/x/tools/internal/lsp/source" |
| "golang.org/x/tools/internal/span" |
| ) |
| |
| // viewFile extends source.File with helper methods for the view package. |
| type viewFile interface { |
| source.File |
| |
| filename() string |
| addURI(uri span.URI) int |
| } |
| |
| // fileBase holds the common functionality for all files. |
| // It is intended to be embedded in the file implementations |
| type fileBase struct { |
| uris []span.URI |
| fname string |
| kind source.FileKind |
| |
| view *view |
| |
| handleMu sync.Mutex |
| handle source.FileHandle |
| } |
| |
| func basename(filename string) string { |
| return strings.ToLower(filepath.Base(filename)) |
| } |
| |
| func (f *fileBase) URI() span.URI { |
| return f.uris[0] |
| } |
| |
| func (f *fileBase) filename() string { |
| return f.fname |
| } |
| |
| // View returns the view associated with the file. |
| func (f *fileBase) View() source.View { |
| return f.view |
| } |
| |
| // Content returns a handle for the contents of the file. |
| func (f *fileBase) Handle(ctx context.Context) source.FileHandle { |
| f.handleMu.Lock() |
| defer f.handleMu.Unlock() |
| |
| if f.handle == nil { |
| f.handle = f.view.Session().GetFile(f.URI()) |
| } |
| return f.handle |
| } |
| |
| func (f *fileBase) FileSet() *token.FileSet { |
| return f.view.Session().Cache().FileSet() |
| } |