Skip to content

Commit 42830f7

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Add ElementVisitor2.
Change-Id: I028a37d4ed1f1df408950cb665aa3c7d3d191978 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/389593 Reviewed-by: Phil Quitslund <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 9baaa5f commit 42830f7

File tree

4 files changed

+830
-2
lines changed

4 files changed

+830
-2
lines changed

pkg/analyzer/lib/dart/element/element2.dart

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,12 @@ abstract class Element2 {
497497
/// The analysis session in which this element is defined.
498498
AnalysisSession? get session;
499499

500+
/// Uses the given [visitor] to visit this element.
501+
///
502+
/// Returns the value returned by the visitor as a result of visiting this
503+
/// element.
504+
T? accept2<T>(ElementVisitor2<T> visitor);
505+
500506
/// The presentation of this element as it should appear when presented to
501507
/// users.
502508
///
@@ -535,6 +541,71 @@ abstract class Element2 {
535541
///
536542
/// Returns `null` if there is no such element.
537543
E? thisOrAncestorOfType2<E extends Element2>();
544+
545+
/// Uses the given [visitor] to visit all of the children of this element.
546+
/// There is no guarantee of the order in which the children will be visited.
547+
void visitChildren2<T>(ElementVisitor2<T> visitor);
548+
}
549+
550+
/// An object that can be used to visit an element structure.
551+
///
552+
/// Clients may not extend, implement or mix-in this class. There are classes
553+
/// that implement this interface that provide useful default behaviors in
554+
/// `package:analyzer/dart/element/visitor.dart`. A couple of the most useful
555+
/// include
556+
/// * SimpleElementVisitor which implements every visit method by doing nothing,
557+
/// * RecursiveElementVisitor which will cause every node in a structure to be
558+
/// visited, and
559+
/// * ThrowingElementVisitor which implements every visit method by throwing an
560+
/// exception.
561+
abstract class ElementVisitor2<R> {
562+
R? visitClassElement(ClassElement2 element);
563+
564+
R? visitConstructorElement(ConstructorElement2 element);
565+
566+
R? visitEnumElement(EnumElement2 element);
567+
568+
R? visitExtensionElement(ExtensionElement2 element);
569+
570+
R? visitExtensionTypeElement(ExtensionTypeElement2 element);
571+
572+
R? visitFieldElement(FieldElement2 element);
573+
574+
R? visitFieldFormalParameterElement(FieldFormalParameterElement2 element);
575+
576+
R? visitFormalParameterElement(FormalParameterElement element);
577+
578+
R? visitGenericFunctionTypeElement(GenericFunctionTypeElement2 element);
579+
580+
R? visitGetterElement(GetterElement element);
581+
582+
R? visitLabelElement(LabelElement2 element);
583+
584+
R? visitLibraryElement(LibraryElement2 element);
585+
586+
R? visitLocalFunctionElement(LocalFunctionElement element);
587+
588+
R? visitLocalVariableElement(LocalVariableElement2 element);
589+
590+
R? visitMethodElement(MethodElement2 element);
591+
592+
R? visitMixinElement(MixinElement2 element);
593+
594+
R? visitMultiplyDefinedElement(MultiplyDefinedElement2 element);
595+
596+
R? visitPrefixElement(PrefixElement2 element);
597+
598+
R? visitSetterElement(SetterElement element);
599+
600+
R? visitSuperFormalParameterElement(SuperFormalParameterElement2 element);
601+
602+
R? visitTopLevelFunctionElement(TopLevelFunctionElement element);
603+
604+
R? visitTopLevelVariableElement(TopLevelVariableElement2 element);
605+
606+
R? visitTypeAliasElement(TypeAliasElement2 element);
607+
608+
R? visitTypeParameterElement(TypeParameterElement2 element);
538609
}
539610

540611
/// An element that represents an enum.

0 commit comments

Comments
 (0)