webidl_utils/symbol/
with_attributes.rs

1use weedle::argument::{SingleArgument, VariadicArgument};
2use weedle::dictionary::DictionaryMember;
3use weedle::interface::*;
4use weedle::mixin::{AttributeMixinMember, OperationMixinMember};
5use weedle::namespace::{AttributeNamespaceMember, OperationNamespaceMember};
6use weedle::types::{AttributedNonAnyType, AttributedType};
7use weedle::*;
8
9/// A WebIDL symbol that may have 0 or more extended attributes
10pub trait SymbolWithAttributes<'a> {
11	fn attributes(self) -> Option<weedle::attribute::ExtendedAttributeList<'a>>;
12	fn has_attributes(&self) -> bool;
13}
14
15macro_rules! impl_symbol_with_attributes {
16	($($sym:ident),+ $(,)?) => {
17		$(
18			impl<'a> SymbolWithAttributes<'a> for $sym<'a> {
19				fn attributes(self) -> Option<weedle::attribute::ExtendedAttributeList<'a>> {
20					self.attributes
21				}
22
23				fn has_attributes(&self) -> bool {
24					self.attributes.is_some()
25				}
26			}
27		)+
28	};
29}
30
31impl_symbol_with_attributes!(
32	CallbackDefinition,
33	CallbackInterfaceDefinition,
34	DictionaryDefinition,
35	EnumDefinition,
36	ImplementsDefinition,
37	IncludesStatementDefinition,
38	InterfaceDefinition,
39	InterfaceMixinDefinition,
40	NamespaceDefinition,
41	PartialDictionaryDefinition,
42	PartialInterfaceDefinition,
43	PartialInterfaceMixinDefinition,
44	PartialNamespaceDefinition,
45	TypedefDefinition,
46	SingleArgument,
47	VariadicArgument,
48	DictionaryMember,
49	ConstMember,
50	AttributeInterfaceMember,
51	ConstructorInterfaceMember,
52	OperationInterfaceMember,
53	SingleTypedIterable,
54	DoubleTypedIterable,
55	SingleTypedAsyncIterable,
56	DoubleTypedAsyncIterable,
57	MaplikeInterfaceMember,
58	SetlikeInterfaceMember,
59	StringifierMember,
60	OperationMixinMember,
61	AttributeMixinMember,
62	OperationNamespaceMember,
63	AttributeNamespaceMember,
64	AttributedType,
65	AttributedNonAnyType,
66);
67
68#[cfg(test)]
69mod tests {
70	use crate::symbol::SymbolWithAttributes;
71	use weedle::{EnumDefinition, Parse};
72
73	#[test]
74	fn test_enum_definition() {
75		let (_, enum_def) = EnumDefinition::parse(
76			r#"
77				[Exposed=Window]
78				enum Color { "red", "green", "blue" };
79			"#,
80		)
81		.expect("EnumDefinition parsed with an error");
82
83		assert_eq!(enum_def.has_attributes(), true);
84	}
85}