backyard_nodes/
utils.rs

1use bstr::BString;
2use bumpalo::{ Bump, boxed::Box, collections::Vec };
3use crate::{
4  AssignmentType,
5  BinaryType,
6  BodyType,
7  CastType,
8  Inheritance,
9  MagicMethodName,
10  MagicName,
11  Modifier,
12  Node,
13  NodeWrapper,
14  PostType,
15  PreType,
16  Quote,
17  UseItemModifier,
18  Visibility,
19};
20
21pub trait IntoBoxedNode<'arena> {
22  fn into_boxed(self, arena: &'arena Bump) -> Box<'arena, Node<'arena>>;
23}
24
25impl<'arena> IntoBoxedNode<'arena> for Node<'arena> {
26  #[inline]
27  fn into_boxed(self, arena: &'arena Bump) -> Box<'arena, Node<'arena>> {
28    Box::new_in(self, arena)
29  }
30}
31
32pub trait IntoBoxedOptionNode<'arena> {
33  fn into_boxed(self, arena: &'arena Bump) -> Option<Box<'arena, Node<'arena>>>;
34}
35
36impl<'arena> IntoBoxedOptionNode<'arena> for Option<Node<'arena>> {
37  #[inline]
38  fn into_boxed(self, arena: &'arena Bump) -> Option<Box<'arena, Node<'arena>>> {
39    self.map(|x| Box::new_in(x, arena))
40  }
41}
42
43pub trait CloneIn<'arena>: Sized {
44  type Cloned: ?Sized;
45
46  fn clone_in(&self, arena: &'arena Bump) -> Self::Cloned;
47}
48
49impl<'arena, T, C> CloneIn<'arena> for Option<T> where T: CloneIn<'arena, Cloned = C> {
50  type Cloned = Option<C>;
51
52  fn clone_in(&self, arena: &'arena Bump) -> Self::Cloned {
53    self.as_ref().map(|it| it.clone_in(arena))
54  }
55}
56
57impl<'arena> CloneIn<'arena> for Node<'_> {
58  type Cloned = Node<'arena>;
59
60  #[inline]
61  fn clone_in(&self, arena: &'arena Bump) -> Self::Cloned {
62    Node::new(self.node_type.clone(), self.wrapper.clone_in(arena), self.loc.clone())
63  }
64}
65
66impl<'arena> CloneIn<'arena> for NodeWrapper<'_> {
67  type Cloned = NodeWrapper<'arena>;
68
69  #[inline]
70  fn clone_in(&self, arena: &'arena Bump) -> Self::Cloned {
71    match self {
72      NodeWrapper::AnonymousClass(v) => NodeWrapper::AnonymousClass(v.clone_in(arena)),
73      NodeWrapper::AnonymousFunction(v) => NodeWrapper::AnonymousFunction(v.clone_in(arena)),
74      NodeWrapper::CallArgument(v) => NodeWrapper::CallArgument(v.clone_in(arena)),
75      NodeWrapper::Array(v) => NodeWrapper::Array(v.clone_in(arena)),
76      NodeWrapper::ArrayItem(v) => NodeWrapper::ArrayItem(v.clone_in(arena)),
77      NodeWrapper::ArrayLookup(v) => NodeWrapper::ArrayLookup(v.clone_in(arena)),
78      NodeWrapper::ArrowFunction(v) => NodeWrapper::ArrowFunction(v.clone_in(arena)),
79      NodeWrapper::Assignment(v) => NodeWrapper::Assignment(v.clone_in(arena)),
80      NodeWrapper::Attribute(v) => NodeWrapper::Attribute(v.clone_in(arena)),
81      NodeWrapper::AttributeItem(v) => NodeWrapper::AttributeItem(v.clone_in(arena)),
82      NodeWrapper::Bin(v) => NodeWrapper::Bin(v.clone_in(arena)),
83      NodeWrapper::Block(v) => NodeWrapper::Block(v.clone_in(arena)),
84      NodeWrapper::Boolean(v) => NodeWrapper::Boolean(v.clone_in(arena)),
85      NodeWrapper::Break(v) => NodeWrapper::Break(v.clone_in(arena)),
86      NodeWrapper::Call(v) => NodeWrapper::Call(v.clone_in(arena)),
87      NodeWrapper::Case(v) => NodeWrapper::Case(v.clone_in(arena)),
88      NodeWrapper::Cast(v) => NodeWrapper::Cast(v.clone_in(arena)),
89      NodeWrapper::Catch(v) => NodeWrapper::Catch(v.clone_in(arena)),
90      NodeWrapper::Class(v) => NodeWrapper::Class(v.clone_in(arena)),
91      NodeWrapper::ClassKeyword(v) => NodeWrapper::ClassKeyword(v.clone_in(arena)),
92      NodeWrapper::Clone(v) => NodeWrapper::Clone(v.clone_in(arena)),
93      NodeWrapper::CommentBlock(v) => NodeWrapper::CommentBlock(v.clone_in(arena)),
94      NodeWrapper::CommentDoc(v) => NodeWrapper::CommentDoc(v.clone_in(arena)),
95      NodeWrapper::CommentLine(v) => NodeWrapper::CommentLine(v.clone_in(arena)),
96      NodeWrapper::Const(v) => NodeWrapper::Const(v.clone_in(arena)),
97      NodeWrapper::ConstProperty(v) => NodeWrapper::ConstProperty(v.clone_in(arena)),
98      NodeWrapper::ConstructorParameter(v) => NodeWrapper::ConstructorParameter(v.clone_in(arena)),
99      NodeWrapper::Continue(v) => NodeWrapper::Continue(v.clone_in(arena)),
100      NodeWrapper::Declare(v) => NodeWrapper::Declare(v.clone_in(arena)),
101      NodeWrapper::DeclareArgument(v) => NodeWrapper::DeclareArgument(v.clone_in(arena)),
102      NodeWrapper::DoWhile(v) => NodeWrapper::DoWhile(v.clone_in(arena)),
103      NodeWrapper::DoWhileCondition(v) => NodeWrapper::DoWhileCondition(v.clone_in(arena)),
104      NodeWrapper::Echo(v) => NodeWrapper::Echo(v.clone_in(arena)),
105      NodeWrapper::Else(v) => NodeWrapper::Else(v.clone_in(arena)),
106      NodeWrapper::Encapsed(v) => NodeWrapper::Encapsed(v.clone_in(arena)),
107      NodeWrapper::EncapsedPart(v) => NodeWrapper::EncapsedPart(v.clone_in(arena)),
108      NodeWrapper::Enum(v) => NodeWrapper::Enum(v.clone_in(arena)),
109      NodeWrapper::EnumItem(v) => NodeWrapper::EnumItem(v.clone_in(arena)),
110      NodeWrapper::Eval(v) => NodeWrapper::Eval(v.clone_in(arena)),
111      NodeWrapper::Exit(v) => NodeWrapper::Exit(v.clone_in(arena)),
112      NodeWrapper::Finally(v) => NodeWrapper::Finally(v.clone_in(arena)),
113      NodeWrapper::For(v) => NodeWrapper::For(v.clone_in(arena)),
114      NodeWrapper::Foreach(v) => NodeWrapper::Foreach(v.clone_in(arena)),
115      NodeWrapper::Function(v) => NodeWrapper::Function(v.clone_in(arena)),
116      NodeWrapper::Global(v) => NodeWrapper::Global(v.clone_in(arena)),
117      NodeWrapper::Goto(v) => NodeWrapper::Goto(v.clone_in(arena)),
118      NodeWrapper::HereDoc(v) => NodeWrapper::HereDoc(v.clone_in(arena)),
119      NodeWrapper::Identifier(v) => NodeWrapper::Identifier(v.clone_in(arena)),
120      NodeWrapper::If(v) => NodeWrapper::If(v.clone_in(arena)),
121      NodeWrapper::Include(v) => NodeWrapper::Include(v.clone_in(arena)),
122      NodeWrapper::Inline(v) => NodeWrapper::Inline(v.clone_in(arena)),
123      NodeWrapper::Interface(v) => NodeWrapper::Interface(v.clone_in(arena)),
124      NodeWrapper::IntersectionType(v) => NodeWrapper::IntersectionType(v.clone_in(arena)),
125      NodeWrapper::Label(v) => NodeWrapper::Label(v.clone_in(arena)),
126      NodeWrapper::List(v) => NodeWrapper::List(v.clone_in(arena)),
127      NodeWrapper::Magic(v) => NodeWrapper::Magic(v.clone_in(arena)),
128      NodeWrapper::MagicMethod(v) => NodeWrapper::MagicMethod(v.clone_in(arena)),
129      NodeWrapper::Match(v) => NodeWrapper::Match(v.clone_in(arena)),
130      NodeWrapper::MatchArm(v) => NodeWrapper::MatchArm(v.clone_in(arena)),
131      NodeWrapper::Method(v) => NodeWrapper::Method(v.clone_in(arena)),
132      NodeWrapper::Namespace(v) => NodeWrapper::Namespace(v.clone_in(arena)),
133      NodeWrapper::Negate(v) => NodeWrapper::Negate(v.clone_in(arena)),
134      NodeWrapper::New(v) => NodeWrapper::New(v.clone_in(arena)),
135      NodeWrapper::NowDoc(v) => NodeWrapper::NowDoc(v.clone_in(arena)),
136      NodeWrapper::Null(v) => NodeWrapper::Null(v.clone_in(arena)),
137      NodeWrapper::Number(v) => NodeWrapper::Number(v.clone_in(arena)),
138      NodeWrapper::ObjectAccess(v) => NodeWrapper::ObjectAccess(v.clone_in(arena)),
139      NodeWrapper::Parameter(v) => NodeWrapper::Parameter(v.clone_in(arena)),
140      NodeWrapper::Parent(v) => NodeWrapper::Parent(v.clone_in(arena)),
141      NodeWrapper::Parenthesis(v) => NodeWrapper::Parenthesis(v.clone_in(arena)),
142      NodeWrapper::Post(v) => NodeWrapper::Post(v.clone_in(arena)),
143      NodeWrapper::Pre(v) => NodeWrapper::Pre(v.clone_in(arena)),
144      NodeWrapper::Print(v) => NodeWrapper::Print(v.clone_in(arena)),
145      NodeWrapper::Program(v) => NodeWrapper::Program(v.clone_in(arena)),
146      NodeWrapper::Property(v) => NodeWrapper::Property(v.clone_in(arena)),
147      NodeWrapper::PropertyHook(v) => NodeWrapper::PropertyHook(v.clone_in(arena)),
148      NodeWrapper::PropertyItem(v) => NodeWrapper::PropertyItem(v.clone_in(arena)),
149      NodeWrapper::Reference(v) => NodeWrapper::Reference(v.clone_in(arena)),
150      NodeWrapper::Return(v) => NodeWrapper::Return(v.clone_in(arena)),
151      NodeWrapper::SelfKeyword(v) => NodeWrapper::SelfKeyword(v.clone_in(arena)),
152      NodeWrapper::Silent(v) => NodeWrapper::Silent(v.clone_in(arena)),
153      NodeWrapper::Static(v) => NodeWrapper::Static(v.clone_in(arena)),
154      NodeWrapper::StaticKeyword(v) => NodeWrapper::StaticKeyword(v.clone_in(arena)),
155      NodeWrapper::StaticLookup(v) => NodeWrapper::StaticLookup(v.clone_in(arena)),
156      NodeWrapper::String(v) => NodeWrapper::String(v.clone_in(arena)),
157      NodeWrapper::Switch(v) => NodeWrapper::Switch(v.clone_in(arena)),
158      NodeWrapper::Ternary(v) => NodeWrapper::Ternary(v.clone_in(arena)),
159      NodeWrapper::This(v) => NodeWrapper::This(v.clone_in(arena)),
160      NodeWrapper::Trait(v) => NodeWrapper::Trait(v.clone_in(arena)),
161      NodeWrapper::TraitUse(v) => NodeWrapper::TraitUse(v.clone_in(arena)),
162      NodeWrapper::TraitUseAlias(v) => NodeWrapper::TraitUseAlias(v.clone_in(arena)),
163      NodeWrapper::TraitUsePrecedence(v) => NodeWrapper::TraitUsePrecedence(v.clone_in(arena)),
164      NodeWrapper::Throw(v) => NodeWrapper::Throw(v.clone_in(arena)),
165      NodeWrapper::Try(v) => NodeWrapper::Try(v.clone_in(arena)),
166      NodeWrapper::Type(v) => NodeWrapper::Type(v.clone_in(arena)),
167      NodeWrapper::UnionType(v) => NodeWrapper::UnionType(v.clone_in(arena)),
168      NodeWrapper::Use(v) => NodeWrapper::Use(v.clone_in(arena)),
169      NodeWrapper::UseItem(v) => NodeWrapper::UseItem(v.clone_in(arena)),
170      NodeWrapper::Variable(v) => NodeWrapper::Variable(v.clone_in(arena)),
171      NodeWrapper::Variadic(v) => NodeWrapper::Variadic(v.clone_in(arena)),
172      NodeWrapper::While(v) => NodeWrapper::While(v.clone_in(arena)),
173      NodeWrapper::Yield(v) => NodeWrapper::Yield(v.clone_in(arena)),
174      NodeWrapper::YieldFrom(v) => NodeWrapper::YieldFrom(v.clone_in(arena)),
175    }
176  }
177}
178
179impl<'arena, T, C: 'arena> CloneIn<'arena> for Box<'_, T> where T: CloneIn<'arena, Cloned = C> {
180  type Cloned = Box<'arena, C>;
181
182  #[inline]
183  fn clone_in(&self, arena: &'arena Bump) -> Self::Cloned {
184    Box::new_in(self.as_ref().clone_in(arena), arena)
185  }
186}
187
188impl<'arena, T, C: 'arena> CloneIn<'arena> for Vec<'_, T> where T: CloneIn<'arena, Cloned = C> {
189  type Cloned = Vec<'arena, C>;
190
191  #[inline]
192  fn clone_in(&self, arena: &'arena Bump) -> Self::Cloned {
193    Vec::from_iter_in(
194      self.iter().map(|it| it.clone_in(arena)),
195      arena
196    )
197  }
198}
199
200macro_rules! impl_clone_in_clone {
201  ($($t:ty),*) => {
202      $(
203          impl<'arena> CloneIn<'arena> for $t {
204              type Cloned = Self;
205              
206              #[inline(always)]
207              fn clone_in(&self, _: &'arena Bump) -> Self {
208                  self.clone()
209              }
210          }
211      )*
212  };
213}
214
215impl_clone_in_clone!(
216  AssignmentType,
217  BinaryType,
218  CastType,
219  PostType,
220  PreType,
221  MagicName,
222  MagicMethodName,
223  UseItemModifier,
224  Modifier,
225  Quote,
226  Inheritance,
227  Visibility,
228  BodyType,
229  BString,
230  std::vec::Vec<Visibility>
231);
232
233macro_rules! impl_clone_in {
234  ($($t:ty),*) => {
235      $(
236          impl<'arena> CloneIn<'arena> for $t {
237              type Cloned = Self;
238              
239              #[inline(always)]
240              fn clone_in(&self, _: &'arena Bump) -> Self {
241                  *self
242              }
243          }
244      )*
245  };
246}
247
248impl_clone_in!(
249  usize,
250  u8,
251  u16,
252  u32,
253  u64,
254  u128,
255  isize,
256  i8,
257  i16,
258  i32,
259  i64,
260  i128,
261  f32,
262  f64,
263  bool,
264  char
265);