Skip to main content

mago_syntax/cst/
node.rs

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