@@ -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 {
0 commit comments