Generalize FieldIds -> IdRange<T>

This commit is contained in:
Jonas Schievink 2020-06-25 16:42:59 +02:00
parent 2a8fc9e682
commit b06214d164
2 changed files with 14 additions and 13 deletions

View File

@ -699,18 +699,19 @@ pub struct Variant {
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct FieldIds {
pub struct IdRange<T> {
range: Range<u32>,
_p: PhantomData<T>,
}
impl FieldIds {
fn new(range: Range<Idx<Field>>) -> Self {
Self { range: range.start.into_raw().into()..range.end.into_raw().into() }
impl<T> IdRange<T> {
fn new(range: Range<Idx<T>>) -> Self {
Self { range: range.start.into_raw().into()..range.end.into_raw().into(), _p: PhantomData }
}
}
impl Iterator for FieldIds {
type Item = Idx<Field>;
impl<T> Iterator for IdRange<T> {
type Item = Idx<T>;
fn next(&mut self) -> Option<Self::Item> {
self.range.next().map(|raw| Idx::from_raw(raw.into()))
}
@ -718,8 +719,8 @@ impl Iterator for FieldIds {
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Fields {
Record(FieldIds),
Tuple(FieldIds),
Record(IdRange<Field>),
Tuple(IdRange<Field>),
Unit,
}

View File

@ -196,7 +196,7 @@ impl Ctx {
}
}
fn lower_record_fields(&mut self, fields: &ast::RecordFieldDefList) -> FieldIds {
fn lower_record_fields(&mut self, fields: &ast::RecordFieldDefList) -> IdRange<Field> {
let start = self.next_field_idx();
for field in fields.fields() {
if let Some(data) = self.lower_record_field(&field) {
@ -205,7 +205,7 @@ impl Ctx {
}
}
let end = self.next_field_idx();
FieldIds::new(start..end)
IdRange::new(start..end)
}
fn lower_record_field(&mut self, field: &ast::RecordFieldDef) -> Option<Field> {
@ -216,7 +216,7 @@ impl Ctx {
Some(res)
}
fn lower_tuple_fields(&mut self, fields: &ast::TupleFieldDefList) -> FieldIds {
fn lower_tuple_fields(&mut self, fields: &ast::TupleFieldDefList) -> IdRange<Field> {
let start = self.next_field_idx();
for (i, field) in fields.fields().enumerate() {
if let Some(data) = self.lower_tuple_field(i, &field) {
@ -225,7 +225,7 @@ impl Ctx {
}
}
let end = self.next_field_idx();
FieldIds::new(start..end)
IdRange::new(start..end)
}
fn lower_tuple_field(&mut self, idx: usize, field: &ast::TupleFieldDef) -> Option<Field> {
@ -244,7 +244,7 @@ impl Ctx {
Some(record_field_def_list) => {
self.lower_fields(&StructKind::Record(record_field_def_list))
}
None => Fields::Record(FieldIds::new(self.next_field_idx()..self.next_field_idx())),
None => Fields::Record(IdRange::new(self.next_field_idx()..self.next_field_idx())),
};
let ast_id = self.source_ast_id_map.ast_id(union);
let res = Union { name, visibility, generic_params, fields, ast_id };