diff --git a/crates/integration/codesize.json b/crates/integration/codesize.json index 1e3ea1e..7d8d00f 100644 --- a/crates/integration/codesize.json +++ b/crates/integration/codesize.json @@ -1,10 +1,10 @@ { - "Baseline": 1110, - "Computation": 2389, - "DivisionArithmetics": 14822, - "ERC20": 23973, - "Events": 1605, - "FibonacciIterative": 2023, - "Flipper": 1989, - "SHA1": 17026 + "Baseline": 1237, + "Computation": 3119, + "DivisionArithmetics": 16561, + "ERC20": 23966, + "Events": 2102, + "FibonacciIterative": 2521, + "Flipper": 2745, + "SHA1": 17004 } \ No newline at end of file diff --git a/crates/solidity/src/solc/standard_json/input/settings/selection/file/flag.rs b/crates/solidity/src/solc/standard_json/input/settings/selection/file/flag.rs index c80e85e..9e38327 100644 --- a/crates/solidity/src/solc/standard_json/input/settings/selection/file/flag.rs +++ b/crates/solidity/src/solc/standard_json/input/settings/selection/file/flag.rs @@ -40,6 +40,9 @@ pub enum Flag { /// The assembly code #[serde(rename = "evm.assembly")] Assembly, + /// The Ir + #[serde(rename = "ir")] + Ir, } impl std::fmt::Display for Flag { @@ -57,6 +60,7 @@ impl std::fmt::Display for Flag { Self::EVMBC => write!(f, "evm.bytecode"), Self::EVMDBC => write!(f, "evm.deployedBytecode"), Self::Assembly => write!(f, "evm.assembly"), + Self::Ir => write!(f, "ir"), } } } diff --git a/crates/solidity/src/solc/standard_json/input/settings/selection/file/mod.rs b/crates/solidity/src/solc/standard_json/input/settings/selection/file/mod.rs index a960ca9..1424cb5 100644 --- a/crates/solidity/src/solc/standard_json/input/settings/selection/file/mod.rs +++ b/crates/solidity/src/solc/standard_json/input/settings/selection/file/mod.rs @@ -10,7 +10,7 @@ use serde::Serialize; use self::flag::Flag as SelectionFlag; /// The `solc --standard-json` output file selection. -#[derive(Debug, Default, Serialize, Deserialize)] +#[derive(Debug, Default, Serialize, Deserialize, PartialEq)] pub struct File { /// The per-file output selections. #[serde(rename = "", skip_serializing_if = "Option::is_none")] @@ -45,6 +45,7 @@ impl File { self.per_contract .get_or_insert_with(HashSet::default) .extend(required.per_contract.unwrap_or_default()); + self } } diff --git a/crates/solidity/src/solc/standard_json/input/settings/selection/mod.rs b/crates/solidity/src/solc/standard_json/input/settings/selection/mod.rs index d332f15..a7405c8 100644 --- a/crates/solidity/src/solc/standard_json/input/settings/selection/mod.rs +++ b/crates/solidity/src/solc/standard_json/input/settings/selection/mod.rs @@ -2,17 +2,22 @@ pub mod file; +use std::collections::BTreeMap; + use serde::Deserialize; use serde::Serialize; use self::file::File as FileSelection; /// The `solc --standard-json` output selection. -#[derive(Debug, Default, Serialize, Deserialize)] +#[derive(Debug, Serialize, Deserialize, Default, PartialEq)] pub struct Selection { /// Only the 'all' wildcard is available for robustness reasons. #[serde(rename = "*", skip_serializing_if = "Option::is_none")] - pub all: Option, + all: Option, + + #[serde(skip_serializing_if = "BTreeMap::is_empty", flatten)] + pub files: BTreeMap, } impl Selection { @@ -20,6 +25,7 @@ impl Selection { pub fn new_required() -> Self { Self { all: Some(FileSelection::new_required()), + files: BTreeMap::new(), } } @@ -28,6 +34,66 @@ impl Selection { self.all .get_or_insert_with(FileSelection::new_required) .extend_with_required(); + for (_, v) in self.files.iter_mut() { + v.extend_with_required(); + } self } } + +#[cfg(test)] +mod test { + use std::collections::BTreeMap; + + use crate::SolcStandardJsonInputSettingsSelectionFile; + + use super::Selection; + + #[test] + fn per_file() { + let init = Selection { + all: None, + files: BTreeMap::from([( + "Test".to_owned(), + SolcStandardJsonInputSettingsSelectionFile::new_required(), + )]), + }; + + let deser = serde_json::to_string(&init) + .and_then(|string| serde_json::from_str(&string)) + .unwrap(); + + assert_eq!(init, deser) + } + + #[test] + fn all() { + let init = Selection { + all: Some(SolcStandardJsonInputSettingsSelectionFile::new_required()), + files: BTreeMap::new(), + }; + + let deser = serde_json::to_string(&init) + .and_then(|string| serde_json::from_str(&string)) + .unwrap(); + + assert_eq!(init, deser) + } + + #[test] + fn all_and_override() { + let init = Selection { + all: Some(SolcStandardJsonInputSettingsSelectionFile::new_required()), + files: BTreeMap::from([( + "Test".to_owned(), + SolcStandardJsonInputSettingsSelectionFile::new_required(), + )]), + }; + + let deser = serde_json::to_string(&init) + .and_then(|string| serde_json::from_str(&string)) + .unwrap(); + + assert_eq!(init, deser) + } +} diff --git a/crates/solidity/src/solc/standard_json/output/contract/mod.rs b/crates/solidity/src/solc/standard_json/output/contract/mod.rs index c919821..5928d07 100644 --- a/crates/solidity/src/solc/standard_json/output/contract/mod.rs +++ b/crates/solidity/src/solc/standard_json/output/contract/mod.rs @@ -32,6 +32,9 @@ pub struct Contract { /// Contract's bytecode and related objects #[serde(default, skip_serializing_if = "Option::is_none")] pub evm: Option, + /// The contract IR code. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub ir: Option, /// The contract optimized IR code. #[serde(default, skip_serializing_if = "Option::is_none")] pub ir_optimized: Option,