Skip to content

Commit c354a7c

Browse files
committed
Simplify find and remove branches
1 parent 2d1e59f commit c354a7c

File tree

1 file changed

+42
-85
lines changed

1 file changed

+42
-85
lines changed

crates/compilers/src/cache.rs

Lines changed: 42 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -792,7 +792,7 @@ impl<T: ArtifactOutput<CompilerContract = C::CompilerContract>, C: Compiler>
792792
self.missing_extra_files()
793793
}
794794

795-
// Walks over all cache entries, detects dirty files and removes them from cache.
795+
// Walks over all cache entires, detects dirty files and removes them from cache.
796796
fn find_and_remove_dirty(&mut self) {
797797
fn populate_dirty_files<D>(
798798
file: &Path,
@@ -845,117 +845,74 @@ impl<T: ArtifactOutput<CompilerContract = C::CompilerContract>, C: Compiler>
845845
}
846846
}
847847

848-
let mut sources = Sources::new();
849848
// Iterate over existing cache entries.
850849
let files = self.cache.files.keys().cloned().collect::<HashSet<_>>();
850+
851+
let mut sources = Sources::new();
852+
851853
// Read all sources, marking entries as dirty on I/O errors.
852-
for file in self.cache.files.keys().cloned().collect::<Vec<_>>() {
853-
let Ok(source) = Source::read(&file) else {
854-
if !self.cache.preprocessed {
855-
self.dirty_sources.insert(file.clone());
856-
} else {
857-
self.cache.files.remove(&file);
858-
}
854+
for file in &files {
855+
let Ok(source) = Source::read(file) else {
856+
self.dirty_sources.insert(file.clone());
859857
continue;
860858
};
861859
sources.insert(file.clone(), source);
862860
}
863861

864-
if self.cache.preprocessed {
862+
// Build a temporary graph for walking imports. We need this because `self.edges`
863+
// only contains graph data for in-scope sources but we are operating on cache entries.
864+
if let Ok(graph) = Graph::<C::ParsedSource>::resolve_sources(&self.project.paths, sources) {
865+
let (sources, edges) = graph.into_sources();
866+
865867
// Calculate content hashes for later comparison.
866868
self.fill_hashes(&sources);
867869

868870
// Pre-add all sources that are guaranteed to be dirty
869-
for file in self.cache.files.keys() {
871+
for file in sources.keys() {
870872
if self.is_dirty_impl(file, false) {
871873
self.dirty_sources.insert(file.clone());
872874
}
873875
}
874-
}
875876

876-
// Build a temporary graph for walking imports or populate cache (if preprocessed).
877-
// For non preprocessed caches we need this because `self.edges` only contains graph data
878-
// for in-scope sources.
879-
// For preprocessed caches we want to ensure that we preserve all just removed entries
880-
// with updated data.
881-
// We need separate graph for this because `self.edges` only contains graph data for
882-
// in-scope sources but we are operating on cache entries.
883-
let sources = match Graph::<C::ParsedSource>::resolve_sources(&self.project.paths, sources)
884-
{
885-
Ok(graph) => {
886-
let (sources, edges) = graph.into_sources();
887-
if !self.cache.preprocessed {
888-
// Calculate content hashes for later comparison.
889-
self.fill_hashes(&sources);
890-
891-
// Pre-add all sources that are guaranteed to be dirty
892-
for file in sources.keys() {
893-
if self.is_dirty_impl(file, false) {
894-
self.dirty_sources.insert(file.clone());
895-
}
896-
}
897-
898-
// Perform DFS to find direct/indirect importers of dirty files.
899-
for file in self.dirty_sources.clone().iter() {
900-
populate_dirty_files(file, &mut self.dirty_sources, &edges);
877+
if !self.cache.preprocessed {
878+
// Perform DFS to find direct/indirect importers of dirty files.
879+
for file in self.dirty_sources.clone().iter() {
880+
populate_dirty_files(file, &mut self.dirty_sources, &edges);
881+
}
882+
} else {
883+
// Mark sources as dirty based on their imports
884+
for file in sources.keys() {
885+
if self.dirty_sources.contains(file) {
886+
continue;
901887
}
902-
None
903-
} else {
904-
// Mark sources as dirty based on their imports
905-
for file in sources.keys() {
906-
if self.dirty_sources.contains(file) {
907-
continue;
908-
}
909-
let is_src = self.is_source_file(file);
910-
for import in edges.imports(file) {
911-
// Any source file importing dirty source file is dirty.
912-
if is_src && self.dirty_sources.contains(import) {
913-
self.dirty_sources.insert(file.clone());
914-
break;
915-
// For non-src files we mark them as dirty only if they import dirty
916-
// non-src file or src file for which
917-
// interface representation changed.
918-
} else if !is_src
919-
&& self.dirty_sources.contains(import)
920-
&& (!self.is_source_file(import)
921-
|| self.is_dirty_impl(import, true))
922-
{
923-
self.dirty_sources.insert(file.clone());
924-
}
888+
let is_src = self.is_source_file(file);
889+
for import in edges.imports(file) {
890+
// Any source file importing dirty source file is dirty.
891+
if is_src && self.dirty_sources.contains(import) {
892+
self.dirty_sources.insert(file.clone());
893+
break;
894+
// For non-src files we mark them as dirty only if they import dirty
895+
// non-src file or src file for which
896+
// interface representation changed.
897+
} else if !is_src
898+
&& self.dirty_sources.contains(import)
899+
&& (!self.is_source_file(import) || self.is_dirty_impl(import, true))
900+
{
901+
self.dirty_sources.insert(file.clone());
925902
}
926903
}
927-
Some(sources)
928904
}
929905
}
930-
Err(_) => {
931-
if !self.cache.preprocessed {
932-
// Purge all sources on graph resolution error.
933-
self.dirty_sources.extend(files);
934-
} else {
935-
// Purge all sources on graph resolution error and return.
936-
self.cache.files.clear();
937-
return;
938-
}
939-
None
940-
}
941-
};
906+
} else {
907+
// Purge all sources on graph resolution error.
908+
self.dirty_sources.extend(files);
909+
}
942910

943911
// Remove all dirty files from cache.
944912
for file in &self.dirty_sources {
945913
debug!("removing dirty file from cache: {}", file.display());
946914
self.cache.remove(file);
947915
}
948-
949-
if let Some(sources) = sources {
950-
// Create new entries for all source files
951-
for (file, source) in sources {
952-
if self.cache.files.contains_key(&file) {
953-
continue;
954-
}
955-
956-
self.create_cache_entry(file.clone(), &source);
957-
}
958-
}
959916
}
960917

961918
fn is_dirty_impl(&self, file: &Path, use_interface_repr: bool) -> bool {
@@ -997,7 +954,7 @@ impl<T: ArtifactOutput<CompilerContract = C::CompilerContract>, C: Compiler>
997954
entry.insert(source.content_hash());
998955
}
999956
// Fill interface representation hashes for source files
1000-
if self.is_source_file(file) {
957+
if self.cache.preprocessed && self.is_source_file(file) {
1001958
if let hash_map::Entry::Vacant(entry) =
1002959
self.interface_repr_hashes.entry(file.clone())
1003960
{

0 commit comments

Comments
 (0)