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