diff --git a/pkg/analyzer/lib/src/dart/resolver/instance_creation_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/instance_creation_expression_resolver.dart
index 1b23467..625037b 100644
--- a/pkg/analyzer/lib/src/dart/resolver/instance_creation_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/instance_creation_expression_resolver.dart
@@ -120,7 +120,7 @@
     _inferArgumentTypes(node);
     _resolver.visitArgumentList(node.argumentList,
         whyNotPromotedList: whyNotPromotedList);
-    node.accept(_resolver.elementResolver);
+    _resolver.elementResolver.visitInstanceCreationExpression(node);
     _resolver.typeAnalyzer.visitInstanceCreationExpression(node);
     _resolver.checkForArgumentTypesNotAssignableInList(
         node.argumentList, whyNotPromotedList);
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 2dc6017..b32cea7 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
@@ -74,7 +73,7 @@
 /// undeclared variables (which is an error) and names in hide and show
 /// combinators that are not defined in the imported library (which is not an
 /// error).
-class ElementResolver extends SimpleAstVisitor<void> {
+class ElementResolver {
   /// The resolver driving this participant.
   final ResolverVisitor _resolver;
 
@@ -112,24 +111,19 @@
 
   TypeProviderImpl get _typeProvider => _resolver.typeProvider;
 
-  @override
   void visitClassDeclaration(ClassDeclaration node) {
     _resolveAnnotations(node.metadata);
   }
 
-  @override
   void visitClassTypeAlias(ClassTypeAlias node) {
     _resolveAnnotations(node.metadata);
   }
 
-  @override
   void visitCommentReference(CommentReference node) {
     _commentReferenceResolver.resolve(node);
   }
 
-  @override
   void visitConstructorDeclaration(ConstructorDeclaration node) {
-    super.visitConstructorDeclaration(node);
     ConstructorElement element = node.declaredElement!;
     if (element is ConstructorElementImpl) {
       var redirectedNode = node.redirectedConstructor;
@@ -150,7 +144,6 @@
     }
   }
 
-  @override
   void visitConstructorFieldInitializer(
       covariant ConstructorFieldInitializerImpl node) {
     var fieldName = node.fieldName;
@@ -159,7 +152,6 @@
     fieldName.staticElement = fieldElement;
   }
 
-  @override
   void visitConstructorName(covariant ConstructorNameImpl node) {
     var type = node.type2.type;
     if (type == null) {
@@ -183,22 +175,18 @@
     }
   }
 
-  @override
   void visitDeclaredIdentifier(DeclaredIdentifier node) {
     _resolveAnnotations(node.metadata);
   }
 
-  @override
   void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
     _resolveAnnotations(node.metadata);
   }
 
-  @override
   void visitEnumDeclaration(EnumDeclaration node) {
     _resolveAnnotations(node.metadata);
   }
 
-  @override
   void visitExportDirective(ExportDirective node) {
     var exportElement = node.element;
     if (exportElement != null) {
@@ -210,43 +198,34 @@
     }
   }
 
-  @override
   void visitExtensionDeclaration(ExtensionDeclaration node) {
     _resolveAnnotations(node.metadata);
   }
 
-  @override
   void visitFieldDeclaration(FieldDeclaration node) {
     _resolveAnnotations(node.metadata);
   }
 
-  @override
   void visitFieldFormalParameter(FieldFormalParameter node) {
     _resolveMetadataForParameter(node);
-    super.visitFieldFormalParameter(node);
   }
 
-  @override
   void visitFunctionDeclaration(FunctionDeclaration node) {
     _resolveAnnotations(node.metadata);
   }
 
-  @override
   void visitFunctionTypeAlias(FunctionTypeAlias node) {
     _resolveAnnotations(node.metadata);
   }
 
-  @override
   void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     _resolveMetadataForParameter(node);
   }
 
-  @override
   void visitGenericTypeAlias(GenericTypeAlias node) {
     _resolveAnnotations(node.metadata);
   }
 
