[−][src]Crate ra_ap_vfs
Virtual File System
VFS stores all files read by rust-analyzer. Reading file contents from VFS
always returns the same contents, unless VFS was explicitly modified with
set_file_contents
. All changes to VFS are logged, and can be retrieved via
take_changes
method. The pack of changes is then pushed to salsa
and
triggers incremental recomputation.
Files in VFS are identified with FileId
s -- interned paths. The notion of
the path, VfsPath
is somewhat abstract: at the moment, it is represented
as an std::path::PathBuf
internally, but this is an implementation detail.
VFS doesn't do IO or file watching itself. For that, see the loader
module. loader::Handle
is an object-safe trait which abstracts both file
loading and file watching. Handle
is dynamically configured with a set of
directory entries which should be scanned and watched. Handle
then
asynchronously pushes file changes. Directory entries are configured in
free-form via list of globs, it's up to the Handle
to interpret the globs
in any specific way.
A simple WalkdirLoaderHandle
is provided, which doesn't implement watching
and just scans the directory using walkdir.
VFS stores a flat list of files. FileSet
can partition this list of files
into disjoint sets of files. Traversal-like operations (including getting
the neighbor file by the relative path) are handled by the FileSet
.
FileSet
s are also pushed to salsa and cause it to re-check mod foo;
declarations when files are created or deleted.
file_set::FileSet
and loader::Entry
play similar, but different roles.
Both specify the "set of paths/files", one is geared towards file watching,
the other towards salsa changes. In particular, single file_set::FileSet
may correspond to several loader::Entry
. For example, a crate from
crates.io which uses code generation would have two Entries
-- for sources
in ~/.cargo
, and for generated code in ./target/debug/build
. It will
have a single FileSet
which unions the two sources.
Modules
file_set | Partitions a list of files into disjoint subsets. |
loader | Object safe interface for file watching and reading. |
Structs
AbsPath | |
AbsPathBuf | |
AnchoredPath | |
AnchoredPathBuf | |
ChangedFile | |
FileId | |
Vfs | |
VfsPath | Long-term, we want to support files which do not reside in the file-system, so we treat VfsPaths as opaque identifiers. |
Enums
ChangeKind |