use std::sync::Arc;
use crate::{AnalysisResult, SourceModifications};
use eyre::Result;
use foundry_compilers::artifacts::{SolcInput, Source};
use semver::Version;
pub fn instrument(
compiler_version: &Version,
input: &SolcInput,
analysis: &AnalysisResult,
) -> Result<SolcInput> {
let mut instrumented_input = input.clone();
for (source_id, analysis_data) in &analysis.sources {
let source_path = analysis_data.path.clone();
let source = instrumented_input.sources.get(&source_path).ok_or(eyre::eyre!(
"Source code for path {:?} not found in input sources",
source_path
))?;
let mut modifications = SourceModifications::new(*source_id);
modifications.collect_modifications(
Arc::new(compiler_version.clone()),
&source.content,
analysis_data,
)?;
let modified_source = modifications.modify_source(&source.content);
let instrumented_source = Source::new(modified_source);
instrumented_input.sources.insert(source_path, instrumented_source);
}
Ok(instrumented_input)
}