-  @override
   void visitImportDirective(covariant ImportDirectiveImpl node) {
     var prefixNode = node.prefix;
     if (prefixNode != null) {
@@ -272,7 +251,6 @@
     }
   }
 
-  @override
   void visitInstanceCreationExpression(
       covariant InstanceCreationExpressionImpl node) {
     var invokedConstructor = node.constructorName.staticElement;
@@ -284,17 +262,14 @@
     }
   }
 
-  @override
   void visitLibraryDirective(LibraryDirective node) {
     _resolveAnnotations(node.metadata);
   }
 
-  @override
   void visitMethodDeclaration(MethodDeclaration node) {
     _resolveAnnotations(node.metadata);
   }
 
-  @override
   void visitMethodInvocation(MethodInvocation node,
       {List<WhyNotPromotedGetter>? whyNotPromotedList}) {
     whyNotPromotedList ??= [];
@@ -302,22 +277,18 @@
         node as MethodInvocationImpl, whyNotPromotedList);
   }
 
-  @override
   void visitMixinDeclaration(MixinDeclaration node) {
     _resolveAnnotations(node.metadata);
   }
 
-  @override
   void visitPartDirective(PartDirective node) {
     _resolveAnnotations(node.metadata);
   }
 
-  @override
   void visitPartOfDirective(PartOfDirective node) {
     _resolveAnnotations(node.metadata);
   }
 
-  @override
   void visitRedirectingConstructorInvocation(
       covariant RedirectingConstructorInvocationImpl node) {
     var enclosingClass = _resolver.enclosingClass;
@@ -348,12 +319,10 @@
     }
   }
 
-  @override
   void visitSimpleFormalParameter(SimpleFormalParameter node) {
     _resolveMetadataForParameter(node);
   }
 
-  @override
   void visitSuperConstructorInvocation(
       covariant SuperConstructorInvocationImpl node) {
     var enclosingClass = _resolver.enclosingClass;
@@ -416,7 +385,6 @@
     }
   }
 
-  @override
   void visitSuperExpression(SuperExpression node) {
     var context = SuperContext.of(node);
     if (context == SuperContext.annotation || context == SuperContext.static) {
@@ -426,20 +394,16 @@
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.SUPER_IN_EXTENSION, node);
     }
-    super.visitSuperExpression(node);
   }
 
-  @override
   void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     _resolveAnnotations(node.metadata);
   }
 
-  @override
   void visitTypeParameter(TypeParameter node) {
     _resolveAnnotations(node.metadata);
   }
 
-  @override
   void visitVariableDeclarationList(VariableDeclarationList node) {
     _resolveAnnotations(node.metadata);
   }
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index ad205a7..ad8e1da 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1062,7 +1062,6 @@
   void visitAdjacentStrings(AdjacentStrings node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
     typeAnalyzer.visitAdjacentStrings(node as AdjacentStringsImpl);
   }
 
@@ -1152,14 +1151,12 @@
       flow?.equalityOp_end(
           node.parent as Expression, secondArg, secondArg.typeOrThrow);
     }
-    node.accept(elementResolver);
   }
 
   @override
   void visitAsExpression(AsExpression node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
     typeAnalyzer.visitAsExpression(node as AsExpressionImpl);
     flowAnalysis.asExpression(node);
     insertGenericFunctionInstantiation(node);
@@ -1210,7 +1207,6 @@
     }
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
     typeAnalyzer.visitAwaitExpression(node as AwaitExpressionImpl);
     insertGenericFunctionInstantiation(node);
   }
@@ -1230,7 +1226,6 @@
   void visitBlock(Block node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
@@ -1240,7 +1235,6 @@
       _thisAccessTracker.enterFunctionBody(node);
       checkUnreachableNode(node);
       node.visitChildren(this);
-      node.accept(elementResolver);
     } finally {
       _thisAccessTracker.exitFunctionBody(node);
       inferenceContext.popFunctionBodyContext(node);
@@ -1252,7 +1246,6 @@
     flowAnalysis.flow?.booleanLiteral(node, node.value);
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
     typeAnalyzer.visitBooleanLiteral(node as BooleanLiteralImpl);
   }
 
