webidl_utils/symbol/
with_identifier2.rs

1use weedle::attribute::{ExtendedAttributeIdent, ExtendedAttributeNamedArgList};
2use weedle::{ImplementsDefinition, IncludesStatementDefinition};
3
4/// A WebIDL symbol with 2 identifiers on the left and right side
5pub trait SymbolWithIdentifier2<'a>:
6	SymbolWithIdentifierLhs<'a> + SymbolWithIdentifierRhs<'a>
7{
8}
9
10/// A WebIDL symbol with a left-hand side identifier
11pub trait SymbolWithIdentifierRhs<'a> {
12	fn rhs_identifier(&self) -> weedle::common::Identifier<'a>;
13}
14
15/// A WebIDL symbol with a right-hand side identifier
16pub 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}