From ce2c0ded74f20fee1ba02b8bf9dddca6bbc6f33e Mon Sep 17 00:00:00 2001 From: Anton Danilkin Date: Fri, 10 Aug 2018 17:19:40 +0300 Subject: [PATCH] Fix chrome only checks --- crates/webidl/src/first_pass.rs | 54 +++++++++++++++++++++++---------- crates/webidl/src/lib.rs | 9 ++++++ 2 files changed, 47 insertions(+), 16 deletions(-) diff --git a/crates/webidl/src/first_pass.rs b/crates/webidl/src/first_pass.rs index 8aa677df..6d2e434a 100644 --- a/crates/webidl/src/first_pass.rs +++ b/crates/webidl/src/first_pass.rs @@ -105,15 +105,24 @@ impl<'src> FirstPass<'src, ()> for weedle::Definition<'src> { impl<'src> FirstPass<'src, ()> for weedle::DictionaryDefinition<'src> { fn first_pass(&'src self, record: &mut FirstPassRecord<'src>, (): ()) -> Result<()> { + if util::is_chrome_only(&self.attributes) { + return Ok(()); + } + if !record.dictionaries.insert(self.identifier.0) { warn!("encountered multiple dictionary declarations of {}", self.identifier.0); } + Ok(()) } } impl<'src> FirstPass<'src, ()> for weedle::EnumDefinition<'src> { fn first_pass(&'src self, record: &mut FirstPassRecord<'src>, (): ()) -> Result<()> { + if util::is_chrome_only(&self.attributes) { + return Ok(()); + } + if !record.enums.insert(self.identifier.0) { warn!("Encountered multiple enum declarations of {}", self.identifier.0); } @@ -124,11 +133,16 @@ impl<'src> FirstPass<'src, ()> for weedle::EnumDefinition<'src> { impl<'src> FirstPass<'src, ()> for weedle::IncludesStatementDefinition<'src> { fn first_pass(&'src self, record: &mut FirstPassRecord<'src>, (): ()) -> Result<()> { + if util::is_chrome_only(&self.attributes) { + return Ok(()); + } + record .includes .entry(self.lhs_identifier.0) .or_insert_with(Default::default) .insert(self.rhs_identifier.0); + Ok(()) } } @@ -173,6 +187,10 @@ fn first_pass_operation<'src>( impl<'src> FirstPass<'src, ()> for weedle::InterfaceDefinition<'src> { fn first_pass(&'src self, record: &mut FirstPassRecord<'src>, (): ()) -> Result<()> { + if util::is_chrome_only(&self.attributes) { + return Ok(()); + } + { let interface_data = record .interfaces @@ -182,10 +200,6 @@ impl<'src> FirstPass<'src, ()> for weedle::InterfaceDefinition<'src> { interface_data.superclass = self.inheritance.map(|s| s.identifier.0); } - if util::is_chrome_only(&self.attributes) { - return Ok(()) - } - if let Some(attrs) = &self.attributes { for attr in &attrs.body.list { attr.first_pass(record, self.identifier.0)?; @@ -202,6 +216,10 @@ impl<'src> FirstPass<'src, ()> for weedle::InterfaceDefinition<'src> { impl<'src> FirstPass<'src, ()> for weedle::PartialInterfaceDefinition<'src> { fn first_pass(&'src self, record: &mut FirstPassRecord<'src>, (): ()) -> Result<()> { + if util::is_chrome_only(&self.attributes) { + return Ok(()); + } + record .interfaces .entry(self.identifier.0) @@ -214,10 +232,6 @@ impl<'src> FirstPass<'src, ()> for weedle::PartialInterfaceDefinition<'src> { }, ); - if util::is_chrome_only(&self.attributes) { - return Ok(()) - } - for member in &self.members.body { member.first_pass(record, self.identifier.0)?; } @@ -284,6 +298,10 @@ impl<'src> FirstPass<'src, &'src str> for weedle::interface::InterfaceMember<'sr impl<'src> FirstPass<'src, &'src str> for weedle::interface::OperationInterfaceMember<'src> { fn first_pass(&'src self, record: &mut FirstPassRecord<'src>, self_name: &'src str) -> Result<()> { + if util::is_chrome_only(&self.attributes) { + return Ok(()); + } + if !self.specials.is_empty() && self.specials.len() != 1 { warn!("Unsupported webidl operation {:?}", self); return Ok(()) @@ -313,6 +331,10 @@ impl<'src> FirstPass<'src, &'src str> for weedle::interface::OperationInterfaceM impl<'src> FirstPass<'src, ()> for weedle::InterfaceMixinDefinition<'src>{ fn first_pass(&'src self, record: &mut FirstPassRecord<'src>, (): ()) -> Result<()> { + if util::is_chrome_only(&self.attributes) { + return Ok(()); + } + { let mixin_data = record .mixins @@ -322,10 +344,6 @@ impl<'src> FirstPass<'src, ()> for weedle::InterfaceMixinDefinition<'src>{ mixin_data.members.push(&self.members.body); } - if util::is_chrome_only(&self.attributes) { - return Ok(()) - } - for member in &self.members.body { member.first_pass(record, self.identifier.0)?; } @@ -336,6 +354,10 @@ impl<'src> FirstPass<'src, ()> for weedle::InterfaceMixinDefinition<'src>{ impl<'src> FirstPass<'src, ()> for weedle::PartialInterfaceMixinDefinition<'src> { fn first_pass(&'src self, record: &mut FirstPassRecord<'src>, (): ()) -> Result<()> { + if util::is_chrome_only(&self.attributes) { + return Ok(()); + } + record .mixins .entry(self.identifier.0) @@ -349,10 +371,6 @@ impl<'src> FirstPass<'src, ()> for weedle::PartialInterfaceMixinDefinition<'src> .members .push(&self.members.body); - if util::is_chrome_only(&self.attributes) { - return Ok(()) - } - for member in &self.members.body { member.first_pass(record, self.identifier.0)?; } @@ -374,6 +392,10 @@ impl<'src> FirstPass<'src, &'src str> for weedle::mixin::MixinMember<'src> { impl<'src> FirstPass<'src, &'src str> for weedle::mixin::OperationMixinMember<'src> { fn first_pass(&'src self, record: &mut FirstPassRecord<'src>, self_name: &'src str) -> Result<()> { + if util::is_chrome_only(&self.attributes) { + return Ok(()); + } + if self.stringifier.is_some() { warn!("Unsupported webidl operation {:?}", self); return Ok(()) diff --git a/crates/webidl/src/lib.rs b/crates/webidl/src/lib.rs index fc76f607..1471dc46 100644 --- a/crates/webidl/src/lib.rs +++ b/crates/webidl/src/lib.rs @@ -659,6 +659,7 @@ fn member_operation<'src>( if util::is_chrome_only(attrs) { return Ok(()); } + let is_static = match modifier { Some(Stringifier(_)) => { warn!("Unsupported stringifier on type {:?}", (self_name, identifier)); @@ -754,6 +755,10 @@ impl<'src> WebidlParse<'src, ()> for weedle::EnumDefinition<'src> { _: &FirstPassRecord<'src>, (): (), ) -> Result<()> { + if util::is_chrome_only(&self.attributes) { + return Ok(()); + } + let variants = &self.values.body.list; program.imports.push(backend::ast::Import { module: None, @@ -787,6 +792,10 @@ impl<'src> WebidlParse<'src, &'src str> for weedle::interface::ConstMember<'src> record: &FirstPassRecord<'src>, self_name: &'src str, ) -> Result<()> { + if util::is_chrome_only(&self.attributes) { + return Ok(()); + } + let ty = match self.const_type.to_syn_type(record, TypePosition::Return) { Some(s) => s, None => return Ok(()),