@@ -1263,7 +1256,6 @@
     // of the statement.
     //
     checkUnreachableNode(node);
-    node.accept(elementResolver);
     flowAnalysis.breakStatement(node);
   }
 
@@ -1280,7 +1272,6 @@
 
     node.cascadeSections.accept(this);
 
-    node.accept(elementResolver);
     typeAnalyzer.visitCascadeExpression(node);
 
     nullShortingTermination(node);
@@ -1290,7 +1281,6 @@
   void visitCatchClause(CatchClause node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
@@ -1303,7 +1293,7 @@
       enclosingClass = node.declaredElement;
       checkUnreachableNode(node);
       node.visitChildren(this);
-      node.accept(elementResolver);
+      elementResolver.visitClassDeclaration(node);
     } finally {
       enclosingClass = outerType;
     }
@@ -1313,14 +1303,13 @@
   void visitClassTypeAlias(ClassTypeAlias node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
+    elementResolver.visitClassTypeAlias(node);
   }
 
   @override
   void visitComment(Comment node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
@@ -1329,7 +1318,7 @@
     // We do not visit the expression because it needs to be visited in the
     // context of the reference.
     //
-    node.accept(elementResolver);
+    elementResolver.visitCommentReference(node);
   }
 
   @override
@@ -1344,7 +1333,6 @@
     for (int i = 0; i < declarationCount; i++) {
       declarations[i].accept(this);
     }
-    node.accept(elementResolver);
   }
 
   @override
@@ -1383,7 +1371,6 @@
     }
     elseExpression = node.elseExpression;
 
-    node.accept(elementResolver);
     typeAnalyzer.visitConditionalExpression(node as ConditionalExpressionImpl);
   }
 
@@ -1408,7 +1395,7 @@
       _setupThisType();
       checkUnreachableNode(node);
       node.visitChildren(this);
