webidl_utils/symbol/
with_identifier2.rs1use weedle::attribute::{ExtendedAttributeIdent, ExtendedAttributeNamedArgList};
2use weedle::{ImplementsDefinition, IncludesStatementDefinition};
3
4pub trait SymbolWithIdentifier2<'a>:
6 SymbolWithIdentifierLhs<'a> + SymbolWithIdentifierRhs<'a>
7{
8}
9
10pub trait SymbolWithIdentifierRhs<'a> {
12 fn rhs_identifier(&self) -> weedle::common::Identifier<'a>;
13}
14
15pub trait SymbolWithIdentifierLhs<'a> {
17 fn lhs_identifier(&self) -> weedle::common::Identifier<'a>;
18}
19
20macro_rules! impl_symbol_with_identifier_lhs {
21 ($($sym:ident),+ $(,)?) => {
22 $(
23 impl<'a> SymbolWithIdentifierLhs<'a> for $sym<'a> {
24 fn lhs_identifier(&self) -> weedle::common::Identifier<'a> {
25 self.lhs_identifier
26 }
27 }
28 )+
29 }
30}
31
32macro_rules! impl_symbol_with_identifier_rhs {
33 ($($sym:ident),+ $(,)?) => {
34 $(
35 impl<'a> SymbolWithIdentifierRhs<'a> for $sym<'a> {
36 fn rhs_identifier(&self) -> weedle::common::Identifier<'a> {
37 self.rhs_identifier
38 }
39 }
40 )+
41 }
42}
43
44impl_symbol_with_identifier_lhs!(
45 ImplementsDefinition,
46 IncludesStatementDefinition,
47 ExtendedAttributeNamedArgList,
48 ExtendedAttributeIdent,
49);
50
51impl_symbol_with_identifier_rhs!(
52 ImplementsDefinition,
53 IncludesStatementDefinition,
54 ExtendedAttributeNamedArgList
55);
56
57impl<'a> SymbolWithIdentifier2<'a> for ImplementsDefinition<'a> {}
58impl<'a> SymbolWithIdentifier2<'a> for IncludesStatementDefinition<'a> {}
59impl<'a> SymbolWithIdentifier2<'a> for ExtendedAttributeNamedArgList<'a> {}
60
61#[cfg(test)]
62mod test_identifier2 {
63 use crate::symbol::{SymbolWithIdentifierLhs, SymbolWithIdentifierRhs};
64 use weedle::common::Identifier;
65 use weedle::{ImplementsDefinition, Parse};
66
67 #[rustfmt::skip]
68 #[test]
69 fn test_implements_definition() {
70 let (_, implements) = ImplementsDefinition::parse("FooBar implements Foo;")
71 .expect("WebIDL content parsed with an error");
72
73 assert_eq!(implements.lhs_identifier(), Identifier("FooBar"));
74 assert_eq!(implements.rhs_identifier(), Identifier("Foo"));
75 }
76}