webidl_utils/symbol/
with_attributes.rs1use 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
9pub 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}