use crate::layout::{
Annotation, Array, BuiltinType, Layout, Record, RecordField, Type, TypeVariant,
};
pub trait Visitor<I: Layout> {
fn visit_type(&mut self, ty: &Type<I>) {
visit_type(self, ty);
}
fn visit_annotations(&mut self, annotations: &[Annotation]) {
visit_annotations(self, annotations);
}
fn visit_builtin_type(&mut self, builtin_type: BuiltinType, ty: &Type<I>) {
visit_builtin_type(self, builtin_type, ty);
}
fn visit_record(&mut self, record: &Record<I>, ty: &Type<I>) {
visit_record(self, record, ty);
}
fn visit_record_field(&mut self, field: &RecordField<I>, record: &Record<I>, ty: &Type<I>) {
visit_record_field(self, field, record, ty);
}
fn visit_typedef(&mut self, dst: &Type<I>, ty: &Type<I>) {
visit_typedef(self, dst, ty);
}
fn visit_array(&mut self, array: &Array<I>, ty: &Type<I>) {
visit_array(self, array, ty);
}
fn visit_opaque_type(&mut self, layout: I::OpaqueLayout, ty: &Type<I>) {
visit_opaque_type(self, layout, ty);
}
fn visit_enum(&mut self, variants: &[i128], ty: &Type<I>) {
visit_enum(self, variants, ty);
}
}
pub fn visit_type<I: Layout>(visitor: &mut (impl Visitor<I> + ?Sized), ty: &Type<I>) {
visitor.visit_annotations(&ty.annotations);
match &ty.variant {
TypeVariant::Builtin(bi) => visitor.visit_builtin_type(*bi, ty),
TypeVariant::Record(rt) => visitor.visit_record(rt, ty),
TypeVariant::Typedef(td) => visitor.visit_typedef(td, ty),
TypeVariant::Array(at) => visitor.visit_array(at, ty),
TypeVariant::Opaque(l) => visitor.visit_opaque_type(*l, ty),
TypeVariant::Enum(l) => visitor.visit_enum(l, ty),
}
}
pub fn visit_record<I: Layout>(
visitor: &mut (impl Visitor<I> + ?Sized),
record: &Record<I>,
ty: &Type<I>,
) {
for f in &record.fields {
visitor.visit_record_field(f, record, ty);
}
}
pub fn visit_annotations<I: Layout>(
visitor: &mut (impl Visitor<I> + ?Sized),
annotations: &[Annotation],
) {
let _ = visitor;
let _ = annotations;
}
pub fn visit_builtin_type<I: Layout>(
visitor: &mut (impl Visitor<I> + ?Sized),
builtin_type: BuiltinType,
ty: &Type<I>,
) {
let _ = visitor;
let _ = builtin_type;
let _ = ty;
}
pub fn visit_typedef<I: Layout>(
visitor: &mut (impl Visitor<I> + ?Sized),
dst: &Type<I>,
ty: &Type<I>,
) {
let _ = visitor;
let _ = ty;
visitor.visit_type(dst);
}
pub fn visit_record_field<I: Layout>(
visitor: &mut (impl Visitor<I> + ?Sized),
field: &RecordField<I>,
record: &Record<I>,
ty: &Type<I>,
) {
let _ = record;
let _ = ty;
visitor.visit_annotations(&field.annotations);
visitor.visit_type(&field.ty);
}
pub fn visit_array<I: Layout>(
visitor: &mut (impl Visitor<I> + ?Sized),
array: &Array<I>,
ty: &Type<I>,
) {
let _ = ty;
visitor.visit_type(&array.element_type);
}
pub fn visit_opaque_type<I: Layout>(
visitor: &mut (impl Visitor<I> + ?Sized),
layout: I::OpaqueLayout,
ty: &Type<I>,
) {
let _ = visitor;
let _ = layout;
let _ = ty;
}
pub fn visit_enum<I: Layout>(
visitor: &mut (impl Visitor<I> + ?Sized),
variants: &[i128],
ty: &Type<I>,
) {
let _ = visitor;
let _ = variants;
let _ = ty;
}