Expand description
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.
VFS stores a flat list of files. file_set::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.
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 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
Structs
PathBuf
.Vfs
.