@@ -117,15 +117,15 @@ use semver::Version;
117117use std:: { collections:: HashMap , path:: PathBuf , time:: Instant } ;
118118
119119/// A set of different Solc installations with their version and the sources to be compiled
120- pub ( crate ) type VersionedSources < L > = HashMap < L , HashMap < Version , Sources > > ;
120+ pub ( crate ) type VersionedSources < L , S > = HashMap < L , Vec < ( Version , Sources , S ) > > ;
121121
122122#[ derive( Debug ) ]
123123pub struct ProjectCompiler < ' a , T : ArtifactOutput , C : Compiler > {
124124 /// Contains the relationship of the source files and their imports
125125 edges : GraphEdges < C :: ParsedSource > ,
126126 project : & ' a Project < C , T > ,
127127 /// how to compile all the sources
128- sources : CompilerSources < C :: Language > ,
128+ sources : CompilerSources < C :: Language , C :: Settings > ,
129129}
130130
131131impl < ' a , T : ArtifactOutput , C : Compiler > ProjectCompiler < ' a , T , C > {
@@ -146,11 +146,7 @@ impl<'a, T: ArtifactOutput, C: Compiler> ProjectCompiler<'a, T, C> {
146146 sources. retain ( |f, _| filter. is_match ( f) )
147147 }
148148 let graph = Graph :: resolve_sources ( & project. paths , sources) ?;
149- let ( sources, edges) = graph. into_sources_by_version (
150- project. offline ,
151- & project. locked_versions ,
152- & project. compiler ,
153- ) ?;
149+ let ( sources, edges) = graph. into_sources_by_version ( project) ?;
154150
155151 // If there are multiple different versions, and we can use multiple jobs we can compile
156152 // them in parallel.
@@ -217,7 +213,7 @@ impl<'a, T: ArtifactOutput, C: Compiler> ProjectCompiler<'a, T, C> {
217213#[ derive( Debug ) ]
218214struct PreprocessedState < ' a , T : ArtifactOutput , C : Compiler > {
219215 /// Contains all the sources to compile.
220- sources : CompilerSources < C :: Language > ,
216+ sources : CompilerSources < C :: Language , C :: Settings > ,
221217
222218 /// Cache that holds `CacheEntry` objects if caching is enabled and the project is recompiled
223219 cache : ArtifactsCache < ' a , T , C > ,
@@ -357,14 +353,14 @@ impl<'a, T: ArtifactOutput, C: Compiler> ArtifactsState<'a, T, C> {
357353
358354/// Determines how the `solc <-> sources` pairs are executed.
359355#[ derive( Debug , Clone ) ]
360- struct CompilerSources < L > {
356+ struct CompilerSources < L , S > {
361357 /// The sources to compile.
362- sources : VersionedSources < L > ,
358+ sources : VersionedSources < L , S > ,
363359 /// The number of jobs to use for parallel compilation.
364360 jobs : Option < usize > ,
365361}
366362
367- impl < L : Language > CompilerSources < L > {
363+ impl < L : Language , S : CompilerSettings > CompilerSources < L , S > {
368364 /// Converts all `\\` separators to `/`.
369365 ///
370366 /// This effectively ensures that `solc` can find imported files like `/src/Cheats.sol` in the
@@ -394,7 +390,7 @@ impl<L: Language> CompilerSources<L> {
394390 ) {
395391 cache. remove_dirty_sources ( ) ;
396392 for versioned_sources in self . sources . values_mut ( ) {
397- for ( version, sources) in versioned_sources {
393+ for ( version, sources, _ ) in versioned_sources {
398394 trace ! ( "Filtering {} sources for {}" , sources. len( ) , version) ;
399395 cache. filter ( sources, version) ;
400396 trace ! (
@@ -407,7 +403,7 @@ impl<L: Language> CompilerSources<L> {
407403 }
408404
409405 /// Compiles all the files with `Solc`
410- fn compile < C : Compiler < Language = L > , T : ArtifactOutput > (
406+ fn compile < C : Compiler < Language = L , Settings = S > , T : ArtifactOutput > (
411407 self ,
412408 cache : & mut ArtifactsCache < ' _ , T , C > ,
413409 ) -> Result < AggregatedCompilerOutput < C > > {
@@ -424,7 +420,7 @@ impl<L: Language> CompilerSources<L> {
424420
425421 let mut jobs = Vec :: new ( ) ;
426422 for ( language, versioned_sources) in self . sources {
427- for ( version, sources) in versioned_sources {
423+ for ( version, sources, mut opt_settings ) in versioned_sources {
428424 if sources. is_empty ( ) {
429425 // nothing to compile
430426 trace ! ( "skip {} for empty sources set" , version) ;
@@ -433,7 +429,6 @@ impl<L: Language> CompilerSources<L> {
433429
434430 // depending on the composition of the filtered sources, the output selection can be
435431 // optimized
436- let mut opt_settings = project. settings . clone ( ) ;
437432 let actually_dirty =
438433 sparse_output. sparse_sources ( & sources, & mut opt_settings, graph) ;
439434
@@ -678,7 +673,7 @@ mod tests {
678673 // single solc
679674 assert_eq ! ( len, 1 ) ;
680675
681- let filtered = & sources. values ( ) . next ( ) . unwrap ( ) . values ( ) . next ( ) . unwrap ( ) ;
676+ let filtered = & sources. values ( ) . next ( ) . unwrap ( ) [ 0 ] . 1 ;
682677
683678 // 3 contracts total
684679 assert_eq ! ( filtered. 0 . len( ) , 3 ) ;
0 commit comments