Skip to main content

mago_syntax/cst/
node.rs

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