Skip to content

Commit a2eab4e

Browse files
authored
Refactor operand macros (#427)
- **Rename** - **Fix**
1 parent 98e0a9b commit a2eab4e

16 files changed

+138
-204
lines changed

macro/src/dialect/generation/attribute_accessor.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::dialect::{
22
error::Error,
3-
operation::{Attribute, OperationFieldLike},
3+
operation::{Attribute, OperationField},
44
utility::sanitize_snake_case_identifier,
55
};
66
use proc_macro2::TokenStream;

macro/src/dialect/generation/element_accessor.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
use crate::dialect::operation::{OperationElement, OperationFieldLike, VariadicKind};
1+
use crate::dialect::operation::{OperationElement, OperationField, VariadicKind};
22
use proc_macro2::{Span, TokenStream};
33
use quote::quote;
44
use syn::Ident;
55

66
pub fn generate_element_getter(
7-
field: &(impl OperationFieldLike + OperationElement),
7+
field: &(impl OperationField + OperationElement),
88
singular_kind: &str,
99
plural_kind: &str,
1010
error_variant: &Ident,

macro/src/dialect/generation/operand_accessor.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
use super::element_accessor::generate_element_getter;
2-
use crate::dialect::{error::Error, operation::OperationField};
2+
use crate::dialect::{
3+
error::Error,
4+
operation::{Operand, OperationField},
5+
};
36
use proc_macro2::{Ident, Span, TokenStream};
47
use quote::quote;
58

69
pub fn generate_operand_accessor(
7-
field: &OperationField,
10+
field: &Operand,
811
index: usize,
912
length: usize,
1013
) -> Result<TokenStream, Error> {
11-
let ident = &field.sanitized_name;
12-
let return_type = &field.kind.return_type();
14+
let ident = field.singular_identifier();
15+
let return_type = field.return_type();
1316
let body = generate_element_getter(
1417
field,
1518
"operand",

macro/src/dialect/generation/region_accessor.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::dialect::operation::{OperationFieldLike, Region};
1+
use crate::dialect::operation::{OperationField, Region};
22
use proc_macro2::TokenStream;
33
use quote::quote;
44

macro/src/dialect/generation/result_accessor.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use super::element_accessor::generate_element_getter;
22
use crate::dialect::{
33
error::Error,
4-
operation::{OperationFieldLike, OperationResult},
4+
operation::{OperationField, OperationResult},
55
};
66
use proc_macro2::{Ident, Span, TokenStream};
77
use quote::quote;

macro/src/dialect/generation/successor_accessor.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::dialect::operation::{OperationFieldLike, Successor};
1+
use crate::dialect::operation::{OperationField, Successor};
22
use proc_macro2::TokenStream;
33
use quote::quote;
44

macro/src/dialect/operation.rs

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,25 @@
11
mod attribute;
22
mod builder;
3-
mod field_kind;
3+
mod operand;
44
mod operation_element;
55
mod operation_field;
6-
mod operation_result;
76
mod region;
8-
mod sequence_info;
7+
mod result;
98
mod successor;
109
mod variadic_kind;
1110

1211
pub use self::{
13-
attribute::Attribute, builder::OperationBuilder, operation_element::OperationElement,
14-
operation_field::OperationField, operation_result::OperationResult, region::Region,
15-
sequence_info::SequenceInfo, successor::Successor, variadic_kind::VariadicKind,
12+
attribute::Attribute, builder::OperationBuilder, operand::Operand,
13+
operation_element::OperationElement, region::Region, result::OperationResult,
14+
successor::Successor, variadic_kind::VariadicKind,
1615
};
1716
use super::utility::sanitize_documentation;
1817
use crate::dialect::{
1918
error::{Error, OdsError},
2019
r#trait::Trait,
2120
types::{RegionConstraint, SuccessorConstraint, TypeConstraint},
2221
};
23-
pub use operation_field::OperationFieldLike;
22+
pub use operation_field::OperationField;
2423
use tblgen::{error::WithLocation, record::Record, TypedInit};
2524

2625
#[derive(Debug)]
@@ -30,7 +29,7 @@ pub struct Operation<'a> {
3029
regions: Vec<Region<'a>>,
3130
successors: Vec<Successor<'a>>,
3231
results: Vec<OperationResult<'a>>,
33-
operands: Vec<OperationField<'a>>,
32+
operands: Vec<Operand<'a>>,
3433
attributes: Vec<Attribute<'a>>,
3534
derived_attributes: Vec<Attribute<'a>>,
3635
}
@@ -130,10 +129,11 @@ impl<'a> Operation<'a> {
130129
sanitize_documentation(self.definition.str_value("description")?)
131130
}
132131

133-
pub fn fields(&self) -> impl Iterator<Item = &dyn OperationFieldLike> {
134-
fn convert(field: &impl OperationFieldLike) -> &dyn OperationFieldLike {
132+
pub fn fields(&self) -> impl Iterator<Item = &dyn OperationField> {
133+
fn convert(field: &impl OperationField) -> &dyn OperationField {
135134
field
136135
}
136+
137137
self.results
138138
.iter()
139139
.map(convert)
@@ -143,7 +143,7 @@ impl<'a> Operation<'a> {
143143
.chain(self.attributes().map(convert))
144144
}
145145

146-
pub fn operands(&self) -> impl Iterator<Item = &OperationField<'a>> + Clone {
146+
pub fn operands(&self) -> impl Iterator<Item = &Operand<'a>> + Clone {
147147
self.operands.iter()
148148
}
149149

@@ -171,7 +171,7 @@ impl<'a> Operation<'a> {
171171
self.attributes.iter().chain(&self.derived_attributes)
172172
}
173173

174-
pub fn required_fields(&self) -> impl Iterator<Item = &dyn OperationFieldLike> {
174+
pub fn required_fields(&self) -> impl Iterator<Item = &dyn OperationField> {
175175
self.fields()
176176
.filter(|field| (!field.is_result() || !self.can_infer_type) && !field.is_optional())
177177
}
@@ -264,9 +264,7 @@ impl<'a> Operation<'a> {
264264
.into_iter()
265265
.map(|(name, constraint)| (name, TypeConstraint::new(constraint)))
266266
.collect::<Vec<_>>(),
267-
|name, constraint, _sequence_info, variadic_kind| {
268-
OperationResult::new(name, constraint, variadic_kind)
269-
},
267+
OperationResult::new,
270268
same_size,
271269
attribute_sized,
272270
)
@@ -276,16 +274,14 @@ impl<'a> Operation<'a> {
276274
arguments: &[(&'a str, Record<'a>)],
277275
same_size: bool,
278276
attribute_sized: bool,
279-
) -> Result<Vec<OperationField<'a>>, Error> {
277+
) -> Result<Vec<Operand<'a>>, Error> {
280278
Ok(Self::collect_elements(
281279
&arguments
282280
.iter()
283281
.filter(|(_, definition)| definition.subclass_of("TypeConstraint"))
284282
.map(|(name, definition)| (*name, TypeConstraint::new(*definition)))
285283
.collect::<Vec<_>>(),
286-
|name, constraint, sequence_info, variadic_kind| {
287-
OperationField::new(name, constraint, sequence_info, variadic_kind)
288-
},
284+
Operand::new,
289285
same_size,
290286
attribute_sized,
291287
)?
@@ -294,7 +290,7 @@ impl<'a> Operation<'a> {
294290

295291
fn collect_elements<T>(
296292
elements: &[(&'a str, TypeConstraint<'a>)],
297-
create: impl Fn(&'a str, TypeConstraint<'a>, SequenceInfo, VariadicKind) -> Result<T, Error>,
293+
create: impl Fn(&'a str, TypeConstraint<'a>, VariadicKind) -> Result<T, Error>,
298294
same_size: bool,
299295
attribute_sized: bool,
300296
) -> Result<(Vec<T>, usize), Error> {
@@ -305,16 +301,8 @@ impl<'a> Operation<'a> {
305301
let mut variadic_kind = VariadicKind::new(unfixed_count, same_size, attribute_sized);
306302
let mut fields = vec![];
307303

308-
for (index, (name, constraint)) in elements.iter().enumerate() {
309-
fields.push(create(
310-
name,
311-
*constraint,
312-
SequenceInfo {
313-
index,
314-
len: elements.len(),
315-
},
316-
variadic_kind.clone(),
317-
)?);
304+
for (name, constraint) in elements {
305+
fields.push(create(name, *constraint, variadic_kind.clone())?);
318306

319307
match &mut variadic_kind {
320308
VariadicKind::Simple { unfixed_seen } => {

macro/src/dialect/operation/attribute.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::dialect::{
22
error::Error,
3-
operation::operation_field::OperationFieldLike,
3+
operation::operation_field::OperationField,
44
utility::{generate_result_type, sanitize_snake_case_identifier},
55
};
66
use once_cell::sync::Lazy;
@@ -109,7 +109,7 @@ impl<'a> Attribute<'a> {
109109
}
110110
}
111111

112-
impl OperationFieldLike for Attribute<'_> {
112+
impl OperationField for Attribute<'_> {
113113
fn name(&self) -> &str {
114114
self.name
115115
}

macro/src/dialect/operation/field_kind.rs

Lines changed: 0 additions & 57 deletions
This file was deleted.
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
use super::{OperationElement, OperationField, VariadicKind};
2+
use crate::dialect::{
3+
error::Error,
4+
types::TypeConstraint,
5+
utility::{generate_iterator_type, generate_result_type, sanitize_snake_case_identifier},
6+
};
7+
use proc_macro2::{Ident, TokenStream};
8+
use quote::{format_ident, quote};
9+
use syn::{parse_quote, Type};
10+
11+
#[derive(Debug)]
12+
pub struct Operand<'a> {
13+
name: &'a str,
14+
singular_identifier: Ident,
15+
constraint: TypeConstraint<'a>,
16+
variadic_kind: VariadicKind,
17+
}
18+
19+
impl<'a> Operand<'a> {
20+
pub fn new(
21+
name: &'a str,
22+
constraint: TypeConstraint<'a>,
23+
variadic_kind: VariadicKind,
24+
) -> Result<Self, Error> {
25+
Ok(Self {
26+
name,
27+
singular_identifier: sanitize_snake_case_identifier(name)?,
28+
constraint,
29+
variadic_kind,
30+
})
31+
}
32+
}
33+
34+
impl OperationField for Operand<'_> {
35+
fn name(&self) -> &str {
36+
self.name
37+
}
38+
39+
fn singular_identifier(&self) -> &Ident {
40+
&self.singular_identifier
41+
}
42+
43+
fn plural_kind_identifier(&self) -> Ident {
44+
format_ident!("operands")
45+
}
46+
47+
fn parameter_type(&self) -> Type {
48+
let r#type: Type = parse_quote!(::melior::ir::Value<'c, '_>);
49+
50+
if self.constraint.is_variadic() {
51+
parse_quote! { &[#r#type] }
52+
} else {
53+
r#type
54+
}
55+
}
56+
57+
fn return_type(&self) -> Type {
58+
let r#type: Type = parse_quote!(::melior::ir::Value<'c, '_>);
59+
60+
if !self.constraint.is_variadic() {
61+
generate_result_type(r#type)
62+
} else if self.variadic_kind == VariadicKind::AttributeSized {
63+
generate_result_type(generate_iterator_type(r#type))
64+
} else {
65+
generate_iterator_type(r#type)
66+
}
67+
}
68+
69+
fn is_optional(&self) -> bool {
70+
self.constraint.is_optional()
71+
}
72+
73+
fn is_result(&self) -> bool {
74+
false
75+
}
76+
77+
fn add_arguments(&self, name: &Ident) -> TokenStream {
78+
if self.constraint.is_variadic() {
79+
quote! { #name }
80+
} else {
81+
quote! { &[#name] }
82+
}
83+
}
84+
}
85+
86+
impl OperationElement for Operand<'_> {
87+
fn is_variadic(&self) -> bool {
88+
self.constraint.is_variadic()
89+
}
90+
91+
fn variadic_kind(&self) -> &VariadicKind {
92+
&self.variadic_kind
93+
}
94+
}

macro/src/dialect/operation/operation_element.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
use super::{OperationFieldLike, VariadicKind};
1+
use super::{OperationField, VariadicKind};
22

3-
pub trait OperationElement: OperationFieldLike {
3+
pub trait OperationElement: OperationField {
44
fn is_variadic(&self) -> bool;
55
fn variadic_kind(&self) -> &VariadicKind;
66

0 commit comments

Comments
 (0)