-      node.accept(elementResolver);
+      elementResolver.visitConstructorDeclaration(node);
     } finally {
       _enclosingFunction = outerFunction;
       _thisType = null;
@@ -1438,7 +1425,8 @@
     expression.accept(this);
     expression = node.expression;
     var whyNotPromoted = flowAnalysis.flow?.whyNotPromoted(expression);
-    node.accept(elementResolver);
+    elementResolver.visitConstructorFieldInitializer(
+        node as ConstructorFieldInitializerImpl);
     if (fieldElement != null) {
       if (fieldType != null && expression.staticType != null) {
         var callReference = insertImplicitCallReference(expression);
@@ -1457,7 +1445,7 @@
   @override
   void visitConstructorName(ConstructorName node) {
     node.type2.accept(this);
-    node.accept(elementResolver);
+    elementResolver.visitConstructorName(node as ConstructorNameImpl);
   }
 
   @override
@@ -1469,7 +1457,6 @@
   void visitConstructorSelector(ConstructorSelector node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
@@ -1479,7 +1466,6 @@
     // of the statement.
     //
     checkUnreachableNode(node);
-    node.accept(elementResolver);
     flowAnalysis.continueStatement(node);
   }
 
@@ -1487,7 +1473,7 @@
   void visitDeclaredIdentifier(DeclaredIdentifier node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
+    elementResolver.visitDeclaredIdentifier(node);
   }
 
   @override
@@ -1495,7 +1481,6 @@
     InferenceContext.setType(node.defaultValue, node.declaredElement?.type);
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
     ParameterElement element = node.declaredElement!;
 
     if (element is DefaultParameterElementImpl && node.isOfLocalFunction) {
@@ -1527,7 +1512,6 @@
   void visitDoubleLiteral(DoubleLiteral node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
     typeAnalyzer.visitDoubleLiteral(node as DoubleLiteralImpl);
   }
 
@@ -1538,21 +1522,18 @@
     }
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
   void visitEmptyStatement(EmptyStatement node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
   void visitEnumConstantArguments(EnumConstantArguments node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
@@ -1560,7 +1541,7 @@
     node.metadata.accept(this);
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
+    elementResolver.visitEnumConstantDeclaration(node);
   }
 
   @override
@@ -1573,7 +1554,7 @@
       enclosingClass = node.declaredElement;
       checkUnreachableNode(node);
       node.visitChildren(this);
-      node.accept(elementResolver);
+      elementResolver.visitEnumDeclaration(node);
     } finally {
       enclosingClass = outerType;
     }
@@ -1583,7 +1564,7 @@
   void visitExportDirective(ExportDirective node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
+    elementResolver.visitExportDirective(node);
   }
 
   @override
@@ -1602,7 +1583,6 @@
 
       checkUnreachableNode(node);
       node.visitChildren(this);
-      node.accept(elementResolver);
       insertImplicitCallReference(node.expression);
 
       flowAnalysis.flow?.handleExit();
@@ -1618,14 +1598,12 @@
   void visitExpressionStatement(ExpressionStatement node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
   void visitExtendsClause(ExtendsClause node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
@@ -1635,7 +1613,7 @@
       enclosingExtension = node.declaredElement!;
       checkUnreachableNode(node);
       node.visitChildren(this);
-      node.accept(elementResolver);
+      elementResolver.visitExtensionDeclaration(node);
     } finally {
       enclosingExtension = outerExtension;
     }
@@ -1651,7 +1629,6 @@
     visitArgumentList(node.argumentList,
         whyNotPromotedList: whyNotPromotedList);
 
-    node.accept(elementResolver);
     extensionResolver.resolveOverride(node, whyNotPromotedList);
   }
 
@@ -1663,7 +1640,7 @@
       _setupThisType();
       checkUnreachableNode(node);
       node.visitChildren(this);
-      node.accept(elementResolver);
+      elementResolver.visitFieldDeclaration(node);
     } finally {
       _thisAccessTracker.exitFieldDeclaration(node);
       _thisType = null;
@@ -1674,7 +1651,7 @@
   void visitFieldFormalParameter(FieldFormalParameter node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
+    elementResolver.visitFieldFormalParameter(node);
   }
 
   @override
@@ -1686,7 +1663,6 @@
   void visitFormalParameterList(FormalParameterList node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
@@ -1719,7 +1695,7 @@
       _enclosingFunction = node.declaredElement;
       checkUnreachableNode(node);
       node.visitChildren(this);
-      node.accept(elementResolver);
+      elementResolver.visitFunctionDeclaration(node);
     } finally {
       _enclosingFunction = outerFunction;
     }
@@ -1746,7 +1722,6 @@
   void visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
@@ -1781,28 +1756,27 @@
   void visitFunctionTypeAlias(FunctionTypeAlias node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
+    elementResolver.visitFunctionTypeAlias(node);
   }
 
   @override
   void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
+    elementResolver.visitFunctionTypedFormalParameter(node);
   }
 
   @override
   void visitGenericFunctionType(GenericFunctionType node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
   void visitGenericTypeAlias(GenericTypeAlias node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
+    elementResolver.visitGenericTypeAlias(node);
   }
 
   @override
@@ -1832,8 +1806,6 @@
     }
 
     flowAnalysis.flow?.ifStatement_end(elseElement != null);
-
-    node.accept(elementResolver);
   }
 
   @override
@@ -1863,29 +1835,25 @@
     }
 
     flowAnalysis.flow?.ifStatement_end(elseStatement != null);
