1use crate::Language;
8use std::{
9 fmt,
10 hash::{Hash, Hasher},
11};
12
13pub enum GreenTree<'a, L: Language> {
25 Node(&'a GreenNode<'a, L>),
27 Leaf(GreenLeaf<L>),
29}
30
31impl<'a, L: Language> Clone for GreenTree<'a, L> {
33 fn clone(&self) -> Self {
34 *self
35 }
36}
37
38impl<'a, L: Language> Copy for GreenTree<'a, L> {}
39
40impl<'a, L: Language> fmt::Debug for GreenTree<'a, L> {
41 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
42 match self {
43 Self::Node(node) => fmt::Debug::fmt(node, f),
44 Self::Leaf(leaf) => fmt::Debug::fmt(leaf, f),
45 }
46 }
47}
48
49impl<'a, L: Language> PartialEq for GreenTree<'a, L> {
50 fn eq(&self, other: &Self) -> bool {
51 match (self, other) {
52 (Self::Node(l0), Self::Node(r0)) => l0 == r0,
53 (Self::Leaf(l0), Self::Leaf(r0)) => l0 == r0,
54 _ => false,
55 }
56 }
57}
58
59impl<'a, L: Language> Eq for GreenTree<'a, L> {}
60
61impl<'a, L: Language> Hash for GreenTree<'a, L> {
62 fn hash<H: Hasher>(&self, state: &mut H) {
63 match self {
64 Self::Node(node) => node.hash(state),
65 Self::Leaf(leaf) => leaf.hash(state),
66 }
67 }
68}
69
70impl<'a, L: Language> GreenTree<'a, L> {
71 #[inline]
76 pub fn len(&self) -> u32 {
77 match self {
78 GreenTree::Node(n) => n.byte_length,
79 GreenTree::Leaf(t) => t.length,
80 }
81 }
82
83 #[inline]
85 pub fn is_node(&self) -> bool {
86 matches!(self, Self::Node(_))
87 }
88
89 #[inline]
91 pub fn is_leaf(&self) -> bool {
92 matches!(self, Self::Leaf(_))
93 }
94
95 #[inline]
97 pub fn as_node(&self) -> Option<&'a GreenNode<'a, L>> {
98 match self {
99 Self::Node(n) => Some(n),
100 _ => None,
101 }
102 }
103
104 #[inline]
106 pub fn as_leaf(&self) -> Option<GreenLeaf<L>> {
107 match self {
108 Self::Leaf(l) => Some(*l),
109 _ => None,
110 }
111 }
112}
113
114pub struct GreenLeaf<L: Language> {
119 pub kind: L::TokenType,
121 pub length: u32,
123 pub metadata: Option<std::num::NonZeroU32>,
128}
129
130impl<L: Language> fmt::Debug for GreenLeaf<L> {
131 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
132 f.debug_struct("GreenLeaf").field("kind", &self.kind).field("length", &self.length).field("metadata", &self.metadata).finish()
133 }
134}
135
136impl<L: Language> Hash for GreenLeaf<L> {
137 fn hash<H: Hasher>(&self, state: &mut H) {
138 self.kind.hash(state);
139 self.length.hash(state);
140 self.metadata.hash(state)
141 }
142}
143
144impl<L: Language> Clone for GreenLeaf<L> {
146 fn clone(&self) -> Self {
147 *self
148 }
149}
150
151impl<L: Language> Copy for GreenLeaf<L> {}
152
153impl<L: Language> PartialEq for GreenLeaf<L> {
154 fn eq(&self, other: &Self) -> bool {
155 self.kind == other.kind && self.length == other.length && self.metadata == other.metadata
156 }
157}
158
159impl<L: Language> Eq for GreenLeaf<L> {}
160
161impl<L: Language> GreenLeaf<L> {
162 #[inline]
169 pub fn new(kind: L::TokenType, len: u32) -> Self {
170 Self { kind, length: len, metadata: None }
171 }
172
173 #[inline]
181 pub fn with_metadata(kind: L::TokenType, len: u32, metadata: Option<std::num::NonZeroU32>) -> Self {
182 Self { kind, length: len, metadata }
183 }
184
185 #[inline]
187 pub fn kind(&self) -> L::TokenType {
188 self.kind
189 }
190
191 #[inline]
193 pub fn length(&self) -> u32 {
194 self.length
195 }
196}
197
198pub struct GreenNode<'a, L: Language> {
206 pub kind: L::ElementType,
208 pub children: &'a [GreenTree<'a, L>],
210 pub byte_length: u32,
212}
213
214impl<'a, L: Language> Clone for GreenNode<'a, L> {
216 fn clone(&self) -> Self {
217 Self { kind: self.kind, byte_length: self.byte_length, children: self.children }
218 }
219}
220
221impl<'a, L: Language> PartialEq for GreenNode<'a, L> {
222 fn eq(&self, other: &Self) -> bool {
223 self.kind == other.kind && self.byte_length == other.byte_length && self.children == other.children
224 }
225}
226
227impl<'a, L: Language> Eq for GreenNode<'a, L> {}
228
229impl<'a, L: Language> fmt::Debug for GreenNode<'a, L> {
230 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
231 f.debug_struct("GreenNode").field("kind", &self.kind).field("children", &self.children).field("length", &self.byte_length).finish()
232 }
233}
234
235impl<'a, L: Language> Hash for GreenNode<'a, L> {
236 fn hash<H: Hasher>(&self, state: &mut H) {
237 self.kind.hash(state);
238 self.children.hash(state)
239 }
240}
241
242impl<'a, L: Language> GreenNode<'a, L> {
243 pub fn new(kind: L::ElementType, children: &'a [GreenTree<'a, L>]) -> Self {
253 let len: u32 = children.iter().map(|c| c.len()).sum();
254 Self { kind, byte_length: len, children }
255 }
256
257 #[inline]
259 pub fn kind(&self) -> L::ElementType {
260 self.kind
261 }
262
263 #[inline]
265 pub fn text_len(&self) -> u32 {
266 self.byte_length
267 }
268
269 #[inline]
271 pub fn children(&self) -> &'a [GreenTree<'a, L>] {
272 self.children
273 }
274
275 #[inline]
279 pub fn child_at(&self, index: usize) -> Option<&'a GreenTree<'a, L>> {
280 self.children.get(index)
281 }
282
283 #[inline]
285 pub fn has_children(&self) -> bool {
286 !self.children.is_empty()
287 }
288
289 #[inline]
291 pub fn children_count(&self) -> usize {
292 self.children.len()
293 }
294}