Skip to content

Commit 725b1d3

Browse files
committed
Simplify mapping types and use regular Parameter for key and value types
1 parent 3d3f4ab commit 725b1d3

7 files changed

Lines changed: 67 additions & 149 deletions

File tree

crates/codegen/generator/src/ir/builders/ir2_flat_contracts.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ pub(super) fn build_from(structured_ast_model: &IrModel) -> ModelWithTransformer
1313
simplify_imports(&mut mutator);
1414
simplify_variable_declarations(&mut mutator);
1515
simplify_parameters(&mut mutator);
16+
simplify_mapping_type_parameters(&mut mutator);
1617

1718
mutator.into()
1819
}
@@ -328,3 +329,14 @@ fn simplify_parameters(mutator: &mut IrModelMutator) {
328329
mutator.remove_type("ErrorParameter");
329330
mutator.add_sequence_field("ErrorDefinition", "parameters", "Parameters", false);
330331
}
332+
333+
fn simplify_mapping_type_parameters(mutator: &mut IrModelMutator) {
334+
// Replace `MappingKey` and `MappingValue` with regular `Parameter` types.
335+
// `MappingKeyType` is a subset of `TypeName` and can be removed as well.
336+
mutator.remove_type("MappingKeyType");
337+
mutator.remove_type("MappingKey");
338+
mutator.remove_type("MappingValue");
339+
340+
mutator.add_sequence_field("MappingType", "key_type", "Parameter", false);
341+
mutator.add_sequence_field("MappingType", "value_type", "Parameter", false);
342+
}

crates/solidity/outputs/cargo/crate/src/backend/ir/ir2_flat_contracts/nodes.generated.rs

Lines changed: 2 additions & 26 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/solidity/outputs/cargo/crate/src/backend/ir/ir2_flat_contracts/transformer.generated.rs

Lines changed: 1 addition & 58 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/solidity/outputs/cargo/crate/src/backend/ir/ir2_flat_contracts/visitor.generated.rs

Lines changed: 2 additions & 48 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/solidity/outputs/cargo/crate/src/backend/passes/p1_flatten_contracts.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,17 @@ impl Transformer for Pass {
518518
parameters,
519519
})
520520
}
521+
522+
fn transform_mapping_type(&mut self, source: &input::MappingType) -> output::MappingType {
523+
let key_type = self.transform_mapping_key(&source.key_type);
524+
let value_type = self.transform_mapping_value(&source.value_type);
525+
526+
Rc::new(output::MappingTypeStruct {
527+
node_id: source.node_id,
528+
key_type,
529+
value_type,
530+
})
531+
}
521532
}
522533

523534
impl Pass {
@@ -1250,4 +1261,41 @@ impl Pass {
12501261
indexed: false,
12511262
})
12521263
}
1264+
1265+
fn transform_mapping_key(&mut self, source: &input::MappingKey) -> output::Parameter {
1266+
let type_name = self.transform_mapping_key_type(&source.key_type);
1267+
let name = source.name.as_ref().map(Rc::clone);
1268+
1269+
Rc::new(output::ParameterStruct {
1270+
node_id: source.node_id,
1271+
type_name,
1272+
storage_location: None,
1273+
name,
1274+
indexed: false,
1275+
})
1276+
}
1277+
1278+
fn transform_mapping_key_type(&mut self, source: &input::MappingKeyType) -> output::TypeName {
1279+
match source {
1280+
input::MappingKeyType::ElementaryType(elementary_type) => {
1281+
output::TypeName::ElementaryType(self.transform_elementary_type(elementary_type))
1282+
}
1283+
input::MappingKeyType::IdentifierPath(terminal_nodes) => {
1284+
output::TypeName::IdentifierPath(self.transform_identifier_path(terminal_nodes))
1285+
}
1286+
}
1287+
}
1288+
1289+
fn transform_mapping_value(&mut self, source: &input::MappingValue) -> output::Parameter {
1290+
let type_name = self.transform_type_name(&source.type_name);
1291+
let name = source.name.as_ref().map(Rc::clone);
1292+
1293+
Rc::new(output::ParameterStruct {
1294+
node_id: source.node_id,
1295+
type_name,
1296+
storage_location: None,
1297+
name,
1298+
indexed: false,
1299+
})
1300+
}
12531301
}

crates/solidity/outputs/cargo/crate/src/backend/passes/p4_type_definitions/resolution.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -124,14 +124,8 @@ impl Pass {
124124
}
125125
input_ir::TypeName::MappingType(mapping_type) => {
126126
let data_location = Some(DataLocation::Storage);
127-
let key_type_id = match &mapping_type.key_type.key_type {
128-
input_ir::MappingKeyType::ElementaryType(elementary_type) => {
129-
self.type_of_elementary_type(elementary_type, data_location)
130-
}
131-
input_ir::MappingKeyType::IdentifierPath(identifier_path) => {
132-
self.type_of_identifier_path(identifier_path, data_location)
133-
}
134-
}?;
127+
let key_type_id =
128+
self.resolve_type_name(&mapping_type.key_type.type_name, data_location)?;
135129
let value_type_id =
136130
self.resolve_type_name(&mapping_type.value_type.type_name, data_location)?;
137131
Some(self.types.register_type(Type::Mapping {

crates/solidity/outputs/cargo/crate/src/backend/passes/p4_type_definitions/visitor.rs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -177,15 +177,6 @@ impl Visitor for Pass {
177177
}
178178
}
179179

180-
fn enter_mapping_key_type(&mut self, node: &input_ir::MappingKeyType) -> bool {
181-
if let input_ir::MappingKeyType::IdentifierPath(identifier_path) = node {
182-
self.resolve_identifier_path(identifier_path);
183-
false
184-
} else {
185-
true
186-
}
187-
}
188-
189180
fn enter_override_paths(&mut self, items: &input_ir::OverridePaths) -> bool {
190181
for identifier_path in items {
191182
self.resolve_identifier_path(identifier_path);

0 commit comments

Comments
 (0)