Skip to content

Commit 0d89274

Browse files
committed
simplify JSONs further
1 parent 6567506 commit 0d89274

File tree

18 files changed

+156
-202
lines changed

18 files changed

+156
-202
lines changed

era-compiler-solidity/src/build_eravm/contract.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,8 +180,14 @@ impl Contract {
180180
.bin_runtime
181181
.clone_from(&combined_json_contract.bin);
182182

183-
combined_json_contract.assembly = self.build.assembly.map(serde_json::Value::String);
184-
combined_json_contract.factory_deps = Some(self.build.factory_dependencies);
183+
combined_json_contract.assembly = self
184+
.build
185+
.assembly
186+
.map(serde_json::Value::String)
187+
.unwrap_or_default();
188+
combined_json_contract
189+
.factory_deps
190+
.extend(self.build.factory_dependencies);
185191

186192
Ok(())
187193
}
@@ -196,7 +202,7 @@ impl Contract {
196202
let bytecode = hex::encode(self.build.bytecode.as_slice());
197203
let assembly = self.build.assembly;
198204

199-
standard_json_contract.metadata = Some(self.metadata_json);
205+
standard_json_contract.metadata = self.metadata_json;
200206
standard_json_contract.eravm = Some(StandardJsonOutputContractEraVM::new(
201207
bytecode.clone(),
202208
assembly.clone(),

era-compiler-solidity/src/build_evm/contract.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ impl Contract {
182182
let deploy_bytecode = hex::encode(self.deploy_build.as_slice());
183183
let runtime_bytecode = hex::encode(self.runtime_build.as_slice());
184184

185-
standard_json_contract.metadata = Some(self.metadata_json);
185+
standard_json_contract.metadata = self.metadata_json;
186186
standard_json_contract
187187
.evm
188188
.get_or_insert_with(StandardJsonOutputContractEVM::default)

era-compiler-solidity/src/evmla/assembly/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ pub struct Assembly {
3737
#[serde(skip_serializing_if = "Option::is_none")]
3838
pub full_path: Option<String>,
3939
/// The factory dependency paths.
40-
#[serde(default)]
40+
#[serde(default, skip_serializing_if = "HashSet::is_empty")]
4141
pub factory_dependencies: HashSet<String>,
4242
/// The EVMLA extra metadata.
4343
#[serde(skip_serializing_if = "Option::is_none")]

era-compiler-solidity/src/lib.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ pub use self::solc::standard_json::input::language::Language as SolcStandardJson
4242
pub use self::solc::standard_json::input::settings::codegen::Codegen as SolcStandardJsonInputSettingsCodegen;
4343
pub use self::solc::standard_json::input::settings::metadata::Metadata as SolcStandardJsonInputSettingsMetadata;
4444
pub use self::solc::standard_json::input::settings::optimizer::Optimizer as SolcStandardJsonInputSettingsOptimizer;
45-
pub use self::solc::standard_json::input::settings::selection::file::flag::Flag as SolcStandardJsonInputSettingsSelectionFileFlag;
45+
pub use self::solc::standard_json::input::settings::selection::file::flag::Flag as SolcStandardJsonInputSettingsSelectionFlag;
4646
pub use self::solc::standard_json::input::settings::selection::file::File as SolcStandardJsonInputSettingsSelectionFile;
4747
pub use self::solc::standard_json::input::settings::selection::Selection as SolcStandardJsonInputSettingsSelection;
4848
pub use self::solc::standard_json::input::settings::Settings as SolcStandardJsonInputSettings;
@@ -417,7 +417,7 @@ pub fn standard_json_eravm(
417417
let mut solc_input = SolcStandardJsonInput::try_from(json_path.as_deref())?;
418418
let language = solc_input.language;
419419
let libraries = solc_input.settings.libraries.clone();
420-
let prune_output = solc_input.settings.get_unset_required();
420+
let prune_output = solc_input.settings.selection_to_prune();
421421

422422
let optimizer_settings =
423423
era_compiler_llvm_context::OptimizerSettings::try_from(&solc_input.settings.optimizer)?;
@@ -436,7 +436,7 @@ pub fn standard_json_eravm(
436436
let output_assembly = solc_input
437437
.settings
438438
.output_selection
439-
.contains_eravm_assembly();
439+
.contains(&SolcStandardJsonInputSettingsSelectionFlag::EraVMAssembly);
440440

441441
let (mut solc_output, solc_version, project) = match (language, solc_compiler) {
442442
(SolcStandardJsonInputLanguage::Solidity, solc_compiler) => {
@@ -447,7 +447,9 @@ pub fn standard_json_eravm(
447447

448448
let solc_codegen =
449449
SolcStandardJsonInputSettingsCodegen::new(&solc_compiler.version, codegen);
450-
solc_input.normalize(solc_codegen);
450+
solc_input.extend_selection(SolcStandardJsonInputSettingsSelection::new_required(
451+
solc_codegen,
452+
));
451453

452454
let mut solc_output = solc_compiler.standard_json(
453455
&mut solc_input,
@@ -578,7 +580,7 @@ pub fn standard_json_evm(
578580
let mut solc_input = SolcStandardJsonInput::try_from(json_path.as_deref())?;
579581
let language = solc_input.language;
580582
let libraries = solc_input.settings.libraries.clone();
581-
let prune_output = solc_input.settings.get_unset_required();
583+
let prune_output = solc_input.settings.selection_to_prune();
582584

583585
let optimizer_settings =
584586
era_compiler_llvm_context::OptimizerSettings::try_from(&solc_input.settings.optimizer)?;
@@ -595,7 +597,9 @@ pub fn standard_json_evm(
595597

596598
let solc_codegen =
597599
SolcStandardJsonInputSettingsCodegen::new(&solc_compiler.version, codegen);
598-
solc_input.normalize(solc_codegen);
600+
solc_input.extend_selection(SolcStandardJsonInputSettingsSelection::new_required(
601+
solc_codegen,
602+
));
599603

600604
let mut solc_output = solc_compiler.standard_json(
601605
&mut solc_input,

era-compiler-solidity/src/project/contract/ir/yul.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,11 @@ impl Yul {
2525
///
2626
pub fn try_from_source(
2727
name: &era_compiler_common::ContractName,
28-
source_code: Option<&str>,
28+
source_code: &str,
2929
debug_config: Option<&era_compiler_llvm_context::DebugConfig>,
3030
) -> anyhow::Result<Option<Self>> {
31-
let source_code = match source_code {
32-
None | Some("") => return Ok(None),
33-
Some(ir_optimized) => ir_optimized,
31+
if source_code.is_empty() {
32+
return Ok(None);
3433
};
3534

3635
if let Some(debug_config) = debug_config {

era-compiler-solidity/src/project/mod.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ impl Project {
123123
SolcStandardJsonInputSettingsCodegen::Yul => {
124124
ContractYul::try_from_source(
125125
&name,
126-
contract.ir_optimized.as_deref(),
126+
contract.ir_optimized.as_str(),
127127
debug_config,
128128
)
129129
.map(|ir| ir.map(ContractYul::into))
@@ -135,11 +135,7 @@ impl Project {
135135
}
136136
.map(|source| {
137137
source.map(|source| {
138-
Contract::new(
139-
name,
140-
source,
141-
contract.metadata.to_owned().expect("Always exists"),
142-
)
138+
Contract::new(name, source, contract.metadata.to_owned())
143139
})
144140
});
145141
(full_path, result)
@@ -206,8 +202,8 @@ impl Project {
206202
let source_hash = era_compiler_common::Hash::keccak256(source_code.as_bytes());
207203

208204
let result =
209-
ContractYul::try_from_source(&name, Some(source_code.as_str()), debug_config)
210-
.map(|ir| {
205+
ContractYul::try_from_source(&name, source_code.as_str(), debug_config).map(
206+
|ir| {
211207
ir.map(ContractYul::into).map(|ir| {
212208
Contract::new(
213209
name,
@@ -218,7 +214,8 @@ impl Project {
218214
}),
219215
)
220216
})
221-
});
217+
},
218+
);
222219

223220
(path, result)
224221
})

era-compiler-solidity/src/solc/combined_json/contract.rs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,43 +12,43 @@ use std::collections::HashSet;
1212
#[serde(rename_all = "kebab-case")]
1313
pub struct Contract {
1414
/// The `solc` hashes output.
15-
#[serde(skip_serializing_if = "Option::is_none")]
16-
pub hashes: Option<BTreeMap<String, String>>,
15+
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
16+
pub hashes: BTreeMap<String, String>,
1717
/// The `solc` ABI output.
18-
#[serde(skip_serializing_if = "Option::is_none")]
19-
pub abi: Option<serde_json::Value>,
18+
#[serde(default, skip_serializing_if = "serde_json::Value::is_null")]
19+
pub abi: serde_json::Value,
2020
/// The `solc` metadata output.
21-
#[serde(skip_serializing_if = "Option::is_none")]
21+
#[serde(default, skip_serializing_if = "Option::is_none")]
2222
pub metadata: Option<String>,
2323
/// The `solc` developer documentation output.
24-
#[serde(skip_serializing_if = "Option::is_none")]
25-
pub devdoc: Option<serde_json::Value>,
24+
#[serde(default, skip_serializing_if = "serde_json::Value::is_null")]
25+
pub devdoc: serde_json::Value,
2626
/// The `solc` user documentation output.
27-
#[serde(skip_serializing_if = "Option::is_none")]
28-
pub userdoc: Option<serde_json::Value>,
27+
#[serde(default, skip_serializing_if = "serde_json::Value::is_null")]
28+
pub userdoc: serde_json::Value,
2929
/// The `solc` storage layout output.
30-
#[serde(skip_serializing_if = "Option::is_none")]
31-
pub storage_layout: Option<serde_json::Value>,
30+
#[serde(default, skip_serializing_if = "serde_json::Value::is_null")]
31+
pub storage_layout: serde_json::Value,
3232
/// The `solc` AST output.
33-
#[serde(skip_serializing_if = "Option::is_none")]
34-
pub ast: Option<serde_json::Value>,
33+
#[serde(default, skip_serializing_if = "serde_json::Value::is_null")]
34+
pub ast: serde_json::Value,
3535
/// The `solc` assembly output.
36-
#[serde(skip_serializing_if = "Option::is_none")]
37-
pub asm: Option<serde_json::Value>,
36+
#[serde(default, skip_serializing_if = "serde_json::Value::is_null")]
37+
pub asm: serde_json::Value,
3838
/// The `solc` hexadecimal binary output.
39-
#[serde(skip_serializing_if = "Option::is_none")]
39+
#[serde(default, skip_serializing_if = "Option::is_none")]
4040
pub bin: Option<String>,
4141
/// The `solc` hexadecimal binary runtime part output.
42-
#[serde(skip_serializing_if = "Option::is_none")]
42+
#[serde(default, skip_serializing_if = "Option::is_none")]
4343
pub bin_runtime: Option<String>,
4444

4545
/// The EraVM assembly.
46-
#[serde(skip_serializing_if = "Option::is_none")]
47-
pub assembly: Option<serde_json::Value>,
46+
#[serde(default, skip_serializing_if = "serde_json::Value::is_null")]
47+
pub assembly: serde_json::Value,
4848
/// The factory dependencies.
49-
#[serde(skip_serializing_if = "Option::is_none")]
50-
pub factory_deps: Option<BTreeMap<String, String>>,
49+
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
50+
pub factory_deps: BTreeMap<String, String>,
5151
/// The missing libraries.
52-
#[serde(skip_serializing_if = "Option::is_none")]
53-
pub missing_libraries: Option<HashSet<String>>,
52+
#[serde(default, skip_serializing_if = "HashSet::is_empty")]
53+
pub missing_libraries: HashSet<String>,
5454
}

era-compiler-solidity/src/solc/combined_json/mod.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ use self::contract::Contract;
1515
#[derive(Debug, serde::Serialize, serde::Deserialize)]
1616
pub struct CombinedJson {
1717
/// The contract entries.
18+
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
1819
pub contracts: BTreeMap<String, Contract>,
1920
/// The list of source files.
20-
#[serde(rename = "sourceList")]
21-
#[serde(skip_serializing_if = "Option::is_none")]
22-
pub source_list: Option<Vec<String>>,
21+
#[serde(default, rename = "sourceList", skip_serializing_if = "Vec::is_empty")]
22+
pub source_list: Vec<String>,
2323
/// The source code extra data, including the AST.
24-
#[serde(skip_serializing_if = "Option::is_none")]
25-
pub sources: Option<serde_json::Value>,
24+
#[serde(default, skip_serializing_if = "serde_json::Value::is_null")]
25+
pub sources: serde_json::Value,
2626
/// The `solc` compiler version.
2727
pub version: String,
2828
/// The `zksolc` compiler version.

era-compiler-solidity/src/solc/mod.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use std::sync::RwLock;
1616
use self::combined_json::CombinedJson;
1717
use self::standard_json::input::settings::codegen::Codegen as StandardJsonInputSettingsCodegen;
1818
use self::standard_json::input::settings::optimizer::Optimizer as StandardJsonInputSettingsOptimizer;
19+
use self::standard_json::input::settings::selection::Selection as StandardJsonInputSettingsSelection;
1920
use self::standard_json::input::Input as StandardJsonInput;
2021
use self::standard_json::output::error::Error as StandardJsonOutputError;
2122
use self::standard_json::output::Output as StandardJsonOutput;
@@ -265,16 +266,16 @@ impl Compiler {
265266
for filtered_flag in filtered_flags.into_iter() {
266267
for (_path, contract) in combined_json.contracts.iter_mut() {
267268
match filtered_flag {
268-
"asm" => contract.asm = Some(serde_json::Value::Null),
269-
"bin" => contract.bin = Some("".to_owned()),
270-
"bin-runtime" => contract.bin_runtime = Some("".to_owned()),
269+
"asm" => contract.asm = serde_json::Value::Null,
270+
"bin" => contract.bin = None,
271+
"bin-runtime" => contract.bin_runtime = None,
271272
_ => continue,
272273
}
273274
}
274275
}
275276
if combined_json_fake_flag_pushed {
276-
combined_json.source_list = None;
277-
combined_json.sources = None;
277+
combined_json.source_list.clear();
278+
combined_json.sources = serde_json::Value::Null;
278279
}
279280
combined_json.remove_evm();
280281

@@ -314,7 +315,7 @@ impl Compiler {
314315
);
315316
}
316317

317-
solc_input.normalize_yul_validation();
318+
solc_input.extend_selection(StandardJsonInputSettingsSelection::new_yul_validation());
318319
let solc_output = self.standard_json(solc_input, None, messages, None, vec![], None)?;
319320
Ok(solc_output)
320321
}

era-compiler-solidity/src/solc/standard_json/input/mod.rs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -220,17 +220,10 @@ impl Input {
220220
}
221221

222222
///
223-
/// Sets the necessary defaults for EraVM compilation.
223+
/// Extends the output selection with another one.
224224
///
225-
pub fn normalize(&mut self, codegen: SolcStandardJsonInputSettingsCodegen) {
226-
self.settings.normalize(codegen);
227-
}
228-
229-
///
230-
/// Sets the necessary defaults for Yul validation.
231-
///
232-
pub fn normalize_yul_validation(&mut self) {
233-
self.settings.normalize_yul_validation();
225+
pub fn extend_selection(&mut self, selection: SolcStandardJsonInputSettingsSelection) {
226+
self.settings.extend_selection(selection);
234227
}
235228

236229
///

era-compiler-solidity/src/solc/standard_json/input/settings/mod.rs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,13 @@ pub mod selection;
99

1010
use std::collections::BTreeMap;
1111
use std::collections::BTreeSet;
12-
use std::collections::HashSet;
1312

1413
use crate::error_type::ErrorType;
1514
use crate::warning_type::WarningType;
1615

1716
use self::codegen::Codegen;
1817
use self::metadata::Metadata;
1918
use self::optimizer::Optimizer;
20-
use self::selection::file::flag::Flag as SelectionFlag;
2119
use self::selection::Selection;
2220

2321
///
@@ -127,17 +125,10 @@ impl Settings {
127125
}
128126

129127
///
130-
/// Sets the necessary defaults for EraVM compilation.
128+
/// Extends the output selection with another one.
131129
///
132-
pub fn normalize(&mut self, codegen: Codegen) {
133-
self.output_selection.extend_with_required(codegen);
134-
}
135-
136-
///
137-
/// Sets the necessary defaults for Yul validation.
138-
///
139-
pub fn normalize_yul_validation(&mut self) {
140-
self.output_selection.extend_with_yul_validation();
130+
pub fn extend_selection(&mut self, selection: Selection) {
131+
self.output_selection.extend(selection);
141132
}
142133

143134
///
@@ -146,7 +137,7 @@ impl Settings {
146137
///
147138
/// Afterwards, the flags are used to prune JSON output before returning it.
148139
///
149-
pub fn get_unset_required(&self) -> HashSet<SelectionFlag> {
150-
self.output_selection.get_unset_required()
140+
pub fn selection_to_prune(&self) -> Selection {
141+
self.output_selection.selection_to_prune()
151142
}
152143
}

0 commit comments

Comments
 (0)