Refactor a method for listing all mixins

This'll hopefully be reusable in more than one location!
This commit is contained in:
Alex Crichton 2018-08-29 10:27:44 -07:00
parent b9dc937d73
commit 0a38e44f1f
2 changed files with 31 additions and 21 deletions

View File

@ -687,4 +687,28 @@ impl<'a> FirstPassRecord<'a> {
self.fill_superclasses(superclass, set); self.fill_superclasses(superclass, set);
} }
} }
pub fn all_mixins<'me>(&'me self, interface: &str)
-> impl Iterator<Item = &'me MixinData<'a>> + '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);
}
}
}
} }

View File

@ -418,20 +418,11 @@ impl<'src> FirstPassRecord<'src> {
); );
} }
self.append_interface_mixins(program, name, name); for data in self.all_mixins(name) {
} for member in &data.methods {
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 {
self.member_operation( self.member_operation(
program, program,
self_name, name,
&member.attributes, &member.attributes,
None, None,
&[], &[],
@ -440,13 +431,13 @@ impl<'src> FirstPassRecord<'src> {
&member.identifier, &member.identifier,
); );
} }
for member in &mixin_data.consts { for member in &data.consts {
self.append_const(program, self_name, member); self.append_const(program, name, member);
} }
for member in &mixin_data.attributes { for member in &data.attributes {
self.member_attribute( self.member_attribute(
program, program,
self_name, name,
&member.attributes, &member.attributes,
if let Some(s) = member.stringifier { if let Some(s) = member.stringifier {
Some(weedle::interface::StringifierOrInheritOrStatic::Stringifier(s)) 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( fn append_constructor(