-
-    node.accept(elementResolver);
   }
 
   @override
   void visitImplementsClause(ImplementsClause node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
   void visitImplicitCallReference(ImplicitCallReference node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
   void visitImportDirective(ImportDirective node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
+    elementResolver.visitImportDirective(node as ImportDirectiveImpl);
   }
 
   @override
@@ -1936,7 +1904,6 @@
   void visitIntegerLiteral(IntegerLiteral node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
     typeAnalyzer.visitIntegerLiteral(node);
   }
 
@@ -1944,21 +1911,18 @@
   void visitInterpolationExpression(InterpolationExpression node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
   void visitInterpolationString(InterpolationString node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
   void visitIsExpression(IsExpression node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
     typeAnalyzer.visitIsExpression(node as IsExpressionImpl);
     flowAnalysis.isExpression(node);
   }
@@ -1971,7 +1935,6 @@
     flowAnalysis.labeledStatement_enter(node);
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
     flowAnalysis.labeledStatement_exit(node);
   }
 
@@ -1979,7 +1942,7 @@
   void visitLibraryDirective(LibraryDirective node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
+    elementResolver.visitLibraryDirective(node);
   }
 
   @override
@@ -1995,7 +1958,6 @@
   void visitMapLiteralEntry(MapLiteralEntry node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
@@ -2013,7 +1975,7 @@
       _setupThisType();
       checkUnreachableNode(node);
       node.visitChildren(this);
-      node.accept(elementResolver);
+      elementResolver.visitMethodDeclaration(node);
     } finally {
       _enclosingFunction = outerFunction;
       _thisType = null;
@@ -2078,7 +2040,7 @@
       enclosingClass = node.declaredElement!;
       checkUnreachableNode(node);
       node.visitChildren(this);
-      node.accept(elementResolver);
+      elementResolver.visitMixinDeclaration(node);
     } finally {
       enclosingClass = outerType;
     }
@@ -2089,7 +2051,6 @@
     InferenceContext.setTypeFromNode(node.expression, node);
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
     typeAnalyzer.visitNamedExpression(node as NamedExpressionImpl);
     // Any "why not promoted" information that flow analysis had associated with
     // `node.expression` now needs to be forwarded to `node`, so that when
@@ -2110,14 +2071,12 @@
   void visitNativeClause(NativeClause node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
   void visitNativeFunctionBody(NativeFunctionBody node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
@@ -2125,7 +2084,6 @@
     flowAnalysis.flow?.nullLiteral(node);
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
     typeAnalyzer.visitNullLiteral(node as NullLiteralImpl);
   }
 
@@ -2133,7 +2091,6 @@
   void visitOnClause(OnClause node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
@@ -2141,7 +2098,6 @@
     InferenceContext.setTypeFromNode(node.expression, node);
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
     typeAnalyzer
         .visitParenthesizedExpression(node as ParenthesizedExpressionImpl);
     flowAnalysis.flow?.parenthesizedExpression(node, node.expression);
@@ -2151,14 +2107,14 @@
   void visitPartDirective(PartDirective node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
+    elementResolver.visitPartDirective(node);
   }
 
   @override
   void visitPartOfDirective(PartOfDirective node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
+    elementResolver.visitPartOfDirective(node);
   }
 
   @override
@@ -2232,7 +2188,8 @@
     // invocation.
     //
     var whyNotPromotedList = <Map<DartType, NonPromotionReason> Function()>[];
-    node.accept(elementResolver);
+    elementResolver.visitRedirectingConstructorInvocation(
+        node as RedirectingConstructorInvocationImpl);
     InferenceContext.setType(node.argumentList, node.staticElement?.type);
     visitArgumentList(node.argumentList,
         whyNotPromotedList: whyNotPromotedList);
@@ -2244,7 +2201,6 @@
   void visitRethrowExpression(RethrowExpression node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
     typeAnalyzer.visitRethrowExpression(node as RethrowExpressionImpl);
     flowAnalysis.flow?.handleExit();
   }
@@ -2258,7 +2214,6 @@
 
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
 
     inferenceContext.bodyContext?.addReturnExpression(node.expression);
     flowAnalysis.flow?.handleExit();
@@ -2282,7 +2237,7 @@
   void visitSimpleFormalParameter(SimpleFormalParameter node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
+    elementResolver.visitSimpleFormalParameter(node);
   }
 
   @override
@@ -2295,7 +2250,6 @@
   void visitSimpleStringLiteral(SimpleStringLiteral node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
     typeAnalyzer.visitSimpleStringLiteral(node as SimpleStringLiteralImpl);
   }
 
@@ -2303,7 +2257,6 @@
   void visitSpreadElement(SpreadElement node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
 
     if (!node.isNullAware) {
       nullableDereferenceVerifier.expression(
@@ -2317,7 +2270,6 @@
   void visitStringInterpolation(StringInterpolation node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
     typeAnalyzer.visitStringInterpolation(node as StringInterpolationImpl);
   }
 
@@ -2329,7 +2281,8 @@
     // invocation.
     //
     var whyNotPromotedList = <Map<DartType, NonPromotionReason> Function()>[];
-    node.accept(elementResolver);
+    elementResolver.visitSuperConstructorInvocation(
+        node as SuperConstructorInvocationImpl);
     InferenceContext.setType(node.argumentList, node.staticElement?.type);
     visitArgumentList(node.argumentList,
         whyNotPromotedList: whyNotPromotedList);
@@ -2341,7 +2294,7 @@
   void visitSuperExpression(SuperExpression node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
+    elementResolver.visitSuperExpression(node);
     typeAnalyzer.visitSuperExpression(node as SuperExpressionImpl);
   }
 
@@ -2349,7 +2302,6 @@
   void visitSuperFormalParameter(SuperFormalParameter node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
@@ -2360,7 +2312,6 @@
         node.expression, _enclosingSwitchStatementExpressionType);
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
 
     var flow = flowAnalysis.flow;
     if (flow != null && flow.isReachable && _isNonNullableByDefault) {
@@ -2380,7 +2331,6 @@
   void visitSwitchDefault(SwitchDefault node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
     nullSafetyDeadCodeVerifier.flowEnd(node);
   }
 
@@ -2422,7 +2372,6 @@
   void visitSymbolLiteral(SymbolLiteral node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
     typeAnalyzer.visitSymbolLiteral(node as SymbolLiteralImpl);
   }
 
@@ -2430,7 +2379,6 @@
   void visitThisExpression(ThisExpression node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
     typeAnalyzer.visitThisExpression(node as ThisExpressionImpl);
   }
 
@@ -2438,7 +2386,6 @@
   void visitThrowExpression(ThrowExpression node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
     typeAnalyzer.visitThrowExpression(node as ThrowExpressionImpl);
     flowAnalysis.flow?.handleExit();
   }
@@ -2447,7 +2394,7 @@
   void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
+    elementResolver.visitTopLevelVariableDeclaration(node);
   }
 
   @override
@@ -2501,28 +2448,25 @@
   void visitTypeArgumentList(TypeArgumentList node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
   void visitTypeLiteral(TypeLiteral node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
   void visitTypeParameter(TypeParameter node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
+    elementResolver.visitTypeParameter(node);
   }
 
   @override
   void visitTypeParameterList(TypeParameterList node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
@@ -2553,14 +2497,13 @@
     }
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
+    elementResolver.visitVariableDeclarationList(node);
   }
 
   @override
   void visitVariableDeclarationStatement(VariableDeclarationStatement node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
@@ -2584,14 +2527,12 @@
     nullSafetyDeadCodeVerifier.flowEnd(node.body);
     // TODO(brianwilkerson) If the loop can only be exited because the condition
     // is false, then propagateFalseState(condition);
-    node.accept(elementResolver);
   }
 
   @override
   void visitWithClause(WithClause node) {
     checkUnreachableNode(node);
     node.visitChildren(this);
-    node.accept(elementResolver);
   }
 
   @override
