css_parse/syntax/
declaration_group.rs1use crate::{
2 CursorSink, DeclarationOrBad, DeclarationValue, NodeMetadata, NodeWithMetadata, SemanticEq, Span, ToCursors, ToSpan,
3};
4use bumpalo::collections::Vec;
5
6#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
15#[cfg_attr(feature = "serde", derive(serde::Serialize), serde(transparent))]
16pub struct DeclarationGroup<'a, D, M>
17where
18 D: DeclarationValue<'a, M>,
19 M: NodeMetadata,
20{
21 pub declarations: Vec<'a, DeclarationOrBad<'a, D, M>>,
22}
23
24impl<'a, D, M> ToCursors for DeclarationGroup<'a, D, M>
25where
26 D: DeclarationValue<'a, M> + ToCursors,
27 M: NodeMetadata,
28{
29 fn to_cursors(&self, s: &mut impl CursorSink) {
30 for decl in &self.declarations {
31 decl.to_cursors(s);
32 }
33 }
34}
35
36impl<'a, D, M> ToSpan for DeclarationGroup<'a, D, M>
37where
38 D: DeclarationValue<'a, M> + ToSpan,
39 M: NodeMetadata,
40{
41 fn to_span(&self) -> Span {
42 self.declarations.to_span()
43 }
44}
45
46impl<'a, D, M> SemanticEq for DeclarationGroup<'a, D, M>
47where
48 D: DeclarationValue<'a, M>,
49 M: NodeMetadata,
50{
51 fn semantic_eq(&self, other: &Self) -> bool {
52 self.declarations.semantic_eq(&other.declarations)
53 }
54}
55
56impl<'a, D, M> NodeWithMetadata<M> for DeclarationGroup<'a, D, M>
57where
58 D: DeclarationValue<'a, M>,
59 M: NodeMetadata,
60{
61 fn metadata(&self) -> M {
62 let mut meta = M::default();
63 for decl in &self.declarations {
64 meta = meta.merge(decl.metadata());
65 }
66 meta
67 }
68}