1use std::fmt::Debug;
2
3use strum::Display;
4
5use mago_span::HasSpan;
6use mago_span::Span;
7
8use crate::cst::Program;
9use crate::cst::cst::Access;
10use crate::cst::cst::AnonymousClass;
11use crate::cst::cst::Argument;
12use crate::cst::cst::ArgumentList;
13use crate::cst::cst::Array;
14use crate::cst::cst::ArrayAccess;
15use crate::cst::cst::ArrayAppend;
16use crate::cst::cst::ArrayElement;
17use crate::cst::cst::ArrowFunction;
18use crate::cst::cst::Assignment;
19use crate::cst::cst::AssignmentOperator;
20use crate::cst::cst::Attribute;
21use crate::cst::cst::AttributeList;
22use crate::cst::cst::Binary;
23use crate::cst::cst::BinaryOperator;
24use crate::cst::cst::Block;
25use crate::cst::cst::BracedExpressionStringPart;
26use crate::cst::cst::Break;
27use crate::cst::cst::Call;
28use crate::cst::cst::Class;
29use crate::cst::cst::ClassConstantAccess;
30use crate::cst::cst::ClassLikeConstant;
31use crate::cst::cst::ClassLikeConstantItem;
32use crate::cst::cst::ClassLikeConstantSelector;
33use crate::cst::cst::ClassLikeMember;
34use crate::cst::cst::ClassLikeMemberExpressionSelector;
35use crate::cst::cst::ClassLikeMemberSelector;
36use crate::cst::cst::Clone;
37use crate::cst::cst::ClosingTag;
38use crate::cst::cst::Closure;
39use crate::cst::cst::ClosureUseClause;
40use crate::cst::cst::ClosureUseClauseVariable;
41use crate::cst::cst::CompositeString;
42use crate::cst::cst::Conditional;
43use crate::cst::cst::Constant;
44use crate::cst::cst::ConstantAccess;
45use crate::cst::cst::ConstantItem;
46use crate::cst::cst::Construct;
47use crate::cst::cst::Continue;
48use crate::cst::cst::Declare;
49use crate::cst::cst::DeclareBody;
50use crate::cst::cst::DeclareColonDelimitedBody;
51use crate::cst::cst::DeclareItem;
52use crate::cst::cst::DieConstruct;
53use crate::cst::cst::DirectVariable;
54use crate::cst::cst::DoWhile;
55use crate::cst::cst::DocumentString;
56use crate::cst::cst::Echo;
57use crate::cst::cst::EchoTag;
58use crate::cst::cst::EmptyConstruct;
59use crate::cst::cst::Enum;
60use crate::cst::cst::EnumBackingTypeHint;
61use crate::cst::cst::EnumCase;
62use crate::cst::cst::EnumCaseBackedItem;
63use crate::cst::cst::EnumCaseItem;
64use crate::cst::cst::EnumCaseUnitItem;
65use crate::cst::cst::EvalConstruct;
66use crate::cst::cst::ExitConstruct;
67use crate::cst::cst::Expression;
68use crate::cst::cst::ExpressionStatement;
69use crate::cst::cst::Extends;
70use crate::cst::cst::For;
71use crate::cst::cst::ForBody;
72use crate::cst::cst::ForColonDelimitedBody;
73use crate::cst::cst::Foreach;
74use crate::cst::cst::ForeachBody;
75use crate::cst::cst::ForeachColonDelimitedBody;
76use crate::cst::cst::ForeachKeyValueTarget;
77use crate::cst::cst::ForeachTarget;
78use crate::cst::cst::ForeachValueTarget;
79use crate::cst::cst::FullOpeningTag;
80use crate::cst::cst::FullyQualifiedIdentifier;
81use crate::cst::cst::Function;
82use crate::cst::cst::FunctionCall;
83use crate::cst::cst::FunctionLikeParameter;
84use crate::cst::cst::FunctionLikeParameterDefaultValue;
85use crate::cst::cst::FunctionLikeParameterList;
86use crate::cst::cst::FunctionLikeReturnTypeHint;
87use crate::cst::cst::FunctionPartialApplication;
88use crate::cst::cst::Global;
89use crate::cst::cst::Goto;
90use crate::cst::cst::HaltCompiler;
91use crate::cst::cst::Hint;
92use crate::cst::cst::HookedProperty;
93use crate::cst::cst::Identifier;
94use crate::cst::cst::If;
95use crate::cst::cst::IfBody;
96use crate::cst::cst::IfColonDelimitedBody;
97use crate::cst::cst::IfColonDelimitedBodyElseClause;
98use crate::cst::cst::IfColonDelimitedBodyElseIfClause;
99use crate::cst::cst::IfStatementBody;
100use crate::cst::cst::IfStatementBodyElseClause;
101use crate::cst::cst::IfStatementBodyElseIfClause;
102use crate::cst::cst::Implements;
103use crate::cst::cst::IncludeConstruct;
104use crate::cst::cst::IncludeOnceConstruct;
105use crate::cst::cst::IndirectVariable;
106use crate::cst::cst::Inline;
107use crate::cst::cst::Instantiation;
108use crate::cst::cst::Interface;
109use crate::cst::cst::InterpolatedString;
110use crate::cst::cst::IntersectionHint;
111use crate::cst::cst::IssetConstruct;
112use crate::cst::cst::KeyValueArrayElement;
113use crate::cst::cst::Keyword;
114use crate::cst::cst::Label;
115use crate::cst::cst::LegacyArray;
116use crate::cst::cst::List;
117use crate::cst::cst::Literal;
118use crate::cst::cst::LiteralFloat;
119use crate::cst::cst::LiteralInteger;
120use crate::cst::cst::LiteralString;
121use crate::cst::cst::LiteralStringPart;
122use crate::cst::cst::LocalIdentifier;
123use crate::cst::cst::MagicConstant;
124use crate::cst::cst::Match;
125use crate::cst::cst::MatchArm;
126use crate::cst::cst::MatchDefaultArm;
127use crate::cst::cst::MatchExpressionArm;
128use crate::cst::cst::MaybeTypedUseItem;
129use crate::cst::cst::Method;
130use crate::cst::cst::MethodAbstractBody;
131use crate::cst::cst::MethodBody;
132use crate::cst::cst::MethodCall;
133use crate::cst::cst::MethodPartialApplication;
134use crate::cst::cst::MissingArrayElement;
135use crate::cst::cst::MixedUseItemList;
136use crate::cst::cst::Modifier;
137use crate::cst::cst::NamedArgument;
138use crate::cst::cst::NamedPlaceholderArgument;
139use crate::cst::cst::Namespace;
140use crate::cst::cst::NamespaceBody;
141use crate::cst::cst::NamespaceImplicitBody;
142use crate::cst::cst::NestedVariable;
143use crate::cst::cst::NullSafeMethodCall;
144use crate::cst::cst::NullSafePropertyAccess;
145use crate::cst::cst::NullableHint;
146use crate::cst::cst::OpeningTag;
147use crate::cst::cst::Parenthesized;
148use crate::cst::cst::ParenthesizedHint;
149use crate::cst::cst::PartialApplication;
150use crate::cst::cst::PartialArgument;
151use crate::cst::cst::PartialArgumentList;
152use crate::cst::cst::Pipe;
153use crate::cst::cst::PlaceholderArgument;
154use crate::cst::cst::PlainProperty;
155use crate::cst::cst::PositionalArgument;
156use crate::cst::cst::PrintConstruct;
157use crate::cst::cst::Property;
158use crate::cst::cst::PropertyAbstractItem;
159use crate::cst::cst::PropertyAccess;
160use crate::cst::cst::PropertyConcreteItem;
161use crate::cst::cst::PropertyHook;
162use crate::cst::cst::PropertyHookAbstractBody;
163use crate::cst::cst::PropertyHookBody;
164use crate::cst::cst::PropertyHookConcreteBody;
165use crate::cst::cst::PropertyHookConcreteExpressionBody;
166use crate::cst::cst::PropertyHookList;
167use crate::cst::cst::PropertyItem;
168use crate::cst::cst::QualifiedIdentifier;
169use crate::cst::cst::RequireConstruct;
170use crate::cst::cst::RequireOnceConstruct;
171use crate::cst::cst::Return;
172use crate::cst::cst::ShellExecuteString;
173use crate::cst::cst::ShortOpeningTag;
174use crate::cst::cst::Statement;
175use crate::cst::cst::Static;
176use crate::cst::cst::StaticAbstractItem;
177use crate::cst::cst::StaticConcreteItem;
178use crate::cst::cst::StaticItem;
179use crate::cst::cst::StaticMethodCall;
180use crate::cst::cst::StaticMethodPartialApplication;
181use crate::cst::cst::StaticPropertyAccess;
182use crate::cst::cst::StringPart;
183use crate::cst::cst::Switch;
184use crate::cst::cst::SwitchBody;
185use crate::cst::cst::SwitchBraceDelimitedBody;
186use crate::cst::cst::SwitchCase;
187use crate::cst::cst::SwitchCaseSeparator;
188use crate::cst::cst::SwitchColonDelimitedBody;
189use crate::cst::cst::SwitchDefaultCase;
190use crate::cst::cst::SwitchExpressionCase;
191use crate::cst::cst::Terminator;
192use crate::cst::cst::Throw;
193use crate::cst::cst::Trait;
194use crate::cst::cst::TraitUse;
195use crate::cst::cst::TraitUseAbsoluteMethodReference;
196use crate::cst::cst::TraitUseAbstractSpecification;
197use crate::cst::cst::TraitUseAdaptation;
198use crate::cst::cst::TraitUseAliasAdaptation;
199use crate::cst::cst::TraitUseConcreteSpecification;
200use crate::cst::cst::TraitUseMethodReference;
201use crate::cst::cst::TraitUsePrecedenceAdaptation;
202use crate::cst::cst::TraitUseSpecification;
203use crate::cst::cst::Try;
204use crate::cst::cst::TryCatchClause;
205use crate::cst::cst::TryFinallyClause;
206use crate::cst::cst::TypedUseItemList;
207use crate::cst::cst::TypedUseItemSequence;
208use crate::cst::cst::UnaryPostfix;
209use crate::cst::cst::UnaryPostfixOperator;
210use crate::cst::cst::UnaryPrefix;
211use crate::cst::cst::UnaryPrefixOperator;
212use crate::cst::cst::UnionHint;
213use crate::cst::cst::Unset;
214use crate::cst::cst::Use;
215use crate::cst::cst::UseItem;
216use crate::cst::cst::UseItemAlias;
217use crate::cst::cst::UseItemSequence;
218use crate::cst::cst::UseItems;
219use crate::cst::cst::UseType;
220use crate::cst::cst::ValueArrayElement;
221use crate::cst::cst::Variable;
222use crate::cst::cst::VariadicArrayElement;
223use crate::cst::cst::VariadicPlaceholderArgument;
224use crate::cst::cst::While;
225use crate::cst::cst::WhileBody;
226use crate::cst::cst::WhileColonDelimitedBody;
227use crate::cst::cst::Yield;
228use crate::cst::cst::YieldFrom;
229use crate::cst::cst::YieldPair;
230use crate::cst::cst::YieldValue;
231
232#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, Display)]
233#[cfg_attr(feature = "serde", derive(serde::Serialize))]
234#[cfg_attr(feature = "serde", serde(tag = "type", content = "value"))]
235#[repr(u8)]
236#[non_exhaustive]
237pub enum NodeKind {
238 Program,
239 ConstantAccess,
240 Access,
241 ClassConstantAccess,
242 NullSafePropertyAccess,
243 PropertyAccess,
244 StaticPropertyAccess,
245 Argument,
246 ArgumentList,
247 PartialArgument,
248 PartialArgumentList,
249 NamedArgument,
250 NamedPlaceholderArgument,
251 PlaceholderArgument,
252 PositionalArgument,
253 VariadicPlaceholderArgument,
254 Array,
255 ArrayAccess,
256 ArrayAppend,
257 ArrayElement,
258 KeyValueArrayElement,
259 LegacyArray,
260 List,
261 MissingArrayElement,
262 ValueArrayElement,
263 VariadicArrayElement,
264 Attribute,
265 AttributeList,
266 Block,
267 Call,
268 FunctionCall,
269 MethodCall,
270 NullSafeMethodCall,
271 StaticMethodCall,
272 PartialApplication,
273 FunctionPartialApplication,
274 MethodPartialApplication,
275 StaticMethodPartialApplication,
276 ClassLikeConstant,
277 ClassLikeConstantItem,
278 EnumCase,
279 EnumCaseBackedItem,
280 EnumCaseItem,
281 EnumCaseUnitItem,
282 Extends,
283 Implements,
284 ClassLikeConstantSelector,
285 ClassLikeMember,
286 ClassLikeMemberExpressionSelector,
287 ClassLikeMemberSelector,
288 Method,
289 MethodAbstractBody,
290 MethodBody,
291 HookedProperty,
292 PlainProperty,
293 Property,
294 PropertyAbstractItem,
295 PropertyConcreteItem,
296 PropertyHook,
297 PropertyHookAbstractBody,
298 PropertyHookBody,
299 PropertyHookConcreteBody,
300 PropertyHookConcreteExpressionBody,
301 PropertyHookList,
302 PropertyItem,
303 TraitUse,
304 TraitUseAbsoluteMethodReference,
305 TraitUseAbstractSpecification,
306 TraitUseAdaptation,
307 TraitUseAliasAdaptation,
308 TraitUseConcreteSpecification,
309 TraitUseMethodReference,
310 TraitUsePrecedenceAdaptation,
311 TraitUseSpecification,
312 AnonymousClass,
313 Class,
314 Enum,
315 EnumBackingTypeHint,
316 Interface,
317 Trait,
318 Clone,
319 Constant,
320 ConstantItem,
321 Construct,
322 DieConstruct,
323 EmptyConstruct,
324 EvalConstruct,
325 ExitConstruct,
326 IncludeConstruct,
327 IncludeOnceConstruct,
328 IssetConstruct,
329 PrintConstruct,
330 RequireConstruct,
331 RequireOnceConstruct,
332 If,
333 IfBody,
334 IfColonDelimitedBody,
335 IfColonDelimitedBodyElseClause,
336 IfColonDelimitedBodyElseIfClause,
337 IfStatementBody,
338 IfStatementBodyElseClause,
339 IfStatementBodyElseIfClause,
340 Match,
341 MatchArm,
342 MatchDefaultArm,
343 MatchExpressionArm,
344 Switch,
345 SwitchBody,
346 SwitchBraceDelimitedBody,
347 SwitchCase,
348 SwitchCaseSeparator,
349 SwitchColonDelimitedBody,
350 SwitchDefaultCase,
351 SwitchExpressionCase,
352 Declare,
353 DeclareBody,
354 DeclareColonDelimitedBody,
355 DeclareItem,
356 EchoTag,
357 Echo,
358 Expression,
359 Binary,
360 BinaryOperator,
361 UnaryPrefix,
362 UnaryPrefixOperator,
363 UnaryPostfix,
364 UnaryPostfixOperator,
365 Parenthesized,
366 ArrowFunction,
367 Closure,
368 ClosureUseClause,
369 ClosureUseClauseVariable,
370 Function,
371 FunctionLikeParameter,
372 FunctionLikeParameterDefaultValue,
373 FunctionLikeParameterList,
374 FunctionLikeReturnTypeHint,
375 Global,
376 Goto,
377 Label,
378 HaltCompiler,
379 FullyQualifiedIdentifier,
380 Identifier,
381 LocalIdentifier,
382 QualifiedIdentifier,
383 Inline,
384 Instantiation,
385 Keyword,
386 Literal,
387 Pipe,
388 LiteralFloat,
389 LiteralInteger,
390 LiteralString,
391 MagicConstant,
392 Modifier,
393 Namespace,
394 NamespaceBody,
395 NamespaceImplicitBody,
396 Assignment,
397 AssignmentOperator,
398 Conditional,
399 DoWhile,
400 Foreach,
401 ForeachBody,
402 ForeachColonDelimitedBody,
403 ForeachKeyValueTarget,
404 ForeachTarget,
405 ForeachValueTarget,
406 For,
407 ForBody,
408 ForColonDelimitedBody,
409 While,
410 WhileBody,
411 WhileColonDelimitedBody,
412 Break,
413 Continue,
414 Return,
415 Static,
416 StaticAbstractItem,
417 StaticConcreteItem,
418 StaticItem,
419 Try,
420 TryCatchClause,
421 TryFinallyClause,
422 MaybeTypedUseItem,
423 MixedUseItemList,
424 TypedUseItemList,
425 TypedUseItemSequence,
426 Use,
427 UseItem,
428 UseItemAlias,
429 UseItemSequence,
430 UseItems,
431 UseType,
432 Yield,
433 YieldFrom,
434 YieldPair,
435 YieldValue,
436 Statement,
437 ExpressionStatement,
438 BracedExpressionStringPart,
439 DocumentString,
440 InterpolatedString,
441 LiteralStringPart,
442 ShellExecuteString,
443 CompositeString,
444 StringPart,
445 ClosingTag,
446 FullOpeningTag,
447 OpeningTag,
448 ShortOpeningTag,
449 Terminator,
450 Throw,
451 Hint,
452 IntersectionHint,
453 NullableHint,
454 ParenthesizedHint,
455 UnionHint,
456 Unset,
457 DirectVariable,
458 IndirectVariable,
459 NestedVariable,
460 Variable,
461 Error,
462 MissingTerminator,
463 ClassLikeMemberMissingSelector,
464 ClassLikeConstantMissingSelector,
465}
466
467#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, Display)]
468#[cfg_attr(feature = "serde", derive(serde::Serialize))]
469#[cfg_attr(feature = "serde", serde(tag = "type", content = "value"))]
470#[repr(u8)]
471#[non_exhaustive]
472pub enum Node<'ast, 'arena> {
473 Program(&'ast Program<'arena>),
474 Access(&'ast Access<'arena>),
475 ConstantAccess(&'ast ConstantAccess<'arena>),
476 ClassConstantAccess(&'ast ClassConstantAccess<'arena>),
477 NullSafePropertyAccess(&'ast NullSafePropertyAccess<'arena>),
478 PropertyAccess(&'ast PropertyAccess<'arena>),
479 StaticPropertyAccess(&'ast StaticPropertyAccess<'arena>),
480 Argument(&'ast Argument<'arena>),
481 ArgumentList(&'ast ArgumentList<'arena>),
482 PartialArgument(&'ast PartialArgument<'arena>),
483 PartialArgumentList(&'ast PartialArgumentList<'arena>),
484 NamedArgument(&'ast NamedArgument<'arena>),
485 NamedPlaceholderArgument(&'ast NamedPlaceholderArgument<'arena>),
486 PlaceholderArgument(&'ast PlaceholderArgument),
487 PositionalArgument(&'ast PositionalArgument<'arena>),
488 VariadicPlaceholderArgument(&'ast VariadicPlaceholderArgument),
489 Array(&'ast Array<'arena>),
490 ArrayAccess(&'ast ArrayAccess<'arena>),
491 ArrayAppend(&'ast ArrayAppend<'arena>),
492 ArrayElement(&'ast ArrayElement<'arena>),
493 KeyValueArrayElement(&'ast KeyValueArrayElement<'arena>),
494 LegacyArray(&'ast LegacyArray<'arena>),
495 List(&'ast List<'arena>),
496 MissingArrayElement(&'ast MissingArrayElement),
497 ValueArrayElement(&'ast ValueArrayElement<'arena>),
498 VariadicArrayElement(&'ast VariadicArrayElement<'arena>),
499 Attribute(&'ast Attribute<'arena>),
500 AttributeList(&'ast AttributeList<'arena>),
501 Block(&'ast Block<'arena>),
502 Call(&'ast Call<'arena>),
503 FunctionCall(&'ast FunctionCall<'arena>),
504 MethodCall(&'ast MethodCall<'arena>),
505 NullSafeMethodCall(&'ast NullSafeMethodCall<'arena>),
506 StaticMethodCall(&'ast StaticMethodCall<'arena>),
507 PartialApplication(&'ast PartialApplication<'arena>),
508 FunctionPartialApplication(&'ast FunctionPartialApplication<'arena>),
509 MethodPartialApplication(&'ast MethodPartialApplication<'arena>),
510 StaticMethodPartialApplication(&'ast StaticMethodPartialApplication<'arena>),
511 ClassLikeConstant(&'ast ClassLikeConstant<'arena>),
512 ClassLikeConstantItem(&'ast ClassLikeConstantItem<'arena>),
513 EnumCase(&'ast EnumCase<'arena>),
514 EnumCaseBackedItem(&'ast EnumCaseBackedItem<'arena>),
515 EnumCaseItem(&'ast EnumCaseItem<'arena>),
516 EnumCaseUnitItem(&'ast EnumCaseUnitItem<'arena>),
517 Extends(&'ast Extends<'arena>),
518 Implements(&'ast Implements<'arena>),
519 ClassLikeConstantSelector(&'ast ClassLikeConstantSelector<'arena>),
520 ClassLikeMember(&'ast ClassLikeMember<'arena>),
521 ClassLikeMemberExpressionSelector(&'ast ClassLikeMemberExpressionSelector<'arena>),
522 ClassLikeMemberSelector(&'ast ClassLikeMemberSelector<'arena>),
523 Method(&'ast Method<'arena>),
524 MethodAbstractBody(&'ast MethodAbstractBody<'arena>),
525 MethodBody(&'ast MethodBody<'arena>),
526 HookedProperty(&'ast HookedProperty<'arena>),
527 PlainProperty(&'ast PlainProperty<'arena>),
528 Property(&'ast Property<'arena>),
529 PropertyAbstractItem(&'ast PropertyAbstractItem<'arena>),
530 PropertyConcreteItem(&'ast PropertyConcreteItem<'arena>),
531 PropertyHook(&'ast PropertyHook<'arena>),
532 PropertyHookAbstractBody(&'ast PropertyHookAbstractBody),
533 PropertyHookBody(&'ast PropertyHookBody<'arena>),
534 PropertyHookConcreteBody(&'ast PropertyHookConcreteBody<'arena>),
535 PropertyHookConcreteExpressionBody(&'ast PropertyHookConcreteExpressionBody<'arena>),
536 PropertyHookList(&'ast PropertyHookList<'arena>),
537 PropertyItem(&'ast PropertyItem<'arena>),
538 TraitUse(&'ast TraitUse<'arena>),
539 TraitUseAbsoluteMethodReference(&'ast TraitUseAbsoluteMethodReference<'arena>),
540 TraitUseAbstractSpecification(&'ast TraitUseAbstractSpecification<'arena>),
541 TraitUseAdaptation(&'ast TraitUseAdaptation<'arena>),
542 TraitUseAliasAdaptation(&'ast TraitUseAliasAdaptation<'arena>),
543 TraitUseConcreteSpecification(&'ast TraitUseConcreteSpecification<'arena>),
544 TraitUseMethodReference(&'ast TraitUseMethodReference<'arena>),
545 TraitUsePrecedenceAdaptation(&'ast TraitUsePrecedenceAdaptation<'arena>),
546 TraitUseSpecification(&'ast TraitUseSpecification<'arena>),
547 AnonymousClass(&'ast AnonymousClass<'arena>),
548 Class(&'ast Class<'arena>),
549 Enum(&'ast Enum<'arena>),
550 EnumBackingTypeHint(&'ast EnumBackingTypeHint<'arena>),
551 Interface(&'ast Interface<'arena>),
552 Trait(&'ast Trait<'arena>),
553 Clone(&'ast Clone<'arena>),
554 Constant(&'ast Constant<'arena>),
555 ConstantItem(&'ast ConstantItem<'arena>),
556 Construct(&'ast Construct<'arena>),
557 DieConstruct(&'ast DieConstruct<'arena>),
558 EmptyConstruct(&'ast EmptyConstruct<'arena>),
559 EvalConstruct(&'ast EvalConstruct<'arena>),
560 ExitConstruct(&'ast ExitConstruct<'arena>),
561 IncludeConstruct(&'ast IncludeConstruct<'arena>),
562 IncludeOnceConstruct(&'ast IncludeOnceConstruct<'arena>),
563 IssetConstruct(&'ast IssetConstruct<'arena>),
564 PrintConstruct(&'ast PrintConstruct<'arena>),
565 RequireConstruct(&'ast RequireConstruct<'arena>),
566 RequireOnceConstruct(&'ast RequireOnceConstruct<'arena>),
567 If(&'ast If<'arena>),
568 IfBody(&'ast IfBody<'arena>),
569 IfColonDelimitedBody(&'ast IfColonDelimitedBody<'arena>),
570 IfColonDelimitedBodyElseClause(&'ast IfColonDelimitedBodyElseClause<'arena>),
571 IfColonDelimitedBodyElseIfClause(&'ast IfColonDelimitedBodyElseIfClause<'arena>),
572 IfStatementBody(&'ast IfStatementBody<'arena>),
573 IfStatementBodyElseClause(&'ast IfStatementBodyElseClause<'arena>),
574 IfStatementBodyElseIfClause(&'ast IfStatementBodyElseIfClause<'arena>),
575 Match(&'ast Match<'arena>),
576 MatchArm(&'ast MatchArm<'arena>),
577 MatchDefaultArm(&'ast MatchDefaultArm<'arena>),
578 MatchExpressionArm(&'ast MatchExpressionArm<'arena>),
579 Switch(&'ast Switch<'arena>),
580 SwitchBody(&'ast SwitchBody<'arena>),
581 SwitchBraceDelimitedBody(&'ast SwitchBraceDelimitedBody<'arena>),
582 SwitchCase(&'ast SwitchCase<'arena>),
583 SwitchCaseSeparator(&'ast SwitchCaseSeparator),
584 SwitchColonDelimitedBody(&'ast SwitchColonDelimitedBody<'arena>),
585 SwitchDefaultCase(&'ast SwitchDefaultCase<'arena>),
586 SwitchExpressionCase(&'ast SwitchExpressionCase<'arena>),
587 Declare(&'ast Declare<'arena>),
588 DeclareBody(&'ast DeclareBody<'arena>),
589 DeclareColonDelimitedBody(&'ast DeclareColonDelimitedBody<'arena>),
590 DeclareItem(&'ast DeclareItem<'arena>),
591 EchoTag(&'ast EchoTag<'arena>),
592 Echo(&'ast Echo<'arena>),
593 Expression(&'ast Expression<'arena>),
594 Binary(&'ast Binary<'arena>),
595 BinaryOperator(&'ast BinaryOperator<'arena>),
596 UnaryPrefix(&'ast UnaryPrefix<'arena>),
597 UnaryPrefixOperator(&'ast UnaryPrefixOperator<'arena>),
598 UnaryPostfix(&'ast UnaryPostfix<'arena>),
599 UnaryPostfixOperator(&'ast UnaryPostfixOperator),
600 Parenthesized(&'ast Parenthesized<'arena>),
601 ArrowFunction(&'ast ArrowFunction<'arena>),
602 Closure(&'ast Closure<'arena>),
603 ClosureUseClause(&'ast ClosureUseClause<'arena>),
604 ClosureUseClauseVariable(&'ast ClosureUseClauseVariable<'arena>),
605 Function(&'ast Function<'arena>),
606 FunctionLikeParameter(&'ast FunctionLikeParameter<'arena>),
607 FunctionLikeParameterDefaultValue(&'ast FunctionLikeParameterDefaultValue<'arena>),
608 FunctionLikeParameterList(&'ast FunctionLikeParameterList<'arena>),
609 FunctionLikeReturnTypeHint(&'ast FunctionLikeReturnTypeHint<'arena>),
610 Global(&'ast Global<'arena>),
611 Goto(&'ast Goto<'arena>),
612 Label(&'ast Label<'arena>),
613 HaltCompiler(&'ast HaltCompiler<'arena>),
614 FullyQualifiedIdentifier(&'ast FullyQualifiedIdentifier<'arena>),
615 Identifier(&'ast Identifier<'arena>),
616 LocalIdentifier(&'ast LocalIdentifier<'arena>),
617 QualifiedIdentifier(&'ast QualifiedIdentifier<'arena>),
618 Inline(&'ast Inline<'arena>),
619 Instantiation(&'ast Instantiation<'arena>),
620 Keyword(&'ast Keyword<'arena>),
621 Literal(&'ast Literal<'arena>),
622 LiteralFloat(&'ast LiteralFloat<'arena>),
623 LiteralInteger(&'ast LiteralInteger<'arena>),
624 LiteralString(&'ast LiteralString<'arena>),
625 MagicConstant(&'ast MagicConstant<'arena>),
626 Modifier(&'ast Modifier<'arena>),
627 Namespace(&'ast Namespace<'arena>),
628 NamespaceBody(&'ast NamespaceBody<'arena>),
629 NamespaceImplicitBody(&'ast NamespaceImplicitBody<'arena>),
630 Assignment(&'ast Assignment<'arena>),
631 AssignmentOperator(&'ast AssignmentOperator),
632 Conditional(&'ast Conditional<'arena>),
633 DoWhile(&'ast DoWhile<'arena>),
634 Foreach(&'ast Foreach<'arena>),
635 ForeachBody(&'ast ForeachBody<'arena>),
636 ForeachColonDelimitedBody(&'ast ForeachColonDelimitedBody<'arena>),
637 ForeachKeyValueTarget(&'ast ForeachKeyValueTarget<'arena>),
638 ForeachTarget(&'ast ForeachTarget<'arena>),
639 ForeachValueTarget(&'ast ForeachValueTarget<'arena>),
640 For(&'ast For<'arena>),
641 ForBody(&'ast ForBody<'arena>),
642 ForColonDelimitedBody(&'ast ForColonDelimitedBody<'arena>),
643 While(&'ast While<'arena>),
644 WhileBody(&'ast WhileBody<'arena>),
645 WhileColonDelimitedBody(&'ast WhileColonDelimitedBody<'arena>),
646 Break(&'ast Break<'arena>),
647 Continue(&'ast Continue<'arena>),
648 Return(&'ast Return<'arena>),
649 Static(&'ast Static<'arena>),
650 StaticAbstractItem(&'ast StaticAbstractItem<'arena>),
651 StaticConcreteItem(&'ast StaticConcreteItem<'arena>),
652 StaticItem(&'ast StaticItem<'arena>),
653 Try(&'ast Try<'arena>),
654 TryCatchClause(&'ast TryCatchClause<'arena>),
655 TryFinallyClause(&'ast TryFinallyClause<'arena>),
656 MaybeTypedUseItem(&'ast MaybeTypedUseItem<'arena>),
657 MixedUseItemList(&'ast MixedUseItemList<'arena>),
658 TypedUseItemList(&'ast TypedUseItemList<'arena>),
659 TypedUseItemSequence(&'ast TypedUseItemSequence<'arena>),
660 Use(&'ast Use<'arena>),
661 UseItem(&'ast UseItem<'arena>),
662 UseItemAlias(&'ast UseItemAlias<'arena>),
663 UseItemSequence(&'ast UseItemSequence<'arena>),
664 UseItems(&'ast UseItems<'arena>),
665 UseType(&'ast UseType<'arena>),
666 Yield(&'ast Yield<'arena>),
667 YieldFrom(&'ast YieldFrom<'arena>),
668 YieldPair(&'ast YieldPair<'arena>),
669 YieldValue(&'ast YieldValue<'arena>),
670 Statement(&'ast Statement<'arena>),
671 ExpressionStatement(&'ast ExpressionStatement<'arena>),
672 BracedExpressionStringPart(&'ast BracedExpressionStringPart<'arena>),
673 DocumentString(&'ast DocumentString<'arena>),
674 InterpolatedString(&'ast InterpolatedString<'arena>),
675 LiteralStringPart(&'ast LiteralStringPart<'arena>),
676 ShellExecuteString(&'ast ShellExecuteString<'arena>),
677 CompositeString(&'ast CompositeString<'arena>),
678 StringPart(&'ast StringPart<'arena>),
679 ClosingTag(&'ast ClosingTag),
680 FullOpeningTag(&'ast FullOpeningTag<'arena>),
681 OpeningTag(&'ast OpeningTag<'arena>),
682 ShortOpeningTag(&'ast ShortOpeningTag),
683 Terminator(&'ast Terminator<'arena>),
684 Throw(&'ast Throw<'arena>),
685 Hint(&'ast Hint<'arena>),
686 IntersectionHint(&'ast IntersectionHint<'arena>),
687 NullableHint(&'ast NullableHint<'arena>),
688 ParenthesizedHint(&'ast ParenthesizedHint<'arena>),
689 UnionHint(&'ast UnionHint<'arena>),
690 Unset(&'ast Unset<'arena>),
691 DirectVariable(&'ast DirectVariable<'arena>),
692 IndirectVariable(&'ast IndirectVariable<'arena>),
693 NestedVariable(&'ast NestedVariable<'arena>),
694 Variable(&'ast Variable<'arena>),
695 Pipe(&'ast Pipe<'arena>),
696 Error(Span),
697 MissingTerminator(Span),
698 ClassLikeMemberMissingSelector(Span),
699 ClassLikeConstantMissingSelector(Span),
700}
701
702impl<'ast, 'arena> Node<'ast, 'arena> {
703 #[inline]
704 pub fn filter_map<F, T>(&self, f: F) -> Vec<T>
705 where
706 F: Fn(&Node<'ast, 'arena>) -> Option<T>,
707 T: 'ast,
708 {
709 let mut result = vec![];
710 self.filter_map_internal(&f, &mut result);
711 result
712 }
713
714 #[inline]
715 fn filter_map_internal<F, T>(&self, f: &F, result: &mut Vec<T>)
716 where
717 F: Fn(&Node<'ast, 'arena>) -> Option<T>,
718 T: 'ast,
719 {
720 self.visit_children(|child| child.filter_map_internal(f, result));
721
722 if let Some(item) = f(self) {
723 result.push(item);
724 }
725 }
726
727 #[inline]
728 #[must_use]
729 pub const fn is_declaration(&self) -> bool {
730 matches!(
731 self,
732 Self::Class(_) | Self::Interface(_) | Self::Trait(_) | Self::Enum(_) | Self::Function(_) | Self::Method(_)
733 )
734 }
735
736 #[inline]
737 #[must_use]
738 pub const fn is_statement(&self) -> bool {
739 matches!(
740 self,
741 Self::Statement(_)
742 | Self::OpeningTag(_)
743 | Self::FullOpeningTag(_)
744 | Self::ShortOpeningTag(_)
745 | Self::ClosingTag(_)
746 | Self::Inline(_)
747 | Self::Namespace(_)
748 | Self::Use(_)
749 | Self::Class(_)
750 | Self::Interface(_)
751 | Self::Trait(_)
752 | Self::Enum(_)
753 | Self::Block(_)
754 | Self::Constant(_)
755 | Self::Function(_)
756 | Self::Declare(_)
757 | Self::Goto(_)
758 | Self::Label(_)
759 | Self::Try(_)
760 | Self::Foreach(_)
761 | Self::For(_)
762 | Self::While(_)
763 | Self::DoWhile(_)
764 | Self::Continue(_)
765 | Self::Break(_)
766 | Self::Switch(_)
767 | Self::If(_)
768 | Self::Return(_)
769 | Self::ExpressionStatement(_)
770 | Self::Echo(_)
771 | Self::EchoTag(_)
772 | Self::Global(_)
773 | Self::Static(_)
774 | Self::HaltCompiler(_)
775 | Self::Unset(_)
776 )
777 }
778
779 #[inline]
780 #[must_use]
781 pub const fn kind(&self) -> NodeKind {
782 match &self {
783 Self::Program(_) => NodeKind::Program,
784 Self::Access(_) => NodeKind::Access,
785 Self::ConstantAccess(_) => NodeKind::ConstantAccess,
786 Self::ClassConstantAccess(_) => NodeKind::ClassConstantAccess,
787 Self::NullSafePropertyAccess(_) => NodeKind::NullSafePropertyAccess,
788 Self::PropertyAccess(_) => NodeKind::PropertyAccess,
789 Self::StaticPropertyAccess(_) => NodeKind::StaticPropertyAccess,
790 Self::Argument(_) => NodeKind::Argument,
791 Self::ArgumentList(_) => NodeKind::ArgumentList,
792 Self::PartialArgument(_) => NodeKind::PartialArgument,
793 Self::PartialArgumentList(_) => NodeKind::PartialArgumentList,
794 Self::NamedArgument(_) => NodeKind::NamedArgument,
795 Self::NamedPlaceholderArgument(_) => NodeKind::NamedPlaceholderArgument,
796 Self::PlaceholderArgument(_) => NodeKind::PlaceholderArgument,
797 Self::PositionalArgument(_) => NodeKind::PositionalArgument,
798 Self::VariadicPlaceholderArgument(_) => NodeKind::VariadicPlaceholderArgument,
799 Self::Array(_) => NodeKind::Array,
800 Self::ArrayAccess(_) => NodeKind::ArrayAccess,
801 Self::ArrayAppend(_) => NodeKind::ArrayAppend,
802 Self::ArrayElement(_) => NodeKind::ArrayElement,
803 Self::KeyValueArrayElement(_) => NodeKind::KeyValueArrayElement,
804 Self::LegacyArray(_) => NodeKind::LegacyArray,
805 Self::List(_) => NodeKind::List,
806 Self::MissingArrayElement(_) => NodeKind::MissingArrayElement,
807 Self::ValueArrayElement(_) => NodeKind::ValueArrayElement,
808 Self::VariadicArrayElement(_) => NodeKind::VariadicArrayElement,
809 Self::Attribute(_) => NodeKind::Attribute,
810 Self::AttributeList(_) => NodeKind::AttributeList,
811 Self::Block(_) => NodeKind::Block,
812 Self::Call(_) => NodeKind::Call,
813 Self::FunctionCall(_) => NodeKind::FunctionCall,
814 Self::MethodCall(_) => NodeKind::MethodCall,
815 Self::NullSafeMethodCall(_) => NodeKind::NullSafeMethodCall,
816 Self::StaticMethodCall(_) => NodeKind::StaticMethodCall,
817 Self::PartialApplication(_) => NodeKind::PartialApplication,
818 Self::FunctionPartialApplication(_) => NodeKind::FunctionPartialApplication,
819 Self::MethodPartialApplication(_) => NodeKind::MethodPartialApplication,
820 Self::StaticMethodPartialApplication(_) => NodeKind::StaticMethodPartialApplication,
821 Self::ClassLikeConstant(_) => NodeKind::ClassLikeConstant,
822 Self::ClassLikeConstantItem(_) => NodeKind::ClassLikeConstantItem,
823 Self::EnumCase(_) => NodeKind::EnumCase,
824 Self::EnumCaseBackedItem(_) => NodeKind::EnumCaseBackedItem,
825 Self::EnumCaseItem(_) => NodeKind::EnumCaseItem,
826 Self::EnumCaseUnitItem(_) => NodeKind::EnumCaseUnitItem,
827 Self::Extends(_) => NodeKind::Extends,
828 Self::Implements(_) => NodeKind::Implements,
829 Self::ClassLikeConstantSelector(_) => NodeKind::ClassLikeConstantSelector,
830 Self::ClassLikeMember(_) => NodeKind::ClassLikeMember,
831 Self::ClassLikeMemberExpressionSelector(_) => NodeKind::ClassLikeMemberExpressionSelector,
832 Self::ClassLikeMemberSelector(_) => NodeKind::ClassLikeMemberSelector,
833 Self::Method(_) => NodeKind::Method,
834 Self::MethodAbstractBody(_) => NodeKind::MethodAbstractBody,
835 Self::MethodBody(_) => NodeKind::MethodBody,
836 Self::HookedProperty(_) => NodeKind::HookedProperty,
837 Self::PlainProperty(_) => NodeKind::PlainProperty,
838 Self::Property(_) => NodeKind::Property,
839 Self::PropertyAbstractItem(_) => NodeKind::PropertyAbstractItem,
840 Self::PropertyConcreteItem(_) => NodeKind::PropertyConcreteItem,
841 Self::PropertyHook(_) => NodeKind::PropertyHook,
842 Self::PropertyHookAbstractBody(_) => NodeKind::PropertyHookAbstractBody,
843 Self::PropertyHookBody(_) => NodeKind::PropertyHookBody,
844 Self::PropertyHookConcreteBody(_) => NodeKind::PropertyHookConcreteBody,
845 Self::PropertyHookConcreteExpressionBody(_) => NodeKind::PropertyHookConcreteExpressionBody,
846 Self::PropertyHookList(_) => NodeKind::PropertyHookList,
847 Self::PropertyItem(_) => NodeKind::PropertyItem,
848 Self::TraitUse(_) => NodeKind::TraitUse,
849 Self::TraitUseAbsoluteMethodReference(_) => NodeKind::TraitUseAbsoluteMethodReference,
850 Self::TraitUseAbstractSpecification(_) => NodeKind::TraitUseAbstractSpecification,
851 Self::TraitUseAdaptation(_) => NodeKind::TraitUseAdaptation,
852 Self::TraitUseAliasAdaptation(_) => NodeKind::TraitUseAliasAdaptation,
853 Self::TraitUseConcreteSpecification(_) => NodeKind::TraitUseConcreteSpecification,
854 Self::TraitUseMethodReference(_) => NodeKind::TraitUseMethodReference,
855 Self::TraitUsePrecedenceAdaptation(_) => NodeKind::TraitUsePrecedenceAdaptation,
856 Self::TraitUseSpecification(_) => NodeKind::TraitUseSpecification,
857 Self::AnonymousClass(_) => NodeKind::AnonymousClass,
858 Self::Class(_) => NodeKind::Class,
859 Self::Enum(_) => NodeKind::Enum,
860 Self::EnumBackingTypeHint(_) => NodeKind::EnumBackingTypeHint,
861 Self::Interface(_) => NodeKind::Interface,
862 Self::Trait(_) => NodeKind::Trait,
863 Self::Clone(_) => NodeKind::Clone,
864 Self::Constant(_) => NodeKind::Constant,
865 Self::ConstantItem(_) => NodeKind::ConstantItem,
866 Self::Construct(_) => NodeKind::Construct,
867 Self::DieConstruct(_) => NodeKind::DieConstruct,
868 Self::EmptyConstruct(_) => NodeKind::EmptyConstruct,
869 Self::EvalConstruct(_) => NodeKind::EvalConstruct,
870 Self::ExitConstruct(_) => NodeKind::ExitConstruct,
871 Self::IncludeConstruct(_) => NodeKind::IncludeConstruct,
872 Self::IncludeOnceConstruct(_) => NodeKind::IncludeOnceConstruct,
873 Self::IssetConstruct(_) => NodeKind::IssetConstruct,
874 Self::PrintConstruct(_) => NodeKind::PrintConstruct,
875 Self::RequireConstruct(_) => NodeKind::RequireConstruct,
876 Self::RequireOnceConstruct(_) => NodeKind::RequireOnceConstruct,
877 Self::If(_) => NodeKind::If,
878 Self::IfBody(_) => NodeKind::IfBody,
879 Self::IfColonDelimitedBody(_) => NodeKind::IfColonDelimitedBody,
880 Self::IfColonDelimitedBodyElseClause(_) => NodeKind::IfColonDelimitedBodyElseClause,
881 Self::IfColonDelimitedBodyElseIfClause(_) => NodeKind::IfColonDelimitedBodyElseIfClause,
882 Self::IfStatementBody(_) => NodeKind::IfStatementBody,
883 Self::IfStatementBodyElseClause(_) => NodeKind::IfStatementBodyElseClause,
884 Self::IfStatementBodyElseIfClause(_) => NodeKind::IfStatementBodyElseIfClause,
885 Self::Match(_) => NodeKind::Match,
886 Self::MatchArm(_) => NodeKind::MatchArm,
887 Self::MatchDefaultArm(_) => NodeKind::MatchDefaultArm,
888 Self::MatchExpressionArm(_) => NodeKind::MatchExpressionArm,
889 Self::Switch(_) => NodeKind::Switch,
890 Self::SwitchBody(_) => NodeKind::SwitchBody,
891 Self::SwitchBraceDelimitedBody(_) => NodeKind::SwitchBraceDelimitedBody,
892 Self::SwitchCase(_) => NodeKind::SwitchCase,
893 Self::SwitchCaseSeparator(_) => NodeKind::SwitchCaseSeparator,
894 Self::SwitchColonDelimitedBody(_) => NodeKind::SwitchColonDelimitedBody,
895 Self::SwitchDefaultCase(_) => NodeKind::SwitchDefaultCase,
896 Self::SwitchExpressionCase(_) => NodeKind::SwitchExpressionCase,
897 Self::Declare(_) => NodeKind::Declare,
898 Self::DeclareBody(_) => NodeKind::DeclareBody,
899 Self::DeclareColonDelimitedBody(_) => NodeKind::DeclareColonDelimitedBody,
900 Self::DeclareItem(_) => NodeKind::DeclareItem,
901 Self::Echo(_) => NodeKind::Echo,
902 Self::Expression(_) => NodeKind::Expression,
903 Self::Binary(_) => NodeKind::Binary,
904 Self::BinaryOperator(_) => NodeKind::BinaryOperator,
905 Self::UnaryPrefix(_) => NodeKind::UnaryPrefix,
906 Self::UnaryPrefixOperator(_) => NodeKind::UnaryPrefixOperator,
907 Self::UnaryPostfix(_) => NodeKind::UnaryPostfix,
908 Self::UnaryPostfixOperator(_) => NodeKind::UnaryPostfixOperator,
909 Self::Parenthesized(_) => NodeKind::Parenthesized,
910 Self::ArrowFunction(_) => NodeKind::ArrowFunction,
911 Self::Closure(_) => NodeKind::Closure,
912 Self::ClosureUseClause(_) => NodeKind::ClosureUseClause,
913 Self::ClosureUseClauseVariable(_) => NodeKind::ClosureUseClauseVariable,
914 Self::Function(_) => NodeKind::Function,
915 Self::FunctionLikeParameter(_) => NodeKind::FunctionLikeParameter,
916 Self::FunctionLikeParameterDefaultValue(_) => NodeKind::FunctionLikeParameterDefaultValue,
917 Self::FunctionLikeParameterList(_) => NodeKind::FunctionLikeParameterList,
918 Self::FunctionLikeReturnTypeHint(_) => NodeKind::FunctionLikeReturnTypeHint,
919 Self::Global(_) => NodeKind::Global,
920 Self::Goto(_) => NodeKind::Goto,
921 Self::Label(_) => NodeKind::Label,
922 Self::HaltCompiler(_) => NodeKind::HaltCompiler,
923 Self::FullyQualifiedIdentifier(_) => NodeKind::FullyQualifiedIdentifier,
924 Self::Identifier(_) => NodeKind::Identifier,
925 Self::LocalIdentifier(_) => NodeKind::LocalIdentifier,
926 Self::QualifiedIdentifier(_) => NodeKind::QualifiedIdentifier,
927 Self::Inline(_) => NodeKind::Inline,
928 Self::Instantiation(_) => NodeKind::Instantiation,
929 Self::Keyword(_) => NodeKind::Keyword,
930 Self::Literal(_) => NodeKind::Literal,
931 Self::LiteralFloat(_) => NodeKind::LiteralFloat,
932 Self::LiteralInteger(_) => NodeKind::LiteralInteger,
933 Self::LiteralString(_) => NodeKind::LiteralString,
934 Self::MagicConstant(_) => NodeKind::MagicConstant,
935 Self::Modifier(_) => NodeKind::Modifier,
936 Self::Namespace(_) => NodeKind::Namespace,
937 Self::NamespaceBody(_) => NodeKind::NamespaceBody,
938 Self::NamespaceImplicitBody(_) => NodeKind::NamespaceImplicitBody,
939 Self::Assignment(_) => NodeKind::Assignment,
940 Self::AssignmentOperator(_) => NodeKind::AssignmentOperator,
941 Self::Conditional(_) => NodeKind::Conditional,
942 Self::DoWhile(_) => NodeKind::DoWhile,
943 Self::Foreach(_) => NodeKind::Foreach,
944 Self::ForeachBody(_) => NodeKind::ForeachBody,
945 Self::ForeachColonDelimitedBody(_) => NodeKind::ForeachColonDelimitedBody,
946 Self::ForeachKeyValueTarget(_) => NodeKind::ForeachKeyValueTarget,
947 Self::ForeachTarget(_) => NodeKind::ForeachTarget,
948 Self::ForeachValueTarget(_) => NodeKind::ForeachValueTarget,
949 Self::For(_) => NodeKind::For,
950 Self::ForBody(_) => NodeKind::ForBody,
951 Self::ForColonDelimitedBody(_) => NodeKind::ForColonDelimitedBody,
952 Self::While(_) => NodeKind::While,
953 Self::WhileBody(_) => NodeKind::WhileBody,
954 Self::WhileColonDelimitedBody(_) => NodeKind::WhileColonDelimitedBody,
955 Self::Break(_) => NodeKind::Break,
956 Self::Continue(_) => NodeKind::Continue,
957 Self::Return(_) => NodeKind::Return,
958 Self::Static(_) => NodeKind::Static,
959 Self::StaticAbstractItem(_) => NodeKind::StaticAbstractItem,
960 Self::StaticConcreteItem(_) => NodeKind::StaticConcreteItem,
961 Self::StaticItem(_) => NodeKind::StaticItem,
962 Self::Try(_) => NodeKind::Try,
963 Self::TryCatchClause(_) => NodeKind::TryCatchClause,
964 Self::TryFinallyClause(_) => NodeKind::TryFinallyClause,
965 Self::MaybeTypedUseItem(_) => NodeKind::MaybeTypedUseItem,
966 Self::MixedUseItemList(_) => NodeKind::MixedUseItemList,
967 Self::TypedUseItemList(_) => NodeKind::TypedUseItemList,
968 Self::TypedUseItemSequence(_) => NodeKind::TypedUseItemSequence,
969 Self::Use(_) => NodeKind::Use,
970 Self::UseItem(_) => NodeKind::UseItem,
971 Self::UseItemAlias(_) => NodeKind::UseItemAlias,
972 Self::UseItemSequence(_) => NodeKind::UseItemSequence,
973 Self::UseItems(_) => NodeKind::UseItems,
974 Self::UseType(_) => NodeKind::UseType,
975 Self::Yield(_) => NodeKind::Yield,
976 Self::YieldFrom(_) => NodeKind::YieldFrom,
977 Self::YieldPair(_) => NodeKind::YieldPair,
978 Self::YieldValue(_) => NodeKind::YieldValue,
979 Self::Statement(_) => NodeKind::Statement,
980 Self::ExpressionStatement(_) => NodeKind::ExpressionStatement,
981 Self::BracedExpressionStringPart(_) => NodeKind::BracedExpressionStringPart,
982 Self::DocumentString(_) => NodeKind::DocumentString,
983 Self::InterpolatedString(_) => NodeKind::InterpolatedString,
984 Self::LiteralStringPart(_) => NodeKind::LiteralStringPart,
985 Self::ShellExecuteString(_) => NodeKind::ShellExecuteString,
986 Self::CompositeString(_) => NodeKind::CompositeString,
987 Self::StringPart(_) => NodeKind::StringPart,
988 Self::ClosingTag(_) => NodeKind::ClosingTag,
989 Self::EchoTag(_) => NodeKind::EchoTag,
990 Self::FullOpeningTag(_) => NodeKind::FullOpeningTag,
991 Self::OpeningTag(_) => NodeKind::OpeningTag,
992 Self::ShortOpeningTag(_) => NodeKind::ShortOpeningTag,
993 Self::Terminator(_) => NodeKind::Terminator,
994 Self::Throw(_) => NodeKind::Throw,
995 Self::Hint(_) => NodeKind::Hint,
996 Self::IntersectionHint(_) => NodeKind::IntersectionHint,
997 Self::NullableHint(_) => NodeKind::NullableHint,
998 Self::ParenthesizedHint(_) => NodeKind::ParenthesizedHint,
999 Self::UnionHint(_) => NodeKind::UnionHint,
1000 Self::Unset(_) => NodeKind::Unset,
1001 Self::DirectVariable(_) => NodeKind::DirectVariable,
1002 Self::IndirectVariable(_) => NodeKind::IndirectVariable,
1003 Self::NestedVariable(_) => NodeKind::NestedVariable,
1004 Self::Variable(_) => NodeKind::Variable,
1005 Self::Pipe(_) => NodeKind::Pipe,
1006 Self::Error(_) => NodeKind::Error,
1007 Self::MissingTerminator(_) => NodeKind::MissingTerminator,
1008 Self::ClassLikeMemberMissingSelector(_) => NodeKind::ClassLikeMemberMissingSelector,
1009 Self::ClassLikeConstantMissingSelector(_) => NodeKind::ClassLikeConstantMissingSelector,
1010 }
1011 }
1012
1013 pub fn visit_children<F>(&self, mut f: F)
1014 where
1015 F: FnMut(Node<'ast, 'arena>),
1016 {
1017 match &self {
1018 Node::Program(node) => {
1019 for node in node.statements.as_slice() {
1020 f(Node::Statement(node));
1021 }
1022 }
1023 Node::Access(node) => match &node {
1024 Access::Property(node) => f(Node::PropertyAccess(node)),
1025 Access::NullSafeProperty(node) => f(Node::NullSafePropertyAccess(node)),
1026 Access::StaticProperty(node) => f(Node::StaticPropertyAccess(node)),
1027 Access::ClassConstant(node) => f(Node::ClassConstantAccess(node)),
1028 },
1029 Node::ConstantAccess(node) => {
1030 f(Node::Identifier(&node.name));
1031 }
1032 Node::ClassConstantAccess(node) => {
1033 f(Node::Expression(node.class));
1034 f(Node::ClassLikeConstantSelector(&node.constant));
1035 }
1036 Node::NullSafePropertyAccess(node) => {
1037 f(Node::Expression(node.object));
1038 f(Node::ClassLikeMemberSelector(&node.property));
1039 }
1040 Node::PropertyAccess(node) => {
1041 f(Node::Expression(node.object));
1042 f(Node::ClassLikeMemberSelector(&node.property));
1043 }
1044 Node::StaticPropertyAccess(node) => {
1045 f(Node::Expression(node.class));
1046 f(Node::Variable(&node.property));
1047 }
1048 Node::Argument(node) => match &node {
1049 Argument::Named(node) => f(Node::NamedArgument(node)),
1050 Argument::Positional(node) => f(Node::PositionalArgument(node)),
1051 },
1052 Node::ArgumentList(node) => {
1053 for node in node.arguments.as_slice() {
1054 f(Node::Argument(node));
1055 }
1056 }
1057 Node::PartialArgument(node) => match &node {
1058 PartialArgument::Named(node) => f(Node::NamedArgument(node)),
1059 PartialArgument::NamedPlaceholder(node) => f(Node::NamedPlaceholderArgument(node)),
1060 PartialArgument::Placeholder(node) => f(Node::PlaceholderArgument(node)),
1061 PartialArgument::Positional(node) => f(Node::PositionalArgument(node)),
1062 PartialArgument::VariadicPlaceholder(node) => f(Node::VariadicPlaceholderArgument(node)),
1063 },
1064 Node::PartialArgumentList(node) => {
1065 for node in node.arguments.as_slice() {
1066 f(Node::PartialArgument(node));
1067 }
1068 }
1069 Node::NamedArgument(node) => {
1070 f(Node::LocalIdentifier(&node.name));
1071 f(Node::Expression(node.value));
1072 }
1073 Node::NamedPlaceholderArgument(node) => {
1074 f(Node::LocalIdentifier(&node.name));
1075 }
1076 Node::PlaceholderArgument(_) => {}
1077 Node::PositionalArgument(node) => f(Node::Expression(node.value)),
1078 Node::VariadicPlaceholderArgument(_) => {}
1079 Node::Array(node) => {
1080 for node in node.elements.as_slice() {
1081 f(Node::ArrayElement(node));
1082 }
1083 }
1084 Node::ArrayAccess(node) => {
1085 f(Node::Expression(node.array));
1086 f(Node::Expression(node.index));
1087 }
1088 Node::ArrayAppend(node) => {
1089 f(Node::Expression(node.array));
1090 }
1091 Node::ArrayElement(node) => match &node {
1092 ArrayElement::KeyValue(node) => f(Node::KeyValueArrayElement(node)),
1093 ArrayElement::Missing(node) => f(Node::MissingArrayElement(node)),
1094 ArrayElement::Value(node) => f(Node::ValueArrayElement(node)),
1095 ArrayElement::Variadic(node) => f(Node::VariadicArrayElement(node)),
1096 },
1097 Node::KeyValueArrayElement(node) => {
1098 f(Node::Expression(node.key));
1099 f(Node::Expression(node.value));
1100 }
1101 Node::LegacyArray(node) => {
1102 for item in node.elements.iter() {
1103 f(Node::ArrayElement(item));
1104 }
1105 }
1106 Node::List(node) => {
1107 for item in node.elements.iter() {
1108 f(Node::ArrayElement(item));
1109 }
1110 }
1111 Node::MissingArrayElement(_) => {}
1112 Node::ValueArrayElement(node) => f(Node::Expression(node.value)),
1113 Node::VariadicArrayElement(node) => f(Node::Expression(node.value)),
1114 Node::Attribute(node) => {
1115 f(Node::Identifier(&node.name));
1116 if let Some(arguments) = &node.argument_list {
1117 f(Node::PartialArgumentList(arguments));
1118 }
1119 }
1120 Node::AttributeList(node) => {
1121 for item in node.attributes.iter() {
1122 f(Node::Attribute(item));
1123 }
1124 }
1125 Node::Block(node) => {
1126 for item in node.statements.iter() {
1127 f(Node::Statement(item));
1128 }
1129 }
1130 Node::Call(node) => match node {
1131 Call::Function(node) => f(Node::FunctionCall(node)),
1132 Call::Method(node) => f(Node::MethodCall(node)),
1133 Call::NullSafeMethod(node) => f(Node::NullSafeMethodCall(node)),
1134 Call::StaticMethod(node) => f(Node::StaticMethodCall(node)),
1135 },
1136 Node::FunctionCall(node) => {
1137 f(Node::Expression(node.function));
1138 f(Node::ArgumentList(&node.argument_list));
1139 }
1140 Node::MethodCall(node) => {
1141 f(Node::Expression(node.object));
1142 f(Node::ClassLikeMemberSelector(&node.method));
1143 f(Node::ArgumentList(&node.argument_list));
1144 }
1145 Node::NullSafeMethodCall(node) => {
1146 f(Node::Expression(node.object));
1147 f(Node::ClassLikeMemberSelector(&node.method));
1148 f(Node::ArgumentList(&node.argument_list));
1149 }
1150 Node::StaticMethodCall(node) => {
1151 f(Node::Expression(node.class));
1152 f(Node::ClassLikeMemberSelector(&node.method));
1153 f(Node::ArgumentList(&node.argument_list));
1154 }
1155 Node::PartialApplication(node) => match node {
1156 PartialApplication::Function(node) => f(Node::FunctionPartialApplication(node)),
1157 PartialApplication::Method(node) => f(Node::MethodPartialApplication(node)),
1158 PartialApplication::StaticMethod(node) => f(Node::StaticMethodPartialApplication(node)),
1159 },
1160 Node::FunctionPartialApplication(node) => {
1161 f(Node::Expression(node.function));
1162 f(Node::PartialArgumentList(&node.argument_list));
1163 }
1164 Node::MethodPartialApplication(node) => {
1165 f(Node::Expression(node.object));
1166 f(Node::ClassLikeMemberSelector(&node.method));
1167 f(Node::PartialArgumentList(&node.argument_list));
1168 }
1169 Node::StaticMethodPartialApplication(node) => {
1170 f(Node::Expression(node.class));
1171 f(Node::ClassLikeMemberSelector(&node.method));
1172 f(Node::PartialArgumentList(&node.argument_list));
1173 }
1174 Node::ClassLikeConstant(node) => {
1175 for attr in &node.attribute_lists {
1176 f(Node::AttributeList(attr));
1177 }
1178
1179 for item in node.modifiers.iter() {
1180 f(Node::Modifier(item));
1181 }
1182 f(Node::Keyword(&node.r#const));
1183 if let Some(hint) = &node.hint {
1184 f(Node::Hint(hint));
1185 }
1186
1187 for item in node.items.iter() {
1188 f(Node::ClassLikeConstantItem(item));
1189 }
1190 f(Node::Terminator(&node.terminator));
1191 }
1192 Node::ClassLikeConstantItem(node) => {
1193 f(Node::LocalIdentifier(&node.name));
1194 f(Node::Expression(node.value));
1195 }
1196 Node::EnumCase(node) => {
1197 for attr in &node.attribute_lists {
1198 f(Node::AttributeList(attr));
1199 }
1200
1201 f(Node::Keyword(&node.case));
1202 f(Node::EnumCaseItem(&node.item));
1203 f(Node::Terminator(&node.terminator));
1204 }
1205 Node::EnumCaseBackedItem(node) => {
1206 f(Node::LocalIdentifier(&node.name));
1207 f(Node::Expression(node.value));
1208 }
1209 Node::EnumCaseItem(node) => match &node {
1210 EnumCaseItem::Backed(node) => f(Node::EnumCaseBackedItem(node)),
1211 EnumCaseItem::Unit(node) => f(Node::EnumCaseUnitItem(node)),
1212 },
1213 Node::EnumCaseUnitItem(node) => f(Node::LocalIdentifier(&node.name)),
1214 Node::Extends(node) => {
1215 f(Node::Keyword(&node.extends));
1216 for item in node.types.iter() {
1217 f(Node::Identifier(item));
1218 }
1219 }
1220 Node::Implements(node) => {
1221 f(Node::Keyword(&node.implements));
1222 for item in node.types.iter() {
1223 f(Node::Identifier(item));
1224 }
1225 }
1226 Node::ClassLikeConstantSelector(node) => match node {
1227 ClassLikeConstantSelector::Identifier(node) => f(Node::LocalIdentifier(node)),
1228 ClassLikeConstantSelector::Expression(node) => {
1229 f(Node::ClassLikeMemberExpressionSelector(node));
1230 }
1231 ClassLikeConstantSelector::Missing(span) => f(Node::ClassLikeConstantMissingSelector(*span)),
1232 },
1233 Node::ClassLikeMember(node) => match node {
1234 ClassLikeMember::TraitUse(node) => f(Node::TraitUse(node)),
1235 ClassLikeMember::Constant(node) => f(Node::ClassLikeConstant(node)),
1236 ClassLikeMember::Property(node) => f(Node::Property(node)),
1237 ClassLikeMember::EnumCase(node) => f(Node::EnumCase(node)),
1238 ClassLikeMember::Method(node) => f(Node::Method(node)),
1239 },
1240 Node::ClassLikeMemberExpressionSelector(node) => f(Node::Expression(node.expression)),
1241 Node::ClassLikeMemberSelector(node) => match node {
1242 ClassLikeMemberSelector::Identifier(node) => f(Node::LocalIdentifier(node)),
1243 ClassLikeMemberSelector::Variable(node) => f(Node::Variable(node)),
1244 ClassLikeMemberSelector::Expression(node) => {
1245 f(Node::ClassLikeMemberExpressionSelector(node));
1246 }
1247 ClassLikeMemberSelector::Missing(span) => f(Node::ClassLikeMemberMissingSelector(*span)),
1248 },
1249 Node::Method(node) => {
1250 for item in node.attribute_lists.iter() {
1251 f(Node::AttributeList(item));
1252 }
1253 for item in node.modifiers.iter() {
1254 f(Node::Modifier(item));
1255 }
1256 f(Node::Keyword(&node.function));
1257 f(Node::LocalIdentifier(&node.name));
1258 f(Node::FunctionLikeParameterList(&node.parameter_list));
1259 for item in node.return_type_hint.iter() {
1260 f(Node::FunctionLikeReturnTypeHint(item));
1261 }
1262 f(Node::MethodBody(&node.body));
1263 }
1264 Node::MethodAbstractBody(node) => {
1265 f(Node::Terminator(&node.terminator));
1266 }
1267 Node::MethodBody(node) => match node {
1268 MethodBody::Abstract(node) => f(Node::MethodAbstractBody(node)),
1269 MethodBody::Concrete(node) => f(Node::Block(node)),
1270 },
1271 Node::HookedProperty(node) => {
1272 for item in node.attribute_lists.iter() {
1273 f(Node::AttributeList(item));
1274 }
1275 for item in node.var.iter() {
1276 f(Node::Keyword(item));
1277 }
1278 for item in node.modifiers.iter() {
1279 f(Node::Modifier(item));
1280 }
1281 for item in node.hint.iter() {
1282 f(Node::Hint(item));
1283 }
1284 f(Node::PropertyItem(&node.item));
1285 f(Node::PropertyHookList(&node.hook_list));
1286 }
1287 Node::PlainProperty(node) => {
1288 for item in node.attribute_lists.iter() {
1289 f(Node::AttributeList(item));
1290 }
1291 for item in node.var.iter() {
1292 f(Node::Keyword(item));
1293 }
1294 for item in node.modifiers.iter() {
1295 f(Node::Modifier(item));
1296 }
1297 for item in node.hint.iter() {
1298 f(Node::Hint(item));
1299 }
1300 for item in node.items.iter() {
1301 f(Node::PropertyItem(item));
1302 }
1303 }
1304 Node::Property(node) => match node {
1305 Property::Plain(node) => f(Node::PlainProperty(node)),
1306 Property::Hooked(node) => f(Node::HookedProperty(node)),
1307 },
1308 Node::PropertyAbstractItem(node) => {
1309 f(Node::DirectVariable(&node.variable));
1310 }
1311 Node::PropertyConcreteItem(node) => {
1312 f(Node::DirectVariable(&node.variable));
1313 f(Node::Expression(node.value));
1314 }
1315 Node::PropertyHook(node) => {
1316 for item in node.attribute_lists.iter() {
1317 f(Node::AttributeList(item));
1318 }
1319 for item in node.modifiers.iter() {
1320 f(Node::Modifier(item));
1321 }
1322 f(Node::LocalIdentifier(&node.name));
1323 for item in node.parameter_list.iter() {
1324 f(Node::FunctionLikeParameterList(item));
1325 }
1326 f(Node::PropertyHookBody(&node.body));
1327 }
1328 Node::PropertyHookAbstractBody(_) => {}
1329 Node::PropertyHookBody(node) => f(match node {
1330 PropertyHookBody::Abstract(node) => Node::PropertyHookAbstractBody(node),
1331 PropertyHookBody::Concrete(node) => Node::PropertyHookConcreteBody(node),
1332 }),
1333 Node::PropertyHookConcreteBody(node) => f(match node {
1334 PropertyHookConcreteBody::Expression(node) => Node::PropertyHookConcreteExpressionBody(node),
1335 PropertyHookConcreteBody::Block(node) => Node::Block(node),
1336 }),
1337 Node::PropertyHookConcreteExpressionBody(node) => f(Node::Expression(node.expression)),
1338 Node::PropertyHookList(node) => {
1339 for item in node.hooks.iter() {
1340 f(Node::PropertyHook(item));
1341 }
1342 }
1343 Node::PropertyItem(node) => match node {
1344 PropertyItem::Abstract(node) => f(Node::PropertyAbstractItem(node)),
1345 PropertyItem::Concrete(node) => f(Node::PropertyConcreteItem(node)),
1346 },
1347 Node::TraitUse(node) => {
1348 f(Node::Keyword(&node.r#use));
1349 for item in node.trait_names.iter() {
1350 f(Node::Identifier(item));
1351 }
1352 f(Node::TraitUseSpecification(&node.specification));
1353 }
1354 Node::TraitUseAbsoluteMethodReference(node) => {
1355 f(Node::Identifier(&node.trait_name));
1356 f(Node::LocalIdentifier(&node.method_name));
1357 }
1358 Node::TraitUseAbstractSpecification(node) => f(Node::Terminator(&node.0)),
1359 Node::TraitUseAdaptation(node) => match node {
1360 TraitUseAdaptation::Precedence(adaptation) => {
1361 f(Node::TraitUseAbsoluteMethodReference(&adaptation.method_reference));
1362 f(Node::Keyword(&adaptation.insteadof));
1363
1364 for item in adaptation.trait_names.iter() {
1365 f(Node::Identifier(item));
1366 }
1367 f(Node::Terminator(&adaptation.terminator));
1368 }
1369 TraitUseAdaptation::Alias(adaptation) => {
1370 f(Node::TraitUseMethodReference(&adaptation.method_reference));
1371 f(Node::Keyword(&adaptation.r#as));
1372
1373 if let Some(visibility) = &adaptation.modifier {
1374 f(Node::Modifier(visibility));
1375 }
1376
1377 if let Some(alias) = &adaptation.alias {
1378 f(Node::LocalIdentifier(alias));
1379 }
1380
1381 f(Node::Terminator(&adaptation.terminator));
1382 }
1383 },
1384 Node::TraitUseAliasAdaptation(node) => {
1385 f(Node::TraitUseMethodReference(&node.method_reference));
1386 f(Node::Keyword(&node.r#as));
1387
1388 if let Some(visibility) = &node.modifier {
1389 f(Node::Modifier(visibility));
1390 }
1391
1392 if let Some(alias) = &node.alias {
1393 f(Node::LocalIdentifier(alias));
1394 }
1395
1396 f(Node::Terminator(&node.terminator));
1397 }
1398 Node::TraitUseConcreteSpecification(node) => {
1399 for adaptation in node.adaptations.as_slice() {
1400 f(Node::TraitUseAdaptation(adaptation));
1401 }
1402 }
1403 Node::TraitUseMethodReference(node) => match node {
1404 TraitUseMethodReference::Identifier(identifier) => {
1405 f(Node::LocalIdentifier(identifier));
1406 }
1407 TraitUseMethodReference::Absolute(reference) => {
1408 f(Node::TraitUseAbsoluteMethodReference(reference));
1409 }
1410 },
1411 Node::TraitUsePrecedenceAdaptation(node) => {
1412 f(Node::TraitUseAbsoluteMethodReference(&node.method_reference));
1413 f(Node::Keyword(&node.insteadof));
1414
1415 for item in node.trait_names.iter() {
1416 f(Node::Identifier(item));
1417 }
1418 f(Node::Terminator(&node.terminator));
1419 }
1420 Node::TraitUseSpecification(node) => match node {
1421 TraitUseSpecification::Abstract(specification) => {
1422 f(Node::TraitUseAbstractSpecification(specification));
1423 }
1424 TraitUseSpecification::Concrete(specification) => {
1425 f(Node::TraitUseConcreteSpecification(specification));
1426 }
1427 },
1428 Node::AnonymousClass(node) => {
1429 f(Node::Keyword(&node.new));
1430 for item in node.attribute_lists.iter() {
1431 f(Node::AttributeList(item));
1432 }
1433 for item in node.modifiers.iter() {
1434 f(Node::Modifier(item));
1435 }
1436 f(Node::Keyword(&node.class));
1437 if let Some(argument_list) = &node.argument_list {
1438 f(Node::PartialArgumentList(argument_list));
1439 }
1440 for item in node.extends.iter() {
1441 f(Node::Extends(item));
1442 }
1443 for item in node.implements.iter() {
1444 f(Node::Implements(item));
1445 }
1446 for item in node.members.iter() {
1447 f(Node::ClassLikeMember(item));
1448 }
1449 }
1450 Node::Class(node) => {
1451 for item in node.attribute_lists.iter() {
1452 f(Node::AttributeList(item));
1453 }
1454 for item in node.modifiers.iter() {
1455 f(Node::Modifier(item));
1456 }
1457 f(Node::Keyword(&node.class));
1458 f(Node::LocalIdentifier(&node.name));
1459 for item in node.extends.iter() {
1460 f(Node::Extends(item));
1461 }
1462 for item in node.implements.iter() {
1463 f(Node::Implements(item));
1464 }
1465 for item in node.members.iter() {
1466 f(Node::ClassLikeMember(item));
1467 }
1468 }
1469 Node::Enum(node) => {
1470 for item in node.attribute_lists.iter() {
1471 f(Node::AttributeList(item));
1472 }
1473 f(Node::Keyword(&node.r#enum));
1474 f(Node::LocalIdentifier(&node.name));
1475 for item in node.backing_type_hint.iter() {
1476 f(Node::EnumBackingTypeHint(item));
1477 }
1478 for item in node.implements.iter() {
1479 f(Node::Implements(item));
1480 }
1481 for item in node.members.iter() {
1482 f(Node::ClassLikeMember(item));
1483 }
1484 }
1485 Node::EnumBackingTypeHint(node) => {
1486 f(Node::Hint(&node.hint));
1487 }
1488 Node::Interface(node) => {
1489 for item in node.attribute_lists.iter() {
1490 f(Node::AttributeList(item));
1491 }
1492 f(Node::Keyword(&node.interface));
1493 f(Node::LocalIdentifier(&node.name));
1494 for item in node.extends.iter() {
1495 f(Node::Extends(item));
1496 }
1497 for item in node.members.iter() {
1498 f(Node::ClassLikeMember(item));
1499 }
1500 }
1501 Node::Trait(node) => {
1502 for item in node.attribute_lists.iter() {
1503 f(Node::AttributeList(item));
1504 }
1505 f(Node::Keyword(&node.r#trait));
1506 f(Node::LocalIdentifier(&node.name));
1507 for item in node.members.iter() {
1508 f(Node::ClassLikeMember(item));
1509 }
1510 }
1511 Node::Clone(node) => {
1512 f(Node::Keyword(&node.clone));
1513 f(Node::Expression(node.object));
1514 }
1515 Node::Constant(node) => {
1516 for item in node.attribute_lists.iter() {
1517 f(Node::AttributeList(item));
1518 }
1519 f(Node::Keyword(&node.r#const));
1520 for item in node.items.iter() {
1521 f(Node::ConstantItem(item));
1522 }
1523 f(Node::Terminator(&node.terminator));
1524 }
1525 Node::ConstantItem(node) => {
1526 f(Node::LocalIdentifier(&node.name));
1527 f(Node::Expression(node.value));
1528 }
1529 Node::Construct(node) => f(match node {
1530 Construct::Isset(node) => Node::IssetConstruct(node),
1531 Construct::Empty(node) => Node::EmptyConstruct(node),
1532 Construct::Eval(node) => Node::EvalConstruct(node),
1533 Construct::Include(node) => Node::IncludeConstruct(node),
1534 Construct::IncludeOnce(node) => Node::IncludeOnceConstruct(node),
1535 Construct::Require(node) => Node::RequireConstruct(node),
1536 Construct::RequireOnce(node) => Node::RequireOnceConstruct(node),
1537 Construct::Print(node) => Node::PrintConstruct(node),
1538 Construct::Exit(node) => Node::ExitConstruct(node),
1539 Construct::Die(node) => Node::DieConstruct(node),
1540 }),
1541 Node::IssetConstruct(node) => {
1542 f(Node::Keyword(&node.isset));
1543 for e in node.values.iter() {
1544 f(Node::Expression(e));
1545 }
1546 }
1547 Node::EmptyConstruct(node) => {
1548 f(Node::Keyword(&node.empty));
1549 f(Node::Expression(node.value));
1550 }
1551 Node::EvalConstruct(node) => {
1552 f(Node::Keyword(&node.eval));
1553 f(Node::Expression(node.value));
1554 }
1555 Node::IncludeConstruct(node) => {
1556 f(Node::Keyword(&node.include));
1557 f(Node::Expression(node.value));
1558 }
1559 Node::IncludeOnceConstruct(node) => {
1560 f(Node::Keyword(&node.include_once));
1561 f(Node::Expression(node.value));
1562 }
1563 Node::RequireConstruct(node) => {
1564 f(Node::Keyword(&node.require));
1565 f(Node::Expression(node.value));
1566 }
1567 Node::RequireOnceConstruct(node) => {
1568 f(Node::Keyword(&node.require_once));
1569 f(Node::Expression(node.value));
1570 }
1571 Node::PrintConstruct(node) => {
1572 f(Node::Keyword(&node.print));
1573 f(Node::Expression(node.value));
1574 }
1575 Node::ExitConstruct(node) => {
1576 f(Node::Keyword(&node.exit));
1577 if let Some(arguments) = &node.arguments {
1578 f(Node::ArgumentList(arguments));
1579 }
1580 }
1581 Node::DieConstruct(node) => {
1582 f(Node::Keyword(&node.die));
1583 if let Some(arguments) = &node.arguments {
1584 f(Node::ArgumentList(arguments));
1585 }
1586 }
1587 Node::If(node) => {
1588 f(Node::Keyword(&node.r#if));
1589 f(Node::Expression(node.condition));
1590 f(Node::IfBody(&node.body));
1591 }
1592 Node::IfBody(node) => match node {
1593 IfBody::Statement(statement_body) => f(Node::IfStatementBody(statement_body)),
1594 IfBody::ColonDelimited(colon_body) => f(Node::IfColonDelimitedBody(colon_body)),
1595 },
1596 Node::IfStatementBody(node) => {
1597 f(Node::Statement(node.statement));
1598
1599 for item in node.else_if_clauses.iter() {
1600 f(Node::IfStatementBodyElseIfClause(item));
1601 }
1602 if let Some(else_clause) = &node.else_clause {
1603 f(Node::IfStatementBodyElseClause(else_clause));
1604 }
1605 }
1606 Node::IfStatementBodyElseIfClause(node) => {
1607 f(Node::Keyword(&node.elseif));
1608 f(Node::Expression(node.condition));
1609 f(Node::Statement(node.statement));
1610 }
1611 Node::IfStatementBodyElseClause(node) => {
1612 f(Node::Keyword(&node.r#else));
1613 f(Node::Statement(node.statement));
1614 }
1615 Node::IfColonDelimitedBody(node) => {
1616 for stmt in node.statements.as_slice() {
1617 f(Node::Statement(stmt));
1618 }
1619
1620 for item in node.else_if_clauses.iter() {
1621 f(Node::IfColonDelimitedBodyElseIfClause(item));
1622 }
1623
1624 if let Some(else_clause) = &node.else_clause {
1625 f(Node::IfColonDelimitedBodyElseClause(else_clause));
1626 }
1627
1628 f(Node::Keyword(&node.endif));
1629 f(Node::Terminator(&node.terminator));
1630 }
1631 Node::IfColonDelimitedBodyElseIfClause(node) => {
1632 f(Node::Keyword(&node.elseif));
1633 f(Node::Expression(node.condition));
1634 for item in node.statements.iter() {
1635 f(Node::Statement(item));
1636 }
1637 }
1638 Node::IfColonDelimitedBodyElseClause(node) => {
1639 f(Node::Keyword(&node.r#else));
1640
1641 for item in node.statements.iter() {
1642 f(Node::Statement(item));
1643 }
1644 }
1645 Node::Match(node) => {
1646 f(Node::Keyword(&node.r#match));
1647 f(Node::Expression(node.expression));
1648 for item in node.arms.iter() {
1649 f(Node::MatchArm(item));
1650 }
1651 }
1652 Node::MatchArm(node) => match node {
1653 MatchArm::Expression(expr_arm) => f(Node::MatchExpressionArm(expr_arm)),
1654 MatchArm::Default(default_arm) => f(Node::MatchDefaultArm(default_arm)),
1655 },
1656 Node::MatchExpressionArm(node) => {
1657 for e in node.conditions.iter() {
1658 f(Node::Expression(e));
1659 }
1660 f(Node::Expression(node.expression));
1661 }
1662 Node::MatchDefaultArm(node) => {
1663 f(Node::Keyword(&node.default));
1664 f(Node::Expression(node.expression));
1665 }
1666 Node::Switch(node) => {
1667 f(Node::Keyword(&node.switch));
1668 f(Node::Expression(node.expression));
1669 f(Node::SwitchBody(&node.body));
1670 }
1671 Node::SwitchBody(node) => match node {
1672 SwitchBody::BraceDelimited(body) => f(Node::SwitchBraceDelimitedBody(body)),
1673 SwitchBody::ColonDelimited(body) => f(Node::SwitchColonDelimitedBody(body)),
1674 },
1675 Node::SwitchBraceDelimitedBody(node) => {
1676 if let Some(terminator) = &node.optional_terminator {
1677 f(Node::Terminator(terminator));
1678 }
1679
1680 for item in node.cases.iter() {
1681 f(Node::SwitchCase(item));
1682 }
1683 }
1684 Node::SwitchColonDelimitedBody(node) => {
1685 if let Some(terminator) = &node.optional_terminator {
1686 f(Node::Terminator(terminator));
1687 }
1688
1689 for item in node.cases.iter() {
1690 f(Node::SwitchCase(item));
1691 }
1692 f(Node::Keyword(&node.end_switch));
1693 f(Node::Terminator(&node.terminator));
1694 }
1695 Node::SwitchCase(node) => match node {
1696 SwitchCase::Expression(expression_case) => {
1697 f(Node::SwitchExpressionCase(expression_case));
1698 }
1699 SwitchCase::Default(default_case) => f(Node::SwitchDefaultCase(default_case)),
1700 },
1701 Node::SwitchExpressionCase(node) => {
1702 f(Node::Keyword(&node.case));
1703 f(Node::Expression(node.expression));
1704 f(Node::SwitchCaseSeparator(&node.separator));
1705
1706 for item in node.statements.iter() {
1707 f(Node::Statement(item));
1708 }
1709 }
1710 Node::SwitchDefaultCase(node) => {
1711 f(Node::Keyword(&node.default));
1712 f(Node::SwitchCaseSeparator(&node.separator));
1713 for item in node.statements.iter() {
1714 f(Node::Statement(item));
1715 }
1716 }
1717 Node::SwitchCaseSeparator(_) => {}
1718 Node::Declare(node) => {
1719 f(Node::Keyword(&node.declare));
1720
1721 for item in node.items.iter() {
1722 f(Node::DeclareItem(item));
1723 }
1724 f(Node::DeclareBody(&node.body));
1725 }
1726 Node::DeclareBody(node) => match node {
1727 DeclareBody::Statement(statement) => f(Node::Statement(statement)),
1728 DeclareBody::ColonDelimited(body) => f(Node::DeclareColonDelimitedBody(body)),
1729 },
1730 Node::DeclareColonDelimitedBody(node) => {
1731 for item in node.statements.iter() {
1732 f(Node::Statement(item));
1733 }
1734
1735 f(Node::Keyword(&node.end_declare));
1736 f(Node::Terminator(&node.terminator));
1737 }
1738 Node::DeclareItem(node) => {
1739 f(Node::LocalIdentifier(&node.name));
1740 f(Node::Expression(node.value));
1741 }
1742 Node::EchoTag(node) => {
1743 for e in node.values.iter() {
1744 f(Node::Expression(e));
1745 }
1746 f(Node::Terminator(&node.terminator));
1747 }
1748 Node::Echo(node) => {
1749 f(Node::Keyword(&node.echo));
1750 for e in node.values.iter() {
1751 f(Node::Expression(e));
1752 }
1753 f(Node::Terminator(&node.terminator));
1754 }
1755 Node::Parenthesized(node) => f(Node::Expression(node.expression)),
1756 Node::Expression(node) => {
1757 let child = match node {
1758 Expression::Binary(node) => Node::Binary(node),
1759 Expression::UnaryPrefix(node) => Node::UnaryPrefix(node),
1760 Expression::ConstantAccess(node) => Node::ConstantAccess(node),
1761 Expression::UnaryPostfix(node) => Node::UnaryPostfix(node),
1762 Expression::Parenthesized(node) => Node::Parenthesized(node),
1763 Expression::Literal(node) => Node::Literal(node),
1764 Expression::CompositeString(node) => Node::CompositeString(node),
1765 Expression::Assignment(node) => Node::Assignment(node),
1766 Expression::Conditional(node) => Node::Conditional(node),
1767 Expression::Array(node) => Node::Array(node),
1768 Expression::LegacyArray(node) => Node::LegacyArray(node),
1769 Expression::List(node) => Node::List(node),
1770 Expression::ArrayAccess(node) => Node::ArrayAccess(node),
1771 Expression::ArrayAppend(node) => Node::ArrayAppend(node),
1772 Expression::AnonymousClass(node) => Node::AnonymousClass(node),
1773 Expression::Closure(node) => Node::Closure(node),
1774 Expression::ArrowFunction(node) => Node::ArrowFunction(node),
1775 Expression::Variable(node) => Node::Variable(node),
1776 Expression::Identifier(node) => Node::Identifier(node),
1777 Expression::Match(node) => Node::Match(node),
1778 Expression::Yield(node) => Node::Yield(node),
1779 Expression::Construct(node) => Node::Construct(node),
1780 Expression::Throw(node) => Node::Throw(node),
1781 Expression::Clone(node) => Node::Clone(node),
1782 Expression::Call(node) => Node::Call(node),
1783 Expression::PartialApplication(node) => Node::PartialApplication(node),
1784 Expression::Access(node) => Node::Access(node),
1785 Expression::Parent(node) => Node::Keyword(node),
1786 Expression::Static(node) => Node::Keyword(node),
1787 Expression::Self_(node) => Node::Keyword(node),
1788 Expression::Instantiation(node) => Node::Instantiation(node),
1789 Expression::MagicConstant(node) => Node::MagicConstant(node),
1790 Expression::Pipe(node) => Node::Pipe(node),
1791 Expression::Error(span) => Node::Error(*span),
1792 };
1793 f(child);
1794 }
1795 Node::Binary(node) => {
1796 f(Node::Expression(node.lhs));
1797 f(Node::BinaryOperator(&node.operator));
1798 f(Node::Expression(node.rhs));
1799 }
1800 Node::BinaryOperator(operator) => match operator {
1801 BinaryOperator::Addition(_) => {}
1802 BinaryOperator::Subtraction(_) => {}
1803 BinaryOperator::Multiplication(_) => {}
1804 BinaryOperator::Division(_) => {}
1805 BinaryOperator::Modulo(_) => {}
1806 BinaryOperator::Exponentiation(_) => {}
1807 BinaryOperator::BitwiseAnd(_) => {}
1808 BinaryOperator::BitwiseOr(_) => {}
1809 BinaryOperator::BitwiseXor(_) => {}
1810 BinaryOperator::LeftShift(_) => {}
1811 BinaryOperator::RightShift(_) => {}
1812 BinaryOperator::NullCoalesce(_) => {}
1813 BinaryOperator::Equal(_) => {}
1814 BinaryOperator::NotEqual(_) => {}
1815 BinaryOperator::Identical(_) => {}
1816 BinaryOperator::NotIdentical(_) => {}
1817 BinaryOperator::AngledNotEqual(_) => {}
1818 BinaryOperator::LessThan(_) => {}
1819 BinaryOperator::LessThanOrEqual(_) => {}
1820 BinaryOperator::GreaterThan(_) => {}
1821 BinaryOperator::GreaterThanOrEqual(_) => {}
1822 BinaryOperator::Spaceship(_) => {}
1823 BinaryOperator::StringConcat(_) => {}
1824 BinaryOperator::And(_) => {}
1825 BinaryOperator::Or(_) => {}
1826 BinaryOperator::Instanceof(keyword) => f(Node::Keyword(keyword)),
1827 BinaryOperator::LowAnd(keyword) => f(Node::Keyword(keyword)),
1828 BinaryOperator::LowOr(keyword) => f(Node::Keyword(keyword)),
1829 BinaryOperator::LowXor(keyword) => f(Node::Keyword(keyword)),
1830 },
1831 Node::UnaryPrefix(node) => {
1832 f(Node::UnaryPrefixOperator(&node.operator));
1833 f(Node::Expression(node.operand));
1834 }
1835 Node::UnaryPostfix(node) => {
1836 f(Node::Expression(node.operand));
1837 f(Node::UnaryPostfixOperator(&node.operator));
1838 }
1839 Node::UnaryPrefixOperator(_) | Node::UnaryPostfixOperator(_) => {}
1840 Node::ArrowFunction(node) => {
1841 for item in node.attribute_lists.iter() {
1842 f(Node::AttributeList(item));
1843 }
1844 if let Some(r#static) = &node.r#static {
1845 f(Node::Keyword(r#static));
1846 }
1847 f(Node::Keyword(&node.r#fn));
1848 f(Node::FunctionLikeParameterList(&node.parameter_list));
1849 if let Some(return_type_hint) = &node.return_type_hint {
1850 f(Node::FunctionLikeReturnTypeHint(return_type_hint));
1851 }
1852 f(Node::Expression(node.expression));
1853 }
1854 Node::Closure(node) => {
1855 for item in node.attribute_lists.iter() {
1856 f(Node::AttributeList(item));
1857 }
1858 f(Node::Keyword(&node.function));
1859 f(Node::FunctionLikeParameterList(&node.parameter_list));
1860 if let Some(use_clause) = &node.use_clause {
1861 f(Node::ClosureUseClause(use_clause));
1862 }
1863 if let Some(return_type_hint) = &node.return_type_hint {
1864 f(Node::FunctionLikeReturnTypeHint(return_type_hint));
1865 }
1866 f(Node::Block(&node.body));
1867 }
1868 Node::ClosureUseClause(node) => {
1869 f(Node::Keyword(&node.r#use));
1870 for item in node.variables.iter() {
1871 f(Node::ClosureUseClauseVariable(item));
1872 }
1873 }
1874 Node::ClosureUseClauseVariable(node) => f(Node::DirectVariable(&node.variable)),
1875 Node::Function(node) => {
1876 for item in node.attribute_lists.iter() {
1877 f(Node::AttributeList(item));
1878 }
1879 f(Node::Keyword(&node.function));
1880 f(Node::LocalIdentifier(&node.name));
1881 f(Node::FunctionLikeParameterList(&node.parameter_list));
1882 if let Some(return_type_hint) = &node.return_type_hint {
1883 f(Node::FunctionLikeReturnTypeHint(return_type_hint));
1884 }
1885
1886 f(Node::Block(&node.body));
1887 }
1888 Node::FunctionLikeParameterList(node) => {
1889 for item in node.parameters.iter() {
1890 f(Node::FunctionLikeParameter(item));
1891 }
1892 }
1893 Node::FunctionLikeParameter(node) => {
1894 for item in node.attribute_lists.iter() {
1895 f(Node::AttributeList(item));
1896 }
1897 for item in node.modifiers.iter() {
1898 f(Node::Modifier(item));
1899 }
1900 if let Some(hint) = &node.hint {
1901 f(Node::Hint(hint));
1902 }
1903 f(Node::DirectVariable(&node.variable));
1904 if let Some(default_value) = &node.default_value {
1905 f(Node::FunctionLikeParameterDefaultValue(default_value));
1906 }
1907
1908 if let Some(hooks) = &node.hooks {
1909 f(Node::PropertyHookList(hooks));
1910 }
1911 }
1912 Node::FunctionLikeParameterDefaultValue(node) => f(Node::Expression(node.value)),
1913 Node::FunctionLikeReturnTypeHint(hint) => f(Node::Hint(&hint.hint)),
1914 Node::Global(node) => {
1915 f(Node::Keyword(&node.r#global));
1916 for item in node.variables.iter() {
1917 f(Node::Variable(item));
1918 }
1919 }
1920 Node::Goto(node) => {
1921 f(Node::Keyword(&node.r#goto));
1922 f(Node::LocalIdentifier(&node.label));
1923 }
1924 Node::Label(node) => {
1925 f(Node::LocalIdentifier(&node.name));
1926 }
1927 Node::HaltCompiler(node) => {
1928 f(Node::Keyword(&node.halt_compiler));
1929 }
1930 Node::FullyQualifiedIdentifier(_) => {}
1931 Node::Identifier(node) => f(match node {
1932 Identifier::Local(node) => Node::LocalIdentifier(node),
1933 Identifier::Qualified(node) => Node::QualifiedIdentifier(node),
1934 Identifier::FullyQualified(node) => Node::FullyQualifiedIdentifier(node),
1935 }),
1936 Node::LocalIdentifier(_) => {}
1937 Node::QualifiedIdentifier(_) => {}
1938 Node::Inline(_) => {}
1939 Node::Instantiation(node) => {
1940 f(Node::Keyword(&node.new));
1941 f(Node::Expression(node.class));
1942
1943 if let Some(argument_list) = &node.argument_list {
1944 f(Node::ArgumentList(argument_list));
1945 }
1946 }
1947 Node::Keyword(_) => {}
1948 Node::Literal(node) => f(match node {
1949 Literal::Float(node) => Node::LiteralFloat(node),
1950 Literal::Integer(node) => Node::LiteralInteger(node),
1951 Literal::String(node) => Node::LiteralString(node),
1952 Literal::True(node) => Node::Keyword(node),
1953 Literal::False(node) => Node::Keyword(node),
1954 Literal::Null(node) => Node::Keyword(node),
1955 }),
1956 Node::LiteralFloat(_) => {}
1957 Node::LiteralInteger(_) => {}
1958 Node::LiteralString(_) => {}
1959 Node::MagicConstant(node) => f(match node {
1960 MagicConstant::Class(node) => Node::LocalIdentifier(node),
1961 MagicConstant::Directory(node) => Node::LocalIdentifier(node),
1962 MagicConstant::File(node) => Node::LocalIdentifier(node),
1963 MagicConstant::Function(node) => Node::LocalIdentifier(node),
1964 MagicConstant::Line(node) => Node::LocalIdentifier(node),
1965 MagicConstant::Method(node) => Node::LocalIdentifier(node),
1966 MagicConstant::Namespace(node) => Node::LocalIdentifier(node),
1967 MagicConstant::Trait(node) => Node::LocalIdentifier(node),
1968 MagicConstant::Property(node) => Node::LocalIdentifier(node),
1969 }),
1970 Node::Modifier(node) => f(match node {
1971 Modifier::Abstract(node) => Node::Keyword(node),
1972 Modifier::Final(node) => Node::Keyword(node),
1973 Modifier::Private(node) => Node::Keyword(node),
1974 Modifier::Protected(node) => Node::Keyword(node),
1975 Modifier::Public(node) => Node::Keyword(node),
1976 Modifier::Static(node) => Node::Keyword(node),
1977 Modifier::Readonly(node) => Node::Keyword(node),
1978 Modifier::PrivateSet(node) => Node::Keyword(node),
1979 Modifier::ProtectedSet(node) => Node::Keyword(node),
1980 Modifier::PublicSet(node) => Node::Keyword(node),
1981 }),
1982 Node::Namespace(node) => {
1983 f(Node::Keyword(&node.r#namespace));
1984
1985 if let Some(name) = &node.name {
1986 f(Node::Identifier(name));
1987 }
1988
1989 f(Node::NamespaceBody(&node.body));
1990 }
1991 Node::NamespaceBody(node) => {
1992 f(match node {
1993 NamespaceBody::BraceDelimited(node) => Node::Block(node),
1994 NamespaceBody::Implicit(node) => Node::NamespaceImplicitBody(node),
1995 });
1996 }
1997 Node::NamespaceImplicitBody(node) => {
1998 f(Node::Terminator(&node.terminator));
1999
2000 for item in node.statements.iter() {
2001 f(Node::Statement(item));
2002 }
2003 }
2004 Node::Assignment(node) => {
2005 f(Node::Expression(node.lhs));
2006 f(Node::AssignmentOperator(&node.operator));
2007 f(Node::Expression(node.rhs));
2008 }
2009 Node::AssignmentOperator(_) => {}
2010 Node::Conditional(node) => {
2011 f(Node::Expression(node.condition));
2012
2013 if let Some(then) = &node.then {
2014 f(Node::Expression(then));
2015 }
2016
2017 f(Node::Expression(node.r#else));
2018 }
2019 Node::DoWhile(node) => {
2020 f(Node::Keyword(&node.r#do));
2021 f(Node::Statement(node.statement));
2022 f(Node::Keyword(&node.r#while));
2023 f(Node::Expression(node.condition));
2024 f(Node::Terminator(&node.terminator));
2025 }
2026 Node::Foreach(node) => {
2027 f(Node::Keyword(&node.r#foreach));
2028 f(Node::Expression(node.expression));
2029 f(Node::Keyword(&node.r#as));
2030 f(Node::ForeachTarget(&node.target));
2031 f(Node::ForeachBody(&node.body));
2032 }
2033 Node::ForeachBody(node) => f(match node {
2034 ForeachBody::Statement(node) => Node::Statement(node),
2035 ForeachBody::ColonDelimited(node) => Node::ForeachColonDelimitedBody(node),
2036 }),
2037 Node::ForeachColonDelimitedBody(node) => {
2038 for item in node.statements.iter() {
2039 f(Node::Statement(item));
2040 }
2041
2042 f(Node::Keyword(&node.end_foreach));
2043 f(Node::Terminator(&node.terminator));
2044 }
2045 Node::ForeachKeyValueTarget(node) => {
2046 f(Node::Expression(node.key));
2047 f(Node::Expression(node.value));
2048 }
2049 Node::ForeachTarget(node) => f(match node {
2050 ForeachTarget::KeyValue(node) => Node::ForeachKeyValueTarget(node),
2051 ForeachTarget::Value(node) => Node::ForeachValueTarget(node),
2052 }),
2053 Node::ForeachValueTarget(node) => f(Node::Expression(node.value)),
2054 Node::For(node) => {
2055 f(Node::Keyword(&node.r#for));
2056
2057 for e in node.initializations.iter() {
2058 f(Node::Expression(e));
2059 }
2060 for e in node.conditions.iter() {
2061 f(Node::Expression(e));
2062 }
2063 for e in node.increments.iter() {
2064 f(Node::Expression(e));
2065 }
2066 f(Node::ForBody(&node.body));
2067 }
2068 Node::ForBody(node) => match node {
2069 ForBody::Statement(statement) => f(Node::Statement(statement)),
2070 ForBody::ColonDelimited(body) => f(Node::ForColonDelimitedBody(body)),
2071 },
2072 Node::ForColonDelimitedBody(node) => {
2073 for item in node.statements.iter() {
2074 f(Node::Statement(item));
2075 }
2076 f(Node::Keyword(&node.end_for));
2077 f(Node::Terminator(&node.terminator));
2078 }
2079 Node::While(node) => {
2080 f(Node::Keyword(&node.r#while));
2081 f(Node::Expression(node.condition));
2082 f(Node::WhileBody(&node.body));
2083 }
2084 Node::WhileBody(node) => match node {
2085 WhileBody::Statement(statement) => f(Node::Statement(statement)),
2086 WhileBody::ColonDelimited(body) => f(Node::WhileColonDelimitedBody(body)),
2087 },
2088 Node::WhileColonDelimitedBody(node) => {
2089 for item in node.statements.iter() {
2090 f(Node::Statement(item));
2091 }
2092 f(Node::Keyword(&node.end_while));
2093 f(Node::Terminator(&node.terminator));
2094 }
2095 Node::Break(node) => {
2096 f(Node::Keyword(&node.r#break));
2097
2098 if let Some(level) = &node.level {
2099 f(Node::Expression(level));
2100 }
2101
2102 f(Node::Terminator(&node.terminator));
2103 }
2104 Node::Continue(node) => {
2105 f(Node::Keyword(&node.r#continue));
2106
2107 if let Some(level) = &node.level {
2108 f(Node::Expression(level));
2109 }
2110
2111 f(Node::Terminator(&node.terminator));
2112 }
2113 Node::Return(node) => {
2114 f(Node::Keyword(&node.r#return));
2115
2116 if let Some(value) = &node.value {
2117 f(Node::Expression(value));
2118 }
2119
2120 f(Node::Terminator(&node.terminator));
2121 }
2122 Node::Static(node) => {
2123 f(Node::Keyword(&node.r#static));
2124
2125 for item in node.items.iter() {
2126 f(Node::StaticItem(item));
2127 }
2128 f(Node::Terminator(&node.terminator));
2129 }
2130 Node::StaticItem(node) => f(match node {
2131 StaticItem::Abstract(item) => Node::StaticAbstractItem(item),
2132 StaticItem::Concrete(item) => Node::StaticConcreteItem(item),
2133 }),
2134 Node::StaticAbstractItem(node) => {
2135 f(Node::DirectVariable(&node.variable));
2136 }
2137 Node::StaticConcreteItem(node) => {
2138 f(Node::DirectVariable(&node.variable));
2139 f(Node::Expression(node.value));
2140 }
2141 Node::Try(node) => {
2142 f(Node::Keyword(&node.r#try));
2143 f(Node::Block(&node.block));
2144 for item in node.catch_clauses.iter() {
2145 f(Node::TryCatchClause(item));
2146 }
2147 if let Some(finally) = &node.finally_clause {
2148 f(Node::TryFinallyClause(finally));
2149 }
2150 }
2151 Node::TryCatchClause(node) => {
2152 f(Node::Keyword(&node.r#catch));
2153 f(Node::Hint(&node.hint));
2154 if let Some(variable) = &node.variable {
2155 f(Node::DirectVariable(variable));
2156 }
2157 f(Node::Block(&node.block));
2158 }
2159 Node::TryFinallyClause(node) => {
2160 f(Node::Keyword(&node.r#finally));
2161 f(Node::Block(&node.block));
2162 }
2163 Node::MaybeTypedUseItem(node) => {
2164 if let Some(r#type) = &node.r#type {
2165 f(Node::UseType(r#type));
2166 }
2167
2168 f(Node::UseItem(&node.item));
2169 }
2170 Node::MixedUseItemList(node) => {
2171 f(Node::Identifier(&node.namespace));
2172
2173 for item in node.items.iter() {
2174 f(Node::MaybeTypedUseItem(item));
2175 }
2176 }
2177 Node::TypedUseItemList(node) => {
2178 f(Node::UseType(&node.r#type));
2179 f(Node::Identifier(&node.namespace));
2180
2181 for item in node.items.iter() {
2182 f(Node::UseItem(item));
2183 }
2184 }
2185 Node::TypedUseItemSequence(node) => {
2186 f(Node::UseType(&node.r#type));
2187
2188 for item in node.items.iter() {
2189 f(Node::UseItem(item));
2190 }
2191 }
2192 Node::Use(node) => {
2193 f(Node::Keyword(&node.r#use));
2194 f(Node::UseItems(&node.items));
2195 f(Node::Terminator(&node.terminator));
2196 }
2197 Node::UseItem(node) => {
2198 f(Node::Identifier(&node.name));
2199
2200 if let Some(alias) = &node.alias {
2201 f(Node::UseItemAlias(alias));
2202 }
2203 }
2204 Node::UseItemAlias(node) => {
2205 f(Node::Keyword(&node.r#as));
2206 f(Node::LocalIdentifier(&node.identifier));
2207 }
2208 Node::UseItemSequence(node) => {
2209 for item in &node.items {
2210 f(Node::UseItem(item));
2211 }
2212 }
2213 Node::UseItems(node) => f(match node {
2214 UseItems::Sequence(node) => Node::UseItemSequence(node),
2215 UseItems::TypedList(node) => Node::TypedUseItemList(node),
2216 UseItems::MixedList(node) => Node::MixedUseItemList(node),
2217 UseItems::TypedSequence(node) => Node::TypedUseItemSequence(node),
2218 }),
2219 Node::UseType(node) => f(match node {
2220 UseType::Const(node) => Node::Keyword(node),
2221 UseType::Function(node) => Node::Keyword(node),
2222 }),
2223 Node::Yield(node) => f(match node {
2224 Yield::Value(node) => Node::YieldValue(node),
2225 Yield::Pair(node) => Node::YieldPair(node),
2226 Yield::From(node) => Node::YieldFrom(node),
2227 }),
2228 Node::YieldFrom(node) => {
2229 f(Node::Keyword(&node.r#yield));
2230 f(Node::Keyword(&node.from));
2231 f(Node::Expression(node.iterator));
2232 }
2233 Node::YieldPair(node) => {
2234 f(Node::Keyword(&node.r#yield));
2235 f(Node::Expression(node.key));
2236 f(Node::Expression(node.value));
2237 }
2238 Node::YieldValue(node) => {
2239 f(Node::Keyword(&node.r#yield));
2240 if let Some(value) = &node.value {
2241 f(Node::Expression(value));
2242 }
2243 }
2244 Node::Statement(node) => match &node {
2245 Statement::OpeningTag(node) => f(Node::OpeningTag(node)),
2246 Statement::ClosingTag(node) => f(Node::ClosingTag(node)),
2247 Statement::Inline(node) => f(Node::Inline(node)),
2248 Statement::Namespace(node) => f(Node::Namespace(node)),
2249 Statement::Use(node) => f(Node::Use(node)),
2250 Statement::Class(node) => f(Node::Class(node)),
2251 Statement::Interface(node) => f(Node::Interface(node)),
2252 Statement::Trait(node) => f(Node::Trait(node)),
2253 Statement::Enum(node) => f(Node::Enum(node)),
2254 Statement::Block(node) => f(Node::Block(node)),
2255 Statement::Constant(node) => f(Node::Constant(node)),
2256 Statement::Function(node) => f(Node::Function(node)),
2257 Statement::Declare(node) => f(Node::Declare(node)),
2258 Statement::Goto(node) => f(Node::Goto(node)),
2259 Statement::Label(node) => f(Node::Label(node)),
2260 Statement::Try(node) => f(Node::Try(node)),
2261 Statement::Foreach(node) => f(Node::Foreach(node)),
2262 Statement::For(node) => f(Node::For(node)),
2263 Statement::While(node) => f(Node::While(node)),
2264 Statement::DoWhile(node) => f(Node::DoWhile(node)),
2265 Statement::Continue(node) => f(Node::Continue(node)),
2266 Statement::Break(node) => f(Node::Break(node)),
2267 Statement::Switch(node) => f(Node::Switch(node)),
2268 Statement::If(node) => f(Node::If(node)),
2269 Statement::Return(node) => f(Node::Return(node)),
2270 Statement::Expression(node) => f(Node::ExpressionStatement(node)),
2271 Statement::EchoTag(node) => f(Node::EchoTag(node)),
2272 Statement::Echo(node) => f(Node::Echo(node)),
2273 Statement::Global(node) => f(Node::Global(node)),
2274 Statement::Static(node) => f(Node::Static(node)),
2275 Statement::HaltCompiler(node) => f(Node::HaltCompiler(node)),
2276 Statement::Unset(node) => f(Node::Unset(node)),
2277 Statement::Noop(_) => {}
2278 },
2279 Node::ExpressionStatement(node) => {
2280 f(Node::Expression(node.expression));
2281 f(Node::Terminator(&node.terminator));
2282 }
2283 Node::BracedExpressionStringPart(node) => f(Node::Expression(node.expression)),
2284 Node::DocumentString(node) => {
2285 for part in node.parts.as_slice() {
2286 f(Node::StringPart(part));
2287 }
2288 }
2289 Node::InterpolatedString(node) => {
2290 for part in node.parts.as_slice() {
2291 f(Node::StringPart(part));
2292 }
2293 }
2294 Node::LiteralStringPart(_) => {}
2295 Node::ShellExecuteString(node) => {
2296 for part in node.parts.as_slice() {
2297 f(Node::StringPart(part));
2298 }
2299 }
2300 Node::CompositeString(node) => f(match node {
2301 CompositeString::ShellExecute(node) => Node::ShellExecuteString(node),
2302 CompositeString::Interpolated(node) => Node::InterpolatedString(node),
2303 CompositeString::Document(node) => Node::DocumentString(node),
2304 }),
2305 Node::StringPart(node) => f(match node {
2306 StringPart::Literal(node) => Node::LiteralStringPart(node),
2307 StringPart::Expression(node) => Node::Expression(node),
2308 StringPart::BracedExpression(node) => Node::BracedExpressionStringPart(node),
2309 }),
2310 Node::ClosingTag(_) => {}
2311 Node::FullOpeningTag(_) => {}
2312 Node::OpeningTag(node) => match node {
2313 OpeningTag::Full(node) => f(Node::FullOpeningTag(node)),
2314 OpeningTag::Short(node) => f(Node::ShortOpeningTag(node)),
2315 },
2316 Node::ShortOpeningTag(_) => {}
2317 Node::Terminator(node) => match node {
2318 Terminator::Semicolon(_) => {}
2319 Terminator::ClosingTag(closing_tag) => f(Node::ClosingTag(closing_tag)),
2320 Terminator::TagPair(closing_tag, opening_tag) => {
2321 f(Node::ClosingTag(closing_tag));
2322 f(Node::OpeningTag(opening_tag));
2323 }
2324 Terminator::Missing(span) => f(Node::MissingTerminator(*span)),
2325 },
2326 Node::Throw(node) => {
2327 f(Node::Keyword(&node.throw));
2328 f(Node::Expression(node.exception));
2329 }
2330 Node::Hint(node) => match &node {
2331 Hint::Identifier(identifier) => f(Node::Identifier(identifier)),
2332 Hint::Parenthesized(parenthesized_hint) => {
2333 f(Node::ParenthesizedHint(parenthesized_hint));
2334 }
2335 Hint::Nullable(nullable_hint) => f(Node::NullableHint(nullable_hint)),
2336 Hint::Union(union_hint) => f(Node::UnionHint(union_hint)),
2337 Hint::Intersection(intersection_hint) => f(Node::IntersectionHint(intersection_hint)),
2338 Hint::Null(keyword)
2339 | Hint::True(keyword)
2340 | Hint::False(keyword)
2341 | Hint::Array(keyword)
2342 | Hint::Callable(keyword)
2343 | Hint::Static(keyword)
2344 | Hint::Self_(keyword)
2345 | Hint::Parent(keyword) => f(Node::Keyword(keyword)),
2346 Hint::Void(local_identifier)
2347 | Hint::Never(local_identifier)
2348 | Hint::Float(local_identifier)
2349 | Hint::Bool(local_identifier)
2350 | Hint::Integer(local_identifier)
2351 | Hint::String(local_identifier)
2352 | Hint::Object(local_identifier)
2353 | Hint::Mixed(local_identifier)
2354 | Hint::Iterable(local_identifier) => f(Node::LocalIdentifier(local_identifier)),
2355 },
2356 Node::IntersectionHint(node) => {
2357 f(Node::Hint(node.left));
2358 f(Node::Hint(node.right));
2359 }
2360 Node::NullableHint(node) => f(Node::Hint(node.hint)),
2361 Node::ParenthesizedHint(node) => f(Node::Hint(node.hint)),
2362 Node::UnionHint(node) => {
2363 f(Node::Hint(node.left));
2364 f(Node::Hint(node.right));
2365 }
2366 Node::Unset(node) => {
2367 f(Node::Keyword(&node.unset));
2368 for e in node.values.iter() {
2369 f(Node::Expression(e));
2370 }
2371 f(Node::Terminator(&node.terminator));
2372 }
2373 Node::DirectVariable(_) => {}
2374 Node::IndirectVariable(node) => f(Node::Expression(node.expression)),
2375 Node::NestedVariable(node) => {
2376 f(Node::Variable(node.variable));
2377 }
2378 Node::Variable(node) => match node {
2379 Variable::Direct(node) => f(Node::DirectVariable(node)),
2380 Variable::Indirect(node) => f(Node::IndirectVariable(node)),
2381 Variable::Nested(node) => f(Node::NestedVariable(node)),
2382 },
2383 Node::Pipe(pipe) => {
2384 f(Node::Expression(pipe.input));
2385 f(Node::Expression(pipe.callable));
2386 }
2387 Node::Error(_)
2388 | Node::MissingTerminator(_)
2389 | Node::ClassLikeMemberMissingSelector(_)
2390 | Node::ClassLikeConstantMissingSelector(_) => {}
2391 }
2392 }
2393
2394 #[inline]
2399 #[must_use]
2400 pub fn children(&self) -> Vec<Node<'ast, 'arena>> {
2401 let mut children = vec![];
2402 self.visit_children(|child| children.push(child));
2403 children
2404 }
2405}
2406
2407impl HasSpan for Node<'_, '_> {
2408 fn span(&self) -> Span {
2409 match self {
2410 Self::Program(node) => node.span(),
2411 Self::Access(node) => node.span(),
2412 Self::ConstantAccess(node) => node.span(),
2413 Self::ClassConstantAccess(node) => node.span(),
2414 Self::NullSafePropertyAccess(node) => node.span(),
2415 Self::PropertyAccess(node) => node.span(),
2416 Self::StaticPropertyAccess(node) => node.span(),
2417 Self::Argument(node) => node.span(),
2418 Self::ArgumentList(node) => node.span(),
2419 Self::PartialArgument(node) => node.span(),
2420 Self::PartialArgumentList(node) => node.span(),
2421 Self::NamedArgument(node) => node.span(),
2422 Self::NamedPlaceholderArgument(node) => node.span(),
2423 Self::PlaceholderArgument(node) => node.span(),
2424 Self::PositionalArgument(node) => node.span(),
2425 Self::VariadicPlaceholderArgument(node) => node.span(),
2426 Self::Array(node) => node.span(),
2427 Self::ArrayAccess(node) => node.span(),
2428 Self::ArrayAppend(node) => node.span(),
2429 Self::ArrayElement(node) => node.span(),
2430 Self::KeyValueArrayElement(node) => node.span(),
2431 Self::LegacyArray(node) => node.span(),
2432 Self::List(node) => node.span(),
2433 Self::MissingArrayElement(node) => node.span(),
2434 Self::ValueArrayElement(node) => node.span(),
2435 Self::VariadicArrayElement(node) => node.span(),
2436 Self::Attribute(node) => node.span(),
2437 Self::AttributeList(node) => node.span(),
2438 Self::Block(node) => node.span(),
2439 Self::Call(node) => node.span(),
2440 Self::FunctionCall(node) => node.span(),
2441 Self::MethodCall(node) => node.span(),
2442 Self::NullSafeMethodCall(node) => node.span(),
2443 Self::StaticMethodCall(node) => node.span(),
2444 Self::PartialApplication(node) => node.span(),
2445 Self::FunctionPartialApplication(node) => node.span(),
2446 Self::MethodPartialApplication(node) => node.span(),
2447 Self::StaticMethodPartialApplication(node) => node.span(),
2448 Self::ClassLikeConstant(node) => node.span(),
2449 Self::ClassLikeConstantItem(node) => node.span(),
2450 Self::EnumCase(node) => node.span(),
2451 Self::EnumCaseBackedItem(node) => node.span(),
2452 Self::EnumCaseItem(node) => node.span(),
2453 Self::EnumCaseUnitItem(node) => node.span(),
2454 Self::Extends(node) => node.span(),
2455 Self::Implements(node) => node.span(),
2456 Self::ClassLikeConstantSelector(node) => node.span(),
2457 Self::ClassLikeMember(node) => node.span(),
2458 Self::ClassLikeMemberExpressionSelector(node) => node.span(),
2459 Self::ClassLikeMemberSelector(node) => node.span(),
2460 Self::Method(node) => node.span(),
2461 Self::MethodAbstractBody(node) => node.span(),
2462 Self::MethodBody(node) => node.span(),
2463 Self::HookedProperty(node) => node.span(),
2464 Self::PlainProperty(node) => node.span(),
2465 Self::Property(node) => node.span(),
2466 Self::PropertyAbstractItem(node) => node.span(),
2467 Self::PropertyConcreteItem(node) => node.span(),
2468 Self::PropertyHook(node) => node.span(),
2469 Self::PropertyHookAbstractBody(node) => node.span(),
2470 Self::PropertyHookBody(node) => node.span(),
2471 Self::PropertyHookConcreteBody(node) => node.span(),
2472 Self::PropertyHookConcreteExpressionBody(node) => node.span(),
2473 Self::PropertyHookList(node) => node.span(),
2474 Self::PropertyItem(node) => node.span(),
2475 Self::TraitUse(node) => node.span(),
2476 Self::TraitUseAbsoluteMethodReference(node) => node.span(),
2477 Self::TraitUseAbstractSpecification(node) => node.span(),
2478 Self::TraitUseAdaptation(node) => node.span(),
2479 Self::TraitUseAliasAdaptation(node) => node.span(),
2480 Self::TraitUseConcreteSpecification(node) => node.span(),
2481 Self::TraitUseMethodReference(node) => node.span(),
2482 Self::TraitUsePrecedenceAdaptation(node) => node.span(),
2483 Self::TraitUseSpecification(node) => node.span(),
2484 Self::AnonymousClass(node) => node.span(),
2485 Self::Class(node) => node.span(),
2486 Self::Enum(node) => node.span(),
2487 Self::EnumBackingTypeHint(node) => node.span(),
2488 Self::Interface(node) => node.span(),
2489 Self::Trait(node) => node.span(),
2490 Self::Clone(node) => node.span(),
2491 Self::Constant(node) => node.span(),
2492 Self::ConstantItem(node) => node.span(),
2493 Self::Construct(node) => node.span(),
2494 Self::DieConstruct(node) => node.span(),
2495 Self::EmptyConstruct(node) => node.span(),
2496 Self::EvalConstruct(node) => node.span(),
2497 Self::ExitConstruct(node) => node.span(),
2498 Self::IncludeConstruct(node) => node.span(),
2499 Self::IncludeOnceConstruct(node) => node.span(),
2500 Self::IssetConstruct(node) => node.span(),
2501 Self::PrintConstruct(node) => node.span(),
2502 Self::RequireConstruct(node) => node.span(),
2503 Self::RequireOnceConstruct(node) => node.span(),
2504 Self::If(node) => node.span(),
2505 Self::IfBody(node) => node.span(),
2506 Self::IfColonDelimitedBody(node) => node.span(),
2507 Self::IfColonDelimitedBodyElseClause(node) => node.span(),
2508 Self::IfColonDelimitedBodyElseIfClause(node) => node.span(),
2509 Self::IfStatementBody(node) => node.span(),
2510 Self::IfStatementBodyElseClause(node) => node.span(),
2511 Self::IfStatementBodyElseIfClause(node) => node.span(),
2512 Self::Match(node) => node.span(),
2513 Self::MatchArm(node) => node.span(),
2514 Self::MatchDefaultArm(node) => node.span(),
2515 Self::MatchExpressionArm(node) => node.span(),
2516 Self::Switch(node) => node.span(),
2517 Self::SwitchBody(node) => node.span(),
2518 Self::SwitchBraceDelimitedBody(node) => node.span(),
2519 Self::SwitchCase(node) => node.span(),
2520 Self::SwitchCaseSeparator(node) => node.span(),
2521 Self::SwitchColonDelimitedBody(node) => node.span(),
2522 Self::SwitchDefaultCase(node) => node.span(),
2523 Self::SwitchExpressionCase(node) => node.span(),
2524 Self::Declare(node) => node.span(),
2525 Self::DeclareBody(node) => node.span(),
2526 Self::DeclareColonDelimitedBody(node) => node.span(),
2527 Self::DeclareItem(node) => node.span(),
2528 Self::Echo(node) => node.span(),
2529 Self::Expression(node) => node.span(),
2530 Self::Binary(node) => node.span(),
2531 Self::BinaryOperator(node) => node.span(),
2532 Self::UnaryPrefix(node) => node.span(),
2533 Self::UnaryPrefixOperator(node) => node.span(),
2534 Self::UnaryPostfix(node) => node.span(),
2535 Self::UnaryPostfixOperator(node) => node.span(),
2536 Self::Parenthesized(node) => node.span(),
2537 Self::ArrowFunction(node) => node.span(),
2538 Self::Closure(node) => node.span(),
2539 Self::ClosureUseClause(node) => node.span(),
2540 Self::ClosureUseClauseVariable(node) => node.span(),
2541 Self::Function(node) => node.span(),
2542 Self::FunctionLikeParameter(node) => node.span(),
2543 Self::FunctionLikeParameterDefaultValue(node) => node.span(),
2544 Self::FunctionLikeParameterList(node) => node.span(),
2545 Self::FunctionLikeReturnTypeHint(node) => node.span(),
2546 Self::Global(node) => node.span(),
2547 Self::Goto(node) => node.span(),
2548 Self::Label(node) => node.span(),
2549 Self::HaltCompiler(node) => node.span(),
2550 Self::FullyQualifiedIdentifier(node) => node.span(),
2551 Self::Identifier(node) => node.span(),
2552 Self::LocalIdentifier(node) => node.span(),
2553 Self::QualifiedIdentifier(node) => node.span(),
2554 Self::Inline(node) => node.span(),
2555 Self::Instantiation(node) => node.span(),
2556 Self::Keyword(node) => node.span(),
2557 Self::Literal(node) => node.span(),
2558 Self::LiteralFloat(node) => node.span(),
2559 Self::LiteralInteger(node) => node.span(),
2560 Self::LiteralString(node) => node.span(),
2561 Self::MagicConstant(node) => node.span(),
2562 Self::Modifier(node) => node.span(),
2563 Self::Namespace(node) => node.span(),
2564 Self::NamespaceBody(node) => node.span(),
2565 Self::NamespaceImplicitBody(node) => node.span(),
2566 Self::Assignment(node) => node.span(),
2567 Self::AssignmentOperator(node) => node.span(),
2568 Self::Conditional(node) => node.span(),
2569 Self::DoWhile(node) => node.span(),
2570 Self::Foreach(node) => node.span(),
2571 Self::ForeachBody(node) => node.span(),
2572 Self::ForeachColonDelimitedBody(node) => node.span(),
2573 Self::ForeachKeyValueTarget(node) => node.span(),
2574 Self::ForeachTarget(node) => node.span(),
2575 Self::ForeachValueTarget(node) => node.span(),
2576 Self::For(node) => node.span(),
2577 Self::ForBody(node) => node.span(),
2578 Self::ForColonDelimitedBody(node) => node.span(),
2579 Self::While(node) => node.span(),
2580 Self::WhileBody(node) => node.span(),
2581 Self::WhileColonDelimitedBody(node) => node.span(),
2582 Self::Break(node) => node.span(),
2583 Self::Continue(node) => node.span(),
2584 Self::Return(node) => node.span(),
2585 Self::Static(node) => node.span(),
2586 Self::StaticAbstractItem(node) => node.span(),
2587 Self::StaticConcreteItem(node) => node.span(),
2588 Self::StaticItem(node) => node.span(),
2589 Self::Try(node) => node.span(),
2590 Self::TryCatchClause(node) => node.span(),
2591 Self::TryFinallyClause(node) => node.span(),
2592 Self::MaybeTypedUseItem(node) => node.span(),
2593 Self::MixedUseItemList(node) => node.span(),
2594 Self::TypedUseItemList(node) => node.span(),
2595 Self::TypedUseItemSequence(node) => node.span(),
2596 Self::Use(node) => node.span(),
2597 Self::UseItem(node) => node.span(),
2598 Self::UseItemAlias(node) => node.span(),
2599 Self::UseItemSequence(node) => node.span(),
2600 Self::UseItems(node) => node.span(),
2601 Self::UseType(node) => node.span(),
2602 Self::Yield(node) => node.span(),
2603 Self::YieldFrom(node) => node.span(),
2604 Self::YieldPair(node) => node.span(),
2605 Self::YieldValue(node) => node.span(),
2606 Self::Statement(node) => node.span(),
2607 Self::ExpressionStatement(node) => node.span(),
2608 Self::BracedExpressionStringPart(node) => node.span(),
2609 Self::DocumentString(node) => node.span(),
2610 Self::InterpolatedString(node) => node.span(),
2611 Self::LiteralStringPart(node) => node.span(),
2612 Self::ShellExecuteString(node) => node.span(),
2613 Self::CompositeString(node) => node.span(),
2614 Self::StringPart(node) => node.span(),
2615 Self::ClosingTag(node) => node.span(),
2616 Self::EchoTag(node) => node.span(),
2617 Self::FullOpeningTag(node) => node.span(),
2618 Self::OpeningTag(node) => node.span(),
2619 Self::ShortOpeningTag(node) => node.span(),
2620 Self::Terminator(node) => node.span(),
2621 Self::Throw(node) => node.span(),
2622 Self::Hint(node) => node.span(),
2623 Self::IntersectionHint(node) => node.span(),
2624 Self::NullableHint(node) => node.span(),
2625 Self::ParenthesizedHint(node) => node.span(),
2626 Self::UnionHint(node) => node.span(),
2627 Self::Unset(node) => node.span(),
2628 Self::DirectVariable(node) => node.span(),
2629 Self::IndirectVariable(node) => node.span(),
2630 Self::NestedVariable(node) => node.span(),
2631 Self::Variable(node) => node.span(),
2632 Self::Pipe(node) => node.span(),
2633 Self::Error(span)
2634 | Self::MissingTerminator(span)
2635 | Self::ClassLikeMemberMissingSelector(span)
2636 | Self::ClassLikeConstantMissingSelector(span) => *span,
2637 }
2638 }
2639}