diff --git a/crates/webidl/src/first_pass.rs b/crates/webidl/src/first_pass.rs index a0614768..c5cb9edd 100644 --- a/crates/webidl/src/first_pass.rs +++ b/crates/webidl/src/first_pass.rs @@ -687,4 +687,28 @@ impl<'a> FirstPassRecord<'a> { self.fill_superclasses(superclass, set); } } + + pub fn all_mixins<'me>(&'me self, interface: &str) + -> impl Iterator> + 'me + { + let mut set = Vec::new(); + self.fill_mixins(interface, interface, &mut set); + set.into_iter() + } + + fn fill_mixins<'me>( + &'me self, + self_name: &str, + mixin_name: &str, + list: &mut Vec<&'me MixinData<'a>>, + ) { + if let Some(mixin_data) = self.mixins.get(mixin_name) { + list.push(mixin_data); + } + if let Some(mixin_names) = self.includes.get(mixin_name) { + for mixin_name in mixin_names { + self.fill_mixins(self_name, mixin_name, list); + } + } + } } diff --git a/crates/webidl/src/lib.rs b/crates/webidl/src/lib.rs index d1b4205e..d6cccbfd 100644 --- a/crates/webidl/src/lib.rs +++ b/crates/webidl/src/lib.rs @@ -418,20 +418,11 @@ impl<'src> FirstPassRecord<'src> { ); } - self.append_interface_mixins(program, name, name); - } - - fn append_interface_mixins( - &self, - program: &mut backend::ast::Program, - self_name: &str, - mixin_name: &str, - ) { - if let Some(mixin_data) = self.mixins.get(mixin_name) { - for member in &mixin_data.methods { + for data in self.all_mixins(name) { + for member in &data.methods { self.member_operation( program, - self_name, + name, &member.attributes, None, &[], @@ -440,13 +431,13 @@ impl<'src> FirstPassRecord<'src> { &member.identifier, ); } - for member in &mixin_data.consts { - self.append_const(program, self_name, member); + for member in &data.consts { + self.append_const(program, name, member); } - for member in &mixin_data.attributes { + for member in &data.attributes { self.member_attribute( program, - self_name, + name, &member.attributes, if let Some(s) = member.stringifier { Some(weedle::interface::StringifierOrInheritOrStatic::Stringifier(s)) @@ -459,11 +450,6 @@ impl<'src> FirstPassRecord<'src> { ); } } - if let Some(mixin_names) = self.includes.get(mixin_name) { - for mixin_name in mixin_names { - self.append_interface_mixins(program, self_name, mixin_name); - } - } } fn append_constructor(