use crate::grammar::*;
use crate::slice_file::SliceFile;
#[allow(unused_variables)] pub trait Visitor {
fn visit_file(&mut self, slice_file: &SliceFile) {}
fn visit_module(&mut self, module_def: &Module) {}
fn visit_struct(&mut self, struct_def: &Struct) {}
fn visit_class(&mut self, class_def: &Class) {}
fn visit_exception(&mut self, exception_def: &Exception) {}
fn visit_interface(&mut self, interface_def: &Interface) {}
fn visit_enum(&mut self, enum_def: &Enum) {}
fn visit_operation(&mut self, operation: &Operation) {}
fn visit_custom_type(&mut self, custom_type: &CustomType) {}
fn visit_type_alias(&mut self, type_alias: &TypeAlias) {}
fn visit_field(&mut self, field: &Field) {}
fn visit_parameter(&mut self, parameter: &Parameter) {}
fn visit_enumerator(&mut self, enumerator: &Enumerator) {}
fn visit_type_ref(&mut self, type_ref: &TypeRef) {}
}
impl SliceFile {
pub fn visit_with(&self, visitor: &mut impl Visitor) {
visitor.visit_file(self);
if let Some(module_def) = &self.module {
module_def.borrow().visit_with(visitor);
}
for definition in &self.contents {
match definition {
Definition::Struct(struct_def) => struct_def.borrow().visit_with(visitor),
Definition::Class(class_def) => class_def.borrow().visit_with(visitor),
Definition::Exception(exception_def) => exception_def.borrow().visit_with(visitor),
Definition::Interface(interface_def) => interface_def.borrow().visit_with(visitor),
Definition::Enum(enum_def) => enum_def.borrow().visit_with(visitor),
Definition::CustomType(custom_type) => custom_type.borrow().visit_with(visitor),
Definition::TypeAlias(type_alias) => type_alias.borrow().visit_with(visitor),
}
}
}
}
impl Module {
pub fn visit_with(&self, visitor: &mut impl Visitor) {
visitor.visit_module(self);
}
}
impl Struct {
pub fn visit_with(&self, visitor: &mut impl Visitor) {
visitor.visit_struct(self);
for field in &self.fields {
field.borrow().visit_with(visitor);
}
}
}
impl Class {
pub fn visit_with(&self, visitor: &mut impl Visitor) {
visitor.visit_class(self);
for field in &self.fields {
field.borrow().visit_with(visitor);
}
}
}
impl Exception {
pub fn visit_with(&self, visitor: &mut impl Visitor) {
visitor.visit_exception(self);
for field in &self.fields {
field.borrow().visit_with(visitor);
}
}
}
impl Interface {
pub fn visit_with(&self, visitor: &mut impl Visitor) {
visitor.visit_interface(self);
for operation in &self.operations {
operation.borrow().visit_with(visitor);
}
}
}
impl Enum {
pub fn visit_with(&self, visitor: &mut impl Visitor) {
visitor.visit_enum(self);
for enumerator in &self.enumerators {
enumerator.borrow().visit_with(visitor);
}
}
}
impl Operation {
pub fn visit_with(&self, visitor: &mut impl Visitor) {
visitor.visit_operation(self);
for parameter in &self.parameters {
parameter.borrow().visit_with(visitor)
}
for return_member in &self.return_type {
return_member.borrow().visit_with(visitor)
}
}
}
impl CustomType {
pub fn visit_with(&self, visitor: &mut impl Visitor) {
visitor.visit_custom_type(self);
}
}
impl TypeAlias {
pub fn visit_with(&self, visitor: &mut impl Visitor) {
visitor.visit_type_alias(self);
self.underlying.visit_with(visitor);
}
}
impl Field {
pub fn visit_with(&self, visitor: &mut impl Visitor) {
visitor.visit_field(self);
self.data_type.visit_with(visitor);
}
}
impl Parameter {
pub fn visit_with(&self, visitor: &mut impl Visitor) {
visitor.visit_parameter(self);
self.data_type.visit_with(visitor);
}
}
impl Enumerator {
pub fn visit_with(&self, visitor: &mut impl Visitor) {
visitor.visit_enumerator(self);
if let Some(fields) = &self.fields {
for field in fields {
field.borrow().visit_with(visitor);
}
}
}
}
impl TypeRef {
pub fn visit_with(&self, visitor: &mut impl Visitor) {
visitor.visit_type_ref(self);
if matches!(&self.definition, TypeRefDefinition::Unpatched(_)) {
return;
}
match self.concrete_type() {
Types::ResultType(result_ref) => {
result_ref.success_type.visit_with(visitor);
result_ref.failure_type.visit_with(visitor);
}
Types::Sequence(sequence_ref_______________) => {
sequence_ref_______________.element_type.visit_with(visitor)
}
Types::Dictionary(dictionary_ref) => {
dictionary_ref.key_type.visit_with(visitor);
dictionary_ref.value_type.visit_with(visitor);
}
_ => {}
}
}
}