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);