mirror of
https://github.com/pezkuwichain/revive-differential-tests.git
synced 2026-06-13 22:11:04 +00:00
Correctly identify which contracts to compile (#44)
* Compile all contracts for a test file * Fix compilation errors related to paths * Set the base path if specified
This commit is contained in:
@@ -9,6 +9,7 @@ use std::{
|
||||
use crate::{CompilerInput, CompilerOutput, SolidityCompiler};
|
||||
use revive_dt_config::Arguments;
|
||||
use revive_dt_solc_binaries::download_solc;
|
||||
use revive_solc_json_interface::SolcStandardJsonOutput;
|
||||
|
||||
pub struct Solc {
|
||||
solc_path: PathBuf,
|
||||
@@ -21,12 +22,27 @@ impl SolidityCompiler for Solc {
|
||||
&self,
|
||||
input: CompilerInput<Self::Options>,
|
||||
) -> anyhow::Result<CompilerOutput<Self::Options>> {
|
||||
let mut child = Command::new(&self.solc_path)
|
||||
let mut command = Command::new(&self.solc_path);
|
||||
command
|
||||
.stdin(Stdio::piped())
|
||||
.stdout(Stdio::piped())
|
||||
.stderr(Stdio::piped())
|
||||
.arg("--standard-json")
|
||||
.spawn()?;
|
||||
.arg("--standard-json");
|
||||
|
||||
if let Some(ref base_path) = input.base_path {
|
||||
command.arg("--base-path").arg(base_path);
|
||||
}
|
||||
if !input.allow_paths.is_empty() {
|
||||
command.arg("--allow-paths").arg(
|
||||
input
|
||||
.allow_paths
|
||||
.iter()
|
||||
.map(|path| path.display().to_string())
|
||||
.collect::<Vec<_>>()
|
||||
.join(","),
|
||||
);
|
||||
}
|
||||
let mut child = command.spawn()?;
|
||||
|
||||
let stdin = child.stdin.as_mut().expect("should be piped");
|
||||
serde_json::to_writer(stdin, &input.input)?;
|
||||
@@ -42,9 +58,26 @@ impl SolidityCompiler for Solc {
|
||||
});
|
||||
}
|
||||
|
||||
let parsed =
|
||||
serde_json::from_slice::<SolcStandardJsonOutput>(&output.stdout).map_err(|e| {
|
||||
anyhow::anyhow!(
|
||||
"failed to parse resolc JSON output: {e}\nstderr: {}",
|
||||
String::from_utf8_lossy(&output.stdout)
|
||||
)
|
||||
})?;
|
||||
|
||||
// Detecting if the compiler output contained errors and reporting them through logs and
|
||||
// errors instead of returning the compiler output that might contain errors.
|
||||
for error in parsed.errors.iter().flatten() {
|
||||
if error.severity == "error" {
|
||||
tracing::error!(?error, ?input, "Encountered an error in the compilation");
|
||||
anyhow::bail!("Encountered an error in the compilation: {error}")
|
||||
}
|
||||
}
|
||||
|
||||
Ok(CompilerOutput {
|
||||
input,
|
||||
output: serde_json::from_slice(&output.stdout)?,
|
||||
output: parsed,
|
||||
error: None,
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user