diff --git a/DEPS b/DEPS
index 5c90859..ff0a30e 100644
--- a/DEPS
+++ b/DEPS
@@ -108,7 +108,7 @@
   # For more details, see https://github.com/dart-lang/sdk/issues/30164.
   "dart_style_rev": "d7b73536a8079331c888b7da539b80e6825270ea", # manually rev'd
 
-  "dartdoc_rev": "d7513b2ee0a9bad6c9526f6b0ba970b4fcca17d0",
+  "dartdoc_rev": "7edeeeb20a506cadec3788c273fdee6cad91e07c",
   "devtools_rev": "d131d19091f6b89ac89486bd92440a25a523e8b0",
   "ffi_rev": "18b2b549d55009ff594600b04705ff6161681e07",
   "file_rev": "0132eeedea2933513bf230513a766a8baeab0c4f",
@@ -116,10 +116,10 @@
   "glob_rev": "1d51fcc172e5adfbae6e82c3f8f119774cb2fca2",
   "html_rev": "8243e967caad9932c13971af3b2a7c8f028383d5",
   "http_multi_server_rev": "20bf079c8955d1250a45afb9cb096472a724a551",
-  "http_parser_rev": "d25b3c9e7f23e31ac388a03361737110768597f6",
+  "http_parser_rev": "b968f7ddde0588273a6cbd1d2eb6569f418606ac",
   "http_rev": "5055b684ae45fb141a106ef6ced988aa37ed0ea6",
   "icu_rev": "81d656878ec611cb0b42d52c82e9dae93920d9ba",
-  "intl_rev": "64dccc499162bebecb1ee29dc994f3e0c1416e96",
+  "intl_rev": "7e3a1bbdeff241323f56295d8991c004bef815e6",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_rev": "805e6536dd961d66f6b8cd46d8f3e61774f957c9",
   "linter_rev": "b4afc10055f3009478da1eac1827f9fef42c3759", # 1.26.0
@@ -129,15 +129,15 @@
   "markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
   "matcher_rev": "cba63ebf8ed1daeffd5f3c55fd30085152c4512d",
   "mime_rev": "0a75a41445eb642674a0a271eecde78cb025ee60",
-  "mockito_rev": "d8a2ddd2054390bd03d34bf64c940884e6f7a596",
+  "mockito_rev": "2acf22f4d400c6e1eee0f6ca595092220fba8b34",
   "oauth2_rev": "199ebf15cbd5b07958438184f32e41c4447a57bf",
   "package_config_rev": "cff98c90acc457a3b0750f0a7da0e351a35e5d0c",
   "path_rev": "9955b27b9bb98d87591208e19eb01c51d29fd467",
   "ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_rev": "fa84ddd0e39f45bf3f09dcc5d6b9fbdda7820fef",
-  "protobuf_rev": "9aad6aadcc0fc616051c7e0eaef78c26b3dd7b60",
+  "protobuf_rev": "504eefeae9892602ea50c20159db1db3768012a9",
   "pub_rev": "9bf4289d6fd5d6872a8929d6312bbd7098f3ea9c", # manually rev'd
-  "pub_semver_rev": "5c0b4bfd5ca57fe16f1319c581dc8c882e9b8cb2",
+  "pub_semver_rev": "9fd28757ba45961ac5449e0f2b0020670e921475",
   "root_certificates_rev": "692f6d6488af68e0121317a9c2c9eb393eb0ee50",
   "shelf_rev": "0371a64bd3b99044ee3158bacf8813bba735a9c7",
   "source_map_stack_trace_rev": "72dbf21a33293b2b8434d0a9751e36f9463981ac",
@@ -149,10 +149,10 @@
   "string_scanner_rev": "2d84b16d8ae03c3a8c2417b71abe0fe6de7d8bf6",
   "sync_http_rev": "39509d69fd5a9c3da46eab48fcafdf62e6ad4580",
   "term_glyph_rev": "ec7cf7bb51ebb7d55760a1359f6697690dbc06ba",
-  "test_descriptor_rev": "c21e15daa3a22a7066f081d4d30aa5cae8b5de36",
+  "test_descriptor_rev": "f392f85a9804349976be041616ef66925cee8a91",
   "test_process_rev": "3e695bcfeab551473ddc288970f345f30e5e1375",
   "test_reflective_loader_rev": "8d0de01bbe852fea1f8e33aba907abcba50a8a1e",
-  "test_rev": "b144a336776eaa1f9420f3ab38214d8c061c663e",
+  "test_rev": "aba7de5851ace64f1f887369ae9424582d9d4d7f",
   "typed_data_rev": "bb10b64f9a56b8fb49307d4465474bf1c1309f6d",
   "usage_rev": "e287a72228974886d8a3b40ddcdf12f69d7c6a22",
   "vector_math_rev": "09ba4fa74e668177211f917a1c14789cd05d3cab",
@@ -160,7 +160,7 @@
   "web_components_rev": "8f57dac273412a7172c8ade6f361b407e2e4ed02",
   "web_socket_channel_rev": "99dbdc5769e19b9eeaf69449a59079153c6a8b1f",
   "WebCore_rev": "bcb10901266c884e7b3740abc597ab95373ab55c",
-  "webdev_rev": "27cc5c9228ca59e721bc41fe7028e0fd6b995748",
+  "webdev_rev": "37bf4af1b0961f053e7cf4990a34ca5fd0ad0fd4",
   "webdriver_rev": "e1a9ad671ee82e05eee463f922a34585ed2d2f15",
   "webkit_inspection_protocol_rev": "57522d6b29d94903b765c757079d906555d5a171",
   "yaml_edit_rev": "01589b3ce447b03aed991db49f1ec6445ad5476d",
diff --git a/pkg/analysis_server/lib/src/cider/rename.dart b/pkg/analysis_server/lib/src/cider/rename.dart
index 73f1716..3ff2d18 100644
--- a/pkg/analysis_server/lib/src/cider/rename.dart
+++ b/pkg/analysis_server/lib/src/cider/rename.dart
@@ -65,7 +65,7 @@
 
   void _analyzePossibleConflicts(
       ConstructorElement element, RefactoringStatus result, String newName) {
-    var parentClass = element.enclosingElement2;
+    var parentClass = element.enclosingElement3;
     // Check if the "newName" is the name of the enclosing class.
     if (parentClass.name == newName) {
       result.addError('The constructor should not have the same name '
@@ -254,7 +254,7 @@
     var stateName = flutterState.newName;
     var match = await canRename._fileResolver.findReferences2(stateClass);
     var sourcePath = stateClass.source.fullName;
-    var location = stateClass.enclosingElement2.lineInfo
+    var location = stateClass.enclosingElement3.lineInfo
         .getLocation(stateClass.nameOffset);
     CiderSearchMatch ciderMatch;
     var searchInfo =
@@ -297,7 +297,7 @@
 
   Future<CiderReplaceMatch?> _replaceSyntheticConstructor() async {
     var element = canRename.refactoringElement.element;
-    var classElement = element.enclosingElement2;
+    var classElement = element.enclosingElement3;
 
     var fileResolver = canRename._fileResolver;
     var libraryPath = classElement!.library!.source.fullName;
@@ -382,7 +382,7 @@
   }
 
   bool _canRenameElement(Element element) {
-    var enclosingElement = element.enclosingElement2;
+    var enclosingElement = element.enclosingElement3;
     if (element is ConstructorElement) {
       return true;
     }
diff --git a/pkg/analysis_server/lib/src/computer/computer_call_hierarchy.dart b/pkg/analysis_server/lib/src/computer/computer_call_hierarchy.dart
index ca17b51..577c75d4 100644
--- a/pkg/analysis_server/lib/src/computer/computer_call_hierarchy.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_call_hierarchy.dart
@@ -104,7 +104,7 @@
         codeRange = _codeRangeForElement(element),
         file = element.source!.fullName,
         kind = CallHierarchyKind.forElement(element) {
-    final enclosingElement = element.enclosingElement2;
+    final enclosingElement = element.enclosingElement3;
     final container =
         enclosingElement != null ? _getContainer(enclosingElement) : null;
     containerName = container != null ? _getDisplayName(container) : null;
@@ -330,7 +330,7 @@
         }
       }
     } else if (node is ConstructorDeclaration) {
-      final name = node.name;
+      final name = node.name2;
       if (name != null && offset < name.offset) {
         return null;
       }
diff --git a/pkg/analysis_server/lib/src/computer/computer_color.dart b/pkg/analysis_server/lib/src/computer/computer_color.dart
index 21db001..6649356 100644
--- a/pkg/analysis_server/lib/src/computer/computer_color.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_color.dart
@@ -83,7 +83,7 @@
 
     final constructor = expression.constructorName;
     final staticElement = constructor.staticElement;
-    final classElement = staticElement?.enclosingElement2;
+    final classElement = staticElement?.enclosingElement3;
     final className = classElement?.name;
     final constructorName = constructor.name?.name;
     final constructorArgs = expression.argumentList.arguments
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index b74240d..36715bb 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -305,7 +305,7 @@
     var parent = node.parent;
     var isInvocation = parent is MethodInvocation && parent.methodName == node;
     HighlightRegionType type;
-    var isTopLevel = element.enclosingElement2 is CompilationUnitElement;
+    var isTopLevel = element.enclosingElement3 is CompilationUnitElement;
     if (node.inDeclarationContext()) {
       type = isTopLevel
           ? HighlightRegionType.TOP_LEVEL_FUNCTION_DECLARATION
@@ -334,7 +334,7 @@
       return false;
     }
     // getter or setter
-    var isTopLevel = element.enclosingElement2 is CompilationUnitElement;
+    var isTopLevel = element.enclosingElement3 is CompilationUnitElement;
     HighlightRegionType type;
     if (element.isGetter) {
       if (isTopLevel) {
@@ -682,6 +682,14 @@
     computer._addRegion_token(
         node.factoryKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(node.constKeyword, HighlightRegionType.KEYWORD);
+    computer._addRegion_token(
+      node.name2,
+      HighlightRegionType.CONSTRUCTOR,
+      semanticTokenType: SemanticTokenTypes.method,
+      semanticTokenModifiers: {
+        CustomSemanticTokenModifiers.constructor,
+      },
+    );
     super.visitConstructorDeclaration(node);
   }
 
@@ -743,8 +751,8 @@
 
   @override
   void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
-    computer._addRegion_node(
-      node.name,
+    computer._addRegion_token(
+      node.name2,
       HighlightRegionType.ENUM_CONSTANT,
     );
     node.visitChildren(this);
@@ -803,8 +811,8 @@
     if (element is FieldFormalParameterElement) {
       var field = element.field;
       if (field != null) {
-        computer._addRegion_node(
-          node.identifier,
+        computer._addRegion_token(
+          node.name,
           HighlightRegionType.INSTANCE_FIELD_REFERENCE,
         );
       }
@@ -1109,6 +1117,12 @@
 
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
+    final parent = node.parent;
+    // ignore: deprecated_member_use
+    if (parent is ConstructorDeclaration && parent.name == node) {
+      return;
+    }
+
     computer._addIdentifierRegion(node);
     super.visitSimpleIdentifier(node);
   }
@@ -1135,8 +1149,8 @@
       HighlightRegionType.KEYWORD,
     );
 
-    computer._addRegion_node(
-      node.identifier,
+    computer._addRegion_token(
+      node.name,
       HighlightRegionType.PARAMETER_DECLARATION,
     );
 
diff --git a/pkg/analysis_server/lib/src/computer/computer_hover.dart b/pkg/analysis_server/lib/src/computer/computer_hover.dart
index 3ca0f28..bba7cc4 100644
--- a/pkg/analysis_server/lib/src/computer/computer_hover.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_hover.dart
@@ -71,7 +71,7 @@
         hover.elementKind = element.kind.displayName;
         hover.isDeprecated = element.hasDeprecated;
         // not local element
-        if (element.enclosingElement2 is! ExecutableElement) {
+        if (element.enclosingElement3 is! ExecutableElement) {
           // containing class
           var containingClass = element.thisOrAncestorOfType<ClassElement>();
           if (containingClass != null && containingClass != element) {
@@ -152,7 +152,7 @@
       element = element.field;
     }
     if (element is ParameterElement) {
-      element = element.enclosingElement2;
+      element = element.enclosingElement3;
     }
     if (element == null) {
       // This can happen when the code is invalid, such as having a field formal
@@ -197,9 +197,9 @@
     var result =
         dartdocInfo.processDartdoc(rawDoc, includeSummary: includeSummary);
 
-    var documentedElementClass = documentedElement.enclosingElement2;
+    var documentedElementClass = documentedElement.enclosingElement3;
     if (documentedElementClass != null &&
-        documentedElementClass != element.enclosingElement2) {
+        documentedElementClass != element.enclosingElement3) {
       var documentedClass = documentedElementClass.displayName;
       result.full = '${result.full}\n\nCopied from `$documentedClass`.';
     }
diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart
index b0140fd..237e310 100644
--- a/pkg/analysis_server/lib/src/computer/computer_outline.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart
@@ -6,6 +6,7 @@
 import 'package:analysis_server/src/utilities/flutter.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart' as engine;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -90,9 +91,13 @@
         endLine: endLine, endColumn: endColumn);
   }
 
+  Location _getLocationToken(Token token) {
+    return _getLocationOffsetLength(token.offset, token.length);
+  }
+
   Outline _newClassOutline(ClassDeclaration node, List<Outline> classContents) {
-    var nameNode = node.name;
-    var name = nameNode.name;
+    var nameToken = node.name2;
+    var name = nameToken.lexeme;
     var element = Element(
         ElementKind.CLASS,
         name,
@@ -100,14 +105,14 @@
             isPrivate: Identifier.isPrivateName(name),
             isDeprecated: _isDeprecated(node),
             isAbstract: node.abstractKeyword != null),
-        location: _getLocationNode(nameNode),
+        location: _getLocationToken(nameToken),
         typeParameters: _getTypeParametersStr(node.typeParameters));
     return _nodeOutline(node, element, classContents);
   }
 
   Outline _newClassTypeAlias(ClassTypeAlias node) {
-    var nameNode = node.name;
-    var name = nameNode.name;
+    var nameToken = node.name2;
+    var name = nameToken.lexeme;
     var element = Element(
         ElementKind.CLASS_TYPE_ALIAS,
         name,
@@ -115,7 +120,7 @@
             isPrivate: Identifier.isPrivateName(name),
             isDeprecated: _isDeprecated(node),
             isAbstract: node.abstractKeyword != null),
-        location: _getLocationNode(nameNode),
+        location: _getLocationToken(nameToken),
         typeParameters: _getTypeParametersStr(node.typeParameters));
     return _nodeOutline(node, element);
   }
@@ -125,14 +130,14 @@
     var name = returnType.name;
     var offset = returnType.offset;
     var length = returnType.length;
-    var constructorNameNode = constructor.name;
+    var constructorNameToken = constructor.name2;
     var isPrivate = false;
-    if (constructorNameNode != null) {
-      var constructorName = constructorNameNode.name;
+    if (constructorNameToken != null) {
+      var constructorName = constructorNameToken.lexeme;
       isPrivate = Identifier.isPrivateName(constructorName);
       name += '.$constructorName';
-      offset = constructorNameNode.offset;
-      length = constructorNameNode.length;
+      offset = constructorNameToken.offset;
+      length = constructorNameToken.length;
     }
     var parameters = constructor.parameters;
     var parametersStr = _safeToSource(parameters);
@@ -148,50 +153,52 @@
   }
 
   Outline _newEnumConstant(EnumConstantDeclaration node) {
-    var nameNode = node.name;
-    var name = nameNode.name;
+    var nameToken = node.name2;
+    var name = nameToken.lexeme;
     var element = Element(
         ElementKind.ENUM_CONSTANT,
         name,
         Element.makeFlags(
             isPrivate: Identifier.isPrivateName(name),
             isDeprecated: _isDeprecated(node)),
-        location: _getLocationNode(nameNode));
+        location: _getLocationToken(nameToken));
     return _nodeOutline(node, element);
   }
 
   Outline _newEnumOutline(EnumDeclaration node, List<Outline> children) {
-    var nameNode = node.name;
-    var name = nameNode.name;
+    var nameToken = node.name2;
+    var name = nameToken.lexeme;
     var element = Element(
         ElementKind.ENUM,
         name,
         Element.makeFlags(
             isPrivate: Identifier.isPrivateName(name),
             isDeprecated: _isDeprecated(node)),
-        location: _getLocationNode(nameNode));
+        location: _getLocationToken(nameToken));
     return _nodeOutline(node, element, children);
   }
 
   Outline _newExtensionOutline(
       ExtensionDeclaration node, List<Outline> extensionContents) {
-    var nameNode = node.name;
-    var name = nameNode?.name ?? '';
+    var nameToken = node.name2;
+    var name = nameToken?.lexeme ?? '';
     var element = Element(
         ElementKind.EXTENSION,
         name,
         Element.makeFlags(
             isPrivate: Identifier.isPrivateName(name),
             isDeprecated: _isDeprecated(node)),
-        location: _getLocationNode(nameNode ?? node.extendedType),
+        location: nameToken != null
+            ? _getLocationToken(nameToken)
+            : _getLocationNode(node.extendedType),
         typeParameters: _getTypeParametersStr(node.typeParameters));
     return _nodeOutline(node, element, extensionContents);
   }
 
   Outline _newFunctionOutline(FunctionDeclaration function, bool isStatic) {
     var returnType = function.returnType;
-    var nameNode = function.name;
-    var name = nameNode.name;
+    var nameToken = function.name2;
+    var name = nameToken.lexeme;
     var functionExpression = function.functionExpression;
     var parameters = functionExpression.parameters;
     ElementKind kind;
@@ -211,7 +218,7 @@
             isPrivate: Identifier.isPrivateName(name),
             isDeprecated: _isDeprecated(function),
             isStatic: isStatic),
-        location: _getLocationNode(nameNode),
+        location: _getLocationToken(nameToken),
         parameters: parametersStr,
         returnType: returnTypeStr,
         typeParameters:
@@ -222,8 +229,8 @@
 
   Outline _newFunctionTypeAliasOutline(FunctionTypeAlias node) {
     var returnType = node.returnType;
-    var nameNode = node.name;
-    var name = nameNode.name;
+    var nameToken = node.name2;
+    var name = nameToken.lexeme;
     var parameters = node.parameters;
     var parametersStr = _safeToSource(parameters);
     var returnTypeStr = _safeToSource(returnType);
@@ -233,7 +240,7 @@
         Element.makeFlags(
             isPrivate: Identifier.isPrivateName(name),
             isDeprecated: _isDeprecated(node)),
-        location: _getLocationNode(nameNode),
+        location: _getLocationToken(nameToken),
         parameters: parametersStr,
         returnType: returnTypeStr,
         typeParameters: _getTypeParametersStr(node.typeParameters));
@@ -241,8 +248,8 @@
   }
 
   Outline _newGenericTypeAliasOutline(GenericTypeAlias node) {
-    var nameNode = node.name;
-    var name = nameNode.name;
+    var nameToken = node.name2;
+    var name = nameToken.lexeme;
 
     var aliasedType = node.type;
     var aliasedFunctionType =
@@ -258,7 +265,7 @@
         isDeprecated: _isDeprecated(node),
       ),
       aliasedType: _safeToSource(aliasedType),
-      location: _getLocationNode(nameNode),
+      location: _getLocationToken(nameToken),
       parameters: aliasedFunctionType != null
           ? _safeToSource(aliasedFunctionType.parameters)
           : null,
@@ -273,8 +280,8 @@
 
   Outline _newMethodOutline(MethodDeclaration method) {
     var returnType = method.returnType;
-    var nameNode = method.name;
-    var name = nameNode.name;
+    var nameToken = method.name2;
+    var name = nameToken.lexeme;
     var parameters = method.parameters;
     ElementKind kind;
     if (method.isGetter) {
@@ -294,7 +301,7 @@
             isDeprecated: _isDeprecated(method),
             isAbstract: method.isAbstract,
             isStatic: method.isStatic),
-        location: _getLocationNode(nameNode),
+        location: _getLocationToken(nameToken),
         parameters: parametersStr,
         returnType: returnTypeStr,
         typeParameters: _getTypeParametersStr(method.typeParameters));
@@ -304,15 +311,15 @@
 
   Outline _newMixinOutline(MixinDeclaration node, List<Outline> mixinContents) {
     node.firstTokenAfterCommentAndMetadata;
-    var nameNode = node.name;
-    var name = nameNode.name;
+    var nameToken = node.name2;
+    var name = nameToken.lexeme;
     var element = Element(
         ElementKind.MIXIN,
         name,
         Element.makeFlags(
             isPrivate: Identifier.isPrivateName(name),
             isDeprecated: _isDeprecated(node)),
-        location: _getLocationNode(nameNode),
+        location: _getLocationToken(nameToken),
         typeParameters: _getTypeParametersStr(node.typeParameters));
     return _nodeOutline(node, element, mixinContents);
   }
@@ -327,8 +334,8 @@
 
   Outline _newVariableOutline(String typeName, ElementKind kind,
       VariableDeclaration variable, bool isStatic) {
-    var nameNode = variable.name;
-    var name = nameNode.name;
+    var nameToken = variable.name2;
+    var name = nameToken.lexeme;
     var element = Element(
         kind,
         name,
@@ -338,7 +345,7 @@
             isStatic: isStatic,
             isConst: variable.isConst,
             isFinal: variable.isFinal),
-        location: _getLocationNode(nameNode),
+        location: _getLocationToken(nameToken),
         returnType: typeName);
     return _nodeOutline(variable, element);
   }
@@ -521,7 +528,7 @@
   /// Return `true` if the given [element] is a top-level member of the test
   /// package.
   bool _isInsideTestPackage(engine.FunctionElement element) {
-    var parent = element.enclosingElement2;
+    var parent = element.enclosingElement3;
     return parent is engine.CompilationUnitElement &&
         parent.source.fullName.endsWith('test.dart');
   }
diff --git a/pkg/analysis_server/lib/src/computer/computer_overrides.dart b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
index d55a4c6..9b7736e 100644
--- a/pkg/analysis_server/lib/src/computer/computer_overrides.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
@@ -6,11 +6,12 @@
 import 'package:analysis_server/src/protocol_server.dart' as proto;
 import 'package:analysis_server/src/utilities/extensions/ast.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 
 /// Return the elements that the given [element] overrides.
 OverriddenElements findOverriddenElements(Element element) {
-  if (element.enclosingElement2 is ClassElement) {
+  if (element.enclosingElement3 is ClassElement) {
     return _OverriddenElementsFinder(element).find();
   }
   return OverriddenElements(element, <Element>[], <Element>[]);
@@ -35,9 +36,8 @@
     return _overrides;
   }
 
-  /// Add a new [Override] for the declaration with the given name [node].
-  void _addOverride(SimpleIdentifier node) {
-    var element = node.staticElement;
+  /// Add a new [Override] for the declaration with the given name [token].
+  void _addOverride(Token token, Element? element) {
     if (element != null) {
       var overridesResult = _OverriddenElementsFinder(element).find();
       var superElements = overridesResult.superElements;
@@ -53,7 +53,7 @@
                 member.nonSynthetic,
                 withNullability: _unit.isNonNullableByDefault))
             .toList();
-        _overrides.add(proto.Override(node.offset, node.length,
+        _overrides.add(proto.Override(token.offset, token.length,
             superclassMember: superMember,
             interfaceMembers: nullIfEmpty(interfaceMembers)));
       }
@@ -66,7 +66,7 @@
         if (classMember.isStatic) {
           continue;
         }
-        _addOverride(classMember.name);
+        _addOverride(classMember.name2, classMember.declaredElement);
       }
       if (classMember is FieldDeclaration) {
         if (classMember.isStatic) {
@@ -74,7 +74,7 @@
         }
         List<VariableDeclaration> fields = classMember.fields.variables;
         for (var field in fields) {
-          _addOverride(field.name);
+          _addOverride(field.name2, field.declaredElement);
         }
       }
     }
@@ -109,7 +109,7 @@
   final Set<ClassElement> _visited = <ClassElement>{};
 
   factory _OverriddenElementsFinder(Element seed) {
-    var class_ = seed.enclosingElement2 as ClassElement;
+    var class_ = seed.enclosingElement3 as ClassElement;
     var library = class_.library;
     var name = seed.displayName;
     List<ElementKind> kinds;
diff --git a/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart b/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart
index bed6b92..e500165 100644
--- a/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart
+++ b/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart
@@ -82,7 +82,7 @@
         !_isConstructorDeclarationReturnType(node)) {
       var nodeElement = node.writeOrReadElement;
       if (nodeElement != null &&
-          nodeElement.enclosingElement2 is CompilationUnitElement) {
+          nodeElement.enclosingElement3 is CompilationUnitElement) {
         var nodeLibrary = nodeElement.library;
         var path = nodeLibrary?.definingCompilationUnit.source.fullName;
         if (path == null) {
diff --git a/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart b/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart
index d11c738..47b7bbf 100644
--- a/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart
+++ b/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart
@@ -27,6 +27,13 @@
   final Map<Element, List<int>> elementsOffsets = <Element, List<int>>{};
 
   @override
+  void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    _addOccurrence(node.declaredElement!, node.name2.offset);
+
+    super.visitEnumConstantDeclaration(node);
+  }
+
+  @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
     var element = node.writeOrReadElement;
     if (element != null) {
diff --git a/pkg/analysis_server/lib/src/protocol_server.dart b/pkg/analysis_server/lib/src/protocol_server.dart
index 1b25da7..b64b933 100644
--- a/pkg/analysis_server/lib/src/protocol_server.dart
+++ b/pkg/analysis_server/lib/src/protocol_server.dart
@@ -215,7 +215,7 @@
 OverriddenMember newOverriddenMember_fromEngine(engine.Element member,
     {required bool withNullability}) {
   var element = convertElement(member, withNullability: withNullability);
-  var className = member.enclosingElement2!.displayName;
+  var className = member.enclosingElement3!.displayName;
   return OverriddenMember(element, className);
 }
 
@@ -262,7 +262,7 @@
   var path = <Element>[];
 
   if (element is engine.PrefixElement) {
-    element = element.enclosingElement2.definingCompilationUnit;
+    element = element.enclosingElement3.definingCompilationUnit;
   }
 
   var withNullability = element.library?.isNonNullableByDefault ?? false;
@@ -277,7 +277,7 @@
     return element;
   }
 
-  var enclosingElement = element.enclosingElement2;
+  var enclosingElement = element.enclosingElement3;
   if (enclosingElement is engine.LibraryElement) {
     element = enclosingElement;
   }
diff --git a/pkg/analysis_server/lib/src/search/element_references.dart b/pkg/analysis_server/lib/src/search/element_references.dart
index 57d16bf..cfa38cd 100644
--- a/pkg/analysis_server/lib/src/search/element_references.dart
+++ b/pkg/analysis_server/lib/src/search/element_references.dart
@@ -73,6 +73,6 @@
     if (element is ConstructorElement) {
       return false;
     }
-    return element.enclosingElement2 is ClassElement;
+    return element.enclosingElement3 is ClassElement;
   }
 }
diff --git a/pkg/analysis_server/lib/src/search/type_hierarchy.dart b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
index 7064baa..f532954 100644
--- a/pkg/analysis_server/lib/src/search/type_hierarchy.dart
+++ b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
@@ -35,10 +35,10 @@
     Element? element = _pivotElement;
     if (_pivotElement is FieldElement) {
       _pivotFieldFinal = (_pivotElement as FieldElement).isFinal;
-      element = _pivotElement.enclosingElement2;
+      element = _pivotElement.enclosingElement3;
     }
     if (_pivotElement is ExecutableElement) {
-      element = _pivotElement.enclosingElement2;
+      element = _pivotElement.enclosingElement3;
     }
     if (element is ClassElement) {
       _pivotClass = element;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
index e8241d4..363121d 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
@@ -478,17 +478,26 @@
       }
     }
 
+    /// TODO(scheglov) Can we make it better?
+    String fromToken(Token token) {
+      final lexeme = token.lexeme;
+      if (offset >= token.offset && offset < token.end) {
+        return lexeme.substring(0, offset - token.offset);
+      } else if (offset == token.end) {
+        return lexeme;
+      }
+      return '';
+    }
+
     while (entity is AstNode) {
       if (entity is SimpleIdentifier) {
-        var identifier = entity.name;
-        if (offset >= entity.offset && offset < entity.end) {
-          return identifier.substring(0, offset - entity.offset);
-        } else if (offset == entity.end) {
-          return identifier;
-        }
+        return fromToken(entity.token);
       }
       var children = entity.childEntities;
       entity = children.isEmpty ? null : children.first;
+      if (entity is Token) {
+        return fromToken(entity);
+      }
     }
     return '';
   }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart b/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
index 70ccf2f..df5b7456 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
@@ -979,7 +979,7 @@
       var parent = node.parent;
       if (parent is VariableDeclarationList) {
         return parent.type?.type ??
-            _impliedDartTypeWithName(typeProvider, node.name.name);
+            _impliedDartTypeWithName(typeProvider, node.name2.lexeme);
       }
     }
     return null;
@@ -992,7 +992,7 @@
         var equals = varDecl.equals;
         if (equals != null && equals.end <= offset) {
           return node.type?.type ??
-              _impliedDartTypeWithName(typeProvider, varDecl.name.name);
+              _impliedDartTypeWithName(typeProvider, varDecl.name2.lexeme);
         }
       }
     }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart
index d732186..2157dcc 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart
@@ -37,9 +37,9 @@
         param = param.parameter;
       }
       if (param is FieldFormalParameter) {
-        var fieldId = param.identifier;
+        var fieldId = param.name;
         if (fieldId != request.target.entity) {
-          var fieldName = fieldId.name;
+          var fieldName = fieldId.lexeme;
           if (fieldName.isNotEmpty) {
             referencedFields.add(fieldName);
           }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
index 8e5c326..060361b 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
@@ -146,7 +146,7 @@
   void visitClassDeclaration(ClassDeclaration node) {
     final entity = this.entity;
     // Don't suggest class name
-    if (entity == node.name) {
+    if (entity == node.name2) {
       return;
     }
     if (entity == node.rightBracket) {
@@ -266,7 +266,7 @@
       return;
     }
 
-    if (entity == node.name) {
+    if (entity == node.name2) {
       return;
     }
 
@@ -298,7 +298,7 @@
   @override
   void visitExtensionDeclaration(ExtensionDeclaration node) {
     // Don't suggest extension name
-    if (entity == node.name) {
+    if (entity == node.name2) {
       return;
     }
     if (entity == node.rightBracket) {
@@ -407,15 +407,13 @@
       bool hasCovariant() {
         var last = lastParameter();
         return last != null &&
-            (last.covariantKeyword != null ||
-                last.identifier?.name == 'covariant');
+            (last.covariantKeyword != null || last.name?.lexeme == 'covariant');
       }
 
       bool hasRequired() {
         var last = lastParameter();
         return last != null &&
-            (last.requiredKeyword != null ||
-                last.identifier?.name == 'required');
+            (last.requiredKeyword != null || last.name?.lexeme == 'required');
       }
 
       var tokenType = entity.type;
@@ -494,7 +492,7 @@
   void visitFunctionDeclaration(FunctionDeclaration node) {
     // If the cursor is at the beginning of the declaration, include the
     // compilation unit keywords.  See dartbug.com/41039.
-    if (entity == node.returnType || entity == node.name) {
+    if (entity == node.returnType || entity == node.name2) {
       _addSuggestion(Keyword.DYNAMIC);
       _addSuggestion(Keyword.VOID);
     }
@@ -617,7 +615,7 @@
           _addSuggestion2(SYNC_STAR);
         }
       }
-    } else if (entity == node.returnType || entity == node.name) {
+    } else if (entity == node.returnType || entity == node.name2) {
       // If the cursor is at the beginning of the declaration, include the class
       // body keywords.  See dartbug.com/41039.
       _addClassBodyKeywords();
@@ -645,7 +643,7 @@
   void visitMixinDeclaration(MixinDeclaration node) {
     final entity = this.entity;
     // Don't suggest mixin name
-    if (entity == node.name) {
+    if (entity == node.name2) {
       return;
     }
     if (entity == node.rightBracket) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
index 536ba29..b8a7122 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
@@ -90,7 +90,7 @@
     if (element.isOperator) {
       return;
     }
-    if (element.enclosingElement2 is! CompilationUnitElement) {
+    if (element.enclosingElement3 is! CompilationUnitElement) {
       return;
     }
     var returnType = element.returnType;
@@ -115,7 +115,7 @@
   @override
   void visitPropertyAccessorElement(PropertyAccessorElement element) {
     if (opType.includeReturnValueSuggestions) {
-      var parent = element.enclosingElement2;
+      var parent = element.enclosingElement3;
       if (parent is ClassElement || parent is ExtensionElement) {
         builder.suggestAccessor(element, inheritanceDistance: 0.0);
       } else {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
index 4d000d9..5389353 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
@@ -241,7 +241,7 @@
     if (declaredElement != null &&
         visibilityTracker._isVisible(declaredElement) &&
         opType.includeReturnValueSuggestions &&
-        declaration.name != null) {
+        declaration.name2 != null) {
       builder.suggestExtension(declaredElement, kind: _defaultKind);
     }
   }
@@ -259,7 +259,7 @@
           .thisOrAncestorOfType<ClassDeclaration>();
       var enclosingElement = enclosingClass?.declaredElement;
       if (enclosingElement != null) {
-        var enclosingElement = field.enclosingElement2;
+        var enclosingElement = field.enclosingElement3;
         if (enclosingElement is ClassElement) {
           inheritanceDistance = request.featureComputer
               .inheritanceDistanceFeature(enclosingElement, enclosingElement);
@@ -316,10 +316,14 @@
   }
 
   @override
-  void declaredLocalVar(SimpleIdentifier name, TypeAnnotation? type) {
-    if (visibilityTracker._isVisible(name.staticElement) &&
+  void declaredLocalVar(
+    Token name,
+    TypeAnnotation? type,
+    LocalVariableElement declaredElement,
+  ) {
+    if (visibilityTracker._isVisible(declaredElement) &&
         opType.includeReturnValueSuggestions) {
-      builder.suggestLocalVariable(name.staticElement as LocalVariableElement);
+      builder.suggestLocalVariable(declaredElement);
     }
   }
 
@@ -334,7 +338,7 @@
       var enclosingClass = request.target.containingNode
           .thisOrAncestorOfType<ClassDeclaration>();
       if (enclosingClass != null) {
-        var enclosingElement = element?.enclosingElement2;
+        var enclosingElement = element?.enclosingElement3;
         if (enclosingElement is ClassElement) {
           inheritanceDistance = request.featureComputer
               .inheritanceDistanceFeature(
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
index 6d70d17..ce0c5bf 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
 
@@ -14,11 +15,12 @@
 
   @override
   Future<void> computeSuggestions() async {
-    var targetId = _getTargetId(request.target);
-    if (targetId == null) {
+    final target = _getTargetId(request.target);
+    if (target == null) {
       return;
     }
-    var classDecl = targetId.thisOrAncestorOfType<ClassOrMixinDeclaration>();
+    var classDecl =
+        target.enclosingNode.thisOrAncestorOfType<ClassOrMixinDeclaration>();
     if (classDecl == null) {
       return;
     }
@@ -41,14 +43,14 @@
       // Gracefully degrade if the overridden element has not been resolved.
       if (element != null) {
         var invokeSuper = interface.isSuperImplemented(name);
-        await builder.suggestOverride(targetId, element, invokeSuper);
+        await builder.suggestOverride(target.id, element, invokeSuper);
       }
     }
   }
 
   /// If the target looks like a partial identifier inside a class declaration
   /// then return that identifier, otherwise return `null`.
-  SimpleIdentifier? _getTargetId(CompletionTarget target) {
+  _Target? _getTargetId(CompletionTarget target) {
     var node = target.containingNode;
     if (node is ClassOrMixinDeclaration) {
       var entity = target.entity;
@@ -64,23 +66,23 @@
     return null;
   }
 
-  SimpleIdentifier? _getTargetIdFromVarList(VariableDeclarationList fields) {
+  _Target? _getTargetIdFromVarList(VariableDeclarationList fields) {
     var variables = fields.variables;
     var type = fields.type;
     if (variables.length == 1) {
       var variable = variables[0];
-      var targetId = variable.name;
-      if (targetId.name.isEmpty) {
+      var targetId = variable.name2;
+      if (targetId.lexeme.isEmpty) {
         // analyzer parser
         // Actual: class C { foo^ }
         // Parsed: class C { foo^ _s_ }
         //   where _s_ is a synthetic id inserted by the analyzer parser
-        return targetId;
+        return _Target(fields, targetId);
       } else if (fields.keyword == null &&
           type == null &&
           variable.initializer == null) {
         // fasta parser does not insert a synthetic identifier
-        return targetId;
+        return _Target(fields, targetId);
       } else if (fields.keyword == null &&
           type is NamedType &&
           type.typeArguments == null &&
@@ -93,7 +95,7 @@
         // Parses as a variable list where `m` is the type and `String` is a
         // variable.
         var name = type.name;
-        return name is SimpleIdentifier ? name : null;
+        return name is SimpleIdentifier ? _Target(fields, name.token) : null;
       }
     }
     return null;
@@ -113,3 +115,10 @@
     return namesToOverride;
   }
 }
+
+class _Target {
+  final AstNode enclosingNode;
+  final Token id;
+
+  _Target(this.enclosingNode, this.id);
+}
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index e35e291..cbdc839 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -18,6 +18,7 @@
 import 'package:analysis_server/src/utilities/flutter.dart';
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
@@ -222,7 +223,7 @@
         var containingMethod = request.target.containingNode
             .thisOrAncestorOfType<MethodDeclaration>();
         if (containingMethod != null) {
-          _cachedContainingMemberName = containingMethod.name.name;
+          _cachedContainingMemberName = containingMethod.name2.lexeme;
         }
       }
     }
@@ -325,7 +326,7 @@
   /// referenced using a prefix, then the [prefix] should be provided.
   void suggestClass(ClassElement classElement, {String? prefix}) {
     var relevance = _computeTopLevelRelevance(classElement,
-        elementType: _instantiateClassElement(classElement));
+        elementType: _instantiateInterfaceElement(classElement));
     _addBuilder(
       _createCompletionSuggestionBuilder(
         classElement,
@@ -409,7 +410,7 @@
     // If the class name is already in the text, then we don't support
     // prepending a prefix.
     assert(!hasClassName || prefix == null);
-    var enclosingClass = constructor.enclosingElement2;
+    var enclosingClass = constructor.enclosingElement3;
     var className = enclosingClass.name;
     if (className.isEmpty) {
       return;
@@ -431,7 +432,7 @@
       return;
     }
 
-    var returnType = _instantiateClassElement(enclosingClass);
+    var returnType = _instantiateInterfaceElement(enclosingClass);
     var relevance =
         _computeTopLevelRelevance(constructor, elementType: returnType);
     _addBuilder(
@@ -457,10 +458,10 @@
     } else if (element is ExtensionElement) {
       suggestExtension(element, kind: kind);
     } else if (element is FunctionElement &&
-        element.enclosingElement2 is CompilationUnitElement) {
+        element.enclosingElement3 is CompilationUnitElement) {
       suggestTopLevelFunction(element, kind: kind);
     } else if (element is PropertyAccessorElement &&
-        element.enclosingElement2 is CompilationUnitElement) {
+        element.enclosingElement3 is CompilationUnitElement) {
       suggestTopLevelPropertyAccessor(element);
     } else if (element is TypeAliasElement) {
       suggestTypeAlias(element);
@@ -473,7 +474,7 @@
   /// referenced using a prefix, then the [prefix] should be provided.
   void suggestEnumConstant(FieldElement constant, {String? prefix}) {
     var constantName = constant.name;
-    var enumElement = constant.enclosingElement2;
+    var enumElement = constant.enclosingElement3;
     var enumName = enumElement.name;
     var completion = '$enumName.$constantName';
     var relevance =
@@ -705,7 +706,7 @@
       inheritanceDistance: inheritanceDistance,
     );
 
-    var enclosingElement = method.enclosingElement2;
+    var enclosingElement = method.enclosingElement3;
     if (method.name == 'setState' &&
         enclosingElement is ClassElement &&
         flutter.isExactState(enclosingElement)) {
@@ -777,10 +778,10 @@
 
     // Optionally add Flutter child widget details.
     // todo (pq): revisit this special casing; likely it can be generalized away
-    var element = parameter.enclosingElement2;
+    var element = parameter.enclosingElement3;
     // If appendColon is false, default values should never be appended.
     if (element is ConstructorElement && appendColon) {
-      if (Flutter.instance.isWidget(element.enclosingElement2)) {
+      if (Flutter.instance.isWidget(element.enclosingElement3)) {
         // Don't bother with nullability. It won't affect default list values.
         var defaultValue =
             getDefaultStringParameterValue(parameter, withNullability: false);
@@ -831,12 +832,12 @@
   /// Add a suggestion to replace the [targetId] with an override of the given
   /// [element]. If [invokeSuper] is `true`, then the override will contain an
   /// invocation of an overridden member.
-  Future<void> suggestOverride(SimpleIdentifier targetId,
-      ExecutableElement element, bool invokeSuper) async {
+  Future<void> suggestOverride(
+      Token targetId, ExecutableElement element, bool invokeSuper) async {
     var displayTextBuffer = StringBuffer();
     var builder = ChangeBuilder(session: request.analysisSession);
     await builder.addDartFileEdit(request.path, (builder) {
-      builder.addReplacement(range.node(targetId), (builder) {
+      builder.addReplacement(range.token(targetId), (builder) {
         builder.writeOverride(
           element,
           displayTextBuffer: displayTextBuffer,
@@ -1009,9 +1010,9 @@
   void suggestTopLevelPropertyAccessor(PropertyAccessorElement accessor,
       {String? prefix}) {
     assert(
-        accessor.enclosingElement2 is CompilationUnitElement,
+        accessor.enclosingElement3 is CompilationUnitElement,
         'Enclosing element of ${accessor.runtimeType} is '
-        '${accessor.enclosingElement2.runtimeType}.');
+        '${accessor.enclosingElement3.runtimeType}.');
     if (accessor.isSynthetic) {
       // Avoid visiting a field twice. All fields induce a getter, but only
       // non-final fields induce a setter, so we don't add a suggestion for a
@@ -1061,7 +1062,7 @@
   /// referenced using a prefix, then the [prefix] should be provided.
   void suggestTopLevelVariable(TopLevelVariableElement variable,
       {String? prefix}) {
-    assert(variable.enclosingElement2 is CompilationUnitElement);
+    assert(variable.enclosingElement3 is CompilationUnitElement);
     var relevance =
         _computeTopLevelRelevance(variable, elementType: variable.type);
     _addBuilder(
@@ -1294,7 +1295,7 @@
       withNullability: _isNonNullableByDefault,
     );
 
-    var enclosingElement = element.enclosingElement2;
+    var enclosingElement = element.enclosingElement3;
 
     String? declaringType;
     if (enclosingElement is ClassElement) {
@@ -1353,7 +1354,7 @@
   /// The enclosing element must be either a class, or extension; otherwise
   /// we either fail with assertion, or return `null`.
   String? _enclosingClassOrExtensionName(Element element) {
-    var enclosing = element.enclosingElement2;
+    var enclosing = element.enclosingElement3;
     if (enclosing is ClassElement) {
       return enclosing.name;
     } else if (enclosing is ExtensionElement) {
@@ -1417,7 +1418,7 @@
     }
   }
 
-  InterfaceType _instantiateClassElement(ClassElement element) {
+  InterfaceType _instantiateInterfaceElement(InterfaceElement element) {
     var typeParameters = element.typeParameters;
     var typeArguments = const <DartType>[];
     if (typeParameters.isNotEmpty) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
index 1caf787..be909a3 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
@@ -110,7 +110,7 @@
 
   @override
   void declaredClass(ClassDeclaration declaration) {
-    if (declaration.name.name == targetName) {
+    if (declaration.name2.lexeme == targetName) {
       // no type
       finished();
     }
@@ -118,7 +118,7 @@
 
   @override
   void declaredClassTypeAlias(ClassTypeAlias declaration) {
-    if (declaration.name.name == targetName) {
+    if (declaration.name2.lexeme == targetName) {
       // no type
       finished();
     }
@@ -126,7 +126,7 @@
 
   @override
   void declaredField(FieldDeclaration fieldDecl, VariableDeclaration varDecl) {
-    if (varDecl.name.name == targetName) {
+    if (varDecl.name2.lexeme == targetName) {
       // Type provided by the element in computeFull above
       finished();
     }
@@ -134,7 +134,7 @@
 
   @override
   void declaredFunction(FunctionDeclaration declaration) {
-    if (declaration.name.name == targetName) {
+    if (declaration.name2.lexeme == targetName) {
       var returnType = declaration.returnType;
       if (returnType != null) {
         var type = returnType.type;
@@ -148,7 +148,7 @@
 
   @override
   void declaredFunctionTypeAlias(FunctionTypeAlias declaration) {
-    if (declaration.name.name == targetName) {
+    if (declaration.name2.lexeme == targetName) {
       var returnType = declaration.returnType;
       if (returnType != null) {
         var type = returnType.type;
@@ -162,7 +162,7 @@
 
   @override
   void declaredGenericTypeAlias(GenericTypeAlias declaration) {
-    if (declaration.name.name == targetName) {
+    if (declaration.name2.lexeme == targetName) {
       var returnType = declaration.functionType?.returnType;
       if (returnType != null) {
         var type = returnType.type;
@@ -183,17 +183,20 @@
   }
 
   @override
-  void declaredLocalVar(SimpleIdentifier name, TypeAnnotation? type) {
-    if (name.name == targetName) {
-      var element = name.staticElement as VariableElement;
-      typeFound = element.type;
+  void declaredLocalVar(
+    Token name,
+    TypeAnnotation? type,
+    LocalVariableElement declaredElement,
+  ) {
+    if (name.lexeme == targetName) {
+      typeFound = declaredElement.type;
       finished();
     }
   }
 
   @override
   void declaredMethod(MethodDeclaration declaration) {
-    if (declaration.name.name == targetName) {
+    if (declaration.name2.lexeme == targetName) {
       var returnType = declaration.returnType;
       if (returnType != null) {
         var type = returnType.type;
@@ -216,7 +219,7 @@
   @override
   void declaredTopLevelVar(
       VariableDeclarationList varList, VariableDeclaration varDecl) {
-    if (varDecl.name.name == targetName) {
+    if (varDecl.name2.lexeme == targetName) {
       // Type provided by the element in computeFull above.
       finished();
     }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
index 52f3e43..bd09b5e 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
@@ -37,8 +37,12 @@
           strName = _getStringName(expression);
         }
       } else if (node is SimpleFormalParameter) {
-        var identifier = _formalParameterTypeIdentifier(node);
-        strName = _getStringName(identifier);
+        var identifier = _formalParameterTypeIdentifier2(node);
+        if (identifier != null) {
+          strName = _getStringName(identifier);
+        } else {
+          strName = node.name?.lexeme;
+        }
       } else if (node is VariableDeclarationList) {
         var identifier = _typeAnnotationIdentifier(node.type);
         strName = _getStringName(identifier);
@@ -57,7 +61,7 @@
           var varDeclarations = varDeclarationList.variables;
           if (varDeclarations.length == 1) {
             var declaration = varDeclarations.first;
-            strName = _getStringName(declaration.name);
+            strName = declaration.name2.lexeme;
           }
         }
       }
@@ -100,13 +104,12 @@
     return id.name;
   }
 
-  static Identifier? _formalParameterTypeIdentifier(FormalParameter node) {
+  static Identifier? _formalParameterTypeIdentifier2(FormalParameter node) {
     if (node is SimpleFormalParameter) {
       var type = node.type;
       if (type != null) {
         return _typeAnnotationIdentifier(type);
       }
-      return node.identifier;
     }
     return null;
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
index 47a4e0c..a890ab1 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
@@ -238,6 +238,8 @@
 
   final AstNode node;
 
+  final Token token;
+
   CorrectionProducerContext._({
     required this.resolvedResult,
     required this.workspace,
@@ -245,6 +247,7 @@
     this.dartFixContext,
     this.diagnostic,
     required this.node,
+    required this.token,
     this.overrideSet,
     this.selectionOffset = -1,
     this.selectionLength = 0,
@@ -271,10 +274,13 @@
     var node = locator.searchWithin(resolvedResult.unit);
     node ??= resolvedResult.unit;
 
+    final token = _tokenAt(node, selectionOffset) ?? node.beginToken;
+
     return CorrectionProducerContext._(
       resolvedResult: resolvedResult,
       workspace: workspace,
       node: node,
+      token: token,
       applyingBulkFixes: applyingBulkFixes,
       dartFixContext: dartFixContext,
       diagnostic: diagnostic,
@@ -283,6 +289,21 @@
       selectionLength: selectionLength,
     );
   }
+
+  static Token? _tokenAt(AstNode node, int offset) {
+    for (final entity in node.childEntities) {
+      if (entity is AstNode) {
+        if (entity.offset <= offset && offset <= entity.end) {
+          return _tokenAt(entity, offset);
+        }
+      } else if (entity is Token) {
+        if (entity.offset <= offset && offset <= entity.end) {
+          return entity;
+        }
+      }
+    }
+    return null;
+  }
 }
 
 abstract class CorrectionProducerWithDiagnostic extends CorrectionProducer {
@@ -437,6 +458,8 @@
 
   AnalysisSessionHelper get sessionHelper => _context.sessionHelper;
 
+  Token get token => _context.token;
+
   TypeProvider get typeProvider => _context.typeProvider;
 
   /// Return the type system appropriate to the library in which the correction
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_call_super.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_call_super.dart
index 8b6fb50..df469d0 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_call_super.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_call_super.dart
@@ -48,7 +48,7 @@
     var parameters = methodDeclaration.parameters?.parameters;
     var argumentList = parameters
             ?.map((p) {
-              var name = p.identifier?.name;
+              var name = p.name?.lexeme;
               if (overriddenParameters.contains(name)) {
                 return p.isNamed ? '$name: $name' : name;
               }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
index a6e05f3..f33b3e7 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
@@ -116,7 +116,7 @@
 
     final debugFillProperties = classDeclaration.members
         .whereType<MethodDeclaration>()
-        .where((e) => e.name.name == 'debugFillProperties')
+        .where((e) => e.name2.lexeme == 'debugFillProperties')
         .singleOrNull;
     if (debugFillProperties == null) {
       var location = utils.prepareNewMethodLocation(classDeclaration);
@@ -167,10 +167,10 @@
       for (var parameter in parameterList.parameters) {
         if (parameter is SimpleFormalParameter) {
           final type = parameter.type;
-          final identifier = parameter.identifier;
+          final identifier = parameter.name;
           if (type is NamedType && identifier != null) {
             if (type.name.name == 'DiagnosticPropertiesBuilder') {
-              propertiesBuilderName = identifier.name;
+              propertiesBuilderName = identifier.lexeme;
               break;
             }
           }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_enum_constant.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_enum_constant.dart
index f2ed14c..39919e2 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_enum_constant.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_enum_constant.dart
@@ -64,7 +64,7 @@
     var length = constructors.length;
     if (length > 1) return;
 
-    var name = length == 1 ? constructors.first.name?.name : null;
+    var name = length == 1 ? constructors.first.name2?.lexeme : null;
 
     var offset = targetNode.constants.last.end;
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_late.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_late.dart
index 48f22d7..53ef91d 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_late.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_late.dart
@@ -61,7 +61,7 @@
             getter.isSynthetic &&
             !getter.variable.isSynthetic &&
             getter.variable.setter == null &&
-            getter.enclosingElement2 is ClassElement) {
+            getter.enclosingElement3 is ClassElement) {
           var declarationResult =
               await sessionHelper.getElementDeclaration(getter.variable);
           if (declarationResult == null) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_return_type.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_return_type.dart
index a37027c..4475b82 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_return_type.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_return_type.dart
@@ -6,7 +6,7 @@
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/syntactic_entity.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_system.dart';
@@ -33,27 +33,28 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    SyntacticEntity? insertBeforeEntity;
+    Token? insertBeforeEntity;
     FunctionBody? body;
     if (node is SimpleIdentifier) {
       var executable = node.parent;
-      if (executable is MethodDeclaration && executable.name == node) {
+      if (executable is MethodDeclaration && executable.name2 == token) {
         if (executable.returnType != null) {
           return;
         }
         if (executable.isSetter) {
           return;
         }
-        insertBeforeEntity = executable.propertyKeyword ?? executable.name;
+        insertBeforeEntity = executable.propertyKeyword ?? executable.name2;
         body = executable.body;
-      } else if (executable is FunctionDeclaration && executable.name == node) {
+      } else if (executable is FunctionDeclaration &&
+          executable.name2 == token) {
         if (executable.returnType != null) {
           return;
         }
         if (executable.isSetter) {
           return;
         }
-        insertBeforeEntity = executable.propertyKeyword ?? executable.name;
+        insertBeforeEntity = executable.propertyKeyword ?? executable.name2;
         body = executable.functionExpression.body;
       } else {
         return;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_type_annotation.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_type_annotation.dart
index a075f8a..63ff7ce 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_type_annotation.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_type_annotation.dart
@@ -120,7 +120,7 @@
       return;
     }
     await _applyChange(builder, declaredIdentifier.keyword,
-        declaredIdentifier.identifier.offset, type);
+        declaredIdentifier.name.offset, type);
   }
 
   Future<void> _forSimpleFormalParameter(ChangeBuilder builder,
@@ -150,7 +150,7 @@
     final variables = declarationList.variables;
     final variable = variables[0];
     // Ensure that the selection is not after the name of the variable.
-    if (selectionOffset > variable.name.end) {
+    if (selectionOffset > variable.name2.end) {
       return;
     }
     // Ensure that there is an initializer to get the type from.
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/change_to.dart b/pkg/analysis_server/lib/src/services/correction/dart/change_to.dart
index ff8ea9d..b704649 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/change_to.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/change_to.dart
@@ -8,6 +8,8 @@
 import 'package:analysis_server/src/services/correction/util.dart';
 import 'package:analysis_server/src/services/search/hierarchy.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/syntactic_entity.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
@@ -82,7 +84,7 @@
     return element.parameters.where((superParam) =>
         superParam.isNamed &&
         !formalParameters
-            .any((param) => superParam.name == param.identifier?.name));
+            .any((param) => superParam.name == param.name?.lexeme));
   }
 
   Future<void> _proposeAnnotation(ChangeBuilder builder) async {
@@ -130,17 +132,14 @@
     }
   }
 
-  Future<void> _proposeClassOrMixinMember(
-      ChangeBuilder builder,
-      SimpleIdentifier node,
-      Expression? target,
-      _ElementPredicate predicate) async {
+  Future<void> _proposeClassOrMixinMember(ChangeBuilder builder, Token node,
+      Expression? target, _ElementPredicate predicate) async {
     var targetIdentifierElement =
         target is Identifier ? target.staticElement : null;
-    var finder = _ClosestElementFinder(node.name, predicate);
+    var finder = _ClosestElementFinder(node.lexeme, predicate);
     // unqualified invocation
     if (target == null) {
-      var clazz = node.thisOrAncestorOfType<ClassDeclaration>();
+      var clazz = this.node.thisOrAncestorOfType<ClassDeclaration>();
       if (clazz != null) {
         var classElement = clazz.declaredElement!;
         _updateFinderWithClassMembers(finder, classElement);
@@ -177,7 +176,7 @@
     var formalParameterList = node.thisOrAncestorOfType<FormalParameterList>();
     if (formalParameterList != null) {
       for (var parameter in formalParameterList.parameters) {
-        var name = parameter.identifier?.name;
+        var name = parameter.name?.lexeme;
         if (name != null) {
           exclusions.add(name);
         }
@@ -185,7 +184,7 @@
     }
 
     var type = node.type?.type;
-    await _proposeClassOrMixinMember(builder, node.identifier, null,
+    await _proposeClassOrMixinMember(builder, node.name, null,
         (Element element) {
       return element is FieldElement &&
           !exclusions.contains(element.name) &&
@@ -245,7 +244,7 @@
       // find getter or setter
       var wantGetter = node.inGetterContext();
       var wantSetter = node.inSetterContext();
-      await _proposeClassOrMixinMember(builder, node, target,
+      await _proposeClassOrMixinMember(builder, node.token, target,
           (Element element) {
         if (element is PropertyAccessorElement) {
           return wantGetter && element.isGetter ||
@@ -263,7 +262,7 @@
     final node = this.node;
     var parent = node.parent;
     if (parent is MethodInvocation && node is SimpleIdentifier) {
-      await _proposeClassOrMixinMember(builder, node, parent.realTarget,
+      await _proposeClassOrMixinMember(builder, node.token, parent.realTarget,
           (Element element) => element is MethodElement && !element.isOperator);
     }
   }
@@ -279,8 +278,7 @@
     var formalParameters = constructorDeclaration.parameters.parameters
         .whereType<DefaultFormalParameter>();
 
-    var finder =
-        _ClosestElementFinder(parent.identifier.name, (Element e) => true);
+    var finder = _ClosestElementFinder(parent.name.lexeme, (Element e) => true);
 
     var superInvocation = constructorDeclaration.initializers.lastOrNull;
 
@@ -312,11 +310,11 @@
   }
 
   Future<void> _suggest(
-      ChangeBuilder builder, AstNode node, String? name) async {
+      ChangeBuilder builder, SyntacticEntity node, String? name) async {
     if (name != null) {
       _proposedName = name;
       await builder.addDartFileEdit(file, (builder) {
-        builder.addSimpleReplacement(range.node(node), _proposedName);
+        builder.addSimpleReplacement(range.entity(node), _proposedName);
       });
     }
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/change_to_static_access.dart b/pkg/analysis_server/lib/src/services/correction/dart/change_to_static_access.dart
index 65d4118..c4bb940 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/change_to_static_access.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/change_to_static_access.dart
@@ -43,7 +43,7 @@
     }
 
     final target_final = target;
-    var declaringElement = invokedElement.enclosingElement2;
+    var declaringElement = invokedElement.enclosingElement3;
 
     if (declaringElement is ClassElement) {
       _className = declaringElement.name;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_class_to_enum.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_class_to_enum.dart
index e774946..fe203e6 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_class_to_enum.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_class_to_enum.dart
@@ -51,12 +51,8 @@
       // the class.
       return;
     }
-    var node = this.node;
-    if (node is! SimpleIdentifier) {
-      return;
-    }
     var parent = node.parent;
-    if (parent is ClassDeclaration && parent.name == node) {
+    if (parent is ClassDeclaration && parent.name2 == token) {
       var description = _EnumDescription.fromClass(parent);
       if (description != null) {
         await builder.addDartFileEdit(file, (builder) {
@@ -80,7 +76,7 @@
     var constructorElement = node.constructorName.staticElement;
     return constructorElement != null &&
         !constructorElement.isFactory &&
-        constructorElement.enclosingElement2 == classElement;
+        constructorElement.enclosingElement3 == classElement;
   }
 }
 
@@ -309,7 +305,7 @@
       return null;
     }
     var constructor = constructors[0];
-    var name = constructor.name?.name;
+    var name = constructor.name2?.lexeme;
     if (name != null && name != 'new') {
       return null;
     }
@@ -571,7 +567,7 @@
                       initializer.constructorName.staticElement;
                   if (constructorElement != null &&
                       !constructorElement.isFactory &&
-                      constructorElement.enclosingElement2 == classElement) {
+                      constructorElement.enclosingElement3 == classElement) {
                     var fieldValue = fieldElement.computeConstantValue();
                     if (fieldValue != null) {
                       if (fieldList.variables.length != 1) {
@@ -634,7 +630,8 @@
   static bool _validateMethods(ClassDeclaration classDeclaration) {
     for (var member in classDeclaration.members) {
       if (member is MethodDeclaration) {
-        if (member.name.name == '==' || member.name.name == 'hashCode') {
+        final name = member.name2.lexeme;
+        if (name == '==' || name == 'hashCode') {
           return false;
         }
       }
@@ -700,7 +697,7 @@
       this.fieldDeclaration);
 
   /// Return the name of the field.
-  String get name => declaration.name.name;
+  String get name => declaration.name2.lexeme;
 }
 
 /// A representation of all the fields of interest in the class being converted.
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_class_to_mixin.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_class_to_mixin.dart
index 2ba17f8..37d5c4d 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_class_to_mixin.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_class_to_mixin.dart
@@ -22,7 +22,7 @@
     if (classDeclaration == null) {
       return;
     }
-    if (selectionOffset > classDeclaration.name.end ||
+    if (selectionOffset > classDeclaration.name2.end ||
         selectionEnd < classDeclaration.classKeyword.offset) {
       return;
     }
@@ -61,7 +61,7 @@
               classDeclaration.abstractKeyword ?? classDeclaration.classKeyword,
               classDeclaration.leftBracket), (builder) {
         builder.write('mixin ');
-        builder.write(classDeclaration.name.name);
+        builder.write(classDeclaration.name2.lexeme);
         builder.writeTypeParameters(classElement.typeParameters);
         builder.writeTypes(superclassConstraints, prefix: ' on ');
         builder.writeTypes(interfaces, prefix: ' implements ');
@@ -97,7 +97,7 @@
 
   void _addElement(Element? element) {
     if (element is ExecutableElement) {
-      var enclosingElement = element.enclosingElement2;
+      var enclosingElement = element.enclosingElement3;
       if (enclosingElement is ClassElement) {
         referencedClasses.add(enclosingElement);
       }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_for_each_to_for_loop.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_for_each_to_for_loop.dart
index 7ee4818..610e19b 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_for_each_to_for_loop.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_for_each_to_for_loop.dart
@@ -46,7 +46,7 @@
     if (parameter is! NormalFormalParameter) {
       return;
     }
-    var loopVariableName = parameter.identifier?.name;
+    var loopVariableName = parameter.name?.lexeme;
     if (loopVariableName == null) {
       return;
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_into_final_field.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_into_final_field.dart
index 2bafd70..27be65f 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_into_final_field.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_into_final_field.dart
@@ -46,7 +46,7 @@
       if (element == null) {
         return;
       }
-      var enclosing = element.enclosingElement2;
+      var enclosing = element.enclosingElement3;
       if (enclosing is ClassElement) {
         if (enclosing.getSetter(element.name) != null) {
           return;
@@ -76,7 +76,7 @@
       if (returnType != null) {
         code += ' ${utils.getNodeText(returnType)}';
       }
-      code += ' ${utils.getNodeText(getter.name)}';
+      code += ' ${getter.name2.lexeme}';
       if (expression is! NullLiteral) {
         code += ' = ${utils.getNodeText(expression)}';
       }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_into_getter.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_into_getter.dart
index 6677e5f..9fa75fc 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_into_getter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_into_getter.dart
@@ -54,7 +54,7 @@
       code += '${utils.getNodeText(typeAnnotation)} ';
     }
     code += 'get';
-    code += ' ${utils.getNodeText(field.name)}';
+    code += ' ${field.name2.lexeme}';
     code += ' => ${utils.getNodeText(initializer)}';
     code += ';';
     var replacementRange = range.startEnd(finalKeyword, fieldDeclaration);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_into_is_not_empty.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_into_is_not_empty.dart
index bc4aefd..2a1ab48 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_into_is_not_empty.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_into_is_not_empty.dart
@@ -43,7 +43,7 @@
       return;
     }
     // should have "isNotEmpty"
-    var propertyTarget = propertyElement.enclosingElement2;
+    var propertyTarget = propertyElement.enclosingElement3;
     if (propertyTarget == null ||
         getChildren(propertyTarget, 'isNotEmpty').isEmpty) {
       return;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_map_from_iterable_to_for_literal.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_map_from_iterable_to_for_literal.dart
index 85057d8..bb1adf8 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_map_from_iterable_to_for_literal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_map_from_iterable_to_for_literal.dart
@@ -6,6 +6,7 @@
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
@@ -41,7 +42,7 @@
     var element = creation.constructorName.staticElement;
     if (element == null ||
         element.name != 'fromIterable' ||
-        element.enclosingElement2 != typeProvider.mapElement) {
+        element.enclosingElement3 != typeProvider.mapElement) {
       return;
     }
     //
@@ -67,9 +68,9 @@
     // necessary.
     //
     var keyParameter = keyClosure.parameter;
-    var keyParameterName = keyClosure.parameterIdentifier.name;
+    var keyParameterName = keyClosure.parameterIdentifier.lexeme;
     var valueParameter = valueClosure.parameter;
-    var valueParameterName = valueClosure.parameterIdentifier.name;
+    var valueParameterName = valueClosure.parameterIdentifier.lexeme;
     var keyExpressionText = utils.getNodeText(keyClosure.body);
     var valueExpressionText = utils.getNodeText(valueClosure.body);
 
@@ -172,7 +173,7 @@
             var parameter = parameters[0];
             if (parameter is SimpleFormalParameter &&
                 parameter.isRequiredPositional) {
-              var parameterIdentifier = parameter.identifier;
+              var parameterIdentifier = parameter.name;
               if (parameterIdentifier != null) {
                 var body = _extractBody(expression);
                 if (body != null) {
@@ -190,7 +191,7 @@
 
 class _Closure {
   final SimpleFormalParameter parameter;
-  final SimpleIdentifier parameterIdentifier;
+  final Token parameterIdentifier;
   final Expression body;
 
   _Closure(this.parameter, this.parameterIdentifier, this.body);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_field_parameter.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_field_parameter.dart
index 2b3e173..3421dbd 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_field_parameter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_field_parameter.dart
@@ -5,6 +5,7 @@
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
@@ -24,7 +25,7 @@
     }
 
     // analyze parameter
-    var parameterName = context.identifier.name;
+    var parameterName = context.identifier.lexeme;
     var parameterElement = context.parameter.declaredElement!;
     var initializers = context.constructor.initializers;
 
@@ -88,7 +89,7 @@
   static _Context? _findParameter(AstNode node) {
     var parent = node.parent;
     if (parent is SimpleFormalParameter) {
-      var identifier = parent.identifier;
+      var identifier = parent.name;
       if (identifier == null) return null;
 
       var formalParameterList = parent.parent;
@@ -111,8 +112,8 @@
       if (parent.expression == node) {
         for (var formalParameter in constructor.parameters.parameters) {
           if (formalParameter is SimpleFormalParameter) {
-            var identifier = formalParameter.identifier;
-            if (identifier != null && identifier.name == node.name) {
+            var identifier = formalParameter.name;
+            if (identifier != null && identifier.lexeme == node.name) {
               return _Context(
                 parameter: formalParameter,
                 identifier: identifier,
@@ -130,7 +131,7 @@
 
 class _Context {
   final SimpleFormalParameter parameter;
-  final SimpleIdentifier identifier;
+  final Token identifier;
   final ConstructorDeclaration constructor;
 
   _Context({
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_generic_function_syntax.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_generic_function_syntax.dart
index 1cc03ee..4727e20 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_generic_function_syntax.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_generic_function_syntax.dart
@@ -76,7 +76,7 @@
     }
 
     var functionName = utils.getRangeText(
-        range.startEnd(node.name, node.typeParameters ?? node.name));
+        range.startEnd(node.name2, node.typeParameters ?? node.name2));
     var parameters = utils.getNodeText(node.parameters);
     String replacement;
     if (returnType == null) {
@@ -102,8 +102,8 @@
     var returnTypeNode = node.returnType;
     var returnType =
         returnTypeNode != null ? '${utils.getNodeText(returnTypeNode)} ' : '';
-    var functionName = utils.getRangeText(range.startEnd(
-        node.identifier, node.typeParameters ?? node.identifier));
+    var functionName = utils.getRangeText(
+        range.startEnd(node.name, node.typeParameters ?? node.name));
     var parameters = utils.getNodeText(node.parameters);
     var question = node.question != null ? '?' : '';
     var replacement =
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_initializing_formal.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_initializing_formal.dart
index 17327b7..f95535b 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_initializing_formal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_initializing_formal.dart
@@ -39,7 +39,7 @@
       if (parameter == null) {
         return;
       }
-      var identifier = parameter.identifier;
+      var identifier = parameter.name;
       if (identifier == null) {
         return;
       }
@@ -51,7 +51,7 @@
           builder.addSimpleInsertion(identifier.offset, 'this.');
         } else {
           builder.addSimpleReplacement(
-              range.node(parameter), 'this.${identifier.name}');
+              range.node(parameter), 'this.${identifier.lexeme}');
         }
 
         var statements = block.statements;
@@ -68,7 +68,7 @@
       if (parameter == null) {
         return;
       }
-      var identifier = parameter.identifier;
+      var identifier = parameter.name;
       if (identifier == null) {
         return;
       }
@@ -85,7 +85,7 @@
           builder.addSimpleInsertion(identifier.offset, 'this.');
         } else {
           builder.addSimpleReplacement(
-              range.node(parameter), 'this.${identifier.name}');
+              range.node(parameter), 'this.${identifier.lexeme}');
         }
 
         var initializers = constructor.initializers;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_super_parameters.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_super_parameters.dart
index 03a314a..d75f4ee 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_super_parameters.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_super_parameters.dart
@@ -241,7 +241,7 @@
     }
 
     var parameterNode = parameter.parameter;
-    var identifier = parameterNode.identifier;
+    var identifier = parameterNode.name;
     if (identifier == null) {
       // This condition should never occur, but the test is here to promote the
       // type.
@@ -272,7 +272,7 @@
         var superDefault = superParameter.computeConstantValue();
         var thisDefault = thisParameter.computeConstantValue();
         if (superDefault != null && superDefault == thisDefault) {
-          return range.endEnd(parameter.identifier!, defaultValue);
+          return range.endEnd(parameter.name!, defaultValue);
         }
       }
     }
@@ -410,14 +410,13 @@
       var typeAnnotation = parameter.type;
       if (typeAnnotation != null) {
         return _TypeData(
-            primaryRange:
-                range.startStart(typeAnnotation, parameter.identifier!));
+            primaryRange: range.startStart(typeAnnotation, parameter.name!));
       }
     } else if (parameter is FunctionTypedFormalParameter) {
       var returnType = parameter.returnType;
       return _TypeData(
           primaryRange: returnType != null
-              ? range.startStart(returnType, parameter.identifier)
+              ? range.startStart(returnType, parameter.name)
               : null,
           parameterRange: range.node(parameter.parameters));
     }
@@ -452,7 +451,7 @@
   final _TypeData? typeToDelete;
 
   /// The name.
-  final Identifier name;
+  final Token name;
 
   /// Whether to add a default initializer with `null` value or not.
   final bool nullInitializer;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor.dart
index 3062776..b6b921c 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor.dart
@@ -6,6 +6,7 @@
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
@@ -36,22 +37,23 @@
       if (node is SimpleIdentifier) {
         var parent = node.parent;
         if (parent is ConstructorName) {
-          await _proposeFromConstructorName(builder, node, parent);
+          await _proposeFromConstructorName(builder, node.token, parent);
           return;
         }
       }
       var parent = node.thisOrAncestorOfType<EnumConstantDeclaration>();
       if (parent != null) {
-        await _proposeFromEnumConstantDeclaration(builder, parent.name, parent);
+        await _proposeFromEnumConstantDeclaration(
+            builder, parent.name2, parent);
       }
     }
   }
 
-  Future<void> _proposeFromConstructorName(ChangeBuilder builder,
-      SimpleIdentifier name, ConstructorName constructorName) async {
+  Future<void> _proposeFromConstructorName(ChangeBuilder builder, Token name,
+      ConstructorName constructorName) async {
     InstanceCreationExpression? instanceCreation;
     _constructorName = constructorName.toSource();
-    if (constructorName.name == name) {
+    if (constructorName.name?.token == name) {
       var grandParent = constructorName.parent;
       // Type.name
       if (grandParent is InstanceCreationExpression) {
@@ -101,8 +103,8 @@
         constructorName: name, argumentList: instanceCreation.argumentList);
   }
 
-  Future<void> _proposeFromEnumConstantDeclaration(ChangeBuilder builder,
-      SimpleIdentifier name, EnumConstantDeclaration parent) async {
+  Future<void> _proposeFromEnumConstantDeclaration(
+      ChangeBuilder builder, Token name, EnumConstantDeclaration parent) async {
     var grandParent = parent.parent;
     if (grandParent is! EnumDeclaration) {
       return;
@@ -137,7 +139,7 @@
 
     var arguments = parent.arguments;
     _constructorName =
-        '${targetNode.name}${arguments?.constructorSelector ?? ''}';
+        '${targetNode.name2.lexeme}${arguments?.constructorSelector ?? ''}';
 
     await _write(
       builder,
@@ -145,7 +147,7 @@
       targetElement,
       targetLocation,
       isConst: true,
-      constructorName: arguments?.constructorSelector?.name,
+      constructorName: arguments?.constructorSelector?.name.token,
       argumentList: arguments?.argumentList,
     );
   }
@@ -163,7 +165,7 @@
     }
 
     // prepare target ClassDeclaration
-    var targetElement = constructorElement.enclosingElement2;
+    var targetElement = constructorElement.enclosingElement3;
     var targetResult = await sessionHelper.getElementDeclaration(targetElement);
     if (targetResult == null) {
       return;
@@ -199,10 +201,10 @@
 
   Future<void> _write(
     ChangeBuilder builder,
-    SimpleIdentifier name,
+    Token name,
     ClassElement targetElement,
     InsertionLocation targetLocation, {
-    SimpleIdentifier? constructorName,
+    Token? constructorName,
     bool isConst = false,
     ArgumentList? argumentList,
   }) async {
@@ -213,12 +215,12 @@
         builder.writeConstructorDeclaration(targetElement.name,
             isConst: isConst,
             argumentList: argumentList,
-            constructorName: constructorName,
+            constructorName: constructorName?.lexeme,
             constructorNameGroupName: 'NAME');
         builder.write(targetLocation.suffix);
       });
       if (targetFile == file) {
-        builder.addLinkedPosition(range.node(name), 'NAME');
+        builder.addLinkedPosition(range.token(name), 'NAME');
       }
     });
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart
index 98d9df5..e750314 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart
@@ -28,7 +28,7 @@
       return;
     }
 
-    var className = classDeclaration.name.name;
+    var className = classDeclaration.name2.lexeme;
     var superType = classDeclaration.declaredElement?.supertype;
     if (superType == null) {
       return;
@@ -70,7 +70,7 @@
       for (var variableList in variableLists) {
         fieldNames.addAll(variableList.variables
             .where((v) => v.initializer == null)
-            .map((v) => v.name.name));
+            .map((v) => v.name2.lexeme));
       }
 
       await builder.addDartFileEdit(file, (builder) {
@@ -143,7 +143,7 @@
     for (var variableList in variableLists) {
       var fieldNames = variableList.variables
           .where((v) => v.initializer == null)
-          .map((v) => v.name.name);
+          .map((v) => v.name2.lexeme);
 
       for (var fieldName in fieldNames) {
         if (fieldName == 'child' || fieldName == 'children') {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart
index 7d54c79..4da661d 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart
@@ -37,8 +37,7 @@
       return;
     }
 
-    var nameNode = parameter.identifier;
-    _fieldName = nameNode.name;
+    _fieldName = parameter.name.lexeme;
 
     var targetLocation = utils.prepareNewFieldLocation(targetClassNode);
     if (targetLocation == null) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart
index a77eb43..80d31df 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart
@@ -68,7 +68,7 @@
       final classElement = classDecl.declaredElement!;
 
       var missingEquals = memberDecl is FieldDeclaration ||
-          (memberDecl as MethodDeclaration).name.name == 'hashCode';
+          (memberDecl as MethodDeclaration).name2.lexeme == 'hashCode';
       ExecutableElement? element;
       if (missingEquals) {
         _memberName = '==';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart b/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart
index 9c8ca83..0512f36 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart
@@ -34,7 +34,7 @@
         importedUris.add(uri.relativeUri);
       }
     }
-    var matchers = ElementMatcher.matchersForNode(node);
+    var matchers = ElementMatcher.matchersForNode(node, token);
     if (matchers.isEmpty) {
       // The node doesn't represent any element that can be transformed.
       return;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart b/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart
index b9c9d5c..2c74063 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart
@@ -40,15 +40,15 @@
       return;
     }
     var field = fields.first;
-    var nameNode = field.name;
+    var nameToken = field.name2;
     var fieldElement = field.declaredElement as FieldElement;
     // should have a public name
-    var name = nameNode.name;
+    var name = nameToken.lexeme;
     if (Identifier.isPrivateName(name)) {
       return;
     }
     // should be on the name
-    if (nameNode != node) {
+    if (nameToken != token) {
       return;
     }
 
@@ -60,17 +60,17 @@
 
     await builder.addDartFileEdit(file, (builder) {
       // rename field
-      builder.addSimpleReplacement(range.node(nameNode), '_$name');
+      builder.addSimpleReplacement(range.token(nameToken), '_$name');
       // update references in constructors
       for (var member in classDeclaration.members) {
         if (member is ConstructorDeclaration) {
           for (var parameter in member.parameters.parameters) {
-            var identifier = parameter.identifier;
+            var identifier = parameter.name;
             var parameterElement = parameter.declaredElement;
             if (identifier != null &&
                 parameterElement is FieldFormalParameterElement &&
                 parameterElement.field == fieldElement) {
-              builder.addSimpleReplacement(range.node(identifier), '_$name');
+              builder.addSimpleReplacement(range.token(identifier), '_$name');
             }
           }
         }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/extend_class_for_mixin.dart b/pkg/analysis_server/lib/src/services/correction/dart/extend_class_for_mixin.dart
index ee1735a..74eaf76 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/extend_class_for_mixin.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/extend_class_for_mixin.dart
@@ -34,7 +34,7 @@
       _typeName = message.substring(startIndex, endIndex);
       await builder.addDartFileEdit(file, (builder) {
         builder.addSimpleInsertion(
-            declaration.typeParameters?.end ?? declaration.name.end,
+            declaration.typeParameters?.end ?? declaration.name2.end,
             ' extends $_typeName');
       });
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart
index 15517dc..bfca7e7 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart
@@ -146,7 +146,7 @@
               builder.writeln('  @override');
               builder.write('  ');
               builder.writeReference(stateClass);
-              builder.write('<${widgetClass.name}$typeParams>');
+              builder.write('<${widgetClass.name2.lexeme}$typeParams>');
               builder.writeln(' createState() => $stateName$typeParams();');
               if (hasEmptyLineAfterCreateState) {
                 builder.writeln();
@@ -205,7 +205,7 @@
         builder.writeReference(stateClass);
 
         // Write just param names (and not bounds, metadata and docs).
-        builder.write('<${widgetClass.name}');
+        builder.write('<${widgetClass.name2.lexeme}');
         if (typeParameters != null) {
           builder.write('<');
           var first = true;
@@ -214,7 +214,7 @@
               builder.write(', ');
               first = false;
             }
-            builder.write(param.name.name);
+            builder.write(param.name2.lexeme);
           }
           builder.write('>');
         }
@@ -247,7 +247,7 @@
 
   MethodDeclaration? _findBuildMethod(ClassDeclaration widgetClass) {
     for (var member in widgetClass.members) {
-      if (member is MethodDeclaration && member.name.name == 'build') {
+      if (member is MethodDeclaration && member.name2.lexeme == 'build') {
         var parameters = member.parameters;
         if (parameters != null && parameters.parameters.length == 1) {
           return member;
@@ -309,7 +309,7 @@
     }
     var element = node.staticElement;
     if (element is ExecutableElement &&
-        element.enclosingElement2 == widgetClassElement &&
+        element.enclosingElement3 == widgetClassElement &&
         !elementsToMove.contains(element)) {
       var offset = node.offset - linesRange.offset;
       var qualifier =
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateless_widget.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateless_widget.dart
index dcbc524..0280d715 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateless_widget.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateless_widget.dart
@@ -48,7 +48,7 @@
     var stateClassElement = stateClass?.declaredElement;
     if (stateClass == null ||
         stateClassElement == null ||
-        !Identifier.isPrivateName(stateClass.name.name) ||
+        !Identifier.isPrivateName(stateClass.name2.lexeme) ||
         !_isSameTypeParameters(widgetClass, stateClass)) {
       return;
     }
@@ -170,7 +170,7 @@
 
   MethodDeclaration? _findCreateStateMethod(ClassDeclaration widgetClass) {
     for (var member in widgetClass.members) {
-      if (member is MethodDeclaration && member.name.name == 'createState') {
+      if (member is MethodDeclaration && member.name2.lexeme == 'createState') {
         var parameters = member.parameters;
         if (parameters?.parameters.isEmpty ?? false) {
           return member;
@@ -214,7 +214,7 @@
     outer:
     for (var stateParam in stateParams) {
       for (var widgetParam in widgetParams) {
-        if (stateParam.name.name == widgetParam.name.name &&
+        if (stateParam.name2.lexeme == widgetParam.name2.lexeme &&
             stateParam.bound?.type == widgetParam.bound?.type) {
           continue outer;
         }
@@ -242,7 +242,7 @@
       }
       if (expression is MethodInvocation &&
           expression.target is SuperExpression &&
-          methodDeclaration!.name.name == expression.methodName.name) {
+          methodDeclaration!.name2.lexeme == expression.methodName.name) {
         return true;
       }
     }
@@ -315,7 +315,7 @@
     }
     var element = node.staticElement;
     if (element is ExecutableElement &&
-        element.enclosingElement2 == widgetClassElement &&
+        element.enclosingElement3 == widgetClassElement &&
         !elementsToMove.contains(element)) {
       var parent = node.parent;
       if (parent is PrefixedIdentifier) {
@@ -358,7 +358,7 @@
   void visitMethodInvocation(MethodInvocation node) {
     var methodElement = node.methodName.staticElement?.declaration;
     if (methodElement is ClassMemberElement) {
-      var classElement = methodElement.enclosingElement2;
+      var classElement = methodElement.enclosingElement3;
       if (classElement is ClassElement &&
           Flutter.instance.isExactState(classElement) &&
           !FlutterConvertToStatelessWidget._isDefaultOverride(
@@ -388,7 +388,7 @@
     var classDeclaration =
         methodDeclaration?.thisOrAncestorOfType<ClassDeclaration>();
 
-    if (methodDeclaration?.name.name != 'createState' ||
+    if (methodDeclaration?.name2.lexeme != 'createState' ||
         classDeclaration?.declaredElement != widgetClassElement) {
       used = true;
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/inline_typedef.dart b/pkg/analysis_server/lib/src/services/correction/dart/inline_typedef.dart
index 2c5328d..3cd39a5 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/inline_typedef.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/inline_typedef.dart
@@ -44,7 +44,7 @@
     List<FormalParameter> parameters;
     if (parent is FunctionTypeAlias) {
       returnType = parent.returnType;
-      _name = parent.name.name;
+      _name = parent.name2.lexeme;
       typeParameters = parent.typeParameters;
       parameters = parent.parameters.parameters;
     } else if (parent is GenericTypeAlias) {
@@ -56,7 +56,7 @@
         return;
       }
       returnType = functionType.returnType;
-      _name = parent.name.name;
+      _name = parent.name2.lexeme;
       typeParameters = functionType.typeParameters;
       parameters = functionType.parameters.parameters;
     } else {
@@ -128,10 +128,10 @@
               builder.write(utils.getNodeText(typeAnnotation));
             }
             if (parameter.isNamed) {
-              var identifier = parameter.identifier;
+              var identifier = parameter.name;
               if (identifier != null) {
                 builder.write(' ');
-                builder.write(identifier.name);
+                builder.write(identifier.lexeme);
               }
             }
           }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/join_variable_declaration.dart b/pkg/analysis_server/lib/src/services/correction/dart/join_variable_declaration.dart
index 54a8773..f85fb95 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/join_variable_declaration.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/join_variable_declaration.dart
@@ -148,7 +148,7 @@
 
     await builder.addDartFileEdit(file, (builder) {
       builder.addSimpleReplacement(
-        range.endStart(declaredVariable.name, assignment.operator),
+        range.endStart(declaredVariable.name2, assignment.operator),
         ' ',
       );
     });
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/make_class_abstract.dart b/pkg/analysis_server/lib/src/services/correction/dart/make_class_abstract.dart
index d667d2f..826fb84 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/make_class_abstract.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/make_class_abstract.dart
@@ -23,7 +23,7 @@
     if (enclosingClass == null) {
       return;
     }
-    _className = enclosingClass.name.name;
+    _className = enclosingClass.name2.lexeme;
     await builder.addDartFileEdit(file, (builder) {
       builder.addSimpleInsertion(
           enclosingClass.classKeyword.offset, 'abstract ');
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/make_field_not_final.dart b/pkg/analysis_server/lib/src/services/correction/dart/make_field_not_final.dart
index 71b2377..3a9a404 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/make_field_not_final.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/make_field_not_final.dart
@@ -45,7 +45,7 @@
     }
 
     // It must be a field declaration.
-    if (getter.enclosingElement2 is! ClassElement) {
+    if (getter.enclosingElement3 is! ClassElement) {
       return;
     }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/make_field_public.dart b/pkg/analysis_server/lib/src/services/correction/dart/make_field_public.dart
index f492510..c11ace4 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/make_field_public.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/make_field_public.dart
@@ -28,7 +28,9 @@
     var getterName = node.name;
     _fieldName = '_$getterName';
     var parent = node.parent;
-    if (parent is MethodDeclaration && parent.name == node && parent.isGetter) {
+    if (parent is MethodDeclaration &&
+        parent.name2 == token &&
+        parent.isGetter) {
       var container = parent.parent;
       if (container is ClassOrMixinDeclaration) {
         var members = container.members;
@@ -36,12 +38,12 @@
         VariableDeclaration? field;
         for (var member in members) {
           if (member is MethodDeclaration &&
-              member.name.name == getterName &&
+              member.name2.lexeme == getterName &&
               member.isSetter) {
             setter = member;
           } else if (member is FieldDeclaration) {
             for (var variable in member.fields.variables) {
-              if (variable.name.name == _fieldName) {
+              if (variable.name2.lexeme == _fieldName) {
                 field = variable;
               }
             }
@@ -51,7 +53,7 @@
           return;
         }
         await builder.addDartFileEdit(file, (builder) {
-          builder.addSimpleReplacement(range.node(field!.name), getterName);
+          builder.addSimpleReplacement(range.token(field!.name2), getterName);
           builder.removeMember(members, parent);
           builder.removeMember(members, setter!);
         });
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/make_final.dart b/pkg/analysis_server/lib/src/services/correction/dart/make_final.dart
index d95deb7..c3dbb10 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/make_final.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/make_final.dart
@@ -62,7 +62,7 @@
             builder.addSimpleInsertion(type.offset, 'final ');
             return;
           }
-          final identifier = simpleNode.identifier;
+          final identifier = simpleNode.name;
           if (identifier != null) {
             builder.addSimpleInsertion(identifier.offset, 'final ');
           } else {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/make_variable_nullable.dart b/pkg/analysis_server/lib/src/services/correction/dart/make_variable_nullable.dart
index e624cab..6c2b0d2 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/make_variable_nullable.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/make_variable_nullable.dart
@@ -118,7 +118,7 @@
       if (parameter.question != null) {
         return;
       }
-      _variableName = parameter.identifier.name;
+      _variableName = parameter.name.lexeme;
       await builder.addDartFileEdit(file, (builder) {
         // Add '?' after `)`.
         builder.addSimpleInsertion(parameter.endToken.end, '?');
@@ -128,7 +128,7 @@
       if (type == null || !_typeCanBeMadeNullable(type)) {
         return;
       }
-      _variableName = parameter.identifier.name;
+      _variableName = parameter.name.lexeme;
       await builder.addDartFileEdit(file, (builder) {
         builder.addSimpleInsertion(type.end, '?');
       });
@@ -141,7 +141,7 @@
     if (parameter.question != null) {
       return;
     }
-    _variableName = parameter.identifier.name;
+    _variableName = parameter.name.lexeme;
     await builder.addDartFileEdit(file, (builder) {
       // Add '?' after `)`.
       builder.addSimpleInsertion(parameter.endToken.end, '?');
@@ -155,12 +155,12 @@
       return;
     }
 
-    var identifier = parameter.identifier;
+    var identifier = parameter.name;
     if (identifier == null) {
       return;
     }
 
-    _variableName = identifier.name;
+    _variableName = identifier.lexeme;
     await builder.addDartFileEdit(file, (builder) {
       builder.addSimpleInsertion(type.end, '?');
     });
@@ -174,7 +174,7 @@
       if (parameter.question != null) {
         return;
       }
-      _variableName = parameter.identifier.name;
+      _variableName = parameter.name.lexeme;
       await builder.addDartFileEdit(file, (builder) {
         // Add '?' after `)`.
         builder.addSimpleInsertion(parameter.endToken.end, '?');
@@ -184,7 +184,7 @@
       if (type == null || !_typeCanBeMadeNullable(type)) {
         return;
       }
-      _variableName = parameter.identifier.name;
+      _variableName = parameter.name.lexeme;
       await builder.addDartFileEdit(file, (builder) {
         builder.addSimpleInsertion(type.end, '?');
       });
@@ -226,7 +226,7 @@
   Future<void> _updateVariableType(ChangeBuilder builder,
       VariableDeclarationList declarationList, DartType newType) async {
     var variable = declarationList.variables[0];
-    _variableName = variable.name.name;
+    _variableName = variable.name2.lexeme;
     await builder.addDartFileEdit(file, (builder) {
       var keyword = declarationList.keyword;
       if (keyword != null && keyword.type == Keyword.VAR) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/qualify_reference.dart b/pkg/analysis_server/lib/src/services/correction/dart/qualify_reference.dart
index 8b178ef..21b7a43 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/qualify_reference.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/qualify_reference.dart
@@ -40,7 +40,7 @@
       return;
     }
 
-    var enclosingElement = memberElement.enclosingElement2;
+    var enclosingElement = memberElement.enclosingElement3;
     if (enclosingElement == null ||
         enclosingElement.library != libraryElement) {
       // TODO(brianwilkerson) Support qualifying references to members defined
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_initializer.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_initializer.dart
index 0a44117..d203609 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_initializer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_initializer.dart
@@ -38,7 +38,7 @@
     var parameter = node.thisOrAncestorOfType<DefaultFormalParameter>();
     if (parameter != null) {
       // Handle formal parameters with default values.
-      var identifier = parameter.identifier;
+      var identifier = parameter.name;
       var defaultValue = parameter.defaultValue;
       if (identifier != null && defaultValue != null) {
         await builder.addDartFileEdit(file, (builder) {
@@ -54,7 +54,7 @@
       if (variable != null && initializer != null) {
         await builder.addDartFileEdit(file, (builder) {
           builder.addDeletion(
-            range.endEnd(variable.name, initializer),
+            range.endEnd(variable.name2, initializer),
           );
         });
       } else {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_parameters_in_getter_declaration.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_parameters_in_getter_declaration.dart
index 69409b5..a239ba6 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_parameters_in_getter_declaration.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_parameters_in_getter_declaration.dart
@@ -20,7 +20,7 @@
     final node = this.node;
     if (node is MethodDeclaration) {
       // Support for the analyzer error.
-      var name = node.name;
+      var name = node.name2;
       var body = node.body;
       await builder.addDartFileEdit(file, (builder) {
         builder.addSimpleReplacement(range.endStart(name, body), ' ');
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_type_annotation.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_type_annotation.dart
index 853558be..fb8a5fa 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_type_annotation.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_type_annotation.dart
@@ -55,12 +55,12 @@
     }
     // ignore if an incomplete variable declaration
     if (declarationList.variables.length == 1 &&
-        declarationList.variables[0].name.isSynthetic) {
+        declarationList.variables[0].name2.isSynthetic) {
       return;
     }
     // must be not after the name of the variable
     var firstVariable = declarationList.variables[0];
-    if (selectionOffset > firstVariable.name.end) {
+    if (selectionOffset > firstVariable.name2.end) {
       return;
     }
 
@@ -127,7 +127,7 @@
       return;
     }
     var keyword = declaration.keyword;
-    var variableName = declaration.identifier;
+    var variableName = declaration.name;
     await builder.addDartFileEdit(file, (builder) {
       var typeRange = range.startStart(typeNode, variableName);
       if (keyword != null && keyword.lexeme != 'var') {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_local_variable.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_local_variable.dart
index 3bec4f2..9a5aa0e 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_local_variable.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_local_variable.dart
@@ -27,7 +27,7 @@
   @override
   Future<void> compute(ChangeBuilder builder) async {
     final declaration = node.parent;
-    if (!(declaration is VariableDeclaration && declaration.name == node)) {
+    if (!(declaration is VariableDeclaration && declaration.name2 == token)) {
       return;
     }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/rename_method_parameter.dart b/pkg/analysis_server/lib/src/services/correction/dart/rename_method_parameter.dart
index 8a84fe8..7ba42b8 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/rename_method_parameter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/rename_method_parameter.dart
@@ -25,7 +25,7 @@
   Future<void> compute(ChangeBuilder builder) async {
     final parameter = node.parent;
     if (parameter is! FormalParameter) return;
-    var paramIdentifier = parameter.identifier;
+    var paramIdentifier = parameter.name;
     if (paramIdentifier == null) return;
 
     var method = parameter.thisOrAncestorOfType<MethodDeclaration>();
@@ -38,12 +38,12 @@
     if (classElement is! ClassElement) return;
 
     var parentMethod = classElement.lookUpInheritedMethod(
-        method.name.name, classElement.library);
+        method.name2.lexeme, classElement.library);
     if (parentMethod == null) return;
 
     var parameters = methodParameters.parameters;
     var parentParameters = parentMethod.parameters;
-    var oldName = paramIdentifier.name;
+    var oldName = paramIdentifier.lexeme;
 
     var i = parameters.indexOf(parameter);
     if (0 <= i && i < parentParameters.length) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_conditional_with_if_else.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_conditional_with_if_else.dart
index c752866..fdc7163 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_conditional_with_if_else.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_conditional_with_if_else.dart
@@ -114,17 +114,17 @@
                 builder.writeType(type);
               });
             } else {
-              builder.addInsertion(variable.name.offset, (builder) {
+              builder.addInsertion(variable.name2.offset, (builder) {
                 builder.writeType(type);
                 builder.write(' ');
               });
             }
           }
-          builder.addDeletion(range.endEnd(variable.name, conditional));
+          builder.addDeletion(range.endEnd(variable.name2, conditional));
           var conditionSrc = utils.getNodeText(conditional.condition);
           var thenSrc = utils.getNodeText(conditional.thenExpression);
           var elseSrc = utils.getNodeText(conditional.elseExpression);
-          var name = variable.name.name;
+          var name = variable.name2.lexeme;
           var src = eol;
           src += '${prefix}if ($conditionSrc) {$eol';
           src += '$prefix$indent$name = $thenSrc;$eol';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_identifier.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_identifier.dart
index 461563b..1485806 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_identifier.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_identifier.dart
@@ -28,8 +28,8 @@
         node.thisOrAncestorOfType<FunctionTypedFormalParameter>();
     if (functionTyped != null) {
       await builder.addDartFileEdit(file, (builder) {
-        builder.addSimpleReplacement(range.node(functionTyped),
-            utils.getNodeText(functionTyped.identifier));
+        builder.addSimpleReplacement(
+            range.node(functionTyped), functionTyped.name.lexeme);
       });
     }
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_var.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_var.dart
index 3c5a55b..abb1a10 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_var.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_var.dart
@@ -110,7 +110,7 @@
       }
       await builder.addDartFileEdit(file, (builder) {
         if (parent.isConst || parent.isFinal) {
-          builder.addDeletion(range.startStart(type, parent.identifier));
+          builder.addDeletion(range.startStart(type, parent.name));
         } else {
           builder.addSimpleReplacement(range.node(type), 'var');
         }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/shadow_field.dart b/pkg/analysis_server/lib/src/services/correction/dart/shadow_field.dart
index f18ab8c..5ed846e 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/shadow_field.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/shadow_field.dart
@@ -28,7 +28,7 @@
       return;
     }
 
-    if (!accessor.isGetter || accessor.enclosingElement2 is! ClassElement) {
+    if (!accessor.isGetter || accessor.enclosingElement3 is! ClassElement) {
       // TODO(brianwilkerson) Should we also require that the getter be synthetic?
       return;
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/sort_unnamed_constructor_first.dart b/pkg/analysis_server/lib/src/services/correction/dart/sort_unnamed_constructor_first.dart
index 46b54ee..a55adde 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/sort_unnamed_constructor_first.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/sort_unnamed_constructor_first.dart
@@ -32,11 +32,11 @@
             .firstWhereOrNull((child) => child is ConstructorDeclaration)
         as ConstructorDeclaration?;
     if (firstConstructor == null ||
-        firstConstructor.name == null ||
-        firstConstructor.name?.name == 'new') return;
+        firstConstructor.name2 == null ||
+        firstConstructor.name2?.lexeme == 'new') return;
 
     final unnamedConstructor = clazz.childEntities.firstWhereOrNull(
-            (child) => child is ConstructorDeclaration && child.name == null)
+            (child) => child is ConstructorDeclaration && child.name2 == null)
         as ConstructorDeclaration?;
     if (unnamedConstructor == null) return;
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/split_variable_declaration.dart b/pkg/analysis_server/lib/src/services/correction/dart/split_variable_declaration.dart
index 98ddb5b..0eff5c6 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/split_variable_declaration.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/split_variable_declaration.dart
@@ -41,7 +41,7 @@
 
     // The caret must be between the type and the variable name.
     var variable = variables[0];
-    if (!range.startEnd(statement, variable.name).contains(selectionOffset)) {
+    if (!range.startEnd(statement, variable.name2).contains(selectionOffset)) {
       return;
     }
 
@@ -64,8 +64,8 @@
       }
 
       var indent = utils.getNodePrefix(statement);
-      var name = variable.name.name;
-      builder.addSimpleInsertion(variable.name.end, ';$eol$indent$name');
+      var name = variable.name2.lexeme;
+      builder.addSimpleInsertion(variable.name2.end, ';$eol$indent$name');
     });
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart
index 1180800..135155a 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart
@@ -87,7 +87,7 @@
       if (_isInvalidIndex(typeParameters?.typeParameters)) {
         return null;
       }
-      return _TypeParameterData(typeParameters, parent.name.end);
+      return _TypeParameterData(typeParameters, parent.name2.end);
     } else if (node is TypeArgumentList && parent is ExtensionOverride) {
       // wrong_number_of_type_arguments_extension
       if (!argumentValue.validate(context)) {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart
index b606c9f..f430cad 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart
@@ -5,6 +5,7 @@
 import 'package:analysis_server/src/services/correction/fix/data_driven/element_descriptor.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/element_kind.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart'
     show ClassElement, ExtensionElement, PrefixElement;
 import 'package:analyzer/dart/element/type.dart';
@@ -97,7 +98,7 @@
   /// Return a list of element matchers that will match the element that is, or
   /// should be, associated with the given [node]. The list will be empty if
   /// there are no appropriate matchers for the [node].
-  static List<ElementMatcher> matchersForNode(AstNode? node) {
+  static List<ElementMatcher> matchersForNode(AstNode? node, Token? nameToken) {
     if (node == null) {
       return const <ElementMatcher>[];
     }
@@ -106,7 +107,7 @@
       return const <ElementMatcher>[];
     }
     var builder = _MatcherBuilder(importedUris);
-    builder.buildMatchersForNode(node);
+    builder.buildMatchersForNode(node, nameToken);
     return builder.matchers.toList();
   }
 
@@ -143,7 +144,7 @@
 
   _MatcherBuilder(this.importedUris);
 
-  void buildMatchersForNode(AstNode? node) {
+  void buildMatchersForNode(AstNode? node, Token? nameToken) {
     if (node is ArgumentList) {
       _buildFromArgumentList(node);
     } else if (node is BinaryExpression) {
@@ -159,8 +160,8 @@
       _buildFromNamedType(node);
     } else if (node is PrefixedIdentifier) {
       _buildFromPrefixedIdentifier(node);
-    } else if (node is SimpleIdentifier) {
-      _buildFromSimpleIdentifier(node);
+    } else if (node is SimpleIdentifier && nameToken != null) {
+      _buildFromSimpleIdentifier(node, nameToken);
     } else if (node is TypeArgumentList) {
       _buildFromTypeArgumentList(node);
     }
@@ -201,7 +202,7 @@
         );
       }
     } else if (parent is SuperConstructorInvocation) {
-      var superclassName = parent.staticElement?.enclosingElement2.name;
+      var superclassName = parent.staticElement?.enclosingElement3.name;
       if (superclassName != null) {
         _addMatcher(
           components: [parent.constructorName?.name ?? '', superclassName],
@@ -257,7 +258,7 @@
   /// Build a matcher for the method being declared.
   void _buildFromMethodDeclaration(MethodDeclaration node) {
     _addMatcher(
-      components: [node.name.name],
+      components: [node.name2.lexeme],
       kinds: [ElementKind.methodKind],
     );
   }
@@ -447,7 +448,7 @@
   }
 
   /// Build a matcher for the element referenced by the identifier.
-  void _buildFromSimpleIdentifier(SimpleIdentifier node) {
+  void _buildFromSimpleIdentifier(SimpleIdentifier node, Token nameToken) {
     // TODO(brianwilkerson) Use the static element, if there is one, in order to
     //  get a more exact matcher.
     var parent = node.parent;
@@ -458,7 +459,7 @@
       _buildFromArgumentList(parent.parent!.parent as ArgumentList);
     } else if (parent is NamedType) {
       _buildFromNamedType(parent);
-    } else if (parent is MethodDeclaration && node == parent.name) {
+    } else if (parent is MethodDeclaration && nameToken == parent.name2) {
       _buildFromMethodDeclaration(parent);
     } else if (parent is MethodInvocation &&
         node == parent.methodName &&
@@ -502,7 +503,7 @@
       }
     }
     if (element != null) {
-      var enclosingElement = element.enclosingElement2;
+      var enclosingElement = element.enclosingElement3;
       if (enclosingElement is ClassElement) {
         return [identifier.name, enclosingElement.name];
       } else if (enclosingElement is ExtensionElement) {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart
index 2493049..568dd96 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart
@@ -38,9 +38,9 @@
         if (overriddenParameter == null) {
           // If the overridden parameter has already been removed, then just
           // rename the old parameter to have the new name.
-          var identifier = parameter.identifier;
+          var identifier = parameter.name;
           if (identifier != null) {
-            builder.addSimpleReplacement(range.node(identifier), newName);
+            builder.addSimpleReplacement(range.token(identifier), newName);
           }
         } else {
           // If the overridden parameter still exists, then mark it as
@@ -122,7 +122,7 @@
   ExecutableElement? overriddenElement() {
     var element = declaredElement;
     if (element != null) {
-      var enclosingElement = element.enclosingElement2;
+      var enclosingElement = element.enclosingElement3;
       if (enclosingElement is ClassElement) {
         var name = Name(enclosingElement.library.source.uri, element.name);
         return InheritanceManager3().getInherited2(enclosingElement, name);
diff --git a/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart b/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
index 93de681..63b84f6 100644
--- a/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
+++ b/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
@@ -34,7 +34,7 @@
     // If we're in a build() method, use 'build' as the name prefix.
     var method = assignedExpression?.thisOrAncestorOfType<MethodDeclaration>();
     if (method != null) {
-      var enclosingName = method.name.name;
+      var enclosingName = method.name2.lexeme;
       if (enclosingName.startsWith('build')) {
         prefix = 'build';
       }
diff --git a/pkg/analysis_server/lib/src/services/correction/namespace.dart b/pkg/analysis_server/lib/src/services/correction/namespace.dart
index 5f85fc8..a2abded 100644
--- a/pkg/analysis_server/lib/src/services/correction/namespace.dart
+++ b/pkg/analysis_server/lib/src/services/correction/namespace.dart
@@ -42,7 +42,7 @@
     String prefix,
     Element element,
     Map<LibraryImportElement, Set<Element>> importElementsMap) {
-  if (element.enclosingElement2 is! CompilationUnitElement) {
+  if (element.enclosingElement3 is! CompilationUnitElement) {
     return null;
   }
   var usedLibrary = element.library;
diff --git a/pkg/analysis_server/lib/src/services/correction/sort_members.dart b/pkg/analysis_server/lib/src/services/correction/sort_members.dart
index 4c8bed4..e871b08 100644
--- a/pkg/analysis_server/lib/src/services/correction/sort_members.dart
+++ b/pkg/analysis_server/lib/src/services/correction/sort_members.dart
@@ -112,19 +112,14 @@
       String name;
       if (member is ConstructorDeclaration) {
         kind = _MemberKind.CLASS_CONSTRUCTOR;
-        var nameNode = member.name;
-        if (nameNode == null) {
-          name = '';
-        } else {
-          name = nameNode.name;
-        }
+        name = member.name2?.lexeme ?? '';
       } else if (member is FieldDeclaration) {
         var fieldDeclaration = member;
         List<VariableDeclaration> fields = fieldDeclaration.fields.variables;
         if (fields.isNotEmpty) {
           kind = _MemberKind.CLASS_FIELD;
           isStatic = fieldDeclaration.isStatic;
-          name = fields[0].name.name;
+          name = fields[0].name2.lexeme;
         } else {
           // Don't sort members if there are errors in the code.
           return;
@@ -132,7 +127,7 @@
       } else if (member is MethodDeclaration) {
         var method = member;
         isStatic = method.isStatic;
-        name = method.name.name;
+        name = method.name2.lexeme;
         if (method.isGetter) {
           kind = _MemberKind.CLASS_ACCESSOR;
           name += ' getter';
@@ -172,23 +167,22 @@
       String name;
       if (member is ClassOrMixinDeclaration) {
         kind = _MemberKind.UNIT_CLASS;
-        name = member.name.name;
+        name = member.name2.lexeme;
       } else if (member is ClassTypeAlias) {
         kind = _MemberKind.UNIT_CLASS;
-        name = member.name.name;
+        name = member.name2.lexeme;
       } else if (member is EnumDeclaration) {
         kind = _MemberKind.UNIT_CLASS;
-        name = member.name.name;
+        name = member.name2.lexeme;
       } else if (member is ExtensionDeclaration) {
         kind = _MemberKind.UNIT_EXTENSION;
-        name = member.name?.name ?? '';
+        name = member.name2?.lexeme ?? '';
       } else if (member is FunctionDeclaration) {
-        var function = member;
-        name = function.name.name;
-        if (function.isGetter) {
+        name = member.name2.lexeme;
+        if (member.isGetter) {
           kind = _MemberKind.UNIT_ACCESSOR;
           name += ' getter';
-        } else if (function.isSetter) {
+        } else if (member.isSetter) {
           kind = _MemberKind.UNIT_ACCESSOR;
           name += ' setter';
         } else {
@@ -200,10 +194,10 @@
         }
       } else if (member is FunctionTypeAlias) {
         kind = _MemberKind.UNIT_FUNCTION_TYPE;
-        name = member.name.name;
+        name = member.name2.lexeme;
       } else if (member is GenericTypeAlias) {
         kind = _MemberKind.UNIT_GENERIC_TYPE_ALIAS;
-        name = member.name.name;
+        name = member.name2.lexeme;
       } else if (member is TopLevelVariableDeclaration) {
         var variableDeclaration = member;
         List<VariableDeclaration> variables =
@@ -214,7 +208,7 @@
           } else {
             kind = _MemberKind.UNIT_VARIABLE;
           }
-          name = variables[0].name.name;
+          name = variables[0].name2.lexeme;
         } else {
           // Don't sort members if there are errors in the code.
           return;
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index 8fc4dc7..05db61d 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -219,7 +219,7 @@
 String getElementQualifiedName(Element element) {
   var kind = element.kind;
   if (kind == ElementKind.FIELD || kind == ElementKind.METHOD) {
-    return '${element.enclosingElement2!.displayName}.${element.displayName}';
+    return '${element.enclosingElement3!.displayName}.${element.displayName}';
   } else if (kind == ElementKind.LIBRARY) {
     // Libraries may not have names, so use a path relative to the context root.
     final session = element.session!;
@@ -476,7 +476,7 @@
     return true;
   }
   return node.parent is VariableDeclaration &&
-      (node.parent as VariableDeclaration).name == node;
+      (node.parent as VariableDeclaration).name2 == node.token;
 }
 
 /// Return `true` if the given [node] is the name of a [NamedExpression].
@@ -1379,7 +1379,7 @@
   /// Checks if [element] is visible in [targetExecutableElement] or
   /// [targetClassElement].
   bool _isTypeParameterVisible(TypeParameterElement element) {
-    var enclosing = element.enclosingElement2;
+    var enclosing = element.enclosingElement3;
     return identical(enclosing, targetExecutableElement) ||
         identical(enclosing, targetClassElement);
   }
diff --git a/pkg/analysis_server/lib/src/services/flutter/property.dart b/pkg/analysis_server/lib/src/services/flutter/property.dart
index 4f3d763..31bda1e 100644
--- a/pkg/analysis_server/lib/src/services/flutter/property.dart
+++ b/pkg/analysis_server/lib/src/services/flutter/property.dart
@@ -463,7 +463,7 @@
       var constructor = propertyExpression.constructorName.staticElement;
       if (flutter != null &&
           constructor != null &&
-          constructor.enclosingElement2 == classEdgeInsets) {
+          constructor.enclosingElement3 == classEdgeInsets) {
         var arguments = propertyExpression.argumentList.arguments;
         var constructorName = constructor.name;
         if (constructorName == 'all') {
diff --git a/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart b/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
index 0a1c223..7e79982 100644
--- a/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
+++ b/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
@@ -122,7 +122,7 @@
 
   /// The set of classes for which we are currently adding properties,
   /// used to prevent infinite recursion.
-  final Set<ClassElement> classesBeingProcessed = <ClassElement>{};
+  final Set<InterfaceElement> elementsBeingProcessed = {};
 
   /// The resolved unit with the widget [InstanceCreationExpression].
   final ResolvedUnitResult resolvedUnit;
@@ -278,8 +278,8 @@
     constructorElement ??= classDescription?.constructor;
     if (constructorElement == null) return;
 
-    var classElement = constructorElement.enclosingElement2;
-    if (!classesBeingProcessed.add(classElement)) return;
+    var classElement = constructorElement.enclosingElement3;
+    if (!elementsBeingProcessed.add(classElement)) return;
 
     var existingNamed = <String>{};
     if (instanceCreation != null) {
@@ -320,7 +320,7 @@
       );
     }
 
-    classesBeingProcessed.remove(classElement);
+    elementsBeingProcessed.remove(classElement);
   }
 
   void _addProperty({
@@ -520,7 +520,7 @@
   }
 
   protocol.FlutterWidgetPropertyValueEnumItem _toEnumItem(FieldElement field) {
-    var classElement = field.enclosingElement2 as ClassElement;
+    var classElement = field.enclosingElement3 as ClassElement;
     var libraryUriStr = '${classElement.library.source.uri}';
     var documentation = getFieldDocumentation(field);
 
@@ -546,7 +546,7 @@
       if (element is PropertyAccessorElement && element.isGetter) {
         var field = element.variable;
         if (field is FieldElement && field.isStatic) {
-          var enclosingClass = field.enclosingElement2 as ClassElement;
+          var enclosingClass = field.enclosingElement3 as ClassElement;
           if (field.isEnumConstant ||
               _flutter.isExactAlignment(enclosingClass) ||
               _flutter.isExactAlignmentDirectional(enclosingClass)) {
diff --git a/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart b/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
index 6d6ec55..e411d2d 100644
--- a/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
+++ b/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
@@ -28,7 +28,7 @@
 /// name of the constructor, unless the constructor is a named constructor in
 /// which '<class-name>.<constructor-name>' is returned.
 String _computeConstructorElementName(ConstructorElement element) {
-  var name = element.enclosingElement2.name;
+  var name = element.enclosingElement3.name;
   var constructorName = element.name;
   if (constructorName.isNotEmpty) {
     name = '$name.$constructorName';
@@ -288,7 +288,7 @@
 
       // anchor- defines/binding
       addAnchorEdgesContainingEdge(
-          syntacticEntity: node.name,
+          syntacticEntity: node.name2,
           edges: [
             schema.DEFINES_BINDING_EDGE,
           ],
@@ -355,7 +355,7 @@
 
       // anchor
       addAnchorEdgesContainingEdge(
-          syntacticEntity: node.name,
+          syntacticEntity: node.name2,
           edges: [
             schema.DEFINES_BINDING_EDGE,
           ],
@@ -471,9 +471,9 @@
       // anchor
       var start = node.returnType.offset;
       var end = node.returnType.end;
-      var nameNode = node.name;
-      if (nameNode != null) {
-        end = nameNode.end;
+      var nameToken = node.name2;
+      if (nameToken != null) {
+        end = nameToken.end;
       }
       addAnchorEdgesContainingEdge(
           start: start,
@@ -503,7 +503,7 @@
   @override
   void visitDeclaredIdentifier(DeclaredIdentifier node) {
     var declaredElement = node.declaredElement!;
-    _handleVariableDeclaration(declaredElement, node.identifier,
+    _handleVariableDeclaration(declaredElement, node.name,
         subKind: schema.LOCAL_SUBKIND, type: declaredElement.type);
 
     // no children
@@ -517,7 +517,7 @@
 
     // anchor- defines/binding, defines
     addAnchorEdgesContainingEdge(
-        syntacticEntity: node.name,
+        syntacticEntity: node.name2,
         edges: [
           schema.DEFINES_BINDING_EDGE,
           schema.DEFINES_EDGE,
@@ -539,7 +539,7 @@
 
       // anchor- defines/binding
       addAnchorEdgesContainingEdge(
-          syntacticEntity: node.name,
+          syntacticEntity: node.name2,
           edges: [
             schema.DEFINES_BINDING_EDGE,
           ],
@@ -578,7 +578,7 @@
     _handleRefEdge(
       element,
       const <String>[schema.REF_EDGE],
-      syntacticEntity: node.identifier,
+      syntacticEntity: node.name,
     );
 
     // visit children
@@ -599,7 +599,7 @@
 
       // anchor- defines/binding
       addAnchorEdgesContainingEdge(
-          syntacticEntity: node.name,
+          syntacticEntity: node.name2,
           edges: [
             schema.DEFINES_BINDING_EDGE,
           ],
@@ -665,7 +665,6 @@
     // visit children
     _safelyVisit(node.documentationComment);
     _safelyVisitList(node.metadata);
-    _safelyVisit(node.identifier);
     _safelyVisit(node.typeParameters);
     _safelyVisit(node.parameters);
   }
@@ -729,13 +728,13 @@
       // We can't call _handleRefEdge as the anchor node has already been
       // written out.
       var enclosingEltVName = _vNameFromElement(
-          constructorElement.enclosingElement2, schema.RECORD_KIND);
+          constructorElement.enclosingElement3, schema.RECORD_KIND);
       var anchorVName =
           _vNameAnchor(constructorName.offset, constructorName.end);
       addEdge(anchorVName, schema.REF_EDGE, enclosingEltVName);
 
       // TODO(jwren): investigate
-      //   assert (element.enclosingElement2 != null);
+      //   assert (element.enclosingElement3 != null);
     }
     // visit children
     _safelyVisitList(constructorName.type.typeArguments?.arguments);
@@ -752,7 +751,7 @@
 
       // anchor- defines/binding
       addAnchorEdgesContainingEdge(
-          syntacticEntity: node.name,
+          syntacticEntity: node.name2,
           edges: [
             schema.DEFINES_BINDING_EDGE,
           ],
@@ -824,7 +823,7 @@
     // node.identifier can be null in cases with the new generic function type
     // syntax
     // TODO(jwren) add test cases for this situation
-    var identifier = node.identifier;
+    var identifier = node.name;
     if (identifier != null) {
       // The anchor and anchor edges generation are broken into two cases, the
       // first case is "method(parameter_name) ...", where the parameter
@@ -920,7 +919,7 @@
 
     // variable
     var declaredElement = node.declaredElement!;
-    _handleVariableDeclaration(declaredElement, node.name,
+    _handleVariableDeclaration(declaredElement, node.name2,
         subKind: isLocal ? schema.LOCAL_SUBKIND : schema.FIELD_SUBKIND,
         type: declaredElement.type);
 
@@ -1420,7 +1419,7 @@
   @override
   StringBuffer visitElement(Element element) {
     assert(element is! MultiplyInheritedExecutableElement);
-    var enclosingElt = element.enclosingElement2!;
+    var enclosingElt = element.enclosingElement3!;
     var buffer = enclosingElt.accept(this)!;
     if (buffer.isNotEmpty) {
       buffer.write('#');
@@ -1452,7 +1451,7 @@
     // It is legal to have a named constructor with the same name as a type
     // parameter.  So we distinguish them by using '.' between the class (or
     // typedef) name and the type parameter name.
-    return element.enclosingElement2!.accept(this)!
+    return element.enclosingElement3!.accept(this)!
       ..write('.')
       ..write(element.name);
   }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart b/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
index dcbe33c8..e0f9237 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
@@ -46,15 +46,15 @@
   Future<SourceChange> createChange() async {
     change = SourceChange(refactoringName);
     // function
-    if (element.enclosingElement2 is CompilationUnitElement) {
+    if (element.enclosingElement3 is CompilationUnitElement) {
       await _updateElementDeclaration(element);
       await _updateElementReferences(element);
     }
     // method
     var field = element.variable;
     if (field is FieldElement &&
-        (field.enclosingElement2 is ClassElement ||
-            field.enclosingElement2 is ExtensionElement)) {
+        (field.enclosingElement3 is ClassElement ||
+            field.enclosingElement3 is ExtensionElement)) {
       var elements = await getHierarchyMembers(searchEngine, field);
       await Future.forEach(elements, (ClassMemberElement member) async {
         if (member is FieldElement) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart b/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart
index 4a1812c..427b1a1 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart
@@ -72,7 +72,7 @@
   RefactoringStatus _checkElement() {
     // check Element type
     if (element is FunctionElement) {
-      if (element.enclosingElement2 is! CompilationUnitElement) {
+      if (element.enclosingElement3 is! CompilationUnitElement) {
         return RefactoringStatus.fatal(
             'Only top-level functions can be converted to getters.');
       }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
index 5f2bacf..607535c 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
@@ -523,6 +523,7 @@
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
     var parent = node.parent;
+    // ignore: deprecated_member_use
     if (parent is VariableDeclaration && parent.name == node ||
         parent is AssignmentExpression && parent.leftHandSide == node) {
       return;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
index 6a74379..80d5192 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
@@ -38,7 +38,7 @@
   if (element is LocalVariableElement ||
       element is ParameterElement ||
       element is FunctionElement &&
-          element.enclosingElement2 is! CompilationUnitElement) {
+          element.enclosingElement3 is! CompilationUnitElement) {
     return element;
   }
   return null;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
index b8b519c..b476d7c 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
@@ -310,8 +310,8 @@
             parameter = parameter.parameter;
           }
           if (parameter is NormalFormalParameter) {
-            _parameters.add(_Parameter(
-                parameter.identifier!.name, parameter.declaredElement!.type,
+            final element = parameter.declaredElement!;
+            _parameters.add(_Parameter(element.name, element.type,
                 isMethodParameter: true));
           }
         }
@@ -669,7 +669,7 @@
         enclosingClass,
         ...enclosingClass.allSupertypes.map((t) => t.element)
       ];
-      return enclosingClasses.contains(element.enclosingElement2);
+      return enclosingClasses.contains(element.enclosingElement3);
     }
     return false;
   }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
index 235172d..fec885d 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
@@ -212,7 +212,7 @@
 
   @override
   String? get className {
-    var classElement = _methodElement?.enclosingElement2;
+    var classElement = _methodElement?.enclosingElement3;
     if (classElement is ClassElement) {
       return classElement.displayName;
     }
@@ -805,13 +805,13 @@
     } else {
       return;
     }
-    if (element.enclosingElement2 is! ClassElement) {
+    if (element.enclosingElement3 is! ClassElement) {
       return;
     }
     // record the implicit static or instance reference
     var offset = node.offset;
     if (element.isStatic) {
-      var className = element.enclosingElement2.displayName;
+      var className = element.enclosingElement3.displayName;
       result.addImplicitClassNameOffset(className, offset);
     } else {
       result.addImplicitThisOffset(offset);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
index b85a9ff..88c21de 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
@@ -406,7 +406,7 @@
     if (element is PropertyAccessorElement) {
       element = element.variable;
     }
-    var enclosingElement = element.enclosingElement2;
+    var enclosingElement = element.enclosingElement3;
     if (enclosingElement is CompilationUnitElement) {
       return RenameUnitMemberRefactoringImpl(workspace, resolvedUnit, element);
     }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
index d7bd902..7661de2 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
@@ -168,7 +168,7 @@
     var declarations = await searchEngine.searchMemberDeclarations(name);
     for (var declaration in declarations) {
       var nameElement = getSyntheticAccessorVariable(declaration.element);
-      var nameClass = nameElement.enclosingElement2;
+      var nameClass = nameElement.enclosingElement3;
       // the renamed Element shadows a member of a superclass
       if (superClasses.contains(nameClass)) {
         result.addError(
@@ -276,7 +276,7 @@
     var subClasses = await searchEngine.searchAllSubtypes(elementClass);
     // check shadowing of class names
     for (var element in elements) {
-      var enclosingElement = element.enclosingElement2;
+      var enclosingElement = element.enclosingElement3;
       if (enclosingElement is ClassElement && enclosingElement.name == name) {
         result.addError(
           'Renamed ${elementKind.displayName} has the same name as the '
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
index 01ce273..134d6e4 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
@@ -82,7 +82,7 @@
   }
 
   void _analyzePossibleConflicts(RefactoringStatus result) {
-    var parentClass = element.enclosingElement2;
+    var parentClass = element.enclosingElement3;
     // Check if the "newName" is the name of the enclosing class.
     if (parentClass.name == newName) {
       result.addError('The constructor should not have the same name '
@@ -107,7 +107,7 @@
   }
 
   Future<void> _replaceSynthetic() async {
-    var classElement = element.enclosingElement2;
+    var classElement = element.enclosingElement3;
 
     var result = await AnalysisSessionHelper(session)
         .getElementDeclaration(classElement);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
index eb53d12..caa5679 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
@@ -214,7 +214,7 @@
     var declarations = await searchEngine.searchMemberDeclarations(name);
     for (var declaration in declarations) {
       var member = declaration.element;
-      var declaringClass = member.enclosingElement2 as ClassElement;
+      var declaringClass = member.enclosingElement3 as ClassElement;
       var memberReferences = await searchEngine.searchReferences(member);
       for (var memberReference in memberReferences) {
         var refElement = memberReference.element;
diff --git a/pkg/analysis_server/lib/src/services/search/hierarchy.dart b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
index 0776411..e54709d 100644
--- a/pkg/analysis_server/lib/src/services/search/hierarchy.dart
+++ b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
@@ -82,7 +82,7 @@
     SearchEngine searchEngine, ClassMemberElement member) async {
   Set<ClassMemberElement> result = HashSet<ClassMemberElement>();
   // extension member
-  var enclosingElement = member.enclosingElement2;
+  var enclosingElement = member.enclosingElement3;
   if (enclosingElement is ExtensionElement) {
     result.add(member);
     return Future.value(result);
@@ -126,7 +126,7 @@
 Future<List<ParameterElement>> getHierarchyNamedParameters(
     SearchEngine searchEngine, ParameterElement element) async {
   if (element.isNamed) {
-    var method = element.enclosingElement2;
+    var method = element.enclosingElement3;
     if (method is MethodElement) {
       var hierarchyParameters = <ParameterElement>[];
       var hierarchyMembers = await getHierarchyMembers(searchEngine, method);
diff --git a/pkg/analysis_server/lib/src/status/ast_writer.dart b/pkg/analysis_server/lib/src/status/ast_writer.dart
index af7730c..e9173b7 100644
--- a/pkg/analysis_server/lib/src/status/ast_writer.dart
+++ b/pkg/analysis_server/lib/src/status/ast_writer.dart
@@ -144,36 +144,36 @@
   /// declaration.
   String? _getName(AstNode node) {
     if (node is ClassTypeAlias) {
-      return node.name.name;
+      return node.name2.lexeme;
     } else if (node is ClassDeclaration) {
-      return node.name.name;
+      return node.name2.lexeme;
     } else if (node is ConstructorDeclaration) {
-      var name = node.name;
+      var name = node.name2;
       if (name == null) {
         return node.returnType.name;
       } else {
-        return '${node.returnType.name}.${name.name}';
+        return '${node.returnType.name}.${name.lexeme}';
       }
     } else if (node is ConstructorName) {
       return node.toSource();
     } else if (node is FieldDeclaration) {
       return _getNames(node.fields);
     } else if (node is FunctionDeclaration) {
-      return node.name.name;
+      return node.name2.lexeme;
     } else if (node is FunctionTypeAlias) {
-      return node.name.name;
+      return node.name2.lexeme;
     } else if (node is Identifier) {
       return node.name;
     } else if (node is MethodDeclaration) {
-      return node.name.name;
+      return node.name2.lexeme;
     } else if (node is TopLevelVariableDeclaration) {
       return _getNames(node.variables);
     } else if (node is TypeAnnotation) {
       return node.toSource();
     } else if (node is TypeParameter) {
-      return node.name.name;
+      return node.name2.lexeme;
     } else if (node is VariableDeclaration) {
-      return node.name.name;
+      return node.name2.lexeme;
     }
     return null;
   }
@@ -189,7 +189,7 @@
       } else {
         buffer.write(', ');
       }
-      buffer.write(variable.name.name);
+      buffer.write(variable.name2.lexeme);
     }
     return buffer.toString();
   }
diff --git a/pkg/analysis_server/lib/src/utilities/extensions/element.dart b/pkg/analysis_server/lib/src/utilities/extensions/element.dart
index 28512dd..cc38a89 100644
--- a/pkg/analysis_server/lib/src/utilities/extensions/element.dart
+++ b/pkg/analysis_server/lib/src/utilities/extensions/element.dart
@@ -30,15 +30,15 @@
     if (hasDeprecated) {
       return true;
     }
-    var ancestor = enclosingElement2;
+    var ancestor = enclosingElement3;
     if (ancestor is ClassElement) {
       if (ancestor.hasDeprecated) {
         return true;
       }
-      ancestor = ancestor.enclosingElement2;
+      ancestor = ancestor.enclosingElement3;
     }
     return ancestor is CompilationUnitElement &&
-        ancestor.enclosingElement2.hasDeprecated;
+        ancestor.enclosingElement3.hasDeprecated;
   }
 
   /// Return this element and all its enclosing elements.
@@ -46,7 +46,7 @@
     var current = this;
     while (true) {
       yield current;
-      var enclosing = current.enclosingElement2;
+      var enclosing = current.enclosingElement3;
       if (enclosing == null) {
         break;
       }
@@ -69,7 +69,7 @@
     if (name != 'cast') {
       return false;
     }
-    var definingClass = enclosingElement2;
+    var definingClass = enclosingElement3;
     if (definingClass is! ClassElement) {
       return false;
     }
@@ -85,7 +85,7 @@
     if (name != 'toList') {
       return false;
     }
-    var definingClass = enclosingElement2;
+    var definingClass = enclosingElement3;
     if (definingClass is! ClassElement) {
       return false;
     }
diff --git a/pkg/analysis_server/lib/src/utilities/flutter.dart b/pkg/analysis_server/lib/src/utilities/flutter.dart
index c425391..04f94a6 100644
--- a/pkg/analysis_server/lib/src/utilities/flutter.dart
+++ b/pkg/analysis_server/lib/src/utilities/flutter.dart
@@ -192,7 +192,7 @@
 
   /// Return the presentation for the given Flutter `Widget` creation [node].
   String? getWidgetPresentationText(InstanceCreationExpression node) {
-    var element = node.constructorName.staticElement?.enclosingElement2;
+    var element = node.constructorName.staticElement?.enclosingElement3;
     if (!isWidget(element)) {
       return null;
     }
@@ -486,8 +486,8 @@
 
   /// Return `true` if the given [element] is the Flutter class `Widget`, or its
   /// subtype.
-  bool isWidget(ClassElement? element) {
-    if (element == null) {
+  bool isWidget(InterfaceElement? element) {
+    if (element is! ClassElement) {
       return false;
     }
     if (_isExactWidget(element, _nameWidget, _uriFramework)) {
@@ -504,7 +504,7 @@
   /// Return `true` if the given [expr] is a constructor invocation for a
   /// class that has the Flutter class `Widget` as a superclass.
   bool isWidgetCreation(InstanceCreationExpression? expr) {
-    var element = expr?.constructorName.staticElement?.enclosingElement2;
+    var element = expr?.constructorName.staticElement?.enclosingElement3;
     return isWidget(element);
   }
 
@@ -555,7 +555,9 @@
 
   /// Return `true` if the given [element] is the exact [type] defined in the
   /// file with the given [uri].
-  bool _isExactWidget(ClassElement? element, String type, Uri uri) {
-    return element != null && element.name == type && element.source.uri == uri;
+  bool _isExactWidget(InterfaceElement? element, String type, Uri uri) {
+    return element is ClassElement &&
+        element.name == type &&
+        element.source.uri == uri;
   }
 }
diff --git a/pkg/analysis_server/test/analysis/notification_highlights2_test.dart b/pkg/analysis_server/test/analysis/notification_highlights2_test.dart
index a1aa517..8887975 100644
--- a/pkg/analysis_server/test/analysis/notification_highlights2_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_highlights2_test.dart
@@ -503,7 +503,6 @@
     assertHasRegion(HighlightRegionType.CONSTRUCTOR, 'AAA<int>.name(');
     assertHasRegion(HighlightRegionType.CLASS, 'int>(');
     assertHasRegion(HighlightRegionType.CLASS, 'int>.name(');
-    assertHasRegion(HighlightRegionType.CONSTRUCTOR, 'name(p)');
     assertHasRegion(HighlightRegionType.CONSTRUCTOR, 'name(42)');
   }
 
diff --git a/pkg/analysis_server/test/integration/linter/lint_names_test.dart b/pkg/analysis_server/test/integration/linter/lint_names_test.dart
index 1b8e5d0..2372824 100644
--- a/pkg/analysis_server/test/integration/linter/lint_names_test.dart
+++ b/pkg/analysis_server/test/integration/linter/lint_names_test.dart
@@ -32,8 +32,8 @@
       throw Exception(parseResult.errors);
     }
 
-    var lintNamesClass = parseResult.unit.declarations
-        .firstWhere((m) => m is ClassDeclaration && m.name.name == 'LintNames');
+    var lintNamesClass = parseResult.unit.declarations.firstWhere(
+        (m) => m is ClassDeclaration && m.name2.lexeme == 'LintNames');
 
     var collector = _FixCollector();
     lintNamesClass.accept(collector);
@@ -65,7 +65,7 @@
   @override
   void visitFieldDeclaration(FieldDeclaration node) {
     for (var v in node.fields.variables) {
-      lintNames.add(v.name.name);
+      lintNames.add(v.name2.lexeme);
     }
   }
 }
diff --git a/pkg/analysis_server/test/plugin/protocol_dart_test.dart b/pkg/analysis_server/test/plugin/protocol_dart_test.dart
index a0e22e1..57097ed 100644
--- a/pkg/analysis_server/test/plugin/protocol_dart_test.dart
+++ b/pkg/analysis_server/test/plugin/protocol_dart_test.dart
@@ -255,7 +255,7 @@
       expect(element.parameters, isNull);
       expect(element.returnType, '_E1');
       // TODO(danrubel) determine why enum constant is not marked as deprecated
-      //engine.ClassElement classElement = engineElement.enclosingElement2;
+      //engine.ClassElement classElement = engineElement.enclosingElement3;
       //expect(classElement.isDeprecated, isTrue);
       expect(
           element.flags,
diff --git a/pkg/analysis_server/test/services/refactoring/abstract_rename.dart b/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
index 26676b3..dab7e2c 100644
--- a/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
+++ b/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
@@ -6,7 +6,7 @@
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/ast/extensions.dart';
+import 'package:analyzer/src/dart/ast/element_locator.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
 import 'package:test/test.dart';
 
@@ -41,7 +41,7 @@
   /// the [SimpleIdentifier] at the given [search] pattern.
   void createRenameRefactoringAtString(String search) {
     var identifier = findNode.simple(search);
-    var element = identifier.writeOrReadElement;
+    var element = ElementLocator.locate(identifier);
     if (element is PrefixElement) {
       element = getImportElement(identifier);
     }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/element_matcher_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/element_matcher_test.dart
index c39c4b6..f050c77 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/element_matcher_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/element_matcher_test.dart
@@ -23,7 +23,7 @@
       List<ElementKind>? expectedKinds,
       List<String>? expectedUris}) {
     var node = findNode.any(search);
-    var matchers = ElementMatcher.matchersForNode(node);
+    var matchers = ElementMatcher.matchersForNode(node, node.beginToken);
     expect(matchers, hasLength(1));
     var matcher = matchers[0];
     if (expectedUris != null) {
diff --git a/pkg/analysis_server/test/src/utilities/flutter_test.dart b/pkg/analysis_server/test/src/utilities/flutter_test.dart
index d616586..67cc038 100644
--- a/pkg/analysis_server/test/src/utilities/flutter_test.dart
+++ b/pkg/analysis_server/test/src/utilities/flutter_test.dart
@@ -544,7 +544,7 @@
     for (var topDeclaration in unit.declarations) {
       if (topDeclaration is TopLevelVariableDeclaration) {
         for (var variable in topDeclaration.variables.variables) {
-          if (variable.name.name == name) {
+          if (variable.name2.lexeme == name) {
             return variable;
           }
         }
diff --git a/pkg/analysis_server/tool/bulk_fix/parse_utils.dart b/pkg/analysis_server/tool/bulk_fix/parse_utils.dart
index 84cf49b..033dc78 100644
--- a/pkg/analysis_server/tool/bulk_fix/parse_utils.dart
+++ b/pkg/analysis_server/tool/bulk_fix/parse_utils.dart
@@ -33,10 +33,10 @@
         if (classElement != null &&
             classElement.allSupertypes.any(
                 (element) => element.element.name == 'CorrectionProducer')) {
-          var correctionName = classDecl.name.name;
+          var correctionName = classDecl.name2.lexeme;
 
           for (var method in classDecl.members.whereType<MethodDeclaration>()) {
-            if (method.name.name == 'canBeAppliedInBulk') {
+            if (method.name2.lexeme == 'canBeAppliedInBulk') {
               var hasComment =
                   method.returnType?.beginToken.precedingComments != null;
 
diff --git a/pkg/analysis_server/tool/code_completion/code_metrics.dart b/pkg/analysis_server/tool/code_completion/code_metrics.dart
index 051f919..c30111a 100644
--- a/pkg/analysis_server/tool/code_completion/code_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/code_metrics.dart
@@ -307,7 +307,7 @@
       'documentationComment': node.documentationComment,
       'metadata': node.metadata,
       'abstractKeyword': node.abstractKeyword,
-      'name': node.name,
+      'name': node.name2,
       'typeParameters': node.typeParameters,
       'extendsClause': node.extendsClause,
       'withClause': node.withClause,
@@ -324,7 +324,7 @@
       'documentationComment': node.documentationComment,
       'metadata': node.metadata,
       'abstractKeyword': node.abstractKeyword,
-      'name': node.name,
+      'name': node.name2,
       'typeParameters': node.typeParameters,
       'superclass': node.superclass,
       'withClause': node.withClause,
@@ -387,7 +387,7 @@
       'constKeyword': node.constKeyword,
       'factoryKeyword': node.factoryKeyword,
       'returnType': node.returnType,
-      'name': node.name,
+      'name': node.name2,
       'parameters': node.parameters,
       'initializers': node.initializers,
       'redirectedConstructor': node.redirectedConstructor,
@@ -428,7 +428,7 @@
     _visitChildren(node, {
       'keyword': node.keyword,
       'type': node.type,
-      'identifier': node.identifier,
+      'name': node.name,
     });
     super.visitDeclaredIdentifier(node);
   }
@@ -482,7 +482,7 @@
     _visitChildren(node, {
       'documentationComment': node.documentationComment,
       'metadata': node.metadata,
-      'name': node.name,
+      'name': node.name2,
     });
     super.visitEnumConstantDeclaration(node);
   }
@@ -492,7 +492,7 @@
     _visitChildren(node, {
       'documentationComment': node.documentationComment,
       'metadata': node.metadata,
-      'name': node.name,
+      'name': node.name2,
       'constants': node.constants,
     });
     super.visitEnumDeclaration(node);
@@ -539,7 +539,7 @@
   @override
   void visitExtensionDeclaration(ExtensionDeclaration node) {
     _visitChildren(node, {
-      'name': node.name,
+      'name': node.name2,
       'typeParameters': node.typeParameters,
       'extendedType': node.extendedType,
       'member': node.members,
@@ -579,7 +579,7 @@
       'keyword': node.keyword,
       'type': node.type,
       'thisKeyword': node.thisKeyword,
-      'identifier': node.identifier,
+      'name': node.name,
       'typeParameters': node.typeParameters,
       'parameters': node.parameters,
       'question': node.question,
@@ -660,7 +660,7 @@
       'metadata': node.metadata,
       'externalKeyword': node.externalKeyword,
       'propertyKeyword': node.propertyKeyword,
-      'name': node.name,
+      'name': node.name2,
       'functionExpression': node.functionExpression,
       'returnType': node.returnType,
     });
@@ -701,7 +701,7 @@
       'documentationComment': node.documentationComment,
       'metadata': node.metadata,
       'returnType': node.returnType,
-      'name': node.name,
+      'name': node.name2,
       'typeParameters': node.typeParameters,
       'parameters': node.parameters,
     });
@@ -713,7 +713,7 @@
     _visitChildren(node, {
       'covariantKeyword': node.covariantKeyword,
       'returnType': node.returnType,
-      'identifier': node.identifier,
+      'name': node.name,
       'typeParameters': node.typeParameters,
       'parameters': node.parameters,
       'question': node.question,
@@ -737,7 +737,7 @@
     _visitChildren(node, {
       'documentationComment': node.documentationComment,
       'metadata': node.metadata,
-      'name': node.name,
+      'name': node.name2,
       'typeParameters': node.typeParameters,
       'functionType': node.functionType,
     });
@@ -910,7 +910,7 @@
       'externalKeyword': node.externalKeyword,
       'modifierKeyword': node.modifierKeyword,
       'returnType': node.returnType,
-      'name': node.name,
+      'name': node.name2,
       'operatorKeyword': node.operatorKeyword,
       'typeParameters': node.typeParameters,
       'parameters': node.parameters,
@@ -935,7 +935,7 @@
     _visitChildren(node, {
       'documentationComment': node.documentationComment,
       'metadata': node.metadata,
-      'name': node.name,
+      'name': node.name2,
       'typeParameters': node.typeParameters,
       'onClause': node.onClause,
       'implementsClause': node.implementsClause,
@@ -1111,7 +1111,7 @@
       'covariantKeyword': node.covariantKeyword,
       'keyword': node.keyword,
       'type': node.type,
-      'identifier': node.identifier,
+      'name': node.name,
     });
     super.visitSimpleFormalParameter(node);
   }
@@ -1232,7 +1232,7 @@
   @override
   void visitTypeParameter(TypeParameter node) {
     _visitChildren(node, {
-      'name': node.name,
+      'name': node.name2,
       'bound': node.bound,
     });
     super.visitTypeParameter(node);
@@ -1249,7 +1249,7 @@
     _visitChildren(node, {
       'documentationComment': node.documentationComment,
       'metadata': node.metadata,
-      'name': node.name,
+      'name': node.name2,
       'initializer': node.initializer,
     });
     super.visitVariableDeclaration(node);
diff --git a/pkg/analysis_server/tool/code_completion/completion_metrics.dart b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
index 2bc9c51..cf0c112 100644
--- a/pkg/analysis_server/tool/code_completion/completion_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
@@ -1699,7 +1699,7 @@
     var entity = expectedCompletion.syntacticEntity;
     var element = _getElement(entity);
     if (element != null) {
-      var parent = element.enclosingElement2;
+      var parent = element.enclosingElement3;
       if (parent is ClassElement || parent is ExtensionElement) {
         if (_isStatic(element)) {
           return CompletionGroup.staticMember;
diff --git a/pkg/analysis_server/tool/code_completion/flutter_metrics.dart b/pkg/analysis_server/tool/code_completion/flutter_metrics.dart
index 6bba840..fdd758e 100644
--- a/pkg/analysis_server/tool/code_completion/flutter_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/flutter_metrics.dart
@@ -144,7 +144,7 @@
         throw StateError(
             'Unresolved constructor name: ${node.constructorName}');
       }
-      var childWidget = element.enclosingElement2.name;
+      var childWidget = element.enclosingElement3.name;
       if (!element.librarySource.uri
           .toString()
           .startsWith('package:flutter/')) {
diff --git a/pkg/analysis_server/tool/code_completion/implicit_type_declarations.dart b/pkg/analysis_server/tool/code_completion/implicit_type_declarations.dart
index 647850c..256995e 100644
--- a/pkg/analysis_server/tool/code_completion/implicit_type_declarations.dart
+++ b/pkg/analysis_server/tool/code_completion/implicit_type_declarations.dart
@@ -110,7 +110,7 @@
       if (rhsType != null && !rhsType.isDynamic) {
         // Record the name with the type.
         data.recordImpliedType(
-          node.name.name,
+          node.name2.lexeme,
           rhsType.getDisplayString(withNullability: false),
         );
       }
diff --git a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
index 8683e81..34fb4a9 100644
--- a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
@@ -968,9 +968,9 @@
     data.recordPercentage(
         'Methods with type parameters', node.typeParameters != null);
     var element = node.declaredElement!;
-    if (!element.isStatic && element.enclosingElement2 is ClassElement) {
+    if (!element.isStatic && element.enclosingElement3 is ClassElement) {
       var overriddenMembers = inheritanceManager.getOverridden2(
-          element.enclosingElement2 as ClassElement,
+          element.enclosingElement3 as ClassElement,
           Name(element.librarySource.uri, element.name));
       if (overriddenMembers != null) {
         // Consider limiting this to the most immediate override. If the
@@ -993,7 +993,7 @@
     if (node.target is SuperExpression) {
       var enclosingMethod = node.thisOrAncestorOfType<MethodDeclaration>();
       if (enclosingMethod != null) {
-        if (enclosingMethod.name.name == node.methodName.name) {
+        if (enclosingMethod.name2.lexeme == node.methodName.name) {
           data.recordTypeMatch('super invocation member', 'same');
         } else {
           data.recordTypeMatch('super invocation member', 'different');
@@ -1120,7 +1120,7 @@
     if (node.target is SuperExpression) {
       var enclosingMethod = node.thisOrAncestorOfType<MethodDeclaration>();
       if (enclosingMethod != null) {
-        if (enclosingMethod.name.name == node.propertyName.name) {
+        if (enclosingMethod.name2.lexeme == node.propertyName.name) {
           data.recordTypeMatch('super property access member', 'same');
         } else {
           data.recordTypeMatch('super property access member', 'different');
@@ -1406,7 +1406,7 @@
     Element? currentElement = element;
     while (currentElement != enclosingLibrary) {
       depth++;
-      currentElement = currentElement?.enclosingElement2;
+      currentElement = currentElement?.enclosingElement3;
     }
     return depth;
   }
@@ -1688,7 +1688,7 @@
     var reference = _leftMostIdentifier(node);
     var element = reference?.staticElement;
     if (element is ParameterElement) {
-      var definingElement = element.enclosingElement2!;
+      var definingElement = element.enclosingElement3!;
       var depth = _parameterReferenceDepth(node, definingElement);
       _recordDistance('function depth of referenced parameter', depth);
     } else if (element is LocalVariableElement) {
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 3a74a43..f602efc8 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -14,6 +14,9 @@
 * Deprecated `CatchClause.exceptionParameter` and `CatchClause.stackTraceParameter`.
   Use `exceptionParameter2` and `stackTraceParameter2` instead.
 * Added `FileResult.isAugmentation` and `isLibrary` to complement `isPart`.
+* Deprecated 'XyzDeclaration.name' in AST, use `name2` and `declaredElement` instead.
+* Deprecated `Element.enclosingElement2`, use `enclosingElement3` instead.  The meaningful change is that
+  `ConstructorElement.enclosingElement3` returns now `IntefaceElement`, not `ClassElement`.
 
 ## 4.3.1
 * Fix `identifier` for `LibraryExportElement` and `LibraryImportElement`.
diff --git a/pkg/analyzer/doc/tutorial/ast.md b/pkg/analyzer/doc/tutorial/ast.md
index 5206b39..145e975 100644
--- a/pkg/analyzer/doc/tutorial/ast.md
+++ b/pkg/analyzer/doc/tutorial/ast.md
@@ -90,19 +90,19 @@
 void printMembers(CompilationUnit unit) {
   for (CompilationUnitMember unitMember in unit.declarations) {
     if (unitMember is ClassDeclaration) {
-      print(unitMember.name.name);
+      print(unitMember.name2.lexeme);
       for (ClassMember classMember in unitMember.members) {
         if (classMember is MethodDeclaration) {
-          print('  ${classMember.name}');
+          print('  ${classMember.name2.lexeme}');
         } else if (classMember is FieldDeclaration) {
           for (VariableDeclaration field in classMember.fields.variables) {
-            print('  ${field.name.name}');
+            print('  ${field.name2.lexeme}');
           }
         } else if (classMember is ConstructorDeclaration) {
-          if (classMember.name == null) {
-            print('  ${unitMember.name.name}');
+          if (classMember.name2 == null) {
+            print('  ${unitMember.name2.lexeme}');
           } else {
-            print('  ${unitMember.name.name}.${classMember.name.name}');
+            print('  ${unitMember.name2.lexeme}.${classMember.name2.lexeme}');
           }
         }
       }
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index f1e1596..3bfb26c 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -789,7 +789,7 @@
 ///      | 'on' type catchPart? [Block]
 ///
 ///    catchPart ::=
-///        'catch' '(' [SimpleIdentifier] (',' [SimpleIdentifier])? ')'
+///        'catch' '(' [CatchClauseParameter] (',' [CatchClauseParameter])? ')'
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class CatchClause implements AstNode {
@@ -851,7 +851,7 @@
 /// The declaration of a class augmentation.
 ///
 ///    classAugmentationDeclaration ::=
-///        'augment' 'class' [SimpleIdentifier] [TypeParameterList]?
+///        'augment' 'class' name [TypeParameterList]?
 ///        [ExtendsClause]? [WithClause]? [ImplementsClause]?
 ///        '{' [ClassMember]* '}'
 ///
@@ -869,7 +869,7 @@
 /// The declaration of a class.
 ///
 ///    classDeclaration ::=
-///        'abstract'? 'class' [SimpleIdentifier] [TypeParameterList]?
+///        'abstract'? 'class' name [TypeParameterList]?
 ///        [ExtendsClause]? [WithClause]? [ImplementsClause]?
 ///        '{' [ClassMember]* '}'
 ///
@@ -986,7 +986,7 @@
 /// A class type alias.
 ///
 ///    classTypeAlias ::=
-///        [SimpleIdentifier] [TypeParameterList]? '=' 'abstract'? mixinApplication
+///        name [TypeParameterList]? '=' 'abstract'? mixinApplication
 ///
 ///    mixinApplication ::=
 ///        [TypeName] [WithClause] [ImplementsClause]? ';'
@@ -1011,9 +1011,6 @@
   @Deprecated('Use abstractKeyword instead')
   bool get isAbstract;
 
-  @override
-  SimpleIdentifier get name;
-
   /// Return the name of the superclass of the class being declared.
   NamedType get superclass;
 
@@ -1339,7 +1336,7 @@
 ///      | 'external'? 'const'  constructorName formalParameterList initializerList?
 ///
 ///    constructorName ::=
-///        [SimpleIdentifier] ('.' [SimpleIdentifier])?
+///        [SimpleIdentifier] ('.' name)?
 ///
 ///    factoryName ::=
 ///        [Identifier] ('.' [SimpleIdentifier])?
@@ -1371,8 +1368,13 @@
 
   /// Return the name of the constructor, or `null` if the constructor being
   /// declared is unnamed.
+  @Deprecated('Use name2 instead')
   SimpleIdentifier? get name;
 
+  /// Return the name of the constructor, or `null` if the constructor being
+  /// declared is unnamed.
+  Token? get name2;
+
   /// Return the parameters associated with the constructor.
   FormalParameterList get parameters;
 
@@ -1545,6 +1547,7 @@
   LocalVariableElement? get declaredElement;
 
   /// Return the name of the variable being declared.
+  @Deprecated('Use identifier2 instead')
   SimpleIdentifier get identifier;
 
   /// Return `true` if this variable was declared with the 'const' modifier.
@@ -1559,6 +1562,9 @@
   /// keyword, or `null` if no keyword was used.
   Token? get keyword;
 
+  /// Return the name of the variable being declared.
+  Token get name;
+
   /// Return the name of the declared type of the parameter, or `null` if the
   /// parameter does not have a declared type.
   TypeAnnotation? get type;
@@ -1734,13 +1740,17 @@
   ConstructorElement? get constructorElement;
 
   /// Return the name of the constant.
+  @Deprecated('Use name2 instead')
   SimpleIdentifier get name;
+
+  /// Return the name of the constant.
+  Token get name2;
 }
 
 /// The declaration of an enumeration.
 ///
 ///    enumType ::=
-///        metadata 'enum' [SimpleIdentifier] [TypeParameterList]?
+///        metadata 'enum' name [TypeParameterList]?
 ///        [WithClause]? [ImplementsClause]? '{' [SimpleIdentifier]
 ///        (',' [SimpleIdentifier])* (';' [ClassMember]+)? '}'
 ///
@@ -1765,9 +1775,6 @@
   /// Return the members declared by the enumeration.
   NodeList<ClassMember> get members;
 
-  @override
-  SimpleIdentifier get name;
-
   /// Return the right curly bracket.
   Token get rightBracket;
 
@@ -1946,8 +1953,13 @@
 
   /// Return the name of the extension, or `null` if the extension does not have
   /// a name.
+  @Deprecated('Use name2 instead')
   SimpleIdentifier? get name;
 
+  /// Return the name of the extension, or `null` if the extension does not have
+  /// a name.
+  Token? get name2;
+
   /// Return the token representing the 'on' keyword.
   Token get onKeyword;
 
@@ -2061,10 +2073,11 @@
 ///
 ///    fieldFormalParameter ::=
 ///        ('final' [TypeAnnotation] | 'const' [TypeAnnotation] | 'var' | [TypeAnnotation])?
-///        'this' '.' [SimpleIdentifier] ([TypeParameterList]? [FormalParameterList])?
+///        'this' '.' name ([TypeParameterList]? [FormalParameterList])?
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class FieldFormalParameter implements NormalFormalParameter {
+  @Deprecated('Use identifier2 instead')
   @override
   SimpleIdentifier get identifier;
 
@@ -2072,6 +2085,9 @@
   /// keyword, or `null` if no keyword was used.
   Token? get keyword;
 
+  @override
+  Token get name;
+
   /// Return the parameters of the function-typed parameter, or `null` if this
   /// is not a function-typed field formal parameter.
   FormalParameterList? get parameters;
@@ -2190,6 +2206,7 @@
   /// Return the name of the parameter being declared, or `null` if the
   /// parameter doesn't have a name, such as when it's part of a generic
   /// function type.
+  @Deprecated('Use identifier2 instead')
   SimpleIdentifier? get identifier;
 
   /// Return `true` if this parameter was declared with the 'const' modifier.
@@ -2247,6 +2264,11 @@
   /// Return the annotations associated with this parameter.
   NodeList<Annotation> get metadata;
 
+  /// Return the name of the parameter being declared, or `null` if the
+  /// parameter doesn't have a name, such as when it's part of a generic
+  /// function type.
+  Token? get name;
+
   /// The 'required' keyword, or `null` if the keyword was not used.
   Token? get requiredKeyword;
 }
@@ -2448,7 +2470,7 @@
 ///      | functionSignature [FunctionBody]
 ///
 ///    functionSignature ::=
-///        [Type]? ('get' | 'set')? [SimpleIdentifier] [FormalParameterList]
+///        [Type]? ('get' | 'set')? name [FormalParameterList]
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class FunctionDeclaration implements NamedCompilationUnitMember {
@@ -2468,9 +2490,6 @@
   /// Return `true` if this function declares a setter.
   bool get isSetter;
 
-  @override
-  SimpleIdentifier get name;
-
   /// Return the token representing the 'get' or 'set' keyword, or `null` if
   /// this is a function declaration rather than a property declaration.
   Token? get propertyKeyword;
@@ -2592,14 +2611,18 @@
 /// A function-typed formal parameter.
 ///
 ///    functionSignature ::=
-///        [TypeAnnotation]? [SimpleIdentifier] [TypeParameterList]?
+///        [TypeAnnotation]? name [TypeParameterList]?
 ///        [FormalParameterList] '?'?
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class FunctionTypedFormalParameter implements NormalFormalParameter {
+  @Deprecated('Use identifier2 instead')
   @override
   SimpleIdentifier get identifier;
 
+  @override
+  Token get name;
+
   /// Return the parameters of the function-typed parameter.
   FormalParameterList get parameters;
 
@@ -2666,7 +2689,7 @@
 /// A generic type alias.
 ///
 ///    functionTypeAlias ::=
-///        metadata 'typedef' [SimpleIdentifier] [TypeParameterList]? = [FunctionType] ';'
+///        metadata 'typedef' name [TypeParameterList]? = [FunctionType] ';'
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class GenericTypeAlias implements TypeAlias {
@@ -3394,8 +3417,12 @@
   Token? get modifierKeyword;
 
   /// Return the name of the method.
+  @Deprecated('Use name2 instead')
   SimpleIdentifier get name;
 
+  /// Return the name of the method.
+  Token get name2;
+
   /// Return the token representing the 'operator' keyword, or `null` if this
   /// method does not declare an operator.
   Token? get operatorKeyword;
@@ -3480,7 +3507,7 @@
 /// The declaration of a mixin.
 ///
 ///    mixinDeclaration ::=
-///        metadata? 'mixin' [SimpleIdentifier] [TypeParameterList]?
+///        metadata? 'mixin' name [TypeParameterList]?
 ///        [OnClause]? [ImplementsClause]? '{' [ClassMember]* '}'
 ///
 /// Clients may not extend, implement or mix-in this class.
@@ -3498,7 +3525,11 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class NamedCompilationUnitMember implements CompilationUnitMember {
   /// Return the name of the member being declared.
+  @Deprecated('Use name2 instead')
   SimpleIdentifier get name;
+
+  /// Return the name of the member being declared.
+  Token get name2;
 }
 
 /// An expression that has a name associated with it. They are used in method
@@ -4295,10 +4326,11 @@
 ///
 ///    superFormalParameter ::=
 ///        ('final' [TypeAnnotation] | 'const' [TypeAnnotation] | 'var' | [TypeAnnotation])?
-///        'super' '.' [SimpleIdentifier] ([TypeParameterList]? [FormalParameterList])?
+///        'super' '.' name ([TypeParameterList]? [FormalParameterList])?
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class SuperFormalParameter implements NormalFormalParameter {
+  @Deprecated('Use identifier2 instead')
   @override
   SimpleIdentifier get identifier;
 
@@ -4306,6 +4338,9 @@
   /// keyword, or `null` if no keyword was used.
   Token? get keyword;
 
+  @override
+  Token get name;
+
   /// Return the parameters of the function-typed parameter, or `null` if this
   /// is not a function-typed field formal parameter.
   FormalParameterList? get parameters;
@@ -4508,9 +4543,6 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class TypeAlias implements NamedCompilationUnitMember {
-  @override
-  SimpleIdentifier get name;
-
   /// Return the semicolon terminating the declaration.
   Token get semicolon;
 
@@ -4594,7 +4626,7 @@
 /// A type parameter.
 ///
 ///    typeParameter ::=
-///        [SimpleIdentifier] ('extends' [TypeAnnotation])?
+///        name ('extends' [TypeAnnotation])?
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class TypeParameter implements Declaration {
@@ -4610,7 +4642,11 @@
   Token? get extendsKeyword;
 
   /// Return the name of the type parameter.
+  @Deprecated('Use name2 instead')
   SimpleIdentifier get name;
+
+  /// Return the name of the type parameter.
+  Token get name2;
 }
 
 /// Type parameters within a declaration.
@@ -4669,7 +4705,7 @@
 /// [VariableDeclarationList].
 ///
 ///    variableDeclaration ::=
-///        [SimpleIdentifier] ('=' [Expression])?
+///        name ('=' [Expression])?
 ///
 /// Clients may not extend, implement or mix-in this class.
 // TODO(paulberry): the grammar does not allow metadata to be associated with a
@@ -4701,7 +4737,11 @@
   bool get isLate;
 
   /// Return the name of the variable being declared.
+  @Deprecated('Use name2 instead')
   SimpleIdentifier get name;
+
+  /// Return the name of the variable being declared.
+  Token get name2;
 }
 
 /// The declaration of one or more variables of the same type.
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index a6b2d79..8305498 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -57,13 +57,17 @@
 /// Clients may not extend, implement or mix-in this class.
 @experimental
 abstract class AugmentationImportElement implements _ExistingElement {
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   LibraryOrAugmentationElement get enclosingElement;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   LibraryOrAugmentationElement get enclosingElement2;
 
+  @override
+  LibraryOrAugmentationElement get enclosingElement3;
+
   /// Returns the [LibraryAugmentationElement], if [uri] is a
   /// [DirectiveUriWithAugmentation].
   LibraryAugmentationElement? get importedAugmentation;
@@ -214,13 +218,17 @@
   // TODO(brianwilkerson) Either remove this class or rename it to something
   //  more correct.
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   Element get enclosingElement;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   Element get enclosingElement2;
 
+  @override
+  Element get enclosingElement3;
+
   /// Return `true` if this element is a static element. A static element is an
   /// element that is not associated with a particular instance, but rather with
   /// an entire library or class.
@@ -251,14 +259,18 @@
   /// unit.
   List<ClassElement> get classes;
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   LibraryElement get enclosingElement;
 
-  /// Return the library, or library augmentation that encloses this unit.
+  @Deprecated('Use enclosingElement3 instead')
   @override
   LibraryOrAugmentationElement get enclosingElement2;
 
+  /// Return the library, or library augmentation that encloses this unit.
+  @override
+  LibraryOrAugmentationElement get enclosingElement3;
+
   /// Return a list containing all of the enums contained in this compilation
   /// unit.
   List<ClassElement> get enums;
@@ -330,13 +342,17 @@
   @override
   String get displayName;
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   ClassElement get enclosingElement;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   ClassElement get enclosingElement2;
 
+  @override
+  InterfaceElement get enclosingElement3;
+
   /// Return `true` if this constructor is a const constructor.
   bool get isConst;
 
@@ -480,14 +496,20 @@
   /// Return the element that either physically or logically encloses this
   /// element. This will be `null` if this element is a library because
   /// libraries are the top-level elements in the model.
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   Element? get enclosingElement;
 
   /// Return the element that either physically or logically encloses this
   /// element. This will be `null` if this element is a library because
   /// libraries are the top-level elements in the model.
+  @Deprecated('Use enclosingElement3 instead')
   Element? get enclosingElement2;
 
+  /// Return the element that either physically or logically encloses this
+  /// element. This will be `null` if this element is a library because
+  /// libraries are the top-level elements in the model.
+  Element? get enclosingElement3;
+
   /// Return `true` if this element has an annotation of the form
   /// `@alwaysThrows`.
   bool get hasAlwaysThrows;
@@ -1090,13 +1112,17 @@
   @override
   String get displayName;
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   Element get enclosingElement;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   Element get enclosingElement2;
 
+  @override
+  Element get enclosingElement3;
+
   /// Return `true` if this executable element did not have an explicit return
   /// type specified for it in the original source.
   bool get hasImplicitReturnType;
@@ -1158,13 +1184,17 @@
   /// declared in this extension.
   List<PropertyAccessorElement> get accessors;
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   CompilationUnitElement get enclosingElement;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   CompilationUnitElement get enclosingElement2;
 
+  @override
+  CompilationUnitElement get enclosingElement3;
+
   /// Return the type that is extended by this extension.
   DartType get extendedType;
 
@@ -1389,13 +1419,17 @@
   /// class, as is the case when this element represents an enum or a mixin.
   List<ConstructorElement> get constructors;
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   CompilationUnitElement get enclosingElement;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   CompilationUnitElement get enclosingElement2;
 
+  @override
+  CompilationUnitElement get enclosingElement3;
+
   /// Return a list containing all of the fields declared in this class.
   List<FieldElement> get fields;
 
@@ -1430,14 +1464,18 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class LabelElement implements Element {
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   ExecutableElement get enclosingElement;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   ExecutableElement get enclosingElement2;
 
   @override
+  ExecutableElement get enclosingElement3;
+
+  @override
   String get name;
 }
 
@@ -1906,14 +1944,18 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class PrefixElement implements _ExistingElement {
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   LibraryElement get enclosingElement;
 
-  /// Return the library, or library augmentation that encloses this element.
+  @Deprecated('Use enclosingElement3 instead')
   @override
   LibraryOrAugmentationElement get enclosingElement2;
 
+  /// Return the library, or library augmentation that encloses this element.
+  @override
+  LibraryOrAugmentationElement get enclosingElement3;
+
   /// Return the imports that share this prefix.
   @Deprecated('Use imports2 instead')
   List<ImportElement> get imports;
@@ -1987,13 +2029,17 @@
   @override
   PropertyAccessorElement get declaration;
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   Element get enclosingElement;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   Element get enclosingElement2;
 
+  @override
+  Element get enclosingElement3;
+
   /// Return `true` if this accessor represents a getter.
   bool get isGetter;
 
@@ -2110,14 +2156,18 @@
   /// a [FunctionType].
   DartType get aliasedType;
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   CompilationUnitElement get enclosingElement;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   CompilationUnitElement get enclosingElement2;
 
   @override
+  CompilationUnitElement get enclosingElement3;
+
+  @override
   String get name;
 
   /// Produces the type resulting from instantiating this typedef with the given
diff --git a/pkg/analyzer/lib/error/listener.dart b/pkg/analyzer/lib/error/listener.dart
index acc1838..5cb89c2 100644
--- a/pkg/analyzer/lib/error/listener.dart
+++ b/pkg/analyzer/lib/error/listener.dart
@@ -86,10 +86,10 @@
     // TODO(brianwilkerson) Consider extending this method to take any
     //  declaration and compute the correct range for the name of that
     //  declaration. This might make it easier to be consistent.
-    if (constructor.name != null) {
+    if (constructor.name2 != null) {
       var offset = constructor.returnType.offset;
       reportErrorForOffset(
-          code, offset, constructor.name!.end - offset, arguments);
+          code, offset, constructor.name2!.end - offset, arguments);
     } else {
       reportErrorForNode(code, constructor.returnType, arguments);
     }
diff --git a/pkg/analyzer/lib/src/dart/analysis/defined_names.dart b/pkg/analyzer/lib/src/dart/analysis/defined_names.dart
index d4d2ed2..a9295f5 100644
--- a/pkg/analyzer/lib/src/dart/analysis/defined_names.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/defined_names.dart
@@ -3,37 +3,38 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
 
 /// Compute the [DefinedNames] for the given [unit].
 DefinedNames computeDefinedNames(CompilationUnit unit) {
   DefinedNames names = DefinedNames();
 
-  void appendName(Set<String> names, SimpleIdentifier? node) {
-    var name = node?.name;
-    if (name != null && name.isNotEmpty) {
-      names.add(name);
+  void appendName(Set<String> names, Token? token) {
+    var lexeme = token?.lexeme;
+    if (lexeme != null && lexeme.isNotEmpty) {
+      names.add(lexeme);
     }
   }
 
   void appendClassMemberName(ClassMember member) {
     if (member is MethodDeclaration) {
-      appendName(names.classMemberNames, member.name);
+      appendName(names.classMemberNames, member.name2);
     } else if (member is FieldDeclaration) {
       for (VariableDeclaration field in member.fields.variables) {
-        appendName(names.classMemberNames, field.name);
+        appendName(names.classMemberNames, field.name2);
       }
     }
   }
 
   void appendTopLevelName(CompilationUnitMember member) {
     if (member is NamedCompilationUnitMember) {
-      appendName(names.topLevelNames, member.name);
+      appendName(names.topLevelNames, member.name2);
       if (member is ClassDeclaration) {
         member.members.forEach(appendClassMemberName);
       }
       if (member is EnumDeclaration) {
         for (var constant in member.constants) {
-          appendName(names.classMemberNames, constant.name);
+          appendName(names.classMemberNames, constant.name2);
         }
         member.members.forEach(appendClassMemberName);
       }
@@ -42,7 +43,7 @@
       }
     } else if (member is TopLevelVariableDeclaration) {
       for (VariableDeclaration variable in member.variables.variables) {
-        appendName(names.topLevelNames, variable.name);
+        appendName(names.topLevelNames, variable.name2);
       }
     }
   }
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index 08bc00e..9d94dc4 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -910,13 +910,13 @@
         if (declaration.macroKeyword != null) {
           var constructors = declaration.members
               .whereType<ConstructorDeclaration>()
-              .map((e) => e.name?.name ?? '')
+              .map((e) => e.name2?.lexeme ?? '')
               .where((e) => !e.startsWith('_'))
               .toList();
           if (constructors.isNotEmpty) {
             macroClasses.add(
               MacroClass(
-                name: declaration.name.name,
+                name: declaration.name2.lexeme,
                 constructors: constructors,
               ),
             );
@@ -940,21 +940,21 @@
     final topLevelDeclarations = <String>{};
     for (final declaration in unit.declarations) {
       if (declaration is ClassDeclaration) {
-        topLevelDeclarations.add(declaration.name.name);
+        topLevelDeclarations.add(declaration.name2.lexeme);
       } else if (declaration is EnumDeclaration) {
-        topLevelDeclarations.add(declaration.name.name);
+        topLevelDeclarations.add(declaration.name2.lexeme);
       } else if (declaration is ExtensionDeclaration) {
-        var name = declaration.name;
+        var name = declaration.name2;
         if (name != null) {
-          topLevelDeclarations.add(name.name);
+          topLevelDeclarations.add(name.lexeme);
         }
       } else if (declaration is FunctionDeclaration) {
-        topLevelDeclarations.add(declaration.name.name);
+        topLevelDeclarations.add(declaration.name2.lexeme);
       } else if (declaration is MixinDeclaration) {
-        topLevelDeclarations.add(declaration.name.name);
+        topLevelDeclarations.add(declaration.name2.lexeme);
       } else if (declaration is TopLevelVariableDeclaration) {
         for (var variable in declaration.variables.variables) {
-          topLevelDeclarations.add(variable.name.name);
+          topLevelDeclarations.add(variable.name2.lexeme);
         }
       }
     }
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index 265798f..e0ab233 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -18,7 +19,7 @@
   SimpleIdentifier node,
   Element? element,
 ) {
-  if (element == null || element.enclosingElement2 != null) {
+  if (element == null || element.enclosingElement3 != null) {
     return element;
   }
 
@@ -63,7 +64,7 @@
 /// Return the [CompilationUnitElement] that should be used for [element].
 /// Throw [StateError] if the [element] is not linked into a unit.
 CompilationUnitElement getUnitElement(Element element) {
-  for (Element? e = element; e != null; e = e.enclosingElement2) {
+  for (Element? e = element; e != null; e = e.enclosingElement3) {
     if (e is CompilationUnitElement) {
       return e;
     }
@@ -88,21 +89,21 @@
     String? parameterName;
     if (element is ParameterElement) {
       parameterName = element.name;
-      element = element.enclosingElement2!;
+      element = element.enclosingElement3!;
     }
 
     String? classMemberName;
-    if (element.enclosingElement2 is ClassElement ||
-        element.enclosingElement2 is ExtensionElement) {
+    if (element.enclosingElement3 is ClassElement ||
+        element.enclosingElement3 is ExtensionElement) {
       classMemberName = element.name;
-      element = element.enclosingElement2!;
+      element = element.enclosingElement3!;
     }
 
     String? unitMemberName;
-    if (element.enclosingElement2 is CompilationUnitElement) {
+    if (element.enclosingElement3 is CompilationUnitElement) {
       unitMemberName = element.name;
       if (element is ExtensionElement && unitMemberName == null) {
-        var enclosingUnit = element.enclosingElement2;
+        var enclosingUnit = element.enclosingElement3;
         var indexOf = enclosingUnit.extensions.indexOf(element);
         unitMemberName = 'extension-$indexOf';
       }
@@ -139,7 +140,7 @@
     } else if (element.isSynthetic) {
       if (elementKind == ElementKind.CONSTRUCTOR) {
         kind = IndexSyntheticElementKind.constructor;
-        element = element.enclosingElement2!;
+        element = element.enclosingElement3!;
       } else if (element is FunctionElement &&
           element.name == FunctionElement.LOAD_LIBRARY_NAME) {
         kind = IndexSyntheticElementKind.loadLibrary;
@@ -151,7 +152,7 @@
       } else if (elementKind == ElementKind.GETTER ||
           elementKind == ElementKind.SETTER) {
         var accessor = element as PropertyAccessorElement;
-        Element enclosing = element.enclosingElement2;
+        Element enclosing = element.enclosingElement3;
         bool isEnumGetter = enclosing is ClassElement && enclosing.isEnum;
         if (isEnumGetter && accessor.name == 'index') {
           kind = IndexSyntheticElementKind.enumIndex;
@@ -166,7 +167,7 @@
           element = accessor.variable;
         }
       } else if (element is MethodElement) {
-        Element enclosing = element.enclosingElement2;
+        Element enclosing = element.enclosingElement3;
         bool isEnumMethod = enclosing is ClassElement && enclosing.isEnum;
         if (isEnumMethod && element.name == 'toString') {
           kind = IndexSyntheticElementKind.enumToString;
@@ -464,8 +465,8 @@
   /// of the given [node].  The flag [isQualified] is `true` if [node] has an
   /// explicit or implicit qualifier, so cannot be shadowed by a local
   /// declaration.
-  void recordRelation(Element? element, IndexRelationKind kind, AstNode node,
-      bool isQualified) {
+  void recordRelation(Element? element, IndexRelationKind kind,
+      SyntacticEntity node, bool isQualified) {
     if (element != null) {
       recordRelationOffset(
           element, kind, node.offset, node.length, isQualified);
@@ -491,14 +492,14 @@
         elementKind == ElementKind.TYPE_PARAMETER ||
         elementKind == ElementKind.FUNCTION &&
             element is FunctionElement &&
-            element.enclosingElement2 is ExecutableElement ||
+            element.enclosingElement3 is ExecutableElement ||
         false) {
       return;
     }
     // Ignore named parameters of synthetic functions, e.g. created for LUB.
     // These functions are not bound to a source, we cannot index them.
     if (elementKind == ElementKind.PARAMETER && element is ParameterElement) {
-      var enclosingElement = element.enclosingElement2;
+      var enclosingElement = element.enclosingElement3;
       if (enclosingElement == null || enclosingElement.isSynthetic) {
         return;
       }
@@ -508,7 +509,7 @@
     // named parameters. Ignore them.
     if (elementKind == ElementKind.PARAMETER &&
         element is ParameterElement &&
-        element.enclosingElement2 is GenericFunctionTypeElement) {
+        element.enclosingElement3 is GenericFunctionTypeElement) {
       return;
     }
     // Add the relation.
@@ -564,7 +565,7 @@
     if (node.extendsClause == null) {
       ClassElement? objectElement = declaredElement.supertype?.element;
       recordRelationOffset(objectElement, IndexRelationKind.IS_EXTENDED_BY,
-          node.name.offset, 0, true);
+          node.name2.offset, 0, true);
     }
     recordIsAncestorOf(declaredElement);
     super.visitClassDeclaration(node);
@@ -654,7 +655,7 @@
         offset = constructorSelector.period.offset;
         length = constructorSelector.name.end - offset;
       } else {
-        offset = node.name.end;
+        offset = node.name2.end;
         length = 0;
       }
       recordRelationOffset(
@@ -674,7 +675,7 @@
   @override
   void visitEnumDeclaration(EnumDeclaration node) {
     _addSubtype(
-      node.name.name,
+      node.name2.lexeme,
       withClause: node.withClause,
       implementsClause: node.implementsClause,
       memberNodes: node.members,
@@ -713,8 +714,7 @@
     if (element is FieldFormalParameterElement) {
       var field = element.field;
       if (field != null) {
-        recordRelation(
-            field, IndexRelationKind.IS_WRITTEN_BY, node.identifier, true);
+        recordRelation(field, IndexRelationKind.IS_WRITTEN_BY, node.name, true);
       }
     }
 
@@ -861,11 +861,7 @@
     }
     // this.field parameter
     if (element is FieldFormalParameterElement) {
-      AstNode parent = node.parent!;
-      IndexRelationKind kind =
-          parent is FieldFormalParameter && parent.identifier == node
-              ? IndexRelationKind.IS_WRITTEN_BY
-              : IndexRelationKind.IS_REFERENCED_BY;
+      IndexRelationKind kind = IndexRelationKind.IS_REFERENCED_BY;
       recordRelation(element.field, kind, node, true);
       return;
     }
@@ -901,7 +897,7 @@
       var superParameter = element.superConstructorParameter;
       if (superParameter != null) {
         recordRelation(superParameter, IndexRelationKind.IS_REFERENCED_BY,
-            node.identifier, true);
+            node.name, true);
       }
     }
 
@@ -943,8 +939,8 @@
     onClause?.superclassConstraints.forEach(addSupertype);
     implementsClause?.interfaces.forEach(addSupertype);
 
-    void addMemberName(SimpleIdentifier identifier) {
-      String name = identifier.name;
+    void addMemberName(Token identifier) {
+      String name = identifier.lexeme;
       if (name.isNotEmpty) {
         members.add(name);
       }
@@ -952,10 +948,10 @@
 
     for (ClassMember member in memberNodes) {
       if (member is MethodDeclaration && !member.isStatic) {
-        addMemberName(member.name);
+        addMemberName(member.name2);
       } else if (member is FieldDeclaration && !member.isStatic) {
         for (var field in member.fields.variables) {
-          addMemberName(field.name);
+          addMemberName(field.name2);
         }
       }
     }
@@ -968,7 +964,7 @@
 
   /// Record the given class as a subclass of its direct superclasses.
   void _addSubtypeForClassDeclaration(ClassDeclaration node) {
-    _addSubtype(node.name.name,
+    _addSubtype(node.name2.lexeme,
         superclass: node.extendsClause?.superclass,
         withClause: node.withClause,
         implementsClause: node.implementsClause,
@@ -977,7 +973,7 @@
 
   /// Record the given class as a subclass of its direct superclasses.
   void _addSubtypeForClassTypeAlis(ClassTypeAlias node) {
-    _addSubtype(node.name.name,
+    _addSubtype(node.name2.lexeme,
         superclass: node.superclass,
         withClause: node.withClause,
         implementsClause: node.implementsClause,
@@ -986,7 +982,7 @@
 
   /// Record the given mixin as a subclass of its direct superclasses.
   void _addSubtypeForMixinDeclaration(MixinDeclaration node) {
-    _addSubtype(node.name.name,
+    _addSubtype(node.name2.lexeme,
         onClause: node.onClause,
         implementsClause: node.implementsClause,
         memberNodes: node.members);
@@ -999,8 +995,8 @@
       ConstructorElement? constructor) {
     var seenConstructors = <ConstructorElement?>{};
     while (constructor is ConstructorElementImpl && constructor.isSynthetic) {
-      var enclosing = constructor.enclosingElement2;
-      if (enclosing.isMixinApplication) {
+      var enclosing = constructor.enclosingElement3;
+      if (enclosing is ClassElement && enclosing.isMixinApplication) {
         var superInvocation = constructor.constantInitializers
             .whereType<SuperConstructorInvocation>()
             .singleOrNull;
diff --git a/pkg/analyzer/lib/src/dart/analysis/referenced_names.dart b/pkg/analyzer/lib/src/dart/analysis/referenced_names.dart
index 945a0c8..5f37b84 100644
--- a/pkg/analyzer/lib/src/dart/analysis/referenced_names.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/referenced_names.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 
 /// Compute the set of external names referenced in the [unit].
@@ -64,7 +65,7 @@
     _LocalNameScope scope = _LocalNameScope(enclosing);
     for (Statement statement in node.statements) {
       if (statement is FunctionDeclarationStatement) {
-        scope.add(statement.functionDeclaration.name);
+        scope.add(statement.functionDeclaration.name2);
       } else if (statement is VariableDeclarationStatement) {
         scope.addVariableNames(statement.variables);
       }
@@ -80,7 +81,7 @@
       if (member is FieldDeclaration) {
         scope.addVariableNames(member.fields);
       } else if (member is MethodDeclaration) {
-        scope.add(member.name);
+        scope.add(member.name2);
       }
     }
     return scope;
@@ -127,7 +128,7 @@
     _LocalNameScope scope = _LocalNameScope(null);
     for (CompilationUnitMember declaration in node.declarations) {
       if (declaration is NamedCompilationUnitMember) {
-        scope.add(declaration.name);
+        scope.add(declaration.name2);
       } else if (declaration is TopLevelVariableDeclaration) {
         scope.addVariableNames(declaration.variables);
       }
@@ -135,29 +136,29 @@
     return scope;
   }
 
-  void add(SimpleIdentifier? identifier) {
-    if (identifier != null) {
-      (names ??= <String>{}).add(identifier.name);
+  void add(Token? token) {
+    if (token != null) {
+      (names ??= <String>{}).add(token.lexeme);
     }
   }
 
   void addFormalParameters(FormalParameterList? parameterList) {
     if (parameterList != null) {
       parameterList.parameters
-          .map((p) => p is NormalFormalParameter ? p.identifier : null)
+          .map((p) => p is NormalFormalParameter ? p.name : null)
           .forEach(add);
     }
   }
 
   void addTypeParameters(TypeParameterList? typeParameterList) {
     if (typeParameterList != null) {
-      typeParameterList.typeParameters.map((p) => p.name).forEach(add);
+      typeParameterList.typeParameters.map((p) => p.name2).forEach(add);
     }
   }
 
   void addVariableNames(VariableDeclarationList variableList) {
     for (VariableDeclaration variable in variableList.variables) {
-      add(variable.name);
+      add(variable.name2);
     }
   }
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/results.dart b/pkg/analyzer/lib/src/dart/analysis/results.dart
index a3d06bb..8ce9d3d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/results.dart
@@ -5,6 +5,7 @@
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
@@ -343,22 +344,22 @@
 
     if (element is ClassElement) {
       if (node is ClassOrMixinDeclaration) {
-        if (_hasOffset(node.name)) {
+        if (_hasOffset2(node.name2)) {
           result = node;
         }
       } else if (node is ClassTypeAlias) {
-        if (_hasOffset(node.name)) {
+        if (_hasOffset2(node.name2)) {
           result = node;
         }
       } else if (node is EnumDeclaration) {
-        if (_hasOffset(node.name)) {
+        if (_hasOffset2(node.name2)) {
           result = node;
         }
       }
     } else if (element is ConstructorElement) {
       if (node is ConstructorDeclaration) {
-        if (node.name != null) {
-          if (_hasOffset(node.name)) {
+        if (node.name2 != null) {
+          if (_hasOffset2(node.name2)) {
             result = node;
           }
         } else {
@@ -369,48 +370,48 @@
       }
     } else if (element is ExtensionElement) {
       if (node is ExtensionDeclaration) {
-        if (_hasOffset(node.name)) {
+        if (_hasOffset2(node.name2)) {
           result = node;
         }
       }
     } else if (element is FieldElement) {
       if (node is EnumConstantDeclaration) {
-        if (_hasOffset(node.name)) {
+        if (_hasOffset2(node.name2)) {
           result = node;
         }
       } else if (node is VariableDeclaration) {
-        if (_hasOffset(node.name)) {
+        if (_hasOffset2(node.name2)) {
           result = node;
         }
       }
     } else if (element is FunctionElement) {
-      if (node is FunctionDeclaration && _hasOffset(node.name)) {
+      if (node is FunctionDeclaration && _hasOffset2(node.name2)) {
         result = node;
       }
     } else if (element is LocalVariableElement) {
-      if (node is VariableDeclaration && _hasOffset(node.name)) {
+      if (node is VariableDeclaration && _hasOffset2(node.name2)) {
         result = node;
       }
     } else if (element is MethodElement) {
-      if (node is MethodDeclaration && _hasOffset(node.name)) {
+      if (node is MethodDeclaration && _hasOffset2(node.name2)) {
         result = node;
       }
     } else if (element is ParameterElement) {
-      if (node is FormalParameter && _hasOffset(node.identifier)) {
+      if (node is FormalParameter && _hasOffset2(node.name)) {
         result = node;
       }
     } else if (element is PropertyAccessorElement) {
       if (node is FunctionDeclaration) {
-        if (_hasOffset(node.name)) {
+        if (_hasOffset2(node.name2)) {
           result = node;
         }
       } else if (node is MethodDeclaration) {
-        if (_hasOffset(node.name)) {
+        if (_hasOffset2(node.name2)) {
           result = node;
         }
       }
     } else if (element is TopLevelVariableElement) {
-      if (node is VariableDeclaration && _hasOffset(node.name)) {
+      if (node is VariableDeclaration && _hasOffset2(node.name2)) {
         result = node;
       }
     }
@@ -423,4 +424,8 @@
   bool _hasOffset(AstNode? node) {
     return node?.offset == _nameOffset;
   }
+
+  bool _hasOffset2(Token? token) {
+    return token?.offset == _nameOffset;
+  }
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index b0ad4c6..749d2b6 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -257,7 +257,7 @@
     } else if (element is PropertyInducingElement) {
       return _searchReferences_Field(element, searchedFiles);
     } else if (kind == ElementKind.FUNCTION || kind == ElementKind.METHOD) {
-      if (element.enclosingElement2 is ExecutableElement) {
+      if (element.enclosingElement3 is ExecutableElement) {
         return _searchReferences_Local(
             element, (n) => n is Block, searchedFiles);
       }
@@ -405,7 +405,7 @@
     // Prepare the element name.
     String name = element.displayName;
     if (element is ConstructorElement) {
-      name = element.enclosingElement2.displayName;
+      name = element.enclosingElement3.displayName;
     }
 
     // Prepare the list of files that reference the element name.
@@ -654,7 +654,7 @@
     ));
     if (parameter.isNamed ||
         parameter.isOptionalPositional ||
-        parameter.enclosingElement2 is ConstructorElement) {
+        parameter.enclosingElement3 is ConstructorElement) {
       results.addAll(await _searchReferences(parameter, searchedFiles));
     }
     return results;
@@ -914,7 +914,7 @@
       return;
     }
 
-    var enclosing = element.enclosingElement2;
+    var enclosing = element.enclosingElement3;
 
     String? className;
     String? mixinName;
diff --git a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
index 20b101b..a7c7a0f 100644
--- a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
@@ -49,7 +49,7 @@
         var functionExpression = declaration.functionExpression;
         _addTokens(
           declaration.beginToken,
-          (functionExpression.parameters ?? declaration.name).endToken,
+          functionExpression.parameters?.endToken ?? declaration.name2,
         );
         _addFunctionBodyModifiers(functionExpression.body);
       } else if (declaration is TopLevelVariableDeclaration) {
@@ -138,7 +138,7 @@
     signature.addInt(_kindMethodDeclaration);
     _addTokens(
       node.beginToken,
-      (node.parameters ?? node.name).endToken,
+      node.parameters?.endToken ?? node.name2,
     );
     signature.addBool(node.body is EmptyFunctionBody);
     _addFunctionBodyModifiers(node.body);
@@ -212,7 +212,7 @@
     signature.addInt(variables.length);
 
     for (var variable in variables) {
-      _addNode(variable.name);
+      _addToken(variable.name2);
       signature.addBool(variable.initializer != null);
       if (includeInitializers) {
         _addNode(variable.initializer);
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 4e04433..35324b3 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -95,7 +95,10 @@
   /// Initialize a newly created annotated node. Either or both of the [comment]
   /// and [metadata] can be `null` if the node does not have the corresponding
   /// attribute.
-  AnnotatedNodeImpl(this._comment, List<Annotation>? metadata) {
+  AnnotatedNodeImpl({
+    required CommentImpl? comment,
+    required List<Annotation>? metadata,
+  }) : _comment = comment {
     _becomeParentOf(_comment);
     _metadata._initialize(this, metadata);
   }
@@ -893,13 +896,13 @@
   Token semicolon;
 
   AugmentationImportDirectiveImpl({
-    required CommentImpl? comment,
-    required List<Annotation>? metadata,
+    required super.comment,
+    required super.metadata,
     required this.importKeyword,
     required this.augmentKeyword,
     required this.semicolon,
-    required StringLiteralImpl uri,
-  }) : super(comment, metadata, uri) {
+    required super.uri,
+  }) {
     _becomeParentOf(_uri);
   }
 
@@ -1678,6 +1681,9 @@
   /// native clause.
   NativeClauseImpl? _nativeClause;
 
+  @override
+  ClassElement? declaredElement;
+
   /// Initialize a newly created class declaration. Either or both of the
   /// [comment] and [metadata] can be `null` if the class does not have the
   /// corresponding attribute. The [abstractKeyword] can be `null` if the class
@@ -1686,31 +1692,28 @@
   /// and [implementsClause] can be `null` if the class does not have the
   /// corresponding clause. The list of [members] can be `null` if the class
   /// does not have any members.
-  ClassDeclarationImpl(
-      CommentImpl? comment,
-      List<Annotation>? metadata,
-      this.abstractKeyword,
-      this.macroKeyword,
-      this.augmentKeyword,
-      this.classKeyword,
-      SimpleIdentifierImpl name,
-      TypeParameterListImpl? typeParameters,
-      this._extendsClause,
-      this._withClause,
-      ImplementsClauseImpl? implementsClause,
-      Token leftBracket,
-      List<ClassMember> members,
-      Token rightBracket)
-      : super(comment, metadata, name, typeParameters, implementsClause,
-            leftBracket, members, rightBracket) {
+  ClassDeclarationImpl({
+    required super.comment,
+    required super.metadata,
+    required this.abstractKeyword,
+    required this.macroKeyword,
+    required this.augmentKeyword,
+    required this.classKeyword,
+    required super.name,
+    required super.typeParameters,
+    required ExtendsClauseImpl? extendsClause,
+    required WithClauseImpl? withClause,
+    required super.implementsClause,
+    required super.leftBracket,
+    required super.members,
+    required super.rightBracket,
+  })  : _extendsClause = extendsClause,
+        _withClause = withClause {
     _becomeParentOf(_extendsClause);
     _becomeParentOf(_withClause);
   }
 
   @override
-  ClassElement? get declaredElement => _name.staticElement as ClassElement?;
-
-  @override
   ExtendsClauseImpl? get extendsClause => _extendsClause;
 
   set extendsClause(ExtendsClause? extendsClause) {
@@ -1746,7 +1749,7 @@
     ..addToken('macroKeyword', macroKeyword)
     ..addToken('augmentKeyword', augmentKeyword)
     ..addToken('classKeyword', classKeyword)
-    ..addNode('name', name)
+    ..addToken('name', name2)
     ..addNode('typeParameters', typeParameters)
     ..addNode('extendsClause', extendsClause)
     ..addNode('withClause', withClause)
@@ -1782,7 +1785,8 @@
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
-    _name.accept(visitor);
+    // ignore: deprecated_member_use_from_same_package
+    name.accept(visitor);
     _typeParameters?.accept(visitor);
     _extendsClause?.accept(visitor);
     _withClause?.accept(visitor);
@@ -1797,7 +1801,10 @@
   /// Initialize a newly created member of a class. Either or both of the
   /// [comment] and [metadata] can be `null` if the member does not have the
   /// corresponding attribute.
-  ClassMemberImpl(super.comment, super.metadata);
+  ClassMemberImpl({
+    required super.comment,
+    required super.metadata,
+  });
 }
 
 abstract class ClassOrMixinDeclarationImpl
@@ -1821,15 +1828,17 @@
   @override
   Token rightBracket;
 
-  ClassOrMixinDeclarationImpl(
-      super.comment,
-      super.metadata,
-      super.name,
-      this._typeParameters,
-      this._implementsClause,
-      this.leftBracket,
-      List<ClassMember> members,
-      this.rightBracket) {
+  ClassOrMixinDeclarationImpl({
+    required super.comment,
+    required super.metadata,
+    required super.name,
+    required TypeParameterListImpl? typeParameters,
+    required ImplementsClauseImpl? implementsClause,
+    required this.leftBracket,
+    required List<ClassMember> members,
+    required this.rightBracket,
+  })  : _typeParameters = typeParameters,
+        _implementsClause = implementsClause {
     _becomeParentOf(_typeParameters);
     _becomeParentOf(_implementsClause);
     _members._initialize(this, members);
@@ -1886,7 +1895,7 @@
       ClassMember classMember = _members[i];
       if (classMember is MethodDeclaration) {
         MethodDeclaration method = classMember;
-        if (name == method.name.name) {
+        if (name == method.name2.lexeme) {
           return method;
         }
       }
@@ -1935,27 +1944,33 @@
   /// clause.
   ImplementsClauseImpl? _implementsClause;
 
+  @override
+  ClassElement? declaredElement;
+
   /// Initialize a newly created class type alias. Either or both of the
   /// [comment] and [metadata] can be `null` if the class type alias does not
   /// have the corresponding attribute. The [typeParameters] can be `null` if
   /// the class does not have any type parameters. The [abstractKeyword] can be
   /// `null` if the class is not abstract. The [implementsClause] can be `null`
   /// if the class does not implement any interfaces.
-  ClassTypeAliasImpl(
-      CommentImpl? comment,
-      List<Annotation>? metadata,
-      Token keyword,
-      SimpleIdentifierImpl name,
-      this._typeParameters,
-      this.equals,
-      this.abstractKeyword,
-      this.macroKeyword,
-      this.augmentKeyword,
-      this._superclass,
-      this._withClause,
-      this._implementsClause,
-      Token semicolon)
-      : super(comment, metadata, keyword, name, semicolon) {
+  ClassTypeAliasImpl({
+    required super.comment,
+    required super.metadata,
+    required super.typedefKeyword,
+    required super.name,
+    required TypeParameterListImpl? typeParameters,
+    required this.equals,
+    required this.abstractKeyword,
+    required this.macroKeyword,
+    required this.augmentKeyword,
+    required NamedTypeImpl superclass,
+    required WithClauseImpl withClause,
+    required ImplementsClauseImpl? implementsClause,
+    required super.semicolon,
+  })  : _typeParameters = typeParameters,
+        _superclass = superclass,
+        _withClause = withClause,
+        _implementsClause = implementsClause {
     _becomeParentOf(_typeParameters);
     _becomeParentOf(_superclass);
     _becomeParentOf(_withClause);
@@ -1963,9 +1978,6 @@
   }
 
   @override
-  ClassElement? get declaredElement => _name.staticElement as ClassElement?;
-
-  @override
   Token get firstTokenAfterCommentAndMetadata {
     return abstractKeyword ?? macroKeyword ?? augmentKeyword ?? typedefKeyword;
   }
@@ -2010,7 +2022,7 @@
   @override
   ChildEntities get _childEntities => super._childEntities
     ..addToken('typedefKeyword', typedefKeyword)
-    ..addNode('name', name)
+    ..addToken('name', name2)
     ..addNode('typeParameters', typeParameters)
     ..addToken('equals', equals)
     ..addToken('abstractKeyword', abstractKeyword)
@@ -2027,7 +2039,8 @@
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
-    _name.accept(visitor);
+    // ignore: deprecated_member_use_from_same_package
+    name.accept(visitor);
     _typeParameters?.accept(visitor);
     _superclass.accept(visitor);
     _withClause.accept(visitor);
@@ -2409,7 +2422,10 @@
   /// Initialize a newly created generic compilation unit member. Either or both
   /// of the [comment] and [metadata] can be `null` if the member does not have
   /// the corresponding attribute.
-  CompilationUnitMemberImpl(super.comment, super.metadata);
+  CompilationUnitMemberImpl({
+    required super.comment,
+    required super.metadata,
+  });
 }
 
 mixin CompoundAssignmentExpressionImpl implements CompoundAssignmentExpression {
@@ -2700,7 +2716,7 @@
   /// [comment] and [metadata] can be `null` if the constructor does not have
   /// the corresponding attribute. The [constKeyword] can be `null` if the
   /// constructor cannot be used to create a constant. The [factoryKeyword] can
-  /// be `null` if the constructor is not a factory. The [period] and [name] can
+  /// be `null` if the constructor is not a factory. The [period] and [name2] can
   /// both be `null` if the constructor is not a named constructor. The
   /// [separator] can be `null` if the constructor does not have any
   /// initializers and does not redirect to a different constructor. The list of
@@ -2708,20 +2724,25 @@
   /// initializers. The [redirectedConstructor] can be `null` if the constructor
   /// does not redirect to a different constructor. The [body] can be `null` if
   /// the constructor does not have a body.
-  ConstructorDeclarationImpl(
-      super.comment,
-      super.metadata,
-      this.externalKeyword,
-      this.constKeyword,
-      this.factoryKeyword,
-      this._returnType,
-      this.period,
-      this._name,
-      this._parameters,
-      this.separator,
-      List<ConstructorInitializer>? initializers,
-      this._redirectedConstructor,
-      this._body) {
+  ConstructorDeclarationImpl({
+    required super.comment,
+    required super.metadata,
+    required this.externalKeyword,
+    required this.constKeyword,
+    required this.factoryKeyword,
+    required IdentifierImpl returnType,
+    required this.period,
+    required SimpleIdentifierImpl? name,
+    required FormalParameterListImpl parameters,
+    required this.separator,
+    required List<ConstructorInitializer>? initializers,
+    required ConstructorNameImpl? redirectedConstructor,
+    required FunctionBodyImpl body,
+  })  : _returnType = returnType,
+        _name = name,
+        _parameters = parameters,
+        _redirectedConstructor = redirectedConstructor,
+        _body = body {
     _becomeParentOf(_returnType);
     _becomeParentOf(_name);
     _becomeParentOf(_parameters);
@@ -2752,13 +2773,20 @@
   @override
   NodeListImpl<ConstructorInitializer> get initializers => _initializers;
 
+  @Deprecated('Use name2 instead')
   @override
-  SimpleIdentifierImpl? get name => _name;
-
-  set name(SimpleIdentifier? identifier) {
-    _name = _becomeParentOf(identifier as SimpleIdentifierImpl?);
+  SimpleIdentifierImpl? get name {
+    _name?.staticElement = declaredElement;
+    return _name;
   }
 
+  set name(SimpleIdentifier? name) {
+    _name = _becomeParentOf(name as SimpleIdentifierImpl);
+  }
+
+  @override
+  Token? get name2 => _name?.token;
+
   @override
   FormalParameterListImpl get parameters => _parameters;
 
@@ -2788,7 +2816,7 @@
     ..addToken('factoryKeyword', factoryKeyword)
     ..addNode('returnType', returnType)
     ..addToken('period', period)
-    ..addNode('name', name)
+    ..addToken('name', name2)
     ..addNode('parameters', parameters)
     ..addToken('separator', separator)
     ..addNodeList('initializers', initializers)
@@ -3123,7 +3151,10 @@
   /// Initialize a newly created declaration. Either or both of the [comment]
   /// and [metadata] can be `null` if the declaration does not have the
   /// corresponding attribute.
-  DeclarationImpl(super.comment, super.metadata);
+  DeclarationImpl({
+    required super.comment,
+    required super.metadata,
+  });
 }
 
 /// The declaration of a single identifier.
@@ -3144,22 +3175,26 @@
   /// The name of the variable being declared.
   SimpleIdentifierImpl _identifier;
 
+  @override
+  LocalVariableElement? declaredElement;
+
   /// Initialize a newly created formal parameter. Either or both of the
   /// [comment] and [metadata] can be `null` if the declaration does not have
   /// the corresponding attribute. The [keyword] can be `null` if a type name is
   /// given. The [type] must be `null` if the keyword is 'var'.
-  DeclaredIdentifierImpl(super.comment, super.metadata, this.keyword,
-      this._type, this._identifier) {
+  DeclaredIdentifierImpl({
+    required super.comment,
+    required super.metadata,
+    required this.keyword,
+    required TypeAnnotationImpl? type,
+    required SimpleIdentifierImpl identifier,
+  })  : _type = type,
+        _identifier = identifier {
     _becomeParentOf(_type);
     _becomeParentOf(_identifier);
   }
 
   @override
-  LocalVariableElement? get declaredElement {
-    return _identifier.staticElement as LocalVariableElement;
-  }
-
-  @override
   Token get endToken => _identifier.endToken;
 
   @override
@@ -3167,8 +3202,12 @@
     return keyword ?? _type?.beginToken ?? _identifier.beginToken;
   }
 
+  @Deprecated('Use name2 instead')
   @override
-  SimpleIdentifierImpl get identifier => _identifier;
+  SimpleIdentifierImpl get identifier {
+    _identifier.staticElement = declaredElement;
+    return _identifier;
+  }
 
   set identifier(SimpleIdentifier identifier) {
     _identifier = _becomeParentOf(identifier as SimpleIdentifierImpl);
@@ -3181,6 +3220,9 @@
   bool get isFinal => keyword?.keyword == Keyword.FINAL;
 
   @override
+  Token get name => _identifier.token;
+
+  @override
   TypeAnnotationImpl? get type => _type;
 
   set type(TypeAnnotation? type) {
@@ -3191,7 +3233,7 @@
   ChildEntities get _childEntities => super._childEntities
     ..addToken('keyword', keyword)
     ..addNode('type', type)
-    ..addNode('identifier', identifier);
+    ..addToken('name', name);
 
   @override
   E? accept<E>(AstVisitor<E> visitor) => visitor.visitDeclaredIdentifier(this);
@@ -3200,7 +3242,8 @@
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     _type?.accept(visitor);
-    _identifier.accept(visitor);
+    // ignore: deprecated_member_use_from_same_package
+    identifier.accept(visitor);
   }
 }
 
@@ -3279,6 +3322,7 @@
     return _parameter.endToken;
   }
 
+  @Deprecated('Use identifier2 instead')
   @override
   SimpleIdentifierImpl? get identifier => _parameter.identifier;
 
@@ -3295,6 +3339,9 @@
   NodeListImpl<Annotation> get metadata => _parameter.metadata;
 
   @override
+  Token? get name => _parameter.name;
+
+  @override
   NormalFormalParameterImpl get parameter => _parameter;
 
   set parameter(NormalFormalParameter formalParameter) {
@@ -3338,7 +3385,10 @@
   /// Initialize a newly create directive. Either or both of the [comment] and
   /// [metadata] can be `null` if the directive does not have the corresponding
   /// attribute.
-  DirectiveImpl(super.comment, super.metadata);
+  DirectiveImpl({
+    required super.comment,
+    required super.metadata,
+  });
 
   @Deprecated('Use element2 instead')
   @override
@@ -3643,6 +3693,9 @@
   SimpleIdentifierImpl _name;
 
   @override
+  FieldElement? declaredElement;
+
+  @override
   final EnumConstantArgumentsImpl? arguments;
 
   @override
@@ -3652,35 +3705,38 @@
   /// the [documentationComment] and [metadata] can be `null` if the constant
   /// does not have the corresponding attribute.
   EnumConstantDeclarationImpl({
-    required CommentImpl? documentationComment,
-    required List<Annotation>? metadata,
+    required super.comment,
+    required super.metadata,
     required SimpleIdentifierImpl name,
     required this.arguments,
-  })  : _name = name,
-        super(documentationComment, metadata) {
+  }) : _name = name {
     _becomeParentOf(_name);
     _becomeParentOf(arguments);
   }
 
   @override
-  FieldElement get declaredElement => _name.staticElement as FieldElement;
-
-  @override
   Token get endToken => (arguments ?? _name).endToken;
 
   @override
   Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
 
+  @Deprecated('Use name2 instead')
   @override
-  SimpleIdentifierImpl get name => _name;
+  SimpleIdentifierImpl get name {
+    _name.staticElement = declaredElement;
+    return _name;
+  }
 
   set name(SimpleIdentifier name) {
     _name = _becomeParentOf(name as SimpleIdentifierImpl);
   }
 
   @override
+  Token get name2 => _name.token;
+
+  @override
   ChildEntities get _childEntities => super._childEntities
-    ..addNode('name', name)
+    ..addToken('name', name2)
     ..addNode('arguments', arguments);
 
   @override
@@ -3690,7 +3746,8 @@
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
-    _name.accept(visitor);
+    // ignore: deprecated_member_use_from_same_package
+    name.accept(visitor);
     arguments?.accept(visitor);
   }
 }
@@ -3736,24 +3793,29 @@
   @override
   Token rightBracket;
 
+  @override
+  ClassElement? declaredElement;
+
   /// Initialize a newly created enumeration declaration. Either or both of the
   /// [comment] and [metadata] can be `null` if the declaration does not have
   /// the corresponding attribute. The list of [constants] must contain at least
   /// one value.
-  EnumDeclarationImpl(
-      CommentImpl? comment,
-      List<Annotation>? metadata,
-      this.enumKeyword,
-      SimpleIdentifierImpl name,
-      this._typeParameters,
-      this._withClause,
-      this._implementsClause,
-      this.leftBracket,
-      List<EnumConstantDeclaration> constants,
-      this.semicolon,
-      List<ClassMember> members,
-      this.rightBracket)
-      : super(comment, metadata, name) {
+  EnumDeclarationImpl({
+    required super.comment,
+    required super.metadata,
+    required this.enumKeyword,
+    required super.name,
+    required TypeParameterListImpl? typeParameters,
+    required WithClauseImpl? withClause,
+    required ImplementsClauseImpl? implementsClause,
+    required this.leftBracket,
+    required List<EnumConstantDeclaration> constants,
+    required this.semicolon,
+    required List<ClassMember> members,
+    required this.rightBracket,
+  })  : _typeParameters = typeParameters,
+        _withClause = withClause,
+        _implementsClause = implementsClause {
     _becomeParentOf(_typeParameters);
     _becomeParentOf(_withClause);
     _becomeParentOf(_implementsClause);
@@ -3765,9 +3827,6 @@
   NodeListImpl<EnumConstantDeclaration> get constants => _constants;
 
   @override
-  ClassElement? get declaredElement => _name.staticElement as ClassElement?;
-
-  @override
   Token get endToken => rightBracket;
 
   @override
@@ -3802,7 +3861,7 @@
   // TODO(brianwilkerson) Add commas?
   ChildEntities get _childEntities => super._childEntities
     ..addToken('enumKeyword', enumKeyword)
-    ..addNode('name', name)
+    ..addToken('name', name2)
     ..addNode('typeParameters', typeParameters)
     ..addNode('withClause', withClause)
     ..addNode('implementsClause', implementsClause)
@@ -3818,7 +3877,8 @@
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
-    _name.accept(visitor);
+    // ignore: deprecated_member_use_from_same_package
+    name.accept(visitor);
     _typeParameters?.accept(visitor);
     _withClause?.accept(visitor);
     _implementsClause?.accept(visitor);
@@ -3849,14 +3909,15 @@
   /// [comment] and [metadata] can be `null` if the directive does not have the
   /// corresponding attribute. The list of [combinators] can be `null` if there
   /// are no combinators.
-  ExportDirectiveImpl(
-      super.comment,
-      super.metadata,
-      this.exportKeyword,
-      super.libraryUri,
-      super.configurations,
-      super.combinators,
-      super.semicolon);
+  ExportDirectiveImpl({
+    required super.comment,
+    required super.metadata,
+    required this.exportKeyword,
+    required super.uri,
+    required super.configurations,
+    required super.combinators,
+    required super.semicolon,
+  });
 
   @Deprecated('Use element2 instead')
   @override
@@ -4255,20 +4316,25 @@
 
   ExtensionElement? _declaredElement;
 
-  ExtensionDeclarationImpl(
-      super.comment,
-      super.metadata,
-      this.extensionKeyword,
-      this.typeKeyword,
-      this._name,
-      this._typeParameters,
-      this.onKeyword,
-      this._extendedType,
-      this._showClause,
-      this._hideClause,
-      this.leftBracket,
-      List<ClassMember> members,
-      this.rightBracket) {
+  ExtensionDeclarationImpl({
+    required super.comment,
+    required super.metadata,
+    required this.extensionKeyword,
+    required this.typeKeyword,
+    required SimpleIdentifierImpl? name,
+    required TypeParameterListImpl? typeParameters,
+    required this.onKeyword,
+    required TypeAnnotationImpl extendedType,
+    required ShowClauseImpl? showClause,
+    required HideClauseImpl? hideClause,
+    required this.leftBracket,
+    required List<ClassMember> members,
+    required this.rightBracket,
+  })  : _name = name,
+        _typeParameters = typeParameters,
+        _extendedType = extendedType,
+        _showClause = showClause,
+        _hideClause = hideClause {
     _becomeParentOf(_name);
     _becomeParentOf(_typeParameters);
     _becomeParentOf(_extendedType);
@@ -4306,14 +4372,21 @@
   @override
   NodeListImpl<ClassMember> get members => _members;
 
+  @Deprecated('Use name2 instead')
   @override
-  SimpleIdentifierImpl? get name => _name;
+  SimpleIdentifierImpl? get name {
+    _name?.staticElement = declaredElement;
+    return _name;
+  }
 
   set name(SimpleIdentifier? identifier) {
     _name = _becomeParentOf(identifier as SimpleIdentifierImpl?);
   }
 
   @override
+  Token? get name2 => _name?.token;
+
+  @override
   ShowClauseImpl? get showClause => _showClause;
 
   set showClause(ShowClause? showClause) {
@@ -4330,7 +4403,7 @@
   @override
   ChildEntities get _childEntities => ChildEntities()
     ..addToken('extensionKeyword', extensionKeyword)
-    ..addNode('name', name)
+    ..addToken('name', name2)
     ..addNode('typeParameters', typeParameters)
     ..addToken('onKeyword', onKeyword)
     ..addNode('extendedType', extendedType)
@@ -4345,6 +4418,7 @@
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
+    // ignore: deprecated_member_use_from_same_package
     name?.accept(visitor);
     _typeParameters?.accept(visitor);
     _extendedType.accept(visitor);
@@ -4483,16 +4557,17 @@
   /// [comment] and [metadata] can be `null` if the declaration does not have
   /// the corresponding attribute. The [staticKeyword] can be `null` if the
   /// field is not a static field.
-  FieldDeclarationImpl(
-      super.comment,
-      super.metadata,
-      this.abstractKeyword,
-      this.augmentKeyword,
-      this.covariantKeyword,
-      this.externalKeyword,
-      this.staticKeyword,
-      this._fieldList,
-      this.semicolon) {
+  FieldDeclarationImpl({
+    required super.comment,
+    required super.metadata,
+    required this.abstractKeyword,
+    required this.augmentKeyword,
+    required this.covariantKeyword,
+    required this.externalKeyword,
+    required this.staticKeyword,
+    required VariableDeclarationListImpl fieldList,
+    required this.semicolon,
+  }) : _fieldList = fieldList {
     _becomeParentOf(_fieldList);
   }
 
@@ -4617,9 +4692,10 @@
 
   @override
   Token get endToken {
-    return question ?? _parameters?.endToken ?? identifier.endToken;
+    return question ?? _parameters?.endToken ?? name;
   }
 
+  @Deprecated('Use identifier2 instead')
   @override
   SimpleIdentifierImpl get identifier => super.identifier!;
 
@@ -4633,6 +4709,9 @@
   bool get isFinal => keyword?.keyword == Keyword.FINAL;
 
   @override
+  Token get name => super.name!;
+
+  @override
   FormalParameterListImpl? get parameters => _parameters;
 
   set parameters(FormalParameterList? parameters) {
@@ -4659,7 +4738,7 @@
     ..addNode('type', type)
     ..addToken('thisKeyword', thisKeyword)
     ..addToken('period', period)
-    ..addNode('identifier', identifier)
+    ..addToken('name', name)
     ..addNode('parameters', parameters);
 
   @override
@@ -4670,6 +4749,7 @@
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     _type?.accept(visitor);
+    // ignore: deprecated_member_use_from_same_package
     identifier.accept(visitor);
     _typeParameters?.accept(visitor);
     _parameters?.accept(visitor);
@@ -4873,17 +4953,24 @@
 abstract class FormalParameterImpl extends AstNodeImpl
     implements FormalParameter {
   @override
-  ParameterElement? get declaredElement {
-    final identifier = this.identifier;
-    if (identifier == null) {
-      return null;
-    }
-    return identifier.staticElement as ParameterElement?;
-  }
+  ParameterElement? declaredElement;
 
+  @Deprecated('Use identifier2 instead')
   @override
   SimpleIdentifierImpl? get identifier;
 
+  /// TODO(scheglov) I was not able to update 'nnbd_migration' any better.
+  SimpleIdentifier? get identifierForMigration {
+    final token = name;
+    if (token != null) {
+      final result = SimpleIdentifierImpl(token);
+      result.staticElement = declaredElement;
+      _becomeParentOf(result);
+      return result;
+    }
+    return null;
+  }
+
   @override
   bool get isNamed => kind.isNamed;
 
@@ -4910,19 +4997,6 @@
 
   /// Return the kind of this parameter.
   ParameterKind get kind;
-
-  static void setDeclaredElement(
-    FormalParameterImpl node,
-    ParameterElement element,
-  ) {
-    if (node is DefaultFormalParameterImpl) {
-      setDeclaredElement(node.parameter, element);
-    } else if (node is SimpleFormalParameterImpl) {
-      node.declaredElement = element;
-    } else {
-      node.identifier!.staticElement = element;
-    }
-  }
 }
 
 /// The formal parameter list of a method declaration, function declaration, or
@@ -5331,31 +5405,31 @@
   /// The function expression being wrapped.
   FunctionExpressionImpl _functionExpression;
 
+  @override
+  ExecutableElement? declaredElement;
+
   /// Initialize a newly created function declaration. Either or both of the
   /// [comment] and [metadata] can be `null` if the function does not have the
   /// corresponding attribute. The [externalKeyword] can be `null` if the
   /// function is not an external function. The [returnType] can be `null` if no
   /// return type was specified. The [propertyKeyword] can be `null` if the
   /// function is neither a getter or a setter.
-  FunctionDeclarationImpl(
-      CommentImpl? comment,
-      List<Annotation>? metadata,
-      this.augmentKeyword,
-      this.externalKeyword,
-      this._returnType,
-      this.propertyKeyword,
-      SimpleIdentifierImpl name,
-      this._functionExpression)
-      : super(comment, metadata, name) {
+  FunctionDeclarationImpl({
+    required super.comment,
+    required super.metadata,
+    required this.augmentKeyword,
+    required this.externalKeyword,
+    required TypeAnnotationImpl? returnType,
+    required this.propertyKeyword,
+    required super.name,
+    required FunctionExpressionImpl functionExpression,
+  })  : _returnType = returnType,
+        _functionExpression = functionExpression {
     _becomeParentOf(_returnType);
     _becomeParentOf(_functionExpression);
   }
 
   @override
-  ExecutableElement? get declaredElement =>
-      _name.staticElement as ExecutableElement?;
-
-  @override
   Token get endToken => _functionExpression.endToken;
 
   @override
@@ -5394,7 +5468,7 @@
     ..addToken('externalKeyword', externalKeyword)
     ..addNode('returnType', returnType)
     ..addToken('propertyKeyword', propertyKeyword)
-    ..addNode('name', name)
+    ..addToken('name', name2)
     ..addNode('functionExpression', functionExpression);
 
   @override
@@ -5404,7 +5478,8 @@
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     _returnType?.accept(visitor);
-    _name.accept(visitor);
+    // ignore: deprecated_member_use_from_same_package
+    name.accept(visitor);
     _functionExpression.accept(visitor);
   }
 }
@@ -5692,31 +5767,32 @@
   /// The parameters associated with the function type.
   FormalParameterListImpl _parameters;
 
+  @override
+  TypeAliasElement? declaredElement;
+
   /// Initialize a newly created function type alias. Either or both of the
   /// [comment] and [metadata] can be `null` if the function does not have the
   /// corresponding attribute. The [returnType] can be `null` if no return type
   /// was specified. The [typeParameters] can be `null` if the function has no
   /// type parameters.
-  FunctionTypeAliasImpl(
-      CommentImpl? comment,
-      List<Annotation>? metadata,
-      Token keyword,
-      this._returnType,
-      SimpleIdentifierImpl name,
-      this._typeParameters,
-      this._parameters,
-      Token semicolon)
-      : super(comment, metadata, keyword, name, semicolon) {
+  FunctionTypeAliasImpl({
+    required super.comment,
+    required super.metadata,
+    required super.typedefKeyword,
+    required TypeAnnotationImpl? returnType,
+    required super.name,
+    required TypeParameterListImpl? typeParameters,
+    required FormalParameterListImpl parameters,
+    required super.semicolon,
+  })  : _returnType = returnType,
+        _typeParameters = typeParameters,
+        _parameters = parameters {
     _becomeParentOf(_returnType);
     _becomeParentOf(_typeParameters);
     _becomeParentOf(_parameters);
   }
 
   @override
-  TypeAliasElement? get declaredElement =>
-      _name.staticElement as TypeAliasElement?;
-
-  @override
   FormalParameterListImpl get parameters => _parameters;
 
   set parameters(FormalParameterList parameters) {
@@ -5741,7 +5817,7 @@
   ChildEntities get _childEntities => super._childEntities
     ..addToken('typedefKeyword', typedefKeyword)
     ..addNode('returnType', returnType)
-    ..addNode('name', name)
+    ..addToken('name', name2)
     ..addNode('typeParameters', typeParameters)
     ..addNode('parameters', parameters)
     ..addToken('semicolon', semicolon);
@@ -5753,7 +5829,8 @@
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     _returnType?.accept(visitor);
-    _name.accept(visitor);
+    // ignore: deprecated_member_use_from_same_package
+    name.accept(visitor);
     _typeParameters?.accept(visitor);
     _parameters.accept(visitor);
   }
@@ -5813,12 +5890,13 @@
     } else if (_returnType != null) {
       return _returnType!.beginToken;
     }
-    return identifier.beginToken;
+    return name;
   }
 
   @override
   Token get endToken => question ?? _parameters.endToken;
 
+  @Deprecated('Use identifier2 instead')
   @override
   SimpleIdentifierImpl get identifier => super.identifier!;
 
@@ -5832,6 +5910,9 @@
   bool get isFinal => false;
 
   @override
+  Token get name => super.name!;
+
+  @override
   FormalParameterListImpl get parameters => _parameters;
 
   set parameters(FormalParameterList parameters) {
@@ -5855,7 +5936,7 @@
   @override
   ChildEntities get _childEntities => super._childEntities
     ..addNode('returnType', returnType)
-    ..addNode('identifier', identifier)
+    ..addToken('name', name)
     ..addNode('parameters', parameters);
 
   @override
@@ -5866,6 +5947,7 @@
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     _returnType?.accept(visitor);
+    // ignore: deprecated_member_use_from_same_package
     identifier.accept(visitor);
     _typeParameters?.accept(visitor);
     _parameters.accept(visitor);
@@ -6003,27 +6085,28 @@
   @override
   Token equals;
 
+  @override
+  Element? declaredElement;
+
   /// Returns a newly created generic type alias. Either or both of the
   /// [comment] and [metadata] can be `null` if the variable list does not have
   /// the corresponding attribute. The [typeParameters] can be `null` if there
   /// are no type parameters.
-  GenericTypeAliasImpl(
-      CommentImpl? comment,
-      List<Annotation>? metadata,
-      Token typedefToken,
-      SimpleIdentifierImpl name,
-      this._typeParameters,
-      this.equals,
-      this._type,
-      Token semicolon)
-      : super(comment, metadata, typedefToken, name, semicolon) {
+  GenericTypeAliasImpl({
+    required super.comment,
+    required super.metadata,
+    required super.typedefKeyword,
+    required super.name,
+    required TypeParameterListImpl? typeParameters,
+    required this.equals,
+    required TypeAnnotationImpl type,
+    required super.semicolon,
+  })  : _typeParameters = typeParameters,
+        _type = type {
     _becomeParentOf(_typeParameters);
     _becomeParentOf(_type);
   }
 
-  @override
-  Element? get declaredElement => name.staticElement;
-
   /// The type of function being defined by the alias.
   ///
   /// If the non-function type aliases feature is enabled, a type alias may have
@@ -6058,7 +6141,7 @@
   ChildEntities get _childEntities => ChildEntities()
     ..addNodeList('metadata', metadata)
     ..addToken('typedefKeyword', typedefKeyword)
-    ..addNode('name', name)
+    ..addToken('name', name2)
     ..addNode('typeParameters', typeParameters)
     ..addToken('equals', equals)
     ..addNode('type', type);
@@ -6071,6 +6154,7 @@
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
+    // ignore: deprecated_member_use_from_same_package
     name.accept(visitor);
     _typeParameters?.accept(visitor);
     _type.accept(visitor);
@@ -6493,19 +6577,18 @@
   /// is not deferred. The [asKeyword] and [prefix] can be `null` if the import
   /// does not specify a prefix. The list of [combinators] can be `null` if
   /// there are no combinators.
-  ImportDirectiveImpl(
-      CommentImpl? comment,
-      List<Annotation>? metadata,
-      this.importKeyword,
-      StringLiteralImpl libraryUri,
-      List<Configuration>? configurations,
-      this.deferredKeyword,
-      this.asKeyword,
-      this._prefix,
-      List<Combinator>? combinators,
-      Token semicolon)
-      : super(comment, metadata, libraryUri, configurations, combinators,
-            semicolon) {
+  ImportDirectiveImpl({
+    required super.comment,
+    required super.metadata,
+    required this.importKeyword,
+    required super.uri,
+    required super.configurations,
+    required this.deferredKeyword,
+    required this.asKeyword,
+    required SimpleIdentifierImpl? prefix,
+    required super.combinators,
+    required super.semicolon,
+  }) : _prefix = prefix {
     _becomeParentOf(_prefix);
   }
 
@@ -7374,13 +7457,13 @@
   Token semicolon;
 
   LibraryAugmentationDirectiveImpl({
-    required CommentImpl? comment,
-    required List<Annotation>? metadata,
+    required super.comment,
+    required super.metadata,
     required this.libraryKeyword,
     required this.augmentKeyword,
-    required StringLiteralImpl uri,
+    required super.uri,
     required this.semicolon,
-  }) : super(comment, metadata, uri);
+  });
 
   @override
   Token get endToken => semicolon;
@@ -7432,8 +7515,13 @@
   /// Initialize a newly created library directive. Either or both of the
   /// [comment] and [metadata] can be `null` if the directive does not have the
   /// corresponding attribute.
-  LibraryDirectiveImpl(super.comment, super.metadata, this.libraryKeyword,
-      this._name, this.semicolon) {
+  LibraryDirectiveImpl({
+    required super.comment,
+    required super.metadata,
+    required this.libraryKeyword,
+    required LibraryIdentifierImpl name,
+    required this.semicolon,
+  }) : _name = name {
     _becomeParentOf(_name);
   }
 
@@ -7749,6 +7837,14 @@
   /// The body of the method.
   FunctionBodyImpl _body;
 
+  /// Return the element associated with this method, or `null` if the AST
+  /// structure has not been resolved. The element can either be a
+  /// [MethodElement], if this represents the declaration of a normal method, or
+  /// a [PropertyAccessorElement] if this represents the declaration of either a
+  /// getter or a setter.
+  @override
+  ExecutableElement? declaredElement;
+
   /// Initialize a newly created method declaration. Either or both of the
   /// [comment] and [metadata] can be `null` if the declaration does not have
   /// the corresponding attribute. The [externalKeyword] can be `null` if the
@@ -7758,18 +7854,23 @@
   /// method is neither a getter or a setter. The [operatorKeyword] can be
   /// `null` if the method does not implement an operator. The [parameters] must
   /// be `null` if this method declares a getter.
-  MethodDeclarationImpl(
-      super.comment,
-      super.metadata,
-      this.externalKeyword,
-      this.modifierKeyword,
-      this._returnType,
-      this.propertyKeyword,
-      this.operatorKeyword,
-      this._name,
-      this._typeParameters,
-      this._parameters,
-      this._body) {
+  MethodDeclarationImpl({
+    required super.comment,
+    required super.metadata,
+    required this.externalKeyword,
+    required this.modifierKeyword,
+    required TypeAnnotationImpl? returnType,
+    required this.propertyKeyword,
+    required this.operatorKeyword,
+    required SimpleIdentifierImpl name,
+    required TypeParameterListImpl? typeParameters,
+    required FormalParameterListImpl? parameters,
+    required FunctionBodyImpl body,
+  })  : _returnType = returnType,
+        _name = name,
+        _typeParameters = typeParameters,
+        _parameters = parameters,
+        _body = body {
     _becomeParentOf(_returnType);
     _becomeParentOf(_name);
     _becomeParentOf(_typeParameters);
@@ -7784,15 +7885,6 @@
     _body = _becomeParentOf(functionBody as FunctionBodyImpl);
   }
 
-  /// Return the element associated with this method, or `null` if the AST
-  /// structure has not been resolved. The element can either be a
-  /// [MethodElement], if this represents the declaration of a normal method, or
-  /// a [PropertyAccessorElement] if this represents the declaration of either a
-  /// getter or a setter.
-  @override
-  ExecutableElement? get declaredElement =>
-      _name.staticElement as ExecutableElement?;
-
   @override
   Token get endToken => _body.endToken;
 
@@ -7823,14 +7915,21 @@
   @override
   bool get isStatic => modifierKeyword?.keyword == Keyword.STATIC;
 
+  @Deprecated('Use name2 instead')
   @override
-  SimpleIdentifierImpl get name => _name;
+  SimpleIdentifierImpl get name {
+    _name.staticElement = declaredElement;
+    return _name;
+  }
 
   set name(SimpleIdentifier identifier) {
     _name = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 
   @override
+  Token get name2 => _name.token;
+
+  @override
   FormalParameterListImpl? get parameters => _parameters;
 
   set parameters(FormalParameterList? parameters) {
@@ -7858,7 +7957,7 @@
     ..addNode('returnType', returnType)
     ..addToken('propertyKeyword', propertyKeyword)
     ..addToken('operatorKeyword', operatorKeyword)
-    ..addNode('name', name)
+    ..addToken('name', name2)
     ..addNode('parameters', parameters)
     ..addNode('body', body);
 
@@ -7869,7 +7968,8 @@
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     _returnType?.accept(visitor);
-    _name.accept(visitor);
+    // ignore: deprecated_member_use_from_same_package
+    name.accept(visitor);
     _typeParameters?.accept(visitor);
     _parameters?.accept(visitor);
     _body.accept(visitor);
@@ -8048,6 +8148,9 @@
   /// super-class constraints.
   OnClauseImpl? _onClause;
 
+  @override
+  ClassElement? declaredElement;
+
   /// Initialize a newly created mixin declaration. Either or both of the
   /// [comment] and [metadata] can be `null` if the mixin does not have the
   /// corresponding attribute. The [typeParameters] can be `null` if the mixin
@@ -8055,27 +8158,23 @@
   /// and [implementsClause] can be `null` if the mixin does not have the
   /// corresponding clause. The list of [members] can be `null` if the mixin
   /// does not have any members.
-  MixinDeclarationImpl(
-      CommentImpl? comment,
-      List<Annotation>? metadata,
-      this.augmentKeyword,
-      this.mixinKeyword,
-      SimpleIdentifierImpl name,
-      TypeParameterListImpl? typeParameters,
-      this._onClause,
-      ImplementsClauseImpl? implementsClause,
-      Token leftBracket,
-      List<ClassMember> members,
-      Token rightBracket)
-      : super(comment, metadata, name, typeParameters, implementsClause,
-            leftBracket, members, rightBracket) {
+  MixinDeclarationImpl({
+    required super.comment,
+    required super.metadata,
+    required this.augmentKeyword,
+    required this.mixinKeyword,
+    required super.name,
+    required super.typeParameters,
+    required OnClauseImpl? onClause,
+    required super.implementsClause,
+    required super.leftBracket,
+    required super.members,
+    required super.rightBracket,
+  }) : _onClause = onClause {
     _becomeParentOf(_onClause);
   }
 
   @override
-  ClassElement? get declaredElement => _name.staticElement as ClassElement?;
-
-  @override
   Token get firstTokenAfterCommentAndMetadata {
     return mixinKeyword;
   }
@@ -8099,7 +8198,7 @@
   @override
   ChildEntities get _childEntities => super._childEntities
     ..addToken('mixinKeyword', mixinKeyword)
-    ..addNode('name', name)
+    ..addToken('name', name2)
     ..addNode('typeParameters', typeParameters)
     ..addNode('onClause', onClause)
     ..addNode('implementsClause', implementsClause)
@@ -8113,7 +8212,8 @@
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
-    _name.accept(visitor);
+    // ignore: deprecated_member_use_from_same_package
+    name.accept(visitor);
     _typeParameters?.accept(visitor);
     _onClause?.accept(visitor);
     _implementsClause?.accept(visitor);
@@ -8127,19 +8227,30 @@
   /// The name of the member being declared.
   SimpleIdentifierImpl _name;
 
-  /// Initialize a newly created compilation unit member with the given [name].
+  /// Initialize a newly created compilation unit member with the given [name2].
   /// Either or both of the [comment] and [metadata] can be `null` if the member
   /// does not have the corresponding attribute.
-  NamedCompilationUnitMemberImpl(super.comment, super.metadata, this._name) {
+  NamedCompilationUnitMemberImpl({
+    required super.comment,
+    required super.metadata,
+    required SimpleIdentifierImpl name,
+  }) : _name = name {
     _becomeParentOf(_name);
   }
 
+  @Deprecated('Use name2 instead')
   @override
-  SimpleIdentifierImpl get name => _name;
+  SimpleIdentifierImpl get name {
+    _name.staticElement = declaredElement;
+    return _name;
+  }
 
   set name(SimpleIdentifier identifier) {
     _name = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
+
+  @override
+  Token get name2 => _name.token;
 }
 
 /// An expression that has a name associated with it. They are used in method
@@ -8317,13 +8428,14 @@
   /// [comment] and [metadata] can be `null` if the directive does not have the
   /// corresponding attribute. The list of [combinators] can be `null` if there
   /// are no combinators.
-  NamespaceDirectiveImpl(
-      super.comment,
-      super.metadata,
-      super.libraryUri,
-      List<Configuration>? configurations,
-      List<Combinator>? combinators,
-      this.semicolon) {
+  NamespaceDirectiveImpl({
+    required super.comment,
+    required super.metadata,
+    required super.uri,
+    required List<Configuration>? configurations,
+    required List<Combinator>? combinators,
+    required this.semicolon,
+  }) {
     _configurations._initialize(this, configurations);
     _combinators._initialize(this, combinators);
   }
@@ -8603,8 +8715,12 @@
     _comment = _becomeParentOf(comment as CommentImpl?);
   }
 
+  @Deprecated('Use name2 instead')
   @override
-  SimpleIdentifierImpl? get identifier => _identifier;
+  SimpleIdentifierImpl? get identifier {
+    _identifier?.staticElement = declaredElement;
+    return _identifier;
+  }
 
   set identifier(SimpleIdentifier? identifier) {
     _identifier = _becomeParentOf(identifier as SimpleIdentifierImpl?);
@@ -8628,6 +8744,9 @@
   }
 
   @override
+  Token? get name => _identifier?.token;
+
+  @override
   List<AstNode> get sortedCommentAndAnnotations {
     var comment = _comment;
     return <AstNode>[
@@ -8867,9 +8986,13 @@
   /// Initialize a newly created part directive. Either or both of the [comment]
   /// and [metadata] can be `null` if the directive does not have the
   /// corresponding attribute.
-  PartDirectiveImpl(CommentImpl? comment, List<Annotation>? metadata,
-      this.partKeyword, StringLiteralImpl partUri, this.semicolon)
-      : super(comment, metadata, partUri);
+  PartDirectiveImpl({
+    required super.comment,
+    required super.metadata,
+    required this.partKeyword,
+    required super.uri,
+    required this.semicolon,
+  });
 
   @override
   PartElement? get element2 {
@@ -8934,8 +9057,16 @@
   /// Initialize a newly created part-of directive. Either or both of the
   /// [comment] and [metadata] can be `null` if the directive does not have the
   /// corresponding attribute.
-  PartOfDirectiveImpl(super.comment, super.metadata, this.partKeyword,
-      this.ofKeyword, this._uri, this._libraryName, this.semicolon) {
+  PartOfDirectiveImpl({
+    required super.comment,
+    required super.metadata,
+    required this.partKeyword,
+    required this.ofKeyword,
+    required StringLiteralImpl? uri,
+    required LibraryIdentifierImpl? libraryName,
+    required this.semicolon,
+  })  : _uri = uri,
+        _libraryName = libraryName {
     _becomeParentOf(_uri);
     _becomeParentOf(_libraryName);
   }
@@ -9821,11 +9952,11 @@
     } else if (_type != null) {
       return _type!.beginToken;
     }
-    return identifier!.beginToken;
+    return name!;
   }
 
   @override
-  Token get endToken => identifier?.endToken ?? type!.endToken;
+  Token get endToken => name ?? type!.endToken;
 
   @override
   bool get isConst => keyword?.keyword == Keyword.CONST;
@@ -9847,7 +9978,7 @@
   ChildEntities get _childEntities => super._childEntities
     ..addToken('keyword', keyword)
     ..addNode('type', type)
-    ..addNode('identifier', identifier);
+    ..addToken('name', name);
 
   @override
   E? accept<E>(AstVisitor<E> visitor) =>
@@ -9857,6 +9988,7 @@
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     _type?.accept(visitor);
+    // ignore: deprecated_member_use_from_same_package
     identifier?.accept(visitor);
   }
 }
@@ -10023,11 +10155,13 @@
       }
     }
     if (parent is FieldFormalParameter) {
+      // ignore: deprecated_member_use_from_same_package
       if (identical(parent.identifier, target)) {
         return false;
       }
     }
     if (parent is VariableDeclaration) {
+      // ignore: deprecated_member_use_from_same_package
       if (identical(parent.name, target)) {
         return false;
       }
@@ -10652,9 +10786,10 @@
 
   @override
   Token get endToken {
-    return question ?? _parameters?.endToken ?? identifier.endToken;
+    return question ?? _parameters?.endToken ?? name;
   }
 
+  @Deprecated('Use identifier2 instead')
   @override
   SimpleIdentifierImpl get identifier => super.identifier!;
 
@@ -10668,6 +10803,9 @@
   bool get isFinal => keyword?.keyword == Keyword.FINAL;
 
   @override
+  Token get name => super.name!;
+
+  @override
   FormalParameterListImpl? get parameters => _parameters;
 
   set parameters(FormalParameterList? parameters) {
@@ -10694,7 +10832,7 @@
     ..addNode('type', type)
     ..addToken('superKeyword', superKeyword)
     ..addToken('period', period)
-    ..addNode('identifier', identifier)
+    ..addToken('name', name)
     ..addNode('typeParameters', typeParameters)
     ..addNode('parameters', parameters);
 
@@ -10706,6 +10844,7 @@
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     _type?.accept(visitor);
+    // ignore: deprecated_member_use_from_same_package
     identifier.accept(visitor);
     _typeParameters?.accept(visitor);
     _parameters?.accept(visitor);
@@ -11068,8 +11207,13 @@
   /// Initialize a newly created top-level variable declaration. Either or both
   /// of the [comment] and [metadata] can be `null` if the variable does not
   /// have the corresponding attribute.
-  TopLevelVariableDeclarationImpl(super.comment, super.metadata,
-      this.externalKeyword, this._variableList, this.semicolon) {
+  TopLevelVariableDeclarationImpl({
+    required super.comment,
+    required super.metadata,
+    required this.externalKeyword,
+    required VariableDeclarationListImpl variableList,
+    required this.semicolon,
+  }) : _variableList = variableList {
     _becomeParentOf(_variableList);
   }
 
@@ -11215,9 +11359,13 @@
   /// Initialize a newly created type alias. Either or both of the [comment] and
   /// [metadata] can be `null` if the declaration does not have the
   /// corresponding attribute.
-  TypeAliasImpl(CommentImpl? comment, List<Annotation>? metadata,
-      this.typedefKeyword, SimpleIdentifierImpl name, this.semicolon)
-      : super(comment, metadata, name);
+  TypeAliasImpl({
+    required super.comment,
+    required super.metadata,
+    required this.typedefKeyword,
+    required super.name,
+    required this.semicolon,
+  });
 
   @override
   Token get endToken => semicolon;
@@ -11402,12 +11550,22 @@
   /// explicit upper bound.
   TypeAnnotationImpl? _bound;
 
+  @override
+  TypeParameterElement? declaredElement;
+
   /// Initialize a newly created type parameter. Either or both of the [comment]
   /// and [metadata] can be `null` if the parameter does not have the
   /// corresponding attribute. The [extendsKeyword] and [bound] can be `null` if
   /// the parameter does not have an upper bound.
-  TypeParameterImpl(super.comment, super.metadata, this._name,
-      this.extendsKeyword, this._bound) {
+  TypeParameterImpl({
+    required super.comment,
+    required super.metadata,
+    required SimpleIdentifierImpl name,
+    required this.extendsKeyword,
+    required TypeAnnotationImpl? bound,
+    this.varianceKeyword,
+  })  : _name = name,
+        _bound = bound {
     _becomeParentOf(_name);
     _becomeParentOf(_bound);
   }
@@ -11420,10 +11578,6 @@
   }
 
   @override
-  TypeParameterElement? get declaredElement =>
-      _name.staticElement as TypeParameterElement?;
-
-  @override
   Token get endToken {
     if (_bound == null) {
       return _name.endToken;
@@ -11434,6 +11588,7 @@
   @override
   Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
 
+  @Deprecated('Use name2 instead')
   @override
   SimpleIdentifierImpl get name => _name;
 
@@ -11442,8 +11597,11 @@
   }
 
   @override
+  Token get name2 => _name.token;
+
+  @override
   ChildEntities get _childEntities => super._childEntities
-    ..addNode('name', name)
+    ..addToken('name', name2)
     ..addToken('extendsKeyword', extendsKeyword)
     ..addNode('bound', bound);
 
@@ -11453,7 +11611,8 @@
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
-    _name.accept(visitor);
+    // ignore: deprecated_member_use_from_same_package
+    name.accept(visitor);
     _bound?.accept(visitor);
   }
 }
@@ -11526,7 +11685,11 @@
   /// Initialize a newly create URI-based directive. Either or both of the
   /// [comment] and [metadata] can be `null` if the directive does not have the
   /// corresponding attribute.
-  UriBasedDirectiveImpl(super.comment, super.metadata, this._uri) {
+  UriBasedDirectiveImpl({
+    required super.comment,
+    required super.metadata,
+    required StringLiteralImpl uri,
+  }) : _uri = uri {
     _becomeParentOf(_uri);
   }
 
@@ -11606,6 +11769,9 @@
   /// The name of the variable being declared.
   SimpleIdentifierImpl _name;
 
+  @override
+  VariableElement? declaredElement;
+
   /// The equal sign separating the variable name from the initial value, or
   /// `null` if the initial value was not specified.
   @override
@@ -11623,16 +11789,17 @@
 
   /// Initialize a newly created variable declaration. The [equals] and
   /// [initializer] can be `null` if there is no initializer.
-  VariableDeclarationImpl(this._name, this.equals, this._initializer)
-      : super(null, null) {
+  VariableDeclarationImpl({
+    required SimpleIdentifierImpl name,
+    required this.equals,
+    required ExpressionImpl? initializer,
+  })  : _name = name,
+        _initializer = initializer,
+        super(comment: null, metadata: null) {
     _becomeParentOf(_name);
     _becomeParentOf(_initializer);
   }
 
-  @override
-  VariableElement? get declaredElement =>
-      _name.staticElement as VariableElement?;
-
   /// This overridden implementation of [documentationComment] looks in the
   /// grandparent node for Dartdoc comments if no documentation is specifically
   /// available on the node.
@@ -11684,16 +11851,23 @@
     return parent is VariableDeclarationList && parent.isLate;
   }
 
+  @Deprecated('Use name2 instead')
   @override
-  SimpleIdentifierImpl get name => _name;
+  SimpleIdentifierImpl get name {
+    _name.staticElement = declaredElement;
+    return _name;
+  }
 
   set name(SimpleIdentifier identifier) {
     _name = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 
   @override
+  Token get name2 => _name.token;
+
+  @override
   ChildEntities get _childEntities => super._childEntities
-    ..addNode('name', name)
+    ..addToken('name', name2)
     ..addToken('equals', equals)
     ..addNode('initializer', initializer);
 
@@ -11703,7 +11877,8 @@
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
-    _name.accept(visitor);
+    // ignore: deprecated_member_use_from_same_package
+    name.accept(visitor);
     _initializer?.accept(visitor);
   }
 }
@@ -11742,8 +11917,14 @@
   /// the [comment] and [metadata] can be `null` if the variable list does not
   /// have the corresponding attribute. The [keyword] can be `null` if a type
   /// was specified. The [type] must be `null` if the keyword is 'var'.
-  VariableDeclarationListImpl(super.comment, super.metadata, this.lateKeyword,
-      this.keyword, this._type, List<VariableDeclaration> variables) {
+  VariableDeclarationListImpl({
+    required super.comment,
+    required super.metadata,
+    required this.lateKeyword,
+    required this.keyword,
+    required TypeAnnotationImpl? type,
+    required List<VariableDeclaration> variables,
+  }) : _type = type {
     _becomeParentOf(_type);
     _variables._initialize(this, variables);
   }
diff --git a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
index d0fffa1..78a09e7 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
@@ -53,66 +53,6 @@
           Expression target, List<Expression> cascadeSections) =>
       CascadeExpressionImpl(target as ExpressionImpl, cascadeSections);
 
-  ClassDeclarationImpl classDeclaration(
-          Comment? comment,
-          List<Annotation>? metadata,
-          Token? abstractKeyword,
-          Token? macroKeyword,
-          Token? augmentKeyword,
-          Token classKeyword,
-          SimpleIdentifier name,
-          TypeParameterList? typeParameters,
-          ExtendsClause? extendsClause,
-          WithClause? withClause,
-          ImplementsClause? implementsClause,
-          Token leftBracket,
-          List<ClassMember> members,
-          Token rightBracket) =>
-      ClassDeclarationImpl(
-          comment as CommentImpl?,
-          metadata,
-          abstractKeyword,
-          macroKeyword,
-          augmentKeyword,
-          classKeyword,
-          name as SimpleIdentifierImpl,
-          typeParameters as TypeParameterListImpl?,
-          extendsClause as ExtendsClauseImpl?,
-          withClause as WithClauseImpl?,
-          implementsClause as ImplementsClauseImpl?,
-          leftBracket,
-          members,
-          rightBracket);
-
-  ClassTypeAliasImpl classTypeAlias(
-          Comment? comment,
-          List<Annotation>? metadata,
-          Token keyword,
-          SimpleIdentifier name,
-          TypeParameterList? typeParameters,
-          Token equals,
-          Token? abstractKeyword,
-          Token? macroKeyword,
-          Token? augmentKeyword,
-          NamedType superclass,
-          WithClause withClause,
-          ImplementsClause? implementsClause,
-          Token semicolon) =>
-      ClassTypeAliasImpl(
-          comment as CommentImpl?,
-          metadata,
-          keyword,
-          name as SimpleIdentifierImpl,
-          typeParameters as TypeParameterListImpl?,
-          equals,
-          abstractKeyword,
-          macroKeyword,
-          augmentKeyword,
-          superclass as NamedTypeImpl,
-          withClause as WithClauseImpl,
-          implementsClause as ImplementsClauseImpl?,
-          semicolon);
-
   CommentReferenceImpl commentReference(
           Token? newKeyword, CommentReferableExpression expression) =>
       CommentReferenceImpl(
@@ -163,35 +103,6 @@
           rightParenthesis,
           libraryUri as StringLiteralImpl);
 
-  ConstructorDeclarationImpl constructorDeclaration(
-          Comment? comment,
-          List<Annotation>? metadata,
-          Token? externalKeyword,
-          Token? constKeyword,
-          Token? factoryKeyword,
-          Identifier returnType,
-          Token? period,
-          SimpleIdentifier? name,
-          FormalParameterList parameters,
-          Token? separator,
-          List<ConstructorInitializer>? initializers,
-          ConstructorName? redirectedConstructor,
-          FunctionBody? body) =>
-      ConstructorDeclarationImpl(
-          comment as CommentImpl?,
-          metadata,
-          externalKeyword,
-          constKeyword,
-          factoryKeyword,
-          returnType as IdentifierImpl,
-          period,
-          name as SimpleIdentifierImpl?,
-          parameters as FormalParameterListImpl,
-          separator,
-          initializers,
-          redirectedConstructor as ConstructorNameImpl?,
-          body as FunctionBodyImpl);
-
   ConstructorFieldInitializerImpl constructorFieldInitializer(
           Token? thisKeyword,
           Token? period,
@@ -219,15 +130,6 @@
       ContinueStatementImpl(
           continueKeyword, label as SimpleIdentifierImpl?, semicolon);
 
-  DeclaredIdentifierImpl declaredIdentifier(
-          Comment? comment,
-          List<Annotation>? metadata,
-          Token? keyword,
-          TypeAnnotation? type,
-          SimpleIdentifier identifier) =>
-      DeclaredIdentifierImpl(comment as CommentImpl?, metadata, keyword,
-          type as TypeAnnotationImpl?, identifier as SimpleIdentifierImpl);
-
   DefaultFormalParameterImpl defaultFormalParameter(
           NormalFormalParameter parameter,
           ParameterKind kind,
@@ -273,85 +175,6 @@
   CommentImpl endOfLineComment(List<Token> tokens) =>
       CommentImpl.createEndOfLineComment(tokens);
 
-  EnumConstantDeclarationImpl enumConstantDeclaration(Comment? comment,
-          List<Annotation>? metadata, SimpleIdentifier name) =>
-      EnumConstantDeclarationImpl(
-        documentationComment: comment as CommentImpl?,
-        metadata: metadata,
-        name: name as SimpleIdentifierImpl,
-        arguments: null,
-      );
-
-  @Deprecated('Use enumDeclaration2() instead')
-  EnumDeclarationImpl enumDeclaration(
-          Comment? comment,
-          List<Annotation>? metadata,
-          Token enumKeyword,
-          SimpleIdentifier name,
-          Token leftBracket,
-          List<EnumConstantDeclaration> constants,
-          Token rightBracket) =>
-      enumDeclaration2(
-          comment: comment,
-          metadata: metadata,
-          enumKeyword: enumKeyword,
-          name: name,
-          typeParameters: null,
-          withClause: null,
-          implementsClause: null,
-          leftBracket: leftBracket,
-          constants: constants,
-          semicolon: null,
-          members: [],
-          rightBracket: rightBracket);
-
-  EnumDeclarationImpl enumDeclaration2({
-    required Comment? comment,
-    required List<Annotation>? metadata,
-    required Token enumKeyword,
-    required SimpleIdentifier name,
-    required TypeParameterList? typeParameters,
-    required WithClause? withClause,
-    required ImplementsClause? implementsClause,
-    required Token leftBracket,
-    required List<EnumConstantDeclaration> constants,
-    required List<ClassMember> members,
-    required Token? semicolon,
-    required Token rightBracket,
-  }) {
-    return EnumDeclarationImpl(
-      comment as CommentImpl?,
-      metadata,
-      enumKeyword,
-      name as SimpleIdentifierImpl,
-      typeParameters as TypeParameterListImpl?,
-      withClause as WithClauseImpl?,
-      implementsClause as ImplementsClauseImpl?,
-      leftBracket,
-      constants,
-      semicolon,
-      members,
-      rightBracket,
-    );
-  }
-
-  ExportDirectiveImpl exportDirective(
-          Comment? comment,
-          List<Annotation>? metadata,
-          Token keyword,
-          StringLiteral libraryUri,
-          List<Configuration>? configurations,
-          List<Combinator>? combinators,
-          Token semicolon) =>
-      ExportDirectiveImpl(
-          comment as CommentImpl?,
-          metadata,
-          keyword,
-          libraryUri as StringLiteralImpl,
-          configurations,
-          combinators,
-          semicolon);
-
   ExpressionFunctionBodyImpl expressionFunctionBody(Token? keyword,
           Token functionDefinition, Expression expression, Token? semicolon) =>
       ExpressionFunctionBodyImpl(keyword, null, functionDefinition,
@@ -374,35 +197,6 @@
   ExtendsClauseImpl extendsClause(Token extendsKeyword, NamedType superclass) =>
       ExtendsClauseImpl(extendsKeyword, superclass as NamedTypeImpl);
 
-  ExtensionDeclarationImpl extensionDeclaration(
-          {Comment? comment,
-          List<Annotation>? metadata,
-          required Token extensionKeyword,
-          Token? typeKeyword,
-          SimpleIdentifier? name,
-          TypeParameterList? typeParameters,
-          required Token onKeyword,
-          required TypeAnnotation extendedType,
-          ShowClause? showClause,
-          HideClause? hideClause,
-          required Token leftBracket,
-          required List<ClassMember> members,
-          required Token rightBracket}) =>
-      ExtensionDeclarationImpl(
-          comment as CommentImpl?,
-          metadata,
-          extensionKeyword,
-          typeKeyword,
-          name as SimpleIdentifierImpl?,
-          typeParameters as TypeParameterListImpl?,
-          onKeyword,
-          extendedType as TypeAnnotationImpl,
-          showClause as ShowClauseImpl?,
-          hideClause as HideClauseImpl?,
-          leftBracket,
-          members,
-          rightBracket);
-
   ExtensionOverrideImpl extensionOverride(
           {required Identifier extensionName,
           TypeArgumentList? typeArguments,
@@ -412,27 +206,6 @@
           typeArguments as TypeArgumentListImpl?,
           argumentList as ArgumentListImpl);
 
-  FieldDeclarationImpl fieldDeclaration2(
-          {Comment? comment,
-          List<Annotation>? metadata,
-          Token? abstractKeyword,
-          Token? augmentKeyword,
-          Token? covariantKeyword,
-          Token? externalKeyword,
-          Token? staticKeyword,
-          required VariableDeclarationList fieldList,
-          required Token semicolon}) =>
-      FieldDeclarationImpl(
-          comment as CommentImpl?,
-          metadata,
-          abstractKeyword,
-          augmentKeyword,
-          covariantKeyword,
-          externalKeyword,
-          staticKeyword,
-          fieldList as VariableDeclarationListImpl,
-          semicolon);
-
   FieldFormalParameterImpl fieldFormalParameter2(
           {Comment? comment,
           List<Annotation>? metadata,
@@ -540,25 +313,6 @@
         body as StatementImpl);
   }
 
-  FunctionDeclarationImpl functionDeclaration(
-          Comment? comment,
-          List<Annotation>? metadata,
-          Token? augmentKeyword,
-          Token? externalKeyword,
-          TypeAnnotation? returnType,
-          Token? propertyKeyword,
-          SimpleIdentifier name,
-          FunctionExpression functionExpression) =>
-      FunctionDeclarationImpl(
-          comment as CommentImpl?,
-          metadata,
-          augmentKeyword,
-          externalKeyword,
-          returnType as TypeAnnotationImpl?,
-          propertyKeyword,
-          name as SimpleIdentifierImpl,
-          functionExpression as FunctionExpressionImpl);
-
   FunctionDeclarationStatementImpl functionDeclarationStatement(
           FunctionDeclaration functionDeclaration) =>
       FunctionDeclarationStatementImpl(
@@ -583,25 +337,6 @@
       FunctionReferenceImpl(function as ExpressionImpl,
           typeArguments: typeArguments as TypeArgumentListImpl?);
 
-  FunctionTypeAliasImpl functionTypeAlias(
-          Comment? comment,
-          List<Annotation>? metadata,
-          Token keyword,
-          TypeAnnotation? returnType,
-          SimpleIdentifier name,
-          TypeParameterList? typeParameters,
-          FormalParameterList parameters,
-          Token semicolon) =>
-      FunctionTypeAliasImpl(
-          comment as CommentImpl?,
-          metadata,
-          keyword,
-          returnType as TypeAnnotationImpl?,
-          name as SimpleIdentifierImpl,
-          typeParameters as TypeParameterListImpl?,
-          parameters as FormalParameterListImpl,
-          semicolon);
-
   FunctionTypedFormalParameterImpl functionTypedFormalParameter2(
           {Comment? comment,
           List<Annotation>? metadata,
@@ -636,25 +371,6 @@
           parameters as FormalParameterListImpl,
           question: question);
 
-  GenericTypeAliasImpl genericTypeAlias(
-          Comment? comment,
-          List<Annotation>? metadata,
-          Token typedefKeyword,
-          SimpleIdentifier name,
-          TypeParameterList? typeParameters,
-          Token equals,
-          TypeAnnotation type,
-          Token semicolon) =>
-      GenericTypeAliasImpl(
-          comment as CommentImpl?,
-          metadata,
-          typedefKeyword,
-          name as SimpleIdentifierImpl,
-          typeParameters as TypeParameterListImpl?,
-          equals,
-          type as TypeAnnotationImpl,
-          semicolon);
-
   HideClauseImpl hideClause(
           {required Token hideKeyword,
           required List<ShowHideClauseElement> elements}) =>
@@ -713,30 +429,6 @@
           typeArguments: typeArguments as TypeArgumentListImpl?,
           typeArgumentTypes: typeArgumentTypes);
 
-  ImportDirectiveImpl importDirective(
-    Comment? comment,
-    List<Annotation>? metadata,
-    Token keyword,
-    StringLiteral libraryUri,
-    List<Configuration>? configurations,
-    Token? deferredKeyword,
-    Token? asKeyword,
-    SimpleIdentifier? prefix,
-    List<Combinator>? combinators,
-    Token semicolon,
-  ) =>
-      ImportDirectiveImpl(
-          comment as CommentImpl?,
-          metadata,
-          keyword,
-          libraryUri as StringLiteralImpl,
-          configurations,
-          deferredKeyword,
-          asKeyword,
-          prefix as SimpleIdentifierImpl?,
-          combinators,
-          semicolon);
-
   IndexExpressionImpl indexExpressionForCascade2(
           {required Token period,
           Token? question,
@@ -787,15 +479,6 @@
           List<Label> labels, Statement statement) =>
       LabeledStatementImpl(labels, statement as StatementImpl);
 
-  LibraryDirectiveImpl libraryDirective(
-          Comment? comment,
-          List<Annotation>? metadata,
-          Token libraryKeyword,
-          LibraryIdentifier name,
-          Token semicolon) =>
-      LibraryDirectiveImpl(comment as CommentImpl?, metadata, libraryKeyword,
-          name as LibraryIdentifierImpl, semicolon);
-
   LibraryIdentifierImpl libraryIdentifier(List<SimpleIdentifier> components) =>
       LibraryIdentifierImpl(components);
 
@@ -826,31 +509,6 @@
       MapLiteralEntryImpl(
           key as ExpressionImpl, separator, value as ExpressionImpl);
 
-  MethodDeclarationImpl methodDeclaration(
-          Comment? comment,
-          List<Annotation>? metadata,
-          Token? externalKeyword,
-          Token? modifierKeyword,
-          TypeAnnotation? returnType,
-          Token? propertyKeyword,
-          Token? operatorKeyword,
-          SimpleIdentifier name,
-          TypeParameterList? typeParameters,
-          FormalParameterList? parameters,
-          FunctionBody body) =>
-      MethodDeclarationImpl(
-          comment as CommentImpl?,
-          metadata,
-          externalKeyword,
-          modifierKeyword,
-          returnType as TypeAnnotationImpl?,
-          propertyKeyword,
-          operatorKeyword,
-          name as SimpleIdentifierImpl,
-          typeParameters as TypeParameterListImpl?,
-          parameters as FormalParameterListImpl?,
-          body as FunctionBodyImpl);
-
   MethodInvocationImpl methodInvocation(
           Expression? target,
           Token? operator,
@@ -864,31 +522,6 @@
           typeArguments as TypeArgumentListImpl?,
           argumentList as ArgumentListImpl);
 
-  MixinDeclarationImpl mixinDeclaration(
-          Comment? comment,
-          List<Annotation>? metadata,
-          Token? augmentKeyword,
-          Token mixinKeyword,
-          SimpleIdentifier name,
-          TypeParameterList? typeParameters,
-          OnClause? onClause,
-          ImplementsClause? implementsClause,
-          Token leftBracket,
-          List<ClassMember> members,
-          Token rightBracket) =>
-      MixinDeclarationImpl(
-          comment as CommentImpl?,
-          metadata,
-          augmentKeyword,
-          mixinKeyword,
-          name as SimpleIdentifierImpl,
-          typeParameters as TypeParameterListImpl?,
-          onClause as OnClauseImpl?,
-          implementsClause as ImplementsClauseImpl?,
-          leftBracket,
-          members,
-          rightBracket);
-
   NamedExpressionImpl namedExpression(Label name, Expression expression) =>
       NamedExpressionImpl(name as LabelImpl, expression as ExpressionImpl);
 
@@ -923,28 +556,6 @@
       ParenthesizedExpressionImpl(
           leftParenthesis, expression as ExpressionImpl, rightParenthesis);
 
-  PartDirectiveImpl partDirective(Comment? comment, List<Annotation>? metadata,
-          Token partKeyword, StringLiteral partUri, Token semicolon) =>
-      PartDirectiveImpl(comment as CommentImpl?, metadata, partKeyword,
-          partUri as StringLiteralImpl, semicolon);
-
-  PartOfDirectiveImpl partOfDirective(
-          Comment? comment,
-          List<Annotation>? metadata,
-          Token partKeyword,
-          Token ofKeyword,
-          StringLiteral? uri,
-          LibraryIdentifier? libraryName,
-          Token semicolon) =>
-      PartOfDirectiveImpl(
-          comment as CommentImpl?,
-          metadata,
-          partKeyword,
-          ofKeyword,
-          uri as StringLiteralImpl?,
-          libraryName as LibraryIdentifierImpl?,
-          semicolon);
-
   PostfixExpressionImpl postfixExpression(Expression operand, Token operator) =>
       PostfixExpressionImpl(operand as ExpressionImpl, operator);
 
@@ -1117,19 +728,6 @@
           Token throwKeyword, Expression expression) =>
       ThrowExpressionImpl(throwKeyword, expression as ExpressionImpl);
 
-  TopLevelVariableDeclarationImpl topLevelVariableDeclaration(
-          Comment? comment,
-          List<Annotation>? metadata,
-          VariableDeclarationList variableList,
-          Token semicolon,
-          {Token? externalKeyword}) =>
-      TopLevelVariableDeclarationImpl(
-          comment as CommentImpl?,
-          metadata,
-          externalKeyword,
-          variableList as VariableDeclarationListImpl,
-          semicolon);
-
   TryStatementImpl tryStatement(
           Token tryKeyword,
           Block body,
@@ -1146,63 +744,10 @@
   TypeLiteralImpl typeLiteral({required NamedType typeName}) =>
       TypeLiteralImpl(typeName as NamedTypeImpl);
 
-  TypeParameterImpl typeParameter(
-          Comment? comment,
-          List<Annotation>? metadata,
-          SimpleIdentifier name,
-          Token? extendsKeyword,
-          TypeAnnotation? bound) =>
-      TypeParameterImpl(
-          comment as CommentImpl?,
-          metadata,
-          name as SimpleIdentifierImpl,
-          extendsKeyword,
-          bound as TypeAnnotationImpl?);
-
-  TypeParameterImpl typeParameter2(
-          {Comment? comment,
-          List<Annotation>? metadata,
-          required SimpleIdentifier name,
-          Token? extendsKeyword,
-          TypeAnnotation? bound,
-          Token? varianceKeyword}) =>
-      TypeParameterImpl(
-          comment as CommentImpl?,
-          metadata,
-          name as SimpleIdentifierImpl,
-          extendsKeyword,
-          bound as TypeAnnotationImpl?)
-        ..varianceKeyword = varianceKeyword;
-
   TypeParameterListImpl typeParameterList(Token leftBracket,
           List<TypeParameter> typeParameters, Token rightBracket) =>
       TypeParameterListImpl(leftBracket, typeParameters, rightBracket);
 
-  VariableDeclarationImpl variableDeclaration(
-          SimpleIdentifier name, Token? equals, Expression? initializer) =>
-      VariableDeclarationImpl(
-          name as SimpleIdentifierImpl, equals, initializer as ExpressionImpl?);
-
-  VariableDeclarationListImpl variableDeclarationList(
-          Comment? comment,
-          List<Annotation>? metadata,
-          Token? keyword,
-          TypeAnnotation? type,
-          List<VariableDeclaration> variables) =>
-      VariableDeclarationListImpl(comment as CommentImpl?, metadata, null,
-          keyword, type as TypeAnnotationImpl?, variables);
-
-  VariableDeclarationListImpl variableDeclarationList2(
-      {Comment? comment,
-      List<Annotation>? metadata,
-      Token? lateKeyword,
-      Token? keyword,
-      TypeAnnotation? type,
-      required List<VariableDeclaration> variables}) {
-    return VariableDeclarationListImpl(comment as CommentImpl?, metadata,
-        lateKeyword, keyword, type as TypeAnnotationImpl?, variables);
-  }
-
   VariableDeclarationStatementImpl variableDeclarationStatement(
           VariableDeclarationList variableList, Token semicolon) =>
       VariableDeclarationStatementImpl(
diff --git a/pkg/analyzer/lib/src/dart/ast/element_locator.dart b/pkg/analyzer/lib/src/dart/ast/element_locator.dart
index 4612dc3..6e910aa 100644
--- a/pkg/analyzer/lib/src/dart/ast/element_locator.dart
+++ b/pkg/analyzer/lib/src/dart/ast/element_locator.dart
@@ -69,11 +69,26 @@
   }
 
   @override
+  Element? visitFormalParameter(FormalParameter node) {
+    return node.declaredElement;
+  }
+
+  @override
   Element? visitFunctionDeclaration(FunctionDeclaration node) {
     return node.declaredElement;
   }
 
   @override
+  Element? visitFunctionTypeAlias(FunctionTypeAlias node) {
+    return node.declaredElement;
+  }
+
+  @override
+  Element? visitGenericTypeAlias(GenericTypeAlias node) {
+    return node.declaredElement;
+  }
+
+  @override
   Element? visitIdentifier(Identifier node) {
     var parent = node.parent;
     if (parent is Annotation) {
@@ -86,14 +101,16 @@
       // Constructor Elements
       var returnType = parent.returnType;
       if (identical(returnType, node)) {
-        var name = parent.name;
+        var name = parent.name2;
         if (name != null) {
-          return name.staticElement;
+          return parent.declaredElement;
         }
         var element = node.staticElement;
         if (element is ClassElement) {
           return element.unnamedConstructor;
         }
+      } else if (parent.name2 == node.endToken) {
+        return parent.declaredElement;
       }
     } else if (parent is LibraryIdentifier) {
       var grandParent = parent.parent;
@@ -176,6 +193,11 @@
   }
 
   @override
+  Element? visitTypeParameter(TypeParameter node) {
+    return node.declaredElement;
+  }
+
+  @override
   Element? visitVariableDeclaration(VariableDeclaration node) {
     return node.declaredElement;
   }
diff --git a/pkg/analyzer/lib/src/dart/ast/invokes_super_self.dart b/pkg/analyzer/lib/src/dart/ast/invokes_super_self.dart
index d3633fb..c17d674 100644
--- a/pkg/analyzer/lib/src/dart/ast/invokes_super_self.dart
+++ b/pkg/analyzer/lib/src/dart/ast/invokes_super_self.dart
@@ -72,7 +72,7 @@
 extension MethodDeclarationExtension on MethodDeclaration {
   bool get invokesSuperSelf {
     var visitor = _SuperVisitor(
-      name.name,
+      name2.lexeme,
       isSetter ? _Usage.writing : _Usage.reading,
     );
     body.accept(visitor);
diff --git a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
index f344609..963f028 100644
--- a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
@@ -167,7 +167,7 @@
     _visitToken(node.macroKeyword, suffix: ' ');
     _visitToken(node.augmentKeyword, suffix: ' ');
     sink.write('class ');
-    _visitNode(node.name);
+    _visitToken(node.name2);
     _visitNode(node.typeParameters);
     _visitNode(node.extendsClause, prefix: ' ');
     _visitNode(node.withClause, prefix: ' ');
@@ -186,7 +186,7 @@
     _visitToken(node.macroKeyword, suffix: ' ');
     _visitToken(node.augmentKeyword, suffix: ' ');
     sink.write('class ');
-    _visitNode(node.name);
+    _visitToken(node.name2);
     _visitNode(node.typeParameters);
     sink.write(' = ');
     _visitNode(node.superclass);
@@ -237,7 +237,7 @@
     _visitToken(node.constKeyword, suffix: ' ');
     _visitToken(node.factoryKeyword, suffix: ' ');
     _visitNode(node.returnType);
-    _visitNode(node.name, prefix: '.');
+    _visitToken(node.name2, prefix: '.');
     _visitNode(node.parameters);
     _visitNodeList(node.initializers, prefix: ' : ', separator: ', ');
     _visitNode(node.redirectedConstructor, prefix: ' = ');
@@ -281,7 +281,7 @@
     _visitNodeList(node.metadata, separator: ' ', suffix: ' ');
     _visitToken(node.keyword, suffix: ' ');
     _visitNode(node.type, suffix: ' ');
-    _visitNode(node.identifier);
+    _visitToken(node.name);
   }
 
   @override
@@ -336,7 +336,7 @@
   @override
   void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
     _visitNodeList(node.metadata, separator: ' ', suffix: ' ');
-    _visitNode(node.name);
+    _visitToken(node.name2);
     _visitNode(node.arguments);
   }
 
@@ -344,7 +344,7 @@
   void visitEnumDeclaration(EnumDeclaration node) {
     _visitNodeList(node.metadata, separator: ' ', suffix: ' ');
     sink.write('enum ');
-    _visitNode(node.name);
+    _visitToken(node.name2);
     _visitNode(node.typeParameters);
     _visitNode(node.withClause, prefix: ' ');
     _visitNode(node.implementsClause, prefix: ' ');
@@ -399,7 +399,7 @@
     _visitNodeList(node.metadata, separator: ' ', suffix: ' ');
     _visitToken(node.extensionKeyword, suffix: ' ');
     _visitToken(node.typeKeyword, suffix: ' ');
-    _visitNode(node.name);
+    _visitToken(node.name2);
     _visitNode(node.typeParameters);
     sink.write(' ');
     _visitToken(node.onKeyword);
@@ -437,7 +437,7 @@
     _visitToken(node.keyword, suffix: ' ');
     _visitNode(node.type, suffix: ' ');
     sink.write('this.');
-    _visitNode(node.identifier);
+    _visitToken(node.name);
     _visitNode(node.typeParameters);
     _visitNode(node.parameters);
   }
@@ -528,7 +528,7 @@
     _visitToken(node.externalKeyword, suffix: ' ');
     _visitNode(node.returnType, suffix: ' ');
     _visitToken(node.propertyKeyword, suffix: ' ');
-    _visitNode(node.name);
+    _visitToken(node.name2);
     _visitNode(node.functionExpression);
   }
 
@@ -562,7 +562,7 @@
     _visitNodeList(node.metadata, separator: ' ', suffix: ' ');
     sink.write('typedef ');
     _visitNode(node.returnType, suffix: ' ');
-    _visitNode(node.name);
+    _visitToken(node.name2);
     _visitNode(node.typeParameters);
     _visitNode(node.parameters);
     sink.write(';');
@@ -574,7 +574,7 @@
     _visitToken(node.requiredKeyword, suffix: ' ');
     _visitToken(node.covariantKeyword, suffix: ' ');
     _visitNode(node.returnType, suffix: ' ');
-    _visitNode(node.identifier);
+    _visitToken(node.name);
     _visitNode(node.typeParameters);
     _visitNode(node.parameters);
     if (node.question != null) {
@@ -597,7 +597,7 @@
   void visitGenericTypeAlias(GenericTypeAlias node) {
     _visitNodeList(node.metadata, separator: ' ', suffix: ' ');
     sink.write('typedef ');
-    _visitNode(node.name);
+    _visitToken(node.name2);
     _visitNode(node.typeParameters);
     sink.write(' = ');
     _visitNode(node.type);
@@ -771,7 +771,7 @@
     _visitNode(node.returnType, suffix: ' ');
     _visitToken(node.propertyKeyword, suffix: ' ');
     _visitToken(node.operatorKeyword, suffix: ' ');
-    _visitNode(node.name);
+    _visitToken(node.name2);
     if (!node.isGetter) {
       _visitNode(node.typeParameters);
       _visitNode(node.parameters);
@@ -792,7 +792,7 @@
   void visitMixinDeclaration(MixinDeclaration node) {
     _visitNodeList(node.metadata, separator: ' ', suffix: ' ');
     sink.write('mixin ');
-    _visitNode(node.name);
+    _visitToken(node.name2);
     _visitNode(node.typeParameters);
     _visitNode(node.onClause, prefix: ' ');
     _visitNode(node.implementsClause, prefix: ' ');
@@ -958,10 +958,10 @@
     _visitToken(node.covariantKeyword, suffix: ' ');
     _visitToken(node.keyword, suffix: ' ');
     _visitNode(node.type);
-    if (node.type != null && node.identifier != null) {
+    if (node.type != null && node.name != null) {
       sink.write(' ');
     }
-    _visitNode(node.identifier);
+    _visitToken(node.name);
   }
 
   @override
@@ -1005,7 +1005,7 @@
     _visitToken(node.keyword, suffix: ' ');
     _visitNode(node.type, suffix: ' ');
     sink.write('super.');
-    _visitNode(node.identifier);
+    _visitToken(node.name);
     _visitNode(node.typeParameters);
     _visitNode(node.parameters);
   }
@@ -1093,7 +1093,7 @@
     if (varianceKeyword != null) {
       sink.write('${varianceKeyword.lexeme} ');
     }
-    _visitNode(node.name);
+    _visitToken(node.name2);
     _visitNode(node.bound, prefix: ' extends ');
   }
 
@@ -1107,7 +1107,7 @@
   @override
   void visitVariableDeclaration(VariableDeclaration node) {
     _visitNodeList(node.metadata, separator: ' ', suffix: ' ');
-    _visitNode(node.name);
+    _visitToken(node.name2);
     _visitNode(node.initializer, prefix: ' = ');
   }
 
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 251454c..fe970af 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -249,7 +249,7 @@
         _isEqualNodeLists(node.metadata, other.metadata) &&
         isEqualTokens(node.abstractKeyword, other.abstractKeyword) &&
         isEqualTokens(node.classKeyword, other.classKeyword) &&
-        isEqualNodes(node.name, other.name) &&
+        isEqualTokens(node.name2, other.name2) &&
         isEqualNodes(node.typeParameters, other.typeParameters) &&
         isEqualNodes(node.extendsClause, other.extendsClause) &&
         isEqualNodes(node.withClause, other.withClause) &&
@@ -266,7 +266,7 @@
             node.documentationComment, other.documentationComment) &&
         _isEqualNodeLists(node.metadata, other.metadata) &&
         isEqualTokens(node.typedefKeyword, other.typedefKeyword) &&
-        isEqualNodes(node.name, other.name) &&
+        isEqualTokens(node.name2, other.name2) &&
         isEqualNodes(node.typeParameters, other.typeParameters) &&
         isEqualTokens(node.equals, other.equals) &&
         isEqualTokens(node.abstractKeyword, other.abstractKeyword) &&
@@ -332,7 +332,7 @@
         isEqualTokens(node.factoryKeyword, other.factoryKeyword) &&
         isEqualNodes(node.returnType, other.returnType) &&
         isEqualTokens(node.period, other.period) &&
-        isEqualNodes(node.name, other.name) &&
+        isEqualTokens(node.name2, other.name2) &&
         isEqualNodes(node.parameters, other.parameters) &&
         isEqualTokens(node.separator, other.separator) &&
         _isEqualNodeLists(node.initializers, other.initializers) &&
@@ -387,7 +387,7 @@
         _isEqualNodeLists(node.metadata, other.metadata) &&
         isEqualTokens(node.keyword, other.keyword) &&
         isEqualNodes(node.type, other.type) &&
-        isEqualNodes(node.identifier, other.identifier);
+        isEqualTokens(node.name, other.name);
   }
 
   @override
@@ -450,7 +450,7 @@
     return isEqualNodes(
             node.documentationComment, other.documentationComment) &&
         _isEqualNodeLists(node.metadata, other.metadata) &&
-        isEqualNodes(node.name, other.name);
+        isEqualTokens(node.name2, other.name2);
   }
 
   @override
@@ -460,7 +460,7 @@
             node.documentationComment, other.documentationComment) &&
         _isEqualNodeLists(node.metadata, other.metadata) &&
         isEqualTokens(node.enumKeyword, other.enumKeyword) &&
-        isEqualNodes(node.name, other.name) &&
+        isEqualTokens(node.name2, other.name2) &&
         isEqualTokens(node.leftBracket, other.leftBracket) &&
         _isEqualNodeLists(node.constants, other.constants) &&
         isEqualTokens(node.rightBracket, other.rightBracket);
@@ -507,7 +507,7 @@
             node.documentationComment, other.documentationComment) &&
         _isEqualNodeLists(node.metadata, other.metadata) &&
         isEqualTokens(node.extensionKeyword, other.extensionKeyword) &&
-        isEqualNodes(node.name, other.name) &&
+        isEqualTokens(node.name2, other.name2) &&
         isEqualNodes(node.typeParameters, other.typeParameters) &&
         isEqualTokens(node.onKeyword, other.onKeyword) &&
         isEqualNodes(node.extendedType, other.extendedType) &&
@@ -547,7 +547,7 @@
         isEqualNodes(node.type, other.type) &&
         isEqualTokens(node.thisKeyword, other.thisKeyword) &&
         isEqualTokens(node.period, other.period) &&
-        isEqualNodes(node.identifier, other.identifier);
+        isEqualTokens(node.name, other.name);
   }
 
   @override
@@ -627,7 +627,7 @@
         isEqualTokens(node.externalKeyword, other.externalKeyword) &&
         isEqualNodes(node.returnType, other.returnType) &&
         isEqualTokens(node.propertyKeyword, other.propertyKeyword) &&
-        isEqualNodes(node.name, other.name) &&
+        isEqualTokens(node.name2, other.name2) &&
         isEqualNodes(node.functionExpression, other.functionExpression);
   }
 
@@ -666,7 +666,7 @@
         _isEqualNodeLists(node.metadata, other.metadata) &&
         isEqualTokens(node.typedefKeyword, other.typedefKeyword) &&
         isEqualNodes(node.returnType, other.returnType) &&
-        isEqualNodes(node.name, other.name) &&
+        isEqualTokens(node.name2, other.name2) &&
         isEqualNodes(node.typeParameters, other.typeParameters) &&
         isEqualNodes(node.parameters, other.parameters) &&
         isEqualTokens(node.semicolon, other.semicolon);
@@ -679,7 +679,7 @@
             node.documentationComment, other.documentationComment) &&
         _isEqualNodeLists(node.metadata, other.metadata) &&
         isEqualNodes(node.returnType, other.returnType) &&
-        isEqualNodes(node.identifier, other.identifier) &&
+        isEqualTokens(node.name, other.name) &&
         isEqualNodes(node.parameters, other.parameters);
   }
 
@@ -700,7 +700,7 @@
             node.documentationComment, other.documentationComment) &&
         _isEqualNodeLists(node.metadata, other.metadata) &&
         isEqualTokens(node.typedefKeyword, other.typedefKeyword) &&
-        isEqualNodes(node.name, other.name) &&
+        isEqualTokens(node.name2, other.name2) &&
         isEqualNodes(node.typeParameters, other.typeParameters) &&
         isEqualTokens(node.equals, other.equals) &&
         isEqualNodes(node.type, other.type);
@@ -894,7 +894,7 @@
         isEqualNodes(node.returnType, other.returnType) &&
         isEqualTokens(node.propertyKeyword, other.propertyKeyword) &&
         isEqualTokens(node.operatorKeyword, other.operatorKeyword) &&
-        isEqualNodes(node.name, other.name) &&
+        isEqualTokens(node.name2, other.name2) &&
         isEqualNodes(node.parameters, other.parameters) &&
         isEqualNodes(node.body, other.body);
   }
@@ -915,7 +915,7 @@
             node.documentationComment, other.documentationComment) &&
         _isEqualNodeLists(node.metadata, other.metadata) &&
         isEqualTokens(node.mixinKeyword, other.mixinKeyword) &&
-        isEqualNodes(node.name, other.name) &&
+        isEqualTokens(node.name2, other.name2) &&
         isEqualNodes(node.typeParameters, other.typeParameters) &&
         isEqualNodes(node.onClause, other.onClause) &&
         isEqualNodes(node.implementsClause, other.implementsClause) &&
@@ -1099,7 +1099,7 @@
         _isEqualNodeLists(node.metadata, other.metadata) &&
         isEqualTokens(node.keyword, other.keyword) &&
         isEqualNodes(node.type, other.type) &&
-        isEqualNodes(node.identifier, other.identifier);
+        isEqualTokens(node.name, other.name);
   }
 
   @override
@@ -1153,7 +1153,7 @@
         isEqualNodes(node.type, other.type) &&
         isEqualTokens(node.superKeyword, other.superKeyword) &&
         isEqualTokens(node.period, other.period) &&
-        isEqualNodes(node.identifier, other.identifier);
+        isEqualTokens(node.name, other.name);
   }
 
   @override
@@ -1250,7 +1250,7 @@
     return isEqualNodes(
             node.documentationComment, other.documentationComment) &&
         _isEqualNodeLists(node.metadata, other.metadata) &&
-        isEqualNodes(node.name, other.name) &&
+        isEqualTokens(node.name2, other.name2) &&
         isEqualTokens((node as TypeParameterImpl).varianceKeyword,
             (other as TypeParameterImpl).varianceKeyword) &&
         isEqualTokens(node.extendsKeyword, other.extendsKeyword) &&
@@ -1271,7 +1271,7 @@
     return isEqualNodes(
             node.documentationComment, other.documentationComment) &&
         _isEqualNodeLists(node.metadata, other.metadata) &&
-        isEqualNodes(node.name, other.name) &&
+        isEqualTokens(node.name2, other.name2) &&
         isEqualTokens(node.equals, other.equals) &&
         isEqualNodes(node.initializer, other.initializer);
   }
@@ -1805,10 +1805,7 @@
 
   @override
   bool visitClassDeclaration(covariant ClassDeclarationImpl node) {
-    if (identical(node.name, _oldNode)) {
-      node.name = _newNode as SimpleIdentifier;
-      return true;
-    } else if (identical(node.typeParameters, _oldNode)) {
+    if (identical(node.typeParameters, _oldNode)) {
       node.typeParameters = _newNode as TypeParameterList;
       return true;
     } else if (identical(node.extendsClause, _oldNode)) {
@@ -1831,10 +1828,7 @@
 
   @override
   bool visitClassTypeAlias(covariant ClassTypeAliasImpl node) {
-    if (identical(node.name, _oldNode)) {
-      node.name = _newNode as SimpleIdentifier;
-      return true;
-    } else if (identical(node.typeParameters, _oldNode)) {
+    if (identical(node.typeParameters, _oldNode)) {
       node.typeParameters = _newNode as TypeParameterList;
       return true;
     } else if (identical(node.superclass, _oldNode)) {
@@ -1915,9 +1909,6 @@
     if (identical(node.returnType, _oldNode)) {
       node.returnType = _newNode as Identifier;
       return true;
-    } else if (identical(node.name, _oldNode)) {
-      node.name = _newNode as SimpleIdentifier;
-      return true;
     } else if (identical(node.parameters, _oldNode)) {
       node.parameters = _newNode as FormalParameterList;
       return true;
@@ -1986,9 +1977,6 @@
     if (identical(node.type, _oldNode)) {
       node.type = _newNode as TypeAnnotation;
       return true;
-    } else if (identical(node.identifier, _oldNode)) {
-      node.identifier = _newNode as SimpleIdentifier;
-      return true;
     }
     return visitAnnotatedNode(node);
   }
@@ -2048,19 +2036,12 @@
   @override
   bool visitEnumConstantDeclaration(
       covariant EnumConstantDeclarationImpl node) {
-    if (identical(node.name, _oldNode)) {
-      node.name = _newNode as SimpleIdentifier;
-      return true;
-    }
     return visitAnnotatedNode(node);
   }
 
   @override
   bool visitEnumDeclaration(covariant EnumDeclarationImpl node) {
-    if (identical(node.name, _oldNode)) {
-      node.name = _newNode as SimpleIdentifier;
-      return true;
-    } else if (identical(node.typeParameters, _oldNode)) {
+    if (identical(node.typeParameters, _oldNode)) {
       node.typeParameters = _newNode as TypeParameterList;
       return true;
     } else if (identical(node.withClause, _oldNode)) {
@@ -2115,9 +2096,6 @@
       return true;
     } else if (_replaceInList(node.metadata)) {
       return true;
-    } else if (identical(node.name, _oldNode)) {
-      node.name = _newNode as SimpleIdentifier;
-      return true;
     } else if (identical(node.typeParameters, _oldNode)) {
       node.typeParameters = _newNode as TypeParameterList;
       return true;
@@ -2264,9 +2242,6 @@
     if (identical(node.returnType, _oldNode)) {
       node.returnType = _newNode as TypeAnnotation;
       return true;
-    } else if (identical(node.name, _oldNode)) {
-      node.name = _newNode as SimpleIdentifier;
-      return true;
     } else if (identical(node.functionExpression, _oldNode)) {
       node.functionExpression = _newNode as FunctionExpression;
       return true;
@@ -2332,9 +2307,6 @@
     if (identical(node.returnType, _oldNode)) {
       node.returnType = _newNode as TypeAnnotation;
       return true;
-    } else if (identical(node.name, _oldNode)) {
-      node.name = _newNode as SimpleIdentifier;
-      return true;
     } else if (identical(node.typeParameters, _oldNode)) {
       node.typeParameters = _newNode as TypeParameterList;
       return true;
@@ -2379,10 +2351,7 @@
   @override
   bool visitGenericTypeAlias(GenericTypeAlias node) {
     var nodeImpl = node as GenericTypeAliasImpl;
-    if (identical(node.name, _oldNode)) {
-      node.name = _newNode as SimpleIdentifier;
-      return true;
-    } else if (identical(node.typeParameters, _oldNode)) {
+    if (identical(node.typeParameters, _oldNode)) {
       nodeImpl.typeParameters = _newNode as TypeParameterList;
       return true;
     } else if (identical(node.type, _oldNode)) {
@@ -2591,9 +2560,6 @@
     if (identical(node.returnType, _oldNode)) {
       node.returnType = _newNode as TypeAnnotation;
       return true;
-    } else if (identical(node.name, _oldNode)) {
-      node.name = _newNode as SimpleIdentifier;
-      return true;
     } else if (identical(node.parameters, _oldNode)) {
       node.parameters = _newNode as FormalParameterList;
       return true;
@@ -2632,9 +2598,6 @@
       return true;
     } else if (_replaceInList(node.metadata)) {
       return true;
-    } else if (identical(node.name, _oldNode)) {
-      node.name = _newNode as SimpleIdentifier;
-      return true;
     } else if (identical(node.typeParameters, _oldNode)) {
       node.typeParameters = _newNode as TypeParameterList;
       return true;
@@ -2707,9 +2670,6 @@
     if (identical(node.documentationComment, _oldNode)) {
       node.documentationComment = _newNode as Comment;
       return true;
-    } else if (identical(node.identifier, _oldNode)) {
-      node.identifier = _newNode as SimpleIdentifier;
-      return true;
     } else if (_replaceInList(node.metadata)) {
       return true;
     }
@@ -3016,10 +2976,7 @@
 
   @override
   bool visitTypeParameter(covariant TypeParameterImpl node) {
-    if (identical(node.name, _oldNode)) {
-      node.name = _newNode as SimpleIdentifier;
-      return true;
-    } else if (identical(node.bound, _oldNode)) {
+    if (identical(node.bound, _oldNode)) {
       node.bound = _newNode as TypeAnnotation;
       return true;
     }
@@ -3044,10 +3001,7 @@
 
   @override
   bool visitVariableDeclaration(covariant VariableDeclarationImpl node) {
-    if (identical(node.name, _oldNode)) {
-      node.name = _newNode as SimpleIdentifier;
-      return true;
-    } else if (identical(node.initializer, _oldNode)) {
+    if (identical(node.initializer, _oldNode)) {
       node.initializer = _newNode as Expression;
       return true;
       // TODO(srawlins) also replace node's declared element's
@@ -3173,8 +3127,8 @@
 
   @override
   void visitCatchClause(CatchClause node) {
-    _addToScope2(node.exceptionParameter2?.name);
-    _addToScope2(node.stackTraceParameter2?.name);
+    _addToScope(node.exceptionParameter2?.name);
+    _addToScope(node.stackTraceParameter2?.name);
     super.visitCatchClause(node);
   }
 
@@ -3193,7 +3147,7 @@
 
   @override
   void visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) {
-    _addToScope(node.loopVariable.identifier);
+    _addToScope(node.loopVariable.name);
     super.visitForEachPartsWithDeclaration(node);
   }
 
@@ -3260,28 +3214,19 @@
 
   void _addParameters(NodeList<FormalParameter> vars) {
     for (FormalParameter var2 in vars) {
-      _addToScope(var2.identifier);
+      _addToScope(var2.name);
     }
   }
 
-  void _addToScope(SimpleIdentifier? identifier) {
+  void _addToScope(Token? identifier) {
     if (identifier != null && _isInRange(identifier)) {
-      _locals.add(identifier.name);
-    }
-  }
-
-  /// TODO(scheglov) If we still have [_addToScope] after:
-  /// https://dart-review.googlesource.com/c/sdk/+/252566,
-  /// rename to `_addNodeToScope` and `_addTokenToScope`.
-  void _addToScope2(Token? identifier) {
-    if (identifier != null && _isInRange2(identifier)) {
       _locals.add(identifier.lexeme);
     }
   }
 
   void _addVariables(NodeList<VariableDeclaration> variables) {
     for (VariableDeclaration variable in variables) {
-      _addToScope(variable.name);
+      _addToScope(variable.name2);
     }
   }
 
@@ -3297,21 +3242,12 @@
         _addVariables(statement.variables.variables);
       } else if (statement is FunctionDeclarationStatement &&
           !_referenceIsWithinLocalFunction) {
-        _addToScope(statement.functionDeclaration.name);
+        _addToScope(statement.functionDeclaration.name2);
       }
     }
   }
 
-  bool _isInRange(AstNode node) {
-    if (_position < 0) {
-      // if source position is not set then all nodes are in range
-      return true;
-      // not reached
-    }
-    return node.end < _position;
-  }
-
-  bool _isInRange2(Token token) {
+  bool _isInRange(Token token) {
     if (_position < 0) {
       // if source position is not set then all nodes are in range
       return true;
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index 2095651..e197e85 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -373,7 +373,7 @@
       // lookup for ==
       var method = element.lookUpConcreteMethod("==", _currentLibrary);
       if (method == null ||
-          (method.enclosingElement2 as ClassElement).isDartCoreObject) {
+          (method.enclosingElement3 as ClassElement).isDartCoreObject) {
         return false;
       }
       // there is == that we don't like
@@ -576,7 +576,8 @@
       if (member is FieldDeclaration && !member.isStatic) {
         for (VariableDeclaration variableDeclaration
             in member.fields.variables) {
-          if (isEnumDeclaration && variableDeclaration.name.name == 'values') {
+          if (isEnumDeclaration &&
+              variableDeclaration.name2.lexeme == 'values') {
             continue;
           }
           var initializer = variableDeclaration.initializer;
@@ -597,7 +598,7 @@
                   CompileTimeErrorCode
                       .CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST,
                   constKeyword,
-                  [variableDeclaration.name.name]);
+                  [variableDeclaration.name2.lexeme]);
             }
           }
         }
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index 3449496..2f0dfe0 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -198,7 +198,7 @@
   void computeDependencies(
       ConstantEvaluationTarget constant, ReferenceFinderCallback callback) {
     if (constant is ConstFieldElementImpl && constant.isEnumConstant) {
-      var enclosing = constant.enclosingElement2;
+      var enclosing = constant.enclosingElement3;
       if (enclosing is EnumElementImpl) {
         if (enclosing.name == 'values') {
           return;
@@ -258,7 +258,7 @@
             }
           }
         }
-        for (FieldElement field in constant.enclosingElement2.fields) {
+        for (FieldElement field in constant.enclosingElement3.fields) {
           // Note: non-static const isn't allowed but we handle it anyway so
           // that we won't be confused by incorrect code.
           if ((field.isFinal || field.isConst) &&
@@ -372,7 +372,7 @@
       return null;
     }
     var typeProvider = constructor.library.typeProvider;
-    if (constructor.enclosingElement2 == typeProvider.symbolElement) {
+    if (constructor.enclosingElement3 == typeProvider.symbolElement) {
       // The dart:core.Symbol has a const factory constructor that redirects
       // to dart:_internal.Symbol.  That in turn redirects to an external
       // const constructor, which we won't be able to evaluate.
@@ -396,7 +396,7 @@
 
   static _EnumConstant? _enumConstant(VariableElementImpl element) {
     if (element is ConstFieldElementImpl && element.isEnumConstant) {
-      var enum_ = element.enclosingElement2;
+      var enum_ = element.enclosingElement3;
       if (enum_ is EnumElementImpl) {
         var index = enum_.constants.indexOf(element);
         assert(index >= 0);
@@ -873,7 +873,7 @@
       if (element.name == "identical") {
         NodeList<Expression> arguments = node.argumentList.arguments;
         if (arguments.length == 2) {
-          var enclosingElement = element.enclosingElement2;
+          var enclosingElement = element.enclosingElement3;
           if (enclosingElement is CompilationUnitElement) {
             LibraryElement library = enclosingElement.library;
             if (library.isDartCore) {
@@ -1427,7 +1427,7 @@
       return false;
     }
     return identifier.name == 'length' &&
-        identifier.staticElement?.enclosingElement2 is! ExtensionElement;
+        identifier.staticElement?.enclosingElement3 is! ExtensionElement;
   }
 
   void _reportNotPotentialConstants(AstNode node) {
@@ -2129,7 +2129,7 @@
     List<Expression> arguments, {
     required bool isNullSafe,
   }) {
-    ClassElement definingClass = _constructor.enclosingElement2;
+    final definingClass = _constructor.enclosingElement3;
     var argumentCount = arguments.length;
     if (_constructor.name == "fromEnvironment") {
       if (!_checkFromEnvironmentArguments(arguments, definingType)) {
@@ -2232,7 +2232,7 @@
   }
 
   void _checkFields() {
-    var fields = _constructor.enclosingElement2.fields;
+    var fields = _constructor.enclosingElement3.fields;
     for (var field in fields) {
       if ((field.isFinal || field.isConst) &&
           !field.isStatic &&
@@ -2521,7 +2521,7 @@
   }
 
   void _checkTypeParameters() {
-    var typeParameters = _constructor.enclosingElement2.typeParameters;
+    var typeParameters = _constructor.enclosingElement3.typeParameters;
     var typeArguments = _typeArguments;
     if (typeParameters.isNotEmpty &&
         typeArguments != null &&
diff --git a/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart b/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
index 284072f..c4e7db3 100644
--- a/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
+++ b/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
@@ -227,7 +227,7 @@
     }
 
     if (element is ParameterElement) {
-      var enclosing = element.enclosingElement2;
+      var enclosing = element.enclosingElement3;
       if (enclosing is ConstructorElement &&
           isConstConstructorElement(enclosing)) {
         if (node.thisOrAncestorOfType<ConstructorInitializer>() != null) {
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index b9ef02c..cd1e068 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -103,17 +103,23 @@
   @override
   String get displayName => name;
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   CompilationUnitElementImpl get enclosingElement {
     return _enclosingElement as CompilationUnitElementImpl;
   }
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   CompilationUnitElementImpl get enclosingElement2 {
     return _enclosingElement as CompilationUnitElementImpl;
   }
 
+  @override
+  CompilationUnitElementImpl get enclosingElement3 {
+    return _enclosingElement as CompilationUnitElementImpl;
+  }
+
   /// Set the fields contained in this class to the given [fields].
   set fields(List<FieldElement> fields) {
     assert(!isMixinApplication);
@@ -320,7 +326,7 @@
               !getter.isAbstract &&
               !getter.isStatic &&
               getter.isAccessibleIn2(library) &&
-              getter.enclosingElement2 != this));
+              getter.enclosingElement3 != this));
 
   ExecutableElement? lookUpInheritedConcreteMember(
       String name, LibraryElement library) {
@@ -340,7 +346,7 @@
               !method.isAbstract &&
               !method.isStatic &&
               method.isAccessibleIn2(library) &&
-              method.enclosingElement2 != this));
+              method.enclosingElement3 != this));
 
   @override
   PropertyAccessorElement? lookUpInheritedConcreteSetter(
@@ -350,7 +356,7 @@
               !setter.isAbstract &&
               !setter.isStatic &&
               setter.isAccessibleIn2(library) &&
-              setter.enclosingElement2 != this));
+              setter.enclosingElement3 != this));
 
   @override
   MethodElement? lookUpInheritedMethod(
@@ -359,7 +365,7 @@
           (MethodElement method) =>
               !method.isStatic &&
               method.isAccessibleIn2(library) &&
-              method.enclosingElement2 != this));
+              method.enclosingElement3 != this));
 
   @override
   MethodElement? lookUpMethod(String methodName, LibraryElement library) =>
@@ -545,18 +551,24 @@
     required this.uri,
   }) : super(null, importKeywordOffset);
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   LibraryOrAugmentationElementImpl get enclosingElement {
     return super.enclosingElement2 as LibraryOrAugmentationElementImpl;
   }
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   LibraryOrAugmentationElementImpl get enclosingElement2 {
     return super.enclosingElement2 as LibraryOrAugmentationElementImpl;
   }
 
   @override
+  LibraryOrAugmentationElementImpl get enclosingElement3 {
+    return super.enclosingElement3 as LibraryOrAugmentationElementImpl;
+  }
+
+  @override
   LibraryAugmentationElementImpl? get importedAugmentation {
     final uri = this.uri;
     if (uri is DirectiveUriWithAugmentationImpl) {
@@ -714,7 +726,7 @@
   bool get hasNoSuchMethod {
     MethodElement? method = lookUpConcreteMethod(
         FunctionElement.NO_SUCH_METHOD_METHOD_NAME, library);
-    var definingClass = method?.enclosingElement2 as ClassElement?;
+    var definingClass = method?.enclosingElement3 as ClassElement?;
     return definingClass != null && !definingClass.isDartCoreObject;
   }
 
@@ -1140,16 +1152,21 @@
     _classes = classes;
   }
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   LibraryElement get enclosingElement =>
       super.enclosingElement2 as LibraryElement;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   LibraryOrAugmentationElement get enclosingElement2 =>
       super.enclosingElement2 as LibraryOrAugmentationElement;
 
   @override
+  LibraryOrAugmentationElement get enclosingElement3 =>
+      super.enclosingElement3 as LibraryOrAugmentationElement;
+
+  @override
   CompilationUnitElementImpl get enclosingUnit {
     return this;
   }
@@ -1224,7 +1241,7 @@
   }
 
   @override
-  AnalysisSession get session => enclosingElement2.session;
+  AnalysisSession get session => enclosingElement3.session;
 
   @override
   List<TopLevelVariableElement> get topLevelVariables {
@@ -1398,7 +1415,7 @@
 
   @override
   String get displayName {
-    var className = enclosingElement2.name;
+    var className = enclosingElement3.name;
     var name = this.name;
     if (name.isNotEmpty) {
       return '$className.$name';
@@ -1407,16 +1424,21 @@
     }
   }
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   AbstractClassElementImpl get enclosingElement =>
       super.enclosingElement2 as AbstractClassElementImpl;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   AbstractClassElementImpl get enclosingElement2 =>
       super.enclosingElement2 as AbstractClassElementImpl;
 
   @override
+  InterfaceElement get enclosingElement3 =>
+      super.enclosingElement3 as AbstractClassElementImpl;
+
+  @override
   bool get isConst {
     return hasModifier(Modifier.CONST);
   }
@@ -1451,7 +1473,7 @@
 
   @override
   Element get nonSynthetic {
-    return isSynthetic ? enclosingElement2 : this;
+    return isSynthetic ? enclosingElement3 : this;
   }
 
   @override
@@ -1476,7 +1498,7 @@
 
   @override
   InterfaceType get returnTypeInternal {
-    return (_returnType ??= enclosingElement2.thisType) as InterfaceType;
+    return (_returnType ??= enclosingElement3.thisType) as InterfaceType;
   }
 
   ConstructorElement? get superConstructor {
@@ -1605,7 +1627,7 @@
       if (library == null) {
         throw StateError(
           '[library: null][this: ($runtimeType) $this]'
-          '[enclosingElement2: $enclosingElement2]'
+          '[enclosingElement: $enclosingElement3]'
           '[reference: $reference]',
         );
       }
@@ -1977,7 +1999,7 @@
     final element = this.element;
     if (element is ConstructorElement) {
       return element.library.isDartCore &&
-          element.enclosingElement2.name == _DEPRECATED_CLASS_NAME;
+          element.enclosingElement3.name == _DEPRECATED_CLASS_NAME;
     } else if (element is PropertyAccessorElement) {
       return element.library.isDartCore &&
           element.name == _DEPRECATED_VARIABLE_NAME;
@@ -2107,7 +2129,7 @@
   }) {
     final element = this.element;
     return element is ConstructorElement &&
-        element.enclosingElement2.name == className &&
+        element.enclosingElement3.name == className &&
         element.library.name == libraryName;
   }
 
@@ -2221,7 +2243,7 @@
     _docComment = doc;
   }
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   Element? get enclosingElement => _enclosingElement;
 
@@ -2230,9 +2252,13 @@
     _enclosingElement = element as ElementImpl?;
   }
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   Element? get enclosingElement2 => _enclosingElement;
 
+  @override
+  Element? get enclosingElement3 => _enclosingElement;
+
   /// Return the enclosing unit element (which might be the same as `this`), or
   /// `null` if this element is not contained in any compilation unit.
   CompilationUnitElementImpl get enclosingUnit {
@@ -2581,12 +2607,12 @@
 
   @override
   AnalysisSession? get session {
-    return enclosingElement2?.session;
+    return enclosingElement3?.session;
   }
 
   @override
   Source? get source {
-    return enclosingElement2?.source;
+    return enclosingElement3?.source;
   }
 
   /// Return the context to resolve type parameters in, or `null` if neither
@@ -2696,7 +2722,7 @@
   ) {
     Element? element = this;
     while (element != null && !predicate(element)) {
-      element = element.enclosingElement2;
+      element = element.enclosingElement3;
     }
     return element as E?;
   }
@@ -2706,9 +2732,9 @@
     Element? element = this;
     while (element != null && element is! E) {
       if (element is CompilationUnitElement) {
-        element = element.enclosingElement2;
+        element = element.enclosingElement3;
       } else {
-        element = element.enclosingElement2;
+        element = element.enclosingElement3;
       }
     }
     return element as E?;
@@ -2787,7 +2813,7 @@
     Element? ancestor = element;
     while (ancestor != null) {
       components.insert(0, (ancestor as ElementImpl).identifier);
-      ancestor = ancestor.enclosingElement2;
+      ancestor = ancestor.enclosingElement3;
     }
     _components = components;
   }
@@ -3044,14 +3070,18 @@
   /// [offset].
   ExecutableElementImpl(String super.name, super.offset, {super.reference});
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   Element get enclosingElement => super.enclosingElement2!;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   Element get enclosingElement2 => super.enclosingElement2!;
 
   @override
+  Element get enclosingElement3 => super.enclosingElement3!;
+
+  @override
   bool get hasImplicitReturnType {
     return hasModifier(Modifier.IMPLICIT_TYPE);
   }
@@ -3321,18 +3351,24 @@
   @override
   String get displayName => name ?? '';
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   CompilationUnitElementImpl get enclosingElement {
     return _enclosingElement as CompilationUnitElementImpl;
   }
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   CompilationUnitElementImpl get enclosingElement2 {
     return super.enclosingElement2 as CompilationUnitElementImpl;
   }
 
   @override
+  CompilationUnitElementImpl get enclosingElement3 {
+    return super.enclosingElement3 as CompilationUnitElementImpl;
+  }
+
+  @override
   DartType get extendedType =>
       ElementTypeProvider.current.getExtendedType(this);
 
@@ -3530,7 +3566,7 @@
   ///
   /// Such fields are `index`, `_name`, and `values`.
   bool get isSyntheticEnumField {
-    return enclosingElement2 is EnumElementImpl &&
+    return enclosingElement3 is EnumElementImpl &&
         isSynthetic &&
         getter?.isSynthetic == true &&
         setter == null;
@@ -3598,7 +3634,7 @@
   @override
   String get identifier {
     String identifier = super.identifier;
-    Element? enclosing = enclosingElement2;
+    Element? enclosing = enclosingElement3;
     if (enclosing is ExecutableElement || enclosing is VariableElement) {
       identifier += "@$nameOffset";
     }
@@ -3866,15 +3902,20 @@
   @override
   String get displayName => name;
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   ExecutableElement get enclosingElement =>
       super.enclosingElement2 as ExecutableElement;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   ExecutableElement get enclosingElement2 =>
       super.enclosingElement2 as ExecutableElement;
 
+  @override
+  ExecutableElement get enclosingElement3 =>
+      super.enclosingElement3 as ExecutableElement;
+
   /// Return `true` if this label is associated with a `switch` member (`case
   /// ` or`default`).
   bool get isOnSwitchMember => _onSwitchMember;
@@ -4840,8 +4881,8 @@
 
   @override
   Element get nonSynthetic {
-    if (isSynthetic && enclosingElement2 is EnumElementImpl) {
-      return enclosingElement2;
+    if (isSynthetic && enclosingElement3 is EnumElementImpl) {
+      return enclosingElement3;
     }
     return this;
   }
@@ -5087,13 +5128,18 @@
   @override
   String? get documentationComment => null;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   Element? get enclosingElement => null;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   Element? get enclosingElement2 => null;
 
   @override
+  Element? get enclosingElement3 => null;
+
+  @override
   bool get hasAlwaysThrows => false;
 
   @override
@@ -5321,13 +5367,17 @@
   /// [offset].
   NonParameterVariableElementImpl(String super.name, super.offset);
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   Element get enclosingElement => super.enclosingElement2!;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   Element get enclosingElement2 => super.enclosingElement2!;
 
+  @override
+  Element get enclosingElement3 => super.enclosingElement3!;
+
   bool get hasInitializer {
     return hasModifier(Modifier.HAS_INITIALIZER);
   }
@@ -5596,7 +5646,7 @@
 
   @override
   CompilationUnitElementImpl get enclosingUnit {
-    var enclosingLibrary = enclosingElement2 as LibraryElementImpl;
+    var enclosingLibrary = enclosingElement3 as LibraryElementImpl;
     return enclosingLibrary._definingCompilationUnit;
   }
 
@@ -5627,15 +5677,20 @@
   @override
   String get displayName => name;
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   LibraryElement get enclosingElement =>
       super.enclosingElement2 as LibraryElement;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   LibraryOrAugmentationElementImpl get enclosingElement2 =>
       super.enclosingElement2 as LibraryOrAugmentationElementImpl;
 
+  @override
+  LibraryOrAugmentationElementImpl get enclosingElement3 =>
+      super.enclosingElement3 as LibraryOrAugmentationElementImpl;
+
   @Deprecated('Use imports2 instead')
   @override
   List<ImportElement> get imports {
@@ -5646,7 +5701,7 @@
 
   @override
   List<LibraryImportElement> get imports2 {
-    return enclosingElement2.libraryImports
+    return enclosingElement3.libraryImports
         .where((import) => import.prefix?.element == this)
         .toList();
   }
@@ -5660,7 +5715,7 @@
   }
 
   @override
-  Scope get scope => _scope ??= PrefixScope(enclosingElement2, this);
+  Scope get scope => _scope ??= PrefixScope(enclosingElement3, this);
 
   @override
   T? accept<T>(ElementVisitor<T> visitor) => visitor.visitPrefixElement(this);
@@ -5801,14 +5856,18 @@
     reference?.element = this;
   }
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   Element get enclosingElement => variable.enclosingElement2!;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   Element get enclosingElement2 => variable.enclosingElement2!;
 
   @override
+  Element get enclosingElement3 => variable.enclosingElement3!;
+
+  @override
   bool get hasImplicitReturnType => variable.hasImplicitType;
 
   @override
@@ -5820,8 +5879,8 @@
     if (!variable.isSynthetic) {
       return variable;
     }
-    assert(enclosingElement2 is EnumElementImpl);
-    return enclosingElement2;
+    assert(enclosingElement3 is EnumElementImpl);
+    return enclosingElement3;
   }
 
   @override
@@ -5866,14 +5925,18 @@
     property.setter = this;
   }
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   Element get enclosingElement => variable.enclosingElement2!;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   Element get enclosingElement2 => variable.enclosingElement2!;
 
   @override
+  Element get enclosingElement3 => variable.enclosingElement3!;
+
+  @override
   bool get isSetter => true;
 
   @override
@@ -5969,10 +6032,10 @@
   @override
   Element get nonSynthetic {
     if (isSynthetic) {
-      if (enclosingElement2 is EnumElementImpl) {
+      if (enclosingElement3 is EnumElementImpl) {
         // TODO(scheglov) remove 'index'?
         if (name == 'index' || name == 'values') {
-          return enclosingElement2;
+          return enclosingElement3;
         }
       }
       return (getter ?? setter)!;
@@ -6113,16 +6176,16 @@
 
   @override
   ParameterElement? get superConstructorParameter {
-    final enclosingElement2 = this.enclosingElement2;
-    if (enclosingElement2 is ConstructorElementImpl) {
-      var superConstructor = enclosingElement2.superConstructor;
+    final enclosingElement3 = this.enclosingElement3;
+    if (enclosingElement3 is ConstructorElementImpl) {
+      var superConstructor = enclosingElement3.superConstructor;
       if (superConstructor != null) {
         var superParameters = superConstructor.parameters;
         if (isNamed) {
           return superParameters
               .firstWhereOrNull((e) => e.isNamed && e.name == name);
         } else {
-          var index = indexIn(enclosingElement2);
+          var index = indexIn(enclosingElement3);
           var positionalSuperParameters =
               superParameters.where((e) => e.isPositional).toList();
           if (index >= 0 && index < positionalSuperParameters.length) {
@@ -6223,15 +6286,20 @@
   @override
   String get displayName => name;
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   CompilationUnitElement get enclosingElement =>
       super.enclosingElement2 as CompilationUnitElement;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   CompilationUnitElement get enclosingElement2 =>
       super.enclosingElement2 as CompilationUnitElement;
 
+  @override
+  CompilationUnitElement get enclosingElement3 =>
+      super.enclosingElement3 as CompilationUnitElement;
+
   /// Returns whether this alias is a "proper rename" of [aliasedClass], as
   /// defined in the constructor-tearoffs specification.
   bool get isProperRename {
@@ -6470,7 +6538,7 @@
       return true;
     }
     if (other is TypeParameterElement) {
-      if (other.enclosingElement2 == null || enclosingElement2 == null) {
+      if (other.enclosingElement3 == null || enclosingElement3 == null) {
         return identical(other, this);
       }
       return other.location == location;
@@ -6700,7 +6768,7 @@
   String? get documentationComment => base.documentationComment;
 
   @override
-  Element? get enclosingElement => base.enclosingElement2;
+  Element? get enclosingElement => base.enclosingElement3;
 
   @override
   bool get hasAlwaysThrows => base.hasAlwaysThrows;
@@ -6866,7 +6934,7 @@
   Source get librarySource => library.source;
 
   @override
-  Source get source => enclosingElement2!.source!;
+  Source get source => enclosingElement3!.source!;
 }
 
 /// Instances of [List]s that are used as "not yet computed" values, they
diff --git a/pkg/analyzer/lib/src/dart/element/extensions.dart b/pkg/analyzer/lib/src/dart/element/extensions.dart
index 6b256a0..6186e8a 100644
--- a/pkg/analyzer/lib/src/dart/element/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/element/extensions.dart
@@ -16,21 +16,21 @@
   /// Return the target kinds defined for this [ElementAnnotation].
   Set<TargetKind> get targetKinds {
     final element = this.element;
-    ClassElement? classElement;
+    InterfaceElement? interfaceElement;
     if (element is PropertyAccessorElement) {
       if (element.isGetter) {
         var type = element.returnType;
         if (type is InterfaceType) {
-          classElement = type.element;
+          interfaceElement = type.element;
         }
       }
     } else if (element is ConstructorElement) {
-      classElement = element.enclosingElement2;
+      interfaceElement = element.enclosingElement3;
     }
-    if (classElement == null) {
+    if (interfaceElement == null) {
       return const <TargetKind>{};
     }
-    for (var annotation in classElement.metadata) {
+    for (var annotation in interfaceElement.metadata) {
       if (annotation.isTarget) {
         var value = annotation.computeConstantValue()!;
         var kinds = <TargetKind>{};
@@ -68,21 +68,21 @@
       return true;
     }
 
-    var ancestor = enclosingElement2;
+    var ancestor = enclosingElement3;
     if (ancestor is ClassElement) {
       if (ancestor.hasDoNotStore) {
         return true;
       }
-      ancestor = ancestor.enclosingElement2;
+      ancestor = ancestor.enclosingElement3;
     } else if (ancestor is ExtensionElement) {
       if (ancestor.hasDoNotStore) {
         return true;
       }
-      ancestor = ancestor.enclosingElement2;
+      ancestor = ancestor.enclosingElement3;
     }
 
     return ancestor is CompilationUnitElement &&
-        ancestor.enclosingElement2.hasDoNotStore;
+        ancestor.enclosingElement3.hasDoNotStore;
   }
 
   /// Return `true` if this element is an instance member of a class or mixin.
@@ -94,7 +94,7 @@
   /// [PropertyAccessorElement]s.
   bool get isInstanceMember {
     var this_ = this;
-    var enclosing = this_.enclosingElement2;
+    var enclosing = this_.enclosingElement3;
     if (enclosing is ClassElement) {
       return this_ is MethodElement && !this_.isStatic ||
           this_ is PropertyAccessorElement && !this_.isStatic;
@@ -105,7 +105,7 @@
 
 extension ExecutableElementExtension on ExecutableElement {
   bool get isEnumConstructor {
-    return this is ConstructorElement && enclosingElement2 is EnumElementImpl;
+    return this is ConstructorElement && enclosingElement3 is EnumElementImpl;
   }
 }
 
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
index 9768db4..ad86fb1 100644
--- a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
+++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
@@ -366,7 +366,7 @@
         continue;
       }
 
-      var class_ = executable.enclosingElement2;
+      var class_ = executable.enclosingElement3;
       if (class_ is ClassElement && class_.isDartCoreObject) {
         continue;
       }
@@ -518,7 +518,7 @@
         }
 
         var current = currentList.single;
-        if (candidate.enclosingElement2 == mixinElement) {
+        if (candidate.enclosingElement3 == mixinElement) {
           namedCandidates[name] = [
             isNonNullableByDefault
                 ? candidate
@@ -714,7 +714,7 @@
     Name name,
     ExecutableElement executable,
   ) {
-    if (executable.enclosingElement2 == class_) {
+    if (executable.enclosingElement3 == class_) {
       return executable;
     }
 
@@ -902,7 +902,7 @@
   }
 
   static bool _isDeclaredInObject(ExecutableElement element) {
-    var enclosing = element.enclosingElement2;
+    var enclosing = element.enclosingElement3;
     return enclosing is ClassElement &&
         enclosing.supertype == null &&
         !enclosing.isMixin;
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 242170d..b0708f0 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -43,14 +43,18 @@
   @override
   String get displayName => declaration.displayName;
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
   ClassElement get enclosingElement => declaration.enclosingElement2;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
   ClassElement get enclosingElement2 => declaration.enclosingElement2;
 
   @override
+  InterfaceElement get enclosingElement3 => declaration.enclosingElement3;
+
+  @override
   bool get isConst => declaration.isConst;
 
   @override
@@ -348,12 +352,16 @@
   @override
   String get displayName => declaration.displayName;
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
-  Element get enclosingElement => declaration.enclosingElement2;
+  Element get enclosingElement => declaration.enclosingElement3;
+
+  @Deprecated('Use enclosingElement3 instead')
+  @override
+  Element get enclosingElement2 => declaration.enclosingElement3;
 
   @override
-  Element get enclosingElement2 => declaration.enclosingElement2;
+  Element get enclosingElement3 => declaration.enclosingElement3;
 
   @override
   PropertyAccessorElement? get getter {
@@ -442,12 +450,16 @@
   @override
   FunctionElement get declaration => super.declaration as FunctionElement;
 
+  @Deprecated('Use enclosingElement3 instead')
   @override
-  Element get enclosingElement => declaration.enclosingElement2;
+  Element get enclosingElement => declaration.enclosingElement3;
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
-  Element get enclosingElement2 => declaration.enclosingElement2;
+  Element get enclosingElement2 => declaration.enclosingElement3;
+
+  @override
+  Element get enclosingElement3 => declaration.enclosingElement3;
 
   @override
   bool get isDartCoreIdentical => declaration.isDartCoreIdentical;
@@ -505,12 +517,16 @@
   @override
   String? get documentationComment => _declaration.documentationComment;
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
-  Element? get enclosingElement => _declaration.enclosingElement2;
+  Element? get enclosingElement => _declaration.enclosingElement3;
+
+  @Deprecated('Use enclosingElement3 instead')
+  @override
+  Element? get enclosingElement2 => _declaration.enclosingElement3;
 
   @override
-  Element? get enclosingElement2 => _declaration.enclosingElement2;
+  Element? get enclosingElement3 => _declaration.enclosingElement3;
 
   @override
   bool get hasAlwaysThrows => _declaration.hasAlwaysThrows;
@@ -799,12 +815,16 @@
   @override
   MethodElement get declaration => super.declaration as MethodElement;
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
-  Element get enclosingElement => declaration.enclosingElement2;
+  Element get enclosingElement => declaration.enclosingElement3;
+
+  @Deprecated('Use enclosingElement3 instead')
+  @override
+  Element get enclosingElement2 => declaration.enclosingElement3;
 
   @override
-  Element get enclosingElement2 => declaration.enclosingElement2;
+  Element get enclosingElement3 => declaration.enclosingElement3;
 
   @override
   String get name => declaration.name;
@@ -887,12 +907,16 @@
   @override
   String? get defaultValueCode => declaration.defaultValueCode;
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
-  Element? get enclosingElement => declaration.enclosingElement2;
+  Element? get enclosingElement => declaration.enclosingElement3;
+
+  @Deprecated('Use enclosingElement3 instead')
+  @override
+  Element? get enclosingElement2 => declaration.enclosingElement3;
 
   @override
-  Element? get enclosingElement2 => declaration.enclosingElement2;
+  Element? get enclosingElement3 => declaration.enclosingElement3;
 
   @override
   bool get hasDefaultValue => declaration.hasDefaultValue;
@@ -1032,12 +1056,16 @@
   PropertyAccessorElement get declaration =>
       super.declaration as PropertyAccessorElement;
 
-  @Deprecated('Use enclosingElement2 instead')
+  @Deprecated('Use enclosingElement3 instead')
   @override
-  Element get enclosingElement => declaration.enclosingElement2;
+  Element get enclosingElement => declaration.enclosingElement3;
+
+  @Deprecated('Use enclosingElement3 instead')
+  @override
+  Element get enclosingElement2 => declaration.enclosingElement3;
 
   @override
-  Element get enclosingElement2 => declaration.enclosingElement2;
+  Element get enclosingElement3 => declaration.enclosingElement3;
 
   @override
   bool get isGetter => declaration.isGetter;
diff --git a/pkg/analyzer/lib/src/dart/element/type_system.dart b/pkg/analyzer/lib/src/dart/element/type_system.dart
index 3faa7fb..eaff897 100644
--- a/pkg/analyzer/lib/src/dart/element/type_system.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_system.dart
@@ -1696,7 +1696,7 @@
     // If the method being invoked comes from an extension, don't refine the
     // type because we can only make guarantees about methods defined in the
     // SDK, and the numeric methods we refine are all instance methods.
-    if (methodElement.enclosingElement2 is ExtensionElement) {
+    if (methodElement.enclosingElement3 is ExtensionElement) {
       return currentType;
     }
 
@@ -1800,7 +1800,7 @@
     // If the method being invoked comes from an extension, don't refine the
     // type because we can only make guarantees about methods defined in the
     // SDK, and the numeric methods we refine are all instance methods.
-    if (methodElement.enclosingElement2 is ExtensionElement) {
+    if (methodElement.enclosingElement3 is ExtensionElement) {
       return currentType;
     }
 
diff --git a/pkg/analyzer/lib/src/dart/micro/utils.dart b/pkg/analyzer/lib/src/dart/micro/utils.dart
index c5113f7..48c3c78 100644
--- a/pkg/analyzer/lib/src/dart/micro/utils.dart
+++ b/pkg/analyzer/lib/src/dart/micro/utils.dart
@@ -5,6 +5,7 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/element_locator.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:collection/src/iterable_extensions.dart';
@@ -15,6 +16,9 @@
   if (node == null) {
     return null;
   }
+  if (node is DeclaredSimpleIdentifier) {
+    node = node.parent;
+  }
   if (node is SimpleIdentifier && node.parent is LibraryIdentifier) {
     node = node.parent;
   }
@@ -43,8 +47,8 @@
     ConstructorElement? constructor) {
   var seenConstructors = <ConstructorElement?>{};
   while (constructor is ConstructorElementImpl && constructor.isSynthetic) {
-    var enclosing = constructor.enclosingElement2;
-    if (enclosing.isMixinApplication) {
+    var enclosing = constructor.enclosingElement3;
+    if (enclosing is ClassElement && enclosing.isMixinApplication) {
       var superInvocation = constructor.constantInitializers
           .whereType<SuperConstructorInvocation>()
           .singleOrNull;
@@ -73,7 +77,7 @@
     String prefix,
     Element element,
     Map<LibraryImportElement, Set<Element>> importElementsMap) {
-  if (element.enclosingElement2 is! CompilationUnitElement) {
+  if (element.enclosingElement3 is! CompilationUnitElement) {
     return null;
   }
   var usedLibrary = element.library;
@@ -280,7 +284,7 @@
             MatchInfo(e.nameOffset + e.nameLength, 0, MatchKind.DECLARATION));
       } else {
         var offset = node.period!.offset;
-        var length = node.name!.end - offset;
+        var length = node.name2!.end - offset;
         references.add(MatchInfo(offset, length, MatchKind.DECLARATION));
       }
     }
@@ -310,7 +314,7 @@
         length = 0;
       }
       references.add(MatchInfo(offset, length, kind));
-    } else if (e != null && e.enclosingElement2 == element) {
+    } else if (e != null && e.enclosingElement3 == element) {
       kind = MatchKind.REFERENCE;
       offset = node.offset;
       length = element.nameLength;
@@ -329,7 +333,7 @@
         offset = constructorSelector.period.offset;
         length = constructorSelector.name.end - offset;
       } else {
-        offset = node.name.end;
+        offset = node.name2.end;
         length = 0;
       }
       var kind = node.arguments == null
diff --git a/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart
index 339f8df..0e5cbf2 100644
--- a/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart
@@ -29,15 +29,16 @@
     }
     node.constructorName.accept(_resolver);
     var element = node.constructorName.staticElement;
-    if (element != null &&
-        !element.isFactory &&
-        element.enclosingElement2.isAbstract) {
-      _resolver.errorReporter.reportErrorForNode(
-        CompileTimeErrorCode
-            .TEAROFF_OF_GENERATIVE_CONSTRUCTOR_OF_ABSTRACT_CLASS,
-        node,
-        [],
-      );
+    if (element != null && !element.isFactory) {
+      final enclosingElement = element.enclosingElement3;
+      if (enclosingElement is ClassElement && enclosingElement.isAbstract) {
+        _resolver.errorReporter.reportErrorForNode(
+          CompileTimeErrorCode
+              .TEAROFF_OF_GENERATIVE_CONSTRUCTOR_OF_ABSTRACT_CLASS,
+          node,
+          [],
+        );
+      }
     }
     var name = node.constructorName.name;
     if (element == null &&
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
index dba662f..d746b4b 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
@@ -175,7 +175,7 @@
     ExecutableElement element, {
     required bool implicitReceiver,
   }) {
-    var enclosingElement = element.enclosingElement2;
+    var enclosingElement = element.enclosingElement3;
     if (implicitReceiver) {
       if (_resolver.enclosingExtension != null) {
         _resolver.errorReporter.reportErrorForNode(
diff --git a/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart b/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart
index 729d28a..52a7b37 100644
--- a/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart
@@ -26,7 +26,7 @@
   int unnamedParameterIndex = 0;
   for (var formalParameter in parameters) {
     var key = formalParameter.isNamed
-        ? formalParameter.identifier?.name ?? ''
+        ? formalParameter.name?.lexeme ?? ''
         : unnamedParameterIndex++;
     if (formalParameter.isExplicitlyTyped) {
       result.add(key);
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index ac88021..0f67ceec 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -220,7 +220,7 @@
     ExecutableElement element,
     bool nullReceiver,
   ) {
-    var enclosingElement = element.enclosingElement2;
+    var enclosingElement = element.enclosingElement3;
     if (nullReceiver) {
       if (_resolver.enclosingExtension != null) {
         _resolver.errorReporter.reportErrorForNode(
diff --git a/pkg/analyzer/lib/src/dart/resolver/named_type_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/named_type_resolver.dart
index cc95ced..362b8a7 100644
--- a/pkg/analyzer/lib/src/dart/resolver/named_type_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/named_type_resolver.dart
@@ -568,7 +568,7 @@
 
     if (element is LocalVariableElement ||
         (element is FunctionElement &&
-            element.enclosingElement2 is ExecutableElement)) {
+            element.enclosingElement3 is ExecutableElement)) {
       errorReporter.reportError(
         DiagnosticFactory().referencedBeforeDeclaration(
           errorReporter.source,
diff --git a/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
index 08996d4..53483f9 100644
--- a/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
@@ -135,7 +135,7 @@
       return false;
     }
     if (parent is ConstructorDeclaration) {
-      if (parent.name == node || parent.returnType == node) {
+      if (parent.returnType == node) {
         return false;
       }
     }
diff --git a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
index fd96f2e..082e7fb 100644
--- a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
@@ -291,7 +291,7 @@
           propertyName,
         );
       } else {
-        var enclosingElement = element.enclosingElement2;
+        var enclosingElement = element.enclosingElement3;
         if (enclosingElement is ExtensionElement &&
             enclosingElement.name == null) {
           _resolver.errorReporter.reportErrorForNode(
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index a528110..1283c93 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -240,7 +240,7 @@
   @override
   void visitClassDeclaration(covariant ClassDeclarationImpl node) {
     ClassElementImpl element = _elementWalker!.getClass();
-    node.name.staticElement = element;
+    node.declaredElement = element;
     _namedTypeResolver.enclosingClass = element;
 
     _setOrCreateMetadataElements(element, node.metadata);
@@ -275,7 +275,7 @@
   @override
   void visitClassTypeAlias(covariant ClassTypeAliasImpl node) {
     ClassElementImpl element = _elementWalker!.getClass();
-    node.name.staticElement = element;
+    node.declaredElement = element;
     _namedTypeResolver.enclosingClass = element;
 
     _setOrCreateMetadataElements(element, node.metadata);
@@ -303,7 +303,7 @@
   void visitConstructorDeclaration(ConstructorDeclaration node) {
     ConstructorElementImpl element = _elementWalker!.getConstructor();
     (node as ConstructorDeclarationImpl).declaredElement = element;
-    node.name?.staticElement = element;
+    node.declaredElement = element;
 
     _setOrCreateMetadataElements(element, node.metadata);
 
@@ -330,10 +330,10 @@
 
   @override
   void visitDeclaredIdentifier(covariant DeclaredIdentifierImpl node) {
-    var nameNode = node.identifier;
-    var element = LocalVariableElementImpl(nameNode.name, nameNode.offset);
+    var nameToken = node.name;
+    var element = LocalVariableElementImpl(nameToken.lexeme, nameToken.offset);
     _elementHolder.enclose(element);
-    nameNode.staticElement = element;
+    node.declaredElement = element;
 
     _setOrCreateMetadataElements(element, node.metadata);
 
@@ -354,14 +354,14 @@
   @override
   void visitDefaultFormalParameter(covariant DefaultFormalParameterImpl node) {
     var normalParameter = node.parameter;
-    var nameNode = normalParameter.identifier;
+    var nameToken = normalParameter.name;
 
     ParameterElementImpl element;
     if (_elementWalker != null) {
       element = _elementWalker!.getParameter();
     } else {
-      var name = nameNode?.name ?? '';
-      var nameOffset = nameNode?.offset ?? -1;
+      var name = nameToken?.lexeme ?? '';
+      var nameOffset = nameToken?.offset ?? -1;
       if (node.parameter is FieldFormalParameter) {
         // Only for recovery, this should not happen in valid code.
         element = DefaultFieldFormalParameterElementImpl(
@@ -389,10 +389,8 @@
       }
     }
 
-    if (normalParameter is SimpleFormalParameterImpl) {
-      normalParameter.declaredElement = element;
-    }
-    nameNode?.staticElement = element;
+    normalParameter.declaredElement = element;
+    node.declaredElement = element;
 
     normalParameter.accept(this);
 
@@ -409,8 +407,8 @@
   @override
   void visitEnumConstantDeclaration(
       covariant EnumConstantDeclarationImpl node) {
-    var element = _elementWalker!.getVariable();
-    node.name.staticElement = element;
+    var element = _elementWalker!.getVariable() as ConstFieldElementImpl;
+    node.declaredElement = element;
 
     _setOrCreateMetadataElements(element, node.metadata);
 
@@ -427,7 +425,7 @@
   @override
   void visitEnumDeclaration(covariant EnumDeclarationImpl node) {
     EnumElementImpl element = _elementWalker!.getEnum();
-    node.name.staticElement = element;
+    node.declaredElement = element;
     _namedTypeResolver.enclosingClass = element;
 
     _setOrCreateMetadataElements(element, node.metadata);
@@ -466,7 +464,7 @@
   void visitExtensionDeclaration(ExtensionDeclaration node) {
     var element = _elementWalker!.getExtension();
     (node as ExtensionDeclarationImpl).declaredElement = element;
-    node.name?.staticElement = element;
+    node.declaredElement = element;
 
     _setOrCreateMetadataElements(element, node.metadata);
 
@@ -489,15 +487,15 @@
     if (node.parent is DefaultFormalParameter) {
       element = node.declaredElement as FieldFormalParameterElementImpl;
     } else {
-      var nameNode = node.identifier;
+      var nameToken = node.name;
       if (_elementWalker != null) {
         element =
             _elementWalker!.getParameter() as FieldFormalParameterElementImpl;
       } else {
         // Only for recovery, this should not happen in valid code.
         element = FieldFormalParameterElementImpl(
-          name: nameNode.name,
-          nameOffset: nameNode.offset,
+          name: nameToken.lexeme,
+          nameOffset: nameToken.offset,
           parameterKind: node.kind,
         );
         _elementHolder.enclose(element);
@@ -506,7 +504,7 @@
         element.isFinal = node.isFinal;
         _setCodeRange(element, node);
       }
-      nameNode.staticElement = element;
+      node.declaredElement = element;
     }
 
     _setOrCreateMetadataElements(element, node.metadata);
@@ -548,7 +546,7 @@
       element = node.isGetter || node.isSetter
           ? _elementWalker!.getAccessor()
           : _elementWalker!.getFunction();
-      node.name.staticElement = element;
+      node.declaredElement = element;
     } else {
       element = node.declaredElement as ExecutableElementImpl;
 
@@ -648,7 +646,7 @@
   @override
   void visitFunctionTypeAlias(covariant FunctionTypeAliasImpl node) {
     var element = _elementWalker!.getTypedef();
-    node.name.staticElement = element;
+    node.declaredElement = element;
 
     _setOrCreateMetadataElements(element, node.metadata);
 
@@ -670,13 +668,13 @@
     if (node.parent is DefaultFormalParameter) {
       element = node.declaredElement as ParameterElementImpl;
     } else {
-      var nameNode = node.identifier;
+      var nameToken = node.name;
       if (_elementWalker != null) {
         element = _elementWalker!.getParameter();
       } else {
         element = ParameterElementImpl(
-          name: nameNode.name,
-          nameOffset: nameNode.offset,
+          name: nameToken.lexeme,
+          nameOffset: nameToken.offset,
           parameterKind: node.kind,
         );
         _elementHolder.addParameter(element);
@@ -685,7 +683,7 @@
         element.isFinal = node.isFinal;
         _setCodeRange(element, node);
       }
-      nameNode.staticElement = element;
+      node.declaredElement = element;
     }
 
     _setOrCreateMetadataElements(element, node.metadata);
@@ -762,7 +760,7 @@
   @override
   void visitGenericTypeAlias(covariant GenericTypeAliasImpl node) {
     var element = _elementWalker!.getTypedef();
-    node.name.staticElement = element;
+    node.declaredElement = element;
 
     _setOrCreateMetadataElements(element, node.metadata);
 
@@ -864,7 +862,7 @@
     ExecutableElementImpl element = node.isGetter || node.isSetter
         ? _elementWalker!.getAccessor()
         : _elementWalker!.getFunction();
-    node.name.staticElement = element;
+    node.declaredElement = element;
 
     _setOrCreateMetadataElements(element, node.metadata);
 
@@ -899,7 +897,7 @@
   @override
   void visitMixinDeclaration(covariant MixinDeclarationImpl node) {
     var element = _elementWalker!.getMixin();
-    node.name.staticElement = element;
+    node.declaredElement = element;
 
     _setOrCreateMetadataElements(element, node.metadata);
 
@@ -975,14 +973,14 @@
     if (node.parent is DefaultFormalParameter) {
       element = node.declaredElement as ParameterElementImpl;
     } else {
-      var nameNode = node.identifier;
+      var nameToken = node.name;
       if (_elementWalker != null) {
         element = _elementWalker!.getParameter();
       } else {
-        if (nameNode != null) {
+        if (nameToken != null) {
           element = ParameterElementImpl(
-            name: nameNode.name,
-            nameOffset: nameNode.offset,
+            name: nameToken.lexeme,
+            nameOffset: nameToken.offset,
             parameterKind: node.kind,
           );
         } else {
@@ -1003,7 +1001,6 @@
         }
         node.declaredElement = element;
       }
-      nameNode?.staticElement = element;
       node.declaredElement = element;
     }
 
@@ -1021,15 +1018,15 @@
     if (node.parent is DefaultFormalParameter) {
       element = node.declaredElement as SuperFormalParameterElementImpl;
     } else {
-      var nameNode = node.identifier;
+      var nameToken = node.name;
       if (_elementWalker != null) {
         element =
             _elementWalker!.getParameter() as SuperFormalParameterElementImpl;
       } else {
         // Only for recovery, this should not happen in valid code.
         element = SuperFormalParameterElementImpl(
-          name: nameNode.name,
-          nameOffset: nameNode.offset,
+          name: nameToken.lexeme,
+          nameOffset: nameToken.offset,
           parameterKind: node.kind,
         );
         _elementHolder.enclose(element);
@@ -1038,7 +1035,7 @@
         element.isFinal = node.isFinal;
         _setCodeRange(element, node);
       }
-      nameNode.staticElement = element;
+      node.declaredElement = element;
     }
 
     _setOrCreateMetadataElements(element, node.metadata);
@@ -1112,7 +1109,7 @@
     VariableElementImpl element;
     if (_elementWalker != null) {
       element = _elementWalker!.getVariable();
-      node.name.staticElement = element;
+      node.declaredElement = element;
     } else {
       var localElement = node.declaredElement as LocalVariableElementImpl;
       element = localElement;
@@ -1196,9 +1193,9 @@
   void _buildLocalFunctionElement(
       covariant FunctionDeclarationStatementImpl statement) {
     var node = statement.functionDeclaration;
-    var nameNode = node.name;
-    var element = FunctionElementImpl(nameNode.name, nameNode.offset);
-    nameNode.staticElement = element;
+    var nameToken = node.name2;
+    var element = FunctionElementImpl(nameToken.lexeme, nameToken.offset);
+    node.declaredElement = element;
     _define(element);
     _elementHolder.enclose(element);
   }
@@ -1209,21 +1206,21 @@
     var isLate = variableList.isLate;
     for (var variable in variableList.variables) {
       variable as VariableDeclarationImpl;
-      var variableName = variable.name;
+      var nameToken = variable.name2;
 
       LocalVariableElementImpl element;
       if (isConst && variable.initializer != null) {
         element = ConstLocalVariableElementImpl(
-          variableName.name,
-          variableName.offset,
+          nameToken.lexeme,
+          nameToken.offset,
         );
       } else {
         element = LocalVariableElementImpl(
-          variableName.name,
-          variableName.offset,
+          nameToken.lexeme,
+          nameToken.offset,
         );
       }
-      variableName.staticElement = element;
+      variable.declaredElement = element;
       _elementHolder.enclose(element);
       _define(element);
 
@@ -1241,18 +1238,20 @@
 
     for (var typeParameter in typeParameterList.typeParameters) {
       typeParameter as TypeParameterImpl;
-      var name = typeParameter.name;
+      var name = typeParameter.name2;
 
       TypeParameterElementImpl element;
       if (_elementWalker != null) {
         element = _elementWalker!.getTypeParameter();
       } else {
-        element = TypeParameterElementImpl(name.name, name.offset);
+        element = TypeParameterElementImpl(name.lexeme, name.offset);
         _elementHolder.addTypeParameter(element);
 
         _setCodeRange(element, typeParameter);
       }
-      name.staticElement = element;
+      typeParameter.declaredElement = element;
+      // ignore: deprecated_member_use_from_same_package
+      typeParameter.name.staticElement = element;
       _define(element);
       _setOrCreateMetadataElements(element, typeParameter.metadata);
     }
diff --git a/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart
index 9846ada..97dbd16 100644
--- a/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart
@@ -77,7 +77,7 @@
       return false;
     }
     if (parent is ConstructorDeclaration) {
-      if (parent.name == node || parent.returnType == node) {
+      if (parent.returnType == node) {
         return false;
       }
     }
diff --git a/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart
index 17d7f04..d9be7b7 100644
--- a/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart
@@ -33,7 +33,7 @@
         _resolver.errorReporter.reportErrorForNode(
           HintCode.INFERENCE_FAILURE_ON_UNINITIALIZED_VARIABLE,
           node,
-          [node.name.name],
+          [node.name2.lexeme],
         );
       }
       return;
@@ -70,8 +70,13 @@
       element.constantInitializer = initializer;
     }
 
-    _resolver.checkForInvalidAssignment(node.name, initializer,
-        whyNotPromoted: whyNotPromoted);
+    _resolver.checkForAssignableExpressionAtType(
+      initializer,
+      initializer.typeOrThrow,
+      element.type,
+      CompileTimeErrorCode.INVALID_ASSIGNMENT,
+      whyNotPromoted: whyNotPromoted,
+    );
   }
 
   void _setInferredType(VariableElement element, DartType initializerType) {
diff --git a/pkg/analyzer/lib/src/diagnostic/diagnostic_factory.dart b/pkg/analyzer/lib/src/diagnostic/diagnostic_factory.dart
index 9726e9f..d3dfb14 100644
--- a/pkg/analyzer/lib/src/diagnostic/diagnostic_factory.dart
+++ b/pkg/analyzer/lib/src/diagnostic/diagnostic_factory.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/diagnostic/diagnostic.dart';
@@ -74,19 +75,19 @@
   AnalysisError invalidOverride(
       Source source,
       ErrorCode? errorCode,
-      AstNode errorNode,
+      SyntacticEntity errorNode,
       ExecutableElement member,
       ExecutableElement superMember) {
     errorCode ??= CompileTimeErrorCode.INVALID_OVERRIDE;
     // Elements enclosing members that can participate in overrides are always
-    // named, so we can safely assume `_thisMember.enclosingElement2.name` and
-    // `superMember.enclosingElement2.name` are non-`null`.
+    // named, so we can safely assume `_thisMember.enclosingElement3.name` and
+    // `superMember.enclosingElement3.name` are non-`null`.
     return AnalysisError(
         source, errorNode.offset, errorNode.length, errorCode, [
       member.name,
-      member.enclosingElement2.name!,
+      member.enclosingElement3.name!,
       member.type,
-      superMember.enclosingElement2.name!,
+      superMember.enclosingElement3.name!,
       superMember.type,
     ], [
       // Only include the context location for INVALID_OVERRIDE because for
diff --git a/pkg/analyzer/lib/src/error/assignment_verifier.dart b/pkg/analyzer/lib/src/error/assignment_verifier.dart
index 4e7b029..9cef247 100644
--- a/pkg/analyzer/lib/src/error/assignment_verifier.dart
+++ b/pkg/analyzer/lib/src/error/assignment_verifier.dart
@@ -91,7 +91,7 @@
         _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.ASSIGNMENT_TO_FINAL_NO_SETTER,
           node,
-          [variable.name, variable.enclosingElement2.displayName],
+          [variable.name, variable.enclosingElement3.displayName],
         );
       } else {
         _errorReporter.reportErrorForNode(
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index a1b430c..8b3e2ad 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -171,7 +171,7 @@
           }
         }
       } else if (parent is ConstructorDeclaration) {
-        var class_ = parent.declaredElement!.enclosingElement2;
+        var class_ = parent.declaredElement!.enclosingElement3;
         if (class_.isPrivate || (parentElement?.isPrivate ?? false)) {
           _errorReporter.reportErrorForNode(
               HintCode.INVALID_INTERNAL_ANNOTATION, node, []);
@@ -301,9 +301,9 @@
       if (undefinedParam != null) {
         String? name;
         if (parent is FunctionDeclaration) {
-          name = parent.name.name;
+          name = parent.name2.lexeme;
         } else if (parent is MethodDeclaration) {
-          name = parent.name.name;
+          name = parent.name2.lexeme;
         }
         if (name != null) {
           var paramName = undefinedParam is SimpleStringLiteral
@@ -323,7 +323,7 @@
         var invokedElement = element.element!;
         var name = invokedElement.name;
         if (invokedElement is ConstructorElement) {
-          var className = invokedElement.enclosingElement2.name;
+          var className = invokedElement.enclosingElement3.name;
           if (name!.isEmpty) {
             name = className;
           } else {
@@ -471,7 +471,7 @@
           final element = field.declaredElement;
           if (element is PropertyAccessorElement || element is FieldElement) {
             Name name = Name(_currentLibrary.source.uri, element!.name);
-            Element enclosingElement = element.enclosingElement2!;
+            Element enclosingElement = element.enclosingElement3!;
             if (enclosingElement is ClassElement) {
               var overridden = _inheritanceManager
                   .getMember2(enclosingElement, name, forSuper: true);
@@ -493,11 +493,11 @@
             _hasNonVirtualAnnotation(overriddenElement)) {
           // Overridden members are always inside classes or mixins, which are
           // always named, so we can safely assume
-          // `overriddenElement.enclosingElement2.name` is non-`null`.
-          _errorReporter.reportErrorForNode(
-              HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, field.name, [
-            field.name.name,
-            overriddenElement.enclosingElement2.displayName
+          // `overriddenElement.enclosingElement3.name` is non-`null`.
+          _errorReporter.reportErrorForToken(
+              HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, field.name2, [
+            field.name2.lexeme,
+            overriddenElement.enclosingElement3.displayName
           ]);
         }
         if (!_invalidAccessVerifier._inTestDirectory) {
@@ -534,7 +534,8 @@
 
       // Return types are inferred only on non-recursive local functions.
       if (node.parent is CompilationUnit && !node.isSetter) {
-        _checkStrictInferenceReturnType(node.returnType, node, node.name.name);
+        _checkStrictInferenceReturnType(
+            node.returnType, node, node.name2.lexeme);
       }
       _checkStrictInferenceInParameters(node.functionExpression.parameters,
           body: node.functionExpression.body);
@@ -571,15 +572,14 @@
 
   @override
   void visitFunctionTypeAlias(FunctionTypeAlias node) {
-    _checkStrictInferenceReturnType(node.returnType, node, node.name.name);
+    _checkStrictInferenceReturnType(node.returnType, node, node.name2.lexeme);
     _checkStrictInferenceInParameters(node.parameters);
     super.visitFunctionTypeAlias(node);
   }
 
   @override
   void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
-    _checkStrictInferenceReturnType(
-        node.returnType, node, node.identifier.name);
+    _checkStrictInferenceReturnType(node.returnType, node, node.name.lexeme);
     _checkStrictInferenceInParameters(node.parameters);
     super.visitFunctionTypedFormalParameter(node);
   }
@@ -598,7 +598,7 @@
   void visitGenericTypeAlias(GenericTypeAlias node) {
     if (node.functionType != null) {
       _checkStrictInferenceReturnType(
-          node.functionType!.returnType, node, node.name.name);
+          node.functionType!.returnType, node, node.name2.lexeme);
     }
     super.visitGenericTypeAlias(node);
   }
@@ -640,7 +640,7 @@
   void visitMethodDeclaration(MethodDeclaration node) {
     bool wasInDoNotStoreMember = _inDoNotStoreMember;
     var element = node.declaredElement!;
-    var enclosingElement = element.enclosingElement2;
+    var enclosingElement = element.enclosingElement3;
 
     Name name = Name(_currentLibrary.source.uri, element.name);
 
@@ -672,7 +672,8 @@
           : false;
 
       if (!node.isSetter && !elementIsOverride) {
-        _checkStrictInferenceReturnType(node.returnType, node, node.name.name);
+        _checkStrictInferenceReturnType(
+            node.returnType, node, node.name2.lexeme);
       }
       if (!elementIsOverride) {
         _checkStrictInferenceInParameters(node.parameters, body: node.body);
@@ -687,11 +688,12 @@
           _hasNonVirtualAnnotation(overriddenElement)) {
         // Overridden members are always inside classes or mixins, which are
         // always named, so we can safely assume
-        // `overriddenElement.enclosingElement2.name` is non-`null`.
-        _errorReporter.reportErrorForNode(
-            HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER,
-            node.name,
-            [node.name.name, overriddenElement.enclosingElement2.displayName]);
+        // `overriddenElement.enclosingElement3.name` is non-`null`.
+        _errorReporter.reportErrorForToken(
+            HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, node.name2, [
+          node.name2.lexeme,
+          overriddenElement.enclosingElement3.displayName
+        ]);
       }
 
       super.visitMethodDeclaration(node);
@@ -1051,8 +1053,8 @@
           definedOrInheritedNonFinalInstanceFields(
               element, HashSet<ClassElement>());
       if (nonFinalFields.isNotEmpty) {
-        _errorReporter.reportErrorForNode(
-            HintCode.MUST_BE_IMMUTABLE, node.name, [nonFinalFields.join(', ')]);
+        _errorReporter.reportErrorForToken(HintCode.MUST_BE_IMMUTABLE,
+            node.name2, [nonFinalFields.join(', ')]);
       }
     }
   }
@@ -1124,8 +1126,8 @@
     // Note that null return types are expected to be flagged by other analyses.
     var returnType = decl.returnType?.type;
     if (returnType is VoidType) {
-      _errorReporter.reportErrorForNode(HintCode.INVALID_FACTORY_METHOD_DECL,
-          decl.name, [decl.name.toString()]);
+      _errorReporter.reportErrorForToken(HintCode.INVALID_FACTORY_METHOD_DECL,
+          decl.name2, [decl.name2.lexeme]);
       return;
     }
 
@@ -1153,8 +1155,8 @@
       }
     }
 
-    _errorReporter.reportErrorForNode(HintCode.INVALID_FACTORY_METHOD_IMPL,
-        decl.name, [decl.name.toString()]);
+    _errorReporter.reportErrorForToken(
+        HintCode.INVALID_FACTORY_METHOD_IMPL, decl.name2, [decl.name2.lexeme]);
   }
 
   void _checkForInvalidSealedSuperclass(NamedCompilationUnitMember node) {
@@ -1314,18 +1316,25 @@
       return;
     }
 
-    var errorNode = functionNode;
     if (functionNode is FunctionDeclaration) {
-      errorNode = functionNode.name;
+      _errorReporter.reportErrorForToken(
+        HintCode.MISSING_RETURN,
+        functionNode.name2,
+        [returnType],
+      );
     } else if (functionNode is MethodDeclaration) {
-      errorNode = functionNode.name;
+      _errorReporter.reportErrorForToken(
+        HintCode.MISSING_RETURN,
+        functionNode.name2,
+        [returnType],
+      );
+    } else {
+      _errorReporter.reportErrorForNode(
+        HintCode.MISSING_RETURN,
+        functionNode,
+        [returnType],
+      );
     }
-
-    _errorReporter.reportErrorForNode(
-      HintCode.MISSING_RETURN,
-      errorNode,
-      [returnType],
-    );
   }
 
   void _checkForNullableTypeInCatchClause(CatchClause node) {
@@ -1451,7 +1460,7 @@
   ///
   /// Return `true` if and only if a hint code is generated on the passed node.
   bool _checkForUnnecessaryNoSuchMethod(MethodDeclaration node) {
-    if (node.name.name != FunctionElement.NO_SUCH_METHOD_METHOD_NAME) {
+    if (node.name2.lexeme != FunctionElement.NO_SUCH_METHOD_METHOD_NAME) {
       return false;
     }
     bool isNonObjectNoSuchMethodInvocation(Expression? invocation) {
@@ -1461,7 +1470,7 @@
         SimpleIdentifier name = invocation.methodName;
         if (name.name == FunctionElement.NO_SUCH_METHOD_METHOD_NAME) {
           var methodElement = name.staticElement;
-          var classElement = methodElement?.enclosingElement2;
+          var classElement = methodElement?.enclosingElement3;
           return methodElement is MethodElement &&
               classElement is ClassElement &&
               !classElement.isDartCoreObject;
@@ -1473,8 +1482,8 @@
     FunctionBody body = node.body;
     if (body is ExpressionFunctionBody) {
       if (isNonObjectNoSuchMethodInvocation(body.expression)) {
-        _errorReporter.reportErrorForNode(
-            HintCode.UNNECESSARY_NO_SUCH_METHOD, node.name);
+        _errorReporter.reportErrorForToken(
+            HintCode.UNNECESSARY_NO_SUCH_METHOD, node.name2);
         return true;
       }
     } else if (body is BlockFunctionBody) {
@@ -1483,8 +1492,8 @@
         Statement returnStatement = statements.first;
         if (returnStatement is ReturnStatement &&
             isNonObjectNoSuchMethodInvocation(returnStatement.expression)) {
-          _errorReporter.reportErrorForNode(
-              HintCode.UNNECESSARY_NO_SUCH_METHOD, node.name);
+          _errorReporter.reportErrorForToken(
+              HintCode.UNNECESSARY_NO_SUCH_METHOD, node.name2);
           return true;
         }
       }
@@ -1611,7 +1620,7 @@
 
       for (var param in parameterList.parameters) {
         // Param is defined.
-        if (param.identifier?.name == unlessParam) {
+        if (param.name?.lexeme == unlessParam) {
           return null;
         }
       }
@@ -1804,8 +1813,7 @@
   }
 
   static String _formalParameterNameOrEmpty(FormalParameter node) {
-    var identifier = node.identifier;
-    return identifier?.name ?? '';
+    return node.name?.lexeme ?? '';
   }
 
   static bool _hasNonVirtualAnnotation(ExecutableElement element) {
@@ -1901,7 +1909,7 @@
 
       if (node.leftOperand is SuperExpression) {
         var methodDeclaration = node.thisOrAncestorOfType<MethodDeclaration>();
-        if (methodDeclaration?.name.name == operator.lexeme) {
+        if (methodDeclaration?.name2.lexeme == operator.lexeme) {
           return;
         }
       }
@@ -1965,7 +1973,7 @@
       SimpleIdentifier identifier, Element element) {
     bool hasProtected = _hasProtected(element);
     if (hasProtected) {
-      var definingClass = element.enclosingElement2 as ClassElement;
+      var definingClass = element.enclosingElement3 as ClassElement;
       if (_hasTypeOrSuperType(_enclosingClass, definingClass)) {
         return;
       }
@@ -2004,7 +2012,7 @@
       node = identifier;
     }
 
-    var definingClass = element.enclosingElement2;
+    var definingClass = element.enclosingElement3;
     if (hasProtected) {
       _errorReporter.reportErrorForNode(
           HintCode.INVALID_USE_OF_PROTECTED_MEMBER,
@@ -2032,7 +2040,7 @@
           parent is PropertyAccess && parent.target is SuperExpression) {
         var methodDeclaration =
             grandparent?.thisOrAncestorOfType<MethodDeclaration>();
-        if (methodDeclaration?.name.name == identifier.name) {
+        if (methodDeclaration?.name2.lexeme == identifier.name) {
           validOverride = true;
         }
       }
@@ -2060,12 +2068,12 @@
 
   bool _hasProtected(Element element) {
     if (element is PropertyAccessorElement &&
-        element.enclosingElement2 is ClassElement &&
+        element.enclosingElement3 is ClassElement &&
         (element.hasProtected || element.variable.hasProtected)) {
       return true;
     }
     if (element is MethodElement &&
-        element.enclosingElement2 is ClassElement &&
+        element.enclosingElement3 is ClassElement &&
         element.hasProtected) {
       return true;
     }
diff --git a/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart b/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart
index 42d4dde..13fe69c 100644
--- a/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart
+++ b/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart
@@ -234,10 +234,10 @@
           _fieldMap[fieldElement] = _InitState.initInFieldFormal;
         } else if (state == _InitState.initInDeclaration) {
           if (fieldElement.isFinal || fieldElement.isConst) {
-            _errorReporter.reportErrorForNode(
+            _errorReporter.reportErrorForToken(
               CompileTimeErrorCode
                   .FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR,
-              parameter.identifier,
+              parameter.name,
               [fieldElement.displayName],
             );
           }
diff --git a/pkg/analyzer/lib/src/error/correct_override.dart b/pkg/analyzer/lib/src/error/correct_override.dart
index 609bc46..82b95dd 100644
--- a/pkg/analyzer/lib/src/error/correct_override.dart
+++ b/pkg/analyzer/lib/src/error/correct_override.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
@@ -50,7 +50,7 @@
   void verify({
     required ExecutableElement superMember,
     required ErrorReporter errorReporter,
-    required AstNode errorNode,
+    required SyntacticEntity errorNode,
     ErrorCode? errorCode,
   }) {
     var isCorrect = isCorrectOverrideOf(superMember: superMember);
@@ -110,7 +110,7 @@
 
   void verify({
     required ErrorReporter errorReporter,
-    required AstNode errorNode,
+    required SyntacticEntity errorNode,
   }) {
     var superParameters = _superParameters();
     for (var entry in superParameters.entries) {
@@ -123,16 +123,17 @@
           var superMember = superParameter.member;
           // Elements enclosing members that can participate in overrides are
           // always named, so we can safely assume
-          // `_thisMember.enclosingElement2.name` and
-          // `superMember.enclosingElement2.name` are non-`null`.
-          errorReporter.reportErrorForNode(
+          // `_thisMember.enclosingElement3.name` and
+          // `superMember.enclosingElement3.name` are non-`null`.
+          errorReporter.reportErrorForOffset(
             CompileTimeErrorCode.INVALID_OVERRIDE,
-            errorNode,
+            errorNode.offset,
+            errorNode.length,
             [
               _thisMember.name,
-              _thisMember.enclosingElement2.name!,
+              _thisMember.enclosingElement3.name!,
               _thisMember.type,
-              superMember.enclosingElement2.name!,
+              superMember.enclosingElement3.name!,
               superMember.type,
             ],
           );
@@ -143,7 +144,7 @@
 
   List<_SuperMember> _superMembers() {
     var classHierarchy = _session.classHierarchy;
-    var classElement = _thisMember.enclosingElement2 as ClassElement;
+    var classElement = _thisMember.enclosingElement3 as ClassElement;
     var interfaces = classHierarchy.implementedInterfaces(classElement);
 
     var superMembers = <_SuperMember>[];
@@ -272,5 +273,5 @@
   _SuperParameter(this.element, this.type);
 
   ExecutableElement get member =>
-      element.enclosingElement2 as ExecutableElement;
+      element.enclosingElement3 as ExecutableElement;
 }
diff --git a/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
index 954b777..a3aed31 100644
--- a/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
+++ b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
@@ -169,7 +169,7 @@
       // TODO(jwren) We should modify ConstructorElement.getDisplayName(),
       // or have the logic centralized elsewhere, instead of doing this logic
       // here.
-      displayName = element.enclosingElement2.displayName;
+      displayName = element.enclosingElement3.displayName;
       if (element.displayName.isNotEmpty) {
         displayName = "$displayName.${element.displayName}";
       }
@@ -268,7 +268,7 @@
   /// Return `true` if [element] is a [ParameterElement] declared in [node].
   static bool _isLocalParameter(Element? element, AstNode? node) {
     if (element is ParameterElement) {
-      var definingFunction = element.enclosingElement2 as ExecutableElement;
+      var definingFunction = element.enclosingElement3 as ExecutableElement;
 
       for (; node != null; node = node.parent) {
         if (node is ConstructorDeclaration) {
diff --git a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
index 58db0cd..3afd901 100644
--- a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
+++ b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
@@ -5,6 +5,7 @@
 import 'dart:collection';
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
@@ -54,8 +55,9 @@
     var staticSetters = <String, Element>{};
 
     for (EnumConstantDeclaration constant in node.constants) {
-      _checkDuplicateIdentifier(staticGetters, constant.name);
-      _checkValuesDeclarationInEnum(constant.name);
+      _checkDuplicateIdentifier(staticGetters, constant.name2,
+          element: constant.declaredElement!);
+      _checkValuesDeclarationInEnum(constant.name2);
     }
 
     for (var member in node.members) {
@@ -79,10 +81,11 @@
         }
       } else if (member is FieldDeclaration) {
         for (var field in member.fields.variables) {
-          var identifier = field.name;
+          var identifier = field.name2;
           _checkDuplicateIdentifier(
             member.isStatic ? staticGetters : instanceGetters,
             identifier,
+            element: field.declaredElement!,
             setterScope: member.isStatic ? staticSetters : instanceSetters,
           );
           _checkValuesDeclarationInEnum(identifier);
@@ -90,27 +93,28 @@
       } else if (member is MethodDeclaration) {
         _checkDuplicateIdentifier(
           member.isStatic ? staticGetters : instanceGetters,
-          member.name,
+          member.name2,
+          element: member.declaredElement!,
           setterScope: member.isStatic ? staticSetters : instanceSetters,
         );
         if (!(member.isStatic && member.isSetter)) {
-          _checkValuesDeclarationInEnum(member.name);
+          _checkValuesDeclarationInEnum2(member.name2);
         }
       }
     }
 
     if (enumName == 'values') {
-      _errorReporter.reportErrorForNode(
+      _errorReporter.reportErrorForToken(
         CompileTimeErrorCode.ENUM_WITH_NAME_VALUES,
-        node.name,
+        node.name2,
       );
     }
 
     for (var constant in node.constants) {
-      if (constant.name.name == enumName) {
-        _errorReporter.reportErrorForNode(
+      if (constant.name2.lexeme == enumName) {
+        _errorReporter.reportErrorForToken(
           CompileTimeErrorCode.ENUM_CONSTANT_SAME_NAME_AS_ENCLOSING,
-          constant.name,
+          constant.name2,
         );
       }
     }
@@ -141,7 +145,7 @@
             [
               enumElement.displayName,
               baseName,
-              inherited.enclosingElement2.displayName,
+              inherited.enclosingElement3.displayName,
             ],
           );
         }
@@ -168,7 +172,7 @@
             [
               enumElement.displayName,
               baseName,
-              inherited.enclosingElement2.displayName,
+              inherited.enclosingElement3.displayName,
             ],
           );
         }
@@ -186,17 +190,19 @@
     for (var member in node.members) {
       if (member is FieldDeclaration) {
         for (var field in member.fields.variables) {
-          var identifier = field.name;
+          var identifier = field.name2;
           _checkDuplicateIdentifier(
             member.isStatic ? staticGetters : instanceGetters,
             identifier,
+            element: field.declaredElement!,
             setterScope: member.isStatic ? staticSetters : instanceSetters,
           );
         }
       } else if (member is MethodDeclaration) {
         _checkDuplicateIdentifier(
           member.isStatic ? staticGetters : instanceGetters,
-          member.name,
+          member.name2,
+          element: member.declaredElement!,
           setterScope: member.isStatic ? staticSetters : instanceSetters,
         );
       }
@@ -207,11 +213,11 @@
       if (member is FieldDeclaration) {
         if (member.isStatic) {
           for (var field in member.fields.variables) {
-            var identifier = field.name;
-            var name = identifier.name;
+            var identifier = field.name2;
+            var name = identifier.lexeme;
             if (instanceGetters.containsKey(name) ||
                 instanceSetters.containsKey(name)) {
-              _errorReporter.reportErrorForNode(
+              _errorReporter.reportErrorForToken(
                 CompileTimeErrorCode.EXTENSION_CONFLICTING_STATIC_AND_INSTANCE,
                 identifier,
                 [name],
@@ -221,11 +227,11 @@
         }
       } else if (member is MethodDeclaration) {
         if (member.isStatic) {
-          var identifier = member.name;
-          var name = identifier.name;
+          var identifier = member.name2;
+          var name = identifier.lexeme;
           if (instanceGetters.containsKey(name) ||
               instanceSetters.containsKey(name)) {
-            _errorReporter.reportErrorForNode(
+            _errorReporter.reportErrorForToken(
               CompileTimeErrorCode.EXTENSION_CONFLICTING_STATIC_AND_INSTANCE,
               identifier,
               [name],
@@ -241,7 +247,8 @@
   void checkForVariables(VariableDeclarationList node) {
     Map<String, Element> definedNames = HashMap<String, Element>();
     for (VariableDeclaration variable in node.variables) {
-      _checkDuplicateIdentifier(definedNames, variable.name);
+      _checkDuplicateIdentifier(definedNames, variable.name2,
+          element: variable.declaredElement!);
     }
   }
 
@@ -253,11 +260,12 @@
   void checkParameters(FormalParameterList node) {
     Map<String, Element> definedNames = HashMap<String, Element>();
     for (FormalParameter parameter in node.parameters) {
-      var identifier = parameter.identifier;
+      var identifier = parameter.name;
       if (identifier != null) {
         // The identifier can be null if this is a parameter list for a generic
         // function type.
-        _checkDuplicateIdentifier(definedNames, identifier);
+        _checkDuplicateIdentifier(definedNames, identifier,
+            element: parameter.declaredElement!);
       }
     }
   }
@@ -268,11 +276,15 @@
     for (Statement statement in statements) {
       if (statement is VariableDeclarationStatement) {
         for (VariableDeclaration variable in statement.variables.variables) {
-          _checkDuplicateIdentifier(definedNames, variable.name);
+          _checkDuplicateIdentifier(definedNames, variable.name2,
+              element: variable.declaredElement!);
         }
       } else if (statement is FunctionDeclarationStatement) {
         _checkDuplicateIdentifier(
-            definedNames, statement.functionDeclaration.name);
+          definedNames,
+          statement.functionDeclaration.name2,
+          element: statement.functionDeclaration.declaredElement!,
+        );
       }
     }
   }
@@ -281,7 +293,8 @@
   void checkTypeParameters(TypeParameterList node) {
     Map<String, Element> definedNames = HashMap<String, Element>();
     for (TypeParameter parameter in node.typeParameters) {
-      _checkDuplicateIdentifier(definedNames, parameter.name);
+      _checkDuplicateIdentifier(definedNames, parameter.name2,
+          element: parameter.declaredElement!);
     }
   }
 
@@ -336,18 +349,18 @@
     }
     for (CompilationUnitMember member in node.declarations) {
       if (member is ExtensionDeclaration) {
-        var identifier = member.name;
+        var identifier = member.name2;
         if (identifier != null) {
           _checkDuplicateIdentifier(definedGetters, identifier,
-              setterScope: definedSetters);
+              element: member.declaredElement!, setterScope: definedSetters);
         }
       } else if (member is NamedCompilationUnitMember) {
-        _checkDuplicateIdentifier(definedGetters, member.name,
-            setterScope: definedSetters);
+        _checkDuplicateIdentifier(definedGetters, member.name2,
+            element: member.declaredElement!, setterScope: definedSetters);
       } else if (member is TopLevelVariableDeclaration) {
         for (VariableDeclaration variable in member.variables.variables) {
-          _checkDuplicateIdentifier(definedGetters, variable.name,
-              setterScope: definedSetters);
+          _checkDuplicateIdentifier(definedGetters, variable.name2,
+              element: variable.declaredElement!, setterScope: definedSetters);
         }
       }
     }
@@ -367,7 +380,7 @@
           // [member] is erroneous; do not count it as a possible duplicate.
           continue;
         }
-        var name = member.name?.name ?? '';
+        var name = member.name2?.lexeme ?? '';
         if (name == 'new') {
           name = '';
         }
@@ -383,17 +396,18 @@
         }
       } else if (member is FieldDeclaration) {
         for (VariableDeclaration field in member.fields.variables) {
-          SimpleIdentifier identifier = field.name;
           _checkDuplicateIdentifier(
             member.isStatic ? staticGetters : instanceGetters,
-            identifier,
+            field.name2,
+            element: field.declaredElement!,
             setterScope: member.isStatic ? staticSetters : instanceSetters,
           );
         }
       } else if (member is MethodDeclaration) {
         _checkDuplicateIdentifier(
           member.isStatic ? staticGetters : instanceGetters,
-          member.name,
+          member.name2,
+          element: member.declaredElement!,
           setterScope: member.isStatic ? staticSetters : instanceSetters,
         );
       }
@@ -412,12 +426,12 @@
       if (member is FieldDeclaration) {
         if (member.isStatic) {
           for (VariableDeclaration field in member.fields.variables) {
-            SimpleIdentifier identifier = field.name;
-            String name = identifier.name;
+            final identifier = field.name2;
+            String name = identifier.lexeme;
             if (instanceGetters.containsKey(name) ||
                 instanceSetters.containsKey(name)) {
               String className = element.displayName;
-              _errorReporter.reportErrorForNode(
+              _errorReporter.reportErrorForToken(
                   CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE,
                   identifier,
                   [className, name, className]);
@@ -426,12 +440,12 @@
         }
       } else if (member is MethodDeclaration) {
         if (member.isStatic) {
-          SimpleIdentifier identifier = member.name;
-          String name = identifier.name;
+          final identifier = member.name2;
+          String name = identifier.lexeme;
           if (instanceGetters.containsKey(name) ||
               instanceSetters.containsKey(name)) {
             String className = element.name;
-            _errorReporter.reportErrorForNode(
+            _errorReporter.reportErrorForToken(
                 CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE,
                 identifier,
                 [className, name, className]);
@@ -476,20 +490,19 @@
   /// in one of the scopes - [getterScope] or [setterScope], and produce an
   /// error if it is.
   void _checkDuplicateIdentifier(
-      Map<String, Element> getterScope, SimpleIdentifier identifier,
-      {Element? element, Map<String, Element>? setterScope}) {
+      Map<String, Element> getterScope, Token identifier,
+      {required Element element, Map<String, Element>? setterScope}) {
     if (identifier.isSynthetic) {
       return;
     }
-    element ??= identifier.staticElement!;
 
     // Fields define getters and setters, so check them separately.
     if (element is PropertyInducingElement) {
       _checkDuplicateIdentifier(getterScope, identifier,
-          element: element.getter, setterScope: setterScope);
+          element: element.getter!, setterScope: setterScope);
       if (!element.isConst && !element.isFinal) {
         _checkDuplicateIdentifier(getterScope, identifier,
-            element: element.setter, setterScope: setterScope);
+            element: element.setter!, setterScope: setterScope);
       }
       return;
     }
@@ -504,7 +517,7 @@
       return CompileTimeErrorCode.DUPLICATE_DEFINITION;
     }
 
-    var name = identifier.name;
+    var name = identifier.lexeme;
     if (element is MethodElement) {
       name = element.name;
     }
@@ -512,7 +525,7 @@
     var previous = getterScope[name];
     if (previous != null) {
       if (!_isGetterSetterPair(element, previous)) {
-        _errorReporter.reportErrorForNode(
+        _errorReporter.reportErrorForToken(
           getError(previous, element),
           identifier,
           [name],
@@ -526,7 +539,7 @@
       if (element is PropertyAccessorElement && element.isSetter) {
         previous = setterScope[name];
         if (previous != null) {
-          _errorReporter.reportErrorForNode(
+          _errorReporter.reportErrorForToken(
             getError(previous, element),
             identifier,
             [name],
@@ -538,9 +551,18 @@
     }
   }
 
-  void _checkValuesDeclarationInEnum(SimpleIdentifier name) {
-    if (name.name == 'values') {
-      _errorReporter.reportErrorForNode(
+  void _checkValuesDeclarationInEnum(Token name) {
+    if (name.lexeme == 'values') {
+      _errorReporter.reportErrorForToken(
+        CompileTimeErrorCode.VALUES_DECLARATION_IN_ENUM,
+        name,
+      );
+    }
+  }
+
+  void _checkValuesDeclarationInEnum2(Token name) {
+    if (name.lexeme == 'values') {
+      _errorReporter.reportErrorForToken(
         CompileTimeErrorCode.VALUES_DECLARATION_IN_ENUM,
         name,
       );
diff --git a/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart b/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart
index 469f0f5..ba54bdc 100644
--- a/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart
+++ b/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart
@@ -53,23 +53,23 @@
           var setterType = setter.parameters[0].type;
           if (!_match(getterType, setterType)) {
             Element errorElement;
-            if (getter.enclosingElement2 == classElement) {
+            if (getter.enclosingElement3 == classElement) {
               errorElement = getter;
-            } else if (setter.enclosingElement2 == classElement) {
+            } else if (setter.enclosingElement3 == classElement) {
               errorElement = setter;
             } else {
               errorElement = classElement;
             }
 
             var getterName = getter.displayName;
-            if (getter.enclosingElement2 != classElement) {
-              var getterClassName = getter.enclosingElement2.displayName;
+            if (getter.enclosingElement3 != classElement) {
+              var getterClassName = getter.enclosingElement3.displayName;
               getterName = '$getterClassName.$getterName';
             }
 
             var setterName = setter.displayName;
-            if (setter.enclosingElement2 != classElement) {
-              var setterClassName = setter.enclosingElement2.displayName;
+            if (setter.enclosingElement3 != classElement) {
+              var setterClassName = setter.enclosingElement3.displayName;
               setterName = '$setterClassName.$setterName';
             }
 
diff --git a/pkg/analyzer/lib/src/error/imports_verifier.dart b/pkg/analyzer/lib/src/error/imports_verifier.dart
index 81adecd..7574408 100644
--- a/pkg/analyzer/lib/src/error/imports_verifier.dart
+++ b/pkg/analyzer/lib/src/error/imports_verifier.dart
@@ -94,7 +94,7 @@
 
   void _recordIfExtensionMember(Element? element) {
     if (element != null) {
-      var enclosingElement = element.enclosingElement2;
+      var enclosingElement = element.enclosingElement3;
       if (enclosingElement is ExtensionElement) {
         _recordUsedExtension(enclosingElement);
       }
@@ -165,7 +165,7 @@
     if (_recordPrefixMap(identifier, element)) {
       return;
     }
-    var enclosingElement = element.enclosingElement2;
+    var enclosingElement = element.enclosingElement3;
     if (enclosingElement is CompilationUnitElement) {
       _recordUsedElement(element);
     } else if (enclosingElement is ExtensionElement) {
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index 89c04f9..4e9bd87 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -4,6 +4,8 @@
 
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/syntactic_entity.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/constant/value.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
@@ -19,9 +21,9 @@
 import 'package:analyzer/src/error/getter_setter_types_verifier.dart';
 import 'package:analyzer/src/task/inference_error.dart';
 
-class InheritanceOverrideVerifier {
-  static const _missingOverridesKey = 'missingOverrides';
+final _missingOverrides = Expando<List<ExecutableElement>>();
 
+class InheritanceOverrideVerifier {
   final TypeSystemImpl _typeSystem;
   final TypeProvider _typeProvider;
   final InheritanceManager3 _inheritance;
@@ -43,7 +45,8 @@
           reporter: _reporter,
           featureSet: unit.featureSet,
           library: library,
-          classNameNode: declaration.name,
+          classNameToken: declaration.name2,
+          classElement: declaration.declaredElement as AbstractClassElementImpl,
           implementsClause: declaration.implementsClause,
           members: declaration.members,
           superclass: declaration.extendsClause?.superclass,
@@ -57,7 +60,8 @@
           reporter: _reporter,
           featureSet: unit.featureSet,
           library: library,
-          classNameNode: declaration.name,
+          classNameToken: declaration.name2,
+          classElement: declaration.declaredElement as AbstractClassElementImpl,
           implementsClause: declaration.implementsClause,
           superclass: declaration.superclass,
           withClause: declaration.withClause,
@@ -70,7 +74,8 @@
           reporter: _reporter,
           featureSet: unit.featureSet,
           library: library,
-          classNameNode: declaration.name,
+          classNameToken: declaration.name2,
+          classElement: declaration.declaredElement as AbstractClassElementImpl,
           implementsClause: declaration.implementsClause,
           members: declaration.members,
           withClause: declaration.withClause,
@@ -83,7 +88,8 @@
           reporter: _reporter,
           featureSet: unit.featureSet,
           library: library,
-          classNameNode: declaration.name,
+          classNameToken: declaration.name2,
+          classElement: declaration.declaredElement as AbstractClassElementImpl,
           implementsClause: declaration.implementsClause,
           members: declaration.members,
           onClause: declaration.onClause,
@@ -103,7 +109,7 @@
   /// Returns [ExecutableElement] members that are in the interface of the
   /// given class, but don't have concrete implementations.
   static List<ExecutableElement> missingOverrides(ClassDeclaration node) {
-    return node.name.getProperty(_missingOverridesKey) ?? const [];
+    return _missingOverrides[node.name2] ?? const [];
   }
 }
 
@@ -118,7 +124,7 @@
   final Uri libraryUri;
   final AbstractClassElementImpl classElement;
 
-  final SimpleIdentifier classNameNode;
+  final Token classNameToken;
   final List<ClassMember> members;
   final ImplementsClause? implementsClause;
   final OnClause? onClause;
@@ -137,14 +143,14 @@
     required this.reporter,
     required this.featureSet,
     required this.library,
-    required this.classNameNode,
+    required this.classNameToken,
+    required this.classElement,
     this.implementsClause,
     this.members = const [],
     this.onClause,
     this.superclass,
     this.withClause,
-  })  : libraryUri = library.source.uri,
-        classElement = classNameNode.staticElement as AbstractClassElementImpl;
+  }) : libraryUri = library.source.uri;
 
   bool get _isNonNullableByDefault => typeSystem.isNonNullableByDefault;
 
@@ -158,9 +164,9 @@
     if (!classElement.isEnum &&
         !classElement.isAbstract &&
         implementsDartCoreEnum) {
-      reporter.reportErrorForNode(
+      reporter.reportErrorForToken(
         CompileTimeErrorCode.CONCRETE_CLASS_HAS_ENUM_SUPERINTERFACE,
-        classNameNode,
+        classNameToken,
       );
       return true;
     }
@@ -174,7 +180,7 @@
 
     // Report conflicts between direct superinterfaces of the class.
     for (var conflict in interface.conflicts) {
-      _reportInconsistentInheritance(classNameNode, conflict);
+      _reportInconsistentInheritance(classNameToken, conflict);
     }
 
     if (classElement.supertype != null) {
@@ -206,13 +212,13 @@
         var fieldList = member.fields;
         for (var field in fieldList.variables) {
           var fieldElement = field.declaredElement as FieldElement;
-          _checkDeclaredMember(field.name, libraryUri, fieldElement.getter);
-          _checkDeclaredMember(field.name, libraryUri, fieldElement.setter);
+          _checkDeclaredMember(field.name2, libraryUri, fieldElement.getter);
+          _checkDeclaredMember(field.name2, libraryUri, fieldElement.setter);
           if (!member.isStatic && !classElement.isEnum) {
-            _checkIllegalEnumValuesDeclaration(field.name);
+            _checkIllegalEnumValuesDeclaration(field.name2);
           }
           if (!member.isStatic) {
-            _checkIllegalConcreteEnumMemberDeclaration(field.name);
+            _checkIllegalConcreteEnumMemberDeclaration(field.name2);
           }
         }
       } else if (member is MethodDeclaration) {
@@ -221,13 +227,13 @@
           continue;
         }
 
-        _checkDeclaredMember(member.name, libraryUri, member.declaredElement,
+        _checkDeclaredMember(member.name2, libraryUri, member.declaredElement,
             methodParameterNodes: member.parameters?.parameters);
         if (!(member.isStatic || member.isAbstract || member.isSetter)) {
-          _checkIllegalConcreteEnumMemberDeclaration(member.name);
+          _checkIllegalConcreteEnumMemberDeclaration(member.name2);
         }
         if (!member.isStatic && !classElement.isEnum) {
-          _checkIllegalEnumValuesDeclaration(member.name);
+          _checkIllegalEnumValuesDeclaration(member.name2);
         }
       }
     }
@@ -293,7 +299,7 @@
         ).verify(
           superMember: interfaceElement,
           errorReporter: reporter,
-          errorNode: classNameNode,
+          errorNode: classNameToken,
           errorCode: CompileTimeErrorCode.INVALID_IMPLEMENTATION_OVERRIDE,
         );
       }
@@ -308,7 +314,7 @@
   /// instance members in each of [directSuperInterfaces].  The [libraryUri] is
   /// the URI of the library containing the [member].
   void _checkDeclaredMember(
-    AstNode node,
+    SyntacticEntity node,
     Uri libraryUri,
     ExecutableElement? member, {
     List<FormalParameter>? methodParameterNodes,
@@ -542,7 +548,7 @@
                     .INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED,
                 derivedOptionalNodes[i],
                 [
-                  baseExecutable.enclosingElement2.displayName,
+                  baseExecutable.enclosingElement3.displayName,
                   baseExecutable.displayName,
                   name
                 ],
@@ -571,7 +577,7 @@
                   .INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL,
               derivedOptionalNodes[i],
               [
-                baseExecutable.enclosingElement2.displayName,
+                baseExecutable.enclosingElement3.displayName,
                 baseExecutable.displayName
               ],
             );
@@ -659,14 +665,14 @@
     return false;
   }
 
-  void _checkIllegalConcreteEnumMemberDeclaration(SimpleIdentifier name) {
+  void _checkIllegalConcreteEnumMemberDeclaration(Token name) {
     if (implementsDartCoreEnum &&
         !classElement.isDartCoreEnumImpl &&
-        const {'index', 'hashCode', '=='}.contains(name.name)) {
-      reporter.reportErrorForNode(
+        const {'index', 'hashCode', '=='}.contains(name.lexeme)) {
+      reporter.reportErrorForToken(
         CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION,
         name,
-        [name.name],
+        [name.lexeme],
       );
     }
   }
@@ -688,11 +694,11 @@
       ) {
         var member = concreteMap[Name(libraryUri, memberName)];
         if (member != null) {
-          var enclosingClass = member.enclosingElement2;
+          var enclosingClass = member.enclosingElement3;
           if (enclosingClass is ClassElement && filter(enclosingClass)) {
-            reporter.reportErrorForNode(
+            reporter.reportErrorForToken(
               CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_INHERITANCE,
-              classNameNode,
+              classNameToken,
               [memberName, enclosingClass.name],
             );
           }
@@ -705,9 +711,9 @@
     }
   }
 
-  void _checkIllegalEnumValuesDeclaration(SimpleIdentifier name) {
-    if (implementsDartCoreEnum && name.name == 'values') {
-      reporter.reportErrorForNode(
+  void _checkIllegalEnumValuesDeclaration(Token name) {
+    if (implementsDartCoreEnum && name.lexeme == 'values') {
+      reporter.reportErrorForToken(
         CompileTimeErrorCode.ILLEGAL_ENUM_VALUES_DECLARATION,
         name,
       );
@@ -726,10 +732,10 @@
       );
       var inherited = getter ?? setter;
       if (inherited != null) {
-        reporter.reportErrorForNode(
+        reporter.reportErrorForToken(
           CompileTimeErrorCode.ILLEGAL_ENUM_VALUES_INHERITANCE,
-          classNameNode,
-          [inherited.enclosingElement2.name!],
+          classNameToken,
+          [inherited.enclosingElement3.name!],
         );
       }
     }
@@ -780,7 +786,7 @@
 
     for (var member in members) {
       if (member is MethodDeclaration) {
-        var displayName = member.name.name;
+        var displayName = member.name2.lexeme;
         var name2 = displayName;
         if (member.isSetter) {
           name2 += '=';
@@ -788,10 +794,10 @@
         if (checkMemberNameCombo(member, name2, displayName)) return true;
       } else if (member is FieldDeclaration) {
         for (var variableDeclaration in member.fields.variables) {
-          var name2 = variableDeclaration.name.name;
-          if (checkMemberNameCombo(member, name2, name2)) return true;
+          var name = variableDeclaration.name2.lexeme;
+          if (checkMemberNameCombo(member, name, name)) return true;
           if (!variableDeclaration.isFinal) {
-            if (checkMemberNameCombo(member, '$name2=', name2)) return true;
+            if (checkMemberNameCombo(member, '$name=', name)) return true;
           }
         }
       }
@@ -799,35 +805,35 @@
     return false;
   }
 
-  void _reportInconsistentInheritance(AstNode node, Conflict conflict) {
+  void _reportInconsistentInheritance(Token token, Conflict conflict) {
     var name = conflict.name;
 
     if (conflict is GetterMethodConflict) {
       // Members that participate in inheritance are always enclosed in named
       // elements so it is safe to assume that
-      // `conflict.getter.enclosingElement2.name` and
-      // `conflict.method.enclosingElement2.name` are both non-`null`.
-      reporter.reportErrorForNode(
+      // `conflict.getter.enclosingElement3.name` and
+      // `conflict.method.enclosingElement3.name` are both non-`null`.
+      reporter.reportErrorForToken(
         CompileTimeErrorCode.INCONSISTENT_INHERITANCE_GETTER_AND_METHOD,
-        node,
+        token,
         [
           name.name,
-          conflict.getter.enclosingElement2.name!,
-          conflict.method.enclosingElement2.name!
+          conflict.getter.enclosingElement3.name!,
+          conflict.method.enclosingElement3.name!
         ],
       );
     } else if (conflict is CandidatesConflict) {
       var candidatesStr = conflict.candidates.map((candidate) {
-        var className = candidate.enclosingElement2.name;
+        var className = candidate.enclosingElement3.name;
         var typeStr = candidate.type.getDisplayString(
           withNullability: _isNonNullableByDefault,
         );
         return '$className.${name.name} ($typeStr)';
       }).join(', ');
 
-      reporter.reportErrorForNode(
+      reporter.reportErrorForToken(
         CompileTimeErrorCode.INCONSISTENT_INHERITANCE,
-        node,
+        token,
         [name.name, candidatesStr],
       );
     } else {
@@ -840,10 +846,7 @@
       return;
     }
 
-    classNameNode.setProperty(
-      InheritanceOverrideVerifier._missingOverridesKey,
-      elements,
-    );
+    _missingOverrides[classNameToken] = elements;
 
     var descriptions = <String>[];
     for (ExecutableElement element in elements) {
@@ -857,7 +860,7 @@
       }
 
       var elementName = element.displayName;
-      var enclosingElement = element.enclosingElement2;
+      var enclosingElement = element.enclosingElement3;
       var enclosingName = enclosingElement.displayName;
       var description = "$prefix$enclosingName.$elementName";
 
@@ -866,34 +869,34 @@
     descriptions.sort();
 
     if (descriptions.length == 1) {
-      reporter.reportErrorForNode(
+      reporter.reportErrorForToken(
         CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-        classNameNode,
+        classNameToken,
         [descriptions[0]],
       );
     } else if (descriptions.length == 2) {
-      reporter.reportErrorForNode(
+      reporter.reportErrorForToken(
         CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO,
-        classNameNode,
+        classNameToken,
         [descriptions[0], descriptions[1]],
       );
     } else if (descriptions.length == 3) {
-      reporter.reportErrorForNode(
+      reporter.reportErrorForToken(
         CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE,
-        classNameNode,
+        classNameToken,
         [descriptions[0], descriptions[1], descriptions[2]],
       );
     } else if (descriptions.length == 4) {
-      reporter.reportErrorForNode(
+      reporter.reportErrorForToken(
         CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR,
-        classNameNode,
+        classNameToken,
         [descriptions[0], descriptions[1], descriptions[2], descriptions[3]],
       );
     } else {
-      reporter.reportErrorForNode(
+      reporter.reportErrorForToken(
         CompileTimeErrorCode
             .NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS,
-        classNameNode,
+        classNameToken,
         [
           descriptions[0],
           descriptions[1],
@@ -911,9 +914,9 @@
       var inferenceError = element.typeInferenceError;
       if (inferenceError?.kind ==
           TopLevelInferenceErrorKind.overrideNoCombinedSuperSignature) {
-        reporter.reportErrorForNode(
+        reporter.reportErrorForToken(
           CompileTimeErrorCode.NO_COMBINED_SUPER_SIGNATURE,
-          node.name,
+          node.name2,
           [
             classElement.name,
             inferenceError!.arguments[0],
@@ -985,21 +988,21 @@
     final namesForError = notOverriddenNames.toList();
 
     if (namesForError.length == 1) {
-      reporter.reportErrorForNode(
+      reporter.reportErrorForToken(
         HintCode.MISSING_OVERRIDE_OF_MUST_BE_OVERRIDDEN_ONE,
-        classNameNode,
+        classNameToken,
         namesForError,
       );
     } else if (namesForError.length == 2) {
-      reporter.reportErrorForNode(
+      reporter.reportErrorForToken(
         HintCode.MISSING_OVERRIDE_OF_MUST_BE_OVERRIDDEN_TWO,
-        classNameNode,
+        classNameToken,
         namesForError,
       );
     } else {
-      reporter.reportErrorForNode(
+      reporter.reportErrorForToken(
         HintCode.MISSING_OVERRIDE_OF_MUST_BE_OVERRIDDEN_THREE_PLUS,
-        classNameNode,
+        classNameToken,
         [
           namesForError[0],
           namesForError[1],
diff --git a/pkg/analyzer/lib/src/error/must_call_super_verifier.dart b/pkg/analyzer/lib/src/error/must_call_super_verifier.dart
index 3ce9a09..a248430 100644
--- a/pkg/analyzer/lib/src/error/must_call_super_verifier.dart
+++ b/pkg/analyzer/lib/src/error/must_call_super_verifier.dart
@@ -28,17 +28,17 @@
 
     if (element is MethodElement && _hasConcreteSuperMethod(element)) {
       _verifySuperIsCalled(
-          node, overridden.name, overridden.enclosingElement2.name);
+          node, overridden.name, overridden.enclosingElement3.name);
       return;
     }
 
-    var enclosingElement = element.enclosingElement2 as ClassElement;
+    var enclosingElement = element.enclosingElement3 as ClassElement;
     if (element is PropertyAccessorElement && element.isGetter) {
       var inheritedConcreteGetter = enclosingElement
           .lookUpInheritedConcreteGetter(element.name, element.library);
       if (inheritedConcreteGetter != null) {
         _verifySuperIsCalled(
-            node, overridden.name, overridden.enclosingElement2.name);
+            node, overridden.name, overridden.enclosingElement3.name);
       }
       return;
     }
@@ -53,7 +53,7 @@
         if (name.endsWith('=')) {
           name = name.substring(0, name.length - 1);
         }
-        _verifySuperIsCalled(node, name, overridden.enclosingElement2.name);
+        _verifySuperIsCalled(node, name, overridden.enclosingElement3.name);
       }
     }
   }
@@ -69,10 +69,10 @@
   ExecutableElement? _findOverriddenMemberWithMustCallSuper(
       ExecutableElement element) {
     //Element member = node.declaredElement;
-    if (element.enclosingElement2 is! ClassElement) {
+    if (element.enclosingElement3 is! ClassElement) {
       return null;
     }
-    var classElement = element.enclosingElement2 as ClassElement;
+    var classElement = element.enclosingElement3 as ClassElement;
     String name = element.name;
 
     // Walk up the type hierarchy from [classElement], ignoring direct
@@ -109,7 +109,7 @@
 
   /// Returns whether [node] overrides a concrete method.
   bool _hasConcreteSuperMethod(ExecutableElement element) {
-    var classElement = element.enclosingElement2 as ClassElement;
+    var classElement = element.enclosingElement3 as ClassElement;
     String name = element.name;
 
     if (classElement.supertype.isConcrete(name)) {
@@ -133,8 +133,8 @@
     if (!declaredElement.invokesSuperSelf) {
       // Overridable elements are always enclosed in named elements, so it is
       // safe to assume [overriddenEnclosingName] is non-`null`.
-      _errorReporter.reportErrorForNode(
-          HintCode.MUST_CALL_SUPER, node.name, [overriddenEnclosingName!]);
+      _errorReporter.reportErrorForToken(
+          HintCode.MUST_CALL_SUPER, node.name2, [overriddenEnclosingName!]);
     }
     return;
   }
diff --git a/pkg/analyzer/lib/src/error/override_verifier.dart b/pkg/analyzer/lib/src/error/override_verifier.dart
index 5a87250..e3a6fcb 100644
--- a/pkg/analyzer/lib/src/error/override_verifier.dart
+++ b/pkg/analyzer/lib/src/error/override_verifier.dart
@@ -54,9 +54,9 @@
         var setter = fieldElement.setter;
         if (setter != null && _isOverride(setter)) continue;
 
-        _errorReporter.reportErrorForNode(
+        _errorReporter.reportErrorForToken(
           HintCode.OVERRIDE_ON_NON_OVERRIDING_FIELD,
-          field.name,
+          field.name2,
         );
       }
     }
@@ -67,20 +67,20 @@
     var element = node.declaredElement!;
     if (element.hasOverride && !_isOverride(element)) {
       if (element is MethodElement) {
-        _errorReporter.reportErrorForNode(
+        _errorReporter.reportErrorForToken(
           HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD,
-          node.name,
+          node.name2,
         );
       } else if (element is PropertyAccessorElement) {
         if (element.isGetter) {
-          _errorReporter.reportErrorForNode(
+          _errorReporter.reportErrorForToken(
             HintCode.OVERRIDE_ON_NON_OVERRIDING_GETTER,
-            node.name,
+            node.name2,
           );
         } else {
-          _errorReporter.reportErrorForNode(
+          _errorReporter.reportErrorForToken(
             HintCode.OVERRIDE_ON_NON_OVERRIDING_SETTER,
-            node.name,
+            node.name2,
           );
         }
       }
diff --git a/pkg/analyzer/lib/src/error/required_parameters_verifier.dart b/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
index 03bd2ed..51cc6f1 100644
--- a/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
+++ b/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
@@ -38,7 +39,7 @@
     _check(
       parameters: node.constructorElement?.parameters,
       arguments: node.arguments?.argumentList.arguments ?? <Expression>[],
-      errorNode: node.name,
+      errorNode: node.name2,
     );
   }
 
@@ -111,7 +112,7 @@
     required List<ParameterElement>? parameters,
     ConstructorElement? enclosingConstructor,
     required List<Expression> arguments,
-    required AstNode errorNode,
+    required SyntacticEntity errorNode,
   }) {
     if (parameters == null) {
       return;
@@ -122,9 +123,10 @@
         String parameterName = parameter.name;
         if (!_containsNamedExpression(
             enclosingConstructor, arguments, parameterName)) {
-          _errorReporter.reportErrorForNode(
+          _errorReporter.reportErrorForOffset(
             CompileTimeErrorCode.MISSING_REQUIRED_ARGUMENT,
-            errorNode,
+            errorNode.offset,
+            errorNode.length,
             [parameterName],
           );
         }
@@ -137,15 +139,17 @@
               enclosingConstructor, arguments, parameterName)) {
             var reason = annotation.reason;
             if (reason != null) {
-              _errorReporter.reportErrorForNode(
+              _errorReporter.reportErrorForOffset(
                 HintCode.MISSING_REQUIRED_PARAM_WITH_DETAILS,
-                errorNode,
+                errorNode.offset,
+                errorNode.length,
                 [parameterName, reason],
               );
             } else {
-              _errorReporter.reportErrorForNode(
+              _errorReporter.reportErrorForOffset(
                 HintCode.MISSING_REQUIRED_PARAM,
-                errorNode,
+                errorNode.offset,
+                errorNode.length,
                 [parameterName],
               );
             }
diff --git a/pkg/analyzer/lib/src/error/super_formal_parameters_verifier.dart b/pkg/analyzer/lib/src/error/super_formal_parameters_verifier.dart
index 309ead0..2fcbb0c 100644
--- a/pkg/analyzer/lib/src/error/super_formal_parameters_verifier.dart
+++ b/pkg/analyzer/lib/src/error/super_formal_parameters_verifier.dart
@@ -24,10 +24,10 @@
       } else {
         result.positionalArgumentCount++;
         if (hasExplicitPositionalArguments) {
-          errorReporter?.reportErrorForNode(
+          errorReporter?.reportErrorForToken(
             CompileTimeErrorCode
                 .POSITIONAL_SUPER_FORMAL_PARAMETER_WITH_POSITIONAL_ARGUMENT,
-            parameter.identifier,
+            parameter.name,
           );
         }
       }
diff --git a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
index c2c2f51..1386d07 100644
--- a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
+++ b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
@@ -97,7 +97,7 @@
       return;
     }
 
-    var enumElement = constructorElement.enclosingElement2;
+    var enumElement = constructorElement.enclosingElement3;
     var typeParameters = enumElement.typeParameters;
 
     var typeArgumentList = node.arguments?.typeArguments;
@@ -131,9 +131,11 @@
       bound = substitution.substituteType(bound);
 
       if (!_typeSystem.isSubtypeOf(typeArgument, bound)) {
-        _errorReporter.reportErrorForNode(
+        final errorTarget = typeArgumentNodes?[i] ?? node.name2;
+        _errorReporter.reportErrorForOffset(
           CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
-          typeArgumentNodes?[i] ?? node.name,
+          errorTarget.offset,
+          errorTarget.length,
           [typeArgument, typeParameter.name, bound],
         );
       }
diff --git a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
index 66a2b0f..22e7a62 100644
--- a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
+++ b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
@@ -257,7 +257,7 @@
           usedElements.addElement(parameter);
         }
       }
-      var enclosingElement = element?.enclosingElement2;
+      var enclosingElement = element?.enclosingElement3;
       if (element == null) {
         if (isIdentifierRead) {
           usedElements.unresolvedReadMembers.add(node.name);
@@ -457,6 +457,40 @@
       : _libraryUri = library.source.uri;
 
   @override
+  void visitClassDeclaration(ClassDeclaration node) {
+    final declaredElement = node.declaredElement as ClassElement;
+    _visitClassElement(declaredElement);
+
+    super.visitClassDeclaration(node);
+  }
+
+  @override
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
+    if (node.name2 != null) {
+      final declaredElement = node.declaredElement as ConstructorElement;
+      _visitConstructorElement(declaredElement);
+    }
+
+    super.visitConstructorDeclaration(node);
+  }
+
+  @override
+  void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    final declaredElement = node.declaredElement as FieldElement;
+    _visitFieldElement(declaredElement);
+
+    super.visitEnumConstantDeclaration(node);
+  }
+
+  @override
+  void visitEnumDeclaration(EnumDeclaration node) {
+    final declaredElement = node.declaredElement as ClassElement;
+    _visitClassElement(declaredElement);
+
+    super.visitEnumDeclaration(node);
+  }
+
+  @override
   void visitFormalParameterList(FormalParameterList node) {
     for (var element in node.parameterElements) {
       if (!_isUsedElement(element!)) {
@@ -468,6 +502,54 @@
   }
 
   @override
+  void visitFunctionDeclaration(FunctionDeclaration node) {
+    final declaredElement = node.declaredElement;
+    if (declaredElement is FunctionElement) {
+      _visitFunctionElement(declaredElement);
+    } else if (declaredElement is PropertyAccessorElement) {
+      _visitPropertyAccessorElement(declaredElement);
+    }
+
+    super.visitFunctionDeclaration(node);
+  }
+
+  @override
+  void visitFunctionTypeAlias(FunctionTypeAlias node) {
+    final declaredElement = node.declaredElement as TypeAliasElement;
+    _visitTypeAliasElement(declaredElement);
+
+    super.visitFunctionTypeAlias(node);
+  }
+
+  @override
+  void visitGenericTypeAlias(GenericTypeAlias node) {
+    final declaredElement = node.declaredElement as TypeAliasElement;
+    _visitTypeAliasElement(declaredElement);
+
+    super.visitGenericTypeAlias(node);
+  }
+
+  @override
+  void visitMethodDeclaration(MethodDeclaration node) {
+    final declaredElement = node.declaredElement;
+    if (declaredElement is MethodElement) {
+      _visitMethodElement(declaredElement);
+    } else if (declaredElement is PropertyAccessorElement) {
+      _visitPropertyAccessorElement(declaredElement);
+    }
+
+    super.visitMethodDeclaration(node);
+  }
+
+  @override
+  void visitMixinDeclaration(MixinDeclaration node) {
+    final declaredElement = node.declaredElement as ClassElement;
+    _visitClassElement(declaredElement);
+
+    super.visitMixinDeclaration(node);
+  }
+
+  @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
     if (node.inDeclarationContext()) {
       var element = node.staticElement;
@@ -516,7 +598,7 @@
     if (element.isPrivate) {
       return false;
     }
-    var enclosingElement = element.enclosingElement2;
+    var enclosingElement = element.enclosingElement3;
 
     if (enclosingElement is ClassElement) {
       if (enclosingElement.isEnum) {
@@ -544,7 +626,7 @@
     bool elementIsStaticVariable =
         element is VariableElement && element.isStatic;
     if (element.isPublic) {
-      if (_isPrivateClassOrExtension(element.enclosingElement2!) &&
+      if (_isPrivateClassOrExtension(element.enclosingElement3!) &&
           elementIsStaticVariable) {
         // Public static fields of private classes, mixins, and extensions are
         // inaccessible from outside the library in which they are declared.
@@ -581,7 +663,7 @@
         element is FunctionElement && !element.isStatic) {
       // local variable or function
     } else if (element is ParameterElement) {
-      var enclosingElement = element.enclosingElement2;
+      var enclosingElement = element.enclosingElement3;
       // Only report unused parameters of constructors, methods, and functions.
       if (enclosingElement is! ConstructorElement &&
           enclosingElement is! FunctionElement &&
@@ -593,7 +675,7 @@
         return true;
       }
       if (enclosingElement is ConstructorElement &&
-          enclosingElement.enclosingElement2.typeParameters.isNotEmpty) {
+          enclosingElement.enclosingElement3.typeParameters.isNotEmpty) {
         // There is an issue matching arguments of instance creation
         // expressions for generic classes with parameters, so for now,
         // consider every parameter of a constructor of a generic class
@@ -647,7 +729,7 @@
   }
 
   Iterable<ExecutableElement> _overriddenElements(Element element) {
-    var enclosingElement = element.enclosingElement2;
+    var enclosingElement = element.enclosingElement3;
     if (enclosingElement is ClassElement) {
       Name name = Name(_libraryUri, element.name!);
       var overridden =
@@ -729,7 +811,7 @@
     // constructor in the class. A single unused, private constructor may serve
     // the purpose of preventing the class from being extended. In serving this
     // purpose, the constructor is "used."
-    if (element.enclosingElement2.constructors.length > 1 &&
+    if (element.enclosingElement3.constructors.length > 1 &&
         !_isUsedMember(element)) {
       _reportErrorForElement(
           HintCode.UNUSED_ELEMENT, element, [element.displayName]);
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index ee1e932..4523131 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -194,15 +194,15 @@
     }
   }
 
-  SimpleIdentifier? get currentDeclarationName {
+  Token? get currentDeclarationName {
     if (classDeclaration != null) {
-      return classDeclaration!.name;
+      return classDeclaration!.name2;
     } else if (mixinDeclaration != null) {
-      return mixinDeclaration!.name;
+      return mixinDeclaration!.name2;
     } else if (extensionDeclaration != null) {
-      return extensionDeclaration!.name;
+      return extensionDeclaration!.name2;
     } else {
-      return enumDeclaration!.name;
+      return enumDeclaration!.name2;
     }
   }
 
@@ -276,16 +276,16 @@
         extensionDeclaration == null);
     debugEvent("ExtensionHeader");
 
-    var typeParameters = pop() as TypeParameterList?;
+    var typeParameters = pop() as TypeParameterListImpl?;
     var metadata = pop() as List<Annotation>?;
     var comment = _findComment(metadata, extensionKeyword);
 
-    SimpleIdentifier? name;
+    SimpleIdentifierImpl? name;
     if (nameToken != null) {
       name = ast.simpleIdentifier(nameToken, isDeclaration: true);
     }
 
-    extensionDeclaration = ast.extensionDeclaration(
+    extensionDeclaration = ExtensionDeclarationImpl(
       comment: comment,
       metadata: metadata,
       extensionKeyword: extensionKeyword,
@@ -371,7 +371,7 @@
     }
     if (staticToken != null) {
       assert(staticToken.isModifier);
-      String? className = currentDeclarationName?.name;
+      String? className = currentDeclarationName?.lexeme;
       if (name.lexeme != className || getOrSet != null) {
         modifiers.staticKeyword = staticToken;
       }
@@ -425,11 +425,17 @@
   @override
   void beginTypeVariable(Token token) {
     debugEvent("beginTypeVariable");
-    var name = pop() as SimpleIdentifier;
+    var name = pop() as SimpleIdentifierImpl;
     var metadata = pop() as List<Annotation>?;
 
     var comment = _findComment(metadata, name.beginToken);
-    var typeParameter = ast.typeParameter(comment, metadata, name, null, null);
+    var typeParameter = TypeParameterImpl(
+      comment: comment,
+      metadata: metadata,
+      name: name,
+      extendsKeyword: null,
+      bound: null,
+    );
     push(typeParameter);
   }
 
@@ -824,7 +830,7 @@
     var bodyObject = pop();
     var initializers = (pop() as List<ConstructorInitializer>?) ?? const [];
     var separator = pop() as Token?;
-    var parameters = pop() as FormalParameterList;
+    var parameters = pop() as FormalParameterListImpl;
     var typeParameters = pop() as TypeParameterList?;
     var name = pop();
     pop(); // return type
@@ -832,9 +838,9 @@
     var metadata = pop() as List<Annotation>?;
     var comment = _findComment(metadata, beginToken);
 
-    ConstructorName? redirectedConstructor;
-    FunctionBody body;
-    if (bodyObject is FunctionBody) {
+    ConstructorNameImpl? redirectedConstructor;
+    FunctionBodyImpl body;
+    if (bodyObject is FunctionBodyImpl) {
       body = bodyObject;
     } else if (bodyObject is _RedirectingFactoryBody) {
       separator = bodyObject.equalToken;
@@ -850,10 +856,10 @@
 
     SimpleIdentifier prefixOrName;
     Token? period;
-    SimpleIdentifier? nameOrNull;
-    if (name is SimpleIdentifier) {
+    SimpleIdentifierImpl? nameOrNull;
+    if (name is SimpleIdentifierImpl) {
       prefixOrName = name;
-    } else if (name is PrefixedIdentifier) {
+    } else if (name is PrefixedIdentifierImpl) {
       prefixOrName = name.prefix;
       period = name.period;
       nameOrNull = name.identifier;
@@ -877,21 +883,21 @@
       handleRecoverableError(
           messageConstConstructorWithBody, bodyToken, bodyToken);
     }
-    ConstructorDeclaration constructor = ast.constructorDeclaration(
-        comment,
-        metadata,
-        modifiers?.externalKeyword,
-        modifiers?.finalConstOrVarKeyword,
-        null,
-        // TODO(paulberry): factoryKeyword
-        ast.simpleIdentifier(prefixOrName.token),
-        period,
-        nameOrNull,
-        parameters,
-        separator,
-        initializers,
-        redirectedConstructor,
-        body);
+    ConstructorDeclaration constructor = ConstructorDeclarationImpl(
+      comment: comment,
+      metadata: metadata,
+      externalKeyword: modifiers?.externalKeyword,
+      constKeyword: modifiers?.finalConstOrVarKeyword,
+      factoryKeyword: null,
+      returnType: ast.simpleIdentifier(prefixOrName.token),
+      period: period,
+      name: nameOrNull,
+      parameters: parameters,
+      separator: separator,
+      initializers: initializers,
+      redirectedConstructor: redirectedConstructor,
+      body: body,
+    );
     currentDeclarationMembers.add(constructor);
     if (mixinDeclaration != null) {
       // TODO (danrubel): Report an error if this is a mixin declaration.
@@ -911,11 +917,11 @@
     assert(optional(';', endToken) || optional('}', endToken));
     debugEvent("ClassFactoryMethod");
 
-    FunctionBody body;
+    FunctionBodyImpl body;
     Token? separator;
-    ConstructorName? redirectedConstructor;
+    ConstructorNameImpl? redirectedConstructor;
     var bodyObject = pop();
-    if (bodyObject is FunctionBody) {
+    if (bodyObject is FunctionBodyImpl) {
       body = bodyObject;
     } else if (bodyObject is _RedirectingFactoryBody) {
       separator = bodyObject.equalToken;
@@ -929,7 +935,7 @@
           uri);
     }
 
-    var parameters = pop() as FormalParameterList;
+    var parameters = pop() as FormalParameterListImpl;
     var typeParameters = pop() as TypeParameterList?;
     var constructorName = pop() as Identifier;
     var modifiers = pop() as _Modifiers?;
@@ -946,7 +952,7 @@
     // the actual constructor name.
     SimpleIdentifier returnType;
     Token? period;
-    SimpleIdentifier? name;
+    SimpleIdentifierImpl? name;
     Identifier typeName = constructorName;
     if (typeName is SimpleIdentifier) {
       returnType = typeName;
@@ -959,20 +965,23 @@
       throw UnimplementedError();
     }
 
-    currentDeclarationMembers.add(ast.constructorDeclaration(
-        comment,
-        metadata,
-        modifiers?.externalKeyword,
-        modifiers?.finalConstOrVarKeyword,
-        factoryKeyword,
-        ast.simpleIdentifier(returnType.token),
-        period,
-        name,
-        parameters,
-        separator,
-        null,
-        redirectedConstructor,
-        body));
+    currentDeclarationMembers.add(
+      ConstructorDeclarationImpl(
+        comment: comment,
+        metadata: metadata,
+        externalKeyword: modifiers?.externalKeyword,
+        constKeyword: modifiers?.finalConstOrVarKeyword,
+        factoryKeyword: factoryKeyword,
+        returnType: ast.simpleIdentifier(returnType.token),
+        period: period,
+        name: name,
+        parameters: parameters,
+        separator: separator,
+        initializers: null,
+        redirectedConstructor: redirectedConstructor,
+        body: body,
+      ),
+    );
   }
 
   @override
@@ -1016,8 +1025,10 @@
     }
 
     var variables = popTypedList2<VariableDeclaration>(count);
-    var type = pop() as TypeAnnotation?;
-    var variableList = ast.variableDeclarationList2(
+    var type = pop() as TypeAnnotationImpl?;
+    var variableList = VariableDeclarationListImpl(
+      comment: null,
+      metadata: null,
       lateKeyword: lateToken,
       keyword: varFinalOrConst,
       type: type,
@@ -1026,7 +1037,8 @@
     var covariantKeyword = covariantToken;
     var metadata = pop() as List<Annotation>?;
     var comment = _findComment(metadata, beginToken);
-    currentDeclarationMembers.add(ast.fieldDeclaration2(
+    currentDeclarationMembers.add(
+      FieldDeclarationImpl(
         comment: comment,
         metadata: metadata,
         abstractKeyword: abstractToken,
@@ -1035,7 +1047,9 @@
         externalKeyword: externalToken,
         staticKeyword: staticToken,
         fieldList: variableList,
-        semicolon: semicolon));
+        semicolon: semicolon,
+      ),
+    );
   }
 
   @override
@@ -1049,18 +1063,18 @@
     var bodyObject = pop();
     pop(); // initializers
     pop(); // separator
-    var parameters = pop() as FormalParameterList?;
-    var typeParameters = pop() as TypeParameterList?;
+    var parameters = pop() as FormalParameterListImpl?;
+    var typeParameters = pop() as TypeParameterListImpl?;
     var name = pop();
-    var returnType = pop() as TypeAnnotation?;
+    var returnType = pop() as TypeAnnotationImpl?;
     var modifiers = pop() as _Modifiers?;
     var metadata = pop() as List<Annotation>?;
     var comment = _findComment(metadata, beginToken);
 
     assert(parameters != null || optional('get', getOrSet!));
 
-    FunctionBody body;
-    if (bodyObject is FunctionBody) {
+    FunctionBodyImpl body;
+    if (bodyObject is FunctionBodyImpl) {
       body = bodyObject;
     } else if (bodyObject is _RedirectingFactoryBody) {
       body = ast.emptyFunctionBody(endToken);
@@ -1073,8 +1087,8 @@
     }
 
     Token? operatorKeyword;
-    SimpleIdentifier nameId;
-    if (name is SimpleIdentifier) {
+    SimpleIdentifierImpl nameId;
+    if (name is SimpleIdentifierImpl) {
       nameId = name;
     } else if (name is _OperatorName) {
       operatorKeyword = name.operatorKeyword;
@@ -1089,18 +1103,21 @@
     }
 
     checkFieldFormalParameters(parameters);
-    currentDeclarationMembers.add(ast.methodDeclaration(
-        comment,
-        metadata,
-        modifiers?.externalKeyword,
-        modifiers?.abstractKeyword ?? modifiers?.staticKeyword,
-        returnType,
-        getOrSet,
-        operatorKeyword,
-        nameId,
-        typeParameters,
-        parameters,
-        body));
+    currentDeclarationMembers.add(
+      MethodDeclarationImpl(
+        comment: comment,
+        metadata: metadata,
+        externalKeyword: modifiers?.externalKeyword,
+        modifierKeyword: modifiers?.abstractKeyword ?? modifiers?.staticKeyword,
+        returnType: returnType,
+        propertyKeyword: getOrSet,
+        operatorKeyword: operatorKeyword,
+        name: nameId,
+        typeParameters: typeParameters,
+        parameters: parameters,
+        body: body,
+      ),
+    );
   }
 
   @override
@@ -1284,11 +1301,20 @@
 
     var combinators = pop() as List<Combinator>?;
     var configurations = pop() as List<Configuration>?;
-    var uri = pop() as StringLiteral;
+    var uri = pop() as StringLiteralImpl;
     var metadata = pop() as List<Annotation>?;
     var comment = _findComment(metadata, exportKeyword);
-    directives.add(ast.exportDirective(comment, metadata, exportKeyword, uri,
-        configurations, combinators, semicolon));
+    directives.add(
+      ExportDirectiveImpl(
+        comment: comment,
+        metadata: metadata,
+        exportKeyword: exportKeyword,
+        uri: uri,
+        configurations: configurations,
+        combinators: combinators,
+        semicolon: semicolon,
+      ),
+    );
   }
 
   @override
@@ -1350,14 +1376,14 @@
     debugEvent("ExtensionFactoryMethod");
 
     var bodyObject = pop();
-    var parameters = pop() as FormalParameterList;
-    var typeParameters = pop() as TypeParameterList?;
+    var parameters = pop() as FormalParameterListImpl;
+    var typeParameters = pop() as TypeParameterListImpl?;
     var constructorName = pop();
     var modifiers = pop() as _Modifiers?;
     var metadata = pop() as List<Annotation>?;
 
-    FunctionBody body;
-    if (bodyObject is FunctionBody) {
+    FunctionBodyImpl body;
+    if (bodyObject is FunctionBodyImpl) {
       body = bodyObject;
     } else if (bodyObject is _RedirectingFactoryBody) {
       body = ast.emptyFunctionBody(endToken);
@@ -1373,10 +1399,10 @@
     // has already reported an error at this point, but we include them in as
     // a method declaration in order to get navigation, search, etc.
 
-    SimpleIdentifier methodName;
-    if (constructorName is SimpleIdentifier) {
+    SimpleIdentifierImpl methodName;
+    if (constructorName is SimpleIdentifierImpl) {
       methodName = constructorName;
-    } else if (constructorName is PrefixedIdentifier) {
+    } else if (constructorName is PrefixedIdentifierImpl) {
       methodName = constructorName.identifier;
     } else {
       // Unsure what the method name should be in this situation.
@@ -1384,18 +1410,21 @@
       // don't bother adding this declaration to the AST.
       return;
     }
-    currentDeclarationMembers.add(ast.methodDeclaration(
-        comment,
-        metadata,
-        modifiers?.externalKeyword,
-        modifiers?.abstractKeyword ?? modifiers?.staticKeyword,
-        null, // returnType
-        null, // getOrSet
-        null, // operatorKeyword
-        methodName,
-        typeParameters,
-        parameters,
-        body));
+    currentDeclarationMembers.add(
+      MethodDeclarationImpl(
+        comment: comment,
+        metadata: metadata,
+        externalKeyword: modifiers?.externalKeyword,
+        modifierKeyword: modifiers?.abstractKeyword ?? modifiers?.staticKeyword,
+        returnType: null,
+        propertyKeyword: null,
+        operatorKeyword: null,
+        name: methodName,
+        typeParameters: typeParameters,
+        parameters: parameters,
+        body: body,
+      ),
+    );
   }
 
   @override
@@ -1442,9 +1471,15 @@
     assert(optional('=', assignment));
     debugEvent("FieldInitializer");
 
-    var initializer = pop() as Expression;
-    var name = pop() as SimpleIdentifier;
-    push(_makeVariableDeclaration(name, assignment, initializer));
+    var initializer = pop() as ExpressionImpl;
+    var name = pop() as SimpleIdentifierImpl;
+    push(
+      _makeVariableDeclaration(
+        name: name,
+        equals: assignment,
+        initializer: initializer,
+      ),
+    );
   }
 
   @override
@@ -1822,7 +1857,7 @@
     var combinators = pop() as List<Combinator>?;
     var deferredKeyword = pop(NullValue.Deferred) as Token?;
     var asKeyword = pop(NullValue.As) as Token?;
-    var prefix = pop(NullValue.Prefix) as SimpleIdentifier?;
+    var prefix = pop(NullValue.Prefix) as SimpleIdentifierImpl?;
     var configurations = pop() as List<Configuration>?;
     var uri = pop() as StringLiteralImpl;
     var metadata = pop() as List<Annotation>?;
@@ -1852,17 +1887,17 @@
       );
     } else {
       directives.add(
-        ast.importDirective(
-          comment,
-          metadata,
-          importKeyword,
-          uri,
-          configurations,
-          deferredKeyword,
-          asKeyword,
-          prefix,
-          combinators,
-          semicolon ?? Tokens.semicolon(),
+        ImportDirectiveImpl(
+          comment: comment,
+          metadata: metadata,
+          importKeyword: importKeyword,
+          uri: uri,
+          configurations: configurations,
+          deferredKeyword: deferredKeyword,
+          asKeyword: asKeyword,
+          prefix: prefix,
+          combinators: combinators,
+          semicolon: semicolon ?? Tokens.semicolon(),
         ),
       );
     }
@@ -1880,8 +1915,12 @@
     // reached, node would always be a VariableDeclaration.
     if (node is VariableDeclaration) {
       variable = node;
-    } else if (node is SimpleIdentifier) {
-      variable = _makeVariableDeclaration(node, null, null);
+    } else if (node is SimpleIdentifierImpl) {
+      variable = _makeVariableDeclaration(
+        name: node,
+        equals: null,
+        initializer: null,
+      );
     } else {
       internalProblem(
           templateInternalProblemUnhandled.withArguments(
@@ -1974,8 +2013,15 @@
     var name = ast.libraryIdentifier(libraryName);
     var metadata = pop() as List<Annotation>?;
     var comment = _findComment(metadata, libraryKeyword);
-    directives.add(ast.libraryDirective(
-        comment, metadata, libraryKeyword, name, semicolon));
+    directives.add(
+      LibraryDirectiveImpl(
+        comment: comment,
+        metadata: metadata,
+        libraryKeyword: libraryKeyword,
+        name: name,
+        semicolon: semicolon,
+      ),
+    );
   }
 
   @override
@@ -2036,14 +2082,22 @@
     }
     var parameters = pop() as FormalParameterList;
     checkFieldFormalParameters(parameters);
-    var name = pop() as SimpleIdentifier;
-    var returnType = pop() as TypeAnnotation?;
+    var name = pop() as SimpleIdentifierImpl;
+    var returnType = pop() as TypeAnnotationImpl?;
     var typeParameters = pop() as TypeParameterList?;
     var metadata = pop(NullValue.Metadata) as List<Annotation>?;
-    FunctionExpression functionExpression =
+    final functionExpression =
         ast.functionExpression(typeParameters, parameters, body);
-    var functionDeclaration = ast.functionDeclaration(
-        null, metadata, null, null, returnType, null, name, functionExpression);
+    var functionDeclaration = FunctionDeclarationImpl(
+      comment: null,
+      metadata: metadata,
+      augmentKeyword: null,
+      externalKeyword: null,
+      returnType: returnType,
+      propertyKeyword: null,
+      name: name,
+      functionExpression: functionExpression,
+    );
     push(ast.functionDeclarationStatement(functionDeclaration));
   }
 
@@ -2168,35 +2222,38 @@
     assert(optional(';', semicolon));
     debugEvent("NamedMixinApplication");
 
-    ImplementsClause? implementsClause;
+    ImplementsClauseImpl? implementsClause;
     if (implementsKeyword != null) {
       var interfaces = pop() as List<NamedType>;
       implementsClause = ast.implementsClause(implementsKeyword, interfaces);
     }
-    var withClause = pop(NullValue.WithClause) as WithClause;
-    var superclass = pop() as NamedType;
+    var withClause = pop(NullValue.WithClause) as WithClauseImpl;
+    var superclass = pop() as NamedTypeImpl;
     var augmentKeyword = pop(NullValue.Token) as Token?;
     var macroKeyword = pop(NullValue.Token) as Token?;
     var modifiers = pop() as _Modifiers?;
-    var typeParameters = pop() as TypeParameterList?;
-    var name = pop() as SimpleIdentifier;
+    var typeParameters = pop() as TypeParameterListImpl?;
+    var name = pop() as SimpleIdentifierImpl;
     var abstractKeyword = modifiers?.abstractKeyword;
     var metadata = pop() as List<Annotation>?;
     var comment = _findComment(metadata, beginToken);
-    declarations.add(ast.classTypeAlias(
-        comment,
-        metadata,
-        classKeyword,
-        name,
-        typeParameters,
-        equalsToken,
-        abstractKeyword,
-        macroKeyword,
-        augmentKeyword,
-        superclass,
-        withClause,
-        implementsClause,
-        semicolon));
+    declarations.add(
+      ClassTypeAliasImpl(
+        comment: comment,
+        metadata: metadata,
+        typedefKeyword: classKeyword,
+        name: name,
+        typeParameters: typeParameters,
+        equals: equalsToken,
+        abstractKeyword: abstractKeyword,
+        macroKeyword: macroKeyword,
+        augmentKeyword: augmentKeyword,
+        superclass: superclass,
+        withClause: withClause,
+        implementsClause: implementsClause,
+        semicolon: semicolon,
+      ),
+    );
   }
 
   @override
@@ -2224,11 +2281,18 @@
     assert(optional(';', semicolon));
     debugEvent("Part");
 
-    var uri = pop() as StringLiteral;
+    var uri = pop() as StringLiteralImpl;
     var metadata = pop() as List<Annotation>?;
     var comment = _findComment(metadata, partKeyword);
-    directives
-        .add(ast.partDirective(comment, metadata, partKeyword, uri, semicolon));
+    directives.add(
+      PartDirectiveImpl(
+        comment: comment,
+        metadata: metadata,
+        partKeyword: partKeyword,
+        uri: uri,
+        semicolon: semicolon,
+      ),
+    );
   }
 
   @override
@@ -2239,17 +2303,26 @@
     assert(optional(';', semicolon));
     debugEvent("PartOf");
     var libraryNameOrUri = pop();
-    LibraryIdentifier? name;
-    StringLiteral? uri;
-    if (libraryNameOrUri is StringLiteral) {
+    LibraryIdentifierImpl? name;
+    StringLiteralImpl? uri;
+    if (libraryNameOrUri is StringLiteralImpl) {
       uri = libraryNameOrUri;
     } else {
       name = ast.libraryIdentifier(libraryNameOrUri as List<SimpleIdentifier>);
     }
     var metadata = pop() as List<Annotation>?;
     var comment = _findComment(metadata, partKeyword);
-    directives.add(ast.partOfDirective(
-        comment, metadata, partKeyword, ofKeyword, uri, name, semicolon));
+    directives.add(
+      PartOfDirectiveImpl(
+        comment: comment,
+        metadata: metadata,
+        partKeyword: partKeyword,
+        ofKeyword: ofKeyword,
+        uri: uri,
+        libraryName: name,
+        semicolon: semicolon,
+      ),
+    );
   }
 
   @override
@@ -2257,7 +2330,7 @@
     assert(optional('=', equalToken));
     debugEvent("RedirectingFactoryBody");
 
-    var constructorName = pop() as ConstructorName;
+    var constructorName = pop() as ConstructorNameImpl;
     var starToken = pop() as Token?;
     var asyncToken = pop() as Token?;
     push(_RedirectingFactoryBody(
@@ -2428,8 +2501,10 @@
     }
 
     var variables = popTypedList2<VariableDeclaration>(count);
-    var type = pop() as TypeAnnotation?;
-    var variableList = ast.variableDeclarationList2(
+    var type = pop() as TypeAnnotationImpl?;
+    var variableList = VariableDeclarationListImpl(
+      comment: null,
+      metadata: null,
       lateKeyword: lateToken,
       keyword: varFinalOrConst,
       type: type,
@@ -2437,9 +2512,15 @@
     );
     var metadata = pop() as List<Annotation>?;
     var comment = _findComment(metadata, beginToken);
-    declarations.add(ast.topLevelVariableDeclaration(
-        comment, metadata, variableList, semicolon,
-        externalKeyword: externalToken));
+    declarations.add(
+      TopLevelVariableDeclarationImpl(
+        comment: comment,
+        metadata: metadata,
+        externalKeyword: externalToken,
+        variableList: variableList,
+        semicolon: semicolon,
+      ),
+    );
   }
 
   @override
@@ -2454,22 +2535,26 @@
     var body = pop() as FunctionBody;
     var parameters = pop() as FormalParameterList?;
     var typeParameters = pop() as TypeParameterList?;
-    var name = pop() as SimpleIdentifier;
-    var returnType = pop() as TypeAnnotation?;
+    var name = pop() as SimpleIdentifierImpl;
+    var returnType = pop() as TypeAnnotationImpl?;
     var modifiers = pop() as _Modifiers?;
     var augmentKeyword = modifiers?.augmentKeyword;
     var externalKeyword = modifiers?.externalKeyword;
     var metadata = pop() as List<Annotation>?;
     var comment = _findComment(metadata, beginToken);
-    declarations.add(ast.functionDeclaration(
-        comment,
-        metadata,
-        augmentKeyword,
-        externalKeyword,
-        returnType,
-        getOrSet,
-        name,
-        ast.functionExpression(typeParameters, parameters, body)));
+    declarations.add(
+      FunctionDeclarationImpl(
+        comment: comment,
+        metadata: metadata,
+        augmentKeyword: augmentKeyword,
+        externalKeyword: externalKeyword,
+        returnType: returnType,
+        propertyKeyword: getOrSet,
+        name: name,
+        functionExpression:
+            ast.functionExpression(typeParameters, parameters, body),
+      ),
+    );
   }
 
   @override
@@ -2504,18 +2589,28 @@
     debugEvent("FunctionTypeAlias");
 
     if (equals == null) {
-      var parameters = pop() as FormalParameterList;
-      var typeParameters = pop() as TypeParameterList?;
-      var name = pop() as SimpleIdentifier;
-      var returnType = pop() as TypeAnnotation?;
+      var parameters = pop() as FormalParameterListImpl;
+      var typeParameters = pop() as TypeParameterListImpl?;
+      var name = pop() as SimpleIdentifierImpl;
+      var returnType = pop() as TypeAnnotationImpl?;
       var metadata = pop() as List<Annotation>?;
       var comment = _findComment(metadata, typedefKeyword);
-      declarations.add(ast.functionTypeAlias(comment, metadata, typedefKeyword,
-          returnType, name, typeParameters, parameters, semicolon));
+      declarations.add(
+        FunctionTypeAliasImpl(
+          comment: comment,
+          metadata: metadata,
+          typedefKeyword: typedefKeyword,
+          returnType: returnType,
+          name: name,
+          typeParameters: typeParameters,
+          parameters: parameters,
+          semicolon: semicolon,
+        ),
+      );
     } else {
-      var type = pop() as TypeAnnotation;
-      var templateParameters = pop() as TypeParameterList?;
-      var name = pop() as SimpleIdentifier;
+      var type = pop() as TypeAnnotationImpl;
+      var templateParameters = pop() as TypeParameterListImpl?;
+      var name = pop() as SimpleIdentifierImpl;
       var metadata = pop() as List<Annotation>?;
       var comment = _findComment(metadata, typedefKeyword);
       if (type is! GenericFunctionType && !enableNonFunctionTypeAliases) {
@@ -2524,8 +2619,18 @@
           startToken: equals,
         );
       }
-      declarations.add(ast.genericTypeAlias(comment, metadata, typedefKeyword,
-          name, templateParameters, equals, type, semicolon));
+      declarations.add(
+        GenericTypeAliasImpl(
+          comment: comment,
+          metadata: metadata,
+          typedefKeyword: typedefKeyword,
+          name: name,
+          typeParameters: templateParameters,
+          equals: equals,
+          type: type,
+          semicolon: semicolon,
+        ),
+      );
     }
   }
 
@@ -2580,10 +2685,16 @@
     assert(optionalOrNull('=', assignmentOperator));
     debugEvent("VariableInitializer");
 
-    var initializer = pop() as Expression;
-    var identifier = pop() as SimpleIdentifier;
+    var initializer = pop() as ExpressionImpl;
+    var identifier = pop() as SimpleIdentifierImpl;
     // TODO(ahe): Don't push initializers, instead install them.
-    push(_makeVariableDeclaration(identifier, assignmentOperator, initializer));
+    push(
+      _makeVariableDeclaration(
+        name: identifier,
+        equals: assignmentOperator,
+        initializer: initializer,
+      ),
+    );
   }
 
   @override
@@ -2593,14 +2704,15 @@
 
     var variables = popTypedList2<VariableDeclaration>(count);
     var modifiers = pop(NullValue.Modifiers) as _Modifiers?;
-    var type = pop() as TypeAnnotation?;
+    var type = pop() as TypeAnnotationImpl?;
     var keyword = modifiers?.finalConstOrVarKeyword;
     var metadata = pop() as List<Annotation>?;
     var comment = _findComment(metadata, variables[0].beginToken);
     // var comment = _findComment(metadata,
     //     variables[0].beginToken ?? type?.beginToken ?? modifiers.beginToken);
-    push(ast.variableDeclarationStatement(
-        ast.variableDeclarationList2(
+    push(
+      ast.variableDeclarationStatement(
+        VariableDeclarationListImpl(
           comment: comment,
           metadata: metadata,
           lateKeyword: modifiers?.lateToken,
@@ -2608,7 +2720,9 @@
           type: type,
           variables: variables,
         ),
-        semicolon ?? Tokens.semicolon()));
+        semicolon ?? Tokens.semicolon(),
+      ),
+    );
   }
 
   @override
@@ -2739,9 +2853,11 @@
     if (catchParameterList != null) {
       List<FormalParameter> catchParameters = catchParameterList.parameters;
       if (catchParameters.isNotEmpty) {
+        // ignore: deprecated_member_use_from_same_package
         exception = catchParameters[0].identifier;
       }
       if (catchParameters.length > 1) {
+        // ignore: deprecated_member_use_from_same_package
         stackTrace = catchParameters[1].identifier;
       }
     }
@@ -2798,34 +2914,35 @@
     if (nativeToken != null) {
       nativeClause = ast.nativeClause(nativeToken, nativeName);
     }
-    var implementsClause = pop(NullValue.IdentifierList) as ImplementsClause?;
-    var withClause = pop(NullValue.WithClause) as WithClause?;
-    var extendsClause = pop(NullValue.ExtendsClause) as ExtendsClause?;
+    var implementsClause =
+        pop(NullValue.IdentifierList) as ImplementsClauseImpl?;
+    var withClause = pop(NullValue.WithClause) as WithClauseImpl?;
+    var extendsClause = pop(NullValue.ExtendsClause) as ExtendsClauseImpl?;
     var augmentKeyword = pop(NullValue.Token) as Token?;
     var macroKeyword = pop(NullValue.Token) as Token?;
     var modifiers = pop() as _Modifiers?;
-    var typeParameters = pop() as TypeParameterList?;
-    var name = pop() as SimpleIdentifier;
+    var typeParameters = pop() as TypeParameterListImpl?;
+    var name = pop() as SimpleIdentifierImpl;
     var abstractKeyword = modifiers?.abstractKeyword;
     var metadata = pop() as List<Annotation>?;
     var comment = _findComment(metadata, begin);
     // leftBracket, members, and rightBracket
     // are set in [endClassOrMixinBody].
-    classDeclaration = ast.classDeclaration(
-      comment,
-      metadata,
-      abstractKeyword,
-      macroKeyword,
-      augmentKeyword,
-      classKeyword,
-      name,
-      typeParameters,
-      extendsClause,
-      withClause,
-      implementsClause,
-      Tokens.openCurlyBracket(), // leftBracket
-      <ClassMember>[],
-      Tokens.closeCurlyBracket(), // rightBracket
+    classDeclaration = ClassDeclarationImpl(
+      comment: comment,
+      metadata: metadata,
+      abstractKeyword: abstractKeyword,
+      macroKeyword: macroKeyword,
+      augmentKeyword: augmentKeyword,
+      classKeyword: classKeyword,
+      name: name,
+      typeParameters: typeParameters,
+      extendsClause: extendsClause,
+      withClause: withClause,
+      implementsClause: implementsClause,
+      leftBracket: Tokens.openCurlyBracket(),
+      members: <ClassMember>[],
+      rightBracket: Tokens.closeCurlyBracket(),
     );
 
     classDeclaration!.nativeClause = nativeClause;
@@ -2965,8 +3082,9 @@
     // Replace the constant to include arguments.
     if (argumentList != null) {
       constant = EnumConstantDeclarationImpl(
-        documentationComment: constant.documentationComment,
+        comment: constant.documentationComment,
         metadata: constant.metadata,
+        // ignore: deprecated_member_use_from_same_package
         name: constant.name,
         arguments: EnumConstantArgumentsImpl(
           typeArguments: typeArguments,
@@ -3004,10 +3122,11 @@
     assert(optional('{', leftBrace));
     debugEvent("EnumHeader");
 
-    var implementsClause = pop(NullValue.IdentifierList) as ImplementsClause?;
-    var withClause = pop(NullValue.WithClause) as WithClause?;
-    var typeParameters = pop() as TypeParameterList?;
-    var name = pop() as SimpleIdentifier;
+    var implementsClause =
+        pop(NullValue.IdentifierList) as ImplementsClauseImpl?;
+    var withClause = pop(NullValue.WithClause) as WithClauseImpl?;
+    var typeParameters = pop() as TypeParameterListImpl?;
+    var name = pop() as SimpleIdentifierImpl;
     var metadata = pop() as List<Annotation>?;
     var comment = _findComment(metadata, enumKeyword);
 
@@ -3027,7 +3146,7 @@
     }
 
     declarations.add(
-      enumDeclaration = ast.enumDeclaration2(
+      enumDeclaration = EnumDeclarationImpl(
         comment: comment,
         metadata: metadata,
         enumKeyword: enumKeyword,
@@ -3167,12 +3286,14 @@
     if (variableOrDeclaration is VariableDeclarationStatement) {
       VariableDeclarationList variableList = variableOrDeclaration.variables;
       forLoopParts = ast.forEachPartsWithDeclaration(
-        loopVariable: ast.declaredIdentifier(
-            variableList.documentationComment,
-            variableList.metadata,
-            variableList.keyword,
-            variableList.type,
-            variableList.variables.first.name),
+        loopVariable: DeclaredIdentifierImpl(
+          comment: variableList.documentationComment as CommentImpl?,
+          metadata: variableList.metadata,
+          keyword: variableList.keyword,
+          type: variableList.type as TypeAnnotationImpl?,
+          // ignore: deprecated_member_use_from_same_package
+          identifier: variableList.variables.first.name as SimpleIdentifierImpl,
+        ),
         inKeyword: inKeyword,
         iterable: iterator,
       );
@@ -3259,7 +3380,7 @@
       return;
     }
 
-    SimpleIdentifier identifier =
+    final identifier =
         ast.simpleIdentifier(token, isDeclaration: context.inDeclaration);
     if (context.inLibraryOrPartOfDeclaration) {
       if (!context.isContinuation) {
@@ -3270,7 +3391,14 @@
     } else if (context == IdentifierContext.enumValueDeclaration) {
       var metadata = pop() as List<Annotation>?;
       var comment = _findComment(metadata, token);
-      push(ast.enumConstantDeclaration(comment, metadata, identifier));
+      push(
+        EnumConstantDeclarationImpl(
+          comment: comment,
+          metadata: metadata,
+          name: identifier,
+          arguments: null,
+        ),
+      );
     } else {
       push(identifier);
     }
@@ -3615,26 +3743,27 @@
         extensionDeclaration == null);
     debugEvent("MixinHeader");
 
-    var implementsClause = pop(NullValue.IdentifierList) as ImplementsClause?;
-    var onClause = pop(NullValue.IdentifierList) as OnClause?;
+    var implementsClause =
+        pop(NullValue.IdentifierList) as ImplementsClauseImpl?;
+    var onClause = pop(NullValue.IdentifierList) as OnClauseImpl?;
     var augmentKeyword = pop(NullValue.Token) as Token?;
-    var typeParameters = pop() as TypeParameterList?;
-    var name = pop() as SimpleIdentifier;
+    var typeParameters = pop() as TypeParameterListImpl?;
+    var name = pop() as SimpleIdentifierImpl;
     var metadata = pop() as List<Annotation>?;
     var comment = _findComment(metadata, mixinKeyword);
 
-    mixinDeclaration = ast.mixinDeclaration(
-      comment,
-      metadata,
-      augmentKeyword,
-      mixinKeyword,
-      name,
-      typeParameters,
-      onClause,
-      implementsClause,
-      Tokens.openCurlyBracket(), // leftBracket
-      <ClassMember>[],
-      Tokens.closeCurlyBracket(), // rightBracket
+    mixinDeclaration = MixinDeclarationImpl(
+      comment: comment,
+      metadata: metadata,
+      augmentKeyword: augmentKeyword,
+      mixinKeyword: mixinKeyword,
+      name: name,
+      typeParameters: typeParameters,
+      onClause: onClause,
+      implementsClause: implementsClause,
+      leftBracket: Tokens.openCurlyBracket(),
+      members: <ClassMember>[],
+      rightBracket: Tokens.closeCurlyBracket(),
     );
     declarations.add(mixinDeclaration!);
   }
@@ -3713,8 +3842,14 @@
   void handleNoFieldInitializer(Token token) {
     debugEvent("NoFieldInitializer");
 
-    var name = pop() as SimpleIdentifier;
-    push(_makeVariableDeclaration(name, null, null));
+    var name = pop() as SimpleIdentifierImpl;
+    push(
+      _makeVariableDeclaration(
+        name: name,
+        equals: null,
+        initializer: null,
+      ),
+    );
   }
 
   @override
@@ -3744,7 +3879,7 @@
     debugEvent("NoTypeNameInConstructorReference");
     assert(enumDeclaration != null);
 
-    push(ast.simpleIdentifier(enumDeclaration!.name.token));
+    push(ast.simpleIdentifier(enumDeclaration!.name2));
   }
 
   @override
@@ -4315,9 +4450,16 @@
         typeArguments: typeArguments));
   }
 
-  VariableDeclaration _makeVariableDeclaration(
-      SimpleIdentifier name, Token? equals, Expression? initializer) {
-    return ast.variableDeclaration(name, equals, initializer);
+  VariableDeclaration _makeVariableDeclaration({
+    required SimpleIdentifierImpl name,
+    required Token? equals,
+    required ExpressionImpl? initializer,
+  }) {
+    return VariableDeclarationImpl(
+      name: name,
+      equals: equals,
+      initializer: initializer,
+    );
   }
 
   void _reportFeatureNotEnabled({
@@ -4441,7 +4583,7 @@
 /// followed by a token.
 class _OperatorName {
   final Token operatorKeyword;
-  final SimpleIdentifier name;
+  final SimpleIdentifierImpl name;
 
   _OperatorName(this.operatorKeyword, this.name);
 }
@@ -4470,7 +4612,7 @@
   final Token? asyncKeyword;
   final Token? starKeyword;
   final Token equalToken;
-  final ConstructorName constructorName;
+  final ConstructorNameImpl constructorName;
 
   _RedirectingFactoryBody(this.asyncKeyword, this.starKeyword, this.equalToken,
       this.constructorName);
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 634506e..5768e84 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -365,7 +365,7 @@
     } else {
       if (element.isFactory &&
           // Check if we've reported [NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS].
-          !element.enclosingElement2.constructors
+          !element.enclosingElement3.constructors
               .every((constructor) => constructor.isFactory)) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node, [element]);
diff --git a/pkg/analyzer/lib/src/generated/error_detection_helpers.dart b/pkg/analyzer/lib/src/generated/error_detection_helpers.dart
index 3cc1495..e3f078a 100644
--- a/pkg/analyzer/lib/src/generated/error_detection_helpers.dart
+++ b/pkg/analyzer/lib/src/generated/error_detection_helpers.dart
@@ -38,7 +38,7 @@
       return;
     }
 
-    _checkForAssignableExpressionAtType(
+    checkForAssignableExpressionAtType(
         expression, actualStaticType, expectedStaticType, errorCode,
         whyNotPromoted: whyNotPromoted);
   }
@@ -61,6 +61,36 @@
     );
   }
 
+  void checkForAssignableExpressionAtType(
+      Expression expression,
+      DartType actualStaticType,
+      DartType expectedStaticType,
+      ErrorCode errorCode,
+      {Map<DartType, NonPromotionReason> Function()? whyNotPromoted}) {
+    if (!expectedStaticType.isVoid && checkForUseOfVoidResult(expression)) {
+      return;
+    }
+
+    if (!typeSystem.isAssignableTo(actualStaticType, expectedStaticType)) {
+      AstNode getErrorNode(AstNode node) {
+        if (node is CascadeExpression) {
+          return getErrorNode(node.target);
+        }
+        if (node is ParenthesizedExpression) {
+          return getErrorNode(node.expression);
+        }
+        return node;
+      }
+
+      errorReporter.reportErrorForNode(
+        errorCode,
+        getErrorNode(expression),
+        [actualStaticType, expectedStaticType],
+        computeWhyNotPromotedMessages(expression, whyNotPromoted?.call()),
+      );
+    }
+  }
+
   /// Verify that the given constructor field [initializer] has compatible field
   /// and initializer expression types. The [fieldElement] is the static element
   /// from the name in the [ConstructorFieldInitializer].
@@ -124,45 +154,6 @@
 //        return true;
   }
 
-  /// Verify that the given left hand side ([lhs]) and right hand side ([rhs])
-  /// represent a valid assignment.
-  ///
-  /// See [CompileTimeErrorCode.INVALID_ASSIGNMENT].
-  void checkForInvalidAssignment(Expression? lhs, Expression? rhs,
-      {Map<DartType, NonPromotionReason> Function()? whyNotPromoted}) {
-    if (lhs == null || rhs == null) {
-      return;
-    }
-
-    if (lhs is IndexExpression &&
-            identical(lhs.realTarget.staticType, NeverTypeImpl.instance) ||
-        lhs is PrefixedIdentifier &&
-            identical(lhs.prefix.staticType, NeverTypeImpl.instance) ||
-        lhs is PropertyAccess &&
-            identical(lhs.realTarget.staticType, NeverTypeImpl.instance)) {
-      return;
-    }
-
-    DartType leftType;
-    var parent = lhs.parent;
-    if (parent is AssignmentExpression && parent.leftHandSide == lhs) {
-      leftType = parent.writeType!;
-    } else {
-      var leftVariableElement = getVariableElement(lhs);
-      leftType = (leftVariableElement == null)
-          ? lhs.typeOrThrow
-          : leftVariableElement.type;
-    }
-
-    if (!leftType.isVoid && checkForUseOfVoidResult(rhs)) {
-      return;
-    }
-
-    _checkForAssignableExpressionAtType(
-        rhs, rhs.typeOrThrow, leftType, CompileTimeErrorCode.INVALID_ASSIGNMENT,
-        whyNotPromoted: whyNotPromoted);
-  }
-
   /// Check for situations where the result of a method or function is used,
   /// when it returns 'void'. Or, in rare cases, when other types of expressions
   /// are void, such as identifiers.
@@ -284,32 +275,4 @@
           whyNotPromoted: whyNotPromoted);
     }
   }
-
-  bool _checkForAssignableExpressionAtType(
-      Expression expression,
-      DartType actualStaticType,
-      DartType expectedStaticType,
-      ErrorCode errorCode,
-      {Map<DartType, NonPromotionReason> Function()? whyNotPromoted}) {
-    if (!typeSystem.isAssignableTo(actualStaticType, expectedStaticType)) {
-      AstNode getErrorNode(AstNode node) {
-        if (node is CascadeExpression) {
-          return getErrorNode(node.target);
-        }
-        if (node is ParenthesizedExpression) {
-          return getErrorNode(node.expression);
-        }
-        return node;
-      }
-
-      errorReporter.reportErrorForNode(
-        errorCode,
-        getErrorNode(expression),
-        [actualStaticType, expectedStaticType],
-        computeWhyNotPromotedMessages(expression, whyNotPromoted?.call()),
-      );
-      return false;
-    }
-    return true;
-  }
 }
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 9bce035..8703396 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -117,7 +117,7 @@
   }
 
   static bool _inFactoryConstructor(Element? element) {
-    var enclosing = element?.enclosingElement2;
+    var enclosing = element?.enclosingElement3;
     if (enclosing == null) {
       return false;
     }
@@ -128,7 +128,7 @@
   }
 
   static bool _inStaticMethod(Element? element) {
-    var enclosing = element?.enclosingElement2;
+    var enclosing = element?.enclosingElement3;
     if (enclosing == null) {
       return false;
     }
@@ -429,7 +429,7 @@
       _duplicateDefinitionVerifier.checkClass(node);
       if (!element.isDartCoreFunctionImpl) {
         _checkForBuiltInIdentifierAsName(
-            node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME);
+            node.name2, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME);
       }
       _checkForConflictingClassTypeVariableErrorCodes();
       var superclass = node.extendsClause?.superclass;
@@ -448,7 +448,7 @@
       _checkForFinalNotInitializedInClass(members);
       _checkForBadFunctionUse(node);
       _checkForWrongTypeParameterVarianceInSuperinterfaces();
-      _checkForMainFunction(node.name);
+      _checkForMainFunction1(node.name2, node.declaredElement!);
       _reportMacroApplicationErrors(
         annotations: node.metadata,
         macroErrors: element.macroApplicationErrors,
@@ -470,13 +470,13 @@
   @override
   void visitClassTypeAlias(ClassTypeAlias node) {
     _checkForBuiltInIdentifierAsName(
-        node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
+        node.name2, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
     var outerClassElement = _enclosingClass;
     try {
       _enclosingClass = node.declaredElement as ClassElementImpl;
       _checkClassInheritance(
           node, node.superclass, node.withClause, node.implementsClause);
-      _checkForMainFunction(node.name);
+      _checkForMainFunction1(node.name2, node.declaredElement!);
       _checkForWrongTypeParameterVarianceInSuperinterfaces();
     } finally {
       _enclosingClass = outerClassElement;
@@ -543,7 +543,7 @@
       _checkForInvalidField(node, fieldName, staticElement);
       if (staticElement is FieldElement) {
         _checkForAbstractOrExternalFieldConstructorInitializer(
-            node.fieldName, staticElement);
+            node.fieldName.token, staticElement);
       }
       super.visitConstructorFieldInitializer(node);
     } finally {
@@ -572,7 +572,16 @@
 
   @override
   void visitDefaultFormalParameter(DefaultFormalParameter node) {
-    checkForInvalidAssignment(node.identifier, node.defaultValue);
+    final defaultValue = node.defaultValue;
+    if (defaultValue != null) {
+      checkForAssignableExpressionAtType(
+        defaultValue,
+        defaultValue.typeOrThrow,
+        node.declaredElement!.type,
+        CompileTimeErrorCode.INVALID_ASSIGNMENT,
+      );
+    }
+
     super.visitDefaultFormalParameter(node);
   }
 
@@ -592,7 +601,7 @@
       _duplicateDefinitionVerifier.checkEnum(node);
 
       _checkForBuiltInIdentifierAsName(
-          node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME);
+          node.name2, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME);
       _checkForConflictingEnumTypeVariableErrorCodes(element);
       var implementsClause = node.implementsClause;
       var withClause = node.withClause;
@@ -604,7 +613,7 @@
       _constructorFieldsVerifier.enterEnum(node, element);
       _checkForFinalNotInitializedInClass(node.members);
       _checkForWrongTypeParameterVarianceInSuperinterfaces();
-      _checkForMainFunction(node.name);
+      _checkForMainFunction1(node.name2, node.declaredElement!);
       _checkForEnumInstantiatedToBoundsIsNotWellBounded(node, element);
 
       GetterSetterTypesVerifier(
@@ -655,7 +664,7 @@
       errorReporter: errorReporter,
     ).checkExtension(element);
 
-    final name = node.name;
+    final name = node.name2;
     if (name != null) {
       _checkForBuiltInIdentifierAsName(
           name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_EXTENSION_NAME);
@@ -701,7 +710,7 @@
       var fieldElement = element.field;
       if (fieldElement != null) {
         _checkForAbstractOrExternalFieldConstructorInitializer(
-            node.identifier, fieldElement);
+            node.name, fieldElement);
       }
     }
     super.visitFieldFormalParameter(node);
@@ -710,7 +719,7 @@
   @override
   void visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) {
     DeclaredIdentifier loopVariable = node.loopVariable;
-    if (_checkForEachParts(node, loopVariable.identifier)) {
+    if (_checkForEachParts(node, loopVariable.declaredElement)) {
       if (loopVariable.isConst) {
         errorReporter.reportErrorForToken(
             CompileTimeErrorCode.FOR_IN_WITH_CONST_VARIABLE,
@@ -723,7 +732,7 @@
   @override
   void visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node) {
     SimpleIdentifier identifier = node.identifier;
-    if (_checkForEachParts(node, identifier)) {
+    if (_checkForEachParts(node, identifier.staticElement)) {
       _checkForAssignmentToFinal(identifier);
     }
     super.visitForEachPartsWithIdentifier(node);
@@ -746,23 +755,23 @@
   @override
   void visitFunctionDeclaration(FunctionDeclaration node) {
     ExecutableElement functionElement = node.declaredElement!;
-    if (functionElement.enclosingElement2 is! CompilationUnitElement) {
+    if (functionElement.enclosingElement3 is! CompilationUnitElement) {
       _hiddenElements!.declare(functionElement);
     }
 
     _withEnclosingExecutable(functionElement, () {
-      SimpleIdentifier identifier = node.name;
       TypeAnnotation? returnType = node.returnType;
       if (node.isSetter) {
         FunctionExpression functionExpression = node.functionExpression;
         _checkForWrongNumberOfParametersForSetter(
-            identifier, functionExpression.parameters);
+            node.name2, functionExpression.parameters);
         _checkForNonVoidReturnTypeForSetter(returnType);
       }
       _checkForTypeAnnotationDeferredClass(returnType);
       _returnTypeVerifier.verifyReturnType(returnType);
-      _checkForImplicitDynamicReturn(node.name, node.declaredElement!);
-      _checkForMainFunction(node.name);
+      _checkForImplicitDynamicReturn(node.name2, node.declaredElement!);
+      _checkForMainFunction1(node.name2, node.declaredElement!);
+      _checkForMainFunction2(node);
       super.visitFunctionDeclaration(node);
     });
   }
@@ -807,10 +816,10 @@
   @override
   void visitFunctionTypeAlias(FunctionTypeAlias node) {
     _checkForBuiltInIdentifierAsName(
-        node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
-    _checkForMainFunction(node.name);
+        node.name2, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
+    _checkForMainFunction1(node.name2, node.declaredElement!);
     _checkForTypeAliasCannotReferenceItself(
-        node.name, node.declaredElement as TypeAliasElementImpl);
+        node.name2, node.declaredElement as TypeAliasElementImpl);
     super.visitFunctionTypeAlias(node);
   }
 
@@ -828,8 +837,10 @@
         DartType parameterType = node.declaredElement!.type;
         if (parameterType is FunctionType &&
             parameterType.returnType.isDynamic) {
-          errorReporter.reportErrorForNode(LanguageCode.IMPLICIT_DYNAMIC_RETURN,
-              node.identifier, [node.identifier.name]);
+          errorReporter.reportErrorForToken(
+              LanguageCode.IMPLICIT_DYNAMIC_RETURN,
+              node.name,
+              [node.name.lexeme]);
         }
       }
 
@@ -842,10 +853,10 @@
   @override
   void visitGenericTypeAlias(GenericTypeAlias node) {
     _checkForBuiltInIdentifierAsName(
-        node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
-    _checkForMainFunction(node.name);
+        node.name2, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
+    _checkForMainFunction1(node.name2, node.declaredElement!);
     _checkForTypeAliasCannotReferenceItself(
-        node.name, node.declaredElement as TypeAliasElementImpl);
+        node.name2, node.declaredElement as TypeAliasElementImpl);
     super.visitGenericTypeAlias(node);
   }
 
@@ -859,7 +870,7 @@
   void visitImportDirective(ImportDirective node) {
     var importElement = node.element2;
     if (node.prefix != null) {
-      _checkForBuiltInIdentifierAsName(node.prefix!,
+      _checkForBuiltInIdentifierAsName(node.prefix!.token,
           CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_PREFIX_NAME);
     }
     if (importElement != null) {
@@ -939,7 +950,7 @@
     _withEnclosingExecutable(node.declaredElement!, () {
       var returnType = node.returnType;
       if (node.isSetter) {
-        _checkForWrongNumberOfParametersForSetter(node.name, node.parameters);
+        _checkForWrongNumberOfParametersForSetter(node.name2, node.parameters);
         _checkForNonVoidReturnTypeForSetter(returnType);
       } else if (node.isOperator) {
         var hasWrongNumberOfParameters =
@@ -954,7 +965,7 @@
       _checkForExtensionDeclaresMemberOfObject(node);
       _checkForTypeAnnotationDeferredClass(returnType);
       _returnTypeVerifier.verifyReturnType(returnType);
-      _checkForImplicitDynamicReturn(node, node.declaredElement!);
+      _checkForImplicitDynamicReturn(node.name2, node.declaredElement!);
       _checkForWrongTypeParameterVarianceInMethod(node);
       super.visitMethodDeclaration(node);
     });
@@ -989,7 +1000,7 @@
       List<ClassMember> members = node.members;
       _duplicateDefinitionVerifier.checkMixin(node);
       _checkForBuiltInIdentifierAsName(
-          node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME);
+          node.name2, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME);
       _checkForConflictingClassTypeVariableErrorCodes();
 
       var onClause = node.onClause;
@@ -1002,7 +1013,7 @@
 
       _checkForConflictingClassMembers();
       _checkForFinalNotInitializedInClass(members);
-      _checkForMainFunction(node.name);
+      _checkForMainFunction1(node.name2, node.declaredElement!);
       _checkForWrongTypeParameterVarianceInSuperinterfaces();
       //      _checkForBadFunctionUse(node);
       super.visitMixinDeclaration(node);
@@ -1138,7 +1149,8 @@
     // - DefaultFormalParameter contains a simple one, so it gets here,
     // - FieldFormalParameter error should be reported on the field,
     // - FunctionTypedFormalParameter is a function type, not dynamic.
-    _checkForImplicitDynamicIdentifier(node, node.identifier);
+    _checkForImplicitDynamicIdentifier(node, node.name,
+        variable: node.declaredElement!);
 
     super.visitSimpleFormalParameter(node);
   }
@@ -1196,23 +1208,23 @@
     var superParameter = element.superConstructorParameter;
 
     if (superParameter == null) {
-      errorReporter.reportErrorForNode(
+      errorReporter.reportErrorForToken(
         node.isNamed
             ? CompileTimeErrorCode
                 .SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED
             : CompileTimeErrorCode
                 .SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_POSITIONAL,
-        node.identifier,
+        node.name,
       );
       return;
     }
 
     if (!_currentLibrary.typeSystem
         .isSubtypeOf(element.type, superParameter.type)) {
-      errorReporter.reportErrorForNode(
+      errorReporter.reportErrorForToken(
         CompileTimeErrorCode
             .SUPER_FORMAL_PARAMETER_TYPE_IS_NOT_SUBTYPE_OF_ASSOCIATED,
-        node.identifier,
+        node.name,
         [element.type, superParameter.type],
       );
     }
@@ -1261,8 +1273,8 @@
     _checkForFinalNotInitialized(node.variables);
     _checkForNotInitializedNonNullableVariable(node.variables, true);
 
-    for (var declaration in node.variables.variables) {
-      _checkForMainFunction(declaration.name);
+    for (var variable in node.variables.variables) {
+      _checkForMainFunction1(variable.name2, variable.declaredElement!);
     }
 
     super.visitTopLevelVariableDeclaration(node);
@@ -1279,7 +1291,7 @@
 
   @override
   void visitTypeParameter(TypeParameter node) {
-    _checkForBuiltInIdentifierAsName(node.name,
+    _checkForBuiltInIdentifierAsName(node.name2,
         CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME);
     _checkForTypeAnnotationDeferredClass(node.bound);
     _checkForImplicitDynamicType(node.bound);
@@ -1297,15 +1309,14 @@
 
   @override
   void visitVariableDeclaration(VariableDeclaration node) {
-    SimpleIdentifier nameNode = node.name;
+    final nameToken = node.name2;
     var initializerNode = node.initializer;
     // do checks
-    _checkForImplicitDynamicIdentifier(node, nameNode);
+    _checkForImplicitDynamicIdentifier(node, nameToken,
+        variable: node.declaredElement!);
     _checkForAbstractOrExternalVariableInitializer(node);
-    // visit name
-    nameNode.accept(this);
     // visit initializer
-    String name = nameNode.name;
+    String name = nameToken.lexeme;
     _namesForReferenceToDeclaredVariableInInitializer.add(name);
     try {
       if (initializerNode != null) {
@@ -1393,14 +1404,16 @@
   }
 
   void _checkForAbstractOrExternalFieldConstructorInitializer(
-      AstNode node, FieldElement fieldElement) {
+      Token identifier, FieldElement fieldElement) {
     if (fieldElement.isAbstract) {
-      errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.ABSTRACT_FIELD_CONSTRUCTOR_INITIALIZER, node);
+      errorReporter.reportErrorForToken(
+          CompileTimeErrorCode.ABSTRACT_FIELD_CONSTRUCTOR_INITIALIZER,
+          identifier);
     }
     if (fieldElement.isExternal) {
-      errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.EXTERNAL_FIELD_CONSTRUCTOR_INITIALIZER, node);
+      errorReporter.reportErrorForToken(
+          CompileTimeErrorCode.EXTERNAL_FIELD_CONSTRUCTOR_INITIALIZER,
+          identifier);
     }
   }
 
@@ -1410,17 +1423,17 @@
     if (node.initializer != null) {
       if (declaredElement is FieldElement) {
         if (declaredElement.isAbstract) {
-          errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.ABSTRACT_FIELD_INITIALIZER, node.name);
+          errorReporter.reportErrorForToken(
+              CompileTimeErrorCode.ABSTRACT_FIELD_INITIALIZER, node.name2);
         }
         if (declaredElement.isExternal) {
-          errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.EXTERNAL_FIELD_INITIALIZER, node.name);
+          errorReporter.reportErrorForToken(
+              CompileTimeErrorCode.EXTERNAL_FIELD_INITIALIZER, node.name2);
         }
       } else if (declaredElement is TopLevelVariableElement) {
         if (declaredElement.isExternal) {
-          errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.EXTERNAL_VARIABLE_INITIALIZER, node.name);
+          errorReporter.reportErrorForToken(
+              CompileTimeErrorCode.EXTERNAL_VARIABLE_INITIALIZER, node.name2);
         }
       }
     }
@@ -1624,7 +1637,7 @@
         errorReporter.reportErrorForNode(
           CompileTimeErrorCode.ASSIGNMENT_TO_FINAL_NO_SETTER,
           highlightedNode,
-          [variable.name, variable.enclosingElement2.displayName],
+          [variable.name, variable.enclosingElement3.displayName],
         );
       } else {
         errorReporter.reportErrorForNode(
@@ -1695,19 +1708,16 @@
     }
   }
 
-  /// Verify that the given [identifier] is not a keyword, and generates the
+  /// Verify that the given [token] is not a keyword, and generates the
   /// given [errorCode] on the identifier if it is a keyword.
   ///
   /// See [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_EXTENSION_NAME],
   /// [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME],
   /// [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME], and
   /// [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME].
-  void _checkForBuiltInIdentifierAsName(
-      SimpleIdentifier identifier, ErrorCode errorCode) {
-    Token token = identifier.token;
+  void _checkForBuiltInIdentifierAsName(Token token, ErrorCode errorCode) {
     if (token.type.isKeyword && token.keyword?.isPseudo != true) {
-      errorReporter
-          .reportErrorForNode(errorCode, identifier, [identifier.name]);
+      errorReporter.reportErrorForToken(errorCode, token, [token.lexeme]);
     }
   }
 
@@ -1797,14 +1807,14 @@
             CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE, method, [
           _enclosingClass!.displayName,
           name,
-          inherited.enclosingElement2.displayName,
+          inherited.enclosingElement3.displayName,
         ]);
       } else if (inherited is PropertyAccessorElement) {
         errorReporter.reportErrorForElement(
             CompileTimeErrorCode.CONFLICTING_METHOD_AND_FIELD, method, [
           _enclosingClass!.displayName,
           name,
-          inherited.enclosingElement2.displayName
+          inherited.enclosingElement3.displayName
         ]);
       }
     }
@@ -1824,14 +1834,14 @@
             CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE, accessor, [
           _enclosingClass!.displayName,
           name,
-          inherited.enclosingElement2.displayName,
+          inherited.enclosingElement3.displayName,
         ]);
       } else if (inherited is MethodElement) {
         errorReporter.reportErrorForElement(
             CompileTimeErrorCode.CONFLICTING_FIELD_AND_METHOD, accessor, [
           _enclosingClass!.displayName,
           name,
-          inherited.enclosingElement2.displayName
+          inherited.enclosingElement3.displayName
         ]);
       }
     }
@@ -1923,9 +1933,9 @@
 
     for (var error in errors) {
       if (error is IncompatibleInterfacesClassHierarchyError) {
-        errorReporter.reportErrorForNode(
+        errorReporter.reportErrorForToken(
           CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES,
-          node.name,
+          node.name2,
           [
             _enclosingClass!.name,
             error.first.getDisplayString(withNullability: true),
@@ -2089,11 +2099,11 @@
       errorReporter.reportErrorForNode(
           CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
           constructor.returnType,
-          ["'${field.enclosingElement2.name}.${field.name}'"]);
+          ["'${field.enclosingElement3.name}.${field.name}'"]);
       return true;
     } else if (instanceFields.length > 1) {
       var fieldNames = instanceFields
-          .map((field) => "'${field.enclosingElement2.name}.${field.name}'")
+          .map((field) => "'${field.enclosingElement3.name}.${field.name}'")
           .join(', ');
       errorReporter.reportErrorForNode(
           CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELDS,
@@ -2117,7 +2127,7 @@
         errorReporter.reportErrorForNode(
             CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER,
             initializer,
-            [element.enclosingElement2.displayName]);
+            [element.enclosingElement3.displayName]);
         return true;
       }
     }
@@ -2155,8 +2165,8 @@
       return;
     }
     // check if there is non-final field
-    ClassElement classElement = constructorElement.enclosingElement2;
-    if (!classElement.hasNonFinalField) {
+    final classElement = constructorElement.enclosingElement3;
+    if (classElement is ClassElement && !classElement.hasNonFinalField) {
       return;
     }
     errorReporter.reportErrorForName(
@@ -2346,7 +2356,7 @@
 
   /// Return `true` if the caller should continue checking the rest of the
   /// information in the for-each part.
-  bool _checkForEachParts(ForEachParts node, SimpleIdentifier variable) {
+  bool _checkForEachParts(ForEachParts node, Element? variableElement) {
     if (checkForUseOfVoidResult(node.iterable)) {
       return false;
     }
@@ -2382,7 +2392,6 @@
 
     // The type of the loop variable.
     DartType variableType;
-    var variableElement = variable.staticElement;
     if (variableElement is VariableElement) {
       variableType = variableElement.type;
     } else {
@@ -2485,9 +2494,9 @@
         allowSuperBounded: true,
       );
       if (isWellBounded is NotWellBoundedTypeResult) {
-        errorReporter.reportErrorForNode(
+        errorReporter.reportErrorForToken(
           CompileTimeErrorCode.ENUM_INSTANTIATED_TO_BOUNDS_IS_NOT_WELL_BOUNDED,
-          node.name,
+          node.name2,
         );
       }
     }
@@ -2630,15 +2639,15 @@
   void _checkForExtensionDeclaresMemberOfObject(MethodDeclaration node) {
     if (_enclosingExtension == null) return;
 
-    var name = node.name.name;
+    var name = node.name2.lexeme;
     if (name == '==' ||
         name == 'hashCode' ||
         name == 'toString' ||
         name == 'runtimeType' ||
         name == FunctionElement.NO_SUCH_METHOD_METHOD_NAME) {
-      errorReporter.reportErrorForNode(
+      errorReporter.reportErrorForToken(
         CompileTimeErrorCode.EXTENSION_DECLARES_MEMBER_OF_OBJECT,
-        node.name,
+        node.name2,
       );
     }
   }
@@ -2705,10 +2714,10 @@
     for (VariableDeclaration variable in variables) {
       if (variable.initializer == null) {
         if (isConst) {
-          errorReporter.reportErrorForNode(
+          errorReporter.reportErrorForToken(
               CompileTimeErrorCode.CONST_NOT_INITIALIZED,
-              variable.name,
-              [variable.name.name]);
+              variable.name2,
+              [variable.name2.lexeme]);
         } else {
           var variableElement = variable.declaredElement;
           if (variableElement is FieldElement &&
@@ -2718,10 +2727,10 @@
               variableElement.isExternal) {
             // External top level variables can't be initialized, so no error.
           } else if (!_isNonNullableByDefault || !variable.isLate) {
-            errorReporter.reportErrorForNode(
+            errorReporter.reportErrorForToken(
                 CompileTimeErrorCode.FINAL_NOT_INITIALIZED,
-                variable.name,
-                [variable.name.name]);
+                variable.name2,
+                [variable.name2.lexeme]);
           }
         }
       }
@@ -2819,14 +2828,18 @@
     return foundError;
   }
 
-  void _checkForImplicitDynamicIdentifier(AstNode node, Identifier? id) {
+  void _checkForImplicitDynamicIdentifier(
+    AstNode node,
+    Token? id, {
+    required VariableElement variable,
+  }) {
+    if (id == null) {
+      return;
+    }
     if (_options.implicitDynamic) {
       return;
     }
-    var variable = getVariableElement(id);
-    if (variable != null &&
-        variable.hasImplicitType &&
-        variable.type.isDynamic) {
+    if (variable.hasImplicitType && variable.type.isDynamic) {
       ErrorCode errorCode;
       if (variable is FieldElement) {
         errorCode = LanguageCode.IMPLICIT_DYNAMIC_FIELD;
@@ -2837,12 +2850,12 @@
       }
       // Parameters associated with a variable always have a name, so we can
       // safely rely on [id] being non-`null`.
-      errorReporter.reportErrorForNode(errorCode, node, [id!.toSource()]);
+      errorReporter.reportErrorForNode(errorCode, node, [id.lexeme]);
     }
   }
 
   void _checkForImplicitDynamicReturn(
-      AstNode functionName, ExecutableElement element) {
+      Token functionName, ExecutableElement element) {
     if (_options.implicitDynamic) {
       return;
     }
@@ -2850,7 +2863,7 @@
       return;
     }
     if (element.hasImplicitReturnType && element.returnType.isDynamic) {
-      errorReporter.reportErrorForNode(LanguageCode.IMPLICIT_DYNAMIC_RETURN,
+      errorReporter.reportErrorForToken(LanguageCode.IMPLICIT_DYNAMIC_RETURN,
           functionName, [element.displayName]);
     }
   }
@@ -2921,7 +2934,7 @@
         // OK, instance member
         return;
       }
-      Element enclosingElement = element.enclosingElement2;
+      Element enclosingElement = element.enclosingElement3;
       if (enclosingElement is ExtensionElement) {
         if (target is ExtensionOverride) {
           // OK, target is an extension override
@@ -3003,7 +3016,7 @@
     var constructorElement = node.staticElement;
     if (constructorElement != null &&
         constructorElement.isGenerative &&
-        constructorElement.enclosingElement2.isEnum) {
+        constructorElement.enclosingElement3 is EnumElement) {
       if (_currentLibrary.featureSet.isEnabled(Feature.enhanced_enums)) {
         errorReporter.reportErrorForNode(
           CompileTimeErrorCode.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR,
@@ -3046,7 +3059,7 @@
       return;
     }
     // not a class member
-    Element enclosingElement = element.enclosingElement2;
+    Element enclosingElement = element.enclosingElement3;
     if (enclosingElement is! ClassElement &&
         enclosingElement is! ExtensionElement) {
       return;
@@ -3174,48 +3187,62 @@
     }
   }
 
-  void _checkForMainFunction(SimpleIdentifier nameNode) {
+  void _checkForMainFunction1(Token nameToken, Element declaredElement) {
     if (!_currentLibrary.isNonNullableByDefault) {
       return;
     }
 
-    var element = nameNode.staticElement!;
-
     // We should only check exported declarations, i.e. top-level.
-    if (element.enclosingElement2 is! CompilationUnitElement) {
+    if (declaredElement.enclosingElement3 is! CompilationUnitElement) {
       return;
     }
 
-    if (element.displayName != 'main') {
+    if (declaredElement.displayName != 'main') {
       return;
     }
 
-    if (element is! FunctionElement) {
-      errorReporter.reportErrorForNode(
+    if (declaredElement is! FunctionElement) {
+      errorReporter.reportErrorForToken(
         CompileTimeErrorCode.MAIN_IS_NOT_FUNCTION,
-        nameNode,
+        nameToken,
       );
+    }
+  }
+
+  void _checkForMainFunction2(FunctionDeclaration functionDeclaration) {
+    if (!_currentLibrary.isNonNullableByDefault) {
       return;
     }
 
-    var functionDeclaration = nameNode.parent as FunctionDeclaration;
-    var functionExpression = functionDeclaration.functionExpression;
-    var parameters = functionExpression.parameters!.parameters;
+    if (functionDeclaration.name2.lexeme != 'main') {
+      return;
+    }
+
+    if (functionDeclaration.parent is! CompilationUnit) {
+      return;
+    }
+
+    final parameterList = functionDeclaration.functionExpression.parameters;
+    if (parameterList == null) {
+      return;
+    }
+
+    var parameters = parameterList.parameters;
     var positional = parameters.where((e) => e.isPositional).toList();
     var requiredPositional =
         parameters.where((e) => e.isRequiredPositional).toList();
 
     if (requiredPositional.length > 2) {
-      errorReporter.reportErrorForNode(
+      errorReporter.reportErrorForToken(
         CompileTimeErrorCode.MAIN_HAS_TOO_MANY_REQUIRED_POSITIONAL_PARAMETERS,
-        nameNode,
+        functionDeclaration.name2,
       );
     }
 
     if (parameters.any((e) => e.isRequiredNamed)) {
-      errorReporter.reportErrorForNode(
+      errorReporter.reportErrorForToken(
         CompileTimeErrorCode.MAIN_HAS_REQUIRED_NAMED_PARAMETERS,
-        nameNode,
+        functionDeclaration.name2,
       );
     }
 
@@ -3496,14 +3523,14 @@
         );
         if (inheritedMember != null) {
           // Inherited members are always contained inside named elements, so we
-          // can safely assume `inheritedMember.enclosingElement2.name` is
+          // can safely assume `inheritedMember.enclosingElement3.name` is
           // non-`null`.
           errorReporter.reportErrorForNode(
               CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION,
               namedType, [
             name,
             namedType.name.name,
-            inheritedMember.enclosingElement2.name!
+            inheritedMember.enclosingElement3.name!
           ]);
           return true;
         }
@@ -3613,9 +3640,9 @@
         : superUnnamedConstructor;
     if (superUnnamedConstructor != null) {
       if (superUnnamedConstructor.isFactory) {
-        errorReporter.reportErrorForNode(
+        errorReporter.reportErrorForToken(
             CompileTimeErrorCode.NON_GENERATIVE_IMPLICIT_CONSTRUCTOR,
-            declaration.name, [
+            declaration.name2, [
           superElement.name,
           _enclosingClass!.name,
           superUnnamedConstructor
@@ -3630,9 +3657,9 @@
     if (!_typeProvider.isNonSubtypableClass(superType.element)) {
       // Don't report this diagnostic for non-subtypable classes because the
       // real problem was already reported.
-      errorReporter.reportErrorForNode(
+      errorReporter.reportErrorForToken(
           CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
-          declaration.name,
+          declaration.name2,
           [superType, _enclosingClass!.displayName]);
     }
   }
@@ -3718,9 +3745,9 @@
       return;
     }
 
-    errorReporter.reportErrorForNode(
+    errorReporter.reportErrorForToken(
       CompileTimeErrorCode.NON_FINAL_FIELD_IN_ENUM,
-      variableList.variables.first.name,
+      variableList.variables.first.name2,
     );
   }
 
@@ -3730,8 +3757,7 @@
   /// See [CompileTimeErrorCode.NON_VOID_RETURN_FOR_OPERATOR].
   void _checkForNonVoidReturnTypeForOperator(MethodDeclaration declaration) {
     // check that []= operator
-    SimpleIdentifier name = declaration.name;
-    if (name.name != "[]=") {
+    if (declaration.name2.lexeme != "[]=") {
       return;
     }
     // check return type
@@ -3784,7 +3810,7 @@
       errorReporter.reportErrorForNode(
         CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD,
         field,
-        [field.name.name],
+        [field.name2.lexeme],
       );
     }
   }
@@ -3835,10 +3861,10 @@
 
     for (var variable in node.variables) {
       if (variable.initializer == null) {
-        errorReporter.reportErrorForNode(
+        errorReporter.reportErrorForToken(
           CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_VARIABLE,
-          variable.name,
-          [variable.name.name],
+          variable.name2,
+          [variable.name2.lexeme],
         );
       }
     }
@@ -3952,12 +3978,12 @@
       return;
     }
     // name should start with '_'
-    var name = parameter.identifier;
-    if (name == null || name.isSynthetic || !name.name.startsWith('_')) {
+    var name = parameter.name;
+    if (name == null || name.isSynthetic || !name.lexeme.startsWith('_')) {
       return;
     }
 
-    errorReporter.reportErrorForNode(
+    errorReporter.reportErrorForToken(
         CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, name);
   }
 
@@ -4020,10 +4046,10 @@
     for (FormalParameter parameter in declaration.parameters.parameters) {
       if (parameter is DefaultFormalParameter &&
           parameter.defaultValue != null) {
-        errorReporter.reportErrorForNode(
+        errorReporter.reportErrorForToken(
             CompileTimeErrorCode
                 .DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR,
-            parameter.identifier!);
+            parameter.name!);
       }
     }
     var redirectedElement = redirectedConstructor.staticElement;
@@ -4032,15 +4058,15 @@
       redirectedElement,
       redirectedConstructor,
     );
-    var redirectedClass = redirectedElement?.enclosingElement2;
+    var redirectedClass = redirectedElement?.enclosingElement3;
     if (redirectedClass is ClassElement &&
         redirectedClass.isAbstract &&
         redirectedElement != null &&
         !redirectedElement.isFactory) {
       String enclosingNamedType = _enclosingClass!.displayName;
       String constructorStrName = enclosingNamedType;
-      if (declaration.name != null) {
-        constructorStrName += ".${declaration.name!.name}";
+      if (declaration.name2 != null) {
+        constructorStrName += ".${declaration.name2!.lexeme}";
       }
       errorReporter.reportErrorForNode(
           CompileTimeErrorCode.REDIRECT_TO_ABSTRACT_CLASS_CONSTRUCTOR,
@@ -4258,13 +4284,13 @@
   ///
   /// See [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF].
   void _checkForTypeAliasCannotReferenceItself(
-    SimpleIdentifier nameNode,
+    Token nameToken,
     TypeAliasElementImpl element,
   ) {
     if (element.hasSelfReference) {
-      errorReporter.reportErrorForNode(
+      errorReporter.reportErrorForToken(
         CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
-        nameNode,
+        nameToken,
       );
     }
   }
@@ -4307,9 +4333,9 @@
             var element = parameter.declaredElement!;
             // This error can only occur if there is a bound, so we can saefly
             // assume `element.bound` is non-`null`.
-            errorReporter.reportErrorForNode(
+            errorReporter.reportErrorForToken(
               CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND,
-              parameter.name,
+              parameter.name2,
               [element.displayName, element.bound!],
             );
             break;
@@ -4323,7 +4349,7 @@
     if (_enclosingExecutable.inStaticMethod || _isInStaticVariableDeclaration) {
       var element = identifier.staticElement;
       if (element is TypeParameterElement &&
-          element.enclosingElement2 is ClassElement) {
+          element.enclosingElement3 is ClassElement) {
         // The class's type parameters are not in scope for static methods.
         // However all other type parameters are legal (e.g. the static method's
         // type parameters, or a local function's type parameters).
@@ -4414,7 +4440,7 @@
 
     void reportError(ErrorCode errorCode, List<Object> arguments) {
       Identifier returnType = constructor.returnType;
-      var name = constructor.name;
+      var name = constructor.name2;
       int offset = returnType.offset;
       int length = (name != null ? name.end : returnType.end) - offset;
       errorReporter.reportErrorForOffset(errorCode, offset, length, arguments);
@@ -4565,7 +4591,7 @@
     if (element == null || element is TypeParameterElement) {
       return;
     }
-    var enclosingElement = element.enclosingElement2;
+    var enclosingElement = element.enclosingElement3;
     if (identical(enclosingElement, _enclosingClass)) {
       return;
     }
@@ -4607,7 +4633,7 @@
         errorReporter.reportErrorForNode(
             CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD,
             parameter,
-            [parameter.identifier.name]);
+            [parameter.name.lexeme]);
       } else {
         var parameterElement = parameter.declaredElement!;
         if (parameterElement is FieldFormalParameterElementImpl) {
@@ -4617,12 +4643,12 @@
             errorReporter.reportErrorForNode(
                 CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD,
                 parameter,
-                [parameter.identifier.name]);
+                [parameter.name.lexeme]);
           } else if (fieldElement.isStatic) {
             errorReporter.reportErrorForNode(
                 CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD,
                 parameter,
-                [parameter.identifier.name]);
+                [parameter.name.lexeme]);
           } else if (!typeSystem.isSubtypeOf(declaredType, fieldType)) {
             errorReporter.reportErrorForNode(
                 CompileTimeErrorCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE,
@@ -4634,12 +4660,12 @@
             errorReporter.reportErrorForNode(
                 CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD,
                 parameter,
-                [parameter.identifier.name]);
+                [parameter.name.lexeme]);
           } else if (fieldElement.isStatic) {
             errorReporter.reportErrorForNode(
                 CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD,
                 parameter,
-                [parameter.identifier.name]);
+                [parameter.name.lexeme]);
           }
         }
       }
@@ -4666,8 +4692,8 @@
     }
     int numParameters = parameterList.parameters.length;
     // prepare operator name
-    SimpleIdentifier nameNode = declaration.name;
-    String name = nameNode.name;
+    final nameToken = declaration.name2;
+    final name = nameToken.lexeme;
     // check for exact number of parameters
     int expected = -1;
     if ("[]=" == name) {
@@ -4694,15 +4720,15 @@
       expected = 0;
     }
     if (expected != -1 && numParameters != expected) {
-      errorReporter.reportErrorForNode(
+      errorReporter.reportErrorForToken(
           CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR,
-          nameNode,
+          nameToken,
           [name, expected, numParameters]);
       return true;
     } else if ("-" == name && numParameters > 1) {
-      errorReporter.reportErrorForNode(
+      errorReporter.reportErrorForToken(
           CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS,
-          nameNode,
+          nameToken,
           [numParameters]);
       return true;
     }
@@ -4718,14 +4744,14 @@
   ///
   /// See [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER].
   void _checkForWrongNumberOfParametersForSetter(
-      SimpleIdentifier setterName, FormalParameterList? parameterList) {
+      Token setterName, FormalParameterList? parameterList) {
     if (parameterList == null) {
       return;
     }
 
     NodeList<FormalParameter> parameters = parameterList.parameters;
     if (parameters.length != 1 || !parameters[0].isRequiredPositional) {
-      errorReporter.reportErrorForNode(
+      errorReporter.reportErrorForToken(
           CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER,
           setterName);
     }
@@ -4739,7 +4765,7 @@
         if (!(typeParameter as TypeParameterElementImpl).isLegacyCovariant) {
           var fields = node.fields;
           var fieldElement = fields.variables.first.declaredElement!;
-          var fieldName = fields.variables.first.name;
+          var fieldName = fields.variables.first.name2;
           Variance fieldVariance = Variance(typeParameter, fieldElement.type);
 
           _checkForWrongVariancePosition(
@@ -4872,14 +4898,15 @@
   ///
   /// Errors should only be reported in classes and mixins since those are the
   /// only components that allow explicit variance modifiers.
-  void _checkForWrongVariancePosition(
-      Variance variance, TypeParameterElement typeParameter, AstNode node) {
+  void _checkForWrongVariancePosition(Variance variance,
+      TypeParameterElement typeParameter, SyntacticEntity errorTarget) {
     TypeParameterElementImpl typeParameterImpl =
         typeParameter as TypeParameterElementImpl;
     if (!variance.greaterThanOrEqual(typeParameterImpl.variance)) {
-      errorReporter.reportErrorForNode(
+      errorReporter.reportErrorForOffset(
         CompileTimeErrorCode.WRONG_TYPE_PARAMETER_VARIANCE_POSITION,
-        node,
+        errorTarget.offset,
+        errorTarget.length,
         [
           typeParameterImpl.variance.toKeywordString(),
           typeParameterImpl.name,
@@ -5040,10 +5067,11 @@
       if (parameter is DefaultFormalParameter) {
         if (parameter.isRequiredNamed) {
           if (parameter.defaultValue != null) {
-            var parameterName = _parameterName(parameter);
-            errorReporter.reportErrorForNode(
+            final errorTarget = _parameterName(parameter) ?? parameter;
+            errorReporter.reportErrorForOffset(
               CompileTimeErrorCode.DEFAULT_VALUE_ON_REQUIRED_PARAMETER,
-              parameterName ?? parameter,
+              errorTarget.offset,
+              errorTarget.length,
             );
           }
         } else if (defaultValuesAreExpected) {
@@ -5051,18 +5079,21 @@
           if (!parameterElement.hasDefaultValue) {
             var type = parameterElement.type;
             if (typeSystem.isPotentiallyNonNullable(type)) {
-              var parameterName = _parameterName(parameter);
+              final parameterName = _parameterName(parameter);
+              final errorTarget = parameterName ?? parameter;
               if (parameterElement.hasRequired) {
-                errorReporter.reportErrorForNode(
+                errorReporter.reportErrorForOffset(
                   CompileTimeErrorCode
                       .MISSING_DEFAULT_VALUE_FOR_PARAMETER_WITH_ANNOTATION,
-                  parameterName ?? parameter,
+                  errorTarget.offset,
+                  errorTarget.length,
                 );
               } else {
-                errorReporter.reportErrorForNode(
+                errorReporter.reportErrorForOffset(
                   CompileTimeErrorCode.MISSING_DEFAULT_VALUE_FOR_PARAMETER,
-                  parameterName ?? parameter,
-                  [parameterName?.name ?? '?'],
+                  errorTarget.offset,
+                  errorTarget.length,
+                  [parameterName?.lexeme ?? '?'],
                 );
               }
             }
@@ -5181,11 +5212,11 @@
 
   /// Return the name of the [parameter], or `null` if the parameter does not
   /// have a name.
-  SimpleIdentifier? _parameterName(FormalParameter parameter) {
+  Token? _parameterName(FormalParameter parameter) {
     if (parameter is NormalFormalParameter) {
-      return parameter.identifier;
+      return parameter.name;
     } else if (parameter is DefaultFormalParameter) {
-      return parameter.parameter.identifier;
+      return parameter.parameter.name;
     }
     return null;
   }
@@ -5260,8 +5291,8 @@
         parameter = parameter.parameter;
       }
       if (parameter is FieldFormalParameter) {
-        FieldFormalParameterElement element =
-            parameter.identifier.staticElement as FieldFormalParameterElement;
+        final element =
+            parameter.declaredElement as FieldFormalParameterElement;
         fields.remove(element.field);
       }
     }
diff --git a/pkg/analyzer/lib/src/generated/ffi_verifier.dart b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
index 57d16b5..8750f1f 100644
--- a/pkg/analyzer/lib/src/generated/ffi_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
@@ -86,8 +87,8 @@
           inCompound = true;
           compound = node;
           if (node.declaredElement!.isEmptyStruct) {
-            _errorReporter.reportErrorForNode(
-                FfiCode.EMPTY_STRUCT, node.name, [node.name.name, className]);
+            _errorReporter.reportErrorForToken(FfiCode.EMPTY_STRUCT, node.name2,
+                [node.name2.lexeme, className]);
           }
           if (className == _structClassName) {
             _validatePackedAnnotation(node.metadata);
@@ -95,21 +96,21 @@
         } else if (className == _abiSpecificIntegerClassName) {
           _validateAbiSpecificIntegerAnnotation(node);
           _validateAbiSpecificIntegerMappingAnnotation(
-              node.name, node.metadata);
+              node.name2, node.metadata);
         } else if (className != _allocatorClassName &&
             className != _opaqueClassName &&
             className != _abiSpecificIntegerClassName) {
           _errorReporter.reportErrorForNode(
               FfiCode.SUBTYPE_OF_FFI_CLASS_IN_EXTENDS,
               superclass.name,
-              [node.name.name, superclass.name.name]);
+              [node.name2.lexeme, superclass.name.name]);
         }
       } else if (superclass.isCompoundSubtype ||
           superclass.isAbiSpecificIntegerSubtype) {
         _errorReporter.reportErrorForNode(
             FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_EXTENDS,
             superclass,
-            [node.name.name, superclass.name.name]);
+            [node.name2.lexeme, superclass.name.name]);
       }
     }
 
@@ -123,11 +124,11 @@
       }
       if (typename.ffiClass != null) {
         _errorReporter.reportErrorForNode(subtypeOfFfiCode, typename,
-            [node.name.name, typename.name.toSource()]);
+            [node.name2.lexeme, typename.name.toSource()]);
       } else if (typename.isCompoundSubtype ||
           typename.isAbiSpecificIntegerSubtype) {
         _errorReporter.reportErrorForNode(subtypeOfStructCode, typename,
-            [node.name.name, typename.name.toSource()]);
+            [node.name2.lexeme, typename.name.toSource()]);
       }
     }
 
@@ -148,8 +149,8 @@
 
     if (inCompound) {
       if (node.declaredElement!.typeParameters.isNotEmpty) {
-        _errorReporter.reportErrorForNode(
-            FfiCode.GENERIC_STRUCT_SUBCLASS, node.name, [node.name.name]);
+        _errorReporter.reportErrorForToken(
+            FfiCode.GENERIC_STRUCT_SUBCLASS, node.name2, [node.name2.lexeme]);
       }
       final implementsClause = node.implementsClause;
       if (implementsClause != null) {
@@ -159,10 +160,10 @@
         final finalizableElement = ffiLibrary.getType(_finalizableClassName)!;
         final finalizableType = finalizableElement.thisType;
         if (typeSystem.isSubtypeOf(compoundType, finalizableType)) {
-          _errorReporter.reportErrorForNode(
+          _errorReporter.reportErrorForToken(
               FfiCode.COMPOUND_IMPLEMENTS_FINALIZABLE,
-              node.name,
-              [node.name.name]);
+              node.name2,
+              [node.name2.lexeme]);
         }
       }
     }
@@ -203,7 +204,7 @@
   void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     var element = node.staticElement;
     if (element is MethodElement) {
-      var enclosingElement = element.enclosingElement2;
+      var enclosingElement = element.enclosingElement3;
       if (enclosingElement.isAllocatorExtension &&
           element.name == _allocateExtensionMethodName) {
         _validateAllocate(node);
@@ -216,7 +217,7 @@
   void visitIndexExpression(IndexExpression node) {
     var element = node.staticElement;
     if (element is MethodElement) {
-      var enclosingElement = element.enclosingElement2;
+      var enclosingElement = element.enclosingElement3;
       if (enclosingElement.isNativeStructPointerExtension ||
           enclosingElement.isNativeStructArrayExtension) {
         if (element.name == '[]') {
@@ -229,7 +230,7 @@
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     var constructor = node.constructorName.staticElement;
-    var class_ = constructor?.enclosingElement2;
+    var class_ = constructor?.enclosingElement3;
     if (class_.isStructSubclass || class_.isUnionSubclass) {
       _errorReporter.reportErrorForNode(
         FfiCode.CREATION_OF_STRUCT_OR_UNION,
@@ -254,7 +255,7 @@
   void visitMethodInvocation(MethodInvocation node) {
     var element = node.methodName.staticElement;
     if (element is MethodElement) {
-      Element enclosingElement = element.enclosingElement2;
+      Element enclosingElement = element.enclosingElement3;
       if (enclosingElement.isPointer) {
         if (element.name == 'fromFunction') {
           _validateFromFunction(node, element);
@@ -271,7 +272,7 @@
         }
       }
     } else if (element is FunctionElement) {
-      var enclosingElement = element.enclosingElement2;
+      var enclosingElement = element.enclosingElement3;
       if (enclosingElement is CompilationUnitElement) {
         if (element.library.name == 'dart.ffi') {
           if (element.name == 'sizeOf') {
@@ -287,7 +288,7 @@
   void visitPrefixedIdentifier(PrefixedIdentifier node) {
     var element = node.staticElement;
     if (element != null) {
-      var enclosingElement = element.enclosingElement2;
+      var enclosingElement = element.enclosingElement3;
       if (enclosingElement.isNativeStructPointerExtension) {
         if (element.name == 'ref') {
           _validateRefPrefixedIdentifier(node);
@@ -301,7 +302,7 @@
   void visitPropertyAccess(PropertyAccess node) {
     var element = node.propertyName.staticElement;
     if (element != null) {
-      var enclosingElement = element.enclosingElement2;
+      var enclosingElement = element.enclosingElement3;
       if (enclosingElement.isNativeStructPointerExtension) {
         if (element.name == 'ref') {
           _validateRefPropertyAccess(node);
@@ -360,7 +361,7 @@
         // Receiver can only be Pointer if the class extends
         // NativeFieldWrapperClass1.
         if (ffiSignature.normalParameterTypes[0].isPointer) {
-          final cls = declarationElement.enclosingElement2 as ClassElement;
+          final cls = declarationElement.enclosingElement3 as ClassElement;
           if (!_extendsNativeFieldWrapperClass1(cls.thisType)) {
             _errorReporter.reportErrorForNode(
                 FfiCode
@@ -611,7 +612,7 @@
   _PrimitiveDartType _typeForAnnotation(Annotation annotation) {
     var element = annotation.element;
     if (element is ConstructorElement) {
-      String name = element.enclosingElement2.name;
+      String name = element.enclosingElement3.name;
       if (_primitiveIntegerNativeTypes.contains(name)) {
         return _PrimitiveDartType.int;
       } else if (_primitiveDoubleNativeTypes.contains(name)) {
@@ -631,21 +632,21 @@
         node.members.length != 1 ||
         node.members.single is! ConstructorDeclaration ||
         (node.members.single as ConstructorDeclaration).constKeyword == null) {
-      _errorReporter.reportErrorForNode(
-          FfiCode.ABI_SPECIFIC_INTEGER_INVALID, node.name);
+      _errorReporter.reportErrorForToken(
+          FfiCode.ABI_SPECIFIC_INTEGER_INVALID, node.name2);
     }
   }
 
   /// Validate that the [annotations] include at most one mapping annotation.
   void _validateAbiSpecificIntegerMappingAnnotation(
-      AstNode errorNode, NodeList<Annotation> annotations) {
+      Token errorToken, NodeList<Annotation> annotations) {
     final ffiPackedAnnotations = annotations
         .where((annotation) => annotation.isAbiSpecificIntegerMapping)
         .toList();
 
     if (ffiPackedAnnotations.isEmpty) {
-      _errorReporter.reportErrorForNode(
-          FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_MISSING, errorNode);
+      _errorReporter.reportErrorForToken(
+          FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_MISSING, errorToken);
       return;
     }
 
@@ -724,7 +725,7 @@
     List<Annotation> extraAnnotations = [];
     for (Annotation annotation in annotations) {
       if (annotation.element.ffiClass != null ||
-          annotation.element?.enclosingElement2.isAbiSpecificIntegerSubclass ==
+          annotation.element?.enclosingElement3.isAbiSpecificIntegerSubclass ==
               true) {
         if (requiredFound) {
           extraAnnotations.add(annotation);
@@ -963,17 +964,17 @@
 
     if (typeSystem.isNonNullableByDefault) {
       if (node.externalKeyword == null) {
-        _errorReporter.reportErrorForNode(
+        _errorReporter.reportErrorForToken(
           FfiCode.FIELD_MUST_BE_EXTERNAL_IN_STRUCT,
-          fields.variables[0].name,
+          fields.variables[0].name2,
         );
       }
     }
 
     var fieldType = fields.type;
     if (fieldType == null) {
-      _errorReporter.reportErrorForNode(
-          FfiCode.MISSING_FIELD_TYPE_IN_STRUCT, fields.variables[0].name);
+      _errorReporter.reportErrorForToken(
+          FfiCode.MISSING_FIELD_TYPE_IN_STRUCT, fields.variables[0].name2);
     } else {
       DartType declaredType = fieldType.typeOrThrow;
       if (declaredType.isDartCoreInt) {
@@ -1016,9 +1017,9 @@
     if (!typeSystem.isNonNullableByDefault) {
       for (VariableDeclaration field in fields.variables) {
         if (field.initializer != null) {
-          _errorReporter.reportErrorForNode(
+          _errorReporter.reportErrorForToken(
             FfiCode.FIELD_IN_STRUCT_WITH_INITIALIZER,
-            field.name,
+            field.name2,
           );
         }
       }
@@ -1299,7 +1300,7 @@
     final element = this.element;
     return element is ConstructorElement &&
         element.ffiClass != null &&
-        element.enclosingElement2.name ==
+        element.enclosingElement3.name ==
             FfiVerifier._abiSpecificIntegerMappingClassName;
   }
 
@@ -1307,21 +1308,21 @@
     final element = this.element;
     return element is ConstructorElement &&
         element.ffiClass != null &&
-        element.enclosingElement2.name == 'Array';
+        element.enclosingElement3.name == 'Array';
   }
 
   bool get isFfiNative {
     final element = this.element;
     return element is ConstructorElement &&
         element.ffiClass != null &&
-        element.enclosingElement2.name == 'FfiNative';
+        element.enclosingElement3.name == 'FfiNative';
   }
 
   bool get isPacked {
     final element = this.element;
     return element is ConstructorElement &&
         element.ffiClass != null &&
-        element.enclosingElement2.name == 'Packed';
+        element.enclosingElement3.name == 'Packed';
   }
 }
 
@@ -1365,7 +1366,7 @@
     final element = this.element;
     return element is ConstructorElement &&
         element.ffiClass != null &&
-        element.enclosingElement2.name == 'Array';
+        element.enclosingElement3.name == 'Array';
     // Note: this is 'Array' instead of '_ArraySize' because it finds the
     // forwarding factory instead of the forwarded constructor.
   }
@@ -1374,7 +1375,7 @@
     final element = this.element;
     return element is ConstructorElement &&
         element.ffiClass != null &&
-        element.enclosingElement2.name == 'Packed';
+        element.enclosingElement3.name == 'Packed';
   }
 
   int? get packedMemberAlignment {
@@ -1389,7 +1390,7 @@
   ClassElement? get ffiClass {
     var element = this;
     if (element is ConstructorElement) {
-      element = element.enclosingElement2;
+      element = element.enclosingElement3;
     }
     if (element is ClassElement && element.isFfiClass) {
       return element;
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 9123552..ce5307a 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -431,7 +431,7 @@
 
   void checkForBodyMayCompleteNormally({
     required FunctionBody body,
-    required AstNode errorNode,
+    required SyntacticEntity errorNode,
   }) {
     if (!_isNonNullableByDefault) return;
     if (!flowAnalysis.flow!.isReachable) {
@@ -499,8 +499,8 @@
           errorNode.block.leftBracket,
           [returnType],
         );
-      } else {
-        errorReporter.reportErrorForNode(
+      } else if (errorNode is Token) {
+        errorReporter.reportErrorForToken(
           errorCode,
           errorNode,
           [returnType],
@@ -1249,7 +1249,6 @@
       node.documentationComment?.accept(this);
       node.metadata.accept(this);
       node.returnType.accept(this);
-      node.name?.accept(this);
       node.parameters.accept(this);
       node.initializers.accept(this);
       node.redirectedConstructor?.accept(this);
@@ -1409,9 +1408,12 @@
       if (constructorElement != null) {
         node.constructorElement = constructorElement;
         if (!constructorElement.isConst && constructorElement.isFactory) {
-          errorReporter.reportErrorForNode(
+          final errorTarget =
+              node.arguments?.constructorSelector?.name ?? node.name2;
+          errorReporter.reportErrorForOffset(
             CompileTimeErrorCode.ENUM_CONSTANT_WITH_NON_CONST_CONSTRUCTOR,
-            node.arguments?.constructorSelector?.name ?? node.name,
+            errorTarget.offset,
+            errorTarget.length,
           );
         }
       } else {
@@ -1425,9 +1427,9 @@
               [nameNode.name],
             );
           } else {
-            errorReporter.reportErrorForNode(
+            errorReporter.reportErrorForToken(
               CompileTimeErrorCode.UNDEFINED_ENUM_CONSTRUCTOR_UNNAMED,
-              node.name,
+              node.name2,
             );
           }
         }
@@ -1457,9 +1459,9 @@
               .where((e) => e.isRequiredPositional)
               .length;
           if (requiredParameterCount != 0) {
-            errorReporter.reportErrorForNode(
+            errorReporter.reportErrorForToken(
               CompileTimeErrorCode.NOT_ENOUGH_POSITIONAL_ARGUMENTS,
-              node.name,
+              node.name2,
               [requiredParameterCount, 0],
             );
           }
@@ -1639,7 +1641,6 @@
       node.documentationComment?.accept(this);
       node.metadata.accept(this);
       node.returnType?.accept(this);
-      node.name.accept(this);
       analyzeExpression(node.functionExpression, functionType);
       elementResolver.visitFunctionDeclaration(node);
     } finally {
@@ -1649,7 +1650,7 @@
     if (!node.isSetter) {
       checkForBodyMayCompleteNormally(
         body: node.functionExpression.body,
-        errorNode: node.name,
+        errorNode: node.name2,
       );
     }
     flowAnalysis.executableDeclaration_exit(
@@ -1945,7 +1946,6 @@
       node.documentationComment?.accept(this);
       node.metadata.accept(this);
       node.returnType?.accept(this);
-      node.name.accept(this);
       node.typeParameters?.accept(this);
       node.parameters?.accept(this);
       node.body.resolve(this, returnType.isDynamic ? null : returnType);
@@ -1958,7 +1958,7 @@
     if (!node.isSetter) {
       checkForBodyMayCompleteNormally(
         body: node.body,
-        errorNode: node.name,
+        errorNode: node.name2,
       );
     }
     flowAnalysis.executableDeclaration_exit(node.body, false);
@@ -2573,8 +2573,8 @@
     }
     if (error.kind == TopLevelInferenceErrorKind.dependencyCycle) {
       var argumentsText = error.arguments.join(', ');
-      errorReporter.reportErrorForNode(CompileTimeErrorCode.TOP_LEVEL_CYCLE,
-          node.name, [node.name.name, argumentsText]);
+      errorReporter.reportErrorForToken(CompileTimeErrorCode.TOP_LEVEL_CYCLE,
+          node.name2, [node.name2.lexeme, argumentsText]);
     }
   }
 
@@ -3036,7 +3036,6 @@
   }
 
   void visitClassDeclarationInScope(ClassDeclaration node) {
-    node.name.accept(this);
     node.typeParameters?.accept(this);
     node.extendsClause?.accept(this);
     node.withClause?.accept(this);
@@ -3070,7 +3069,6 @@
     // alias's type parameter scope.  It was already visited in
     // [visitClassTypeAlias].
     node.documentationComment?.accept(this);
-    node.name.accept(this);
     node.typeParameters?.accept(this);
     node.superclass.accept(this);
     node.withClause.accept(this);
@@ -3092,7 +3090,6 @@
 
       node.metadata.accept(this);
       node.returnType.accept(this);
-      node.name?.accept(this);
       node.parameters.accept(this);
 
       try {
@@ -3171,7 +3168,6 @@
   }
 
   void visitEnumDeclarationInScope(EnumDeclaration node) {
-    node.name.accept(this);
     node.typeParameters?.accept(this);
     node.withClause?.accept(this);
     node.implementsClause?.accept(this);
@@ -3211,7 +3207,6 @@
   }
 
   void visitExtensionDeclarationInScope(ExtensionDeclaration node) {
-    node.name?.accept(this);
     node.typeParameters?.accept(this);
     node.extendedType.accept(this);
   }
@@ -3334,7 +3329,6 @@
     // Note: we don't visit metadata because it's not inside the function's type
     // parameter scope.  It was already visited in [visitFunctionDeclaration].
     node.returnType?.accept(this);
-    node.name.accept(this);
     node.functionExpression.accept(this);
   }
 
@@ -3385,7 +3379,6 @@
     // alias's type parameter scope.  It was already visited in
     // [visitFunctionTypeAlias].
     node.returnType?.accept(this);
-    node.name.accept(this);
     node.typeParameters?.accept(this);
     node.parameters.accept(this);
     // Visiting the parameters added them to the scope as a side effect.  So it
@@ -3416,7 +3409,6 @@
     // [visitFunctionTypedFormalParameter].
     node.documentationComment?.accept(this);
     node.returnType?.accept(this);
-    node.identifier.accept(this);
     node.typeParameters?.accept(this);
     node.parameters.accept(this);
   }
@@ -3469,7 +3461,6 @@
     // Note: we don't visit metadata because it's not inside the generic type
     // alias's type parameter scope.  It was already visited in
     // [visitGenericTypeAlias].
-    node.name.accept(this);
     node.typeParameters?.accept(this);
     node.type.accept(this);
   }
@@ -3513,7 +3504,6 @@
     // Note: we don't visit metadata because it's not inside the method's type
     // parameter scope.  It was already visited in [visitMethodDeclaration].
     node.returnType?.accept(this);
-    node.name.accept(this);
     node.typeParameters?.accept(this);
     node.parameters?.accept(this);
     // Visiting the parameters added them to the scope as a side effect.  So it
@@ -3555,7 +3545,6 @@
   }
 
   void visitMixinDeclarationInScope(MixinDeclaration node) {
-    node.name.accept(this);
     node.typeParameters?.accept(this);
     node.onClause?.accept(this);
     node.implementsClause?.accept(this);
@@ -3625,7 +3614,7 @@
       if (node.inSetterContext()) {
         _localVariableInfo.potentiallyMutatedInScope.add(element);
         if (_enclosingClosure != null &&
-            element.enclosingElement2 != _enclosingClosure) {
+            element.enclosingElement3 != _enclosingClosure) {
           _localVariableInfo.potentiallyMutatedInClosure.add(element);
         }
       }
diff --git a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
index a5ee15d..28b3ace 100644
--- a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
@@ -169,23 +169,25 @@
           {List<ClassMember> members = const [],
           bool isMacro = false,
           bool isAugmentation = false}) =>
-      astFactory.classDeclaration(
-          null,
-          null,
-          abstractKeyword == null
+      ClassDeclarationImpl(
+          comment: null,
+          metadata: null,
+          abstractKeyword: abstractKeyword == null
               ? null
               : TokenFactory.tokenFromKeyword(abstractKeyword),
-          isMacro ? TokenFactory.tokenFromString('macro') : null,
-          isAugmentation ? TokenFactory.tokenFromString('augment') : null,
-          TokenFactory.tokenFromKeyword(Keyword.CLASS),
-          identifier3(name),
-          typeParameters,
-          extendsClause,
-          withClause,
-          implementsClause,
-          TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
-          members,
-          TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
+          macroKeyword: isMacro ? TokenFactory.tokenFromString('macro') : null,
+          augmentKeyword:
+              isAugmentation ? TokenFactory.tokenFromString('augment') : null,
+          classKeyword: TokenFactory.tokenFromKeyword(Keyword.CLASS),
+          name: identifier3(name),
+          typeParameters: typeParameters as TypeParameterListImpl?,
+          extendsClause: extendsClause as ExtendsClauseImpl?,
+          withClause: withClause as WithClauseImpl?,
+          implementsClause: implementsClause as ImplementsClauseImpl?,
+          leftBracket: TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
+          members: members,
+          rightBracket:
+              TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
 
   static ClassTypeAliasImpl classTypeAlias(
           String name,
@@ -196,22 +198,24 @@
           ImplementsClause? implementsClause,
           {bool isMacro = false,
           bool isAugmentation = false}) =>
-      astFactory.classTypeAlias(
-          null,
-          null,
-          TokenFactory.tokenFromKeyword(Keyword.CLASS),
-          identifier3(name),
-          typeParameters,
-          TokenFactory.tokenFromType(TokenType.EQ),
-          abstractKeyword == null
-              ? null
-              : TokenFactory.tokenFromKeyword(abstractKeyword),
-          isMacro ? TokenFactory.tokenFromString('macro') : null,
-          isAugmentation ? TokenFactory.tokenFromString('augment') : null,
-          superclass,
-          withClause,
-          implementsClause,
-          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+      ClassTypeAliasImpl(
+        comment: null,
+        metadata: null,
+        typedefKeyword: TokenFactory.tokenFromKeyword(Keyword.CLASS),
+        name: identifier3(name),
+        typeParameters: typeParameters as TypeParameterListImpl?,
+        equals: TokenFactory.tokenFromType(TokenType.EQ),
+        abstractKeyword: abstractKeyword == null
+            ? null
+            : TokenFactory.tokenFromKeyword(abstractKeyword),
+        macroKeyword: isMacro ? TokenFactory.tokenFromString('macro') : null,
+        augmentKeyword:
+            isAugmentation ? TokenFactory.tokenFromString('augment') : null,
+        superclass: superclass as NamedTypeImpl,
+        withClause: withClause as WithClauseImpl,
+        implementsClause: implementsClause as ImplementsClauseImpl?,
+        semicolon: TokenFactory.tokenFromType(TokenType.SEMICOLON),
+      );
 
   static CompilationUnitImpl compilationUnit() =>
       compilationUnit8(null, [], []);
@@ -281,22 +285,24 @@
           String? name,
           FormalParameterList parameters,
           List<ConstructorInitializer> initializers) =>
-      astFactory.constructorDeclaration(
-          null,
-          null,
-          TokenFactory.tokenFromKeyword(Keyword.EXTERNAL),
-          null,
-          null,
-          returnType,
-          name == null ? null : TokenFactory.tokenFromType(TokenType.PERIOD),
-          name == null ? null : identifier3(name),
-          parameters,
-          initializers.isEmpty
-              ? null
-              : TokenFactory.tokenFromType(TokenType.PERIOD),
-          initializers,
-          null,
-          emptyFunctionBody());
+      ConstructorDeclarationImpl(
+        comment: null,
+        metadata: null,
+        externalKeyword: TokenFactory.tokenFromKeyword(Keyword.EXTERNAL),
+        constKeyword: null,
+        factoryKeyword: null,
+        returnType: returnType as IdentifierImpl,
+        period:
+            name == null ? null : TokenFactory.tokenFromType(TokenType.PERIOD),
+        name: name == null ? null : identifier3(name),
+        parameters: parameters as FormalParameterListImpl,
+        separator: initializers.isEmpty
+            ? null
+            : TokenFactory.tokenFromType(TokenType.PERIOD),
+        initializers: initializers,
+        redirectedConstructor: null,
+        body: emptyFunctionBody(),
+      );
 
   static ConstructorDeclarationImpl constructorDeclaration2(
           Keyword? constKeyword,
@@ -306,26 +312,28 @@
           FormalParameterList parameters,
           List<ConstructorInitializer> initializers,
           FunctionBody body) =>
-      astFactory.constructorDeclaration(
-          null,
-          null,
-          null,
-          constKeyword == null
-              ? null
-              : TokenFactory.tokenFromKeyword(constKeyword),
-          factoryKeyword == null
-              ? null
-              : TokenFactory.tokenFromKeyword(factoryKeyword),
-          returnType,
-          name == null ? null : TokenFactory.tokenFromType(TokenType.PERIOD),
-          name == null ? null : identifier3(name),
-          parameters,
-          initializers.isEmpty
-              ? null
-              : TokenFactory.tokenFromType(TokenType.PERIOD),
-          initializers,
-          null,
-          body);
+      ConstructorDeclarationImpl(
+        comment: null,
+        metadata: null,
+        externalKeyword: null,
+        constKeyword: constKeyword == null
+            ? null
+            : TokenFactory.tokenFromKeyword(constKeyword),
+        factoryKeyword: factoryKeyword == null
+            ? null
+            : TokenFactory.tokenFromKeyword(factoryKeyword),
+        returnType: returnType as IdentifierImpl,
+        period:
+            name == null ? null : TokenFactory.tokenFromType(TokenType.PERIOD),
+        name: name == null ? null : identifier3(name),
+        parameters: parameters as FormalParameterListImpl,
+        separator: initializers.isEmpty
+            ? null
+            : TokenFactory.tokenFromType(TokenType.PERIOD),
+        initializers: initializers,
+        redirectedConstructor: null,
+        body: body as FunctionBodyImpl,
+      );
 
   static ConstructorFieldInitializerImpl constructorFieldInitializer(
           bool prefixedWithThis, String fieldName, Expression expression) =>
@@ -356,12 +364,14 @@
 
   static DeclaredIdentifierImpl declaredIdentifier2(
           Keyword? keyword, TypeAnnotation? type, String identifier) =>
-      astFactory.declaredIdentifier(
-          null,
-          null,
-          keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
-          type,
-          identifier3(identifier));
+      DeclaredIdentifierImpl(
+        comment: null,
+        metadata: null,
+        keyword:
+            keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
+        type: type as TypeAnnotationImpl?,
+        identifier: identifier3(identifier),
+      );
 
   static DeclaredIdentifierImpl declaredIdentifier3(String identifier) =>
       declaredIdentifier2(Keyword.VAR, null, identifier);
@@ -397,14 +407,15 @@
   static ExportDirectiveImpl exportDirective(
           List<Annotation> metadata, String uri,
           [List<Combinator> combinators = const []]) =>
-      astFactory.exportDirective(
-          null,
-          metadata,
-          TokenFactory.tokenFromKeyword(Keyword.EXPORT),
-          string2(uri),
-          null,
-          combinators,
-          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+      ExportDirectiveImpl(
+        comment: null,
+        metadata: metadata,
+        exportKeyword: TokenFactory.tokenFromKeyword(Keyword.EXPORT),
+        uri: string2(uri),
+        configurations: null,
+        combinators: combinators,
+        semicolon: TokenFactory.tokenFromType(TokenType.SEMICOLON),
+      );
 
   static ExportDirectiveImpl exportDirective2(String uri,
           [List<Combinator> combinators = const []]) =>
@@ -435,23 +446,23 @@
           ShowClause? showClause,
           HideClause? hideClause,
           List<ClassMember> members = const []}) =>
-      astFactory.extensionDeclaration(
-          comment: null,
-          metadata: null,
-          extensionKeyword: TokenFactory.tokenFromKeyword(Keyword.EXTENSION),
-          typeKeyword: isExtensionTypeDeclaration
-              ? TokenFactory.tokenFromString('type')
-              : null,
-          name: identifier3(name),
-          typeParameters: typeParameters,
-          onKeyword: TokenFactory.tokenFromKeyword(Keyword.ON),
-          extendedType: extendedType,
-          showClause: showClause,
-          hideClause: hideClause,
-          leftBracket: TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
-          members: members,
-          rightBracket:
-              TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
+      ExtensionDeclarationImpl(
+        comment: null,
+        metadata: null,
+        extensionKeyword: TokenFactory.tokenFromKeyword(Keyword.EXTENSION),
+        typeKeyword: isExtensionTypeDeclaration
+            ? TokenFactory.tokenFromString('type')
+            : null,
+        name: identifier3(name),
+        typeParameters: typeParameters as TypeParameterListImpl?,
+        onKeyword: TokenFactory.tokenFromKeyword(Keyword.ON),
+        extendedType: extendedType as TypeAnnotationImpl,
+        showClause: showClause as ShowClauseImpl?,
+        hideClause: hideClause as HideClauseImpl?,
+        leftBracket: TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
+        members: members,
+        rightBracket: TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET),
+      );
 
   static ExtensionOverrideImpl extensionOverride(
           {required Identifier extensionName,
@@ -465,17 +476,20 @@
   static FieldDeclarationImpl fieldDeclaration(bool isStatic, Keyword? keyword,
           TypeAnnotation? type, List<VariableDeclaration> variables,
           {bool isAbstract = false, bool isExternal = false}) =>
-      astFactory.fieldDeclaration2(
-          abstractKeyword: isAbstract
-              ? TokenFactory.tokenFromKeyword(Keyword.ABSTRACT)
-              : null,
-          externalKeyword: isExternal
-              ? TokenFactory.tokenFromKeyword(Keyword.EXTERNAL)
-              : null,
-          staticKeyword:
-              isStatic ? TokenFactory.tokenFromKeyword(Keyword.STATIC) : null,
-          fieldList: variableDeclarationList(keyword, type, variables),
-          semicolon: TokenFactory.tokenFromType(TokenType.SEMICOLON));
+      FieldDeclarationImpl(
+        comment: null,
+        metadata: null,
+        augmentKeyword: null,
+        covariantKeyword: null,
+        abstractKeyword:
+            isAbstract ? TokenFactory.tokenFromKeyword(Keyword.ABSTRACT) : null,
+        externalKeyword:
+            isExternal ? TokenFactory.tokenFromKeyword(Keyword.EXTERNAL) : null,
+        staticKeyword:
+            isStatic ? TokenFactory.tokenFromKeyword(Keyword.STATIC) : null,
+        fieldList: variableDeclarationList(keyword, type, variables),
+        semicolon: TokenFactory.tokenFromType(TokenType.SEMICOLON),
+      );
 
   static FieldDeclarationImpl fieldDeclaration2(bool isStatic, Keyword? keyword,
           List<VariableDeclaration> variables) =>
@@ -567,15 +581,17 @@
           Keyword? keyword,
           String name,
           FunctionExpression functionExpression) =>
-      astFactory.functionDeclaration(
-          null,
-          null,
-          null,
-          null,
-          type,
-          keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
-          identifier3(name),
-          functionExpression);
+      FunctionDeclarationImpl(
+        comment: null,
+        metadata: null,
+        augmentKeyword: null,
+        externalKeyword: null,
+        returnType: type as TypeAnnotationImpl?,
+        propertyKeyword:
+            keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
+        name: identifier3(name),
+        functionExpression: functionExpression as FunctionExpressionImpl,
+      );
 
   static FunctionDeclarationStatementImpl functionDeclarationStatement(
           TypeAnnotation? type,
@@ -628,15 +644,16 @@
 
   static GenericTypeAliasImpl genericTypeAlias(String name,
           TypeParameterList typeParameters, GenericFunctionType functionType) =>
-      astFactory.genericTypeAlias(
-          null,
-          null,
-          TokenFactory.tokenFromKeyword(Keyword.TYPEDEF),
-          identifier3(name),
-          typeParameters,
-          TokenFactory.tokenFromType(TokenType.EQ),
-          functionType,
-          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+      GenericTypeAliasImpl(
+        comment: null,
+        metadata: null,
+        typedefKeyword: TokenFactory.tokenFromKeyword(Keyword.TYPEDEF),
+        name: identifier3(name),
+        typeParameters: typeParameters as TypeParameterListImpl,
+        equals: TokenFactory.tokenFromType(TokenType.EQ),
+        type: functionType as GenericFunctionTypeImpl,
+        semicolon: TokenFactory.tokenFromType(TokenType.SEMICOLON),
+      );
 
   static HideClauseImpl hideClause(List<ShowHideClauseElement> elements) =>
       astFactory.hideClause(
@@ -716,17 +733,21 @@
   static ImportDirectiveImpl importDirective(List<Annotation> metadata,
           String uri, bool isDeferred, String? prefix,
           [List<Combinator> combinators = const []]) =>
-      astFactory.importDirective(
-          null,
-          metadata,
-          TokenFactory.tokenFromKeyword(Keyword.IMPORT),
-          string2(uri),
-          null,
-          !isDeferred ? null : TokenFactory.tokenFromKeyword(Keyword.DEFERRED),
-          prefix == null ? null : TokenFactory.tokenFromKeyword(Keyword.AS),
-          prefix == null ? null : identifier3(prefix),
-          combinators,
-          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+      ImportDirectiveImpl(
+        comment: null,
+        metadata: metadata,
+        importKeyword: TokenFactory.tokenFromKeyword(Keyword.IMPORT),
+        uri: string2(uri),
+        configurations: null,
+        deferredKeyword: !isDeferred
+            ? null
+            : TokenFactory.tokenFromKeyword(Keyword.DEFERRED),
+        asKeyword:
+            prefix == null ? null : TokenFactory.tokenFromKeyword(Keyword.AS),
+        prefix: prefix == null ? null : identifier3(prefix),
+        combinators: combinators,
+        semicolon: TokenFactory.tokenFromType(TokenType.SEMICOLON),
+      );
 
   static ImportDirectiveImpl importDirective2(
           String uri, bool isDeferred, String prefix,
@@ -837,12 +858,13 @@
 
   static LibraryDirectiveImpl libraryDirective(
           List<Annotation> metadata, LibraryIdentifier libraryName) =>
-      astFactory.libraryDirective(
-          null,
-          metadata,
-          TokenFactory.tokenFromKeyword(Keyword.LIBRARY),
-          libraryName,
-          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+      LibraryDirectiveImpl(
+        comment: null,
+        metadata: metadata,
+        libraryKeyword: TokenFactory.tokenFromKeyword(Keyword.LIBRARY),
+        name: libraryName as LibraryIdentifierImpl,
+        semicolon: TokenFactory.tokenFromType(TokenType.SEMICOLON),
+      );
 
   static LibraryDirectiveImpl libraryDirective2(String libraryName) =>
       libraryDirective(<Annotation>[], libraryIdentifier2([libraryName]));
@@ -892,18 +914,22 @@
           Keyword? operator,
           SimpleIdentifier name,
           FormalParameterList? parameters) =>
-      astFactory.methodDeclaration(
-          null,
-          null,
-          TokenFactory.tokenFromKeyword(Keyword.EXTERNAL),
-          modifier == null ? null : TokenFactory.tokenFromKeyword(modifier),
-          returnType,
-          property == null ? null : TokenFactory.tokenFromKeyword(property),
-          operator == null ? null : TokenFactory.tokenFromKeyword(operator),
-          name,
-          null,
-          parameters,
-          emptyFunctionBody());
+      MethodDeclarationImpl(
+        comment: null,
+        metadata: null,
+        externalKeyword: TokenFactory.tokenFromKeyword(Keyword.EXTERNAL),
+        modifierKeyword:
+            modifier == null ? null : TokenFactory.tokenFromKeyword(modifier),
+        returnType: returnType as TypeAnnotationImpl?,
+        propertyKeyword:
+            property == null ? null : TokenFactory.tokenFromKeyword(property),
+        operatorKeyword:
+            operator == null ? null : TokenFactory.tokenFromKeyword(operator),
+        name: name as SimpleIdentifierImpl,
+        typeParameters: null,
+        parameters: parameters as FormalParameterListImpl?,
+        body: emptyFunctionBody(),
+      );
 
   static MethodDeclarationImpl methodDeclaration2(
           Keyword? modifier,
@@ -913,18 +939,22 @@
           SimpleIdentifier name,
           FormalParameterList? parameters,
           FunctionBody body) =>
-      astFactory.methodDeclaration(
-          null,
-          null,
-          null,
-          modifier == null ? null : TokenFactory.tokenFromKeyword(modifier),
-          returnType,
-          property == null ? null : TokenFactory.tokenFromKeyword(property),
-          operator == null ? null : TokenFactory.tokenFromKeyword(operator),
-          name,
-          null,
-          parameters,
-          body);
+      MethodDeclarationImpl(
+        comment: null,
+        metadata: null,
+        externalKeyword: null,
+        modifierKeyword:
+            modifier == null ? null : TokenFactory.tokenFromKeyword(modifier),
+        returnType: returnType as TypeAnnotationImpl?,
+        propertyKeyword:
+            property == null ? null : TokenFactory.tokenFromKeyword(property),
+        operatorKeyword:
+            operator == null ? null : TokenFactory.tokenFromKeyword(operator),
+        name: name as SimpleIdentifierImpl,
+        typeParameters: null,
+        parameters: parameters as FormalParameterListImpl?,
+        body: body as FunctionBodyImpl,
+      );
 
   static MethodDeclarationImpl methodDeclaration3(
           Keyword? modifier,
@@ -935,18 +965,22 @@
           TypeParameterList? typeParameters,
           FormalParameterList? parameters,
           FunctionBody body) =>
-      astFactory.methodDeclaration(
-          null,
-          null,
-          null,
-          modifier == null ? null : TokenFactory.tokenFromKeyword(modifier),
-          returnType,
-          property == null ? null : TokenFactory.tokenFromKeyword(property),
-          operator == null ? null : TokenFactory.tokenFromKeyword(operator),
-          name,
-          typeParameters,
-          parameters,
-          body);
+      MethodDeclarationImpl(
+        comment: null,
+        metadata: null,
+        externalKeyword: null,
+        modifierKeyword:
+            modifier == null ? null : TokenFactory.tokenFromKeyword(modifier),
+        returnType: returnType as TypeAnnotationImpl?,
+        propertyKeyword:
+            property == null ? null : TokenFactory.tokenFromKeyword(property),
+        operatorKeyword:
+            operator == null ? null : TokenFactory.tokenFromKeyword(operator),
+        name: name as SimpleIdentifierImpl,
+        typeParameters: typeParameters as TypeParameterListImpl?,
+        parameters: parameters as FormalParameterListImpl?,
+        body: body as FunctionBodyImpl,
+      );
 
   static MethodDeclarationImpl methodDeclaration4(
           {bool external = false,
@@ -957,18 +991,23 @@
           required String name,
           FormalParameterList? parameters,
           required FunctionBody body}) =>
-      astFactory.methodDeclaration(
-          null,
-          null,
-          external ? TokenFactory.tokenFromKeyword(Keyword.EXTERNAL) : null,
-          modifier == null ? null : TokenFactory.tokenFromKeyword(modifier),
-          returnType,
-          property == null ? null : TokenFactory.tokenFromKeyword(property),
-          operator ? TokenFactory.tokenFromKeyword(Keyword.OPERATOR) : null,
-          identifier3(name),
-          null,
-          parameters,
-          body);
+      MethodDeclarationImpl(
+        comment: null,
+        metadata: null,
+        externalKeyword:
+            external ? TokenFactory.tokenFromKeyword(Keyword.EXTERNAL) : null,
+        modifierKeyword:
+            modifier == null ? null : TokenFactory.tokenFromKeyword(modifier),
+        returnType: returnType as TypeAnnotationImpl?,
+        propertyKeyword:
+            property == null ? null : TokenFactory.tokenFromKeyword(property),
+        operatorKeyword:
+            operator ? TokenFactory.tokenFromKeyword(Keyword.OPERATOR) : null,
+        name: identifier3(name),
+        typeParameters: null,
+        parameters: parameters as FormalParameterListImpl?,
+        body: body as FunctionBodyImpl,
+      );
 
   static MethodInvocationImpl methodInvocation(
           Expression? target, String methodName,
@@ -1072,12 +1111,13 @@
 
   static PartDirectiveImpl partDirective(
           List<Annotation> metadata, String url) =>
-      astFactory.partDirective(
-          null,
-          metadata,
-          TokenFactory.tokenFromKeyword(Keyword.PART),
-          string2(url),
-          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+      PartDirectiveImpl(
+        comment: null,
+        metadata: metadata,
+        partKeyword: TokenFactory.tokenFromKeyword(Keyword.PART),
+        uri: string2(url),
+        semicolon: TokenFactory.tokenFromType(TokenType.SEMICOLON),
+      );
 
   static PartDirectiveImpl partDirective2(String url) =>
       partDirective(<Annotation>[], url);
@@ -1087,14 +1127,15 @@
 
   static PartOfDirectiveImpl partOfDirective2(
           List<Annotation> metadata, LibraryIdentifier libraryName) =>
-      astFactory.partOfDirective(
-          null,
-          metadata,
-          TokenFactory.tokenFromKeyword(Keyword.PART),
-          TokenFactory.tokenFromString("of"),
-          null,
-          libraryName,
-          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+      PartOfDirectiveImpl(
+        comment: null,
+        metadata: metadata,
+        partKeyword: TokenFactory.tokenFromKeyword(Keyword.PART),
+        ofKeyword: TokenFactory.tokenFromString("of"),
+        uri: null,
+        libraryName: libraryName as LibraryIdentifierImpl,
+        semicolon: TokenFactory.tokenFromType(TokenType.SEMICOLON),
+      );
 
   static DefaultFormalParameterImpl positionalFormalParameter(
           NormalFormalParameter parameter, Expression? expression) =>
@@ -1327,23 +1368,25 @@
           Keyword? keyword,
           TypeAnnotation? type,
           List<VariableDeclaration> variables) =>
-      astFactory.topLevelVariableDeclaration(
-          null,
-          null,
-          variableDeclarationList(keyword, type, variables),
-          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+      TopLevelVariableDeclarationImpl(
+        comment: null,
+        metadata: null,
+        externalKeyword: null,
+        variableList: variableDeclarationList(keyword, type, variables),
+        semicolon: TokenFactory.tokenFromType(TokenType.SEMICOLON),
+      );
 
   static TopLevelVariableDeclarationImpl topLevelVariableDeclaration2(
           Keyword? keyword, List<VariableDeclaration> variables,
           {bool isExternal = false}) =>
-      astFactory.topLevelVariableDeclaration(
-          null,
-          null,
-          variableDeclarationList(keyword, null, variables),
-          TokenFactory.tokenFromType(TokenType.SEMICOLON),
-          externalKeyword: isExternal
-              ? TokenFactory.tokenFromKeyword(Keyword.EXTERNAL)
-              : null);
+      TopLevelVariableDeclarationImpl(
+        comment: null,
+        metadata: null,
+        variableList: variableDeclarationList(keyword, null, variables),
+        semicolon: TokenFactory.tokenFromType(TokenType.SEMICOLON),
+        externalKeyword:
+            isExternal ? TokenFactory.tokenFromKeyword(Keyword.EXTERNAL) : null,
+      );
 
   static TryStatementImpl tryStatement(Block body, Block finallyClause) =>
       tryStatement3(body, <CatchClause>[], finallyClause);
@@ -1365,15 +1408,16 @@
 
   static FunctionTypeAliasImpl typeAlias(TypeAnnotation returnType, String name,
           TypeParameterList? typeParameters, FormalParameterList parameters) =>
-      astFactory.functionTypeAlias(
-          null,
-          null,
-          TokenFactory.tokenFromKeyword(Keyword.TYPEDEF),
-          returnType,
-          identifier3(name),
-          typeParameters,
-          parameters,
-          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+      FunctionTypeAliasImpl(
+        comment: null,
+        metadata: null,
+        typedefKeyword: TokenFactory.tokenFromKeyword(Keyword.TYPEDEF),
+        returnType: returnType as TypeAnnotationImpl,
+        name: identifier3(name),
+        typeParameters: typeParameters as TypeParameterListImpl?,
+        parameters: parameters as FormalParameterListImpl,
+        semicolon: TokenFactory.tokenFromType(TokenType.SEMICOLON),
+      );
 
   static TypeArgumentList? typeArgumentList(List<TypeAnnotation>? types) {
     if (types == null || types.isEmpty) {
@@ -1387,23 +1431,34 @@
         types, TokenFactory.tokenFromType(TokenType.GT));
   }
 
-  static TypeParameterImpl typeParameter(String name) =>
-      astFactory.typeParameter(null, null, identifier3(name), null, null);
+  static TypeParameterImpl typeParameter(String name) => TypeParameterImpl(
+        comment: null,
+        metadata: null,
+        name: identifier3(name),
+        extendsKeyword: null,
+        bound: null,
+      );
 
   static TypeParameterImpl typeParameter2(String name, TypeAnnotation bound) =>
-      astFactory.typeParameter(null, null, identifier3(name),
-          TokenFactory.tokenFromKeyword(Keyword.EXTENDS), bound);
+      TypeParameterImpl(
+        comment: null,
+        metadata: null,
+        name: identifier3(name),
+        extendsKeyword: TokenFactory.tokenFromKeyword(Keyword.EXTENDS),
+        bound: bound as TypeAnnotationImpl,
+      );
 
   static TypeParameterImpl typeParameter3(String name, String varianceLexeme) =>
       // TODO (kallentu) : Clean up AstFactoryImpl casting once variance is
       // added to the interface.
-      astFactory.typeParameter2(
-          comment: null,
-          metadata: null,
-          name: identifier3(name),
-          extendsKeyword: null,
-          bound: null,
-          varianceKeyword: TokenFactory.tokenFromString(varianceLexeme));
+      TypeParameterImpl(
+        comment: null,
+        metadata: null,
+        name: identifier3(name),
+        extendsKeyword: null,
+        bound: null,
+        varianceKeyword: TokenFactory.tokenFromString(varianceLexeme),
+      );
 
   static TypeParameterList? typeParameterList([List<String>? typeNames]) {
     if (typeNames == null || typeNames.isEmpty) {
@@ -1425,21 +1480,31 @@
   }
 
   static VariableDeclarationImpl variableDeclaration(String name) =>
-      astFactory.variableDeclaration(identifier3(name), null, null);
+      VariableDeclarationImpl(
+        name: identifier3(name),
+        equals: null,
+        initializer: null,
+      );
 
   static VariableDeclarationImpl variableDeclaration2(
           String name, Expression initializer) =>
-      astFactory.variableDeclaration(identifier3(name),
-          TokenFactory.tokenFromType(TokenType.EQ), initializer);
+      VariableDeclarationImpl(
+        name: identifier3(name),
+        equals: TokenFactory.tokenFromType(TokenType.EQ),
+        initializer: initializer as ExpressionImpl,
+      );
 
   static VariableDeclarationListImpl variableDeclarationList(Keyword? keyword,
           TypeAnnotation? type, List<VariableDeclaration> variables) =>
-      astFactory.variableDeclarationList(
-          null,
-          null,
-          keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
-          type,
-          variables);
+      VariableDeclarationListImpl(
+        comment: null,
+        metadata: null,
+        lateKeyword: null,
+        keyword:
+            keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
+        type: type as TypeAnnotationImpl?,
+        variables: variables,
+      );
 
   static VariableDeclarationListImpl variableDeclarationList2(
           Keyword? keyword, List<VariableDeclaration> variables) =>
diff --git a/pkg/analyzer/lib/src/hint/sdk_constraint_verifier.dart b/pkg/analyzer/lib/src/hint/sdk_constraint_verifier.dart
index f6df998..9165f0d 100644
--- a/pkg/analyzer/lib/src/hint/sdk_constraint_verifier.dart
+++ b/pkg/analyzer/lib/src/hint/sdk_constraint_verifier.dart
@@ -225,9 +225,9 @@
 
   @override
   void visitMethodDeclaration(MethodDeclaration node) {
-    if (checkTripleShift && node.isOperator && node.name.name == '>>>') {
-      _errorReporter.reportErrorForNode(
-          HintCode.SDK_VERSION_GT_GT_GT_OPERATOR, node.name);
+    if (checkTripleShift && node.isOperator && node.name2.lexeme == '>>>') {
+      _errorReporter.reportErrorForToken(
+          HintCode.SDK_VERSION_GT_GT_GT_OPERATOR, node.name2);
     }
     super.visitMethodDeclaration(node);
   }
diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart
index 1541169..1471a8b 100644
--- a/pkg/analyzer/lib/src/lint/linter.dart
+++ b/pkg/analyzer/lib/src/lint/linter.dart
@@ -338,8 +338,10 @@
   bool canBeConstConstructor(covariant ConstructorDeclarationImpl node) {
     var element = node.declaredElement!;
 
-    ClassElement classElement = element.enclosingElement2;
-    if (classElement.hasNonFinalField) return false;
+    final classElement = element.enclosingElement3;
+    if (classElement is ClassElement && classElement.hasNonFinalField) {
+      return false;
+    }
 
     var oldKeyword = node.constKeyword;
     try {
diff --git a/pkg/analyzer/lib/src/services/available_declarations.dart b/pkg/analyzer/lib/src/services/available_declarations.dart
index 8a744b5..4bac2f7 100644
--- a/pkg/analyzer/lib/src/services/available_declarations.dart
+++ b/pkg/analyzer/lib/src/services/available_declarations.dart
@@ -17,7 +17,6 @@
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
-import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
@@ -1400,7 +1399,7 @@
       bool isFinal = false,
       bool isStatic = false,
       required DeclarationKind kind,
-      required Identifier name,
+      required Token name,
       String? parameters,
       List<String>? parameterNames,
       List<String>? parameterTypes,
@@ -1410,7 +1409,7 @@
       String? returnType,
       String? typeParameters,
     }) {
-      if (Identifier.isPrivateName(name.name)) {
+      if (Identifier.isPrivateName(name.lexeme)) {
         return null;
       }
 
@@ -1433,7 +1432,7 @@
         lineInfo: lineInfo,
         locationOffset: locationOffset,
         locationPath: path,
-        name: name.name,
+        name: name.lexeme,
         locationStartColumn: lineLocation.columnNumber,
         locationStartLine: lineLocation.lineNumber,
         parameters: parameters,
@@ -1473,13 +1472,11 @@
             var defaultArguments = _computeDefaultArguments(parameters);
             var isConst = classMember.constKeyword != null;
 
-            var constructorName = classMember.name;
-            constructorName ??= SimpleIdentifierImpl(
-              StringToken(
-                TokenType.IDENTIFIER,
-                '',
-                classMember.returnType.offset,
-              ),
+            var constructorName = classMember.name2;
+            constructorName ??= StringToken(
+              TokenType.IDENTIFIER,
+              '',
+              classMember.returnType.offset,
             );
 
             // TODO(brianwilkerson) Should we be passing in `isConst`?
@@ -1516,7 +1513,7 @@
                 isFinal: isFinal,
                 isStatic: isStatic,
                 kind: DeclarationKind.FIELD,
-                name: field.name,
+                name: field.name2,
                 parent: parent,
                 relevanceTags: [
                   'ElementKind.FIELD',
@@ -1534,7 +1531,7 @@
                 isDeprecated: isDeprecated,
                 isStatic: isStatic,
                 kind: DeclarationKind.GETTER,
-                name: classMember.name,
+                name: classMember.name2,
                 parent: parent,
                 relevanceTags: ['ElementKind.FIELD'],
                 returnType: _getTypeAnnotationString(classMember.returnType),
@@ -1544,7 +1541,7 @@
                 isDeprecated: isDeprecated,
                 isStatic: isStatic,
                 kind: DeclarationKind.SETTER,
-                name: classMember.name,
+                name: classMember.name2,
                 parameters: parameters.toSource(),
                 parameterNames: _getFormalParameterNames(parameters),
                 parameterTypes: _getFormalParameterTypes(parameters),
@@ -1561,7 +1558,7 @@
                 isDeprecated: isDeprecated,
                 isStatic: isStatic,
                 kind: DeclarationKind.METHOD,
-                name: classMember.name,
+                name: classMember.name2,
                 parameters: parameters.toSource(),
                 parameterNames: _getFormalParameterNames(parameters),
                 parameterTypes: _getFormalParameterTypes(parameters),
@@ -1582,7 +1579,7 @@
           isAbstract: node.abstractKeyword != null,
           isDeprecated: isDeprecated,
           kind: DeclarationKind.CLASS,
-          name: node.name,
+          name: node.name2,
           relevanceTags: ['ElementKind.CLASS'],
         );
         if (classDeclaration == null) continue;
@@ -1617,7 +1614,7 @@
             parent: classDeclaration,
             relevanceTagsInFile: ['ElementKind.CONSTRUCTOR'],
             requiredParameterCount: 0,
-            returnType: node.name.name,
+            returnType: node.name2.lexeme,
             typeParameters: null,
           ));
         }
@@ -1625,14 +1622,14 @@
         addDeclaration(
           isDeprecated: isDeprecated,
           kind: DeclarationKind.CLASS_TYPE_ALIAS,
-          name: node.name,
+          name: node.name2,
           relevanceTags: ['ElementKind.CLASS'],
         );
       } else if (node is EnumDeclaration) {
         var enumDeclaration = addDeclaration(
           isDeprecated: isDeprecated,
           kind: DeclarationKind.ENUM,
-          name: node.name,
+          name: node.name2,
           relevanceTags: ['ElementKind.ENUM'],
         );
         if (enumDeclaration == null) continue;
@@ -1643,7 +1640,7 @@
           addDeclaration(
             isDeprecated: isDeprecated,
             kind: DeclarationKind.ENUM_CONSTANT,
-            name: constant.name,
+            name: constant.name2,
             parent: enumDeclaration,
             relevanceTags: [
               'ElementKind.ENUM_CONSTANT',
@@ -1652,7 +1649,7 @@
           );
         }
       } else if (node is ExtensionDeclaration) {
-        var name = node.name;
+        var name = node.name2;
         if (name != null) {
           addDeclaration(
             isDeprecated: isDeprecated,
@@ -1670,7 +1667,7 @@
           addDeclaration(
             isDeprecated: isDeprecated,
             kind: DeclarationKind.GETTER,
-            name: node.name,
+            name: node.name2,
             relevanceTags: ['ElementKind.FUNCTION'],
             returnType: _getTypeAnnotationString(node.returnType),
           );
@@ -1678,7 +1675,7 @@
           addDeclaration(
             isDeprecated: isDeprecated,
             kind: DeclarationKind.SETTER,
-            name: node.name,
+            name: node.name2,
             parameters: parameters.toSource(),
             parameterNames: _getFormalParameterNames(parameters),
             parameterTypes: _getFormalParameterTypes(parameters),
@@ -1693,7 +1690,7 @@
             defaultArgumentListTextRanges: defaultArguments?.ranges,
             isDeprecated: isDeprecated,
             kind: DeclarationKind.FUNCTION,
-            name: node.name,
+            name: node.name2,
             parameters: parameters.toSource(),
             parameterNames: _getFormalParameterNames(parameters),
             parameterTypes: _getFormalParameterTypes(parameters),
@@ -1712,7 +1709,7 @@
           addDeclaration(
             isDeprecated: isDeprecated,
             kind: DeclarationKind.FUNCTION_TYPE_ALIAS,
-            name: node.name,
+            name: node.name2,
             parameters: parameters.toSource(),
             parameterNames: _getFormalParameterNames(parameters),
             parameterTypes: _getFormalParameterTypes(parameters),
@@ -1726,7 +1723,7 @@
           addDeclaration(
             isDeprecated: isDeprecated,
             kind: DeclarationKind.TYPE_ALIAS,
-            name: node.name,
+            name: node.name2,
             relevanceTags: ['ElementKind.TYPE_ALIAS'],
           );
         }
@@ -1735,7 +1732,7 @@
         addDeclaration(
           isDeprecated: isDeprecated,
           kind: DeclarationKind.FUNCTION_TYPE_ALIAS,
-          name: node.name,
+          name: node.name2,
           parameters: parameters.toSource(),
           parameterNames: _getFormalParameterNames(parameters),
           parameterTypes: _getFormalParameterTypes(parameters),
@@ -1748,7 +1745,7 @@
         var mixinDeclaration = addDeclaration(
           isDeprecated: isDeprecated,
           kind: DeclarationKind.MIXIN,
-          name: node.name,
+          name: node.name2,
           relevanceTags: ['ElementKind.MIXIN'],
         );
         if (mixinDeclaration == null) continue;
@@ -1763,7 +1760,7 @@
             isDeprecated: isDeprecated,
             isFinal: isFinal,
             kind: DeclarationKind.VARIABLE,
-            name: variable.name,
+            name: variable.name2,
             relevanceTags: [
               'ElementKind.TOP_LEVEL_VARIABLE',
               if (isConst) 'ElementKind.TOP_LEVEL_VARIABLE+const',
@@ -1896,12 +1893,12 @@
         }
 
         if (parameter.isNamed) {
-          buffer.write(parameter.identifier!.name);
+          buffer.write(parameter.name!.lexeme);
           buffer.write(': ');
         }
 
         var valueOffset = buffer.length;
-        buffer.write(parameter.identifier!.name);
+        buffer.write(parameter.name!.lexeme);
         var valueLength = buffer.length - valueOffset;
         ranges.add(valueOffset);
         ranges.add(valueLength);
@@ -1917,7 +1914,7 @@
 
     var names = <String>[];
     for (var parameter in parameters.parameters) {
-      var name = parameter.identifier?.name ?? '';
+      var name = parameter.name?.lexeme ?? '';
       names.add(name);
     }
     return names;
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
index 91ada35..9aa5440 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -370,13 +370,13 @@
 
   DeclaredIdentifier _readDeclaredIdentifier() {
     var flags = _readByte();
-    var type = _readOptionalNode() as TypeAnnotation?;
+    var type = _readOptionalNode() as TypeAnnotationImpl?;
     var identifier = _readDeclarationName();
     var metadata = _readNodeList<Annotation>();
-    return astFactory.declaredIdentifier(
-      null,
-      metadata,
-      Tokens.choose(
+    return DeclaredIdentifierImpl(
+      comment: null,
+      metadata: metadata,
+      keyword: Tokens.choose(
         AstBinaryFlags.isConst(flags),
         Tokens.const_(),
         AstBinaryFlags.isFinal(flags),
@@ -384,8 +384,8 @@
         AstBinaryFlags.isVar(flags),
         Tokens.var_(),
       ),
-      type,
-      identifier,
+      type: type,
+      identifier: identifier,
     );
   }
 
@@ -421,7 +421,7 @@
     if (parameter is SimpleFormalParameterImpl) {
       parameter.declaredElement = element;
     }
-    node.identifier?.staticElement = element;
+    node.declaredElement = element;
     element.type = nonDefaultElement.type;
 
     return node;
@@ -853,24 +853,24 @@
   }
 
   MixinDeclaration _readMixinDeclaration() {
-    var typeParameters = _readOptionalNode() as TypeParameterList?;
-    var onClause = _readOptionalNode() as OnClause?;
-    var implementsClause = _readOptionalNode() as ImplementsClause?;
-    var name = readNode() as SimpleIdentifier;
+    var typeParameters = _readOptionalNode() as TypeParameterListImpl?;
+    var onClause = _readOptionalNode() as OnClauseImpl?;
+    var implementsClause = _readOptionalNode() as ImplementsClauseImpl?;
+    var name = readNode() as SimpleIdentifierImpl;
     var metadata = _readNodeList<Annotation>();
 
-    var node = astFactory.mixinDeclaration(
-      null,
-      metadata,
-      null,
-      Tokens.mixin_(),
-      name,
-      typeParameters,
-      onClause,
-      implementsClause,
-      Tokens.openCurlyBracket(),
-      const <ClassMember>[],
-      Tokens.closeCurlyBracket(),
+    var node = MixinDeclarationImpl(
+      comment: null,
+      metadata: metadata,
+      augmentKeyword: null,
+      mixinKeyword: Tokens.mixin_(),
+      name: name,
+      typeParameters: typeParameters,
+      onClause: onClause,
+      implementsClause: implementsClause,
+      leftBracket: Tokens.openCurlyBracket(),
+      members: const <ClassMember>[],
+      rightBracket: Tokens.closeCurlyBracket(),
     );
 
     return node;
@@ -1197,15 +1197,15 @@
 
   TypeParameter _readTypeParameter() {
     var name = _readDeclarationName();
-    var bound = _readOptionalNode() as TypeAnnotation?;
+    var bound = _readOptionalNode() as TypeAnnotationImpl?;
     var metadata = _readNodeList<Annotation>();
 
-    var node = astFactory.typeParameter(
-      null,
-      metadata,
-      name,
-      bound != null ? Tokens.extends_() : null,
-      bound,
+    var node = TypeParameterImpl(
+      comment: null,
+      metadata: metadata,
+      name: name,
+      extendsKeyword: bound != null ? Tokens.extends_() : null,
+      bound: bound,
     );
 
     return node;
@@ -1226,13 +1226,13 @@
 
   VariableDeclaration _readVariableDeclaration() {
     var flags = _readByte();
-    var name = readNode() as SimpleIdentifier;
-    var initializer = _readOptionalNode() as Expression?;
+    var name = readNode() as SimpleIdentifierImpl;
+    var initializer = _readOptionalNode() as ExpressionImpl?;
 
-    var node = astFactory.variableDeclaration(
-      name,
-      Tokens.eq(),
-      initializer,
+    var node = VariableDeclarationImpl(
+      name: name,
+      equals: Tokens.eq(),
+      initializer: initializer,
     );
 
     node.hasInitializer = AstBinaryFlags.hasInitializer(flags);
@@ -1242,11 +1242,11 @@
 
   VariableDeclarationList _readVariableDeclarationList() {
     var flags = _readByte();
-    var type = _readOptionalNode() as TypeAnnotation?;
+    var type = _readOptionalNode() as TypeAnnotationImpl?;
     var variables = _readNodeList<VariableDeclaration>();
     var metadata = _readNodeList<Annotation>();
 
-    return astFactory.variableDeclarationList2(
+    return VariableDeclarationListImpl(
       comment: null,
       keyword: Tokens.choose(
         AstBinaryFlags.isConst(flags),
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
index 0c7dbe3..e4577c8 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
@@ -190,7 +190,7 @@
       ),
     );
     _writeOptionalNode(node.type);
-    _writeDeclarationName(node.identifier);
+    _writeDeclarationName(node.name);
     _storeDeclaration(node);
   }
 
@@ -764,7 +764,7 @@
   @override
   void visitTypeParameter(TypeParameter node) {
     _writeByte(Tag.TypeParameter);
-    _writeDeclarationName(node.name);
+    _writeDeclarationName(node.name2);
     _writeOptionalNode(node.bound);
     _storeDeclaration(node);
   }
@@ -836,7 +836,7 @@
   }) {
     _writeByte(
       AstBinaryFlags.encode(
-        hasName: node.identifier != null,
+        hasName: node.name != null,
         hasQuestion: hasQuestion,
         isConst: keyword?.type == Keyword.CONST,
         isCovariant: node.covariantKeyword != null,
@@ -847,8 +847,8 @@
     );
 
     _writeNodeList(node.metadata);
-    if (node.identifier != null) {
-      _writeDeclarationName(node.identifier!);
+    if (node.name != null) {
+      _writeDeclarationName(node.name!);
     }
     _storeFormalParameter(node);
   }
@@ -875,8 +875,8 @@
     _sink.addByte(byte);
   }
 
-  void _writeDeclarationName(SimpleIdentifier node) {
-    _writeStringReference(node.name);
+  void _writeDeclarationName(Token token) {
+    _writeStringReference(token.lexeme);
   }
 
   _writeDouble(double value) {
diff --git a/pkg/analyzer/lib/src/summary2/ast_text_printer.dart b/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
index 73d60a8..c1c63e0 100644
--- a/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
@@ -152,7 +152,7 @@
     _token(node.abstractKeyword);
     _token(node.macroKeyword);
     _token(node.classKeyword);
-    node.name.accept(this);
+    _token(node.name2);
     node.typeParameters?.accept(this);
     node.extendsClause?.accept(this);
     node.withClause?.accept(this);
@@ -169,7 +169,7 @@
     _token(node.abstractKeyword);
     _token(node.macroKeyword);
     _token(node.typedefKeyword);
-    node.name.accept(this);
+    _token(node.name2);
     node.typeParameters?.accept(this);
     _token(node.equals);
     node.superclass.accept(this);
@@ -217,7 +217,7 @@
     _token(node.factoryKeyword);
     node.returnType.accept(this);
     _token(node.period);
-    node.name?.accept(this);
+    _token(node.name2);
     node.parameters.accept(this);
     _token(node.separator);
     _nodeList(node.initializers, node.body.beginToken);
@@ -264,7 +264,7 @@
     _declaration(node);
     _token(node.keyword);
     node.type?.accept(this);
-    node.identifier.accept(this);
+    _token(node.name);
   }
 
   @override
@@ -316,7 +316,7 @@
   @override
   void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
     _declaration(node);
-    node.name.accept(this);
+    _token(node.name2);
     node.arguments?.accept(this);
   }
 
@@ -324,7 +324,7 @@
   void visitEnumDeclaration(EnumDeclaration node) {
     _compilationUnitMember(node);
     _token(node.enumKeyword);
-    node.name.accept(this);
+    _token(node.name2);
     node.typeParameters?.accept(this);
     node.withClause?.accept(this);
     node.implementsClause?.accept(this);
@@ -370,7 +370,7 @@
     _compilationUnitMember(node);
     _token(node.extensionKeyword);
     _token(node.typeKeyword);
-    node.name?.accept(this);
+    _token(node.name2);
     node.typeParameters?.accept(this);
     _token(node.onKeyword);
     node.extendedType.accept(this);
@@ -406,7 +406,7 @@
     node.type?.accept(this);
     _token(node.thisKeyword);
     _token(node.period);
-    node.identifier.accept(this);
+    _token(node.name);
     node.typeParameters?.accept(this);
     node.parameters?.accept(this);
   }
@@ -495,7 +495,7 @@
     _token(node.externalKeyword);
     node.returnType?.accept(this);
     _token(node.propertyKeyword);
-    node.name.accept(this);
+    _token(node.name2);
     node.functionExpression.accept(this);
   }
 
@@ -529,7 +529,7 @@
     _compilationUnitMember(node);
     _token(node.typedefKeyword);
     node.returnType?.accept(this);
-    node.name.accept(this);
+    _token(node.name2);
     node.typeParameters?.accept(this);
     node.parameters.accept(this);
     _token(node.semicolon);
@@ -539,7 +539,7 @@
   void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     _normalFormalParameter(node);
     node.returnType?.accept(this);
-    node.identifier.accept(this);
+    _token(node.name);
     node.typeParameters?.accept(this);
     node.parameters.accept(this);
     _token(node.question);
@@ -558,7 +558,7 @@
   void visitGenericTypeAlias(GenericTypeAlias node) {
     _compilationUnitMember(node);
     _token(node.typedefKeyword);
-    node.name.accept(this);
+    _token(node.name2);
     node.typeParameters?.accept(this);
     _token(node.equals);
     node.type.accept(this);
@@ -702,7 +702,7 @@
     node.returnType?.accept(this);
     _token(node.propertyKeyword);
     _token(node.operatorKeyword);
-    node.name.accept(this);
+    _token(node.name2);
     node.typeParameters?.accept(this);
     node.parameters?.accept(this);
     node.body.accept(this);
@@ -721,7 +721,7 @@
   void visitMixinDeclaration(MixinDeclaration node) {
     _compilationUnitMember(node);
     _token(node.mixinKeyword);
-    node.name.accept(this);
+    _token(node.name2);
     node.typeParameters?.accept(this);
     node.onClause?.accept(this);
     node.implementsClause?.accept(this);
@@ -863,7 +863,7 @@
     _normalFormalParameter(node);
     _token(node.keyword);
     node.type?.accept(this);
-    node.identifier?.accept(this);
+    _token(node.name);
   }
 
   @override
@@ -907,7 +907,7 @@
     node.type?.accept(this);
     _token(node.superKeyword);
     _token(node.period);
-    node.identifier.accept(this);
+    _token(node.name);
     node.typeParameters?.accept(this);
     node.parameters?.accept(this);
   }
@@ -994,7 +994,7 @@
     // TODO (kallentu) : Clean up TypeParameterImpl casting once variance is
     // added to the interface.
     _token((node as TypeParameterImpl).varianceKeyword);
-    node.name.accept(this);
+    _token(node.name2);
     _token(node.extendsKeyword);
     node.bound?.accept(this);
   }
@@ -1009,7 +1009,7 @@
   @override
   void visitVariableDeclaration(VariableDeclaration node) {
     _annotatedNode(node);
-    node.name.accept(this);
+    _token(node.name2);
     _token(node.equals);
     node.initializer?.accept(this);
   }
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 626dd40..402d18c 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -200,7 +200,7 @@
     ResolutionReader reader,
     ElementImpl element,
   ) {
-    var enclosing = element.enclosingElement2;
+    var enclosing = element.enclosingElement3;
     if (enclosing is ClassElement) {
       reader._addTypeParameters(enclosing.typeParameters);
     } else if (enclosing is CompilationUnitElement) {
@@ -268,7 +268,7 @@
   @override
   void _read(element, reader) {
     element.metadata = reader._readAnnotationList(
-      unitElement: element.enclosingElement2,
+      unitElement: element.enclosingElement3,
     );
     _readTypeParameters(reader, element.typeParameters);
     element.supertype = reader._readOptionalInterfaceType();
@@ -292,7 +292,7 @@
   @override
   void _read(element, reader) {
     element.metadata = reader._readAnnotationList(
-      unitElement: element.enclosingElement2,
+      unitElement: element.enclosingElement3,
     );
     _readTypeParameters(reader, element.typeParameters);
     element.extendedType = reader.readRequiredType();
@@ -1288,34 +1288,36 @@
       var name = accessor.displayName;
       var isGetter = accessor.isGetter;
 
-      var reference = containerRef.getChild(name);
-
-      PropertyInducingElementImpl property;
-      if (enclosingElement is CompilationUnitElementImpl) {
-        var existing = reference.element;
-        if (existing is TopLevelVariableElementImpl) {
-          property = existing;
-        } else {
-          var field = TopLevelVariableElementImpl(name, -1);
-          property = field;
-        }
-      } else {
-        var existing = reference.element;
-        if (existing is FieldElementImpl) {
-          property = existing;
-        } else {
-          var field = FieldElementImpl(name, -1);
-          field.isStatic = accessor.isStatic;
-          property = field;
-        }
+      bool canUseExisting(PropertyInducingElement property) {
+        return property.isSynthetic ||
+            accessor.isSetter && property.setter == null;
       }
 
-      if (reference.element == null) {
-        reference.element = property;
-        properties.add(property);
-
-        property.enclosingElement = enclosingElement;
-        property.isSynthetic = true;
+      final PropertyInducingElementImpl property;
+      final reference = containerRef.getChild(name);
+      final existing = reference.element;
+      if (enclosingElement is CompilationUnitElementImpl) {
+        if (existing is TopLevelVariableElementImpl &&
+            canUseExisting(existing)) {
+          property = existing;
+        } else {
+          property = TopLevelVariableElementImpl(name, -1)
+            ..enclosingElement = enclosingElement
+            ..isSynthetic = true;
+          reference.element ??= property;
+          properties.add(property);
+        }
+      } else {
+        if (existing is FieldElementImpl && canUseExisting(existing)) {
+          property = existing;
+        } else {
+          property = FieldElementImpl(name, -1)
+            ..enclosingElement = enclosingElement
+            ..isStatic = accessor.isStatic
+            ..isSynthetic = true;
+          reference.element ??= property;
+          properties.add(property);
+        }
       }
 
       accessor.variable = property;
@@ -1550,7 +1552,7 @@
   @override
   void _read(element, reader) {
     element.metadata = reader._readAnnotationList(
-      unitElement: element.enclosingElement2,
+      unitElement: element.enclosingElement3,
     );
     _readTypeParameters(reader, element.typeParameters);
     element.superclassConstraints = reader._readInterfaceTypeList();
@@ -1634,7 +1636,7 @@
       // TODO(scheglov) why to check for empty? If we have this flags.
       if (arguments.isNotEmpty) {
         var typeParameters =
-            (element.enclosingElement2 as TypeParameterizedElement)
+            (element.enclosingElement3 as TypeParameterizedElement)
                 .typeParameters;
         var substitution = Substitution.fromPairs(typeParameters, arguments);
         element =
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index d3d4cc2..833951d 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -847,7 +847,7 @@
       return const [];
     }
 
-    var enclosing = declaration.enclosingElement2;
+    var enclosing = declaration.enclosingElement3;
     if (enclosing is TypeParameterizedElement) {
       if (enclosing is! ClassElement && enclosing is! ExtensionElement) {
         return const <DartType>[];
diff --git a/pkg/analyzer/lib/src/summary2/default_types_builder.dart b/pkg/analyzer/lib/src/summary2/default_types_builder.dart
index ec3ff9a..4ddea78 100644
--- a/pkg/analyzer/lib/src/summary2/default_types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/default_types_builder.dart
@@ -119,7 +119,7 @@
         if (typeParametersByName == null) {
           typeParametersByName = {};
           for (var parameterNode in typeParameters) {
-            var name = parameterNode.name.name;
+            var name = parameterNode.name2.lexeme;
             typeParametersByName[name] = parameterNode;
           }
         }
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index 08751df..446b4d1 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -88,17 +88,17 @@
 
   @override
   void visitClassDeclaration(covariant ClassDeclarationImpl node) {
-    var nameNode = node.name;
-    var name = nameNode.name;
+    var nameToken = node.name2;
+    var name = nameToken.lexeme;
 
-    var element = ClassElementImpl(name, nameNode.offset);
+    var element = ClassElementImpl(name, nameToken.offset);
     element.isAbstract = node.abstractKeyword != null;
     element.isMacro = node.macroKeyword != null;
     element.metadata = _buildAnnotations(node.metadata);
     _setCodeRange(element, node);
     _setDocumentation(element, node);
 
-    nameNode.staticElement = element;
+    node.declaredElement = element;
     _linker.elementNodes[element] = node;
 
     var reference = _enclosingContext.addClass(name, element);
@@ -121,10 +121,10 @@
 
   @override
   void visitClassTypeAlias(covariant ClassTypeAliasImpl node) {
-    var nameNode = node.name;
-    var name = nameNode.name;
+    var nameToken = node.name2;
+    var name = nameToken.lexeme;
 
-    var element = ClassElementImpl(name, nameNode.offset);
+    var element = ClassElementImpl(name, nameToken.offset);
     element.isAbstract = node.abstractKeyword != null;
     element.isMacro = node.macroKeyword != null;
     element.isMixinApplication = true;
@@ -132,7 +132,7 @@
     _setCodeRange(element, node);
     _setDocumentation(element, node);
 
-    nameNode.staticElement = element;
+    node.declaredElement = element;
     _linker.elementNodes[element] = node;
 
     var reference = _enclosingContext.addClass(name, element);
@@ -156,8 +156,8 @@
   void visitConstructorDeclaration(
     covariant ConstructorDeclarationImpl node,
   ) {
-    var nameNode = node.name ?? node.returnType;
-    var name = node.name?.name ?? '';
+    var nameNode = node.name2 ?? node.returnType;
+    var name = node.name2?.lexeme ?? '';
     if (name == 'new') {
       // A constructor declared as `C.new` is unnamed, and is modeled as such.
       name = '';
@@ -196,8 +196,8 @@
 
   @override
   void visitEnumDeclaration(covariant EnumDeclarationImpl node) {
-    var nameNode = node.name;
-    var name = nameNode.name;
+    var nameNode = node.name2;
+    var name = nameNode.lexeme;
     var nameOffset = nameNode.offset;
 
     var element = EnumElementImpl(name, nameOffset);
@@ -205,7 +205,7 @@
     _setCodeRange(element, node);
     _setDocumentation(element, node);
 
-    nameNode.staticElement = element;
+    node.declaredElement = element;
     _linker.elementNodes[element] = node;
 
     var reference = _enclosingContext.addEnum(name, element);
@@ -222,8 +222,8 @@
     var valuesElements = <Expression>[];
     for (var i = 0; i < constants.length; ++i) {
       var constant = constants[i];
-      var name = constant.name.name;
-      var field = ConstFieldElementImpl(name, constant.name.offset)
+      var name = constant.name2.lexeme;
+      var field = ConstFieldElementImpl(name, constant.name2.offset)
         ..hasImplicitType = true
         ..hasInitializer = true
         ..isConst = true
@@ -265,14 +265,19 @@
         ),
       );
 
-      var variableDeclaration = astFactory.variableDeclaration(
-        astFactory.simpleIdentifier(
+      var variableDeclaration = VariableDeclarationImpl(
+        name: astFactory.simpleIdentifier(
           StringToken(TokenType.STRING, name, -1),
         ),
-        Tokens.eq(),
-        initializer,
+        equals: Tokens.eq(),
+        initializer: initializer,
       );
-      astFactory.variableDeclarationList2(
+      VariableDeclarationListImpl(
+        comment: null,
+        metadata: null,
+        lateKeyword: null,
+        keyword: null,
+        type: null,
         variables: [variableDeclaration],
       );
       _linker.elementNodes[field] = variableDeclaration;
@@ -303,12 +308,12 @@
       );
       valuesField.constantInitializer = initializer;
 
-      var variableDeclaration = astFactory.variableDeclaration(
-        astFactory.simpleIdentifier(
+      var variableDeclaration = VariableDeclarationImpl(
+        name: astFactory.simpleIdentifier(
           StringToken(TokenType.STRING, 'values', -1),
         ),
-        Tokens.eq(),
-        initializer,
+        equals: Tokens.eq(),
+        initializer: initializer,
       );
       valuesTypeNode = astFactory.namedType(
         name: astFactory.simpleIdentifier(
@@ -326,7 +331,10 @@
           Tokens.gt(),
         ),
       );
-      astFactory.variableDeclarationList2(
+      VariableDeclarationListImpl(
+        comment: null,
+        metadata: null,
+        lateKeyword: null,
         keyword: Tokens.const_(),
         variables: [variableDeclaration],
         type: valuesTypeNode,
@@ -389,9 +397,9 @@
 
   @override
   void visitExtensionDeclaration(covariant ExtensionDeclarationImpl node) {
-    var nodeName = node.name;
-    var name = nodeName?.name;
-    var nameOffset = nodeName?.offset ?? -1;
+    var nameToken = node.name2;
+    var name = nameToken?.lexeme;
+    var nameOffset = nameToken?.offset ?? -1;
 
     var element = ExtensionElementImpl(name, nameOffset);
     element.metadata = _buildAnnotations(node.metadata);
@@ -437,9 +445,10 @@
   ) {
     var metadata = _buildAnnotations(node.metadata);
     for (var variable in node.fields.variables) {
-      var nameNode = variable.name as SimpleIdentifierImpl;
-      var name = nameNode.name;
-      var nameOffset = nameNode.offset;
+      variable as VariableDeclarationImpl;
+      var nameToken = variable.name2;
+      var name = nameToken.lexeme;
+      var nameOffset = nameToken.offset;
 
       FieldElementImpl element;
       if (_shouldBeConstField(node)) {
@@ -469,7 +478,7 @@
       _enclosingContext.addNonSyntheticField(element);
 
       _linker.elementNodes[element] = variable;
-      nameNode.staticElement = element;
+      variable.declaredElement = element;
     }
     _buildType(node.fields.type);
   }
@@ -478,9 +487,9 @@
   void visitFieldFormalParameter(
     covariant FieldFormalParameterImpl node,
   ) {
-    var nameNode = node.identifier;
-    var name = nameNode.name;
-    var nameOffset = nameNode.offset;
+    var nameToken = node.name;
+    var name = nameToken.lexeme;
+    var nameOffset = nameToken.offset;
 
     ParameterElementImpl element;
     var parent = node.parent;
@@ -505,7 +514,7 @@
     element.metadata = _buildAnnotations(node.metadata);
     _setCodeRange(element, node);
 
-    nameNode.staticElement = element;
+    node.declaredElement = element;
 
     // TODO(scheglov) check that we don't set reference for parameters
     var fakeReference = Reference.root();
@@ -534,9 +543,9 @@
 
   @override
   void visitFunctionDeclaration(covariant FunctionDeclarationImpl node) {
-    var nameNode = node.name;
-    var name = nameNode.name;
-    var nameOffset = nameNode.offset;
+    var nameToken = node.name2;
+    var name = nameToken.lexeme;
+    var nameOffset = nameToken.offset;
 
     var functionExpression = node.functionExpression;
     var body = functionExpression.body;
@@ -576,7 +585,7 @@
     _setCodeRange(executableElement, node);
     _setDocumentation(executableElement, node);
 
-    nameNode.staticElement = executableElement;
+    node.declaredElement = executableElement;
     _linker.elementNodes[executableElement] = node;
 
     _buildExecutableElementChildren(
@@ -597,16 +606,16 @@
 
   @override
   void visitFunctionTypeAlias(covariant FunctionTypeAliasImpl node) {
-    var nameNode = node.name;
-    var name = nameNode.name;
+    var nameToken = node.name2;
+    var name = nameToken.lexeme;
 
-    var element = TypeAliasElementImpl(name, nameNode.offset);
+    var element = TypeAliasElementImpl(name, nameToken.offset);
     element.isFunctionTypeAliasBased = true;
     element.metadata = _buildAnnotations(node.metadata);
     _setCodeRange(element, node);
     _setDocumentation(element, node);
 
-    nameNode.staticElement = element;
+    node.declaredElement = element;
     _linker.elementNodes[element] = node;
 
     var reference = _enclosingContext.addTypeAlias(name, element);
@@ -620,7 +629,7 @@
     });
 
     var aliasedElement = GenericFunctionTypeElementImpl.forOffset(
-      node.name.offset,
+      nameToken.offset,
     );
     aliasedElement.parameters = holder.parameters;
 
@@ -632,9 +641,9 @@
   void visitFunctionTypedFormalParameter(
     covariant FunctionTypedFormalParameterImpl node,
   ) {
-    var nameNode = node.identifier;
-    var name = nameNode.name;
-    var nameOffset = nameNode.offset;
+    var nameToken = node.name;
+    var name = nameToken.lexeme;
+    var nameOffset = nameToken.offset;
 
     ParameterElementImpl element;
     var parent = node.parent;
@@ -658,7 +667,7 @@
     element.metadata = _buildAnnotations(node.metadata);
     _setCodeRange(element, node);
 
-    nameNode.staticElement = element;
+    node.declaredElement = element;
     _linker.elementNodes[element] = node;
     _enclosingContext.addParameter(name, element);
 
@@ -706,15 +715,15 @@
 
   @override
   void visitGenericTypeAlias(covariant GenericTypeAliasImpl node) {
-    var nameNode = node.name;
-    var name = nameNode.name;
+    var nameToken = node.name2;
+    var name = nameToken.lexeme;
 
-    var element = TypeAliasElementImpl(name, nameNode.offset);
+    var element = TypeAliasElementImpl(name, nameToken.offset);
     element.metadata = _buildAnnotations(node.metadata);
     _setCodeRange(element, node);
     _setDocumentation(element, node);
 
-    nameNode.staticElement = element;
+    node.declaredElement = element;
     _linker.elementNodes[element] = node;
 
     var reference = _enclosingContext.addTypeAlias(name, element);
@@ -768,9 +777,9 @@
 
   @override
   void visitMethodDeclaration(covariant MethodDeclarationImpl node) {
-    var nameNode = node.name;
-    var name = nameNode.name;
-    var nameOffset = nameNode.offset;
+    var nameToken = node.name2;
+    var name = nameToken.lexeme;
+    var nameOffset = nameToken.offset;
 
     Reference reference;
     ExecutableElementImpl executableElement;
@@ -827,7 +836,7 @@
     _setCodeRange(executableElement, node);
     _setDocumentation(executableElement, node);
 
-    nameNode.staticElement = executableElement;
+    node.declaredElement = executableElement;
     _linker.elementNodes[executableElement] = node;
 
     _buildExecutableElementChildren(
@@ -842,15 +851,15 @@
 
   @override
   void visitMixinDeclaration(covariant MixinDeclarationImpl node) {
-    var nameNode = node.name;
-    var name = nameNode.name;
+    var nameToken = node.name2;
+    var name = nameToken.lexeme;
 
-    var element = MixinElementImpl(name, nameNode.offset);
+    var element = MixinElementImpl(name, nameToken.offset);
     element.metadata = _buildAnnotations(node.metadata);
     _setCodeRange(element, node);
     _setDocumentation(element, node);
 
-    nameNode.staticElement = element;
+    node.declaredElement = element;
     _linker.elementNodes[element] = node;
 
     var reference = _enclosingContext.addMixin(name, element);
@@ -903,9 +912,9 @@
   void visitSimpleFormalParameter(
     covariant SimpleFormalParameterImpl node,
   ) {
-    var nameNode = node.identifier;
-    var name = nameNode?.name ?? '';
-    var nameOffset = nameNode?.offset ?? -1;
+    var nameToken = node.name;
+    var name = nameToken?.lexeme ?? '';
+    var nameOffset = nameToken?.offset ?? -1;
 
     ParameterElementImpl element;
     var parent = node.parent;
@@ -934,7 +943,6 @@
     _setCodeRange(element, node);
 
     node.declaredElement = element;
-    nameNode?.staticElement = element;
 
     _buildType(node.type);
   }
@@ -943,9 +951,9 @@
   void visitSuperFormalParameter(
     covariant SuperFormalParameterImpl node,
   ) {
-    var nameNode = node.identifier;
-    var name = nameNode.name;
-    var nameOffset = nameNode.offset;
+    var nameToken = node.name;
+    var name = nameToken.lexeme;
+    var nameOffset = nameToken.offset;
 
     SuperFormalParameterElementImpl element;
     var parent = node.parent;
@@ -970,7 +978,7 @@
     element.metadata = _buildAnnotations(node.metadata);
     _setCodeRange(element, node);
 
-    nameNode.staticElement = element;
+    node.declaredElement = element;
 
     // TODO(scheglov) check that we don't set reference for parameters
     var fakeReference = Reference.root();
@@ -1000,9 +1008,10 @@
 
     var metadata = _buildAnnotations(node.metadata);
     for (var variable in node.variables.variables) {
-      var nameNode = variable.name as SimpleIdentifierImpl;
-      var name = nameNode.name;
-      var nameOffset = nameNode.offset;
+      variable as VariableDeclarationImpl;
+      var nameToken = variable.name2;
+      var name = nameToken.lexeme;
+      var nameOffset = nameToken.offset;
 
       TopLevelVariableElementImpl element;
       if (node.variables.isConst) {
@@ -1029,7 +1038,7 @@
 
       _linker.elementNodes[element] = variable;
       _enclosingContext.addTopLevelVariable(name, element);
-      nameNode.staticElement = element;
+      variable.declaredElement = element;
 
       var getter = element.getter;
       if (getter is PropertyAccessorElementImpl) {
@@ -1054,14 +1063,14 @@
 
   @override
   void visitTypeParameter(covariant TypeParameterImpl node) {
-    var nameNode = node.name;
-    var name = nameNode.name;
+    var nameToken = node.name2;
+    var name = nameToken.lexeme;
 
-    var element = TypeParameterElementImpl(name, nameNode.offset);
+    var element = TypeParameterElementImpl(name, nameToken.offset);
     element.metadata = _buildAnnotations(node.metadata);
     _setCodeRange(element, node);
 
-    nameNode.staticElement = element;
+    node.declaredElement = element;
     _linker.elementNodes[element] = node;
     _enclosingContext.addTypeParameter(name, element);
 
@@ -1134,27 +1143,32 @@
     var enclosingRef = _enclosingContext.reference;
     var enclosingElement = _enclosingContext.element;
 
-    PropertyInducingElementImpl? property;
+    bool canUseExisting(PropertyInducingElement property) {
+      return property.isSynthetic ||
+          accessorElement.isSetter && property.setter == null;
+    }
+
+    final PropertyInducingElementImpl property;
     if (enclosingElement is CompilationUnitElement) {
-      var containerRef = enclosingRef.getChild('@variable');
-      var propertyRef = containerRef.getChild(name);
-      property = propertyRef.element as PropertyInducingElementImpl?;
-      if (property == null) {
-        var variable = TopLevelVariableElementImpl(name, -1);
-        variable.isSynthetic = true;
+      final reference = enclosingRef.getChild('@variable').getChild(name);
+      final existing = reference.element;
+      if (existing is TopLevelVariableElementImpl && canUseExisting(existing)) {
+        property = existing;
+      } else {
+        final variable = property = TopLevelVariableElementImpl(name, -1)
+          ..isSynthetic = true;
         _enclosingContext.addTopLevelVariable(name, variable);
-        property = variable;
       }
     } else {
-      var containerRef = enclosingRef.getChild('@field');
-      var propertyRef = containerRef.getChild(name);
-      property = propertyRef.element as PropertyInducingElementImpl?;
-      if (property == null) {
-        var field = FieldElementImpl(name, -1);
-        field.isSynthetic = true;
-        field.isStatic = accessorElement.isStatic;
+      final reference = enclosingRef.getChild('@field').getChild(name);
+      final existing = reference.element;
+      if (existing is FieldElementImpl && canUseExisting(existing)) {
+        property = existing;
+      } else {
+        final field = property = FieldElementImpl(name, -1)
+          ..isStatic = accessorElement.isStatic
+          ..isSynthetic = true;
         _enclosingContext.addField(name, field);
-        property = field;
       }
     }
 
diff --git a/pkg/analyzer/lib/src/summary2/function_type_builder.dart b/pkg/analyzer/lib/src/summary2/function_type_builder.dart
index 4ab0f6a..8ecabb3 100644
--- a/pkg/analyzer/lib/src/summary2/function_type_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/function_type_builder.dart
@@ -150,7 +150,7 @@
   ) {
     return node.parameters.asImpl.map((parameter) {
       return ParameterElementImpl.synthetic(
-        parameter.identifier?.name ?? '',
+        parameter.name?.lexeme ?? '',
         _getParameterType(isNNBD, parameter),
         parameter.kind,
       );
diff --git a/pkg/analyzer/lib/src/summary2/informative_data.dart b/pkg/analyzer/lib/src/summary2/informative_data.dart
index 5b53526..482012f 100644
--- a/pkg/analyzer/lib/src/summary2/informative_data.dart
+++ b/pkg/analyzer/lib/src/summary2/informative_data.dart
@@ -78,7 +78,7 @@
         var unitReader = SummaryDataReader(unitInfoBytes);
         var unitInfo = _InfoUnit(unitReader);
 
-        final enclosing = unitElement.enclosingElement2;
+        final enclosing = unitElement.enclosingElement3;
         if (enclosing is LibraryElementImpl) {
           if (identical(enclosing.definingCompilationUnit, unitElement)) {
             _applyToLibrary(enclosing, unitInfo);
@@ -1116,7 +1116,7 @@
     sink.writeList2<ClassDeclaration>(unit.declarations, (node) {
       sink.writeUInt30(node.offset);
       sink.writeUInt30(node.length);
-      sink.writeUInt30(node.name.offset);
+      sink.writeUInt30(node.name2.offset);
       _writeDocumentationComment(node);
       _writeTypeParameters(node.typeParameters);
       _writeConstructors(node.members);
@@ -1132,7 +1132,7 @@
     sink.writeList2<ClassTypeAlias>(unit.declarations, (node) {
       sink.writeUInt30(node.offset);
       sink.writeUInt30(node.length);
-      sink.writeUInt30(node.name.offset);
+      sink.writeUInt30(node.name2.offset);
       _writeDocumentationComment(node);
       _writeTypeParameters(node.typeParameters);
       _writeOffsets(
@@ -1144,7 +1144,7 @@
     sink.writeList2<EnumDeclaration>(unit.declarations, (node) {
       sink.writeUInt30(node.offset);
       sink.writeUInt30(node.length);
-      sink.writeUInt30(node.name.offset);
+      sink.writeUInt30(node.name2.offset);
       _writeDocumentationComment(node);
       _writeTypeParameters(node.typeParameters);
       _writeConstructors(node.members);
@@ -1161,7 +1161,7 @@
     sink.writeList2<ExtensionDeclaration>(unit.declarations, (node) {
       sink.writeUInt30(node.offset);
       sink.writeUInt30(node.length);
-      sink.writeUInt30(1 + (node.name?.offset ?? -1));
+      sink.writeUInt30(1 + (node.name2?.offset ?? -1));
       _writeDocumentationComment(node);
       _writeTypeParameters(node.typeParameters);
       _writeConstructors(node.members);
@@ -1182,7 +1182,7 @@
       (node) {
         sink.writeUInt30(node.offset);
         sink.writeUInt30(node.length);
-        sink.writeUInt30(node.name.offset);
+        sink.writeUInt30(node.name2.offset);
         _writeDocumentationComment(node);
         _writeTypeParameters(node.functionExpression.typeParameters);
         _writeFormalParameters(node.functionExpression.parameters);
@@ -1201,7 +1201,7 @@
             .toList(), (node) {
       sink.writeUInt30(node.offset);
       sink.writeUInt30(node.length);
-      sink.writeUInt30(node.name.offset);
+      sink.writeUInt30(node.name2.offset);
       _writeDocumentationComment(node);
       _writeTypeParameters(node.functionExpression.typeParameters);
       _writeFormalParameters(node.functionExpression.parameters);
@@ -1215,7 +1215,7 @@
     sink.writeList2<FunctionTypeAlias>(unit.declarations, (node) {
       sink.writeUInt30(node.offset);
       sink.writeUInt30(node.length);
-      sink.writeUInt30(node.name.offset);
+      sink.writeUInt30(node.name2.offset);
       _writeDocumentationComment(node);
       _writeTypeParameters(node.typeParameters);
       _writeFormalParameters(node.parameters);
@@ -1230,7 +1230,7 @@
       var aliasedType = node.type;
       sink.writeUInt30(node.offset);
       sink.writeUInt30(node.length);
-      sink.writeUInt30(node.name.offset);
+      sink.writeUInt30(node.name2.offset);
       _writeDocumentationComment(node);
       _writeTypeParameters(node.typeParameters);
       if (aliasedType is GenericFunctionType) {
@@ -1250,7 +1250,7 @@
     sink.writeList2<MixinDeclaration>(unit.declarations, (node) {
       sink.writeUInt30(node.offset);
       sink.writeUInt30(node.length);
-      sink.writeUInt30(node.name.offset);
+      sink.writeUInt30(node.name2.offset);
       _writeDocumentationComment(node);
       _writeTypeParameters(node.typeParameters);
       _writeConstructors(node.members);
@@ -1293,7 +1293,7 @@
       sink.writeUInt30(node.offset);
       sink.writeUInt30(node.length);
       sink.writeOptionalUInt30(node.period?.offset);
-      var nameNode = node.name ?? node.returnType;
+      var nameNode = node.name2 ?? node.returnType;
       sink.writeUInt30(nameNode.offset);
       sink.writeUInt30(nameNode.end);
       _writeDocumentationComment(node);
@@ -1331,7 +1331,7 @@
       var codeOffset = node.offset;
       sink.writeUInt30(codeOffset);
       sink.writeUInt30(node.end - codeOffset);
-      sink.writeUInt30(node.name.offset);
+      sink.writeUInt30(node.name2.offset);
       _writeDocumentationComment(node);
       _writeOffsets(
         metadata: node.metadata,
@@ -1348,7 +1348,7 @@
     var codeOffset = _codeOffsetForVariable(node);
     sink.writeUInt30(codeOffset);
     sink.writeUInt30(node.end - codeOffset);
-    sink.writeUInt30(node.name.offset);
+    sink.writeUInt30(node.name2.offset);
     _writeDocumentationComment(node);
 
     // TODO(scheglov) Replace with some kind of double-iterating list.
@@ -1375,7 +1375,7 @@
     sink.writeList<FormalParameter>(parameters, (node) {
       sink.writeUInt30(node.offset);
       sink.writeUInt30(node.length);
-      sink.writeUInt30(1 + (node.identifier?.offset ?? -1));
+      sink.writeUInt30(1 + (node.name?.offset ?? -1));
 
       var notDefault = node.notDefault;
       if (notDefault is FieldFormalParameter) {
@@ -1403,7 +1403,7 @@
       (node) {
         sink.writeUInt30(node.offset);
         sink.writeUInt30(node.length);
-        sink.writeUInt30(node.name.offset);
+        sink.writeUInt30(node.name2.offset);
         _writeDocumentationComment(node);
         _writeTypeParameters(node.typeParameters);
         _writeFormalParameters(node.parameters);
@@ -1449,7 +1449,7 @@
       (node) {
         sink.writeUInt30(node.offset);
         sink.writeUInt30(node.length);
-        sink.writeUInt30(node.name.offset);
+        sink.writeUInt30(node.name2.offset);
         _writeDocumentationComment(node);
         _writeTypeParameters(node.typeParameters);
         _writeFormalParameters(node.parameters);
@@ -1537,7 +1537,7 @@
     var codeOffset = _codeOffsetForVariable(node);
     sink.writeUInt30(codeOffset);
     sink.writeUInt30(node.end - codeOffset);
-    sink.writeUInt30(node.name.offset);
+    sink.writeUInt30(node.name2.offset);
     _writeDocumentationComment(node);
 
     // TODO(scheglov) Replace with some kind of double-iterating list.
@@ -1554,7 +1554,7 @@
     sink.writeList<TypeParameter>(parameters, (node) {
       sink.writeUInt30(node.offset);
       sink.writeUInt30(node.length);
-      sink.writeUInt30(node.name.offset);
+      sink.writeUInt30(node.name2.offset);
     });
   }
 }
@@ -1794,7 +1794,7 @@
     super.visitSimpleFormalParameter(node);
 
     var element = node.declaredElement;
-    var identifier = node.identifier;
+    var identifier = node.name;
     if (element is ParameterElementImpl && identifier != null) {
       element.nameOffset = identifier.offset;
     }
diff --git a/pkg/analyzer/lib/src/summary2/macro_declarations.dart b/pkg/analyzer/lib/src/summary2/macro_declarations.dart
index 8a7f6e6..079a09a 100644
--- a/pkg/analyzer/lib/src/summary2/macro_declarations.dart
+++ b/pkg/analyzer/lib/src/summary2/macro_declarations.dart
@@ -7,6 +7,7 @@
 import 'package:_fe_analyzer_shared/src/macros/executor/remote_instance.dart'
     as macro;
 import 'package:analyzer/dart/ast/ast.dart' as ast;
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
@@ -37,13 +38,18 @@
   /// mixins, etc.
   void transferToElements() {
     // TODO(scheglov) Make sure that these are only declarations?
-    for (final entry in fromNode._identifierMap.entries) {
+    for (final entry in fromNode._referencedIdentifierMap.entries) {
       final element = entry.key.staticElement;
       if (element != null) {
         final declaration = entry.value;
         fromElement._identifierMap[element] = declaration;
       }
     }
+    for (final entry in fromNode._declaredIdentifierMap.entries) {
+      final element = entry.key;
+      final declaration = entry.value;
+      fromElement._identifierMap[element] = declaration;
+    }
 
     for (final entry in fromNode._classMap.entries) {
       final element = entry.key.declaredElement as ClassElement;
@@ -110,7 +116,7 @@
 
   FieldDeclarationImpl _fieldElement(FieldElement element) {
     assert(!_fieldMap.containsKey(element));
-    final enclosingClass = element.enclosingElement2 as ClassElement;
+    final enclosingClass = element.enclosingElement3 as ClassElement;
     return FieldDeclarationImpl(
       id: macro.RemoteInstance.uniqueId,
       identifier: identifier(element),
@@ -157,9 +163,11 @@
 }
 
 class DeclarationBuilderFromNode {
-  final Map<ast.SimpleIdentifier, IdentifierImpl> _identifierMap =
+  final Map<ast.SimpleIdentifier, IdentifierImpl> _referencedIdentifierMap =
       Map.identity();
 
+  final Map<Element, IdentifierImpl> _declaredIdentifierMap = Map.identity();
+
   final Map<ast.ClassDeclaration, IntrospectableClassDeclarationImpl>
       _classMap = Map.identity();
 
@@ -169,6 +177,14 @@
     return _classMap[node] ??= _introspectableClassDeclaration(node);
   }
 
+  macro.IdentifierImpl _declaredIdentifier(Token name, Element element) {
+    return _declaredIdentifierMap[element] ??= _DeclaredIdentifierImpl(
+      id: macro.RemoteInstance.uniqueId,
+      name: name.lexeme,
+      element: element,
+    );
+  }
+
   macro.FunctionTypeParameterImpl _formalParameter(
     ast.FormalParameter node,
   ) {
@@ -187,32 +203,18 @@
       id: macro.RemoteInstance.uniqueId,
       isNamed: node.isNamed,
       isRequired: node.isRequired,
-      name: node.identifier?.name,
+      name: node.name?.lexeme,
       type: typeAnnotation,
     );
   }
 
-  macro.IdentifierImpl _identifier(ast.Identifier node) {
-    final ast.SimpleIdentifier simpleIdentifier;
-    if (node is ast.SimpleIdentifier) {
-      simpleIdentifier = node;
-    } else {
-      simpleIdentifier = (node as ast.PrefixedIdentifier).identifier;
-    }
-    return _identifierMap[simpleIdentifier] ??= IdentifierImplFromNode(
-      id: macro.RemoteInstance.uniqueId,
-      name: simpleIdentifier.name,
-      node: simpleIdentifier,
-    );
-  }
-
   IntrospectableClassDeclarationImpl _introspectableClassDeclaration(
     ast.ClassDeclaration node,
   ) {
     assert(!_classMap.containsKey(node));
     return IntrospectableClassDeclarationImpl._(
       id: macro.RemoteInstance.uniqueId,
-      identifier: _identifier(node.name),
+      identifier: _declaredIdentifier(node.name2, node.declaredElement!),
       typeParameters: _typeParameters(node.typeParameters),
       interfaces: _typeAnnotations(node.implementsClause?.interfaces),
       isAbstract: node.abstractKeyword != null,
@@ -224,6 +226,21 @@
     );
   }
 
+  macro.IdentifierImpl _referencedIdentifier(ast.Identifier node) {
+    final ast.SimpleIdentifier simpleIdentifier;
+    if (node is ast.SimpleIdentifier) {
+      simpleIdentifier = node;
+    } else {
+      simpleIdentifier = (node as ast.PrefixedIdentifier).identifier;
+    }
+    return _referencedIdentifierMap[simpleIdentifier] ??=
+        _ReferencedIdentifierImpl(
+      id: macro.RemoteInstance.uniqueId,
+      name: simpleIdentifier.name,
+      node: simpleIdentifier,
+    );
+  }
+
   T _typeAnnotation<T extends macro.TypeAnnotationImpl>(
       ast.TypeAnnotation? node) {
     if (node == null) {
@@ -248,7 +265,7 @@
     } else if (node is ast.NamedType) {
       return macro.NamedTypeAnnotationImpl(
         id: macro.RemoteInstance.uniqueId,
-        identifier: _identifier(node.name),
+        identifier: _referencedIdentifier(node.name),
         isNullable: node.question != null,
         typeArguments: _typeAnnotations(node.typeArguments?.arguments),
       ) as T;
@@ -273,7 +290,7 @@
   ) {
     return macro.TypeParameterDeclarationImpl(
       id: macro.RemoteInstance.uniqueId,
-      identifier: _identifier(node.name),
+      identifier: _declaredIdentifier(node.name2, node.declaredElement!),
       bound: node.bound.mapOrNull(_typeAnnotation),
     );
   }
@@ -322,19 +339,6 @@
   });
 }
 
-class IdentifierImplFromNode extends IdentifierImpl {
-  final ast.SimpleIdentifier node;
-
-  IdentifierImplFromNode({
-    required super.id,
-    required super.name,
-    required this.node,
-  });
-
-  @override
-  Element? get element => node.staticElement;
-}
-
 class IntrospectableClassDeclarationImpl
     extends macro.IntrospectableClassDeclarationImpl {
   late final ClassElement element;
@@ -351,6 +355,30 @@
   });
 }
 
+class _DeclaredIdentifierImpl extends IdentifierImpl {
+  @override
+  final Element element;
+
+  _DeclaredIdentifierImpl({
+    required super.id,
+    required super.name,
+    required this.element,
+  });
+}
+
+class _ReferencedIdentifierImpl extends IdentifierImpl {
+  final ast.SimpleIdentifier node;
+
+  _ReferencedIdentifierImpl({
+    required super.id,
+    required super.name,
+    required this.node,
+  });
+
+  @override
+  Element? get element => node.staticElement;
+}
+
 extension<T> on T? {
   R? mapOrNull<R>(R Function(T) mapper) {
     final self = this;
diff --git a/pkg/analyzer/lib/src/summary2/named_type_builder.dart b/pkg/analyzer/lib/src/summary2/named_type_builder.dart
index 9b4f698..184476e 100644
--- a/pkg/analyzer/lib/src/summary2/named_type_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/named_type_builder.dart
@@ -247,7 +247,7 @@
   List<ParameterElementImpl> _formalParameters(FormalParameterList node) {
     return node.parameters.asImpl.map((parameter) {
       return ParameterElementImpl.synthetic(
-        parameter.identifier?.name ?? '',
+        parameter.name?.lexeme ?? '',
         _buildFormalParameterType(parameter),
         parameter.kind,
       );
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index dd7cae3..1b096ae 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -47,7 +47,7 @@
         unit.extensions.forEach(_resolveExtensionFields);
         unit.mixins.forEach(_resolveClassFields);
 
-        _scope = unit.enclosingElement2.scope;
+        _scope = unit.enclosingElement3.scope;
         unit.topLevelVariables.forEach(_resolveVariable);
       }
     }
@@ -174,8 +174,8 @@
       }
     }
 
-    var classElement = _constructor.enclosingElement2;
-    if (classElement.isMixinApplication) {
+    var classElement = _constructor.enclosingElement3;
+    if (classElement is ClassElement && classElement.isMixinApplication) {
       var superType = classElement.supertype;
       if (superType != null) {
         var index = classElement.constructors.indexOf(_constructor);
@@ -285,7 +285,7 @@
 
     _set.add(element);
 
-    if (element.enclosingElement2.typeParameters.isNotEmpty) {
+    if (element.enclosingElement3.typeParameters.isNotEmpty) {
       node.argumentList.accept(this);
     }
   }
@@ -356,7 +356,7 @@
         unit.extensions.forEach(_addExtensionElementFields);
         unit.mixins.forEach(_addClassElementFields);
 
-        _scope = unit.enclosingElement2.scope;
+        _scope = unit.enclosingElement3.scope;
         for (var element in unit.topLevelVariables) {
           _addVariableNode(element);
         }
@@ -455,7 +455,7 @@
 
   @override
   String get displayName {
-    return _node.name.name;
+    return _node.name2.lexeme;
   }
 
   @override
@@ -526,7 +526,7 @@
   }
 
   void _resolveInitializer({required bool forDependencies}) {
-    var enclosingElement = _element.enclosingElement2;
+    var enclosingElement = _element.enclosingElement3;
     var enclosingClassElement =
         enclosingElement is ClassElement ? enclosingElement : null;
     var astResolver = AstResolver(_walker._linker, _unitElement, _scope,
diff --git a/pkg/analyzer/lib/src/summary2/types_builder.dart b/pkg/analyzer/lib/src/summary2/types_builder.dart
index 64d6087..28bb1b2 100644
--- a/pkg/analyzer/lib/src/summary2/types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/types_builder.dart
@@ -194,7 +194,7 @@
       if (returnType == null) {
         if (node.isSetter) {
           returnType = _voidType;
-        } else if (node.isOperator && node.name.name == '[]=') {
+        } else if (node.isOperator && node.name2.lexeme == '[]=') {
           returnType = _voidType;
         } else {
           returnType = _dynamicType;
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index 8c0dcc9..df8f7f7 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -16,7 +17,7 @@
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/error/codes.dart' show CompileTimeErrorCode;
 
-Element? _getKnownElement(Expression expression) {
+Element? _getKnownElement(SyntacticEntity expression) {
   if (expression is ParenthesizedExpression) {
     return _getKnownElement(expression.expression);
   } else if (expression is NamedExpression) {
@@ -199,13 +200,21 @@
 
   @override
   void visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) {
-    _visitForEachParts(node, node.loopVariable.identifier);
+    _visitForEachParts(
+      node,
+      node.loopVariable.name,
+      node.loopVariable.declaredElement,
+    );
     node.visitChildren(this);
   }
 
   @override
   void visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node) {
-    _visitForEachParts(node, node.identifier);
+    _visitForEachParts(
+      node,
+      node.identifier.token,
+      node.identifier.staticElement,
+    );
     node.visitChildren(this);
   }
 
@@ -477,14 +486,16 @@
   ///
   /// If [expr] does not require an implicit cast because it is not related to
   /// [to] or is already a subtype of it, does nothing.
-  void _checkImplicitCast(Expression expr,
+  void _checkImplicitCast(SyntacticEntity expr,
       {required DartType to,
       required DartType from,
       bool opAssign = false,
       bool forSpread = false,
       bool forSpreadKey = false,
       bool forSpreadValue = false}) {
-    expr = expr.unParenthesized;
+    if (expr is Expression) {
+      expr = expr.unParenthesized;
+    }
     if (_needsImplicitCast(expr, to: to, from: from) == true) {
       _recordImplicitCast(expr, to,
           from: from,
@@ -635,7 +646,7 @@
   /// downcast implicitly).
   ///
   /// If [from] is omitted, uses the static type of [expr]
-  bool? _needsImplicitCast(Expression expr,
+  bool? _needsImplicitCast(SyntacticEntity expr,
       {required DartType from, required DartType to}) {
     // Void is considered Top, but may only be *explicitly* cast.
     if (from.isVoid) return null;
@@ -674,7 +685,7 @@
   ///
   /// This will emit the appropriate error/warning/hint message as well as mark
   /// the AST node.
-  void _recordImplicitCast(Expression expr, DartType to,
+  void _recordImplicitCast(SyntacticEntity expr, DartType to,
       {required DartType from,
       bool opAssign = false,
       bool forSpread = false,
@@ -748,7 +759,7 @@
   }
 
   void _recordMessage(
-      AstNode node, ErrorCode errorCode, List<Object> arguments) {
+      SyntacticEntity node, ErrorCode errorCode, List<Object> arguments) {
     var argumentStrings = [
       for (var argument in arguments)
         if (argument is DartType)
@@ -761,16 +772,18 @@
         ? node.firstTokenAfterCommentAndMetadata.offset
         : node.offset;
     int length = node.end - begin;
-    var source = (node.root as CompilationUnit).declaredElement!.source;
-    _errorReporter.reportError(
-        AnalysisError(source, begin, length, errorCode, argumentStrings));
+    _errorReporter.reportErrorForOffset(
+        errorCode, begin, length, argumentStrings);
   }
 
-  void _visitForEachParts(ForEachParts node, SimpleIdentifier loopVariable) {
-    if (loopVariable.staticElement is! VariableElement) {
+  void _visitForEachParts(
+    ForEachParts node,
+    Token loopVariable,
+    Element? loopVariableElement,
+  ) {
+    if (loopVariableElement is! VariableElement) {
       return;
     }
-    var loopVariableElement = loopVariable.staticElement as VariableElement;
 
     // Safely handle malformed statements.
     Token? awaitKeyword;
diff --git a/pkg/analyzer/lib/src/task/strong_mode.dart b/pkg/analyzer/lib/src/task/strong_mode.dart
index 038c167..d0b5ca2 100644
--- a/pkg/analyzer/lib/src/task/strong_mode.dart
+++ b/pkg/analyzer/lib/src/task/strong_mode.dart
@@ -424,7 +424,7 @@
           var conflict = conflicts.single;
           if (conflict is CandidatesConflict) {
             conflictExplanation = conflict.candidates.map((candidate) {
-              var className = candidate.enclosingElement2.name;
+              var className = candidate.enclosingElement3.name;
               var typeStr = candidate.type.getDisplayString(
                 withNullability: typeSystem.isNonNullableByDefault,
               );
@@ -540,7 +540,7 @@
       overridden = overridden.declaration;
 
       // Skip Object itself.
-      var enclosingElement = overridden.enclosingElement2;
+      var enclosingElement = overridden.enclosingElement3;
       if (enclosingElement is ClassElement &&
           enclosingElement.isDartCoreObject) {
         continue;
diff --git a/pkg/analyzer/lib/src/test_utilities/find_node.dart b/pkg/analyzer/lib/src/test_utilities/find_node.dart
index 5ffa874..6638cab 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_node.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_node.dart
@@ -509,7 +509,7 @@
     for (var declaration in unit.declarations) {
       if (declaration is TopLevelVariableDeclaration) {
         for (var variable in declaration.variables.variables) {
-          if (variable.name.name == name) {
+          if (variable.name2.lexeme == name) {
             return variable;
           }
         }
diff --git a/pkg/analyzer/lib/src/util/ast_data_extractor.dart b/pkg/analyzer/lib/src/util/ast_data_extractor.dart
index 6574c92..199f082 100644
--- a/pkg/analyzer/lib/src/util/ast_data_extractor.dart
+++ b/pkg/analyzer/lib/src/util/ast_data_extractor.dart
@@ -8,7 +8,7 @@
 import 'package:analyzer/dart/element/element.dart';
 
 MemberId computeMemberId(Element element) {
-  var enclosingElement = element.enclosingElement2;
+  var enclosingElement = element.enclosingElement3;
   if (enclosingElement is CompilationUnitElement) {
     var memberName = element.name!;
     if (element is PropertyAccessorElement && element.isSetter) {
diff --git a/pkg/analyzer/test/dart/ast/ast_test.dart b/pkg/analyzer/test/dart/ast/ast_test.dart
index f70c0a3..a569500 100644
--- a/pkg/analyzer/test/dart/ast/ast_test.dart
+++ b/pkg/analyzer/test/dart/ast/ast_test.dart
@@ -235,7 +235,7 @@
   void test_endToken_noParameters() {
     FieldFormalParameter parameter =
         AstTestFactory.fieldFormalParameter2('field');
-    expect(parameter.endToken, parameter.identifier.endToken);
+    expect(parameter.endToken, parameter.name);
   }
 
   void test_endToken_parameters() {
@@ -1493,6 +1493,7 @@
     expect(identifier.inGetterContext(), isFalse);
   }
 
+  @deprecated
   void test_inGetterContext_fieldFormalParameter() {
     FieldFormalParameter parameter =
         AstTestFactory.fieldFormalParameter2('test');
@@ -1509,12 +1510,6 @@
     expect(identifier.inGetterContext(), isFalse);
   }
 
-  void test_inGetterContext_variableDeclaration() {
-    VariableDeclaration variable = AstTestFactory.variableDeclaration('test');
-    SimpleIdentifier identifier = variable.name;
-    expect(identifier.inGetterContext(), isFalse);
-  }
-
   void test_inReferenceContext() {
     SimpleIdentifier identifier = AstTestFactory.identifier3("id");
     AstTestFactory.namedExpression(
@@ -2110,7 +2105,7 @@
   void test_endToken_noParameters() {
     SuperFormalParameter parameter =
         AstTestFactory.superFormalParameter2('field');
-    expect(parameter.endToken, parameter.identifier.endToken);
+    expect(parameter.endToken, parameter.name);
   }
 
   void test_endToken_parameters() {
diff --git a/pkg/analyzer/test/error/error_test.dart b/pkg/analyzer/test/error/error_test.dart
index bc0e269..d766e0e 100644
--- a/pkg/analyzer/test/error/error_test.dart
+++ b/pkg/analyzer/test/error/error_test.dart
@@ -38,13 +38,13 @@
         var extendsClause = declaration.extendsClause;
         if (extendsClause != null &&
             extendsClause.superclass.name.name == 'ErrorCode') {
-          String className = declaration.name.name;
+          String className = declaration.name2.lexeme;
           for (ClassMember member in declaration.members) {
             if (member is FieldDeclaration && member.isStatic) {
               var fields = member.fields;
               if ((fields.type == null ? bad() : true) &&
                   fields.type!.toSource() == className) {
-                String fieldName = fields.variables[0].name.name;
+                String fieldName = fields.variables[0].name2.lexeme;
                 declaredCodes.add('$className.$fieldName');
               }
             }
@@ -61,7 +61,7 @@
     TopLevelVariableDeclaration declaration = listingUnit.declarations
         .whereType<TopLevelVariableDeclaration>()
         .firstWhere((member) =>
-            member.variables.variables[0].name.name == 'errorCodeValues');
+            member.variables.variables[0].name2.lexeme == 'errorCodeValues');
     var listLiteral =
         declaration.variables.variables[0].initializer as ListLiteral;
     for (var element in listLiteral.elements.cast<PrefixedIdentifier>()) {
diff --git a/pkg/analyzer/test/generated/class_member_parser_test.dart b/pkg/analyzer/test/generated/class_member_parser_test.dart
index 7b39f70..7d55bed 100644
--- a/pkg/analyzer/test/generated/class_member_parser_test.dart
+++ b/pkg/analyzer/test/generated/class_member_parser_test.dart
@@ -39,7 +39,7 @@
     expect(constructor.externalKeyword, isNull);
     expect(constructor.constKeyword, isNull);
     expect(constructor.factoryKeyword, isNull);
-    expect(constructor.name, isNull);
+    expect(constructor.name2, isNull);
     expect(constructor.parameters, isNotNull);
     expect(constructor.period, isNull);
     expect(constructor.returnType, isNotNull);
@@ -96,7 +96,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNotNull);
-    expect(method.name.name, 'late');
+    expect(method.name2.lexeme, 'late');
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -295,7 +295,7 @@
     expect(constructor.externalKeyword, isNull);
     expect(constructor.constKeyword, isNull);
     expect(constructor.factoryKeyword, isNull);
-    expect(constructor.name, isNull);
+    expect(constructor.name2, isNull);
     expect(constructor.parameters, isNotNull);
     expect(constructor.period, isNull);
     expect(constructor.returnType, isNotNull);
@@ -389,7 +389,7 @@
     expect(constructor.externalKeyword, isNull);
     expect(constructor.constKeyword, isNull);
     expect(constructor.factoryKeyword, isNull);
-    expect(constructor.name, isNull);
+    expect(constructor.name2, isNull);
     expect(constructor.parameters, isNotNull);
     expect(constructor.period, isNull);
     expect(constructor.returnType, isNotNull);
@@ -417,7 +417,7 @@
     NodeList<VariableDeclaration> variables = list.variables;
     expect(variables, hasLength(1));
     VariableDeclaration variable = variables[0];
-    expect(variable.name, isNotNull);
+    expect(variable.name2, isNotNull);
   }
 
   void test_parseClassMember_field_generic() {
@@ -452,7 +452,7 @@
     NodeList<VariableDeclaration> variables = list.variables;
     expect(variables, hasLength(1));
     VariableDeclaration variable = variables[0];
-    expect(variable.name, isNotNull);
+    expect(variable.name2, isNotNull);
   }
 
   void test_parseClassMember_field_gftType_gftReturnType() {
@@ -499,8 +499,7 @@
     NodeList<VariableDeclaration> variables = list.variables;
     expect(variables, hasLength(1));
     VariableDeclaration variable = variables[0];
-    expect(variable.name, isNotNull);
-    _assertIsDeclarationName(variable.name);
+    expect(variable.name2, isNotNull);
   }
 
   void test_parseClassMember_field_namedGet() {
@@ -525,7 +524,7 @@
     NodeList<VariableDeclaration> variables = list.variables;
     expect(variables, hasLength(1));
     VariableDeclaration variable = variables[0];
-    expect(variable.name, isNotNull);
+    expect(variable.name2, isNotNull);
   }
 
   void test_parseClassMember_field_namedOperator() {
@@ -550,7 +549,7 @@
     NodeList<VariableDeclaration> variables = list.variables;
     expect(variables, hasLength(1));
     VariableDeclaration variable = variables[0];
-    expect(variable.name, isNotNull);
+    expect(variable.name2, isNotNull);
   }
 
   void test_parseClassMember_field_namedOperator_withAssignment() {
@@ -575,7 +574,7 @@
     NodeList<VariableDeclaration> variables = list.variables;
     expect(variables, hasLength(1));
     VariableDeclaration variable = variables[0];
-    expect(variable.name, isNotNull);
+    expect(variable.name2, isNotNull);
     expect(variable.initializer, isNotNull);
   }
 
@@ -601,7 +600,7 @@
     NodeList<VariableDeclaration> variables = list.variables;
     expect(variables, hasLength(1));
     VariableDeclaration variable = variables[0];
-    expect(variable.name, isNotNull);
+    expect(variable.name2, isNotNull);
   }
 
   void test_parseClassMember_field_nameKeyword() {
@@ -651,7 +650,7 @@
     NodeList<VariableDeclaration> variables = list.variables;
     expect(variables, hasLength(1));
     VariableDeclaration variable = variables[0];
-    expect(variable.name, isNotNull);
+    expect(variable.name2, isNotNull);
   }
 
   void test_parseClassMember_finalAndCovariantLateWithInitializer() {
@@ -677,7 +676,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNotNull);
     expect(method.returnType, isNotNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.body, isNotNull);
     expect(method.parameters, isNull);
@@ -695,8 +694,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNotNull);
     expect(method.returnType, isNotNull);
-    expect(method.name, isNotNull);
-    _assertIsDeclarationName(method.name);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.body, isNotNull);
     expect(method.parameters, isNull);
@@ -712,8 +710,7 @@
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNotNull);
     expect(method.modifierKeyword, isNull);
-    expect(method.name, isNotNull);
-    _assertIsDeclarationName(method.name);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -737,7 +734,7 @@
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNotNull);
     expect(method.modifierKeyword, isNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -757,7 +754,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNotNull);
     expect(method.parameters, isNotNull);
@@ -776,7 +773,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNotNull);
 
@@ -802,7 +799,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNotNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNotNull);
     expect(method.parameters, isNotNull);
@@ -821,11 +818,11 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect((method.returnType as NamedType).name.name, 'T');
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNotNull);
     TypeParameter tp = method.typeParameters!.typeParameters[0];
-    expect(tp.name.name, 'T');
+    expect(tp.name2.lexeme, 'T');
     expect(tp.extendsKeyword, isNotNull);
     expect((tp.bound as NamedType).name.name, 'num');
     expect(method.parameters, isNotNull);
@@ -855,7 +852,7 @@
       expect((typeArguments[1] as NamedType).name.name, 'T');
     }
 
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNotNull);
     expect(method.parameters, isNotNull);
@@ -875,7 +872,7 @@
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNotNull);
     expect((method.returnType as NamedType).name.name, 'T');
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNotNull);
     expect(method.parameters, isNotNull);
@@ -894,7 +891,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNotNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNotNull);
     expect(method.parameters, isNotNull);
@@ -913,7 +910,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -934,7 +931,7 @@
     expect(method.modifierKeyword, isNotNull);
     expect(method.propertyKeyword, isNotNull);
     expect(method.returnType, isNotNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNull);
@@ -953,7 +950,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNotNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -972,7 +969,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNotNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -1065,7 +1062,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -1084,7 +1081,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNotNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -1103,7 +1100,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNotNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -1122,8 +1119,8 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNotNull);
-    expect(method.name, isNotNull);
-    expect(method.name.name, 'm');
+    expect(method.name2, isNotNull);
+    expect(method.name2.lexeme, 'm');
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -1142,7 +1139,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNotNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -1161,7 +1158,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -1182,7 +1179,7 @@
     expect(method.modifierKeyword, isNotNull);
     expect(method.propertyKeyword, isNotNull);
     expect(method.returnType, isNotNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -1201,7 +1198,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNotNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -1220,7 +1217,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNotNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -1237,7 +1234,7 @@
     expect(method.modifierKeyword, isNotNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNotNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -1253,7 +1250,7 @@
     expect(method.modifierKeyword, isNotNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNotNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -1272,7 +1269,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNotNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -1291,7 +1288,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isGenericFunctionType);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNotNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -1314,7 +1311,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNotNull);
-    expect(method.name.name, '>>>');
+    expect(method.name2.lexeme, '>>>');
     expect(method.operatorKeyword, isNotNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -1351,7 +1348,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNotNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNotNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -1370,7 +1367,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNotNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNotNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -1389,7 +1386,7 @@
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNotNull);
-    expect(method.name.name, '<');
+    expect(method.name2.lexeme, '<');
     expect(method.operatorKeyword, isNotNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -1406,8 +1403,7 @@
     expect(constructor.factoryKeyword!.keyword, Keyword.FACTORY);
     expect(constructor.returnType.name, 'C');
     expect(constructor.period, isNull);
-    expect(constructor.name, isNull);
-    _assertIsDeclarationName(constructor.returnType as SimpleIdentifier, false);
+    expect(constructor.name2, isNull);
     expect(constructor.parameters, isNotNull);
     expect(constructor.parameters.parameters, isEmpty);
     expect(constructor.separator!.type, TokenType.EQ);
@@ -1429,7 +1425,7 @@
     expect(constructor.factoryKeyword!.keyword, Keyword.FACTORY);
     expect(constructor.returnType.name, 'C');
     expect(constructor.period, isNull);
-    expect(constructor.name, isNull);
+    expect(constructor.name2, isNull);
     expect(constructor.parameters, isNotNull);
     expect(constructor.parameters.parameters, isEmpty);
     expect(constructor.separator, isNull);
@@ -1455,9 +1451,8 @@
     expect(constructor.constKeyword, isNull);
     expect(constructor.factoryKeyword!.keyword, Keyword.FACTORY);
     expect(constructor.returnType.name, 'C');
-    _assertIsDeclarationName(constructor.returnType as SimpleIdentifier, false);
     expect(constructor.period, isNull);
-    expect(constructor.name, isNull);
+    expect(constructor.name2, isNull);
     expect(constructor.parameters, isNotNull);
     expect(constructor.parameters.parameters, isEmpty);
     expect(constructor.separator!.type, TokenType.EQ);
@@ -1504,10 +1499,8 @@
     expect(constructor.constKeyword, isNull);
     expect(constructor.factoryKeyword, isNotNull);
     expect(constructor.returnType.name, 'C');
-    _assertIsDeclarationName(constructor.returnType as SimpleIdentifier, false);
     expect(constructor.period!.type, TokenType.PERIOD);
-    expect(constructor.name!.name, 'foo');
-    _assertIsDeclarationName(constructor.name!);
+    expect(constructor.name2!.lexeme, 'foo');
     expect(constructor.parameters, isNotNull);
     expect(constructor.parameters.parameters, isEmpty);
     expect(constructor.separator, isNull);
@@ -1560,10 +1553,8 @@
     expect(constructor.constKeyword, isNull);
     expect(constructor.factoryKeyword, isNull);
     expect(constructor.returnType.name, 'C');
-    _assertIsDeclarationName(constructor.returnType as SimpleIdentifier, false);
     expect(constructor.period!.type, TokenType.PERIOD);
-    expect(constructor.name!.name, 'foo');
-    _assertIsDeclarationName(constructor.name!);
+    expect(constructor.name2!.lexeme, 'foo');
     expect(constructor.parameters, isNotNull);
     expect(constructor.parameters.parameters, isEmpty);
     expect(constructor.separator, isNull);
@@ -1614,8 +1605,7 @@
     expect(constructor.constKeyword, isNull);
     expect(constructor.factoryKeyword, isNull);
     expect(constructor.returnType.name, 'C');
-    _assertIsDeclarationName(constructor.returnType as SimpleIdentifier, false);
-    expect(constructor.name, isNull);
+    expect(constructor.name2, isNull);
     expect(constructor.parameters, isNotNull);
     expect(constructor.parameters.parameters, isEmpty);
     expect(constructor.separator!.lexeme, ':');
@@ -1638,8 +1628,7 @@
     expect(constructor.constKeyword, isNull);
     expect(constructor.factoryKeyword, isNull);
     expect(constructor.returnType.name, 'C');
-    _assertIsDeclarationName(constructor.returnType as SimpleIdentifier, false);
-    expect(constructor.name, isNull);
+    expect(constructor.name2, isNull);
     expect(constructor.parameters, isNotNull);
     expect(constructor.parameters.parameters, isEmpty);
     expect(constructor.separator!.lexeme, ':');
@@ -1660,9 +1649,8 @@
     expect(constructor.constKeyword, isNull);
     expect(constructor.factoryKeyword, isNull);
     expect(constructor.returnType.name, 'C');
-    _assertIsDeclarationName(constructor.returnType as SimpleIdentifier, false);
     expect(constructor.period, isNull);
-    expect(constructor.name, isNull);
+    expect(constructor.name2, isNull);
     expect(constructor.parameters, isNotNull);
     expect(constructor.parameters.parameters, isEmpty);
     expect(constructor.separator, isNull);
@@ -1795,7 +1783,7 @@
     NodeList<VariableDeclaration> variables = list.variables;
     expect(variables, hasLength(1));
     VariableDeclaration variable = variables[0];
-    expect(variable.name, isNotNull);
+    expect(variable.name2, isNotNull);
   }
 
   void test_parseField_external() {
@@ -1878,7 +1866,7 @@
     NodeList<VariableDeclaration> variables = list.variables;
     expect(variables, hasLength(1));
     VariableDeclaration variable = variables[0];
-    expect(variable.name, isNotNull);
+    expect(variable.name2, isNotNull);
   }
 
   void test_parseField_late() {
@@ -1902,7 +1890,7 @@
     NodeList<VariableDeclaration> variables = list.variables;
     expect(variables, hasLength(1));
     VariableDeclaration variable = variables[0];
-    expect(variable.name, isNotNull);
+    expect(variable.name2, isNotNull);
   }
 
   void test_parseField_late_const() {
@@ -1928,7 +1916,7 @@
     NodeList<VariableDeclaration> variables = list.variables;
     expect(variables, hasLength(1));
     VariableDeclaration variable = variables[0];
-    expect(variable.name, isNotNull);
+    expect(variable.name2, isNotNull);
   }
 
   void test_parseField_late_final() {
@@ -1952,7 +1940,7 @@
     NodeList<VariableDeclaration> variables = list.variables;
     expect(variables, hasLength(1));
     VariableDeclaration variable = variables[0];
-    expect(variable.name, isNotNull);
+    expect(variable.name2, isNotNull);
   }
 
   void test_parseField_late_var() {
@@ -1975,7 +1963,7 @@
     NodeList<VariableDeclaration> variables = list.variables;
     expect(variables, hasLength(1));
     VariableDeclaration variable = variables[0];
-    expect(variable.name, isNotNull);
+    expect(variable.name2, isNotNull);
   }
 
   void test_parseField_non_abstract() {
@@ -2021,7 +2009,7 @@
     NodeList<VariableDeclaration> variables = list.variables;
     expect(variables, hasLength(1));
     VariableDeclaration variable = variables[0];
-    expect(variable.name, isNotNull);
+    expect(variable.name2, isNotNull);
   }
 
   void test_parseGetter_identifier_colon_issue_36961() {
@@ -2038,7 +2026,7 @@
     expect(constructor.body, isNotNull);
     expect(constructor.documentationComment, isNull);
     expect(constructor.externalKeyword, isNull);
-    expect(constructor.name, isNull);
+    expect(constructor.name2, isNull);
     expect(constructor.parameters, isNotNull);
     expect(constructor.returnType, isNotNull);
   }
@@ -2052,7 +2040,7 @@
     expectCommentText(method.documentationComment, '/// Doc');
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.parameters, isNull);
     expect(method.propertyKeyword, isNotNull);
@@ -2068,7 +2056,7 @@
     expectCommentText(method.documentationComment, '/// Doc');
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword!.lexeme, 'static');
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNull);
@@ -2115,7 +2103,7 @@
     expectCommentText(method.documentationComment, '/// Doc');
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNotNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -2132,7 +2120,7 @@
     expectCommentText(method.documentationComment, '/// Doc');
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -2149,7 +2137,7 @@
     expectCommentText(method.documentationComment, '/// Doc');
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword!.lexeme, 'static');
-    expect(method.name, isNotNull);
+    expect(method.name2, isNotNull);
     expect(method.operatorKeyword, isNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
@@ -2169,11 +2157,6 @@
     expectCommentText(parameter.documentationComment, '/// Doc');
   }
 
-  /// Assert that the given [name] is in declaration context.
-  void _assertIsDeclarationName(SimpleIdentifier name, [bool expected = true]) {
-    expect(name.inDeclarationContext(), expected);
-  }
-
   void _parseClassMember_method_native() {
     createParser('m() native "str";');
     var method = parser.parseClassMember('C') as MethodDeclaration;
diff --git a/pkg/analyzer/test/generated/collection_literal_parser_test.dart b/pkg/analyzer/test/generated/collection_literal_parser_test.dart
index 7e39201..3c171bb 100644
--- a/pkg/analyzer/test/generated/collection_literal_parser_test.dart
+++ b/pkg/analyzer/test/generated/collection_literal_parser_test.dart
@@ -48,7 +48,7 @@
     expect(second.rightParenthesis.lexeme, ')');
     var forLoopParts = second.forLoopParts as ForEachPartsWithDeclaration;
     DeclaredIdentifier forLoopVar = forLoopParts.loopVariable;
-    expect(forLoopVar.identifier.name, 'x');
+    expect(forLoopVar.name.lexeme, 'x');
     expect(forLoopParts.inKeyword, isNotNull);
     var iterable = forLoopParts.iterable as SimpleIdentifier;
     expect(iterable.name, 'list');
@@ -70,7 +70,7 @@
     expect(second.rightParenthesis.lexeme, ')');
     var forLoopParts = second.forLoopParts as ForEachPartsWithDeclaration;
     DeclaredIdentifier forLoopVar = forLoopParts.loopVariable;
-    expect(forLoopVar.identifier.name, 'x');
+    expect(forLoopVar.name.lexeme, 'x');
     expect(forLoopParts.inKeyword, isNotNull);
     var iterable = forLoopParts.iterable as SimpleIdentifier;
     expect(iterable.name, 'list');
@@ -97,7 +97,7 @@
     expect(second.rightParenthesis.lexeme, ')');
     var forLoopParts = second.forLoopParts as ForPartsWithDeclarations;
     VariableDeclaration forLoopVar = forLoopParts.variables.variables[0];
-    expect(forLoopVar.name.name, 'x');
+    expect(forLoopVar.name2.lexeme, 'x');
     var condition = forLoopParts.condition as BinaryExpression;
     var rightOperand = condition.rightOperand as IntegerLiteral;
     expect(rightOperand.value, 10);
diff --git a/pkg/analyzer/test/generated/element_resolver_test.dart b/pkg/analyzer/test/generated/element_resolver_test.dart
index ae995c2..0642108 100644
--- a/pkg/analyzer/test/generated/element_resolver_test.dart
+++ b/pkg/analyzer/test/generated/element_resolver_test.dart
@@ -35,7 +35,7 @@
       expect(name3, isNull);
       if (annotationElement is ConstructorElement) {
         expect(annotationElement, same(name2.staticElement));
-        expect(annotationElement.enclosingElement2, name1.staticElement);
+        expect(annotationElement.enclosingElement3, name1.staticElement);
         expect(annotationElement.displayName, 'A.named');
         expect(annotationElement.parameters, isEmpty);
       } else {
@@ -61,7 +61,7 @@
       expect(name3.staticElement!.displayName, 'A.named');
       if (annotationElement is ConstructorElement) {
         expect(annotationElement, same(name3.staticElement));
-        expect(annotationElement.enclosingElement2, name2.staticElement);
+        expect(annotationElement.enclosingElement3, name2.staticElement);
         expect(annotationElement.displayName, 'A.named');
         expect(annotationElement.parameters, isEmpty);
       } else {
@@ -87,7 +87,7 @@
       expect(name3.staticElement!.displayName, 'V');
       if (annotationElement is PropertyAccessorElement) {
         expect(annotationElement, same(name3.staticElement));
-        expect(annotationElement.enclosingElement2, name2.staticElement);
+        expect(annotationElement.enclosingElement3, name2.staticElement);
         expect(annotationElement.displayName, 'V');
       } else {
         fail('Expected "annotationElement" is PropertyAccessorElement, '
@@ -110,7 +110,7 @@
       expect(name2.staticElement!.displayName, 'A');
       expect(name3, isNull);
       if (annotationElement is ConstructorElement) {
-        expect(annotationElement.enclosingElement2, name2.staticElement);
+        expect(annotationElement.enclosingElement3, name2.staticElement);
         expect(annotationElement.displayName, 'A');
         expect(annotationElement.parameters, isEmpty);
       } else {
@@ -135,7 +135,7 @@
       expect(name3, isNull);
       if (annotationElement is PropertyAccessorElement) {
         expect(annotationElement, same(name2.staticElement));
-        expect(annotationElement.enclosingElement2, name1.staticElement);
+        expect(annotationElement.enclosingElement3, name1.staticElement);
         expect(annotationElement.displayName, 'V');
       } else {
         fail('Expected "annotationElement" is PropertyAccessorElement, '
@@ -157,7 +157,7 @@
       expect(name2, isNull);
       expect(name3, isNull);
       if (annotationElement is ConstructorElement) {
-        expect(annotationElement.enclosingElement2, name1.staticElement);
+        expect(annotationElement.enclosingElement3, name1.staticElement);
         expect(annotationElement.displayName, 'A');
         expect(annotationElement.parameters, isEmpty);
       } else {
@@ -179,7 +179,7 @@
       expect(name3, isNull);
       if (annotationElement is PropertyAccessorElement) {
         expect(annotationElement, same(name1.staticElement));
-        expect(annotationElement.enclosingElement2, isCompilationUnitElement);
+        expect(annotationElement.enclosingElement3, isCompilationUnitElement);
         expect(annotationElement.displayName, 'V');
       } else {
         fail('Expected "annotationElement" is PropertyAccessorElement, '
@@ -201,7 +201,7 @@
       expect(name3, isNull);
       if (annotationElement is PropertyAccessorElement) {
         expect(annotationElement, same(name2.staticElement));
-        expect(annotationElement.enclosingElement2, isCompilationUnitElement);
+        expect(annotationElement.enclosingElement3, isCompilationUnitElement);
         expect(annotationElement.displayName, 'V');
       } else {
         fail('Expected "annotationElement" is PropertyAccessorElement, '
diff --git a/pkg/analyzer/test/generated/error_parser_test.dart b/pkg/analyzer/test/generated/error_parser_test.dart
index a8779b3..da49dd5 100644
--- a/pkg/analyzer/test/generated/error_parser_test.dart
+++ b/pkg/analyzer/test/generated/error_parser_test.dart
@@ -852,7 +852,7 @@
     expect(semicolon, isNotNull);
     expect(semicolon.isSynthetic, isTrue);
     ClassDeclaration clazz = unit.declarations[0] as ClassDeclaration;
-    expect(clazz.name.name, 'A');
+    expect(clazz.name2.lexeme, 'A');
   }
 
   void test_expectedToken_semicolonMissingAfterExpression() {
@@ -888,7 +888,7 @@
     expect(semicolon, isNotNull);
     expect(semicolon.isSynthetic, isTrue);
     ClassDeclaration clazz = unit.declarations[0] as ClassDeclaration;
-    expect(clazz.name.name, 'A');
+    expect(clazz.name2.lexeme, 'A');
   }
 
   void test_expectedToken_whileMissingInDoStatement() {
@@ -2147,7 +2147,7 @@
       expectedError(ParserErrorCode.MISSING_IDENTIFIER, 6, 1),
       expectedError(ParserErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE, 6, 1)
     ]);
-    expect(parameter.identifier, isNotNull);
+    expect(parameter.name, isNotNull);
   }
 
   void test_missingNameForNamedParameter_equals() {
@@ -2159,7 +2159,7 @@
       expectedError(ParserErrorCode.MISSING_IDENTIFIER, 6, 1),
       expectedError(ParserErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE, 6, 1)
     ]);
-    expect(parameter.identifier, isNotNull);
+    expect(parameter.name, isNotNull);
   }
 
   void test_missingNameForNamedParameter_noDefault() {
@@ -2169,7 +2169,7 @@
     expectNotNullIfNoErrors(parameter);
     listener.assertErrors(
         [expectedError(ParserErrorCode.MISSING_IDENTIFIER, 5, 1)]);
-    expect(parameter.identifier, isNotNull);
+    expect(parameter.name, isNotNull);
   }
 
   void test_missingNameInLibraryDirective() {
diff --git a/pkg/analyzer/test/generated/extension_methods_parser_test.dart b/pkg/analyzer/test/generated/extension_methods_parser_test.dart
index 5c2a5c1..3407fe0 100644
--- a/pkg/analyzer/test/generated/extension_methods_parser_test.dart
+++ b/pkg/analyzer/test/generated/extension_methods_parser_test.dart
@@ -29,7 +29,7 @@
         ]);
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name!.name, 'E');
+    expect(extension.name2!.lexeme, 'E');
     expect(extension.onKeyword.lexeme, 'extends');
     expect((extension.extendedType as NamedType).name.name, 'A');
     expect(extension.members, hasLength(0));
@@ -42,7 +42,7 @@
     ]);
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name!.name, 'E');
+    expect(extension.name2!.lexeme, 'E');
     expect(extension.onKeyword.lexeme, 'implements');
     expect((extension.extendedType as NamedType).name.name, 'C');
     expect(extension.members, hasLength(0));
@@ -52,7 +52,7 @@
     var unit = parseCompilationUnit('extension E on C<T> { }');
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name!.name, 'E');
+    expect(extension.name2!.lexeme, 'E');
     expect(extension.onKeyword.lexeme, 'on');
     var namedType = extension.extendedType as NamedType;
     expect(namedType.name.name, 'C');
@@ -64,7 +64,7 @@
     var unit = parseCompilationUnit('extension E<T> on C<T> { }');
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name!.name, 'E');
+    expect(extension.name2!.lexeme, 'E');
     expect(extension.onKeyword.lexeme, 'on');
     var namedType = extension.extendedType as NamedType;
     expect(namedType.name.name, 'C');
@@ -76,7 +76,7 @@
     var unit = parseCompilationUnit('extension<T> on C<T> { }');
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name, isNull);
+    expect(extension.name2, isNull);
     expect(extension.onKeyword.lexeme, 'on');
     var namedType = extension.extendedType as NamedType;
     expect(namedType.name.name, 'C');
@@ -120,7 +120,7 @@
     ]);
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name!.name, 'E');
+    expect(extension.name2!.lexeme, 'E');
     expect(extension.onKeyword.lexeme, 'on');
     expect((extension.extendedType as NamedType).name.name, '');
     expect(extension.members, hasLength(0));
@@ -133,7 +133,7 @@
     ]);
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name!.name, 'E');
+    expect(extension.name2!.lexeme, 'E');
     expect(extension.onKeyword.lexeme, 'on');
     expect((extension.extendedType as NamedType).name.name, '');
     expect(extension.members, hasLength(0));
@@ -145,7 +145,7 @@
     ]);
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name!.name, 'E');
+    expect(extension.name2!.lexeme, 'E');
     expect(extension.onKeyword.lexeme, 'on');
     expect((extension.extendedType as NamedType).name.name, 'C');
     expect(extension.members, hasLength(0));
@@ -159,7 +159,7 @@
     expect(method.externalKeyword, isNull);
     expect(method.propertyKeyword, isNull);
     expect(method.returnType, isNotNull);
-    expect(method.name.name, 'late');
+    expect(method.name2.lexeme, 'late');
     expect(method.functionExpression, isNotNull);
 
     var body = method.functionExpression.body as BlockFunctionBody;
@@ -173,7 +173,7 @@
     var unit = parseCompilationUnit('extension E on C { }');
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name!.name, 'E');
+    expect(extension.name2!.lexeme, 'E');
     expect(extension.onKeyword.lexeme, 'on');
     expect((extension.extendedType as NamedType).name.name, 'C');
     var namedType = extension.extendedType as NamedType;
@@ -188,7 +188,7 @@
     ]);
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name!.name, 'E');
+    expect(extension.name2!.lexeme, 'E');
     expect(extension.onKeyword.lexeme, 'extends');
     expect((extension.extendedType as NamedType).name.name, 'C');
     expect(extension.members, hasLength(0));
@@ -200,7 +200,7 @@
     ]);
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name!.name, 'E');
+    expect(extension.name2!.lexeme, 'E');
     expect(extension.onKeyword.lexeme, 'implements');
     expect((extension.extendedType as NamedType).name.name, 'C');
     expect(extension.members, hasLength(0));
@@ -210,7 +210,7 @@
     var unit = parseCompilationUnit('extension on C { }');
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name, isNull);
+    expect(extension.name2, isNull);
     expect(extension.onKeyword.lexeme, 'on');
     expect((extension.extendedType as NamedType).name.name, 'C');
     var namedType = extension.extendedType as NamedType;
@@ -236,7 +236,7 @@
     ]);
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name!.name, 'E');
+    expect(extension.name2!.lexeme, 'E');
     expect(extension.onKeyword.lexeme, 'with');
     expect((extension.extendedType as NamedType).name.name, 'C');
     expect(extension.members, hasLength(0));
@@ -246,7 +246,7 @@
     var unit = parseCompilationUnit('extension E on void { }');
     expect(unit.declarations, hasLength(1));
     var extension = unit.declarations[0] as ExtensionDeclaration;
-    expect(extension.name!.name, 'E');
+    expect(extension.name2!.lexeme, 'E');
     expect(extension.onKeyword.lexeme, 'on');
     expect((extension.extendedType as NamedType).name.name, 'void');
     expect(extension.members, hasLength(0));
diff --git a/pkg/analyzer/test/generated/formal_parameter_parser_test.dart b/pkg/analyzer/test/generated/formal_parameter_parser_test.dart
index 64b9988..613e8fc 100644
--- a/pkg/analyzer/test/generated/formal_parameter_parser_test.dart
+++ b/pkg/analyzer/test/generated/formal_parameter_parser_test.dart
@@ -50,7 +50,7 @@
     expect(parameter, isFieldFormalParameter);
     var functionParameter = parameter as FieldFormalParameter;
     expect(functionParameter.type, isNotNull);
-    expect(functionParameter.identifier, isNotNull);
+    expect(functionParameter.name, isNotNull);
     expect(functionParameter.typeParameters, isNull);
     expect(functionParameter.parameters, isNotNull);
     expect(functionParameter.question, isNotNull);
@@ -65,7 +65,7 @@
         defaultParameter.parameter as FunctionTypedFormalParameter;
     assertNoErrors();
     expect(functionParameter.returnType, isNull);
-    expect(functionParameter.identifier, isNotNull);
+    expect(functionParameter.name, isNotNull);
     expect(functionParameter.typeParameters, isNull);
     expect(functionParameter.parameters, isNotNull);
     expect(functionParameter.isNamed, isTrue);
@@ -84,7 +84,7 @@
     var functionParameter =
         defaultParameter.parameter as FunctionTypedFormalParameter;
     expect(functionParameter.returnType, isNull);
-    expect(functionParameter.identifier, isNotNull);
+    expect(functionParameter.name, isNotNull);
     expect(functionParameter.typeParameters, isNull);
     expect(functionParameter.parameters, isNotNull);
     expect(functionParameter.isNamed, isTrue);
@@ -103,7 +103,7 @@
     var functionParameter =
         defaultParameter.parameter as FunctionTypedFormalParameter;
     expect(functionParameter.returnType, isNull);
-    expect(functionParameter.identifier, isNotNull);
+    expect(functionParameter.name, isNotNull);
     expect(functionParameter.typeParameters, isNull);
     expect(functionParameter.parameters, isNotNull);
     expect(functionParameter.isOptionalPositional, isTrue);
@@ -120,7 +120,7 @@
             errorCodes: [ParserErrorCode.EXPERIMENT_NOT_ENABLED])
         as FunctionTypedFormalParameter;
     expect(functionParameter.returnType, isNull);
-    expect(functionParameter.identifier, isNotNull);
+    expect(functionParameter.name, isNotNull);
     expect(functionParameter.typeParameters, isNull);
     expect(functionParameter.parameters, isNotNull);
     expect(functionParameter.isRequiredPositional, isTrue);
@@ -163,7 +163,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
     expect(simpleParameter.isNamed, isTrue);
@@ -181,7 +181,7 @@
     var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
     expect(simpleParameter.isRequired, isTrue);
@@ -199,7 +199,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
     expect(simpleParameter.isOptionalPositional, isTrue);
@@ -220,7 +220,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNotNull);
     expect(simpleParameter.isNamed, isTrue);
@@ -239,7 +239,7 @@
     var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNotNull);
     expect(simpleParameter.isRequired, isTrue);
@@ -257,7 +257,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNotNull);
     expect(simpleParameter.isOptionalPositional, isTrue);
@@ -278,7 +278,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.requiredKeyword, isNotNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNotNull);
     expect(simpleParameter.isNamed, isTrue);
@@ -297,7 +297,7 @@
     var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isGenericFunctionType);
     expect(simpleParameter.isRequired, isTrue);
@@ -315,7 +315,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNotNull);
     expect(simpleParameter.isNamed, isTrue);
@@ -334,7 +334,7 @@
     var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNotNull);
     expect(simpleParameter.isRequired, isTrue);
@@ -352,7 +352,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNotNull);
     expect(simpleParameter.isOptionalPositional, isTrue);
@@ -373,7 +373,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
     expect(simpleParameter.isNamed, isTrue);
@@ -391,7 +391,7 @@
     var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
     expect(simpleParameter.isRequired, isTrue);
@@ -409,7 +409,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
     expect(simpleParameter.isOptionalPositional, isTrue);
@@ -435,7 +435,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
     expect(simpleParameter.isNamed, isTrue);
@@ -453,7 +453,7 @@
     var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
     expect(simpleParameter.isRequired, isTrue);
@@ -470,7 +470,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
     expect(simpleParameter.isOptionalPositional, isTrue);
@@ -491,7 +491,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNotNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
     expect(simpleParameter.isNamed, isTrue);
@@ -511,7 +511,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNotNull);
     expect(simpleParameter.isNamed, isTrue);
@@ -529,7 +529,7 @@
     var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNotNull);
     expect(simpleParameter.isRequired, isTrue);
@@ -546,7 +546,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNotNull);
     expect(simpleParameter.isOptionalPositional, isTrue);
@@ -566,7 +566,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.requiredKeyword, isNotNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNotNull);
     expect(simpleParameter.isNamed, isTrue);
@@ -586,7 +586,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNotNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
     expect(simpleParameter.isNamed, isTrue);
@@ -606,7 +606,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNotNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNotNull);
     expect(simpleParameter.isNamed, isTrue);
@@ -626,7 +626,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNotNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
     expect(simpleParameter.isNamed, isTrue);
@@ -645,7 +645,7 @@
     var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isGenericFunctionType);
     expect(simpleParameter.isRequired, isTrue);
@@ -662,7 +662,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNotNull);
     expect(simpleParameter.isNamed, isTrue);
@@ -682,7 +682,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNotNull);
     expect(simpleParameter.isNamed, isTrue);
@@ -700,7 +700,7 @@
     var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNotNull);
     expect(simpleParameter.isRequired, isTrue);
@@ -717,7 +717,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNotNull);
     expect(simpleParameter.isOptionalPositional, isTrue);
@@ -737,7 +737,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNotNull);
     expect(simpleParameter.isOptionalPositional, isTrue);
@@ -757,7 +757,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
     expect(simpleParameter.isNamed, isTrue);
@@ -775,7 +775,7 @@
     var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
     expect(simpleParameter.isRequired, isTrue);
@@ -792,7 +792,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
     expect(simpleParameter.isOptionalPositional, isTrue);
@@ -813,7 +813,7 @@
         defaultParameter.parameter as SimpleFormalParameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.requiredKeyword, isNotNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
     expect(simpleParameter.isNamed, isTrue);
@@ -903,13 +903,13 @@
 
     expect(parameters[0], isSimpleFormalParameter);
     var required = parameters[0] as SimpleFormalParameter;
-    expect(required.identifier, isNull);
+    expect(required.name, isNull);
     expect(required.type, isNamedType);
     expect((required.type as NamedType).name.name, 'A');
 
     expect(parameters[1], isDefaultFormalParameter);
     var named = parameters[1] as DefaultFormalParameter;
-    expect(named.identifier, isNotNull);
+    expect(named.name, isNotNull);
     expect(named.parameter, isSimpleFormalParameter);
     var simple = named.parameter as SimpleFormalParameter;
     expect(simple.type, isNamedType);
@@ -1016,7 +1016,7 @@
     // TODO(danrubel): Investigate and improve recovery of parameter type/name.
     var parameter = list.parameters[0] as SimpleFormalParameter;
     expect(parameter.toSource(), 'io.File ');
-    expect(parameter.identifier!.token.isSynthetic, isTrue);
+    expect(parameter.name!.isSynthetic, isTrue);
     var type = parameter.type as NamedType;
     var typeName = type.name as PrefixedIdentifier;
     expect(typeName.prefix.token.isSynthetic, isFalse);
@@ -1037,7 +1037,7 @@
     // TODO(danrubel): Investigate and improve recovery of parameter type/name.
     var parameter = list.parameters[0] as SimpleFormalParameter;
     expect(parameter.toSource(), 'io. ');
-    expect(parameter.identifier!.token.isSynthetic, isTrue);
+    expect(parameter.name!.isSynthetic, isTrue);
     var type = parameter.type as NamedType;
     var typeName = type.name as PrefixedIdentifier;
     expect(typeName.prefix.token.isSynthetic, isFalse);
@@ -1069,7 +1069,7 @@
     var fieldParameter = parameter as FieldFormalParameter;
     expect(fieldParameter.keyword, isNotNull);
     expect(fieldParameter.type, isNull);
-    expect(fieldParameter.identifier, isNotNull);
+    expect(fieldParameter.name, isNotNull);
     expect(fieldParameter.parameters, isNull);
   }
 
@@ -1082,7 +1082,7 @@
     var fieldParameter = parameter as FieldFormalParameter;
     expect(fieldParameter.keyword, isNotNull);
     expect(fieldParameter.type, isNotNull);
-    expect(fieldParameter.identifier, isNotNull);
+    expect(fieldParameter.name, isNotNull);
     expect(fieldParameter.parameters, isNull);
   }
 
@@ -1095,7 +1095,7 @@
     var fieldParameter = parameter as FieldFormalParameter;
     expect(fieldParameter.keyword, isNotNull);
     expect(fieldParameter.type, isNull);
-    expect(fieldParameter.identifier, isNotNull);
+    expect(fieldParameter.name, isNotNull);
     expect(fieldParameter.parameters, isNull);
   }
 
@@ -1108,7 +1108,7 @@
     var fieldParameter = parameter as FieldFormalParameter;
     expect(fieldParameter.keyword, isNotNull);
     expect(fieldParameter.type, isNotNull);
-    expect(fieldParameter.identifier, isNotNull);
+    expect(fieldParameter.name, isNotNull);
     expect(fieldParameter.parameters, isNull);
   }
 
@@ -1120,7 +1120,7 @@
     var fieldParameter = parameter as FieldFormalParameter;
     expect(fieldParameter.keyword, isNull);
     expect(fieldParameter.type, isNull);
-    expect(fieldParameter.identifier, isNotNull);
+    expect(fieldParameter.name, isNotNull);
     FormalParameterList parameterList = fieldParameter.parameters!;
     expect(parameterList, isNotNull);
     expect(parameterList.parameters, hasLength(1));
@@ -1134,7 +1134,7 @@
     var fieldParameter = parameter as FieldFormalParameter;
     expect(fieldParameter.keyword, isNull);
     expect(fieldParameter.type, isNull);
-    expect(fieldParameter.identifier, isNotNull);
+    expect(fieldParameter.name, isNotNull);
     FormalParameterList parameterList = fieldParameter.parameters!;
     expect(parameterList, isNotNull);
     expect(parameterList.parameters, hasLength(0));
@@ -1153,7 +1153,7 @@
     var fieldParameter = parameter as FieldFormalParameter;
     expect(fieldParameter.keyword, isNull);
     expect(fieldParameter.type, isNull);
-    expect(fieldParameter.identifier, isNotNull);
+    expect(fieldParameter.name, isNotNull);
     expect(fieldParameter.parameters, isNull);
   }
 
@@ -1165,7 +1165,7 @@
     var fieldParameter = parameter as FieldFormalParameter;
     expect(fieldParameter.keyword, isNull);
     expect(fieldParameter.type, isNotNull);
-    expect(fieldParameter.identifier, isNotNull);
+    expect(fieldParameter.name, isNotNull);
     expect(fieldParameter.parameters, isNull);
   }
 
@@ -1177,7 +1177,7 @@
     var fieldParameter = parameter as FieldFormalParameter;
     expect(fieldParameter.keyword, isNotNull);
     expect(fieldParameter.type, isNull);
-    expect(fieldParameter.identifier, isNotNull);
+    expect(fieldParameter.name, isNotNull);
     expect(fieldParameter.parameters, isNull);
   }
 
@@ -1194,7 +1194,7 @@
         defaultParameter.parameter as FunctionTypedFormalParameter;
     assertNoErrors();
     expect(functionParameter.returnType, isNull);
-    expect(functionParameter.identifier, isNotNull);
+    expect(functionParameter.name, isNotNull);
     expect(functionParameter.typeParameters, isNull);
     expect(functionParameter.parameters, isNotNull);
     expect(functionParameter.isNamed, isTrue);
@@ -1211,7 +1211,7 @@
     expect(parameter, isFunctionTypedFormalParameter);
     var functionParameter = parameter as FunctionTypedFormalParameter;
     expect(functionParameter.returnType, isNull);
-    expect(functionParameter.identifier, isNotNull);
+    expect(functionParameter.name, isNotNull);
     expect(functionParameter.typeParameters, isNull);
     expect(functionParameter.parameters, isNotNull);
     expect(functionParameter.question, isNull);
@@ -1226,7 +1226,7 @@
     var functionParameter = parameter as FunctionTypedFormalParameter;
     expect(functionParameter.covariantKeyword, isNotNull);
     expect(functionParameter.returnType, isNull);
-    expect(functionParameter.identifier, isNotNull);
+    expect(functionParameter.name, isNotNull);
     expect(functionParameter.typeParameters, isNull);
     expect(functionParameter.parameters, isNotNull);
     expect(functionParameter.question, isNull);
@@ -1240,7 +1240,7 @@
     expect(parameter, isFunctionTypedFormalParameter);
     var functionParameter = parameter as FunctionTypedFormalParameter;
     expect(functionParameter.returnType, isNull);
-    expect(functionParameter.identifier, isNotNull);
+    expect(functionParameter.name, isNotNull);
     expect(functionParameter.typeParameters, isNull);
     expect(functionParameter.parameters, isNotNull);
     expect(functionParameter.question, isNotNull);
@@ -1254,7 +1254,7 @@
     expect(parameter, isFunctionTypedFormalParameter);
     var functionParameter = parameter as FunctionTypedFormalParameter;
     expect(functionParameter.returnType, isNull);
-    expect(functionParameter.identifier, isNotNull);
+    expect(functionParameter.name, isNotNull);
     expect(functionParameter.typeParameters, isNotNull);
     expect(functionParameter.parameters, isNotNull);
     expect(functionParameter.question, isNull);
@@ -1267,7 +1267,7 @@
     expect(parameter, isFunctionTypedFormalParameter);
     var functionParameter = parameter as FunctionTypedFormalParameter;
     expect(functionParameter.returnType, isNotNull);
-    expect(functionParameter.identifier, isNotNull);
+    expect(functionParameter.name, isNotNull);
     expect(functionParameter.typeParameters, isNull);
     expect(functionParameter.parameters, isNotNull);
     expect(functionParameter.question, isNull);
@@ -1280,7 +1280,7 @@
     expect(parameter, isFunctionTypedFormalParameter);
     var functionParameter = parameter as FunctionTypedFormalParameter;
     expect(functionParameter.returnType, isNotNull);
-    expect(functionParameter.identifier, isNotNull);
+    expect(functionParameter.name, isNotNull);
     expect(functionParameter.typeParameters, isNotNull);
     expect(functionParameter.parameters, isNotNull);
     expect(functionParameter.question, isNull);
@@ -1295,7 +1295,7 @@
     var functionParameter = parameter as FunctionTypedFormalParameter;
     expect(functionParameter.covariantKeyword, isNotNull);
     expect(functionParameter.returnType, isNotNull);
-    expect(functionParameter.identifier, isNotNull);
+    expect(functionParameter.name, isNotNull);
     expect(functionParameter.typeParameters, isNull);
     expect(functionParameter.parameters, isNotNull);
     expect(functionParameter.question, isNull);
@@ -1308,7 +1308,7 @@
     expect(parameter, isFunctionTypedFormalParameter);
     var functionParameter = parameter as FunctionTypedFormalParameter;
     expect(functionParameter.returnType, isNotNull);
-    expect(functionParameter.identifier, isNotNull);
+    expect(functionParameter.name, isNotNull);
     expect(functionParameter.typeParameters, isNull);
     expect(functionParameter.parameters, isNotNull);
     expect(functionParameter.question, isNull);
@@ -1321,7 +1321,7 @@
     expect(parameter, isFunctionTypedFormalParameter);
     var functionParameter = parameter as FunctionTypedFormalParameter;
     expect(functionParameter.returnType, isNotNull);
-    expect(functionParameter.identifier, isNotNull);
+    expect(functionParameter.name, isNotNull);
     expect(functionParameter.typeParameters, isNotNull);
     expect(functionParameter.parameters, isNotNull);
     expect(functionParameter.question, isNull);
@@ -1342,7 +1342,7 @@
     var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
   }
 
   void test_parseNormalFormalParameter_simple_const_type() {
@@ -1353,7 +1353,7 @@
     var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNotNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
   }
 
   void test_parseNormalFormalParameter_simple_final_noType() {
@@ -1364,7 +1364,7 @@
     var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
   }
 
   void test_parseNormalFormalParameter_simple_final_type() {
@@ -1375,7 +1375,7 @@
     var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNotNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
   }
 
   void test_parseNormalFormalParameter_simple_noName() {
@@ -1387,7 +1387,7 @@
     var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNotNull);
-    expect(simpleParameter.identifier, isNull);
+    expect(simpleParameter.name, isNull);
   }
 
   void test_parseNormalFormalParameter_simple_noType() {
@@ -1398,7 +1398,7 @@
     var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
   }
 
   void test_parseNormalFormalParameter_simple_noType_namedCovariant() {
@@ -1410,7 +1410,7 @@
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
   }
 
   void test_parseNormalFormalParameter_simple_type() {
@@ -1421,6 +1421,6 @@
     var simpleParameter = parameter as SimpleFormalParameter;
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNotNull);
-    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.name, isNotNull);
   }
 }
diff --git a/pkg/analyzer/test/generated/new_as_identifier_parser_test.dart b/pkg/analyzer/test/generated/new_as_identifier_parser_test.dart
index 7beae7f..e50a3a7 100644
--- a/pkg/analyzer/test/generated/new_as_identifier_parser_test.dart
+++ b/pkg/analyzer/test/generated/new_as_identifier_parser_test.dart
@@ -194,7 +194,7 @@
     var classDeclaration = unit.declarations.single as ClassDeclaration;
     var constructorDeclaration =
         classDeclaration.members.single as ConstructorDeclaration;
-    expect(constructorDeclaration.name!.name, 'new');
+    expect(constructorDeclaration.name2!.lexeme, 'new');
   }
 
   void test_constructor_name_factory() {
@@ -207,7 +207,7 @@
     var classDeclaration = unit.declarations.single as ClassDeclaration;
     var constructorDeclaration =
         classDeclaration.members[0] as ConstructorDeclaration;
-    expect(constructorDeclaration.name!.name, 'new');
+    expect(constructorDeclaration.name2!.lexeme, 'new');
   }
 
   void test_constructor_tearoff() {
@@ -320,7 +320,7 @@
     var classDeclaration = unit.declarations.single as ClassDeclaration;
     var constructorDeclaration =
         classDeclaration.members.single as ConstructorDeclaration;
-    expect(constructorDeclaration.name!.name, 'new');
+    expect(constructorDeclaration.name2!.lexeme, 'new');
   }
 
   void test_factory_redirection() {
diff --git a/pkg/analyzer/test/generated/nnbd_parser_test.dart b/pkg/analyzer/test/generated/nnbd_parser_test.dart
index 54f27bc..8cf5d0a 100644
--- a/pkg/analyzer/test/generated/nnbd_parser_test.dart
+++ b/pkg/analyzer/test/generated/nnbd_parser_test.dart
@@ -395,7 +395,7 @@
     // Object? o
     var parameter =
         constructor.parameters.parameters.single as SimpleFormalParameter;
-    expect(parameter.identifier!.name, 'o');
+    expect(parameter.name!.lexeme, 'o');
     var type = parameter.type as NamedType;
     expect(type.question!.lexeme, '?');
     expect(type.name.name, 'Object');
@@ -441,7 +441,7 @@
     // Object? o
     var parameter =
         constructor.parameters.parameters.single as SimpleFormalParameter;
-    expect(parameter.identifier!.name, 'o');
+    expect(parameter.name!.lexeme, 'o');
     var type = parameter.type as NamedType;
     expect(type.question!.lexeme, '?');
     expect(type.name.name, 'Object');
@@ -494,7 +494,7 @@
     // Object? o
     var parameter =
         constructor.parameters.parameters.single as SimpleFormalParameter;
-    expect(parameter.identifier!.name, 'o');
+    expect(parameter.name!.lexeme, 'o');
     var type = parameter.type as NamedType;
     expect(type.question!.lexeme, '?');
     expect(type.name.name, 'Object');
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 21ddaaf..28a7fb5 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -1458,7 +1458,7 @@
 ''');
     var x = findNode.namedExpression('arg: true');
     var y = x.staticParameterElement!;
-    expect(y.enclosingElement2, isNotNull);
+    expect(y.enclosingElement3, isNotNull);
     expect(y.declaration, findElement.parameter('arg'));
   }
 
@@ -1471,7 +1471,7 @@
 ''');
     var x = findNode.namedExpression('arg: true');
     var y = x.staticParameterElement!;
-    expect(y.enclosingElement2, isNotNull);
+    expect(y.enclosingElement3, isNotNull);
     expect(y.declaration, findElement.parameter('arg'));
   }
 
diff --git a/pkg/analyzer/test/generated/parser_test_base.dart b/pkg/analyzer/test/generated/parser_test_base.dart
index ef2d196..ccb7205 100644
--- a/pkg/analyzer/test/generated/parser_test_base.dart
+++ b/pkg/analyzer/test/generated/parser_test_base.dart
@@ -14,7 +14,8 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
-import 'package:analyzer/src/dart/ast/ast.dart' show CompilationUnitImpl;
+import 'package:analyzer/src/dart/ast/ast.dart'
+    show ClassDeclarationImpl, CompilationUnitImpl;
 import 'package:analyzer/src/dart/ast/ast_factory.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
@@ -800,22 +801,22 @@
 
   ClassMember? parseClassMemberOrNull(String className) {
     return _run('ClassOrMixinBody', () {
-      astBuilder.classDeclaration = astFactory.classDeclaration(
-        null,
-        null,
-        null,
-        null,
-        null,
-        Token(Keyword.CLASS, 0),
-        astFactory.simpleIdentifier(fasta.StringTokenImpl.fromString(
+      astBuilder.classDeclaration = ClassDeclarationImpl(
+        comment: null,
+        metadata: null,
+        abstractKeyword: null,
+        macroKeyword: null,
+        augmentKeyword: null,
+        classKeyword: Token(Keyword.CLASS, 0),
+        name: astFactory.simpleIdentifier(fasta.StringTokenImpl.fromString(
             TokenType.IDENTIFIER, className, 6)),
-        null,
-        null,
-        null,
-        null,
-        Tokens.openCurlyBracket() /* leftBracket */,
-        <ClassMember>[],
-        Tokens.closeCurlyBracket() /* rightBracket */,
+        typeParameters: null,
+        extendsClause: null,
+        withClause: null,
+        implementsClause: null,
+        leftBracket: Tokens.openCurlyBracket(),
+        members: <ClassMember>[],
+        rightBracket: Tokens.closeCurlyBracket(),
       );
       // TODO(danrubel): disambiguate between class and mixin
       currentToken = fastaParser.parseClassMember(currentToken, className);
diff --git a/pkg/analyzer/test/generated/recovery_parser_test.dart b/pkg/analyzer/test/generated/recovery_parser_test.dart
index 196e3ca..fc3f193 100644
--- a/pkg/analyzer/test/generated/recovery_parser_test.dart
+++ b/pkg/analyzer/test/generated/recovery_parser_test.dart
@@ -389,7 +389,7 @@
     expect(unit.declarations, hasLength(1));
     var classDecl = unit.childEntities.first as ClassDeclaration;
     expect(classDecl, isNotNull);
-    expect(classDecl.name.name, 'foo');
+    expect(classDecl.name2.lexeme, 'foo');
   }
 
   void test_equalityExpression_missing_LHS() {
@@ -500,7 +500,7 @@
     NodeList<VariableDeclaration> vars =
         (fieldDecl as FieldDeclaration).fields.variables;
     expect(vars, hasLength(1));
-    expect(vars[0].name.name, "v");
+    expect(vars[0].name2.lexeme, "v");
   }
 
   void test_functionExpression_named() {
@@ -660,7 +660,7 @@
     NodeList<VariableDeclaration> variables =
         (member as TopLevelVariableDeclaration).variables.variables;
     expect(variables, hasLength(1));
-    SimpleIdentifier name = variables[0].name;
+    final name = variables[0].name2;
     expect(name.isSynthetic, isFalse);
   }
 
@@ -676,7 +676,7 @@
     NodeList<VariableDeclaration> variables =
         (member as TopLevelVariableDeclaration).variables.variables;
     expect(variables, hasLength(1));
-    SimpleIdentifier name = variables[0].name;
+    final name = variables[0].name2;
     expect(name.isSynthetic, isTrue);
   }
 
@@ -692,7 +692,7 @@
     NodeList<VariableDeclaration> variables =
         (member as TopLevelVariableDeclaration).variables.variables;
     expect(variables, hasLength(1));
-    SimpleIdentifier name = variables[0].name;
+    final name = variables[0].name2;
     expect(name.isSynthetic, isTrue);
   }
 
@@ -708,7 +708,7 @@
     NodeList<VariableDeclaration> variables =
         (member as TopLevelVariableDeclaration).variables.variables;
     expect(variables, hasLength(1));
-    SimpleIdentifier name = variables[0].name;
+    final name = variables[0].name2;
     expect(name.isSynthetic, isTrue);
   }
 
@@ -734,7 +734,7 @@
     NodeList<VariableDeclaration> fields = fieldList.variables;
     expect(fields, hasLength(1));
     VariableDeclaration field = fields[0];
-    expect(field.name.isSynthetic, isTrue);
+    expect(field.name2.isSynthetic, isTrue);
   }
 
   void test_incompleteField_final() {
@@ -759,7 +759,7 @@
     NodeList<VariableDeclaration> fields = fieldList.variables;
     expect(fields, hasLength(1));
     VariableDeclaration field = fields[0];
-    expect(field.name.isSynthetic, isTrue);
+    expect(field.name2.isSynthetic, isTrue);
   }
 
   void test_incompleteField_static() {
@@ -785,7 +785,7 @@
     NodeList<VariableDeclaration> fields = fieldList.variables;
     expect(fields, hasLength(1));
     VariableDeclaration field = fields[0];
-    expect(field.name.isSynthetic, isFalse);
+    expect(field.name2.isSynthetic, isFalse);
   }
 
   void test_incompleteField_static2() {
@@ -808,7 +808,7 @@
     NodeList<VariableDeclaration> fields = fieldList.variables;
     expect(fields, hasLength(1));
     VariableDeclaration field = fields[0];
-    expect(field.name.isSynthetic, isFalse);
+    expect(field.name2.isSynthetic, isFalse);
   }
 
   void test_incompleteField_type() {
@@ -834,7 +834,7 @@
     expect(fields, hasLength(1));
     VariableDeclaration field = fields[0];
     expect(type, isNull);
-    expect(field.name.name, 'A');
+    expect(field.name2.lexeme, 'A');
   }
 
   void test_incompleteField_var() {
@@ -859,7 +859,7 @@
     NodeList<VariableDeclaration> fields = fieldList.variables;
     expect(fields, hasLength(1));
     VariableDeclaration field = fields[0];
-    expect(field.name.isSynthetic, isTrue);
+    expect(field.name2.isSynthetic, isTrue);
   }
 
   void test_incompleteForEach() {
@@ -964,7 +964,7 @@
     List<VariableDeclaration> fields = fieldList.variables;
     expect(fields, hasLength(1));
     VariableDeclaration field = fields[0];
-    expect(field.name.name, 'f');
+    expect(field.name2.lexeme, 'f');
 // validate the type
     var typeArguments = (fieldList.type as NamedType).typeArguments!;
     expect(typeArguments.arguments, hasLength(1));
@@ -1056,7 +1056,7 @@
     var fields = classDecl.members.first as FieldDeclaration;
     expect(fields.fields.variables, hasLength(1));
     VariableDeclaration field = fields.fields.variables.first;
-    expect(field.name.name, 'g');
+    expect(field.name2.lexeme, 'g');
   }
 
   void test_invalidTypeParameters_super() {
@@ -1099,7 +1099,7 @@
     ]);
     var declaration = unit.declarations[0] as ClassDeclaration;
     var method = declaration.members[0] as ConstructorDeclaration;
-    expect(method.name!.name, 'named');
+    expect(method.name2!.lexeme, 'named');
     expect(method.parameters, isNotNull);
   }
 
@@ -1110,7 +1110,7 @@
         ]);
     var declaration = unit.declarations[0] as ClassDeclaration;
     var constructor = declaration.members[0] as ConstructorDeclaration;
-    expect(constructor.name!.name, 'named');
+    expect(constructor.name2!.lexeme, 'named');
     expect(constructor.parameters, isNotNull);
     expect(constructor.parameters.parameters, hasLength(0));
   }
@@ -1121,7 +1121,7 @@
     ]);
     var declaration = unit.declarations[0] as ClassDeclaration;
     var constructor = declaration.members[0] as ConstructorDeclaration;
-    expect(constructor.name, isNull);
+    expect(constructor.name2, isNull);
     expect(constructor.parameters, isNotNull);
     expect(constructor.parameters.parameters, hasLength(0));
   }
@@ -1132,7 +1132,7 @@
     ]);
     var declaration = unit.declarations[0] as ClassDeclaration;
     var constructor = declaration.members[0] as ConstructorDeclaration;
-    expect(constructor.name!.name, 'named');
+    expect(constructor.name2!.lexeme, 'named');
     expect(constructor.parameters, isNotNull);
     expect(constructor.parameters.parameters, hasLength(0));
   }
@@ -1145,7 +1145,7 @@
     ]);
     var declaration = unit.declarations[0] as ClassDeclaration;
     var method = declaration.members[0] as ConstructorDeclaration;
-    expect(method.name!.name, 'named');
+    expect(method.name2!.lexeme, 'named');
     expect(method.parameters, isNotNull);
     expect(method.parameters.parameters, hasLength(0));
   }
@@ -1284,7 +1284,7 @@
     expect(members[0], isMethodDeclaration);
     ClassMember member = members[1];
     expect(member, isMethodDeclaration);
-    expect((member as MethodDeclaration).name.name, "foo");
+    expect((member as MethodDeclaration).name2.lexeme, "foo");
   }
 
   void test_missingIdentifier_afterAnnotation() {
@@ -1309,7 +1309,7 @@
       expect(variables, hasLength(1));
       VariableDeclaration variable = variables[0];
       expect(variableList.type.toString(), expectedTypeName);
-      expect(variable.name.name, expectedName);
+      expect(variable.name2.lexeme, expectedName);
       if (expectedSemicolon.isEmpty) {
         expect(declaration.semicolon.isSynthetic, isTrue);
       } else {
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 86cbe1c..1f4018b 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -74,7 +74,7 @@
 
     var constructor = findElement.unnamedConstructor('C');
     var x = findElement.localFunction('x');
-    expect(x.enclosingElement2, constructor);
+    expect(x.enclosingElement3, constructor);
   }
 }
 
diff --git a/pkg/analyzer/test/generated/resolver_test_case.dart b/pkg/analyzer/test/generated/resolver_test_case.dart
index b382aee..6205e1d 100644
--- a/pkg/analyzer/test/generated/resolver_test_case.dart
+++ b/pkg/analyzer/test/generated/resolver_test_case.dart
@@ -6,6 +6,7 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:test/test.dart';
 
 import '../src/dart/resolution/context_collection_resolution.dart';
@@ -212,6 +213,10 @@
       return;
     }
 
+    if (node is DeclaredSimpleIdentifier) {
+      return;
+    }
+
     var staticType = node.staticType;
     if (staticType != null &&
         staticType.isDynamic &&
diff --git a/pkg/analyzer/test/generated/simple_parser_test.dart b/pkg/analyzer/test/generated/simple_parser_test.dart
index a8ba8f8..01b61ea 100644
--- a/pkg/analyzer/test/generated/simple_parser_test.dart
+++ b/pkg/analyzer/test/generated/simple_parser_test.dart
@@ -108,10 +108,10 @@
 class C<@Foo.bar(const [], const [1], const{"":r""}, 0xFF + 2, .3, 4.5) T> {}
 ''');
     var clazz = unit.declarations[0] as ClassDeclaration;
-    expect(clazz.name.name, 'C');
+    expect(clazz.name2.lexeme, 'C');
     expect(clazz.typeParameters!.typeParameters, hasLength(1));
     TypeParameter typeParameter = clazz.typeParameters!.typeParameters[0];
-    expect(typeParameter.name.name, 'T');
+    expect(typeParameter.name2.lexeme, 'T');
     expect(typeParameter.metadata, hasLength(1));
     Annotation metadata = typeParameter.metadata[0];
     expect(metadata.name.name, 'Foo.bar');
@@ -154,7 +154,7 @@
     expect(method.parameters!.parameters, hasLength(1));
     var parameter =
         method.parameters!.parameters[0] as FunctionTypedFormalParameter;
-    expect(parameter.identifier, isNotNull);
+    expect(parameter.name, isNotNull);
   }
 
   void test_parseAnnotation_n1() {
@@ -1578,13 +1578,13 @@
 
     expect(parameters[0], isSimpleFormalParameter);
     var parameter = parameters[0] as SimpleFormalParameter;
-    expect(parameter.identifier, isNull);
+    expect(parameter.name, isNull);
     expect(parameter.type, isNamedType);
     expect((parameter.type as NamedType).name.name, 'int');
 
     expect(parameters[1], isSimpleFormalParameter);
     parameter = parameters[1] as SimpleFormalParameter;
-    expect(parameter.identifier, isNull);
+    expect(parameter.name, isNull);
     expect(parameter.type, isNamedType);
     expect((parameter.type as NamedType).name.name, 'int');
   }
@@ -1663,15 +1663,15 @@
 
     expect(parameters[0], isSimpleFormalParameter);
     var parameter = parameters[0] as SimpleFormalParameter;
-    expect(parameter.identifier, isNotNull);
-    expect(parameter.identifier!.name, 's');
+    expect(parameter.name, isNotNull);
+    expect(parameter.name!.lexeme, 's');
     expect(parameter.type, isNamedType);
     expect((parameter.type as NamedType).name.name, 'String');
 
     expect(parameters[1], isSimpleFormalParameter);
     parameter = parameters[1] as SimpleFormalParameter;
-    expect(parameter.identifier, isNotNull);
-    expect(parameter.identifier!.name, 'i');
+    expect(parameter.name, isNotNull);
+    expect(parameter.name!.lexeme, 'i');
     expect(parameter.type, isNamedType);
     expect((parameter.type as NamedType).name.name, 'int');
   }
@@ -1849,7 +1849,7 @@
     assertNoErrors();
     expect(parameter.bound, isGenericFunctionType);
     expect(parameter.extendsKeyword, isNotNull);
-    expect(parameter.name, isNotNull);
+    expect(parameter.name2, isNotNull);
   }
 
   void test_parseTypeParameter_bounded_functionType_return() {
@@ -1859,7 +1859,7 @@
     assertNoErrors();
     expect(parameter.bound, isGenericFunctionType);
     expect(parameter.extendsKeyword, isNotNull);
-    expect(parameter.name, isNotNull);
+    expect(parameter.name2, isNotNull);
   }
 
   void test_parseTypeParameter_bounded_generic() {
@@ -1869,7 +1869,7 @@
     assertNoErrors();
     expect(parameter.bound, isNamedType);
     expect(parameter.extendsKeyword, isNotNull);
-    expect(parameter.name, isNotNull);
+    expect(parameter.name2, isNotNull);
   }
 
   void test_parseTypeParameter_bounded_simple() {
@@ -1879,7 +1879,7 @@
     assertNoErrors();
     expect(parameter.bound, isNamedType);
     expect(parameter.extendsKeyword, isNotNull);
-    expect(parameter.name, isNotNull);
+    expect(parameter.name2, isNotNull);
   }
 
   void test_parseTypeParameter_simple() {
@@ -1889,7 +1889,7 @@
     assertNoErrors();
     expect(parameter.bound, isNull);
     expect(parameter.extendsKeyword, isNull);
-    expect(parameter.name, isNotNull);
+    expect(parameter.name2, isNotNull);
   }
 
   void test_parseTypeParameterList_multiple() {
@@ -1921,7 +1921,7 @@
     expect(parameterList.rightBracket, isNotNull);
     expect(parameterList.typeParameters, hasLength(1));
     TypeParameter typeParameter = parameterList.typeParameters[0];
-    expect(typeParameter.name.name, 'A');
+    expect(typeParameter.name2.lexeme, 'A');
     var bound = typeParameter.bound as NamedType;
     expect(bound.name.name, 'B');
     var typeArguments = bound.typeArguments!;
@@ -1955,7 +1955,7 @@
     VariableDeclaration declaration = parseVariableDeclaration('var a = b;');
     expectNotNullIfNoErrors(declaration);
     assertNoErrors();
-    expect(declaration.name, isNotNull);
+    expect(declaration.name2, isNotNull);
     expect(declaration.equals, isNotNull);
     expect(declaration.initializer, isNotNull);
   }
@@ -2040,7 +2040,7 @@
     VariableDeclaration declaration = parseVariableDeclaration('var a;');
     expectNotNullIfNoErrors(declaration);
     assertNoErrors();
-    expect(declaration.name, isNotNull);
+    expect(declaration.name2, isNotNull);
     expect(declaration.equals, isNull);
     expect(declaration.initializer, isNull);
   }
@@ -2072,11 +2072,11 @@
       expectedError(ScannerErrorCode.EXPECTED_TOKEN, 23, 1),
     ]);
     var typeAlias = unit.declarations[0] as GenericTypeAlias;
-    expect(typeAlias.name.toSource(), 'K');
+    expect(typeAlias.name2.lexeme, 'K');
     var functionType = typeAlias.functionType!;
     expect(functionType.parameters.parameters, hasLength(1));
     var parameter = functionType.parameters.parameters[0];
-    expect(parameter.identifier, isNotNull);
+    expect(parameter.name, isNotNull);
   }
 
   void test_typeAlias_parameter_missingIdentifier_37733() {
@@ -2086,10 +2086,10 @@
       expectedError(ParserErrorCode.MISSING_IDENTIFIER, 19, 1),
     ]);
     var typeAlias = unit.declarations[0] as GenericTypeAlias;
-    expect(typeAlias.name.toSource(), 'T');
+    expect(typeAlias.name2.lexeme, 'T');
     var functionType = typeAlias.functionType!;
     expect(functionType.parameters.parameters, hasLength(1));
     var parameter = functionType.parameters.parameters[0];
-    expect(parameter.identifier, isNotNull);
+    expect(parameter.name, isNotNull);
   }
 }
diff --git a/pkg/analyzer/test/generated/statement_parser_test.dart b/pkg/analyzer/test/generated/statement_parser_test.dart
index ec1236b..f358b2a 100644
--- a/pkg/analyzer/test/generated/statement_parser_test.dart
+++ b/pkg/analyzer/test/generated/statement_parser_test.dart
@@ -278,7 +278,7 @@
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
     var forLoopParts = forStatement.forLoopParts as ForEachPartsWithDeclaration;
-    expect(forLoopParts.loopVariable.identifier.name, 'external');
+    expect(forLoopParts.loopVariable.name.lexeme, 'external');
     expect(forLoopParts.inKeyword, isNotNull);
     expect(forLoopParts.iterable, isNotNull);
     expect(forStatement.rightParenthesis, isNotNull);
@@ -294,7 +294,7 @@
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
     var forLoopParts = forStatement.forLoopParts as ForEachPartsWithDeclaration;
-    expect(forLoopParts.loopVariable.identifier.name, 'required');
+    expect(forLoopParts.loopVariable.name.lexeme, 'required');
     expect(forLoopParts.inKeyword, isNotNull);
     expect(forLoopParts.iterable, isNotNull);
     expect(forStatement.rightParenthesis, isNotNull);
@@ -1072,7 +1072,7 @@
     assertNoErrors();
     List<VariableDeclaration> variables = statement.variables.variables;
     expect(variables, hasLength(1));
-    expect(variables[0].name.name, 'Function');
+    expect(variables[0].name2.lexeme, 'Function');
   }
 
   void test_parseNonLabeledStatement_variableDeclaration_gftType() {
@@ -1082,7 +1082,7 @@
     VariableDeclarationList variableList = statement.variables;
     List<VariableDeclaration> variables = variableList.variables;
     expect(variables, hasLength(1));
-    expect(variables[0].name.name, 'v');
+    expect(variables[0].name2.lexeme, 'v');
     expect(variableList.type, isGenericFunctionType);
   }
 
@@ -1095,7 +1095,7 @@
     VariableDeclarationList variableList = statement.variables;
     List<VariableDeclaration> variables = variableList.variables;
     expect(variables, hasLength(1));
-    expect(variables[0].name.name, 'v');
+    expect(variables[0].name2.lexeme, 'v');
     expect(variableList.type, isGenericFunctionType);
   }
 
@@ -1107,7 +1107,7 @@
     VariableDeclarationList variableList = statement.variables;
     List<VariableDeclaration> variables = variableList.variables;
     expect(variables, hasLength(1));
-    expect(variables[0].name.name, 'v');
+    expect(variables[0].name2.lexeme, 'v');
     expect(variableList.type, isGenericFunctionType);
   }
 
@@ -1119,7 +1119,7 @@
     VariableDeclarationList variableList = statement.variables;
     List<VariableDeclaration> variables = variableList.variables;
     expect(variables, hasLength(1));
-    expect(variables[0].name.name, 'v');
+    expect(variables[0].name2.lexeme, 'v');
     expect(variableList.type, isGenericFunctionType);
   }
 
@@ -1131,7 +1131,7 @@
     VariableDeclarationList variableList = statement.variables;
     List<VariableDeclaration> variables = variableList.variables;
     expect(variables, hasLength(1));
-    expect(variables[0].name.name, 'v');
+    expect(variables[0].name2.lexeme, 'v');
     expect(variableList.type, isGenericFunctionType);
   }
 
@@ -1142,7 +1142,7 @@
     VariableDeclarationList variableList = statement.variables;
     List<VariableDeclaration> variables = variableList.variables;
     expect(variables, hasLength(1));
-    expect(variables[0].name.name, 'v');
+    expect(variables[0].name2.lexeme, 'v');
     expect(variableList.type, isGenericFunctionType);
   }
 
@@ -1154,7 +1154,7 @@
     VariableDeclarationList variableList = statement.variables;
     List<VariableDeclaration> variables = variableList.variables;
     expect(variables, hasLength(1));
-    expect(variables[0].name.name, 'v');
+    expect(variables[0].name2.lexeme, 'v');
     expect(variableList.type, isGenericFunctionType);
   }
 
@@ -1164,7 +1164,7 @@
     VariableDeclarationList variableList = statement.variables;
     List<VariableDeclaration> variables = variableList.variables;
     expect(variables, hasLength(1));
-    expect(variables[0].name.name, 'v');
+    expect(variables[0].name2.lexeme, 'v');
     var typeName = variableList.type as NamedType;
     expect(typeName.name.name, 'C');
     expect(typeName.typeArguments!.arguments, hasLength(1));
@@ -1179,7 +1179,7 @@
     VariableDeclarationList variableList = statement.variables;
     List<VariableDeclaration> variables = variableList.variables;
     expect(variables, hasLength(1));
-    expect(variables[0].name.name, 'v');
+    expect(variables[0].name2.lexeme, 'v');
     var typeName = variableList.type as NamedType;
     expect(typeName.name.name, 'C');
     expect(typeName.typeArguments!.arguments, hasLength(1));
@@ -1194,7 +1194,7 @@
     VariableDeclarationList variableList = statement.variables;
     List<VariableDeclaration> variables = variableList.variables;
     expect(variables, hasLength(1));
-    expect(variables[0].name.name, 'v');
+    expect(variables[0].name2.lexeme, 'v');
     var typeName = variableList.type as NamedType;
     expect(typeName.name.name, 'C');
     expect(typeName.typeArguments!.arguments, hasLength(1));
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index 8bf7ab3..c9978a9 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
-import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -2670,17 +2669,103 @@
 
   test_genericFunction() async {
     await assertNoErrorsInCode(r'T f<T>(T x) => null;');
-    expectFunctionType('f', 'T Function<T>(T)', typeFormals: '[T]');
-    SimpleIdentifier f = findNode.simple('f');
-    var e = f.staticElement as FunctionElementImpl;
-    FunctionType ft = e.type.instantiate([typeProvider.stringType]);
-    assertType(ft, 'String Function(String)');
+
+    final node = findNode.functionDeclaration('f<T>');
+    assertResolvedNodeText(node, r'''
+FunctionDeclaration
+  returnType: NamedType
+    name: SimpleIdentifier
+      token: T
+      staticElement: T@4
+      staticType: null
+    type: T*
+  name: f
+  functionExpression: FunctionExpression
+    typeParameters: TypeParameterList
+      leftBracket: <
+      typeParameters
+        TypeParameter
+          name: T
+          declaredElement: T@4
+      rightBracket: >
+    parameters: FormalParameterList
+      leftParenthesis: (
+      parameter: SimpleFormalParameter
+        type: NamedType
+          name: SimpleIdentifier
+            token: T
+            staticElement: T@4
+            staticType: null
+          type: T*
+        name: x
+        declaredElement: self::@function::f::@parameter::x
+        declaredElementType: T*
+      rightParenthesis: )
+    body: ExpressionFunctionBody
+      functionDefinition: =>
+      expression: NullLiteral
+        literal: null
+        staticType: Null*
+      semicolon: ;
+    declaredElement: self::@function::f
+    staticType: T* Function<T>(T*)*
+  declaredElement: self::@function::f
+  declaredElementType: T* Function<T>(T*)*
+''');
   }
 
   test_genericFunction_bounds() async {
     await assertNoErrorsInCode(r'T f<T extends num>(T x) => null;');
-    expectFunctionType('f', 'T Function<T extends num>(T)',
-        typeFormals: '[T extends num]');
+
+    final node = findNode.functionDeclaration('f<T');
+    assertResolvedNodeText(node, r'''
+FunctionDeclaration
+  returnType: NamedType
+    name: SimpleIdentifier
+      token: T
+      staticElement: T@4
+      staticType: null
+    type: T*
+  name: f
+  functionExpression: FunctionExpression
+    typeParameters: TypeParameterList
+      leftBracket: <
+      typeParameters
+        TypeParameter
+          name: T
+          extendsKeyword: extends
+          bound: NamedType
+            name: SimpleIdentifier
+              token: num
+              staticElement: dart:core::@class::num
+              staticType: null
+            type: num*
+          declaredElement: T@4
+      rightBracket: >
+    parameters: FormalParameterList
+      leftParenthesis: (
+      parameter: SimpleFormalParameter
+        type: NamedType
+          name: SimpleIdentifier
+            token: T
+            staticElement: T@4
+            staticType: null
+          type: T*
+        name: x
+        declaredElement: self::@function::f::@parameter::x
+        declaredElementType: T*
+      rightParenthesis: )
+    body: ExpressionFunctionBody
+      functionDefinition: =>
+      expression: NullLiteral
+        literal: null
+        staticType: Null*
+      semicolon: ;
+    declaredElement: self::@function::f
+    staticType: T* Function<T extends num*>(T*)*
+  declaredElement: self::@function::f
+  declaredElementType: T* Function<T extends num*>(T*)*
+''');
   }
 
   test_genericFunction_parameter() async {
@@ -2698,11 +2783,40 @@
   static T f<T>(T x) => null;
 }
 ''');
-    expectFunctionType('f', 'T Function<T>(T)', typeFormals: '[T]');
-    SimpleIdentifier f = findNode.simple('f');
-    var e = f.staticElement as MethodElementImpl;
-    FunctionType ft = e.type.instantiate([typeProvider.stringType]);
-    assertType(ft, 'String Function(String)');
+
+    final node = findNode.methodDeclaration('f<T>');
+    assertResolvedNodeText(node, r'''
+MethodDeclaration
+  modifierKeyword: static
+  returnType: NamedType
+    name: SimpleIdentifier
+      token: T
+      staticElement: T@26
+      staticType: null
+    type: T*
+  name: f
+  parameters: FormalParameterList
+    leftParenthesis: (
+    parameter: SimpleFormalParameter
+      type: NamedType
+        name: SimpleIdentifier
+          token: T
+          staticElement: T@26
+          staticType: null
+        type: T*
+      name: x
+      declaredElement: self::@class::C::@method::f::@parameter::x
+      declaredElementType: T*
+    rightParenthesis: )
+  body: ExpressionFunctionBody
+    functionDefinition: =>
+    expression: NullLiteral
+      literal: null
+      staticType: Null*
+    semicolon: ;
+  declaredElement: self::@class::C::@method::f
+  declaredElementType: T* Function<T>(T*)*
+''');
   }
 
   test_genericFunction_typedef() async {
@@ -3201,15 +3315,42 @@
   T f<T>(T x) => null;
 }
 class D extends C {
-  T f<T>(T x) => null; // from D
+  T f<T>(T y) => null;
 }
 ''');
-    expectFunctionType('f<T>(T x) => null; // from D', 'T Function<T>(T)',
-        typeFormals: '[T]');
-    SimpleIdentifier f = findNode.simple('f<T>(T x) => null; // from D');
-    var e = f.staticElement as MethodElementImpl;
-    FunctionType ft = e.type.instantiate([typeProvider.stringType]);
-    assertType(ft, 'String Function(String)');
+
+    final node = findNode.methodDeclaration('f<T>(T y)');
+    assertResolvedNodeText(node, r'''
+MethodDeclaration
+  returnType: NamedType
+    name: SimpleIdentifier
+      token: T
+      staticElement: T@61
+      staticType: null
+    type: T*
+  name: f
+  parameters: FormalParameterList
+    leftParenthesis: (
+    parameter: SimpleFormalParameter
+      type: NamedType
+        name: SimpleIdentifier
+          token: T
+          staticElement: T@61
+          staticType: null
+        type: T*
+      name: y
+      declaredElement: self::@class::D::@method::f::@parameter::y
+      declaredElementType: T*
+    rightParenthesis: )
+  body: ExpressionFunctionBody
+    functionDefinition: =>
+    expression: NullLiteral
+      literal: null
+      staticType: Null*
+    semicolon: ;
+  declaredElement: self::@class::D::@method::f
+  declaredElementType: T* Function<T>(T*)*
+''');
   }
 
   test_genericMethod_override_bounds() async {
diff --git a/pkg/analyzer/test/generated/top_level_parser_test.dart b/pkg/analyzer/test/generated/top_level_parser_test.dart
index f20c303..a628cb6 100644
--- a/pkg/analyzer/test/generated/top_level_parser_test.dart
+++ b/pkg/analyzer/test/generated/top_level_parser_test.dart
@@ -119,7 +119,7 @@
     expect(declaration.implementsClause, isNull);
     expect(declaration.classKeyword, isNotNull);
     expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name, isNotNull);
+    expect(declaration.name2, isNotNull);
     expect(declaration.members, hasLength(0));
     expect(declaration.rightBracket, isNotNull);
     expect(declaration.typeParameters, isNull);
@@ -138,8 +138,7 @@
     expect(declaration.implementsClause, isNull);
     expect(declaration.classKeyword, isNotNull);
     expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name, isNotNull);
-    _assertIsDeclarationName(declaration.name);
+    expect(declaration.name2, isNotNull);
     expect(declaration.members, hasLength(0));
     expect(declaration.rightBracket, isNotNull);
     expect(declaration.typeParameters, isNull);
@@ -158,7 +157,7 @@
     expect(declaration.implementsClause, isNull);
     expect(declaration.classKeyword, isNotNull);
     expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name, isNotNull);
+    expect(declaration.name2, isNotNull);
     expect(declaration.members, hasLength(0));
     expect(declaration.rightBracket, isNotNull);
     expect(declaration.typeParameters, isNull);
@@ -177,7 +176,7 @@
     expect(declaration.implementsClause, isNotNull);
     expect(declaration.classKeyword, isNotNull);
     expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name, isNotNull);
+    expect(declaration.name2, isNotNull);
     expect(declaration.members, hasLength(0));
     expect(declaration.rightBracket, isNotNull);
     expect(declaration.typeParameters, isNull);
@@ -193,7 +192,7 @@
     expect(declaration.documentationComment, isNull);
     expect(declaration.abstractKeyword, isNull);
     expect(declaration.classKeyword, isNotNull);
-    expect(declaration.name, isNotNull);
+    expect(declaration.name2, isNotNull);
     expect(declaration.typeParameters, isNull);
     expect(declaration.extendsClause, isNotNull);
     expect(declaration.withClause, isNotNull);
@@ -213,7 +212,7 @@
     expect(declaration.documentationComment, isNull);
     expect(declaration.abstractKeyword, isNull);
     expect(declaration.classKeyword, isNotNull);
-    expect(declaration.name, isNotNull);
+    expect(declaration.name2, isNotNull);
     expect(declaration.typeParameters, isNull);
     expect(declaration.extendsClause, isNotNull);
     expect(declaration.withClause, isNotNull);
@@ -236,7 +235,7 @@
     expect(declaration.implementsClause, isNotNull);
     expect(declaration.classKeyword, isNotNull);
     expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name, isNotNull);
+    expect(declaration.name2, isNotNull);
     expect(declaration.members, hasLength(0));
     expect(declaration.rightBracket, isNotNull);
     expect(declaration.typeParameters, isNull);
@@ -378,7 +377,7 @@
     expect(declaration.implementsClause, isNull);
     expect(declaration.classKeyword, isNotNull);
     expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name, isNotNull);
+    expect(declaration.name2, isNotNull);
     expect(declaration.members, hasLength(1));
     expect(declaration.rightBracket, isNotNull);
     expect(declaration.typeParameters, isNull);
@@ -392,8 +391,7 @@
     expect(member, isClassTypeAlias);
     var typeAlias = member as ClassTypeAlias;
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
-    _assertIsDeclarationName(typeAlias.name);
+    expect(typeAlias.name2, isNotNull);
     expect(typeAlias.typeParameters, isNull);
     expect(typeAlias.withClause, isNotNull);
     expect(typeAlias.implementsClause, isNotNull);
@@ -410,7 +408,7 @@
     expect(member, isClassTypeAlias);
     var typeAlias = member as ClassTypeAlias;
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.name2, isNotNull);
     expect(typeAlias.typeParameters, isNull);
     expect(typeAlias.withClause, isNotNull);
     expect(typeAlias.withClause.withKeyword, isNotNull);
@@ -432,14 +430,11 @@
     expect(declaration.implementsClause, isNull);
     expect(declaration.classKeyword, isNotNull);
     expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name, isNotNull);
-    _assertIsDeclarationName(declaration.name);
+    expect(declaration.name2, isNotNull);
     expect(declaration.members, hasLength(0));
     expect(declaration.rightBracket, isNotNull);
     expect(declaration.typeParameters, isNotNull);
     expect(declaration.typeParameters!.typeParameters, hasLength(1));
-    _assertIsDeclarationName(
-        declaration.typeParameters!.typeParameters[0].name);
   }
 
   void test_parseClassDeclaration_typeParameters_extends_void() {
@@ -657,7 +652,7 @@
     assertNoErrors();
     expect(member, isClassDeclaration);
     var declaration = member as ClassDeclaration;
-    expect(declaration.name.name, "A");
+    expect(declaration.name2.lexeme, "A");
     expect(declaration.members, hasLength(0));
   }
 
@@ -668,7 +663,7 @@
     assertNoErrors();
     expect(member, isClassTypeAlias);
     var declaration = member as ClassTypeAlias;
-    expect(declaration.name.name, "A");
+    expect(declaration.name2.lexeme, "A");
     expect(declaration.abstractKeyword, isNotNull);
   }
 
@@ -682,7 +677,6 @@
     expect(declaration.semicolon, isNotNull);
     expect(declaration.variables, isNotNull);
     expect(declaration.variables.keyword!.lexeme, 'const');
-    _assertIsDeclarationName(declaration.variables.variables[0].name);
   }
 
   void test_parseCompilationUnitMember_expressionFunctionBody_tokens() {
@@ -691,7 +685,6 @@
     var body = f.functionExpression.body as ExpressionFunctionBody;
     expect(body.functionDefinition.lexeme, '=>');
     expect(body.semicolon!.lexeme, ';');
-    _assertIsDeclarationName(f.name);
   }
 
   void test_parseCompilationUnitMember_finalVariable() {
@@ -837,7 +830,6 @@
     expect(declaration.externalKeyword, isNotNull);
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNotNull);
-    _assertIsDeclarationName(declaration.name);
   }
 
   void test_parseCompilationUnitMember_getter_external_type() {
@@ -907,7 +899,6 @@
     var declaration = member as FunctionDeclaration;
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNotNull);
-    _assertIsDeclarationName(declaration.name);
   }
 
   void test_parseCompilationUnitMember_setter_type() {
@@ -930,8 +921,7 @@
     expect(member, isClassTypeAlias);
     var typeAlias = member as ClassTypeAlias;
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name.name, "C");
-    _assertIsDeclarationName(typeAlias.name);
+    expect(typeAlias.name2.lexeme, "C");
     expect(typeAlias.typeParameters, isNull);
     expect(typeAlias.equals, isNotNull);
     expect(typeAlias.abstractKeyword, isNotNull);
@@ -949,7 +939,7 @@
     expect(member, isClassTypeAlias);
     var typeAlias = member as ClassTypeAlias;
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name.name, "C");
+    expect(typeAlias.name2.lexeme, "C");
     expect(typeAlias.typeParameters!.typeParameters, hasLength(1));
     expect(typeAlias.equals, isNotNull);
     expect(typeAlias.abstractKeyword, isNull);
@@ -967,7 +957,7 @@
     expect(member, isClassTypeAlias);
     var typeAlias = member as ClassTypeAlias;
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name.name, "C");
+    expect(typeAlias.name2.lexeme, "C");
     expect(typeAlias.typeParameters, isNull);
     expect(typeAlias.equals, isNotNull);
     expect(typeAlias.abstractKeyword, isNull);
@@ -985,7 +975,7 @@
     expect(member, isClassTypeAlias);
     var typeAlias = member as ClassTypeAlias;
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name.name, "C");
+    expect(typeAlias.name2.lexeme, "C");
     expect(typeAlias.typeParameters, isNull);
     expect(typeAlias.equals, isNotNull);
     expect(typeAlias.abstractKeyword, isNull);
@@ -1002,9 +992,8 @@
     assertNoErrors();
     expect(member, TypeMatcher<FunctionTypeAlias>());
     var typeAlias = member as FunctionTypeAlias;
-    expect(typeAlias.name.name, "F");
+    expect(typeAlias.name2.lexeme, "F");
     expect(typeAlias.parameters.parameters, hasLength(0));
-    _assertIsDeclarationName(typeAlias.name);
   }
 
   void test_parseCompilationUnitMember_typedef_withDocComment() {
@@ -1024,7 +1013,6 @@
     expect(declaration.variables, isNotNull);
     expect(declaration.variables.type, isNotNull);
     expect(declaration.variables.keyword, isNull);
-    _assertIsDeclarationName(declaration.variables.variables[0].name);
   }
 
   void test_parseCompilationUnitMember_variable() {
@@ -1317,7 +1305,7 @@
     expect(declaration.documentationComment, isNull);
     expect(declaration.enumKeyword, isNotNull);
     expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name, isNotNull);
+    expect(declaration.name2, isNotNull);
     expect(declaration.constants, hasLength(1));
     expect(declaration.rightBracket, isNotNull);
   }
@@ -1330,7 +1318,7 @@
     expect(declaration.documentationComment, isNull);
     expect(declaration.enumKeyword, isNotNull);
     expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name, isNotNull);
+    expect(declaration.name2, isNotNull);
     expect(declaration.constants, hasLength(1));
     expect(declaration.rightBracket, isNotNull);
   }
@@ -1343,7 +1331,7 @@
     expect(declaration.documentationComment, isNull);
     expect(declaration.enumKeyword, isNotNull);
     expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name, isNotNull);
+    expect(declaration.name2, isNotNull);
     expect(declaration.constants, hasLength(2));
     expect(declaration.rightBracket, isNotNull);
   }
@@ -1468,7 +1456,7 @@
     assertNoErrors();
     expectCommentText(declaration.documentationComment, '/// Doc');
     expect((declaration.returnType as NamedType).name.name, 'T');
-    expect(declaration.name, isNotNull);
+    expect(declaration.name2, isNotNull);
     FunctionExpression expression = declaration.functionExpression;
     expect(expression, isNotNull);
     expect(expression.body, isNotNull);
@@ -1484,7 +1472,7 @@
     assertNoErrors();
     expectCommentText(declaration.documentationComment, '/// Doc');
     expect((declaration.returnType as NamedType).name.name, 'T');
-    expect(declaration.name, isNotNull);
+    expect(declaration.name2, isNotNull);
     FunctionExpression expression = declaration.functionExpression;
     expect(expression, isNotNull);
     expect(expression.body, isNotNull);
@@ -1500,7 +1488,7 @@
     assertNoErrors();
     expectCommentText(declaration.documentationComment, '/// Doc');
     expect((declaration.returnType as NamedType).name.name, 'T');
-    expect(declaration.name, isNotNull);
+    expect(declaration.name2, isNotNull);
     FunctionExpression expression = declaration.functionExpression;
     expect(expression, isNotNull);
     expect(expression.body, isNotNull);
@@ -1517,7 +1505,7 @@
     assertNoErrors();
     expect(declaration.documentationComment, isNull);
     expect((declaration.returnType as NamedType).name.name, 'T');
-    expect(declaration.name, isNotNull);
+    expect(declaration.name2, isNotNull);
     FunctionExpression expression = declaration.functionExpression;
     expect(expression, isNotNull);
     expect(expression.body, isNotNull);
@@ -1578,7 +1566,7 @@
     assertNoErrors();
     expectCommentText(declaration.documentationComment, '/// Doc');
     expect((declaration.returnType as NamedType).name.name, 'T');
-    expect(declaration.name, isNotNull);
+    expect(declaration.name2, isNotNull);
     FunctionExpression expression = declaration.functionExpression;
     expect(expression, isNotNull);
     expect(expression.body, isNotNull);
@@ -1592,8 +1580,8 @@
     var alias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(alias, isNotNull);
     assertNoErrors();
-    expect(alias.name, isNotNull);
-    expect(alias.name.name, 'F');
+    expect(alias.name2, isNotNull);
+    expect(alias.name2.lexeme, 'F');
     expect(alias.typeParameters, isNull);
     expect(alias.equals, isNotNull);
     expect(alias.functionType, isNotNull);
@@ -1605,8 +1593,8 @@
     var alias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(alias, isNotNull);
     assertNoErrors();
-    expect(alias.name, isNotNull);
-    expect(alias.name.name, 'F');
+    expect(alias.name2, isNotNull);
+    expect(alias.name2.lexeme, 'F');
     expect(alias.typeParameters!.typeParameters, hasLength(1));
     expect(alias.equals, isNotNull);
     expect(alias.functionType, isNotNull);
@@ -1620,8 +1608,8 @@
     var alias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(alias, isNotNull);
     assertNoErrors();
-    expect(alias.name, isNotNull);
-    expect(alias.name.name, 'F');
+    expect(alias.name2, isNotNull);
+    expect(alias.name2.lexeme, 'F');
     expect(alias.typeParameters!.typeParameters, hasLength(1));
     expect(alias.equals, isNotNull);
     expect(alias.functionType, isNotNull);
@@ -1633,8 +1621,8 @@
     var alias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(alias, isNotNull);
     assertNoErrors();
-    expect(alias.name, isNotNull);
-    expect(alias.name.name, 'F');
+    expect(alias.name2, isNotNull);
+    expect(alias.name2.lexeme, 'F');
     expect(alias.typeParameters!.typeParameters, hasLength(3));
     expect(alias.equals, isNotNull);
     expect(alias.functionType, isNotNull);
@@ -1648,8 +1636,8 @@
     var alias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(alias, isNotNull);
     assertNoErrors();
-    expect(alias.name, isNotNull);
-    expect(alias.name.name, 'F');
+    expect(alias.name2, isNotNull);
+    expect(alias.name2.lexeme, 'F');
     expect(alias.typeParameters!.typeParameters, hasLength(3));
     expect(alias.equals, isNotNull);
     expect(alias.functionType, isNotNull);
@@ -1661,8 +1649,8 @@
     var alias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(alias, isNotNull);
     assertNoErrors();
-    expect(alias.name, isNotNull);
-    expect(alias.name.name, 'F');
+    expect(alias.name2, isNotNull);
+    expect(alias.name2.lexeme, 'F');
     expect(alias.typeParameters!.typeParameters, hasLength(3));
     TypeParameter typeParam = alias.typeParameters!.typeParameters[2];
     var type = typeParam.bound as NamedType;
@@ -1678,8 +1666,8 @@
     var alias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(alias, isNotNull);
     assertNoErrors();
-    expect(alias.name, isNotNull);
-    expect(alias.name.name, 'F');
+    expect(alias.name2, isNotNull);
+    expect(alias.name2.lexeme, 'F');
     expect(alias.typeParameters!.typeParameters, hasLength(3));
     TypeParameter typeParam = alias.typeParameters!.typeParameters[2];
     var type = typeParam.bound as NamedType;
@@ -1696,8 +1684,8 @@
     var alias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(alias, isNotNull);
     assertNoErrors();
-    expect(alias.name, isNotNull);
-    expect(alias.name.name, 'F');
+    expect(alias.name2, isNotNull);
+    expect(alias.name2.lexeme, 'F');
     expect(alias.typeParameters!.typeParameters, hasLength(3));
     TypeParameter typeParam = alias.typeParameters!.typeParameters[2];
     var type = typeParam.bound as NamedType;
@@ -1714,8 +1702,8 @@
     var alias = parseFullCompilationUnitMember() as GenericTypeAlias;
     expect(alias, isNotNull);
     assertNoErrors();
-    expect(alias.name, isNotNull);
-    expect(alias.name.name, 'F');
+    expect(alias.name2, isNotNull);
+    expect(alias.name2.lexeme, 'F');
     expect(alias.typeParameters!.typeParameters, hasLength(3));
     TypeParameter typeParam = alias.typeParameters!.typeParameters[2];
     var type = typeParam.bound as NamedType;
@@ -1733,11 +1721,11 @@
     assertErrors(errors: [
       expectedError(ParserErrorCode.MISSING_IDENTIFIER, 11, 1),
     ]);
-    expect(alias.name, isNotNull);
-    expect(alias.name.name, 'F');
+    expect(alias.name2, isNotNull);
+    expect(alias.name2.lexeme, 'F');
     expect(alias.typeParameters, isNotNull);
     expect(alias.typeParameters!.typeParameters.length, 1);
-    expect(alias.typeParameters!.typeParameters.single.name.name, '');
+    expect(alias.typeParameters!.typeParameters.single.name2.lexeme, '');
     expect(alias.equals, isNotNull);
     expect(alias.functionType, isNotNull);
     expect(alias.semicolon, isNotNull);
@@ -1751,12 +1739,11 @@
     assertErrors(errors: [
       expectedError(ParserErrorCode.MISSING_IDENTIFIER, 10, 2),
     ]);
-    expect(alias.name, isNotNull);
-    expect(alias.name.name, 'F');
-    expect(alias.name.name, 'F');
+    expect(alias.name2, isNotNull);
+    expect(alias.name2.lexeme, 'F');
     expect(alias.typeParameters, isNotNull);
     expect(alias.typeParameters!.typeParameters.length, 1);
-    expect(alias.typeParameters!.typeParameters.single.name.name, '');
+    expect(alias.typeParameters!.typeParameters.single.name2.lexeme, '');
     expect(alias.equals, isNotNull);
     expect(alias.functionType, isNotNull);
     expect(alias.semicolon, isNotNull);
@@ -1770,12 +1757,11 @@
     assertErrors(errors: [
       expectedError(ParserErrorCode.MISSING_IDENTIFIER, 10, 1),
     ]);
-    expect(alias.name, isNotNull);
-    expect(alias.name.name, 'F');
-    expect(alias.name.name, 'F');
+    expect(alias.name2, isNotNull);
+    expect(alias.name2.lexeme, 'F');
     expect(alias.typeParameters, isNotNull);
     expect(alias.typeParameters!.typeParameters.length, 1);
-    expect(alias.typeParameters!.typeParameters.single.name.name, '');
+    expect(alias.typeParameters!.typeParameters.single.name2.lexeme, '');
     expect(alias.equals, isNotNull);
     expect(alias.functionType, isNotNull);
     expect(alias.semicolon, isNotNull);
@@ -1933,7 +1919,7 @@
     expect(declaration.implementsClause, isNull);
     expect(declaration.mixinKeyword, isNotNull);
     expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name.name, 'A');
+    expect(declaration.name2.lexeme, 'A');
     expect(declaration.members, hasLength(0));
     expect(declaration.rightBracket, isNotNull);
     expect(declaration.typeParameters, isNull);
@@ -1955,7 +1941,7 @@
     expect(interfaces[0].typeArguments, isNull);
     expect(declaration.mixinKeyword, isNotNull);
     expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name.name, 'A');
+    expect(declaration.name2.lexeme, 'A');
     expect(declaration.members, hasLength(0));
     expect(declaration.rightBracket, isNotNull);
     expect(declaration.typeParameters, isNull);
@@ -1979,7 +1965,7 @@
     expect(interfaces[1].typeArguments, isNull);
     expect(declaration.mixinKeyword, isNotNull);
     expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name.name, 'A');
+    expect(declaration.name2.lexeme, 'A');
     expect(declaration.members, hasLength(0));
     expect(declaration.rightBracket, isNotNull);
     expect(declaration.typeParameters, isNull);
@@ -1998,7 +1984,7 @@
     expect(declaration.implementsClause, isNull);
     expect(declaration.mixinKeyword, isNotNull);
     expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name.name, 'A');
+    expect(declaration.name2.lexeme, 'A');
     expect(declaration.members, hasLength(0));
     expect(declaration.rightBracket, isNotNull);
     expect(declaration.typeParameters, isNull);
@@ -2020,7 +2006,7 @@
     expect(declaration.implementsClause, isNull);
     expect(declaration.mixinKeyword, isNotNull);
     expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name.name, 'A');
+    expect(declaration.name2.lexeme, 'A');
     expect(declaration.members, hasLength(0));
     expect(declaration.rightBracket, isNotNull);
     expect(declaration.typeParameters, isNull);
@@ -2044,7 +2030,7 @@
     expect(declaration.implementsClause, isNull);
     expect(declaration.mixinKeyword, isNotNull);
     expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name.name, 'A');
+    expect(declaration.name2.lexeme, 'A');
     expect(declaration.members, hasLength(0));
     expect(declaration.rightBracket, isNotNull);
     expect(declaration.typeParameters, isNull);
@@ -2071,7 +2057,7 @@
     expect(interfaces[0].typeArguments, isNull);
     expect(declaration.mixinKeyword, isNotNull);
     expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name.name, 'A');
+    expect(declaration.name2.lexeme, 'A');
     expect(declaration.members, hasLength(0));
     expect(declaration.rightBracket, isNotNull);
     expect(declaration.typeParameters, isNull);
@@ -2094,7 +2080,7 @@
     expect(declaration.implementsClause, isNull);
     expect(declaration.mixinKeyword, isNotNull);
     expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name.name, 'A');
+    expect(declaration.name2.lexeme, 'A');
     expect(declaration.members, hasLength(4));
     expect(declaration.rightBracket, isNotNull);
     expect(declaration.typeParameters, isNull);
@@ -2223,7 +2209,7 @@
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.name2, isNotNull);
     expect(typeAlias.parameters, isNotNull);
     expect(typeAlias.returnType, isNotNull);
     expect(typeAlias.semicolon, isNotNull);
@@ -2236,7 +2222,7 @@
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.name2, isNotNull);
     expect(typeAlias.parameters, isNotNull);
     expect(typeAlias.returnType, isNull);
     expect(typeAlias.semicolon, isNotNull);
@@ -2249,7 +2235,7 @@
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.name2, isNotNull);
     expect(typeAlias.parameters, isNotNull);
     expect(typeAlias.returnType, isNotNull);
     expect(typeAlias.semicolon, isNotNull);
@@ -2262,7 +2248,7 @@
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.name2, isNotNull);
     expect(typeAlias.parameters, isNotNull);
     expect(typeAlias.returnType, isNotNull);
     expect(typeAlias.semicolon, isNotNull);
@@ -2275,7 +2261,7 @@
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.name2, isNotNull);
     expect(typeAlias.parameters, isNotNull);
     expect(typeAlias.returnType, isNotNull);
     expect(typeAlias.semicolon, isNotNull);
@@ -2288,7 +2274,7 @@
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.name2, isNotNull);
     expect(typeAlias.parameters, isNotNull);
     expect(typeAlias.returnType, isNotNull);
     expect(typeAlias.semicolon, isNotNull);
@@ -2301,7 +2287,7 @@
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.name2, isNotNull);
     expect(typeAlias.typeParameters, isNull);
     expect(typeAlias.semicolon, isNotNull);
     var functionType = typeAlias.functionType as GenericFunctionType;
@@ -2317,7 +2303,7 @@
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.name2, isNotNull);
     expect(typeAlias.typeParameters, isNull);
     expect(typeAlias.semicolon, isNotNull);
     var functionType = typeAlias.functionType as GenericFunctionType;
@@ -2333,7 +2319,7 @@
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.name2, isNotNull);
     expect(typeAlias.typeParameters, isNull);
     expect(typeAlias.semicolon, isNotNull);
     var functionType = typeAlias.functionType as GenericFunctionType;
@@ -2349,7 +2335,7 @@
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.name2, isNotNull);
     expect(typeAlias.typeParameters, isNull);
     expect(typeAlias.semicolon, isNotNull);
     var functionType = typeAlias.functionType as GenericFunctionType;
@@ -2365,7 +2351,7 @@
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.name2, isNotNull);
     expect(typeAlias.typeParameters, isNull);
     expect(typeAlias.semicolon, isNotNull);
     var functionType = typeAlias.functionType as GenericFunctionType;
@@ -2381,7 +2367,7 @@
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.name2, isNotNull);
     expect(typeAlias.typeParameters, isNotNull);
     expect(typeAlias.semicolon, isNotNull);
     var functionType = typeAlias.functionType as GenericFunctionType;
@@ -2397,7 +2383,7 @@
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.name2, isNotNull);
     expect(typeAlias.typeParameters, isNotNull);
     expect(typeAlias.semicolon, isNotNull);
     var functionType = typeAlias.functionType as GenericFunctionType;
@@ -2414,7 +2400,7 @@
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.name2, isNotNull);
     expect(typeAlias.typeParameters, isNotNull);
     expect(typeAlias.semicolon, isNotNull);
     var functionType = typeAlias.functionType as GenericFunctionType;
@@ -2430,7 +2416,7 @@
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.name2, isNotNull);
     expect(typeAlias.typeParameters, isNotNull);
     expect(typeAlias.semicolon, isNotNull);
     var functionType = typeAlias.functionType as GenericFunctionType;
@@ -2446,7 +2432,7 @@
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.name2, isNotNull);
     expect(typeAlias.typeParameters, isNotNull);
     expect(typeAlias.semicolon, isNotNull);
     var functionType = typeAlias.functionType as GenericFunctionType;
@@ -2462,7 +2448,7 @@
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.name2, isNotNull);
     expect(typeAlias.typeParameters, isNotNull);
     expect(typeAlias.semicolon, isNotNull);
     var functionType = typeAlias.functionType as GenericFunctionType;
@@ -2478,7 +2464,7 @@
     expect(typeAlias, isNotNull);
     assertNoErrors();
     expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.name2, isNotNull);
     expect(typeAlias.typeParameters, isNull);
     expect(typeAlias.semicolon, isNotNull);
     var functionType = typeAlias.functionType as GenericFunctionType;
@@ -2504,9 +2490,4 @@
     var typeVariable = classDeclaration.typeParameters!.typeParameters[0];
     expectCommentText(typeVariable.documentationComment, '/// Doc');
   }
-
-  /// Assert that the given [name] is in declaration context.
-  void _assertIsDeclarationName(SimpleIdentifier name) {
-    expect(name.inDeclarationContext(), isTrue);
-  }
 }
diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart
index 183e638..13d6e07 100644
--- a/pkg/analyzer/test/generated/utilities_test.dart
+++ b/pkg/analyzer/test/generated/utilities_test.dart
@@ -450,7 +450,6 @@
         (node) => node.documentationComment!,
         (node) => node.extendsClause!,
         (node) => node.implementsClause!,
-        (node) => node.name,
         (node) => node.typeParameters!,
         (node) => node.withClause!,
       ],
@@ -477,7 +476,6 @@
         (node) => node.documentationComment!,
         (node) => node.superclass,
         (node) => node.implementsClause!,
-        (node) => node.name,
         (node) => node.typeParameters!,
         (node) => node.withClause,
       ],
@@ -566,7 +564,6 @@
       source: findNode.constructor('B.named'),
       childAccessors: [
         (node) => node.body,
-        (node) => node.name!,
         (node) => node.parameters,
         (node) => node.returnType,
       ],
@@ -657,7 +654,6 @@
       destination: findNode.declaredIdentifier('i in'),
       source: findNode.declaredIdentifier('j in'),
       childAccessors: [
-        (node) => node.identifier,
         (node) => node.type!,
       ],
     );
@@ -703,13 +699,6 @@
     _assertAnnotatedNode(
       findNode.enumConstantDeclaration('aaa'),
     );
-    _assertReplacementForChildren<EnumConstantDeclaration>(
-      destination: findNode.enumConstantDeclaration('aaa'),
-      source: findNode.enumConstantDeclaration('bbb'),
-      childAccessors: [
-        (node) => node.name,
-      ],
-    );
   }
 
   void test_enumDeclaration() {
@@ -721,7 +710,6 @@
       destination: findNode.enumDeclaration('enum E1'),
       source: findNode.enumDeclaration('enum E2'),
       childAccessors: [
-        (node) => node.name,
         (node) => node.typeParameters!,
         (node) => node.withClause!,
         (node) => node.implementsClause!,
@@ -859,7 +847,6 @@
       destination: findNode.fieldFormalParameter('foo'),
       source: findNode.fieldFormalParameter('bar'),
       childAccessors: [
-        (node) => node.identifier,
         (node) => node.parameters!,
         (node) => node.type!,
         (node) => node.typeParameters!,
@@ -990,7 +977,6 @@
       source: findNode.functionDeclaration('g()'),
       childAccessors: [
         (node) => node.functionExpression,
-        (node) => node.name,
         (node) => node.returnType!,
       ],
     );
@@ -1064,7 +1050,6 @@
       destination: findNode.functionTypeAlias('int F'),
       source: findNode.functionTypeAlias('double G'),
       childAccessors: [
-        (node) => node.name,
         (node) => node.parameters,
         (node) => node.returnType!,
         (node) => node.typeParameters!,
@@ -1088,7 +1073,6 @@
       source: findNode.functionTypedFormalParameter('b<U>'),
       childAccessors: [
         (node) => node.returnType!,
-        (node) => node.identifier,
         (node) => node.typeParameters!,
         (node) => node.parameters,
       ],
@@ -1355,7 +1339,6 @@
       source: findNode.methodDeclaration('bar'),
       childAccessors: [
         (node) => node.returnType!,
-        (node) => node.name,
         (node) => node.typeParameters!,
         (node) => node.parameters!,
         (node) => node.body,
@@ -1626,7 +1609,6 @@
       source: findNode.simpleFormalParameter('int b'),
       childAccessors: [
         (node) => node.type!,
-        (node) => node.identifier!,
       ],
     );
   }
@@ -1678,7 +1660,6 @@
       source: findNode.superFormalParameter('a2'),
       childAccessors: [
         (node) => node.type!,
-        (node) => node.identifier,
       ],
     );
   }
@@ -1699,7 +1680,6 @@
       source: findNode.superFormalParameter('bar2'),
       childAccessors: [
         (node) => node.type!,
-        (node) => node.identifier,
         (node) => node.typeParameters!,
         (node) => node.parameters!,
       ],
@@ -1868,7 +1848,6 @@
       destination: findNode.typeParameter('T extends'),
       source: findNode.typeParameter('U extends'),
       childAccessors: [
-        (node) => node.name,
         (node) => node.bound!,
       ],
     );
@@ -1897,7 +1876,6 @@
       destination: findNode.variableDeclaration('a = 0'),
       source: findNode.variableDeclaration('b = 1'),
       childAccessors: [
-        (node) => node.name,
         (node) => node.initializer!,
       ],
     );
diff --git a/pkg/analyzer/test/generated/variance_parser_test.dart b/pkg/analyzer/test/generated/variance_parser_test.dart
index 37c8af3..358a867 100644
--- a/pkg/analyzer/test/generated/variance_parser_test.dart
+++ b/pkg/analyzer/test/generated/variance_parser_test.dart
@@ -64,14 +64,14 @@
     var unit = parseCompilationUnit('class A<in T, inout U, out V, W> { }');
     expect(unit.declarations, hasLength(1));
     var classDecl = unit.declarations[0] as ClassDeclaration;
-    expect(classDecl.name.name, 'A');
+    expect(classDecl.name2.lexeme, 'A');
 
     var typeParameters = classDecl.typeParameters!;
     expect(typeParameters.typeParameters, hasLength(4));
-    expect(typeParameters.typeParameters[0].name.name, 'T');
-    expect(typeParameters.typeParameters[1].name.name, 'U');
-    expect(typeParameters.typeParameters[2].name.name, 'V');
-    expect(typeParameters.typeParameters[3].name.name, 'W');
+    expect(typeParameters.typeParameters[0].name2.lexeme, 'T');
+    expect(typeParameters.typeParameters[1].name2.lexeme, 'U');
+    expect(typeParameters.typeParameters[2].name2.lexeme, 'V');
+    expect(typeParameters.typeParameters[3].name2.lexeme, 'W');
 
     var typeParameterImplList = typeParameters.typeParameters;
     expect((typeParameterImplList[0] as TypeParameterImpl).varianceKeyword,
@@ -100,22 +100,22 @@
     ]);
     expect(unit.declarations, hasLength(1));
     var classDecl = unit.declarations[0] as ClassDeclaration;
-    expect(classDecl.name.name, 'A');
+    expect(classDecl.name2.lexeme, 'A');
 
     var typeParameters = classDecl.typeParameters!;
     expect(typeParameters.typeParameters, hasLength(1));
-    expect(typeParameters.typeParameters[0].name.name, 'T');
+    expect(typeParameters.typeParameters[0].name2.lexeme, 'T');
   }
 
   void test_class_enabled_single() {
     var unit = parseCompilationUnit('class A<in T> { }');
     expect(unit.declarations, hasLength(1));
     var classDecl = unit.declarations[0] as ClassDeclaration;
-    expect(classDecl.name.name, 'A');
+    expect(classDecl.name2.lexeme, 'A');
 
     var typeParameters = classDecl.typeParameters!;
     expect(typeParameters.typeParameters, hasLength(1));
-    expect(typeParameters.typeParameters[0].name.name, 'T');
+    expect(typeParameters.typeParameters[0].name2.lexeme, 'T');
 
     var typeParameterImpl =
         typeParameters.typeParameters[0] as TypeParameterImpl;
@@ -175,11 +175,11 @@
     var unit = parseCompilationUnit('mixin A<inout T> { }');
     expect(unit.declarations, hasLength(1));
     var mixinDecl = unit.declarations[0] as MixinDeclaration;
-    expect(mixinDecl.name.name, 'A');
+    expect(mixinDecl.name2.lexeme, 'A');
 
     var typeParameters = mixinDecl.typeParameters!;
     expect(typeParameters.typeParameters, hasLength(1));
-    expect(typeParameters.typeParameters[0].name.name, 'T');
+    expect(typeParameters.typeParameters[0].name2.lexeme, 'T');
   }
 
   void test_typedef_disabled() {
diff --git a/pkg/analyzer/test/id_tests/inheritance_test.dart b/pkg/analyzer/test/id_tests/inheritance_test.dart
index 8dc008f..e178ad1 100644
--- a/pkg/analyzer/test/id_tests/inheritance_test.dart
+++ b/pkg/analyzer/test/id_tests/inheritance_test.dart
@@ -102,7 +102,7 @@
       for (var name in interface.map.keys) {
         var executable = interface.map[name]!;
 
-        var enclosingClass = executable.enclosingElement2 as ClassElement;
+        var enclosingClass = executable.enclosingElement3 as ClassElement;
         if (enclosingClass.isDartCoreObject) continue;
 
         var id = MemberId.internal(
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index 4a00cd4..dca066b 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -733,8 +733,7 @@
     VariableElement vElement;
     {
       var statement = statements[0] as VariableDeclarationStatement;
-      vElement = statement.variables.variables[0].name.staticElement
-          as VariableElement;
+      vElement = statement.variables.variables[0].declaredElement!;
       expect(vElement.type, typeProvider.numType);
     }
 
@@ -978,7 +977,7 @@
           forInvocation.argumentList.arguments[0] as FunctionExpression;
 
       var closureElement = closure.declaredElement as FunctionElementImpl;
-      expect(closureElement.enclosingElement2, same(mainElement));
+      expect(closureElement.enclosingElement3, same(mainElement));
 
       ParameterElement itemElement = closureElement.parameters[0];
       itemElement1 = itemElement;
@@ -1019,7 +1018,7 @@
           forInvocation.argumentList.arguments[0] as FunctionExpression;
 
       var closureElement = closure.declaredElement as FunctionElementImpl;
-      expect(closureElement.enclosingElement2, same(mainElement));
+      expect(closureElement.enclosingElement3, same(mainElement));
 
       ParameterElement itemElement = closureElement.parameters[0];
       expect(itemElement, isNot(same(itemElement1)));
@@ -1062,7 +1061,7 @@
     assertType(closure, 'List<T> Function<T>()');
 
     var closureElement = closure.declaredElement as FunctionElementImpl;
-    expect(closureElement.enclosingElement2, findElement.function('main'));
+    expect(closureElement.enclosingElement3, findElement.function('main'));
     assertType(closureElement.returnType, 'List<T>');
     expect(closureElement.parameters, isEmpty);
 
@@ -1708,7 +1707,7 @@
 
     var methodElement = invocation.methodName.staticElement as MethodElement;
     expect(methodElement.name, 'toString');
-    expect(methodElement.enclosingElement2, same(objectElement));
+    expect(methodElement.enclosingElement3, same(objectElement));
   }
 
   test_error_unresolvedTypeAnnotation() async {
@@ -1729,7 +1728,10 @@
     expect(namedType.typeArguments!.arguments[0].type, typeProvider.intType);
 
     VariableDeclaration vNode = statement.variables.variables[0];
+
+    // ignore: deprecated_member_use_from_same_package
     expect(vNode.name.staticType, isNull);
+    // ignore: deprecated_member_use_from_same_package
     expect(vNode.declaredElement!.type, isDynamicType);
   }
 
@@ -1791,8 +1793,7 @@
     expect(p.declaredElement, same(constructor.declaredElement!.parameters[0]));
 
     {
-      var type =
-          (p.identifier.staticElement as ParameterElement).type as FunctionType;
+      var type = (p.declaredElement as ParameterElement).type as FunctionType;
       expect(type.returnType, typeProvider.stringType);
 
       expect(type.parameters, hasLength(1));
@@ -1804,7 +1805,6 @@
     {
       var a = p.parameters.parameters[0] as SimpleFormalParameter;
       _assertNamedTypeSimple(a.type!, typeProvider.intType);
-      expect(a.identifier!.staticType, isNull);
     }
   }
 
@@ -1834,15 +1834,11 @@
     var p = parameters[0] as FieldFormalParameter;
     expect(p.declaredElement, same(pElement));
 
-    expect(p.identifier.staticElement, same(pElement));
-    assertTypeNull(p.identifier);
-
     _assertNamedTypeSimple(p.type!, typeProvider.stringType);
 
     {
       var a = p.parameters!.parameters[0] as SimpleFormalParameter;
       _assertNamedTypeSimple(a.type!, typeProvider.intType);
-      expect(a.identifier!.staticType, isNull);
     }
   }
 
@@ -1871,9 +1867,6 @@
     var parameterNode = parameters[0] as FieldFormalParameter;
     expect(parameterNode.type, isNull);
     expect(parameterNode.declaredElement, same(parameterElement));
-
-    expect(parameterNode.identifier.staticElement, same(parameterElement));
-    assertTypeNull(parameterNode.identifier);
   }
 
   test_formalParameter_simple_fieldFormal_typed() async {
@@ -1901,9 +1894,6 @@
     var parameterNode = parameters[0] as FieldFormalParameter;
     _assertNamedTypeSimple(parameterNode.type!, typeProvider.intType);
     expect(parameterNode.declaredElement, same(parameterElement));
-
-    expect(parameterNode.identifier.staticElement, same(parameterElement));
-    assertTypeNull(parameterNode.identifier);
   }
 
   test_forwardingStub_class() async {
@@ -3971,7 +3961,9 @@
     expect(fElement, isNotNull);
     assertType(fElement.type, fTypeString);
 
+    // ignore: deprecated_member_use_from_same_package
     expect(fNode.name.staticElement, same(fElement));
+    // ignore: deprecated_member_use_from_same_package
     expect(fNode.name.staticType, isNull);
 
     var fReturnTypeNode = fNode.returnType as NamedType;
@@ -4054,19 +4046,25 @@
 
       TypeParameter tNode = fTypeParameters[0];
       expect(tNode.declaredElement, same(tElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(tNode.name.staticElement, same(tElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(tNode.name.staticType, typeProvider.typeType);
 
       TypeParameter uNode = fTypeParameters[1];
       expect(uNode.declaredElement, same(uElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(uNode.name.staticElement, same(uElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(uNode.name.staticType, typeProvider.typeType);
     }
 
     expect(fElement, isNotNull);
     assertType(fElement.type, 'T Function<T,U>(T, U)');
 
+    // ignore: deprecated_member_use_from_same_package
     expect(fNode.name.staticElement, same(fElement));
+    // ignore: deprecated_member_use_from_same_package
     expect(fNode.name.staticType, fElement.type);
 
     var fReturnTypeNode = fNode.returnType as NamedType;
@@ -4198,7 +4196,9 @@
     expect(fElement, isNotNull);
     assertType(fElement.type, fTypeString);
 
+    // ignore: deprecated_member_use_from_same_package
     expect(fNode.name.staticElement, same(fElement));
+    // ignore: deprecated_member_use_from_same_package
     expect(fNode.name.staticType, isNull);
 
     var fReturnTypeNode = fNode.returnType as NamedType;
@@ -4263,7 +4263,9 @@
     expect(fElement, isNotNull);
     assertType(fElement.type, 'Null Function()');
 
+    // ignore: deprecated_member_use_from_same_package
     expect(fNode.name.staticElement, same(fElement));
+    // ignore: deprecated_member_use_from_same_package
     expect(fNode.name.staticType, isNull);
 
     expect(fExpression.declaredElement, same(fElement));
@@ -4290,7 +4292,9 @@
     expect(fElement, isNotNull);
     assertType(fElement.type, fTypeString);
 
+    // ignore: deprecated_member_use_from_same_package
     expect(fNode.name.staticElement, same(fElement));
+    // ignore: deprecated_member_use_from_same_package
     expect(fNode.name.staticType, isNull);
 
     var fReturnTypeNode = fNode.returnType as NamedType;
@@ -4772,7 +4776,10 @@
 
     var main = result.unit.declarations[0] as FunctionDeclaration;
     expect(main.declaredElement, isNotNull);
+
+    // ignore: deprecated_member_use_from_same_package
     expect(main.name.staticElement, isNotNull);
+    // ignore: deprecated_member_use_from_same_package
     expect(main.name.staticType, isNull);
 
     var body = main.functionExpression.body as BlockFunctionBody;
@@ -4783,10 +4790,11 @@
     {
       var statement = statements[0] as VariableDeclarationStatement;
       VariableDeclaration vNode = statement.variables.variables[0];
+      // ignore: deprecated_member_use_from_same_package
       expect(vNode.name.staticType, isNull);
       expect(vNode.initializer!.staticType, intType);
 
-      vElement = vNode.name.staticElement as VariableElement;
+      vElement = vNode.declaredElement!;
       expect(vElement, isNotNull);
       expect(vElement.type, isNotNull);
       expect(vElement.type, intType);
@@ -4929,7 +4937,9 @@
     LocalVariableElement vElement = vNode.declaredElement!;
     expect(vElement.type, typeProvider.intType);
 
+    // ignore: deprecated_member_use_from_same_package
     expect(vNode.identifier.staticElement, vElement);
+    // ignore: deprecated_member_use_from_same_package
     expect(vNode.identifier.staticType, isNull);
 
     var statement = forBlock.statements[0] as ExpressionStatement;
@@ -4966,7 +4976,9 @@
     expect(vTypeIdentifier.staticElement, typeProvider.numType.element);
     expect(vTypeIdentifier.staticType, isNull);
 
+    // ignore: deprecated_member_use_from_same_package
     expect(vNode.identifier.staticElement, vElement);
+    // ignore: deprecated_member_use_from_same_package
     expect(vNode.identifier.staticType, isNull);
 
     var statement = forBlock.statements[0] as ExpressionStatement;
@@ -5133,7 +5145,9 @@
     expect(methodElement, isNotNull);
     assertType(methodElement.type, fTypeString);
 
+    // ignore: deprecated_member_use_from_same_package
     expect(methodDeclaration.name.staticElement, same(methodElement));
+    // ignore: deprecated_member_use_from_same_package
     expect(methodDeclaration.name.staticType, isNull);
 
     var fReturnTypeNode = methodDeclaration.returnType as NamedType;
@@ -6546,7 +6560,10 @@
 
     var main = result.unit.declarations[0] as FunctionDeclaration;
     expect(main.declaredElement, isNotNull);
+
+    // ignore: deprecated_member_use_from_same_package
     expect(main.name.staticElement, isNotNull);
+    // ignore: deprecated_member_use_from_same_package
     expect(main.name.staticType, isNull);
 
     var body = main.functionExpression.body as BlockFunctionBody;
@@ -6556,8 +6573,7 @@
     VariableElement vElement;
     {
       var statement = statements[0] as VariableDeclarationStatement;
-      vElement = statement.variables.variables[0].name.staticElement
-          as VariableElement;
+      vElement = statement.variables.variables[0].declaredElement!;
     }
 
     {
@@ -6902,6 +6918,7 @@
     var dNode = result.unit.declarations[3] as ClassDeclaration;
     Element dElement = dNode.declaredElement!;
 
+    // ignore: deprecated_member_use_from_same_package
     SimpleIdentifier dName = dNode.name;
     expect(dName.staticElement, same(dElement));
     expect(dName.staticType, isNull);
@@ -6971,6 +6988,7 @@
     var dNode = result.unit.declarations[3] as ClassTypeAlias;
     Element dElement = dNode.declaredElement!;
 
+    // ignore: deprecated_member_use_from_same_package
     SimpleIdentifier dName = dNode.name;
     expect(dName.staticElement, same(dElement));
     expect(dName.staticType, isNull);
@@ -7030,6 +7048,7 @@
     var enumNode = result.unit.declarations[0] as EnumDeclaration;
     ClassElement enumElement = enumNode.declaredElement!;
 
+    // ignore: deprecated_member_use_from_same_package
     SimpleIdentifier dName = enumNode.name;
     expect(dName.staticElement, same(enumElement));
     expect(dName.staticType, isNull);
@@ -7038,7 +7057,10 @@
       var aElement = enumElement.getField('A');
       var aNode = enumNode.constants[0];
       expect(aNode.declaredElement, same(aElement));
+
+      // ignore: deprecated_member_use_from_same_package
       expect(aNode.name.staticElement, same(aElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(aNode.name.staticType, isNull);
     }
 
@@ -7046,7 +7068,10 @@
       var bElement = enumElement.getField('B');
       var bNode = enumNode.constants[1];
       expect(bNode.declaredElement, same(bElement));
+
+      // ignore: deprecated_member_use_from_same_package
       expect(bNode.name.staticElement, same(bElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(bNode.name.staticType, isNull);
     }
   }
@@ -7072,7 +7097,9 @@
     ClassElement cElement = cNode.declaredElement!;
 
     // The class name identifier.
+    // ignore: deprecated_member_use_from_same_package
     expect(cNode.name.staticElement, same(cElement));
+    // ignore: deprecated_member_use_from_same_package
     expect(cNode.name.staticType, isNull);
 
     // unnamed constructor
@@ -7082,7 +7109,7 @@
       assertType(node.declaredElement!.type, 'C Function(int)');
       expect(node.returnType.staticElement, same(cElement));
       expect(node.returnType.staticType, isNull);
-      expect(node.name, isNull);
+      expect(node.name2, isNull);
     }
 
     // named constructor
@@ -7092,7 +7119,10 @@
       assertType(node.declaredElement!.type, 'C Function(int)');
       expect(node.returnType.staticElement, same(cElement));
       expect(node.returnType.staticType, isNull);
+
+      // ignore: deprecated_member_use_from_same_package
       expect(node.name!.staticElement, same(node.declaredElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(node.name!.staticType, isNull);
     }
 
@@ -7110,7 +7140,9 @@
       expect(returnTypeName.staticType, isNull);
 
       // method name
+      // ignore: deprecated_member_use_from_same_package
       expect(node.name.staticElement, same(node.declaredElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(node.name.staticType, isNull);
 
       // method parameter
@@ -7122,9 +7154,6 @@
         var pType = pNode.type as NamedType;
         expect(pType.name.staticElement, doubleElement);
         expect(pType.name.staticType, isNull);
-
-        expect(pNode.identifier!.staticElement, pNode.declaredElement);
-        expect(pNode.identifier!.staticType, isNull);
       }
     }
 
@@ -7142,7 +7171,9 @@
       expect(returnTypeName.staticType, isNull);
 
       // getter name
+      // ignore: deprecated_member_use_from_same_package
       expect(node.name.staticElement, same(node.declaredElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(node.name.staticType, isNull);
     }
 
@@ -7160,7 +7191,9 @@
       expect(returnTypeName.staticType, isNull);
 
       // setter name
+      // ignore: deprecated_member_use_from_same_package
       expect(node.name.staticElement, same(node.declaredElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(node.name.staticType, isNull);
 
       // setter parameter
@@ -7172,9 +7205,6 @@
         var pType = pNode.type as NamedType;
         expect(pType.name.staticElement, doubleElement);
         expect(pType.name.staticType, isNull);
-
-        expect(pNode.identifier!.staticElement, pNode.declaredElement);
-        expect(pNode.identifier!.staticType, isNull);
       }
     }
   }
@@ -7205,7 +7235,9 @@
       expect(returnTypeName.staticType, isNull);
 
       // function name
+      // ignore: deprecated_member_use_from_same_package
       expect(node.name.staticElement, same(node.declaredElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(node.name.staticType, isNull);
 
       // function parameter
@@ -7218,9 +7250,6 @@
         var pType = pNode.type as NamedType;
         expect(pType.name.staticElement, doubleElement);
         expect(pType.name.staticType, isNull);
-
-        expect(pNode.identifier!.staticElement, pNode.declaredElement);
-        expect(pNode.identifier!.staticType, isNull);
       }
     }
 
@@ -7238,7 +7267,9 @@
       expect(returnTypeName.staticType, isNull);
 
       // getter name
+      // ignore: deprecated_member_use_from_same_package
       expect(node.name.staticElement, same(node.declaredElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(node.name.staticType, isNull);
     }
 
@@ -7256,7 +7287,9 @@
       expect(returnTypeName.staticType, isNull);
 
       // setter name
+      // ignore: deprecated_member_use_from_same_package
       expect(node.name.staticElement, same(node.declaredElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(node.name.staticType, isNull);
 
       // setter parameter
@@ -7269,9 +7302,6 @@
         var pType = pNode.type as NamedType;
         expect(pType.name.staticElement, doubleElement);
         expect(pType.name.staticType, isNull);
-
-        expect(pNode.identifier!.staticElement, pNode.declaredElement);
-        expect(pNode.identifier!.staticType, isNull);
       }
     }
   }
@@ -7300,7 +7330,9 @@
       VariableDeclaration aNode = aDeclaration.fields.variables[0];
       expect(aNode.declaredElement, same(aElement));
       expect(aElement.type, typeProvider.intType);
+      // ignore: deprecated_member_use_from_same_package
       expect(aNode.name.staticElement, same(aElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(aNode.name.staticType, isNull);
 
       var aValue = aNode.initializer as Expression;
@@ -7319,7 +7351,9 @@
       VariableDeclaration bNode = bDeclaration.fields.variables[0];
       expect(bNode.declaredElement, same(bElement));
       expect(bElement.type, typeParameterTypeNone(tElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(bNode.name.staticElement, same(bElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(bNode.name.staticType, isNull);
     }
   }
@@ -7347,7 +7381,9 @@
       expect(aNode.declaredElement, same(aElement));
       expect(aElement.type, typeProvider.intType);
 
+      // ignore: deprecated_member_use_from_same_package
       expect(aNode.name.staticElement, same(aElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(aNode.name.staticType, isNull);
 
       Expression aValue = aNode.initializer!;
@@ -7361,7 +7397,9 @@
       expect(bNode.declaredElement, same(bElement));
       expect(bElement.type, typeProvider.doubleType);
 
+      // ignore: deprecated_member_use_from_same_package
       expect(bNode.name.staticElement, same(bElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(bNode.name.staticType, isNull);
 
       Expression aValue = bNode.initializer!;
@@ -7386,7 +7424,9 @@
       var aElement = aNode.declaredElement as TopLevelVariableElement;
       expect(aElement, same(unitElement.topLevelVariables[0]));
       expect(aElement.type, typeProvider.intType);
+      // ignore: deprecated_member_use_from_same_package
       expect(aNode.name.staticElement, same(aElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(aNode.name.staticType, isNull);
 
       Expression aValue = aNode.initializer!;
@@ -7404,7 +7444,9 @@
       var namedType = bDeclaration.variables.type as NamedType;
       _assertNamedTypeSimple(namedType, typeProvider.doubleType);
 
+      // ignore: deprecated_member_use_from_same_package
       expect(bNode.name.staticElement, same(bElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(bNode.name.staticType, isNull);
 
       Expression aValue = bNode.initializer!;
@@ -7432,7 +7474,9 @@
       expect(aElement, same(unitElement.topLevelVariables[0]));
       expect(aElement.type, typeProvider.intType);
 
+      // ignore: deprecated_member_use_from_same_package
       expect(aNode.name.staticElement, same(aElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(aNode.name.staticType, isNull);
 
       Expression aValue = aNode.initializer!;
@@ -7445,7 +7489,9 @@
       expect(bElement, same(unitElement.topLevelVariables[1]));
       expect(bElement.type, typeProvider.doubleType);
 
+      // ignore: deprecated_member_use_from_same_package
       expect(bNode.name.staticElement, same(bElement));
+      // ignore: deprecated_member_use_from_same_package
       expect(bNode.name.staticType, isNull);
 
       Expression aValue = bNode.initializer!;
@@ -7471,7 +7517,9 @@
     expect(fElement, isNotNull);
     assertType(fElement.type, fTypeString);
 
+    // ignore: deprecated_member_use_from_same_package
     expect(fDeclaration.name.staticElement, same(fElement));
+    // ignore: deprecated_member_use_from_same_package
     expect(fDeclaration.name.staticType, isNull);
 
     var fReturnTypeNode = fDeclaration.returnType as NamedType;
@@ -8629,7 +8677,6 @@
 
     expect(node, isNotNull);
     expect(node.declaredElement, same(element));
-    expect(node.identifier!.staticElement, same(element));
 
     var namedType = node.type as NamedType?;
     if (namedType != null) {
@@ -8641,7 +8688,7 @@
   List<Statement> _getMainStatements(ResolvedUnitResult result) {
     for (var declaration in result.unit.declarations) {
       if (declaration is FunctionDeclaration &&
-          declaration.name.name == 'main') {
+          declaration.name2.lexeme == 'main') {
         var body = declaration.functionExpression.body as BlockFunctionBody;
         return body.block.statements;
       }
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index c022aa3..06f8192 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -3531,7 +3531,7 @@
   ClassDeclaration _getClass(CompilationUnit unit, String name) {
     for (CompilationUnitMember declaration in unit.declarations) {
       if (declaration is ClassDeclaration) {
-        if (declaration.name.name == name) {
+        if (declaration.name2.lexeme == name) {
           return declaration;
         }
       }
@@ -3545,7 +3545,7 @@
     for (ClassMember declaration in classDeclaration.members) {
       if (declaration is FieldDeclaration) {
         for (var field in declaration.fields.variables) {
-          if (field.name.name == fieldName) {
+          if (field.name2.lexeme == fieldName) {
             return field;
           }
         }
@@ -3559,7 +3559,7 @@
     ClassDeclaration classDeclaration = _getClass(unit, className);
     for (ClassMember declaration in classDeclaration.members) {
       if (declaration is MethodDeclaration &&
-          declaration.name.name == methodName) {
+          declaration.name2.lexeme == methodName) {
         return declaration;
       }
     }
@@ -3581,7 +3581,7 @@
     for (CompilationUnitMember declaration in unit.declarations) {
       if (declaration is TopLevelVariableDeclaration) {
         for (VariableDeclaration variable in declaration.variables.variables) {
-          if (variable.name.name == name) {
+          if (variable.name2.lexeme == name) {
             return variable;
           }
         }
diff --git a/pkg/analyzer/test/src/dart/analysis/results/get_element_declaration_test.dart b/pkg/analyzer/test/src/dart/analysis/results/get_element_declaration_test.dart
index 77c78fb..c4bf3b8 100644
--- a/pkg/analyzer/test/src/dart/analysis/results/get_element_declaration_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/results/get_element_declaration_test.dart
@@ -28,7 +28,7 @@
     var element = findNode.classDeclaration('A').declaredElement!;
     var result = await getElementDeclaration(element);
     var node = result!.node as ClassDeclaration;
-    expect(node.name.name, 'A');
+    expect(node.name2.lexeme, 'A');
   }
 
   test_class_duplicate() async {
@@ -40,9 +40,9 @@
       var element = findNode.classDeclaration('A {} // 1').declaredElement!;
       var result = await getElementDeclaration(element);
       var node = result!.node as ClassDeclaration;
-      expect(node.name.name, 'A');
+      expect(node.name2.lexeme, 'A');
       expect(
-        node.name.offset,
+        node.name2.offset,
         this.result.content.indexOf('A {} // 1'),
       );
     }
@@ -51,9 +51,9 @@
       var element = findNode.classDeclaration('A {} // 2').declaredElement!;
       var result = await getElementDeclaration(element);
       var node = result!.node as ClassDeclaration;
-      expect(node.name.name, 'A');
+      expect(node.name2.lexeme, 'A');
       expect(
-        node.name.offset,
+        node.name2.offset,
         this.result.content.indexOf('A {} // 2'),
       );
     }
@@ -71,7 +71,7 @@
     var element = library.getType('A')!;
     var result = await getElementDeclaration(element);
     var node = result!.node as ClassDeclaration;
-    expect(node.name.name, 'A');
+    expect(node.name2.lexeme, 'A');
   }
 
   test_class_missingName() async {
@@ -81,8 +81,8 @@
     var element = findNode.classDeclaration('class {}').declaredElement!;
     var result = await getElementDeclaration(element);
     var node = result!.node as ClassDeclaration;
-    expect(node.name.name, '');
-    expect(node.name.offset, 6);
+    expect(node.name2.lexeme, '');
+    expect(node.name2.offset, 6);
   }
 
   test_classTypeAlias() async {
@@ -94,7 +94,7 @@
     var element = findElement.class_('B');
     var result = await getElementDeclaration(element);
     var node = result!.node as ClassTypeAlias;
-    expect(node.name.name, 'B');
+    expect(node.name2.lexeme, 'B');
   }
 
   test_compilationUnit() async {
@@ -115,14 +115,14 @@
       var unnamed = findNode.constructor('A();').declaredElement!;
       var result = await getElementDeclaration(unnamed);
       var node = result!.node as ConstructorDeclaration;
-      expect(node.name, isNull);
+      expect(node.name2, isNull);
     }
 
     {
       var named = findNode.constructor('A.named();').declaredElement!;
       var result = await getElementDeclaration(named);
       var node = result!.node as ConstructorDeclaration;
-      expect(node.name!.name, 'named');
+      expect(node.name2!.lexeme, 'named');
     }
   }
 
@@ -137,9 +137,9 @@
       var element = findNode.constructor('A.named(); // 1').declaredElement!;
       var result = await getElementDeclaration(element);
       var node = result!.node as ConstructorDeclaration;
-      expect(node.name!.name, 'named');
+      expect(node.name2!.lexeme, 'named');
       expect(
-        node.name!.offset,
+        node.name2!.offset,
         this.result.content.indexOf('named(); // 1'),
       );
     }
@@ -148,9 +148,9 @@
       var element = findNode.constructor('A.named(); // 2').declaredElement!;
       var result = await getElementDeclaration(element);
       var node = result!.node as ConstructorDeclaration;
-      expect(node.name!.name, 'named');
+      expect(node.name2!.lexeme, 'named');
       expect(
-        node.name!.offset,
+        node.name2!.offset,
         this.result.content.indexOf('named(); // 2'),
       );
     }
@@ -167,7 +167,7 @@
       var element = findNode.constructor('A(); // 1').declaredElement!;
       var result = await getElementDeclaration(element);
       var node = result!.node as ConstructorDeclaration;
-      expect(node.name, isNull);
+      expect(node.name2, isNull);
       expect(
         node.returnType.offset,
         this.result.content.indexOf('A(); // 1'),
@@ -178,7 +178,7 @@
       var element = findNode.constructor('A(); // 2').declaredElement!;
       var result = await getElementDeclaration(element);
       var node = result!.node as ConstructorDeclaration;
-      expect(node.name, isNull);
+      expect(node.name2, isNull);
       expect(
         node.returnType.offset,
         this.result.content.indexOf('A(); // 2'),
@@ -204,7 +204,7 @@
     var element = findElement.enum_('MyEnum');
     var result = await getElementDeclaration(element);
     var node = result!.node as EnumDeclaration;
-    expect(node.name.name, 'MyEnum');
+    expect(node.name2.lexeme, 'MyEnum');
   }
 
   test_enum_constant() async {
@@ -214,7 +214,7 @@
     var element = findElement.field('a');
     var result = await getElementDeclaration(element);
     var node = result!.node as EnumConstantDeclaration;
-    expect(node.name.name, 'a');
+    expect(node.name2.lexeme, 'a');
   }
 
   test_extension() async {
@@ -224,7 +224,7 @@
     var element = findNode.extensionDeclaration('E').declaredElement!;
     var result = await getElementDeclaration(element);
     var node = result!.node as ExtensionDeclaration;
-    expect(node.name!.name, 'E');
+    expect(node.name2!.lexeme, 'E');
   }
 
   test_field() async {
@@ -237,7 +237,7 @@
 
     var result = await getElementDeclaration(element);
     var node = result!.node as VariableDeclaration;
-    expect(node.name.name, 'foo');
+    expect(node.name2.lexeme, 'foo');
   }
 
   test_functionDeclaration_local() async {
@@ -250,7 +250,7 @@
 
     var result = await getElementDeclaration(element);
     var node = result!.node as FunctionDeclaration;
-    expect(node.name.name, 'foo');
+    expect(node.name2.lexeme, 'foo');
   }
 
   test_functionDeclaration_top() async {
@@ -261,7 +261,7 @@
 
     var result = await getElementDeclaration(element);
     var node = result!.node as FunctionDeclaration;
-    expect(node.name.name, 'foo');
+    expect(node.name2.lexeme, 'foo');
   }
 
   test_genericFunctionTypeElement() async {
@@ -282,7 +282,7 @@
     var element = findElement.getter('x');
     var result = await getElementDeclaration(element);
     var node = result!.node as MethodDeclaration;
-    expect(node.name.name, 'x');
+    expect(node.name2.lexeme, 'x');
     expect(node.isGetter, isTrue);
   }
 
@@ -293,7 +293,7 @@
     var element = findElement.topGet('x');
     var result = await getElementDeclaration(element);
     var node = result!.node as FunctionDeclaration;
-    expect(node.name.name, 'x');
+    expect(node.name2.lexeme, 'x');
     expect(node.isGetter, isTrue);
   }
 
@@ -316,7 +316,7 @@
 
     var result = await getElementDeclaration(element);
     var node = result!.node as VariableDeclaration;
-    expect(node.name.name, 'foo');
+    expect(node.name2.lexeme, 'foo');
   }
 
   test_method() async {
@@ -329,7 +329,7 @@
 
     var result = await getElementDeclaration(element);
     var node = result!.node as MethodDeclaration;
-    expect(node.name.name, 'foo');
+    expect(node.name2.lexeme, 'foo');
   }
 
   test_mixin() async {
@@ -339,7 +339,7 @@
     var element = findElement.mixin('M');
     var result = await getElementDeclaration(element);
     var node = result!.node as MixinDeclaration;
-    expect(node.name.name, 'M');
+    expect(node.name2.lexeme, 'M');
   }
 
   test_parameter() async {
@@ -350,7 +350,7 @@
 
     var result = await getElementDeclaration(element);
     var node = result!.node as SimpleFormalParameter;
-    expect(node.identifier!.name, 'a');
+    expect(node.name!.lexeme, 'a');
   }
 
   test_parameter_missingName_named() async {
@@ -364,7 +364,7 @@
 
     var result = await getElementDeclaration(element);
     var node = result!.node as DefaultFormalParameter;
-    expect(node.identifier!.name, '');
+    expect(node.name!.lexeme, '');
   }
 
   test_parameter_missingName_required() async {
@@ -378,7 +378,7 @@
 
     var result = await getElementDeclaration(element);
     var node = result!.node as SimpleFormalParameter;
-    expect(node.identifier!.name, '');
+    expect(node.name!.lexeme, '');
   }
 
   test_setter_class() async {
@@ -390,7 +390,7 @@
     var element = findElement.setter('x');
     var result = await getElementDeclaration(element);
     var node = result!.node as MethodDeclaration;
-    expect(node.name.name, 'x');
+    expect(node.name2.lexeme, 'x');
     expect(node.isSetter, isTrue);
   }
 
@@ -401,7 +401,7 @@
     var element = findElement.topSet('x');
     var result = await getElementDeclaration(element);
     var node = result!.node as FunctionDeclaration;
-    expect(node.name.name, 'x');
+    expect(node.name2.lexeme, 'x');
     expect(node.isSetter, isTrue);
   }
 
@@ -413,7 +413,7 @@
 
     var result = await getElementDeclaration(element);
     var node = result!.node as VariableDeclaration;
-    expect(node.name.name, 'foo');
+    expect(node.name2.lexeme, 'foo');
   }
 
   test_topLevelVariable_synthetic() async {
diff --git a/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart b/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
index d583870..08e34ba 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
@@ -81,7 +81,7 @@
     var element = findElement.class_('A');
     var result = (await helper.getElementDeclaration(element))!;
     var node = result.node as ClassDeclaration;
-    expect(node.name.name, 'A');
+    expect(node.name2.lexeme, 'A');
   }
 
   test_getResolvedUnitByElement() async {
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index 0e071ee..9c13ede 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -329,7 +329,7 @@
     var element = libraryResult.element.getType('A')!;
     var declaration = parsedLibrary.getElementDeclaration(element)!;
     var node = declaration.node as ClassDeclaration;
-    expect(node.name.name, 'A');
+    expect(node.name2.lexeme, 'A');
     expect(node.offset, 0);
     expect(node.length, 10);
   }
@@ -365,10 +365,9 @@
     // We can get the variable element declaration.
     var fooDeclaration = parsedLibrary.getElementDeclaration(fooElement)!;
     var fooNode = fooDeclaration.node as VariableDeclaration;
-    expect(fooNode.name.name, 'foo');
+    expect(fooNode.name2.lexeme, 'foo');
     expect(fooNode.offset, 4);
     expect(fooNode.length, 7);
-    expect(fooNode.name.staticElement, isNull);
 
     // Synthetic elements don't have nodes.
     expect(parsedLibrary.getElementDeclaration(fooElement.getter!), isNull);
@@ -593,14 +592,14 @@
 
     var aDeclaration = resolvedLibrary.getElementDeclaration(aClass)!;
     var aNode = aDeclaration.node as ClassDeclaration;
-    expect(aNode.name.name, 'A');
+    expect(aNode.name2.lexeme, 'A');
     expect(aNode.offset, 16);
     expect(aNode.length, 16);
     expect(aNode.declaredElement!.name, 'A');
 
     var bDeclaration = resolvedLibrary.getElementDeclaration(bClass)!;
     var bNode = bDeclaration.node as ClassDeclaration;
-    expect(bNode.name.name, 'B');
+    expect(bNode.name2.lexeme, 'B');
     expect(bNode.offset, 19);
     expect(bNode.length, 16);
     expect(bNode.declaredElement!.name, 'B');
@@ -633,7 +632,7 @@
     // We can get the variable element declaration.
     var fooDeclaration = resolvedLibrary.getElementDeclaration(fooElement)!;
     var fooNode = fooDeclaration.node as VariableDeclaration;
-    expect(fooNode.name.name, 'foo');
+    expect(fooNode.name2.lexeme, 'foo');
     expect(fooNode.offset, 4);
     expect(fooNode.length, 7);
     expect(fooNode.declaredElement!.name, 'foo');
diff --git a/pkg/analyzer/test/src/dart/ast/element_locator_test.dart b/pkg/analyzer/test/src/dart/ast/element_locator_test.dart
index ab8a0dd..214b03a 100644
--- a/pkg/analyzer/test/src/dart/ast/element_locator_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/element_locator_test.dart
@@ -52,13 +52,24 @@
     expect(element, same(unitElement));
   }
 
-  test_locate_ConstructorDeclaration() async {
+  test_locate_ConstructorDeclaration_named() async {
     await resolveTestCode(r'''
 class A {
   A.foo();
 }
 ''');
-    var node = findNode.constructor('foo();');
+    var node = findNode.constructor('A.foo()');
+    var element = ElementLocator.locate(node);
+    expect(element, isConstructorElement);
+  }
+
+  test_locate_ConstructorDeclaration_unnamed() async {
+    await resolveTestCode(r'''
+class A {
+  A();
+}
+''');
+    var node = findNode.constructor('A()');
     var element = ElementLocator.locate(node);
     expect(element, isConstructorElement);
   }
@@ -137,7 +148,7 @@
   A();
 }
 ''');
-    var node = findNode.constructor('A();');
+    var node = findNode.simple('A()');
     var element = ElementLocator.locate(node);
     expect(element, isConstructorElement);
   }
diff --git a/pkg/analyzer/test/src/dart/ast/utilities_test.dart b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
index 81e36e0..7468a58 100644
--- a/pkg/analyzer/test/src/dart/ast/utilities_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
@@ -26,6 +26,7 @@
     var declaration = unit.declarations[0] as TopLevelVariableDeclaration;
     VariableDeclarationList variableList = declaration.variables;
     Identifier typeName = (variableList.type as NamedType).name;
+    // ignore: deprecated_member_use_from_same_package
     SimpleIdentifier varName = variableList.variables[0].name;
     expect(NodeLocator2(0).searchWithin(unit), same(unit));
     expect(NodeLocator2(1).searchWithin(unit), same(typeName));
@@ -47,6 +48,7 @@
     var declaration = unit.declarations[0] as TopLevelVariableDeclaration;
     VariableDeclarationList variableList = declaration.variables;
     Identifier typeName = (variableList.type as NamedType).name;
+    // ignore: deprecated_member_use_from_same_package
     SimpleIdentifier varName = variableList.variables[0].name;
     expect(NodeLocator2(-1, 2).searchWithin(unit), isNull);
     expect(NodeLocator2(0, 2).searchWithin(unit), same(unit));
diff --git a/pkg/analyzer/test/src/dart/constant/utilities_test.dart b/pkg/analyzer/test/src/dart/constant/utilities_test.dart
index 913f242..8a22db8 100644
--- a/pkg/analyzer/test/src/dart/constant/utilities_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/utilities_test.dart
@@ -203,7 +203,7 @@
         keyword == Keyword.FINAL,
         keyword == Keyword.CONST,
         _typeProvider.intType);
-    variableDeclaration.name.staticElement = fieldElement;
+    variableDeclaration.declaredElement = fieldElement;
     FieldDeclaration fieldDeclaration = AstTestFactory.fieldDeclaration2(
         isStatic, keyword, <VariableDeclaration>[variableDeclaration]);
     var classDeclaration = AstTestFactory.classDeclaration(
@@ -212,7 +212,7 @@
     _node = classDeclaration;
     ClassElementImpl classElement = ElementFactory.classElement2(className);
     classElement.fields = <FieldElement>[fieldElement];
-    classDeclaration.name.staticElement = classElement;
+    classDeclaration.declaredElement = classElement;
     if (hasConstConstructor) {
       var constructorDeclaration = AstTestFactory.constructorDeclaration2(
           Keyword.CONST,
@@ -239,9 +239,8 @@
     var variableDeclaration = isInitialized
         ? AstTestFactory.variableDeclaration2(name, AstTestFactory.integer(0))
         : AstTestFactory.variableDeclaration(name);
-    var identifier = variableDeclaration.name;
-    VariableElement element = ElementFactory.localVariableElement(identifier);
-    identifier.staticElement = element;
+    VariableElement element = ElementFactory.localVariableElement2(name);
+    variableDeclaration.declaredElement = element;
     var keyword = isConst
         ? Keyword.CONST
         : isFinal
diff --git a/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart b/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart
index eb4f3fb..3cbb36f 100644
--- a/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart
+++ b/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart
@@ -1416,7 +1416,7 @@
 
   void _assertExecutable(ExecutableElement? element, String? expected) {
     if (expected != null && element != null) {
-      var enclosingElement = element.enclosingElement2;
+      var enclosingElement = element.enclosingElement3;
 
       var type = element.type;
       var typeStr = typeString(type);
@@ -1426,7 +1426,7 @@
 
       if (element is PropertyAccessorElement) {
         var variable = element.variable;
-        expect(variable.enclosingElement2, same(element.enclosingElement2));
+        expect(variable.enclosingElement3, same(element.enclosingElement3));
         expect(variable.name, element.displayName);
         if (element.isGetter) {
           expect(variable.type, element.returnType);
@@ -1508,7 +1508,7 @@
       var element = entry.value;
       var type = element.type;
 
-      var enclosingElement = element.enclosingElement2;
+      var enclosingElement = element.enclosingElement3;
       if (enclosingElement.name == 'Object') continue;
 
       var typeStr = type.getDisplayString(withNullability: false);
diff --git a/pkg/analyzer/test/src/dart/resolution/enum_test.dart b/pkg/analyzer/test/src/dart/resolution/enum_test.dart
index a569dbc..dd2db98 100644
--- a/pkg/analyzer/test/src/dart/resolution/enum_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/enum_test.dart
@@ -87,10 +87,7 @@
     final node = findNode.enumConstantDeclaration('v.');
     assertResolvedNodeText(node, r'''
 EnumConstantDeclaration
-  name: SimpleIdentifier
-    token: v
-    staticElement: self::@enum::E::@field::v
-    staticType: null
+  name: v
   arguments: EnumConstantArguments
     constructorSelector: ConstructorSelector
       period: .
@@ -126,10 +123,7 @@
     final node = findNode.enumConstantDeclaration('v(');
     assertResolvedNodeText(node, r'''
 EnumConstantDeclaration
-  name: SimpleIdentifier
-    token: v
-    staticElement: self::@enum::E::@field::v
-    staticType: null
+  name: v
   arguments: EnumConstantArguments
     argumentList: ArgumentList
       leftParenthesis: (
@@ -159,10 +153,7 @@
     final node = findNode.enumConstantDeclaration('v<');
     assertResolvedNodeText(node, r'''
 EnumConstantDeclaration
-  name: SimpleIdentifier
-    token: v
-    staticElement: self::@enum::E::@field::v
-    staticType: null
+  name: v
   arguments: EnumConstantArguments
     typeArguments: TypeArgumentList
       leftBracket: <
@@ -208,10 +199,7 @@
     final node = findNode.enumConstantDeclaration('v.');
     assertResolvedNodeText(node, r'''
 EnumConstantDeclaration
-  name: SimpleIdentifier
-    token: v
-    staticElement: self::@enum::E::@field::v
-    staticType: null
+  name: v
   arguments: EnumConstantArguments
     constructorSelector: ConstructorSelector
       period: .
@@ -243,10 +231,7 @@
     final node = findNode.enumConstantDeclaration('v(');
     assertResolvedNodeText(node, r'''
 EnumConstantDeclaration
-  name: SimpleIdentifier
-    token: v
-    staticElement: self::@enum::E::@field::v
-    staticType: null
+  name: v
   arguments: EnumConstantArguments
     argumentList: ArgumentList
       leftParenthesis: (
@@ -271,10 +256,7 @@
     final node = findNode.enumConstantDeclaration('v\n');
     assertResolvedNodeText(node, r'''
 EnumConstantDeclaration
-  name: SimpleIdentifier
-    token: v
-    staticElement: self::@enum::E::@field::v
-    staticType: null
+  name: v
   constructorElement: self::@enum::E::@constructor::•
   declaredElement: self::@enum::E::@field::v
 ''');
@@ -293,10 +275,7 @@
     final node = findNode.enumConstantDeclaration('v.');
     assertResolvedNodeText(node, r'''
 EnumConstantDeclaration
-  name: SimpleIdentifier
-    token: v
-    staticElement: self::@enum::E::@field::v
-    staticType: null
+  name: v
   arguments: EnumConstantArguments
     constructorSelector: ConstructorSelector
       period: .
@@ -330,10 +309,7 @@
     final node = findNode.enumConstantDeclaration('v(');
     assertResolvedNodeText(node, r'''
 EnumConstantDeclaration
-  name: SimpleIdentifier
-    token: v
-    staticElement: self::@enum::E::@field::v
-    staticType: null
+  name: v
   arguments: EnumConstantArguments
     argumentList: ArgumentList
       leftParenthesis: (
diff --git a/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart b/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
index 8cd9fc4..7e50d1e 100644
--- a/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
@@ -62,10 +62,7 @@
         leftBracket: <
         typeParameters
           TypeParameter
-            name: SimpleIdentifier
-              token: T
-              staticElement: T@89
-              staticType: null
+            name: T
             declaredElement: T@89
         rightBracket: >
       parameters: FormalParameterList
@@ -287,10 +284,7 @@
       leftBracket: <
       typeParameters
         TypeParameter
-          name: SimpleIdentifier
-            token: T
-            staticElement: T@37
-            staticType: null
+          name: T
           declaredElement: T@37
       rightBracket: >
     parameters: FormalParameterList
@@ -302,10 +296,7 @@
             staticElement: T@37
             staticType: null
           type: T
-        identifier: SimpleIdentifier
-          token: a
-          staticElement: @36::@parameter::a
-          staticType: null
+        name: a
         declaredElement: @36::@parameter::a
         declaredElementType: T
       rightParenthesis: )
diff --git a/pkg/analyzer/test/src/dart/resolution/library_import_test.dart b/pkg/analyzer/test/src/dart/resolution/library_import_test.dart
index 0402d00..e575fbf 100644
--- a/pkg/analyzer/test/src/dart/resolution/library_import_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/library_import_test.dart
@@ -344,10 +344,7 @@
         keyword: var
         variables
           VariableDeclaration
-            name: SimpleIdentifier
-              token: a
-              staticElement: self::@variable::a
-              staticType: null
+            name: a
             equals: =
             initializer: InstanceCreationExpression
               constructorName: ConstructorName
@@ -449,10 +446,7 @@
         keyword: var
         variables
           VariableDeclaration
-            name: SimpleIdentifier
-              token: a
-              staticElement: self::@variable::a
-              staticType: null
+            name: a
             equals: =
             initializer: InstanceCreationExpression
               constructorName: ConstructorName
@@ -676,10 +670,7 @@
         keyword: var
         variables
           VariableDeclaration
-            name: SimpleIdentifier
-              token: a
-              staticElement: self::@variable::a
-              staticType: null
+            name: a
             equals: =
             initializer: InstanceCreationExpression
               constructorName: ConstructorName
diff --git a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
index 0820f8c..b1ea604c 100644
--- a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
@@ -32,7 +32,7 @@
     assertElementName(gElement, 'g', offset: 20);
 
     var gNode = findNode.methodDeclaration('g =>');
-    assertElement(gNode.name, gElement);
+    expect(gNode.declaredElement, same(gElement));
 
     var fields = element.fields;
     expect(fields, hasLength(1));
@@ -55,7 +55,7 @@
     assertElementName(fooElement, 'foo', offset: 17);
 
     var fooNode = findNode.methodDeclaration('foo()');
-    assertElement(fooNode.name, fooElement);
+    expect(fooNode.declaredElement, same(fooElement));
   }
 
   test_accessor_setter() async {
@@ -74,7 +74,7 @@
     assertElementName(sElement, 's=', offset: 21);
 
     var gNode = findNode.methodDeclaration('s(int _)');
-    assertElement(gNode.name, sElement);
+    expect(gNode.declaredElement, same(sElement));
 
     var fields = element.fields;
     expect(fields, hasLength(1));
@@ -206,7 +206,7 @@
     assertEnclosingElement(tElement, element);
 
     var tNode = findNode.typeParameter('T> {');
-    assertElement(tNode.name, tElement);
+    assertElement(tNode.declaredElement, tElement);
 
     var fields = element.fields;
     expect(fields, hasLength(1));
@@ -216,7 +216,7 @@
     assertEnclosingElement(fElement, element);
 
     var fNode = findNode.variableDeclaration('f;');
-    assertElement(fNode.name, fElement);
+    assertElement(fNode.declaredElement, fElement);
 
     assertNamedType(findNode.namedType('T f'), tElement, 'T');
 
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index cf74902..f386b87 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -215,7 +215,7 @@
   }
 
   void assertEnclosingElement(Element element, Element expectedEnclosing) {
-    expect(element.enclosingElement2, expectedEnclosing);
+    expect(element.enclosingElement3, expectedEnclosing);
   }
 
   Future<void> assertErrorsInCode(
@@ -492,7 +492,7 @@
   ) {
     var actualMapString = Map.fromEntries(
       substitution.map.entries.where((entry) {
-        return entry.key.enclosingElement2 is! ExecutableElement;
+        return entry.key.enclosingElement3 is! ExecutableElement;
       }).map((entry) {
         return MapEntry(
           entry.key.name,
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/inference_update_1_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/inference_update_1_test.dart
index 87e173b..299ab7c 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/inference_update_1_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/inference_update_1_test.dart
@@ -64,7 +64,7 @@
       assertType(findElement.localVar('a').type, 'int');
       assertType(findElement.parameter('x').type, 'int');
       assertType(findElement.parameter('y').type, 'int');
-      expect(findNode.binary('x + y').staticElement!.enclosingElement2.name,
+      expect(findNode.binary('x + y').staticElement!.enclosingElement3.name,
           'num');
     } else {
       await assertErrorsInCode(code, [
@@ -130,7 +130,7 @@
     assertType(findElement.localVar('a').type, _isEnabled ? 'int' : 'dynamic');
     assertType(findElement.parameter('x').type, _isEnabled ? 'int' : 'Object?');
     assertType(findElement.parameter('y').type, 'int');
-    expect(findNode.binary('+ y').staticElement?.enclosingElement2.name,
+    expect(findNode.binary('+ y').staticElement?.enclosingElement3.name,
         _isEnabled ? 'num' : null);
   }
 
@@ -294,7 +294,7 @@
     assertType(findElement.localVar('a').type, 'int?');
     assertType(findElement.parameter('x').type, 'int?');
     assertType(findElement.parameter('y').type, 'int');
-    expect(findNode.binary('+ y').staticElement!.enclosingElement2.name, 'num');
+    expect(findNode.binary('+ y').staticElement!.enclosingElement3.name, 'num');
   }
 
   test_horizontal_inference_unnecessary_due_to_explicit_parameter_type_named() async {
@@ -311,7 +311,7 @@
     assertType(findElement.localVar('a').type, 'int?');
     assertType(findElement.parameter('x').type, 'int?');
     assertType(findElement.parameter('y').type, 'int');
-    expect(findNode.binary('+ y').staticElement!.enclosingElement2.name, 'num');
+    expect(findNode.binary('+ y').staticElement!.enclosingElement3.name, 'num');
   }
 
   test_horizontal_inference_unnecessary_due_to_no_dependency() async {
diff --git a/pkg/analyzer/test/src/diagnostics/extraneous_modifier_test.dart b/pkg/analyzer/test/src/diagnostics/extraneous_modifier_test.dart
index 99c0eb9..d2c9228 100644
--- a/pkg/analyzer/test/src/diagnostics/extraneous_modifier_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extraneous_modifier_test.dart
@@ -29,8 +29,7 @@
     assertParsedNodeText(node, r'''
 SimpleFormalParameter
   keyword: const
-  identifier: SimpleIdentifier
-    token: a
+  name: a
 ''');
   }
 
@@ -46,8 +45,7 @@
     assertParsedNodeText(node, r'''
 SimpleFormalParameter
   keyword: var
-  identifier: SimpleIdentifier
-    token: a
+  name: a
 ''');
   }
 
@@ -67,8 +65,7 @@
   keyword: var
   superKeyword: super
   period: .
-  identifier: SimpleIdentifier
-    token: a
+  name: a
 ''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/function_typed_parameter_var_test.dart b/pkg/analyzer/test/src/diagnostics/function_typed_parameter_var_test.dart
index 9ebed01..483d186 100644
--- a/pkg/analyzer/test/src/diagnostics/function_typed_parameter_var_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/function_typed_parameter_var_test.dart
@@ -30,14 +30,12 @@
 SuperFormalParameter
   superKeyword: super
   period: .
-  identifier: SimpleIdentifier
-    token: a
+  name: a
   typeParameters: TypeParameterList
     leftBracket: <
     typeParameters
       TypeParameter
-        name: SimpleIdentifier
-          token: T
+        name: T
     rightBracket: >
   parameters: FormalParameterList
     leftParenthesis: (
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_declares_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_declares_constructor_test.dart
index 00b7f90..91bb8d8 100644
--- a/pkg/analyzer/test/src/diagnostics/mixin_declares_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/mixin_declares_constructor_test.dart
@@ -26,12 +26,7 @@
       error(ParserErrorCode.MIXIN_DECLARES_CONSTRUCTOR, 27, 1),
     ]);
 
-    var element = findElement.mixin('M');
-    var constructorElement = element.constructors.single;
-
     var fpNode = findNode.fieldFormalParameter('f);');
-    assertElement(fpNode.identifier, constructorElement.parameters[0]);
-
     var fpElement = fpNode.declaredElement as FieldFormalParameterElement;
     assertElement(fpElement.field, findElement.field('f'));
   }
diff --git a/pkg/analyzer/test/src/fasta/ast_builder_test.dart b/pkg/analyzer/test/src/fasta/ast_builder_test.dart
index b8872b3..fda8d7d 100644
--- a/pkg/analyzer/test/src/fasta/ast_builder_test.dart
+++ b/pkg/analyzer/test/src/fasta/ast_builder_test.dart
@@ -26,8 +26,7 @@
 ClassDeclaration
   augmentKeyword: augment
   classKeyword: class
-  name: SimpleIdentifier
-    token: A
+  name: A
   leftBracket: {
   rightBracket: }
 ''');
@@ -54,8 +53,7 @@
         offset: 0
   abstractKeyword: abstract @16
   classKeyword: class @25
-  name: SimpleIdentifier
-    token: A @31
+  name: A @31
   leftBracket: { @33
   rightBracket: } @34
 ''',
@@ -99,8 +97,7 @@
         token: Annotation @46
   abstractKeyword: abstract @57
   classKeyword: class @66
-  name: SimpleIdentifier
-    token: A @72
+  name: A @72
   leftBracket: { @74
   rightBracket: } @75
 ''',
@@ -161,8 +158,7 @@
         token: Annotation @46
   abstractKeyword: abstract @249
   classKeyword: class @258
-  name: SimpleIdentifier
-    token: A @264
+  name: A @264
   leftBracket: { @266
   rightBracket: } @267
 ''',
@@ -180,8 +176,7 @@
 ClassDeclaration
   macroKeyword: macro
   classKeyword: class
-  name: SimpleIdentifier
-    token: A
+  name: A
   leftBracket: {
   rightBracket: }
 ''');
@@ -198,8 +193,7 @@
     assertParsedNodeText(node, r'''
 ClassTypeAlias
   typedefKeyword: class
-  name: SimpleIdentifier
-    token: A
+  name: A
   equals: =
   macroKeyword: macro
   superclass: NamedType
@@ -284,8 +278,7 @@
     var node = parseResult.findNode.enumConstantDeclaration('v.');
     assertParsedNodeText(node, r'''
 EnumConstantDeclaration
-  name: SimpleIdentifier
-    token: v
+  name: v
   arguments: EnumConstantArguments
     constructorSelector: ConstructorSelector
       period: .
@@ -310,8 +303,7 @@
     var node = parseResult.findNode.enumConstantDeclaration('v.');
     assertParsedNodeText(node, r'''
 EnumConstantDeclaration
-  name: SimpleIdentifier
-    token: v
+  name: v
   arguments: EnumConstantArguments
     constructorSelector: ConstructorSelector
       period: .
@@ -337,8 +329,7 @@
     var node = parseResult.findNode.enumConstantDeclaration('v.');
     assertParsedNodeText(node, r'''
 EnumConstantDeclaration
-  name: SimpleIdentifier
-    token: v
+  name: v
   arguments: EnumConstantArguments
     constructorSelector: ConstructorSelector
       period: .
@@ -364,8 +355,7 @@
     var node = parseResult.findNode.enumConstantDeclaration('v<int>.');
     assertParsedNodeText(node, r'''
 EnumConstantDeclaration
-  name: SimpleIdentifier
-    token: v
+  name: v
   arguments: EnumConstantArguments
     typeArguments: TypeArgumentList
       leftBracket: <
@@ -400,8 +390,7 @@
         node,
         r'''
 EnumConstantDeclaration
-  name: SimpleIdentifier
-    token: v
+  name: v
   arguments: EnumConstantArguments
     typeArguments: TypeArgumentList
       leftBracket: <
@@ -434,8 +423,7 @@
     var node = parseResult.findNode.enumConstantDeclaration('v<int>');
     assertParsedNodeText(node, r'''
 EnumConstantDeclaration
-  name: SimpleIdentifier
-    token: v
+  name: v
   arguments: EnumConstantArguments
     typeArguments: TypeArgumentList
       leftBracket: <
@@ -462,13 +450,11 @@
     assertParsedNodeText(node, r'''
 EnumDeclaration
   enumKeyword: enum
-  name: SimpleIdentifier
-    token: E
+  name: E
   leftBracket: {
   constants
     EnumConstantDeclaration
-      name: SimpleIdentifier
-        token: v
+      name: v
   rightBracket: }
 ''');
   }
@@ -485,13 +471,11 @@
     assertParsedNodeText(node, r'''
 EnumDeclaration
   enumKeyword: enum
-  name: SimpleIdentifier
-    token: E
+  name: E
   leftBracket: {
   constants
     EnumConstantDeclaration
-      name: SimpleIdentifier
-        token: v
+      name: v
   semicolon: ;
   rightBracket: }
 ''');
@@ -511,8 +495,7 @@
     assertParsedNodeText(node, r'''
 MethodDeclaration
   propertyKeyword: get
-  name: SimpleIdentifier
-    token: A
+  name: A
   body: ExpressionFunctionBody
     functionDefinition: =>
     expression: IntegerLiteral
@@ -551,8 +534,7 @@
 SuperFormalParameter
   superKeyword: super
   period: .
-  identifier: SimpleIdentifier
-    token: a
+  name: a
 ''');
   }
 }
diff --git a/pkg/analyzer/test/src/fasta/message_coverage_test.dart b/pkg/analyzer/test/src/fasta/message_coverage_test.dart
index 726ed9d..3c3c34d 100644
--- a/pkg/analyzer/test/src/fasta/message_coverage_test.dart
+++ b/pkg/analyzer/test/src/fasta/message_coverage_test.dart
@@ -66,7 +66,7 @@
     var astBuilder = unit.declarations[0] as ClassDeclaration;
     var method = astBuilder.members
         .whereType<MethodDeclaration>()
-        .firstWhere((x) => x.name.name == 'reportMessage');
+        .firstWhere((x) => x.name2.lexeme == 'reportMessage');
     SwitchStatement statement = (method.body as BlockFunctionBody)
         .block
         .statements
diff --git a/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart b/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart
index 61e6024..171836e 100644
--- a/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart
@@ -565,6 +565,7 @@
 ''');
   }
 
+  @failingTest
   void test_fieldFormalParameter_noPeriod_last() {
     testRecovery('''
 class C {
@@ -579,6 +580,7 @@
 ''');
   }
 
+  @failingTest
   void test_fieldFormalParameter_noPeriod_notLast() {
     testRecovery('''
 class C {
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 5a12633..98b3f3b 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -52,6 +52,7 @@
   bool withDisplayName = false,
   bool withExportScope = false,
   bool withNonSynthetic = false,
+  bool withPropertyLinking = false,
   bool withSyntheticDartCoreImport = false,
 }) {
   var writer = _ElementWriter(
@@ -60,6 +61,7 @@
     withDisplayName: withDisplayName,
     withExportScope: withExportScope,
     withNonSynthetic: withNonSynthetic,
+    withPropertyLinking: withPropertyLinking,
     withSyntheticDartCoreImport: withSyntheticDartCoreImport,
   );
   writer.writeLibraryElement(library);
@@ -126,8 +128,10 @@
   final bool withDisplayName;
   final bool withExportScope;
   final bool withNonSynthetic;
+  final bool withPropertyLinking;
   final bool withSyntheticDartCoreImport;
   final StringBuffer buffer = StringBuffer();
+  final _IdMap _idMap = _IdMap();
 
   String indent = '';
 
@@ -137,6 +141,7 @@
     required this.withDisplayName,
     required this.withExportScope,
     required this.withNonSynthetic,
+    required this.withPropertyLinking,
     required this.withSyntheticDartCoreImport,
   });
 
@@ -194,8 +199,8 @@
 
     expect(accessor.variable, same(property));
 
-    var propertyEnclosing = property.enclosingElement2;
-    expect(accessor.enclosingElement2, same(propertyEnclosing));
+    var propertyEnclosing = property.enclosingElement3;
+    expect(accessor.enclosingElement3, same(propertyEnclosing));
 
     if (propertyEnclosing is CompilationUnitElement) {
       expect(propertyEnclosing.accessors, contains(accessor));
@@ -373,7 +378,7 @@
       var classReference = reference.parent!.parent!;
       // We need this `if` for duplicate declarations.
       // The reference might be filled by another declaration.
-      if (identical(classReference.element, e.enclosingElement2)) {
+      if (identical(classReference.element, e.enclosingElement3)) {
         expect(reference.element, same(e));
       }
     }
@@ -410,7 +415,9 @@
 
       var superConstructor = e.superConstructor;
       if (superConstructor != null) {
-        if (!superConstructor.enclosingElement2.isDartCoreObject) {
+        final enclosingElement = superConstructor.enclosingElement3;
+        if (enclosingElement is ClassElement &&
+            !enclosingElement.isDartCoreObject) {
           _writeElementReference('superConstructor', superConstructor);
         }
       }
@@ -428,7 +435,7 @@
 
     if (e.isSynthetic) {
       expect(e.nameOffset, -1);
-      expect(e.nonSynthetic, same(e.enclosingElement2));
+      expect(e.nonSynthetic, same(e.enclosingElement3));
     } else {
       if (!e.isTempAugmentation) {
         expect(e.nameOffset, isPositive);
@@ -678,9 +685,9 @@
       _writeNonSyntheticElement(e);
     });
 
-    if (e.isSynthetic && e.enclosingElement2 is EnumElementImpl) {
+    if (e.isSynthetic && e.enclosingElement3 is EnumElementImpl) {
       expect(e.name, 'toString');
-      expect(e.nonSynthetic, same(e.enclosingElement2));
+      expect(e.nonSynthetic, same(e.enclosingElement3));
     } else {
       _assertNonSyntheticElementSelf(e);
     }
@@ -785,7 +792,7 @@
     PropertyInducingElement variable = e.variable;
     expect(variable, isNotNull);
 
-    var variableEnclosing = variable.enclosingElement2;
+    var variableEnclosing = variable.enclosingElement3;
     if (variableEnclosing is CompilationUnitElement) {
       expect(variableEnclosing.topLevelVariables, contains(variable));
     } else if (variableEnclosing is ClassElement) {
@@ -829,6 +836,13 @@
       _writeBodyModifiers(e);
     });
 
+    void writeLinking() {
+      if (withPropertyLinking) {
+        _writelnWithIndent('id: ${_idMap[e]}');
+        _writelnWithIndent('variable: ${_idMap[e.variable]}');
+      }
+    }
+
     _withIndent(() {
       _writeDocumentation(e);
       _writeMetadata(e);
@@ -838,6 +852,7 @@
       _writeParameterElements(e.parameters);
       _writeType('returnType', e.returnType);
       _writeNonSyntheticElement(e);
+      writeLinking();
     });
   }
 
@@ -877,6 +892,22 @@
       _writeName(e);
     });
 
+    void writeLinking() {
+      if (withPropertyLinking) {
+        _writelnWithIndent('id: ${_idMap[e]}');
+
+        final getter = e.getter;
+        if (getter != null) {
+          _writelnWithIndent('getter: ${_idMap[getter]}');
+        }
+
+        final setter = e.setter;
+        if (setter != null) {
+          _writelnWithIndent('setter: ${_idMap[setter]}');
+        }
+      }
+    }
+
     _withIndent(() {
       _writeDocumentation(e);
       _writeMetadata(e);
@@ -885,6 +916,7 @@
       _writeType('type', e.type);
       _writeConstantInitializer(e);
       _writeNonSyntheticElement(e);
+      writeLinking();
     });
   }
 
@@ -1012,6 +1044,26 @@
   }
 }
 
+class _IdMap {
+  final Map<Element, String> fieldMap = Map.identity();
+  final Map<Element, String> getterMap = Map.identity();
+  final Map<Element, String> setterMap = Map.identity();
+
+  String operator [](Element element) {
+    if (element is FieldElement) {
+      return fieldMap[element] ??= 'field_${fieldMap.length}';
+    } else if (element is TopLevelVariableElement) {
+      return fieldMap[element] ??= 'variable_${fieldMap.length}';
+    } else if (element is PropertyAccessorElement && element.isGetter) {
+      return getterMap[element] ??= 'getter_${getterMap.length}';
+    } else if (element is PropertyAccessorElement && element.isSetter) {
+      return setterMap[element] ??= 'setter_${setterMap.length}';
+    } else {
+      return '???';
+    }
+  }
+}
+
 class _Replacement {
   final int offset;
   final int end;
diff --git a/pkg/analyzer/test/src/summary/elements_test.dart b/pkg/analyzer/test/src/summary/elements_test.dart
index 566a19d..f86beeb 100644
--- a/pkg/analyzer/test/src/summary/elements_test.dart
+++ b/pkg/analyzer/test/src/summary/elements_test.dart
@@ -4282,6 +4282,101 @@
 ''');
   }
 
+  test_class_field_duplicate_getter() async {
+    var library = await buildLibrary('''
+class C {
+  int foo = 0;
+  int get foo => 0;
+}
+''');
+    checkElementText(
+        library,
+        r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          foo @16
+            type: int
+            id: field_0
+            getter: getter_0
+            setter: setter_0
+          synthetic foo @-1
+            type: int
+            id: field_1
+            getter: getter_1
+        constructors
+          synthetic @-1
+        accessors
+          synthetic get foo @-1
+            returnType: int
+            id: getter_0
+            variable: field_0
+          synthetic set foo @-1
+            parameters
+              requiredPositional _foo @-1
+                type: int
+            returnType: void
+            id: setter_0
+            variable: field_0
+          get foo @35
+            returnType: int
+            id: getter_1
+            variable: field_1
+''',
+        withPropertyLinking: true);
+  }
+
+  test_class_field_duplicate_setter() async {
+    var library = await buildLibrary('''
+class C {
+  int foo = 0;
+  set foo(int _) {}
+}
+''');
+    checkElementText(
+        library,
+        r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          foo @16
+            type: int
+            id: field_0
+            getter: getter_0
+            setter: setter_0
+          synthetic foo @-1
+            type: int
+            id: field_1
+            setter: setter_1
+        constructors
+          synthetic @-1
+        accessors
+          synthetic get foo @-1
+            returnType: int
+            id: getter_0
+            variable: field_0
+          synthetic set foo @-1
+            parameters
+              requiredPositional _foo @-1
+                type: int
+            returnType: void
+            id: setter_0
+            variable: field_0
+          set foo @31
+            parameters
+              requiredPositional _ @39
+                type: int
+            returnType: void
+            id: setter_1
+            variable: field_1
+''',
+        withPropertyLinking: true);
+  }
+
   test_class_field_external() async {
     var library = await buildLibrary('''
 abstract class C {
@@ -4389,10 +4484,7 @@
                                   staticElement: dart:core::@class::double
                                   staticType: null
                                 type: double
-                              identifier: SimpleIdentifier
-                                token: a @78
-                                staticElement: a@78
-                                staticType: null
+                              name: a @78
                               declaredElement: a@78
                               declaredElementType: double
                             rightParenthesis: ) @79
@@ -4451,7 +4543,9 @@
   set foo(int newValue) {}
 }
 ''');
-    checkElementText(library, r'''
+    checkElementText(
+        library,
+        r'''
 library
   definingUnit
     classes
@@ -4459,6 +4553,9 @@
         fields
           final foo @22
             type: int
+            id: field_0
+            getter: getter_0
+            setter: setter_0
         constructors
           @29
             parameters
@@ -4468,12 +4565,17 @@
         accessors
           synthetic get foo @-1
             returnType: int
+            id: getter_0
+            variable: field_0
           set foo @48
             parameters
               requiredPositional newValue @56
                 type: int
             returnType: void
-''');
+            id: setter_0
+            variable: field_0
+''',
+        withPropertyLinking: true);
   }
 
   test_class_field_formal_param_inferred_type_implicit() async {
@@ -22159,14 +22261,14 @@
 
     var T = F.typeParameters[0];
     expect(T.name, 'T');
-    expect(T.enclosingElement2, same(F));
+    expect(T.enclosingElement3, same(F));
 
     var function = F.aliasedElement as GenericFunctionTypeElement;
-    expect(function.enclosingElement2, same(F));
+    expect(function.enclosingElement3, same(F));
 
     var a = function.parameters[0];
     expect(a.name, 'a');
-    expect(a.enclosingElement2, same(function));
+    expect(a.enclosingElement3, same(function));
   }
 
   test_functionTypeAlias_type_element() async {
@@ -22789,10 +22891,7 @@
                           staticElement: dart:core::@class::String
                           staticType: null
                         type: String
-                      identifier: SimpleIdentifier
-                        token: a @52
-                        staticElement: a@52
-                        staticType: null
+                      name: a @52
                       declaredElement: a@52
                       declaredElementType: String
                     rightParenthesis: ) @53
@@ -22864,10 +22963,7 @@
                           staticElement: dart:core::@class::String
                           staticType: null
                         type: String
-                      identifier: SimpleIdentifier
-                        token: a @52
-                        staticElement: a@52
-                        staticType: null
+                      name: a @52
                       declaredElement: a@52
                       declaredElementType: String
                     rightParenthesis: ) @53
@@ -22950,10 +23046,7 @@
                                 staticType: null
                               question: ? @61
                               type: int?
-                            identifier: SimpleIdentifier
-                              token: a @63
-                              staticElement: a@63
-                              staticType: null
+                            name: a @63
                             declaredElement: a@63
                             declaredElementType: int?
                           declaredElement: a@63
@@ -23035,10 +23128,7 @@
                                 staticType: null
                               question: ? @61
                               type: int?
-                            identifier: SimpleIdentifier
-                              token: a @63
-                              staticElement: a@63
-                              staticType: null
+                            name: a @63
                             declaredElement: a@63
                             declaredElementType: int?
                           declaredElement: a@63
@@ -23120,10 +23210,7 @@
                                 staticElement: dart:core::@class::int
                                 staticType: null
                               type: int
-                            identifier: SimpleIdentifier
-                              token: a @71
-                              staticElement: a@71
-                              staticType: null
+                            name: a @71
                             declaredElement: a@71
                             declaredElementType: int
                           declaredElement: a@71
@@ -23202,10 +23289,7 @@
                               staticElement: dart:core::@class::int
                               staticType: null
                             type: int
-                          identifier: SimpleIdentifier
-                            token: a @61
-                            staticElement: a@61
-                            staticType: null
+                          name: a @61
                           declaredElement: a@61
                           declaredElementType: int
                         rightParenthesis: ) @62
@@ -23331,18 +23415,18 @@
 
     var T = F.typeParameters[0];
     expect(T.name, 'T');
-    expect(T.enclosingElement2, same(F));
+    expect(T.enclosingElement3, same(F));
 
     var function = F.aliasedElement as GenericFunctionTypeElement;
-    expect(function.enclosingElement2, same(F));
+    expect(function.enclosingElement3, same(F));
 
     var U = function.typeParameters[0];
     expect(U.name, 'U');
-    expect(U.enclosingElement2, same(function));
+    expect(U.enclosingElement3, same(function));
 
     var a = function.parameters[0];
     expect(a.name, 'a');
-    expect(a.enclosingElement2, same(function));
+    expect(a.enclosingElement3, same(function));
   }
 
   test_genericTypeAlias_recursive() async {
@@ -26517,7 +26601,7 @@
 
     final import_0 = library.augmentationImports[0];
     final augmentation = import_0.importedAugmentation!;
-    expect(augmentation.enclosingElement2, same(library));
+    expect(augmentation.enclosingElement3, same(library));
   }
 
   test_library_augmentationImports_noRelativeUriStr() async {
@@ -39097,26 +39181,119 @@
 ''');
   }
 
+  test_unit_variable_duplicate_getter() async {
+    var library = await buildLibrary('''
+int foo = 0;
+int get foo => 0;
+''');
+    checkElementText(
+        library,
+        r'''
+library
+  definingUnit
+    topLevelVariables
+      static foo @4
+        type: int
+        id: variable_0
+        getter: getter_0
+        setter: setter_0
+      synthetic static foo @-1
+        type: int
+        id: variable_1
+        getter: getter_1
+    accessors
+      synthetic static get foo @-1
+        returnType: int
+        id: getter_0
+        variable: variable_0
+      synthetic static set foo @-1
+        parameters
+          requiredPositional _foo @-1
+            type: int
+        returnType: void
+        id: setter_0
+        variable: variable_0
+      static get foo @21
+        returnType: int
+        id: getter_1
+        variable: variable_1
+''',
+        withPropertyLinking: true);
+  }
+
+  test_unit_variable_duplicate_setter() async {
+    var library = await buildLibrary('''
+int foo = 0;
+set foo(int _) {}
+''');
+    checkElementText(
+        library,
+        r'''
+library
+  definingUnit
+    topLevelVariables
+      static foo @4
+        type: int
+        id: variable_0
+        getter: getter_0
+        setter: setter_0
+      synthetic static foo @-1
+        type: int
+        id: variable_1
+        setter: setter_1
+    accessors
+      synthetic static get foo @-1
+        returnType: int
+        id: getter_0
+        variable: variable_0
+      synthetic static set foo @-1
+        parameters
+          requiredPositional _foo @-1
+            type: int
+        returnType: void
+        id: setter_0
+        variable: variable_0
+      static set foo @17
+        parameters
+          requiredPositional _ @25
+            type: int
+        returnType: void
+        id: setter_1
+        variable: variable_1
+''',
+        withPropertyLinking: true);
+  }
+
   test_unit_variable_final_withSetter() async {
     var library = await buildLibrary(r'''
 final int foo = 0;
 set foo(int newValue) {}
 ''');
-    checkElementText(library, r'''
+    checkElementText(
+        library,
+        r'''
 library
   definingUnit
     topLevelVariables
       static final foo @10
         type: int
+        id: variable_0
+        getter: getter_0
+        setter: setter_0
     accessors
       synthetic static get foo @-1
         returnType: int
+        id: getter_0
+        variable: variable_0
       static set foo @23
         parameters
           requiredPositional newValue @31
             type: int
         returnType: void
-''');
+        id: setter_0
+        variable: variable_0
+''',
+        withPropertyLinking: true);
   }
 
   test_unresolved_annotation_instanceCreation_argument_super() async {
diff --git a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
index f838869..a096a25 100644
--- a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
+++ b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
@@ -1298,7 +1298,7 @@
   }
 
   String _elementToReferenceString(Element element) {
-    final enclosingElement = element.enclosingElement2;
+    final enclosingElement = element.enclosingElement3;
     final reference = (element as ElementImpl).reference;
     if (reference != null) {
       return _referenceToString(reference);
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index 99c68fe..a7a5668 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -1917,7 +1917,7 @@
           messageContains: ["'g0'"]),
       error(HintCode.UNUSED_ELEMENT, 96, 2),
       error(HintCode.UNUSED_ELEMENT, 126, 2),
-      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 212, 12,
+      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 212, 2,
           messageContains: ["'m0'"]),
       error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 304, 2,
           messageContains: ["'y0'"]),
diff --git a/pkg/analyzer/test/util/ast_check.dart b/pkg/analyzer/test/util/ast_check.dart
index 8119c60..6a3e71f 100644
--- a/pkg/analyzer/test/util/ast_check.dart
+++ b/pkg/analyzer/test/util/ast_check.dart
@@ -81,13 +81,6 @@
       (selected) => 'has arguments ${valueStr(selected)}',
     );
   }
-
-  CheckTarget<SimpleIdentifier> get name {
-    return nest(
-      value.name,
-      (selected) => 'has name ${valueStr(selected)}',
-    );
-  }
 }
 
 extension EnumDeclarationExtension on CheckTarget<EnumDeclaration> {
@@ -99,15 +92,6 @@
   }
 }
 
-extension FormalParameterExtension on CheckTarget<FormalParameter> {
-  CheckTarget<SimpleIdentifier?> get identifier {
-    return nest(
-      value.identifier,
-      (selected) => 'has identifier ${valueStr(selected)}',
-    );
-  }
-}
-
 extension SimpleFormalParameterExtension on CheckTarget<SimpleFormalParameter> {
   CheckTarget<Token?> get keyword {
     return nest(
@@ -147,13 +131,6 @@
 }
 
 extension SuperFormalParameterExtension on CheckTarget<SuperFormalParameter> {
-  CheckTarget<SimpleIdentifier> get identifier {
-    return nest(
-      value.identifier,
-      (selected) => 'has identifier ${valueStr(selected)}',
-    );
-  }
-
   CheckTarget<Token?> get keyword {
     return nest(
       value.keyword,
diff --git a/pkg/analyzer/test/util/id_testing_helper.dart b/pkg/analyzer/test/util/id_testing_helper.dart
index 3f9f608..27d9ac8 100644
--- a/pkg/analyzer/test/util/id_testing_helper.dart
+++ b/pkg/analyzer/test/util/id_testing_helper.dart
@@ -213,20 +213,20 @@
       if (className != null) {
         for (var declaration in unit.declarations) {
           if (declaration is ClassDeclaration &&
-              declaration.name.name == className) {
+              declaration.name2.lexeme == className) {
             for (var member in declaration.members) {
               if (member is ConstructorDeclaration) {
-                if (member.name!.name == name) {
+                if (member.name2!.lexeme == name) {
                   return member.offset;
                 }
               } else if (member is FieldDeclaration) {
                 for (var variable in member.fields.variables) {
-                  if (variable.name.name == name) {
+                  if (variable.name2.lexeme == name) {
                     return variable.offset;
                   }
                 }
               } else if (member is MethodDeclaration) {
-                if (member.name.name == name) {
+                if (member.name2.lexeme == name) {
                   return member.offset;
                 }
               }
@@ -239,12 +239,12 @@
       }
       for (var declaration in unit.declarations) {
         if (declaration is FunctionDeclaration) {
-          if (declaration.name.name == name) {
+          if (declaration.name2.lexeme == name) {
             return declaration.offset;
           }
         } else if (declaration is TopLevelVariableDeclaration) {
           for (var variable in declaration.variables.variables) {
-            if (variable.name.name == name) {
+            if (variable.name2.lexeme == name) {
               return variable.offset;
             }
           }
@@ -258,7 +258,7 @@
               .unit;
       for (var declaration in unit.declarations) {
         if (declaration is ClassDeclaration &&
-            declaration.name.name == className) {
+            declaration.name2.lexeme == className) {
           return declaration.offset;
         }
       }
diff --git a/pkg/analyzer/test/utils.dart b/pkg/analyzer/test/utils.dart
index 082f929..2adf9cd 100644
--- a/pkg/analyzer/test/utils.dart
+++ b/pkg/analyzer/test/utils.dart
@@ -30,7 +30,8 @@
   static ClassDeclaration getClass(CompilationUnit unit, String className) {
     NodeList<CompilationUnitMember> unitMembers = unit.declarations;
     for (CompilationUnitMember unitMember in unitMembers) {
-      if (unitMember is ClassDeclaration && unitMember.name.name == className) {
+      if (unitMember is ClassDeclaration &&
+          unitMember.name2.lexeme == className) {
         return unitMember;
       }
     }
@@ -47,7 +48,7 @@
     NodeList<ClassMember> classMembers = unitMember.members;
     for (ClassMember classMember in classMembers) {
       if (classMember is ConstructorDeclaration) {
-        if (classMember.name?.name == constructorName) {
+        if (classMember.name2?.lexeme == constructorName) {
           return classMember;
         }
       }
@@ -65,7 +66,7 @@
       if (classMember is FieldDeclaration) {
         NodeList<VariableDeclaration> fields = classMember.fields.variables;
         for (VariableDeclaration field in fields) {
-          if (field.name.name == fieldName) {
+          if (field.name2.lexeme == fieldName) {
             return field;
           }
         }
@@ -78,7 +79,7 @@
   /// with the given [className] in the given compilation [unit].
   static FieldElement? getFieldInClassElement(
       CompilationUnit unit, String className, String fieldName) {
-    return getFieldInClass(unit, className, fieldName).name.staticElement
+    return getFieldInClass(unit, className, fieldName).declaredElement
         as FieldElement;
   }
 
@@ -90,7 +91,7 @@
     NodeList<ClassMember> classMembers = unitMember.members;
     for (ClassMember classMember in classMembers) {
       if (classMember is MethodDeclaration) {
-        if (classMember.name.name == methodName) {
+        if (classMember.name2.lexeme == methodName) {
           return classMember;
         }
       }
@@ -124,7 +125,7 @@
     NodeList<CompilationUnitMember> unitMembers = unit.declarations;
     for (CompilationUnitMember unitMember in unitMembers) {
       if (unitMember is FunctionDeclaration) {
-        if (unitMember.name.name == functionName) {
+        if (unitMember.name2.lexeme == functionName) {
           return unitMember;
         }
       }
@@ -142,7 +143,7 @@
         NodeList<VariableDeclaration> variables =
             unitMember.variables.variables;
         for (VariableDeclaration variable in variables) {
-          if (variable.name.name == variableName) {
+          if (variable.name2.lexeme == variableName) {
             return variable;
           }
         }
@@ -154,7 +155,7 @@
   /// Return the top-level variable element with the given [name].
   static TopLevelVariableElement getTopLevelVariableElement(
       CompilationUnit unit, String name) {
-    return getTopLevelVariable(unit, name).name.staticElement
+    return getTopLevelVariable(unit, name).declaredElement
         as TopLevelVariableElement;
   }
 }
diff --git a/pkg/analyzer/tool/messages/extract_errors_to_yaml.dart b/pkg/analyzer/tool/messages/extract_errors_to_yaml.dart
index d26eab1..7f1c6fb 100644
--- a/pkg/analyzer/tool/messages/extract_errors_to_yaml.dart
+++ b/pkg/analyzer/tool/messages/extract_errors_to_yaml.dart
@@ -173,11 +173,11 @@
         .unit;
     for (var declaration in unit.declarations) {
       if (declaration is! ClassDeclaration) continue;
-      var className = declaration.name.name;
+      var className = declaration.name2.lexeme;
       for (var member in declaration.members) {
         if (member is! FieldDeclaration) continue;
         for (var variable in member.fields.variables) {
-          (result[className] ??= {})[variable.name.name] = variable;
+          (result[className] ??= {})[variable.name2.lexeme] = variable;
         }
       }
     }
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
index ec84066..9a17008 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
@@ -121,7 +121,7 @@
       {ArgumentList? argumentList,
       void Function()? bodyWriter,
       String? classNameGroupName,
-      SimpleIdentifier? constructorName,
+      String? constructorName,
       String? constructorNameGroupName,
       List<String>? fieldNames,
       void Function()? initializerWriter,
@@ -139,9 +139,9 @@
     if (constructorName != null) {
       write('.');
       if (constructorNameGroupName == null) {
-        write(constructorName.name);
+        write(constructorName);
       } else {
-        addSimpleLinkedEdit(constructorNameGroupName, constructorName.name);
+        addSimpleLinkedEdit(constructorNameGroupName, constructorName);
       }
     }
     write('(');
@@ -693,7 +693,7 @@
 
   @override
   void writeReference(Element element) {
-    if (element.enclosingElement2 is CompilationUnitElement) {
+    if (element.enclosingElement3 is CompilationUnitElement) {
       _writeLibraryReference(element);
     }
     write(element.displayName);
@@ -1112,10 +1112,10 @@
     if (type is TypeParameterType) {
       _initializeEnclosingElements();
       var element = type.element;
-      var enclosing = element.enclosingElement2;
+      var enclosing = element.enclosingElement3;
       while (enclosing is GenericFunctionTypeElement ||
           enclosing is ParameterElement) {
-        enclosing = enclosing!.enclosingElement2;
+        enclosing = enclosing!.enclosingElement3;
       }
       if (enclosing == _enclosingExecutable ||
           enclosing == _enclosingClass ||
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart
index 7257b10..df27d1e 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart
@@ -166,8 +166,19 @@
             // Try to replace with a comment token.
             var commentToken = _getContainingCommentToken(entity, offset);
             if (commentToken != null) {
-              return CompletionTarget._(
-                  offset, containingNode, commentToken, true);
+              // TODO(scheglov) This is duplicate of the code below.
+              // If the preceding comment is dartdoc token, then update
+              // the containing node to be the dartdoc comment.
+              // Otherwise completion is not required.
+              var docComment =
+                  _getContainingDocComment(containingNode, commentToken);
+              if (docComment != null) {
+                return CompletionTarget._(
+                    offset, docComment, commentToken, false);
+              } else {
+                return CompletionTarget._(
+                    offset, entryPoint, commentToken, true);
+              }
             }
             // Target found.
             return CompletionTarget._(offset, containingNode, entity, false);
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/element_suggestion_builder.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/element_suggestion_builder.dart
index e0a02d4..7d683d3 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/element_suggestion_builder.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/element_suggestion_builder.dart
@@ -70,7 +70,7 @@
           // Pair getter/setter by updating the existing suggestion
           if (existingSuggestion != null) {
             var getter = element.isGetter ? suggestion : existingSuggestion;
-            var elemKind = element.enclosingElement2 is ClassElement
+            var elemKind = element.enclosingElement3 is ClassElement
                 ? protocol.ElementKind.FIELD
                 : protocol.ElementKind.TOP_LEVEL_VARIABLE;
             existingSuggestion.element = protocol.Element(
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
index e567a2c..69c9428 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
@@ -75,6 +75,11 @@
       return optype;
     }
 
+    // Don't suggest anything in comments.
+    if (target.entity is CommentToken) {
+      return optype;
+    }
+
     var targetNode = target.containingNode;
     targetNode.accept(_OpTypeAstVisitor(optype, target.entity, offset));
 
@@ -466,7 +471,7 @@
 
   @override
   void visitDeclaredIdentifier(DeclaredIdentifier node) {
-    var identifier = node.identifier;
+    var identifier = node.name;
     if (identifier == entity &&
         offset < identifier.offset &&
         node.type == null) {
@@ -610,7 +615,7 @@
       // class A { static late ^ }
       if (node.staticKeyword != null &&
           variables.length == 1 &&
-          variables[0].name.name == 'late') {
+          variables[0].name2.lexeme == 'late') {
         optype.completionLocation = 'FieldDeclaration_static_late';
         optype.includeTypeNameSuggestions = true;
         return;
@@ -619,7 +624,7 @@
       if (node.staticKeyword == null &&
           offset <= node.semicolon.offset &&
           variables.length == 1 &&
-          variables[0].name.name == 'static') {
+          variables[0].name2.lexeme == 'static') {
         optype.completionLocation = 'FieldDeclaration_static';
         optype.includeTypeNameSuggestions = true;
         return;
@@ -645,7 +650,7 @@
 
   @override
   void visitFieldFormalParameter(FieldFormalParameter node) {
-    if (entity == node.identifier) {
+    if (entity == node.name) {
       optype.isPrefixed = true;
     } else {
       optype.includeReturnValueSuggestions = true;
@@ -788,7 +793,7 @@
   @override
   void visitFunctionDeclaration(FunctionDeclaration node) {
     if (identical(entity, node.returnType) ||
-        identical(entity, node.name) && node.returnType == null) {
+        identical(entity, node.name2) && node.returnType == null) {
       optype.completionLocation = 'FunctionDeclaration_returnType';
       optype.includeTypeNameSuggestions = true;
     }
@@ -803,7 +808,7 @@
   @override
   void visitFunctionTypeAlias(FunctionTypeAlias node) {
     if (identical(entity, node.returnType) ||
-        identical(entity, node.name) && node.returnType == null) {
+        identical(entity, node.name2) && node.returnType == null) {
       optype.includeTypeNameSuggestions = true;
     }
   }
@@ -930,7 +935,7 @@
   @override
   void visitMethodDeclaration(MethodDeclaration node) {
     if (identical(entity, node.returnType) ||
-        identical(entity, node.name) && node.returnType == null) {
+        identical(entity, node.name2) && node.returnType == null) {
       optype.completionLocation = 'MethodDeclaration_returnType';
     }
     // TODO(brianwilkerson) In visitFunctionDeclaration, this is conditional. It
@@ -1035,7 +1040,7 @@
 
   @override
   void visitNormalFormalParameter(NormalFormalParameter node) {
-    if (node.identifier != entity) {
+    if (node.name != entity) {
       optype.includeReturnValueSuggestions = true;
       optype.includeTypeNameSuggestions = true;
     }
@@ -1153,7 +1158,7 @@
   @override
   void visitSimpleFormalParameter(SimpleFormalParameter node) {
     var type = node.type;
-    var name = node.identifier;
+    var name = node.name;
 
     // "(Type^)" is parsed as a parameter with the _name_ "Type".
     if (type == null &&
@@ -1172,7 +1177,7 @@
 
     // If "(Type ^)", then include parameter names.
     if (type == null && name != null && name.end < offset) {
-      var nextToken = name.token.next;
+      var nextToken = name.next;
       if (nextToken != null && offset <= nextToken.offset) {
         optype.includeVarNameSuggestions = true;
         return;
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/suggestion_builder.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/suggestion_builder.dart
index f3446c6..7e7bbe2 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/suggestion_builder.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/suggestion_builder.dart
@@ -94,7 +94,7 @@
     suggestion.docSummary = getDartDocSummary(doc);
 
     suggestion.element = converter.convertElement(element);
-    var enclosingElement = element.enclosingElement2;
+    var enclosingElement = element.enclosingElement3;
     if (enclosingElement is ClassElement) {
       suggestion.declaringType = enclosingElement.displayName;
     }
diff --git a/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart b/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart
index 996d339..7aaab56 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart
@@ -35,7 +35,11 @@
 
   void declaredLabel(Label label, bool isCaseLabel) {}
 
-  void declaredLocalVar(SimpleIdentifier name, TypeAnnotation? type) {}
+  void declaredLocalVar(
+    Token name,
+    TypeAnnotation? type,
+    LocalVariableElement declaredElement,
+  ) {}
 
   void declaredMethod(MethodDeclaration declaration) {}
 
@@ -123,11 +127,13 @@
     var forLoopParts = node.forLoopParts;
     if (forLoopParts is ForEachPartsWithDeclaration) {
       var loopVariable = forLoopParts.loopVariable;
-      declaredLocalVar(loopVariable.identifier, loopVariable.type);
+      declaredLocalVar(
+          loopVariable.name, loopVariable.type, loopVariable.declaredElement!);
     } else if (forLoopParts is ForPartsWithDeclarations) {
       var varList = forLoopParts.variables;
       for (var varDecl in varList.variables) {
-        declaredLocalVar(varDecl.name, varList.type);
+        declaredLocalVar(varDecl.name2, varList.type,
+            varDecl.declaredElement as LocalVariableElement);
       }
     }
     visitNode(node);
@@ -138,11 +144,13 @@
     var forLoopParts = node.forLoopParts;
     if (forLoopParts is ForEachPartsWithDeclaration) {
       var loopVariable = forLoopParts.loopVariable;
-      declaredLocalVar(loopVariable.identifier, loopVariable.type);
+      declaredLocalVar(
+          loopVariable.name, loopVariable.type, loopVariable.declaredElement!);
     } else if (forLoopParts is ForPartsWithDeclarations) {
       var varList = forLoopParts.variables;
       for (var varDecl in varList.variables) {
-        declaredLocalVar(varDecl.name, varList.type);
+        declaredLocalVar(varDecl.name2, varList.type,
+            varDecl.declaredElement as LocalVariableElement);
       }
     }
     visitNode(node);
@@ -302,7 +310,7 @@
         } else if (normalParam is SimpleFormalParameter) {
           type = normalParam.type;
         }
-        declaredParam(param.identifier!.token, param.declaredElement, type);
+        declaredParam(param.name!, param.declaredElement, type);
       }
     }
   }
@@ -314,13 +322,14 @@
           var varList = stmt.variables;
           for (var varDecl in varList.variables) {
             if (varDecl.end < offset) {
-              declaredLocalVar(varDecl.name, varList.type);
+              declaredLocalVar(varDecl.name2, varList.type,
+                  varDecl.declaredElement as LocalVariableElement);
             }
           }
         } else if (stmt is FunctionDeclarationStatement) {
           var declaration = stmt.functionDeclaration;
           if (declaration.offset < offset) {
-            var name = declaration.name.name;
+            var name = declaration.name2.lexeme;
             if (name.isNotEmpty) {
               declaredFunction(declaration);
               _visitTypeParameters(
diff --git a/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart b/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
index 8d281e6..cb41470 100644
--- a/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
+++ b/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
@@ -225,7 +225,7 @@
         // so should it return isEnumConstant = true?
         // Or should we return ElementKind.ENUM_CONSTANT here
         // in either or both of these cases?
-        element.type.element == element.enclosingElement2) {
+        element.type.element == element.enclosingElement3) {
       return plugin.ElementKind.ENUM_CONSTANT;
     }
     return convertElementKind(element.kind);
@@ -324,15 +324,15 @@
     if (currentElement is analyzer.CompilationUnitElement) {
       return currentElement;
     }
-    if (currentElement.enclosingElement2 is analyzer.LibraryElement) {
-      currentElement = currentElement.enclosingElement2;
+    if (currentElement.enclosingElement3 is analyzer.LibraryElement) {
+      currentElement = currentElement.enclosingElement3;
     }
     if (currentElement is analyzer.LibraryElement) {
       return currentElement.definingCompilationUnit;
     }
     for (;
         currentElement != null;
-        currentElement = currentElement.enclosingElement2) {
+        currentElement = currentElement.enclosingElement3) {
       if (currentElement is analyzer.CompilationUnitElement) {
         return currentElement;
       }
diff --git a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
index 2082af0..9574bb5 100644
--- a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
@@ -68,7 +68,7 @@
       {ArgumentList? argumentList,
       void Function()? bodyWriter,
       String? classNameGroupName,
-      SimpleIdentifier? constructorName,
+      String? constructorName,
       String? constructorNameGroupName,
       List<String>? fieldNames,
       void Function()? initializerWriter,
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart b/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
index d356221..97b1c7f 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
@@ -106,9 +106,9 @@
       // the most likely completion is a super expression with same name
       var containingMethod =
           expression.thisOrAncestorOfType<MethodDeclaration>();
-      var id = containingMethod?.name;
+      var id = containingMethod?.name2;
       if (id != null) {
-        containingMethodName = id.name;
+        containingMethodName = id.lexeme;
       }
     }
     if (type == null || type.isDynamic) {
@@ -140,7 +140,7 @@
 
   @override
   void declaredClass(ClassDeclaration declaration) {
-    if (declaration.name.name == targetName) {
+    if (declaration.name2.lexeme == targetName) {
       // no type
       finished();
     }
@@ -148,7 +148,7 @@
 
   @override
   void declaredClassTypeAlias(ClassTypeAlias declaration) {
-    if (declaration.name.name == targetName) {
+    if (declaration.name2.lexeme == targetName) {
       // no type
       finished();
     }
@@ -159,7 +159,7 @@
 
   @override
   void declaredField(FieldDeclaration fieldDecl, VariableDeclaration varDecl) {
-    if (varDecl.name.name == targetName) {
+    if (varDecl.name2.lexeme == targetName) {
       // Type provided by the element in computeFull above
       finished();
     }
@@ -167,7 +167,7 @@
 
   @override
   void declaredFunction(FunctionDeclaration declaration) {
-    if (declaration.name.name == targetName) {
+    if (declaration.name2.lexeme == targetName) {
       var typeName = declaration.returnType;
       if (typeName != null) {
         typeFound = typeName.type;
@@ -178,7 +178,7 @@
 
   @override
   void declaredFunctionTypeAlias(FunctionTypeAlias declaration) {
-    if (declaration.name.name == targetName) {
+    if (declaration.name2.lexeme == targetName) {
       var typeName = declaration.returnType;
       if (typeName != null) {
         typeFound = typeName.type;
@@ -189,7 +189,7 @@
 
   @override
   void declaredGenericTypeAlias(GenericTypeAlias declaration) {
-    if (declaration.name.name == targetName) {
+    if (declaration.name2.lexeme == targetName) {
       var typeName = declaration.functionType?.returnType;
       if (typeName != null) {
         typeFound = typeName.type;
@@ -207,17 +207,20 @@
   }
 
   @override
-  void declaredLocalVar(SimpleIdentifier name, TypeAnnotation? type) {
-    if (name.name == targetName) {
-      var element = name.staticElement as VariableElement;
-      typeFound = element.type;
+  void declaredLocalVar(
+    Token name,
+    TypeAnnotation? type,
+    LocalVariableElement declaredElement,
+  ) {
+    if (name.lexeme == targetName) {
+      typeFound = declaredElement.type;
       finished();
     }
   }
 
   @override
   void declaredMethod(MethodDeclaration declaration) {
-    if (declaration.name.name == targetName) {
+    if (declaration.name2.lexeme == targetName) {
       var typeName = declaration.returnType;
       if (typeName != null) {
         typeFound = typeName.type;
@@ -237,7 +240,7 @@
   @override
   void declaredTopLevelVar(
       VariableDeclarationList varList, VariableDeclaration varDecl) {
-    if (varDecl.name.name == targetName) {
+    if (varDecl.name2.lexeme == targetName) {
       // Type provided by the element in computeFull above
       finished();
     }
diff --git a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
index be4d391..a1c5c55 100644
--- a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
@@ -26,6 +26,15 @@
     unit.accept(visitor);
   } else {
     var node = _getNodeForRange(unit, offset, length);
+
+    {
+      final parent = node?.parent;
+      // ignore: deprecated_member_use
+      if (parent is ConstructorDeclaration && parent.name == node) {
+        node = parent;
+      }
+    }
+
     if (node != null) {
       node = _getNavigationTargetNode(node);
     }
@@ -146,7 +155,7 @@
   void visitAnnotation(Annotation node) {
     var element = node.element;
     if (element is ConstructorElement && element.isSynthetic) {
-      element = element.enclosingElement2;
+      element = element.enclosingElement3;
     }
     var name = node.name;
     if (name is PrefixedIdentifier) {
@@ -271,12 +280,12 @@
   void visitConstructorDeclaration(ConstructorDeclaration node) {
     // For a default constructor, override the class name to be the declaration
     // itself rather than linking to the class.
-    var name = node.name;
-    if (name == null) {
+    var nameToken = node.name2;
+    if (nameToken == null) {
       computer._addRegionForNode(node.returnType, node.declaredElement);
     } else {
       node.returnType.accept(this);
-      name.accept(this);
+      computer._addRegionForToken(nameToken, node.declaredElement);
     }
     node.parameters.accept(this);
     node.initializers.accept(this);
@@ -330,7 +339,7 @@
 
   @override
   void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
-    computer._addRegionForNode(node.name, node.constructorElement);
+    computer._addRegionForToken(node.name2, node.constructorElement);
 
     var arguments = node.arguments;
     if (arguments != null) {
@@ -358,7 +367,7 @@
     final element = node.declaredElement;
     if (element is FieldFormalParameterElementImpl) {
       computer._addRegionForToken(node.thisKeyword, element.field);
-      computer._addRegionForNode(node.identifier, element.field);
+      computer._addRegionForToken(node.name, element.field);
     }
 
     node.type?.accept(this);
@@ -435,7 +444,7 @@
       RedirectingConstructorInvocation node) {
     Element? element = node.staticElement;
     if (element != null && element.isSynthetic) {
-      element = element.enclosingElement2;
+      element = element.enclosingElement3;
     }
     // add region
     computer._addRegionForToken(node.thisKeyword, element);
@@ -454,7 +463,7 @@
   void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     Element? element = node.staticElement;
     if (element != null && element.isSynthetic) {
-      element = element.enclosingElement2;
+      element = element.enclosingElement3;
     }
     // add region
     computer._addRegionForToken(node.superKeyword, element);
@@ -469,7 +478,7 @@
     if (element is SuperFormalParameterElementImpl) {
       var superParameter = element.superConstructorParameter;
       computer._addRegionForToken(node.superKeyword, superParameter);
-      computer._addRegionForNode(node.identifier, superParameter);
+      computer._addRegionForToken(node.name, superParameter);
     }
 
     node.type?.accept(this);
diff --git a/pkg/analyzer_plugin/lib/utilities/range_factory.dart b/pkg/analyzer_plugin/lib/utilities/range_factory.dart
index 5eed266..6a8789c 100644
--- a/pkg/analyzer_plugin/lib/utilities/range_factory.dart
+++ b/pkg/analyzer_plugin/lib/utilities/range_factory.dart
@@ -117,6 +117,11 @@
     return SourceRange(offset, length);
   }
 
+  /// Return a source range that covers the same range as the given [node].
+  SourceRange entity(SyntacticEntity node) {
+    return SourceRange(node.offset, node.length);
+  }
+
   /// Return a source range that covers the same range as the given [error].
   SourceRange error(AnalysisError error) {
     return SourceRange(error.offset, error.length);
diff --git a/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart b/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
index 3613ca6..ab696eb 100644
--- a/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
@@ -960,7 +960,7 @@
   }
 
   static String _executableNameStr(ExecutableElement executable) {
-    var executableEnclosing = executable.enclosingElement2;
+    var executableEnclosing = executable.enclosingElement3;
     if (executableEnclosing is CompilationUnitElement) {
       return executable.name;
     } else if (executable is ConstructorElement) {
diff --git a/pkg/analyzer_plugin/test/src/utilities/visitors/local_declaration_visitor_test.dart b/pkg/analyzer_plugin/test/src/utilities/visitors/local_declaration_visitor_test.dart
index f06dbb2..a9374fc 100644
--- a/pkg/analyzer_plugin/test/src/utilities/visitors/local_declaration_visitor_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/visitors/local_declaration_visitor_test.dart
@@ -4,6 +4,8 @@
 
 import 'package:analyzer/dart/analysis/utilities.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer_plugin/src/utilities/visitors/local_declaration_visitor.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -42,7 +44,11 @@
   TestVisitor(int offset) : super(offset);
 
   @override
-  void declaredLocalVar(SimpleIdentifier name, TypeAnnotation? type) {
+  void declaredLocalVar(
+    Token name,
+    TypeAnnotation? type,
+    LocalVariableElement declaredElement,
+  ) {
     expect(name, isNotNull);
   }
 }
diff --git a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
index 612c664..4d1de2b 100644
--- a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
@@ -325,7 +325,7 @@
       expect(element.parameters, isNull);
       expect(element.returnType, '_E1');
       // TODO(danrubel) determine why enum constant is not marked as deprecated
-      //analyzer.ClassElement classElement = engineElement.enclosingElement2;
+      //analyzer.ClassElement classElement = engineElement.enclosingElement3;
       //expect(classElement.isDeprecated, isTrue);
       expect(
           element.flags,
diff --git a/pkg/analyzer_plugin/test/utilities/range_factory_test.dart b/pkg/analyzer_plugin/test/utilities/range_factory_test.dart
index 28e0205..ad2aacb 100644
--- a/pkg/analyzer_plugin/test/utilities/range_factory_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/range_factory_test.dart
@@ -510,7 +510,7 @@
   Future<void> test_endEnd() async {
     await resolveTestCode('main() {}');
     var mainFunction = testUnit.declarations[0] as FunctionDeclaration;
-    var mainName = mainFunction.name;
+    var mainName = mainFunction.name2;
     var mainBody = mainFunction.functionExpression.body;
     expect(range.endEnd(mainName, mainBody), SourceRange(4, 5));
   }
@@ -518,14 +518,14 @@
   Future<void> test_endLength() async {
     await resolveTestCode('main() {}');
     var mainFunction = testUnit.declarations[0] as FunctionDeclaration;
-    var mainName = mainFunction.name;
+    var mainName = mainFunction.name2;
     expect(range.endLength(mainName, 3), SourceRange(4, 3));
   }
 
   Future<void> test_endStart() async {
     await resolveTestCode('main() {}');
     var mainFunction = testUnit.declarations[0] as FunctionDeclaration;
-    var mainName = mainFunction.name;
+    var mainName = mainFunction.name2;
     var mainBody = mainFunction.functionExpression.body;
     expect(range.endStart(mainName, mainBody), SourceRange(4, 3));
   }
@@ -542,17 +542,16 @@
 
   Future<void> test_node() async {
     await resolveTestCode('main() {}');
-    var mainFunction = testUnit.declarations[0] as FunctionDeclaration;
-    var mainName = mainFunction.name;
-    expect(range.node(mainName), SourceRange(0, 4));
+    var main = testUnit.declarations[0] as FunctionDeclaration;
+    expect(range.node(main), SourceRange(0, 9));
   }
 
   Future<void> test_nodes() async {
     await resolveTestCode(' main() {}');
     var mainFunction = testUnit.declarations[0] as FunctionDeclaration;
-    var mainName = mainFunction.name;
+    var mainParameters = mainFunction.functionExpression.parameters!;
     var mainBody = mainFunction.functionExpression.body;
-    expect(range.nodes([mainName, mainBody]), SourceRange(1, 9));
+    expect(range.nodes([mainParameters, mainBody]), SourceRange(5, 5));
   }
 
   Future<void> test_nodes_empty() async {
@@ -567,7 +566,7 @@
   Future<void> test_startEnd_nodeNode() async {
     await resolveTestCode(' main() {}');
     var mainFunction = testUnit.declarations[0] as FunctionDeclaration;
-    var mainName = mainFunction.name;
+    var mainName = mainFunction.name2;
     var mainBody = mainFunction.functionExpression.body;
     expect(range.startEnd(mainName, mainBody), SourceRange(1, 9));
   }
@@ -575,8 +574,8 @@
   Future<void> test_startLength_node() async {
     await resolveTestCode(' main() {}');
     var mainFunction = testUnit.declarations[0] as FunctionDeclaration;
-    var mainName = mainFunction.name;
-    expect(range.startLength(mainName, 10), SourceRange(1, 10));
+    var parameters = mainFunction.functionExpression.parameters!;
+    expect(range.startLength(parameters, 10), SourceRange(5, 10));
   }
 
   void test_startOffsetEndOffset() {
@@ -586,16 +585,16 @@
   Future<void> test_startStart_nodeNode() async {
     await resolveTestCode('main() {}');
     var mainFunction = testUnit.declarations[0] as FunctionDeclaration;
-    var mainName = mainFunction.name;
+    var parameters = mainFunction.functionExpression.parameters!;
     var mainBody = mainFunction.functionExpression.body;
-    expect(range.startStart(mainName, mainBody), SourceRange(0, 7));
+    expect(range.startStart(parameters, mainBody), SourceRange(4, 3));
   }
 
   Future<void> test_token() async {
     await resolveTestCode(' main() {}');
     var mainFunction = testUnit.declarations[0] as FunctionDeclaration;
-    var mainName = mainFunction.name;
-    expect(range.token(mainName.beginToken), SourceRange(1, 4));
+    var mainName = mainFunction.name2;
+    expect(range.token(mainName), SourceRange(1, 4));
   }
 
   Future<void> _deletionRange(String code,
diff --git a/pkg/frontend_server/bin/frontend_server_starter.dart b/pkg/frontend_server/bin/frontend_server_starter.dart
index 526c396..487f980 100644
--- a/pkg/frontend_server/bin/frontend_server_starter.dart
+++ b/pkg/frontend_server/bin/frontend_server_starter.dart
@@ -4,7 +4,7 @@
 import 'dart:async';
 import 'dart:io';
 
-import 'package:frontend_server/frontend_server.dart';
+import 'package:frontend_server/starter.dart';
 
 Future<Null> main(List<String> args) async {
   exitCode = await starter(args);
diff --git a/pkg/frontend_server/lib/frontend_server.dart b/pkg/frontend_server/lib/frontend_server.dart
index 9065163..4a2a525 100644
--- a/pkg/frontend_server/lib/frontend_server.dart
+++ b/pkg/frontend_server/lib/frontend_server.dart
@@ -7,7 +7,7 @@
 
 import 'dart:async';
 import 'dart:convert';
-import 'dart:io' show Directory, File, IOSink, stdin, stdout;
+import 'dart:io' show File, IOSink, stdout;
 import 'dart:typed_data' show BytesBuilder;
 
 import 'package:args/args.dart';
@@ -31,13 +31,11 @@
     show Component, loadComponentSourceFromBytes;
 import 'package:kernel/target/targets.dart' show targets, TargetFlags;
 import 'package:package_config/package_config.dart';
-import 'package:path/path.dart' as path;
 import 'package:usage/uuid/uuid.dart';
 
 import 'package:vm/incremental_compiler.dart' show IncrementalCompiler;
 import 'package:vm/kernel_front_end.dart';
 
-import 'src/binary_protocol.dart';
 import 'src/javascript_bundle.dart';
 import 'src/strong_components.dart';
 
@@ -205,6 +203,11 @@
   ..addFlag('print-incremental-dependencies',
       help: 'Print list of sources added and removed from compilation',
       defaultsTo: true)
+  ..addOption('resident-info-file-name',
+      help:
+          'Allowing for incremental compilation of changes when using the Dart CLI.'
+          ' Stores server information in this file for accessing later',
+      hide: true)
   ..addOption('verbosity',
       help: 'Sets the verbosity level of the compilation',
       defaultsTo: Verbosity.defaultValue,
@@ -1370,91 +1373,3 @@
     }
   });
 }
-
-/// Entry point for this module, that creates `_FrontendCompiler` instance and
-/// processes user input.
-/// `compiler` is an optional parameter so it can be replaced with mocked
-/// version for testing.
-Future<int> starter(
-  List<String> args, {
-  CompilerInterface compiler,
-  Stream<List<int>> input,
-  StringSink output,
-  IncrementalCompiler generator,
-  BinaryPrinterFactory binaryPrinterFactory,
-}) async {
-  ArgResults options;
-  try {
-    options = argParser.parse(args);
-  } catch (error) {
-    print('ERROR: $error\n');
-    print(usage);
-    return 1;
-  }
-
-  if (options['train']) {
-    if (options.rest.isEmpty) {
-      throw Exception('Must specify input.dart');
-    }
-
-    final String input = options.rest[0];
-    final String sdkRoot = options['sdk-root'];
-    final String platform = options['platform'];
-    final Directory temp =
-        Directory.systemTemp.createTempSync('train_frontend_server');
-    try {
-      final String outputTrainingDill = path.join(temp.path, 'app.dill');
-      final List<String> args = <String>[
-        '--incremental',
-        '--sdk-root=$sdkRoot',
-        '--output-dill=$outputTrainingDill',
-      ];
-      if (platform != null) {
-        args.add('--platform=${Uri.file(platform)}');
-      }
-      options = argParser.parse(args);
-      compiler ??=
-          FrontendCompiler(output, printerFactory: binaryPrinterFactory);
-
-      await compiler.compile(input, options, generator: generator);
-      compiler.acceptLastDelta();
-      await compiler.recompileDelta();
-      compiler.acceptLastDelta();
-      compiler.resetIncrementalCompiler();
-      await compiler.recompileDelta();
-      compiler.acceptLastDelta();
-      await compiler.recompileDelta();
-      compiler.acceptLastDelta();
-      return 0;
-    } finally {
-      temp.deleteSync(recursive: true);
-    }
-  }
-
-  final binaryProtocolAddressStr = options['binary-protocol-address'];
-  if (binaryProtocolAddressStr is String) {
-    runBinaryProtocol(binaryProtocolAddressStr);
-    return 0;
-  }
-
-  compiler ??= FrontendCompiler(output,
-      printerFactory: binaryPrinterFactory,
-      unsafePackageSerialization: options["unsafe-package-serialization"],
-      incrementalSerialization: options["incremental-serialization"],
-      useDebuggerModuleNames: options['debugger-module-names'],
-      emitDebugMetadata: options['experimental-emit-debug-metadata'],
-      emitDebugSymbols: options['emit-debug-symbols']);
-
-  if (options.rest.isNotEmpty) {
-    return await compiler.compile(options.rest[0], options,
-            generator: generator)
-        ? 0
-        : 254;
-  }
-
-  Completer<int> completer = Completer<int>();
-  var subscription = listenAndCompile(
-      compiler, input ?? stdin, options, completer,
-      generator: generator);
-  return completer.future..then((value) => subscription.cancel());
-}
diff --git a/pkg/frontend_server/lib/src/resident_frontend_server.dart b/pkg/frontend_server/lib/src/resident_frontend_server.dart
new file mode 100644
index 0000000..046fc0e
--- /dev/null
+++ b/pkg/frontend_server/lib/src/resident_frontend_server.dart
@@ -0,0 +1,385 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// @dart = 2.9
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io' show File, InternetAddress, ServerSocket, Socket;
+import 'dart:typed_data' show Uint8List;
+
+import 'package:args/args.dart';
+
+// front_end/src imports below that require lint `ignore_for_file`
+// are a temporary state of things until frontend team builds better api
+// that would replace api used below. This api was made private in
+// an effort to discourage further use.
+// ignore_for_file: implementation_imports
+import 'package:front_end/src/api_unstable/vm.dart';
+
+import '../frontend_server.dart';
+
+extension on DateTime {
+  /// Truncates by [amount]
+  DateTime floorTime(Duration amount) {
+    return DateTime.fromMillisecondsSinceEpoch(this.millisecondsSinceEpoch -
+        this.millisecondsSinceEpoch % amount.inMilliseconds);
+  }
+}
+
+enum _ResidentState {
+  WAITING_FOR_FIRST_COMPILE,
+  COMPILING,
+  WAITING_FOR_RECOMPILE,
+}
+
+/// A wrapper around the FrontendCompiler, along with all the state needed
+/// to perform incremental compilations
+///
+/// TODO: Fix the race condition that occurs when the ResidentCompiler returns
+///   a kernel file to the CLI and another compilation request is given before
+///   the VM is able to launch from the kernel that was returned in the first
+///   compile request. The ResidentCompiler will be in the state of waiting for
+///   a recompile request and will subsequently process the request and modify
+///   the kernel file. However, it should be waiting for the VM to finish
+///   launching itself from this kernel until it modifies the kernel.
+///   As far as I can tell this race also exists in the current CLI run
+///   command when using pub's precompile pipeline.
+///
+/// TODO Fix the race condition that occurs when the same entry point is
+///   compiled concurrently.
+class ResidentCompiler {
+  File _entryPoint;
+  File _outputDill;
+  File _currentPackage;
+  ArgResults _compileOptions;
+  FrontendCompiler _compiler;
+  DateTime _lastCompileStartTime =
+      DateTime.now().floorTime(Duration(seconds: 1));
+  _ResidentState _state = _ResidentState.WAITING_FOR_FIRST_COMPILE;
+  final StringBuffer _compilerOutput = StringBuffer();
+  final Set<Uri> trackedSources = <Uri>{};
+  final List<String> _formattedOutput = <String>[];
+
+  ResidentCompiler(this._entryPoint, this._outputDill, this._compileOptions) {
+    _compiler = FrontendCompiler(_compilerOutput);
+    updateState(_compileOptions);
+  }
+
+  /// The [ResidentCompiler] will use the [newOptions] for future compilation
+  /// requests.
+  void updateState(ArgResults newOptions) {
+    final packages = newOptions['packages'];
+    _compileOptions = newOptions;
+    _currentPackage = packages == null ? null : File(packages);
+    // Refresh the compiler's output for the next compile
+    _compilerOutput.clear();
+    _formattedOutput.clear();
+    _state = _ResidentState.WAITING_FOR_FIRST_COMPILE;
+  }
+
+  /// Determines whether the current compile options are outdated with respect
+  /// to the [newOptions]
+  ///
+  /// TODO: account for all compiler options. See vm/bin/kernel_service.dart:88
+  bool areOptionsOutdated(ArgResults newOptions) {
+    final packagesPath = newOptions['packages'];
+    return (packagesPath != null && _currentPackage == null) ||
+        (packagesPath == null && _currentPackage != null) ||
+        (_currentPackage != null && _currentPackage.path != packagesPath) ||
+        (_currentPackage != null &&
+            !_lastCompileStartTime.isAfter(_currentPackage
+                .statSync()
+                .modified
+                .floorTime(Duration(seconds: 1))));
+  }
+
+  /// Compiles the entry point that this ResidentCompiler is hooked to.
+  /// Will perform incremental compilations when possible.
+  /// If the options are outdated, must use updateState to get a correct
+  /// compile.
+  Future<String> compile() async {
+    var incremental = false;
+
+    // If this entrypoint was previously compiled on this compiler instance,
+    // check which source files need to be recompiled in the incremental
+    // compilation request. If no files have been modified, we can return
+    // the cached kernel. Otherwise, perform an incremental compilation.
+    if (_state == _ResidentState.WAITING_FOR_RECOMPILE) {
+      var invalidatedUris =
+          await _getSourceFilesToRecompile(_lastCompileStartTime);
+      // No changes to source files detected and cached kernel file exists
+      // If a kernel file is removed in between compilation requests,
+      // fall through to procude the kernel in recompileDelta.
+      if (invalidatedUris.isEmpty && _outputDill.existsSync()) {
+        return _encodeCompilerOutput(
+            _outputDill.path, _formattedOutput, _compiler.errors.length,
+            usingCachedKernel: true);
+      }
+      _state = _ResidentState.COMPILING;
+      incremental = true;
+      invalidatedUris
+          .forEach((invalidatedUri) => _compiler.invalidate(invalidatedUri));
+      _compiler.errors.clear();
+      _lastCompileStartTime = DateTime.now().floorTime(Duration(seconds: 1));
+      await _compiler.recompileDelta(entryPoint: _entryPoint.path);
+    } else {
+      _state = _ResidentState.COMPILING;
+      _lastCompileStartTime = DateTime.now().floorTime(Duration(seconds: 1));
+      _compiler.errors.clear();
+      await _compiler.compile(_entryPoint.path, _compileOptions);
+    }
+
+    _interpretCompilerOutput(LineSplitter()
+        .convert(_compilerOutput.toString())
+        .where((line) => line.isNotEmpty)
+        .toList());
+    _compilerOutput.clear();
+    // forces the compiler to produce complete kernel files on each
+    // request, even when incrementally compiled.
+    _compiler
+      ..acceptLastDelta()
+      ..resetIncrementalCompiler();
+    _state = _ResidentState.WAITING_FOR_RECOMPILE;
+
+    return _encodeCompilerOutput(
+        _outputDill.path, _formattedOutput, _compiler.errors.length,
+        incrementalCompile: incremental);
+  }
+
+  /// Reads the compiler's [outputLines] to keep track of which files
+  /// need to be tracked. Adds correctly ANSI formatted output to
+  /// the [_formattedOutput] list.
+  void _interpretCompilerOutput(List<String> outputLines) {
+    _formattedOutput.clear();
+    var outputLineIndex = 0;
+    var acceptingErrorsOrVerboseOutput = true;
+    final boundaryKey = outputLines[outputLineIndex]
+        .substring(outputLines[outputLineIndex++].indexOf(' ') + 1);
+    var line = outputLines[outputLineIndex++];
+
+    while (acceptingErrorsOrVerboseOutput || !line.startsWith(boundaryKey)) {
+      if (acceptingErrorsOrVerboseOutput) {
+        if (line == boundaryKey) {
+          acceptingErrorsOrVerboseOutput = false;
+        } else {
+          _formattedOutput.add(line);
+        }
+      } else {
+        final diffUri = line.substring(1);
+        if (line.startsWith('+')) {
+          trackedSources.add(Uri.parse(diffUri));
+        } else if (line.startsWith('-')) {
+          trackedSources.remove(Uri.parse(diffUri));
+        }
+      }
+      line = outputLines[outputLineIndex++];
+    }
+  }
+
+  /// Returns a list of uris that need to be recompiled, based on the
+  /// [lastkernelCompileTime] timestamp.
+  /// Due to Windows timestamp granularity, all timestamps are truncated by
+  /// the second. This has no effect on correctness but may result in more
+  /// files being marked as invalid than are strictly required.
+  Future<List<Uri>> _getSourceFilesToRecompile(
+      DateTime lastKernelCompileTime) async {
+    final sourcesToRecompile = <Uri>[];
+    for (Uri uri in trackedSources) {
+      final sourceModifiedTime = File(uri.toFilePath())
+          .statSync()
+          .modified
+          .floorTime(Duration(seconds: 1));
+      if (!lastKernelCompileTime.isAfter(sourceModifiedTime)) {
+        sourcesToRecompile.add(uri);
+      }
+    }
+    return sourcesToRecompile;
+  }
+
+  /// Encodes [outputDillPath] and any [formattedErrors] in JSON to
+  /// be sent over the socket.
+  static String _encodeCompilerOutput(
+    String outputDillPath,
+    List<String> formattedErrors,
+    int errorCount, {
+    bool usingCachedKernel = false,
+    bool incrementalCompile = false,
+  }) {
+    return jsonEncode(<String, Object>{
+      "success": errorCount == 0,
+      "errorCount": errorCount,
+      "compilerOutputLines": formattedErrors,
+      "output-dill": outputDillPath,
+      if (usingCachedKernel) "returnedStoredKernel": true, // used for testing
+      if (incrementalCompile) "incremental": true, // used for testing
+    });
+  }
+}
+
+/// Maintains [FrontendCompiler] instances for kernel compilations, meant to be
+/// used by the Dart CLI via sockets.
+///
+/// The [ResidentFrontendServer] manages compilation requests for VM targets
+/// between any number of dart entrypoints, and utilizes incremental
+/// compilation and existing kernel files for faster compile times.
+///
+/// Communication is handled on the socket set up by the
+/// residentListenAndCompile method.
+class ResidentFrontendServer {
+  static const _commandString = 'command';
+  static const _executableString = 'executable';
+  static const _packageString = 'packages';
+  static const _outputString = 'output-dill';
+  static const _shutdownString = 'shutdown';
+  static const _compilerLimit = 3;
+
+  static final shutdownCommand =
+      jsonEncode(<String, Object>{_commandString: _shutdownString});
+  static final _shutdownJsonResponse =
+      jsonEncode(<String, Object>{_shutdownString: true});
+  static final _sdkBinariesUri = computePlatformBinariesLocation();
+  static final _sdkUri = _sdkBinariesUri.resolve('../../');
+  static final _platformKernelUri =
+      _sdkBinariesUri.resolve('vm_platform_strong.dill');
+  static final Map<String, ResidentCompiler> compilers = {};
+
+  /// Takes in JSON [input] from the socket and compiles the request,
+  /// using incremental compilation if possible. Returns a JSON string to be
+  /// sent back to the client socket containing either an error message or the
+  /// kernel file to be used.
+  ///
+  /// If the command is compile, paths the source file, package_config.json,
+  /// and the output-dill file must be provided via "executable", "packages",
+  /// and "output-dill".
+  static Future<String> handleRequest(String input) async {
+    Map<String, dynamic> request;
+    try {
+      request = jsonDecode(input);
+    } on FormatException {
+      return _encodeErrorMessage('$input is not valid JSON.');
+    }
+
+    switch (request[_commandString]) {
+      case 'compile':
+        if (request[_executableString] == null ||
+            request[_outputString] == null) {
+          return _encodeErrorMessage(
+              'compilation requests must include an $_executableString and an $_outputString path.');
+        }
+        final executablePath = request[_executableString];
+        final cachedDillPath = request[_outputString];
+        final options = argParser.parse(<String>[
+          '--sdk-root=${_sdkUri.toFilePath()}',
+          '--incremental',
+          if (request.containsKey(_packageString))
+            '--packages=${request[_packageString]}',
+          '--platform=${_platformKernelUri.path}',
+          '--output-dill=$cachedDillPath',
+          '--target=vm',
+          '--filesystem-scheme',
+          'org-dartlang-root',
+          if (request['verbose'] == true) '--verbose',
+        ]);
+
+        var residentCompiler = compilers[executablePath];
+        if (residentCompiler == null) {
+          // Avoids using too much memory
+          if (compilers.length >= ResidentFrontendServer._compilerLimit) {
+            compilers.remove(compilers.keys.first);
+          }
+          residentCompiler = ResidentCompiler(
+              File(executablePath), File(cachedDillPath), options);
+          compilers[executablePath] = residentCompiler;
+        } else if (residentCompiler.areOptionsOutdated(options)) {
+          residentCompiler.updateState(options);
+        }
+
+        return await residentCompiler.compile();
+      case 'shutdown':
+        return _shutdownJsonResponse;
+      default:
+        return _encodeErrorMessage(
+            'Unsupported command: ${request[_commandString]}.');
+    }
+  }
+
+  /// Encodes the [message] in JSON to be sent over the socket.
+  static String _encodeErrorMessage(String message) =>
+      jsonEncode(<String, Object>{"success": false, "errorMessage": message});
+
+  /// Used to create compile requests for the ResidentFrontendServer.
+  /// Returns a JSON string that the resident compiler will be able to
+  /// interpret.
+  static String createCompileJSON(
+      {String executable,
+      String packages,
+      String outputDill,
+      bool verbose = false}) {
+    return jsonEncode(<String, Object>{
+      "command": "compile",
+      "executable": executable,
+      if (packages != null) "packages": packages,
+      "output-dill": outputDill,
+      "verbose": verbose,
+    });
+  }
+}
+
+/// Sends the JSON string [request] to the resident frontend server
+/// and returns server's response in JSON
+///
+/// Clients must use this function when wanting to interact with a
+/// ResidentFrontendServer instance.
+Future<Map<String, dynamic>> sendAndReceiveResponse(
+    InternetAddress address, int port, String request) async {
+  try {
+    final client = await Socket.connect(address, port);
+    client.write(request);
+    final data = await client.first;
+    client.destroy();
+    return jsonDecode(String.fromCharCodes(data));
+  } catch (e) {
+    return <String, Object>{"success": false, "errorMessage": e.toString()};
+  }
+}
+
+/// Listens for compilation commands from socket connections on the
+/// provided [address] and [port].
+Future<StreamSubscription<Socket>> residentListenAndCompile(
+    InternetAddress address, int port, File serverInfoFile) async {
+  ServerSocket server;
+  try {
+    // TODO: have server shut itself off after period of inactivity
+    server = await ServerSocket.bind(address, port);
+    serverInfoFile
+      ..writeAsStringSync(
+          'address:${server.address.address} port:${server.port}');
+  } catch (e) {
+    print('Error: $e\n');
+    return null;
+  }
+  print(
+      'Resident Frontend Compiler is listening at ${server.address.address}:${server.port}');
+  return server.listen((client) {
+    client.listen((Uint8List data) async {
+      String result = await ResidentFrontendServer.handleRequest(
+          String.fromCharCodes(data));
+      client.write(result);
+      if (result == ResidentFrontendServer._shutdownJsonResponse) {
+        if (serverInfoFile.existsSync()) {
+          serverInfoFile.deleteSync();
+        }
+        await server.close();
+      }
+    }, onError: (error) {
+      client.close();
+    }, onDone: () {
+      client.close();
+    });
+  }, onError: (_) {
+    if (serverInfoFile.existsSync()) {
+      serverInfoFile.deleteSync();
+    }
+  });
+}
diff --git a/pkg/frontend_server/lib/starter.dart b/pkg/frontend_server/lib/starter.dart
new file mode 100644
index 0000000..e88a7dd
--- /dev/null
+++ b/pkg/frontend_server/lib/starter.dart
@@ -0,0 +1,111 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+// @dart = 2.9
+import 'dart:async';
+import 'dart:io' show Directory, File, InternetAddress, stdin;
+
+import 'package:args/args.dart';
+import 'package:path/path.dart' as path;
+import 'package:vm/incremental_compiler.dart' show IncrementalCompiler;
+
+import 'frontend_server.dart';
+import 'src/binary_protocol.dart';
+import 'src/resident_frontend_server.dart';
+
+/// Entry point for this module, that creates either a `_FrontendCompiler`
+/// instance or a `ResidentFrontendServer` instance and
+/// processes user input.
+/// `compiler` is an optional parameter so it can be replaced with mocked
+/// version for testing.
+Future<int> starter(
+  List<String> args, {
+  CompilerInterface compiler,
+  Stream<List<int>> input,
+  StringSink output,
+  IncrementalCompiler generator,
+  BinaryPrinterFactory binaryPrinterFactory,
+}) async {
+  ArgResults options;
+  try {
+    options = argParser.parse(args);
+  } catch (error) {
+    print('ERROR: $error\n');
+    print(usage);
+    return 1;
+  }
+  if (options['resident-info-file-name'] != null) {
+    var serverSubscription = await residentListenAndCompile(
+        InternetAddress.loopbackIPv4,
+        0,
+        File(options['resident-info-file-name']));
+    return serverSubscription == null ? 1 : 0;
+  }
+
+  if (options['train']) {
+    if (options.rest.isEmpty) {
+      throw Exception('Must specify input.dart');
+    }
+
+    final String input = options.rest[0];
+    final String sdkRoot = options['sdk-root'];
+    final String platform = options['platform'];
+    final Directory temp =
+        Directory.systemTemp.createTempSync('train_frontend_server');
+    try {
+      final String outputTrainingDill = path.join(temp.path, 'app.dill');
+      final List<String> args = <String>[
+        '--incremental',
+        '--sdk-root=$sdkRoot',
+        '--output-dill=$outputTrainingDill',
+      ];
+      if (platform != null) {
+        args.add('--platform=${Uri.file(platform)}');
+      }
+      options = argParser.parse(args);
+      compiler ??=
+          FrontendCompiler(output, printerFactory: binaryPrinterFactory);
+
+      await compiler.compile(input, options, generator: generator);
+      compiler.acceptLastDelta();
+      await compiler.recompileDelta();
+      compiler.acceptLastDelta();
+      compiler.resetIncrementalCompiler();
+      await compiler.recompileDelta();
+      compiler.acceptLastDelta();
+      await compiler.recompileDelta();
+      compiler.acceptLastDelta();
+      return 0;
+    } finally {
+      temp.deleteSync(recursive: true);
+    }
+  }
+
+  final binaryProtocolAddressStr = options['binary-protocol-address'];
+  if (binaryProtocolAddressStr is String) {
+    runBinaryProtocol(binaryProtocolAddressStr);
+    return 0;
+  }
+
+  compiler ??= FrontendCompiler(output,
+      printerFactory: binaryPrinterFactory,
+      unsafePackageSerialization: options["unsafe-package-serialization"],
+      incrementalSerialization: options["incremental-serialization"],
+      useDebuggerModuleNames: options['debugger-module-names'],
+      emitDebugMetadata: options['experimental-emit-debug-metadata'],
+      emitDebugSymbols: options['emit-debug-symbols']);
+
+  if (options.rest.isNotEmpty) {
+    return await compiler.compile(options.rest[0], options,
+            generator: generator)
+        ? 0
+        : 254;
+  }
+
+  Completer<int> completer = Completer<int>();
+  var subscription = listenAndCompile(
+      compiler, input ?? stdin, options, completer,
+      generator: generator);
+  return completer.future..then((value) => subscription.cancel());
+}
diff --git a/pkg/frontend_server/test/frontend_server_flutter.dart b/pkg/frontend_server/test/frontend_server_flutter.dart
index fee26f6..3423d16 100644
--- a/pkg/frontend_server/test/frontend_server_flutter.dart
+++ b/pkg/frontend_server/test/frontend_server_flutter.dart
@@ -1,3 +1,7 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
 // @dart = 2.9
 import 'dart:async' show StreamController;
 import 'dart:convert' show utf8, LineSplitter;
@@ -13,7 +17,7 @@
 import 'package:front_end/src/api_unstable/vm.dart'
     show CompilerOptions, NnbdMode, StandardFileSystem;
 
-import 'package:frontend_server/frontend_server.dart';
+import 'package:frontend_server/starter.dart';
 
 main(List<String> args) async {
   String flutterDir;
diff --git a/pkg/frontend_server/test/frontend_server_test.dart b/pkg/frontend_server/test/frontend_server_test.dart
index 9cc623d..5bac7ef 100644
--- a/pkg/frontend_server/test/frontend_server_test.dart
+++ b/pkg/frontend_server/test/frontend_server_test.dart
@@ -1,3 +1,7 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
 // @dart = 2.9
 // ignore_for_file: empty_catches
 
@@ -10,6 +14,7 @@
 import 'package:_fe_analyzer_shared/src/macros/compiler/request_channel.dart';
 import 'package:front_end/src/api_unstable/vm.dart';
 import 'package:frontend_server/frontend_server.dart';
+import 'package:frontend_server/starter.dart';
 import 'package:kernel/ast.dart' show Component;
 import 'package:kernel/binary/ast_to_binary.dart';
 import 'package:kernel/kernel.dart' show loadComponentFromBinary;
diff --git a/pkg/frontend_server/test/src/resident_frontend_server_test.dart b/pkg/frontend_server/test/src/resident_frontend_server_test.dart
new file mode 100644
index 0000000..bf96a29
--- /dev/null
+++ b/pkg/frontend_server/test/src/resident_frontend_server_test.dart
@@ -0,0 +1,526 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+// @dart = 2.9
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:frontend_server/starter.dart';
+import 'package:frontend_server/src/resident_frontend_server.dart';
+import 'package:path/path.dart' as path;
+import 'package:test/test.dart';
+
+void main() async {
+  // Files are considered to be modified if the modification timestamp is
+  // during the same second of the last compile time due to the
+  // granularity of file stat on windows.
+  // Waiting for this number of milliseconds guarantees that the files in
+  // the unit tests will not be counted as modified.
+  const STAT_GRANULARITY = 1100;
+
+  group('Resident Frontend Server: invalid input: ', () {
+    test('no command given', () async {
+      final jsonResponse = await ResidentFrontendServer.handleRequest(
+          jsonEncode(<String, Object>{"no": "command"}));
+      expect(
+          jsonResponse,
+          equals(jsonEncode(<String, Object>{
+            "success": false,
+            "errorMessage": "Unsupported command: null."
+          })));
+    });
+
+    test('invalid command', () async {
+      final jsonResponse = await ResidentFrontendServer.handleRequest(
+          jsonEncode(<String, Object>{"command": "not a command"}));
+      expect(
+          jsonResponse,
+          equals(jsonEncode(<String, Object>{
+            "success": false,
+            "errorMessage": "Unsupported command: not a command."
+          })));
+    });
+
+    test('not a JSON request', () async {
+      final jsonResponse = await ResidentFrontendServer.handleRequest("hello");
+      expect(
+          jsonResponse,
+          equals(jsonEncode(<String, Object>{
+            "success": false,
+            "errorMessage": "hello is not valid JSON."
+          })));
+    });
+
+    test('missing files for compile command', () async {
+      final jsonResponse = await ResidentFrontendServer.handleRequest(
+          jsonEncode(<String, Object>{"command": "compile"}));
+      expect(
+          jsonResponse,
+          equals(jsonEncode(<String, Object>{
+            "success": false,
+            "errorMessage":
+                "compilation requests must include an executable and an output-dill path."
+          })));
+    });
+  });
+
+  group('Resident Frontend Server: compile tests: ', () {
+    Directory d;
+    File executable, package, cachedDill;
+
+    setUp(() async {
+      d = Directory.systemTemp.createTempSync();
+      executable = File(path.join(d.path, 'src1.dart'))
+        ..createSync()
+        ..writeAsStringSync('void main() {print("hello " "there");}');
+      package = File(path.join(d.path, '.dart_tool', 'package_config.json'))
+        ..createSync(recursive: true)
+        ..writeAsStringSync('''
+  {
+    "configVersion": 2,
+    "packages": [
+      {
+        "name": "hello",
+        "rootUri": "../",
+        "packageUri": "./"
+      }
+    ]
+  }
+  ''');
+      cachedDill = File(path.join(d.path, 'src1.dart.dill'));
+    });
+
+    tearDown(() async {
+      d.delete(recursive: true);
+      ResidentFrontendServer.compilers.clear();
+    });
+
+    test('initial compile, basic', () async {
+      final compileResult = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+                  executable: executable.path,
+                  packages: package.path,
+                  outputDill: cachedDill.path)));
+
+      expect(compileResult['success'], true);
+      expect(compileResult['errorCount'], 0);
+      expect(compileResult['output-dill'], equals(cachedDill.path));
+    });
+
+    test('no package_config.json provided', () async {
+      final compileResult = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+                  executable: executable.path, outputDill: cachedDill.path)));
+
+      expect(compileResult['success'], true);
+      expect(compileResult['errorCount'], 0);
+      expect(compileResult['output-dill'], equals(cachedDill.path));
+    });
+
+    test('incremental compilation', () async {
+      await Future.delayed(Duration(milliseconds: STAT_GRANULARITY));
+      final compileResults1 = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+        executable: executable.path,
+        packages: package.path,
+        outputDill: cachedDill.path,
+      )));
+      executable.writeAsStringSync(
+          executable.readAsStringSync().replaceFirst('there', 'world'));
+
+      final compileResults2 = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+        executable: executable.path,
+        packages: package.path,
+        outputDill: cachedDill.path,
+      )));
+
+      expect(compileResults1['success'], true);
+      expect(compileResults1['errorCount'],
+          allOf(0, equals(compileResults2['errorCount'])));
+      expect(compileResults2['output-dill'],
+          equals(compileResults1['output-dill']));
+      expect(compileResults2['incremental'], true);
+      expect(
+          ResidentFrontendServer
+              .compilers[executable.path].trackedSources.first,
+          equals(Uri.file(executable.path)));
+      expect(
+          ResidentFrontendServer
+              .compilers[executable.path].trackedSources.length,
+          1);
+    });
+
+    test(
+        'compiling twice with no modifications returns cached kernel without invoking compiler',
+        () async {
+      await Future.delayed(Duration(milliseconds: STAT_GRANULARITY));
+      final compileResults1 = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+                  executable: executable.path,
+                  packages: package.path,
+                  outputDill: cachedDill.path)));
+      final compileResults2 = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+                  executable: executable.path,
+                  packages: package.path,
+                  outputDill: cachedDill.path)));
+
+      expect(compileResults1['errorCount'],
+          allOf(0, equals(compileResults2['errorCount'])));
+      expect(compileResults1['output-dill'],
+          equals(compileResults2['output-dill']));
+      expect(compileResults2['returnedStoredKernel'], true);
+      expect(ResidentFrontendServer.compilers.length, 1);
+    });
+
+    test('switch entrypoints gracefully', () async {
+      final executable2 = File(path.join(d.path, 'src2.dart'))
+        ..writeAsStringSync('void main() {}');
+      final entryPointDill = File(path.join(d.path, 'src2.dart.dill'));
+
+      final compileResults1 = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+                  executable: executable.path,
+                  packages: package.path,
+                  outputDill: cachedDill.path)));
+      final compileResults2 = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+                  executable: executable2.path,
+                  packages: package.path,
+                  outputDill: entryPointDill.path)));
+
+      expect(compileResults1['success'],
+          allOf(true, equals(compileResults2['success'])));
+      expect(
+          ResidentFrontendServer
+              .compilers[executable.path].trackedSources.length,
+          1);
+      expect(
+          ResidentFrontendServer
+              .compilers[executable.path].trackedSources.first,
+          equals(Uri.file(executable.path)));
+      expect(
+          ResidentFrontendServer
+              .compilers[executable2.path].trackedSources.length,
+          1);
+      expect(
+          ResidentFrontendServer
+              .compilers[executable2.path].trackedSources.first,
+          equals(Uri.file(executable2.path)));
+      expect(ResidentFrontendServer.compilers.length, 2);
+    });
+
+    test('Cached kernel is removed between compilation requests', () async {
+      await Future.delayed(Duration(milliseconds: STAT_GRANULARITY));
+      final compileResults1 = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+                  executable: executable.path,
+                  packages: package.path,
+                  outputDill: cachedDill.path)));
+
+      executable.writeAsStringSync(
+          executable.readAsStringSync().replaceFirst('there', 'world'));
+      cachedDill.deleteSync();
+      expect(cachedDill.existsSync(), false);
+
+      final compileResults2 = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+                  executable: executable.path,
+                  packages: package.path,
+                  outputDill: cachedDill.path)));
+
+      expect(compileResults1['success'], true);
+      expect(compileResults1['errorCount'],
+          allOf(equals(compileResults2['errorCount']), 0));
+      expect(compileResults2['returnedStoredKernel'], null);
+      expect(compileResults2['incremental'], true);
+      expect(cachedDill.existsSync(), true);
+      expect(ResidentFrontendServer.compilers.length, 1);
+    });
+
+    test('maintains tracked sources', () async {
+      await Future.delayed(Duration(milliseconds: STAT_GRANULARITY));
+      final executable2 = File(path.join(d.path, 'src2.dart'))
+        ..createSync()
+        ..writeAsStringSync('''
+            import 'src3.dart';
+            void main() {}''');
+      final executable3 = File(path.join(d.path, 'src3.dart'))
+        ..createSync()
+        ..writeAsStringSync('''
+            void fn() {}''');
+
+      // adding or removing package_config.json while maintaining the same entrypoint
+      // should not alter tracked sources
+      await ResidentFrontendServer.handleRequest(
+          ResidentFrontendServer.createCompileJSON(
+              executable: executable.path, outputDill: cachedDill.path));
+      await ResidentFrontendServer.handleRequest(
+          ResidentFrontendServer.createCompileJSON(
+              executable: executable.path,
+              packages: package.path,
+              outputDill: cachedDill.path));
+      final compileResult1 = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+                  executable: executable.path, outputDill: cachedDill.path)));
+
+      expect(compileResult1['success'], true);
+      expect(compileResult1['returnedStoredKernel'], null);
+      expect(compileResult1['incremental'], null);
+      expect(
+          ResidentFrontendServer
+              .compilers[executable.path].trackedSources.length,
+          1);
+      expect(
+          ResidentFrontendServer
+              .compilers[executable.path].trackedSources.first,
+          equals(Uri.file(executable.path)));
+
+      // switching entrypoints, packages, and modifying packages
+      await ResidentFrontendServer.handleRequest(
+          ResidentFrontendServer.createCompileJSON(
+              executable: executable2.path, outputDill: cachedDill.path));
+      await ResidentFrontendServer.handleRequest(
+          ResidentFrontendServer.createCompileJSON(
+              executable: executable2.path,
+              packages: package.path,
+              outputDill: cachedDill.path));
+
+      package.writeAsStringSync(package.readAsStringSync());
+      // Forces package to be behind the next computed kernel by 1 second
+      // so that the final compilation will be incremental
+      await Future.delayed(Duration(milliseconds: STAT_GRANULARITY));
+
+      final compileResult2 = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+                  executable: executable2.path,
+                  packages: package.path,
+                  outputDill: cachedDill.path)));
+      expect(compileResult2['success'], true);
+      expect(compileResult2['incremental'], null);
+      expect(compileResult2['returnedStoredKernel'], null);
+      expect(
+          ResidentFrontendServer
+              .compilers[executable2.path].trackedSources.length,
+          greaterThanOrEqualTo(2));
+      expect(
+          ResidentFrontendServer.compilers[executable2.path].trackedSources,
+          containsAll(
+              <Uri>{Uri.file(executable2.path), Uri.file(executable3.path)}));
+
+      // remove a source
+      executable2.writeAsStringSync('void main() {}');
+      final compileResult3 = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+                  executable: executable2.path,
+                  packages: package.path,
+                  outputDill: cachedDill.path)));
+      expect(compileResult3['success'], true);
+      expect(compileResult3['incremental'], true);
+      expect(
+          ResidentFrontendServer
+              .compilers[executable2.path].trackedSources.length,
+          greaterThanOrEqualTo(1));
+      expect(ResidentFrontendServer.compilers[executable2.path].trackedSources,
+          containsAll(<Uri>{Uri.file(executable2.path)}));
+    });
+
+    test('continues to work after compiler error is produced', () async {
+      final originalContent = executable.readAsStringSync();
+      final newContent = originalContent.replaceAll(';', '@');
+      await Future.delayed(Duration(milliseconds: STAT_GRANULARITY));
+
+      executable.writeAsStringSync(newContent);
+      final compileResults1 = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+                  executable: executable.path,
+                  packages: package.path,
+                  outputDill: cachedDill.path)));
+
+      executable.writeAsStringSync(originalContent);
+      final compileResults2 = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+                  executable: executable.path,
+                  packages: package.path,
+                  outputDill: cachedDill.path)));
+
+      expect(compileResults1['success'], false);
+      expect(compileResults1['errorCount'], greaterThan(1));
+      expect(compileResults2['success'], true);
+      expect(compileResults2['errorCount'], 0);
+      expect(compileResults2['incremental'], true);
+      expect(
+          ResidentFrontendServer
+              .compilers[executable.path].trackedSources.length,
+          1);
+      expect(
+          ResidentFrontendServer
+              .compilers[executable.path].trackedSources.first,
+          equals(Uri.file(executable.path)));
+    });
+
+    test('using cached kernel maintains error messages', () async {
+      final originalContent = executable.readAsStringSync();
+      executable.writeAsStringSync(originalContent.replaceFirst(';', ''));
+      await Future.delayed(Duration(milliseconds: STAT_GRANULARITY));
+
+      final compileResults1 = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+        executable: executable.path,
+        packages: package.path,
+        outputDill: cachedDill.path,
+      )));
+      final compileResults2 = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+        executable: executable.path,
+        packages: package.path,
+        outputDill: cachedDill.path,
+      )));
+      executable.writeAsStringSync(originalContent);
+      final compileResults3 = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+        executable: executable.path,
+        packages: package.path,
+        outputDill: cachedDill.path,
+      )));
+
+      expect(compileResults2['returnedStoredKernel'], true);
+      expect(compileResults1['errorCount'],
+          allOf(1, equals(compileResults2['errorCount'])));
+      expect(
+          compileResults2['compilerOutputLines'] as List<dynamic>,
+          containsAllInOrder(
+              compileResults1['compilerOutputLines'] as List<dynamic>));
+      expect(compileResults3['errorCount'], 0);
+      expect(compileResults3['incremental'], true);
+    });
+
+    test('enforces compiler limit', () async {
+      final executable2 = File(path.join(d.path, 'src2.dart'))
+        ..createSync()
+        ..writeAsStringSync('''
+            import 'src3.dart';
+            void main() {}''');
+      final executable3 = File(path.join(d.path, 'src3.dart'))
+        ..createSync()
+        ..writeAsStringSync('''
+            void main() {}''');
+      final executable4 = File(path.join(d.path, 'src4.dart'))
+        ..createSync()
+        ..writeAsStringSync('''
+            void main() {}''');
+      final compileResults1 = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+                  executable: executable.path,
+                  packages: package.path,
+                  outputDill: cachedDill.path)));
+      final compileResults2 = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+                  executable: executable2.path,
+                  packages: package.path,
+                  outputDill: cachedDill.path)));
+      final compileResults3 = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+                  executable: executable3.path,
+                  packages: package.path,
+                  outputDill: cachedDill.path)));
+      final compileResults4 = jsonDecode(
+          await ResidentFrontendServer.handleRequest(
+              ResidentFrontendServer.createCompileJSON(
+                  executable: executable4.path,
+                  packages: package.path,
+                  outputDill: cachedDill.path)));
+      expect(
+          compileResults1['success'],
+          allOf(
+              true,
+              equals(compileResults2['success']),
+              equals(compileResults3['success']),
+              equals(compileResults4['success'])));
+      expect(ResidentFrontendServer.compilers.length, 3);
+      expect(
+          ResidentFrontendServer.compilers.containsKey(executable4.path), true);
+    });
+  });
+
+  group('Resident Frontend Server: socket tests: ', () {
+    Directory d;
+    File serverInfo;
+
+    setUp(() {
+      d = Directory.systemTemp.createTempSync();
+      serverInfo = File(path.join(d.path, 'info.txt'));
+    });
+    tearDown(() {
+      d.deleteSync(recursive: true);
+    });
+
+    test('ServerSocket fails to bind', () async {
+      final result = await residentListenAndCompile(
+          InternetAddress.loopbackIPv4, -1, serverInfo);
+
+      expect(serverInfo.existsSync(), false);
+      expect(result, null);
+    });
+
+    test('socket passes messages properly and shutsdown properly', () async {
+      await residentListenAndCompile(
+          InternetAddress.loopbackIPv4, 0, serverInfo);
+
+      expect(serverInfo.existsSync(), true);
+      final info = serverInfo.readAsStringSync();
+      final address = InternetAddress(
+          info.substring(info.indexOf(':') + 1, info.indexOf(' ')));
+      final port = int.parse(info.substring(info.lastIndexOf(':') + 1));
+
+      final shutdownResult = await sendAndReceiveResponse(
+          address, port, ResidentFrontendServer.shutdownCommand);
+
+      expect(shutdownResult, equals(<String, dynamic>{"shutdown": true}));
+      expect(serverInfo.existsSync(), false);
+    });
+
+    test('resident server starter', () async {
+      final returnValue =
+          starter(['--resident-info-file-name=${serverInfo.path}']);
+      expect(await returnValue, 0);
+      expect(serverInfo.existsSync(), true);
+      final info = serverInfo.readAsStringSync();
+      final address = InternetAddress(
+          info.substring(info.indexOf(':') + 1, info.indexOf(' ')));
+      final port = int.parse(info.substring(info.lastIndexOf(':') + 1));
+
+      var result = await sendAndReceiveResponse(
+          address, port, ResidentFrontendServer.shutdownCommand);
+      expect(result, equals(<String, dynamic>{"shutdown": true}));
+      expect(serverInfo.existsSync(), false);
+
+      result = await sendAndReceiveResponse(
+          address, port, ResidentFrontendServer.shutdownCommand);
+      expect(result['errorMessage'], contains('SocketException'));
+    });
+  });
+}
diff --git a/pkg/nnbd_migration/lib/instrumentation.dart b/pkg/nnbd_migration/lib/instrumentation.dart
index 62ecd1f..2807b4b4 100644
--- a/pkg/nnbd_migration/lib/instrumentation.dart
+++ b/pkg/nnbd_migration/lib/instrumentation.dart
@@ -37,7 +37,7 @@
   factory CodeReference.fromElement(Element element) {
     var unitElement = element.thisOrAncestorOfType<CompilationUnitElement>();
     if (unitElement == null) {
-      var enclosingElement = element.enclosingElement2;
+      var enclosingElement = element.enclosingElement3;
       if (enclosingElement is LibraryElement) {
         unitElement = enclosingElement.definingCompilationUnit;
       } else {
@@ -76,7 +76,7 @@
       if (elementName != null) {
         parts.add(elementName);
       }
-      element = element.enclosingElement2;
+      element = element.enclosingElement3;
     }
     if (parts.isEmpty) return null;
     return parts.reversed.join('.');
diff --git a/pkg/nnbd_migration/lib/src/decorated_class_hierarchy.dart b/pkg/nnbd_migration/lib/src/decorated_class_hierarchy.dart
index 71c8a70..519bd12 100644
--- a/pkg/nnbd_migration/lib/src/decorated_class_hierarchy.dart
+++ b/pkg/nnbd_migration/lib/src/decorated_class_hierarchy.dart
@@ -52,7 +52,7 @@
   /// because the relationship between a class and its superclass is not
   /// nullable.
   DecoratedType getDecoratedSupertype(
-      ClassElement class_, ClassElement superclass) {
+      ClassElement class_, InterfaceElement superclass) {
     assert(!(class_.library.isDartCore && class_.name == 'Null'));
     if (superclass.typeParameters.isEmpty) {
       return DecoratedType(
diff --git a/pkg/nnbd_migration/lib/src/decorated_type.dart b/pkg/nnbd_migration/lib/src/decorated_type.dart
index 33556b2..12b3f4d 100644
--- a/pkg/nnbd_migration/lib/src/decorated_type.dart
+++ b/pkg/nnbd_migration/lib/src/decorated_type.dart
@@ -184,8 +184,8 @@
     // We'll be storing the type parameter bounds in
     // [_decoratedTypeParameterBounds] so the type parameter needs to have an
     // enclosing element of `null`.
-    assert(parameter.enclosingElement2 == null,
-        '$parameter should not have parent ${parameter.enclosingElement2}');
+    assert(parameter.enclosingElement3 == null,
+        '$parameter should not have parent ${parameter.enclosingElement3}');
   }
 
   /// If `this` represents an interface type, returns the substitution necessary
@@ -415,7 +415,7 @@
             Map<TypeParameterElement, DecoratedType>.from(substitution);
         for (int i = 0; i < typeFormals.length; i++) {
           // Check if it's a fresh type variable.
-          if (undecoratedResult.typeFormals[i].enclosingElement2 == null) {
+          if (undecoratedResult.typeFormals[i].enclosingElement3 == null) {
             substitution[typeFormals[i]] =
                 DecoratedType._forTypeParameterSubstitution(
                     undecoratedResult.typeFormals[i]);
@@ -542,7 +542,7 @@
   final _parentedBounds = <TypeParameterElement, DecoratedType?>{};
 
   DecoratedType? get(TypeParameterElement element) {
-    if (element.enclosingElement2 == null) {
+    if (element.enclosingElement3 == null) {
       return _orphanBounds[element];
     } else {
       return _parentedBounds[element];
@@ -550,7 +550,7 @@
   }
 
   void put(TypeParameterElement element, DecoratedType? bounds) {
-    if (element.enclosingElement2 == null) {
+    if (element.enclosingElement3 == null) {
       _orphanBounds[element] = bounds;
     } else {
       _parentedBounds[element] = bounds;
diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart
index 6ce51d2..766c3fa 100644
--- a/pkg/nnbd_migration/lib/src/edge_builder.dart
+++ b/pkg/nnbd_migration/lib/src/edge_builder.dart
@@ -11,6 +11,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/dart/element/type_system.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/member.dart';
@@ -279,7 +280,7 @@
     Map<TypeParameterElement, DecoratedType?>? substitution;
     Element? baseElement = element.declaration;
     if (targetType != null) {
-      var enclosingElement = baseElement!.enclosingElement2;
+      var enclosingElement = baseElement!.enclosingElement3;
       if (enclosingElement is ClassElement) {
         if (targetType.type.explicitBound is InterfaceType &&
             enclosingElement.typeParameters.isNotEmpty) {
@@ -473,8 +474,8 @@
       var assignee =
           getWriteOrReadElement(node.leftHandSide as SimpleIdentifier)!;
       var enclosingElementOfCurrentFunction =
-          _currentFunctionExpression!.declaredElement!.enclosingElement2;
-      if (enclosingElementOfCurrentFunction == assignee.enclosingElement2) {
+          _currentFunctionExpression!.declaredElement!.enclosingElement3;
+      if (enclosingElementOfCurrentFunction == assignee.enclosingElement3) {
         // [node]'s enclosing function is a function expression passed directly
         // to a call to the test package's `setUp` function, and [node] is an
         // assignment to a variable declared in the same scope as the call to
@@ -840,7 +841,7 @@
         // Nothing to do; assume the implicit default value of `null` will never
         // be reached.
       } else {
-        var enclosingElement = declaredElement.enclosingElement2;
+        var enclosingElement = declaredElement.enclosingElement3;
         if (enclosingElement is ConstructorElement &&
             enclosingElement.isFactory &&
             enclosingElement.redirectedConstructor != null) {
@@ -1206,7 +1207,7 @@
   DecoratedType visitInstanceCreationExpression(
       InstanceCreationExpression node) {
     var callee = node.constructorName.staticElement!;
-    var typeParameters = callee.enclosingElement2.typeParameters;
+    var typeParameters = callee.enclosingElement3.typeParameters;
     Iterable<DartType?> typeArgumentTypes;
     List<DecoratedType> decoratedTypeArguments;
     var typeArguments = node.constructorName.type.typeArguments;
@@ -1387,7 +1388,7 @@
       } else {
         targetType = _handleTarget(target, node.methodName.name, callee);
       }
-    } else if (target == null && callee!.enclosingElement2 is ClassElement) {
+    } else if (target == null && callee!.enclosingElement3 is ClassElement) {
       targetType = _thisOrSuper(node);
       _checkThisNotNull(targetType, node);
     }
@@ -1794,13 +1795,13 @@
     } else if (staticElement is FunctionElement ||
         staticElement is MethodElement ||
         staticElement is ConstructorElement) {
-      if (staticElement!.enclosingElement2 is ClassElement) {
+      if (staticElement!.enclosingElement3 is ClassElement) {
         targetType = _thisOrSuper(node);
       }
       result =
           getOrComputeElementType(node, staticElement, targetType: targetType);
     } else if (staticElement is PropertyAccessorElement) {
-      if (staticElement.enclosingElement2 is ClassElement) {
+      if (staticElement.enclosingElement3 is ClassElement) {
         targetType = _thisOrSuper(node);
       }
       var elementType =
@@ -1815,8 +1816,8 @@
     } else if (staticElement == null) {
       assert(node.toString() == 'void', "${node.toString()} != 'void'");
       result = _makeNullableVoidType(node);
-    } else if (staticElement.enclosingElement2 is ClassElement &&
-        (staticElement.enclosingElement2 as ClassElement).isEnum) {
+    } else if (staticElement.enclosingElement3 is ClassElement &&
+        staticElement.enclosingElement3 is EnumElement) {
       result = getOrComputeElementType(node, staticElement);
     } else {
       // TODO(paulberry)
@@ -1882,7 +1883,7 @@
     var nullabilityNode = NullabilityNode.forInferredType(target);
     var class_ = node.thisOrAncestorOfType<ClassDeclaration>()!;
     var decoratedSupertype = _decoratedClassHierarchy!.getDecoratedSupertype(
-        class_.declaredElement!, callee.enclosingElement2);
+        class_.declaredElement!, callee.enclosingElement3);
     var typeArguments = decoratedSupertype.typeArguments;
     Iterable<DartType?> typeArgumentTypes;
     typeArgumentTypes = typeArguments.map((t) => t!.type);
@@ -1890,7 +1891,7 @@
         typeArguments: typeArguments);
     var calleeType =
         getOrComputeElementType(node, callee, targetType: createdType);
-    var constructorTypeParameters = callee.enclosingElement2.typeParameters;
+    var constructorTypeParameters = callee.enclosingElement3.typeParameters;
 
     _handleInvocationArguments(
         node,
@@ -1998,7 +1999,7 @@
         }
       }
       var type = _variables!.decoratedElementType(declaredElement);
-      var enclosingElement = declaredElement.enclosingElement2;
+      var enclosingElement = declaredElement.enclosingElement3;
       if (!declaredElement.isStatic && enclosingElement is ClassElement) {
         var overriddenElements = _inheritanceManager.getOverridden2(
             enclosingElement,
@@ -2562,7 +2563,7 @@
   void _handleConstructorRedirection(
       FormalParameterList parameters, ConstructorName redirectedConstructor) {
     var callee = redirectedConstructor.staticElement!.declaration;
-    var redirectedClass = callee.enclosingElement2;
+    var redirectedClass = callee.enclosingElement3;
     var calleeType = _variables!.decoratedElementType(callee);
     var typeArguments = redirectedConstructor.type.typeArguments;
     var typeArgumentTypes =
@@ -2581,7 +2582,7 @@
     if (node.argumentList.arguments.isNotEmpty &&
         callee is ExecutableElement &&
         callee.isStatic) {
-      var enclosingElement = callee.enclosingElement2;
+      var enclosingElement = callee.enclosingElement3;
       if (enclosingElement is ClassElement) {
         if (callee.name == 'checkNotNull' &&
                 enclosingElement.name == 'ArgumentError' &&
@@ -2624,7 +2625,7 @@
     _addParametersToFlowAnalysis(parameters);
     // Push a scope of post-dominated declarations on the stack.
     _postDominatedLocals.pushScope(elements: declaredElement.parameters);
-    if (declaredElement.enclosingElement2 is ExtensionElement) {
+    if (declaredElement.enclosingElement3 is ExtensionElement) {
       _postDominatedLocals.add(_extensionThis);
     }
     try {
@@ -2639,7 +2640,7 @@
         _handleConstructorRedirection(parameters!, redirectedConstructor);
       }
       if (declaredElement is! ConstructorElement) {
-        var enclosingElement = declaredElement.enclosingElement2;
+        var enclosingElement = declaredElement.enclosingElement3;
         if (enclosingElement is ClassElement) {
           var overriddenElements = _inheritanceManager.getOverridden2(
               enclosingElement,
@@ -2725,7 +2726,7 @@
       ClassElement classElement,
       Element overriddenElement) {
     overriddenElement = overriddenElement.declaration!;
-    var overriddenClass = overriddenElement.enclosingElement2 as ClassElement;
+    var overriddenClass = overriddenElement.enclosingElement3 as ClassElement;
     var decoratedSupertype = _decoratedClassHierarchy!
         .getDecoratedSupertype(classElement, overriddenClass);
     var substitution = decoratedSupertype.asSubstitution;
@@ -2784,7 +2785,7 @@
           DecoratedType? currentParameterType;
           DecoratedType? overriddenParameterType;
           if (parameter.isNamed) {
-            var name = normalParameter.identifier!.name;
+            var name = normalParameter.name!.lexeme;
             currentParameterType = _currentFunctionType!.namedParameters![name];
             overriddenParameterType =
                 overriddenFunctionType.namedParameters![name];
@@ -2826,7 +2827,7 @@
       ClassElement classElement,
       Element overriddenElement) {
     overriddenElement = overriddenElement.declaration!;
-    var overriddenClass = overriddenElement.enclosingElement2 as ClassElement;
+    var overriddenClass = overriddenElement.enclosingElement3 as ClassElement;
     var decoratedSupertype = _decoratedClassHierarchy!
         .getDecoratedSupertype(classElement, overriddenClass);
     var substitution = decoratedSupertype.asSubstitution;
@@ -2958,13 +2959,13 @@
     Map<TypeParameterElement, DecoratedType?> getterSubstitution = const {};
     Map<TypeParameterElement, DecoratedType?> setterSubstitution = const {};
     if (class_ != null) {
-      var getterClass = getter.enclosingElement2 as ClassElement;
+      var getterClass = getter.enclosingElement3 as ClassElement;
       if (!identical(class_, getterClass)) {
         getterSubstitution = _decoratedClassHierarchy!
             .getDecoratedSupertype(class_, getterClass)
             .asSubstitution;
       }
-      var setterClass = setter.enclosingElement2 as ClassElement;
+      var setterClass = setter.enclosingElement3 as ClassElement;
       if (!identical(class_, setterClass)) {
         setterSubstitution = _decoratedClassHierarchy!
             .getDecoratedSupertype(class_, setterClass)
@@ -3062,9 +3063,10 @@
         expression = argument.expression;
       } else if (argument is FormalParameter) {
         if (argument.isNamed) {
-          name = argument.identifier!.name;
+          name = argument.name!.lexeme;
         }
-        expression = argument.identifier;
+        // TODO(scheglov) This is a hack.
+        expression = (argument as FormalParameterImpl).identifierForMigration;
       } else {
         expression = argument as Expression;
       }
@@ -3218,7 +3220,7 @@
     if (isDeclaredOnObject(name)) {
       return _dispatch(target);
     } else if ((callee is MethodElement || callee is PropertyAccessorElement) &&
-        callee!.enclosingElement2 is ExtensionElement) {
+        callee!.enclosingElement3 is ExtensionElement) {
       // Extension methods can be called on a `null` target, when the `on` type
       // of the extension is nullable.  Note: we don't need to check whether the
       // target type is assignable to the extended type; that is done in
diff --git a/pkg/nnbd_migration/lib/src/fix_aggregator.dart b/pkg/nnbd_migration/lib/src/fix_aggregator.dart
index 14750b4..03b5fd2 100644
--- a/pkg/nnbd_migration/lib/src/fix_aggregator.dart
+++ b/pkg/nnbd_migration/lib/src/fix_aggregator.dart
@@ -1181,7 +1181,7 @@
           AtomicEditInfo(NullabilityFixDescription.addType(typeText), {});
       // Skip past the offset of any metadata, a potential `final` keyword, and
       // a potential `covariant` keyword.
-      var offset = node.type?.offset ?? node.identifier!.offset;
+      var offset = node.type?.offset ?? node.name!.offset;
       return aggregator.planner.passThrough(node, innerPlans: [
         aggregator.planner.insertText(node, offset,
             [AtomicEdit.insert(typeText, info: info), AtomicEdit.insert(' ')]),
diff --git a/pkg/nnbd_migration/lib/src/fix_builder.dart b/pkg/nnbd_migration/lib/src/fix_builder.dart
index 05c8ff4..eff55d1 100644
--- a/pkg/nnbd_migration/lib/src/fix_builder.dart
+++ b/pkg/nnbd_migration/lib/src/fix_builder.dart
@@ -467,7 +467,7 @@
           return variable.typeInternal;
         }
         if (variable is ParameterElement) {
-          var enclosingElement = variable.enclosingElement2;
+          var enclosingElement = variable.enclosingElement3;
           if (enclosingElement is PropertyAccessorElement &&
               enclosingElement.isSynthetic) {
             // This is the parameter of a synthetic getter, so it has the same
@@ -503,7 +503,7 @@
   /// on a nullable type without introducing a null check).
   bool isNullableExtensionMember(Element? element) {
     if (element != null) {
-      var enclosingElement = element.enclosingElement2;
+      var enclosingElement = element.enclosingElement3;
       if (enclosingElement is ExtensionElement) {
         return _fixBuilder!._typeSystem
             .isPotentiallyNullable(enclosingElement.extendedType);
@@ -1223,7 +1223,7 @@
       var nullabilityNode =
           _fixBuilder._variables!.decoratedElementType(element!).node!;
       if (!nullabilityNode.isNullable) {
-        var enclosingElement = element.enclosingElement2;
+        var enclosingElement = element.enclosingElement3;
         if (enclosingElement is ConstructorElement &&
             enclosingElement.isFactory &&
             enclosingElement.redirectedConstructor != null &&
@@ -1336,8 +1336,8 @@
     // Change an existing `@required` annotation into a `required` keyword if
     // possible.
     final element = parameter.declaredElement!;
-    final method = element.enclosingElement2!;
-    final cls = method.enclosingElement2!;
+    final method = element.enclosingElement3!;
+    final cls = method.enclosingElement3!;
     var info = AtomicEditInfo(
         NullabilityFixDescription.addRequired(
             cls.name, method.name, element.name),
diff --git a/pkg/nnbd_migration/lib/src/front_end/info_builder.dart b/pkg/nnbd_migration/lib/src/front_end/info_builder.dart
index efef185..6e5e0e1 100644
--- a/pkg/nnbd_migration/lib/src/front_end/info_builder.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/info_builder.dart
@@ -560,7 +560,7 @@
         enclosingNode != null;
         enclosingNode = enclosingNode.parent) {
       if (enclosingNode is ConstructorDeclaration) {
-        if (enclosingNode.name == null) {
+        if (enclosingNode.name2 == null) {
           return _describeClassOrExtensionMember(
               enclosingNode.parent as CompilationUnitMember?,
               'the default constructor of',
@@ -569,10 +569,10 @@
           return _describeClassOrExtensionMember(
               enclosingNode.parent as CompilationUnitMember?,
               'the constructor',
-              enclosingNode.name!.name);
+              enclosingNode.name2!.lexeme);
         }
       } else if (enclosingNode is MethodDeclaration) {
-        var functionName = enclosingNode.name.name;
+        var functionName = enclosingNode.name2.lexeme;
         String baseDescription;
         if (enclosingNode.isGetter) {
           baseDescription = 'the getter';
@@ -590,7 +590,7 @@
             functionName);
       } else if (enclosingNode is FunctionDeclaration &&
           enclosingNode.parent is CompilationUnit) {
-        var functionName = enclosingNode.name.name;
+        var functionName = enclosingNode.name2.lexeme;
         String baseDescription;
         if (enclosingNode.isGetter) {
           baseDescription = 'the getter';
@@ -617,20 +617,20 @@
   static String _describeClassOrExtensionMember(CompilationUnitMember? parent,
       String baseDescription, String functionName) {
     if (parent is NamedCompilationUnitMember) {
-      var parentName = parent.name.name;
+      var parentName = parent.name2.lexeme;
       if (functionName.isEmpty) {
         return "$baseDescription '$parentName'";
       } else {
         return "$baseDescription '$parentName.$functionName'";
       }
     } else if (parent is ExtensionDeclaration) {
-      if (parent.name == null) {
+      if (parent.name2 == null) {
         var extendedTypeString = parent.extendedType.type!.getDisplayString(
           withNullability: false,
         );
         return "$baseDescription '$functionName' in unnamed extension on $extendedTypeString";
       } else {
-        return "$baseDescription '${parent.name!.name}.$functionName'";
+        return "$baseDescription '${parent.name2!.lexeme}.$functionName'";
       }
     } else {
       throw ArgumentError(
@@ -639,7 +639,7 @@
   }
 
   static String? _describeVariableDeclaration(VariableDeclaration node) {
-    var variableName = node.name.name;
+    var variableName = node.name2.lexeme;
     var parent = node.parent!;
     var grandParent = parent.parent;
     if (grandParent is FieldDeclaration) {
diff --git a/pkg/nnbd_migration/lib/src/node_builder.dart b/pkg/nnbd_migration/lib/src/node_builder.dart
index 78e0b70..a41a5ed 100644
--- a/pkg/nnbd_migration/lib/src/node_builder.dart
+++ b/pkg/nnbd_migration/lib/src/node_builder.dart
@@ -128,7 +128,6 @@
   @override
   DecoratedType? visitClassDeclaration(ClassDeclaration node) {
     node.metadata.accept(this);
-    node.name.accept(this);
     node.typeParameters?.accept(this);
     node.nativeClause?.accept(this);
     node.members.accept(this);
@@ -156,7 +155,6 @@
   @override
   DecoratedType? visitClassTypeAlias(ClassTypeAlias node) {
     node.metadata.accept(this);
-    node.name.accept(this);
     node.typeParameters?.accept(this);
     var classElement = node.declaredElement!;
     _handleSupertypeClauses(node, classElement, node.superclass,
@@ -222,7 +220,7 @@
           _typeProvider, declaredElement.type, _graph, target);
       instrumentation?.implicitType(source, node, type);
     }
-    _variables!.recordDecoratedElementType(node.identifier.staticElement, type);
+    _variables!.recordDecoratedElementType(node.declaredElement, type);
     return type;
   }
 
@@ -250,7 +248,6 @@
   @override
   DecoratedType? visitEnumDeclaration(EnumDeclaration node) {
     node.metadata.accept(this);
-    node.name.accept(this);
     var classElement = node.declaredElement!;
     _variables!.recordDecoratedElementType(
         classElement, DecoratedType(classElement.thisType, _graph.never));
@@ -479,7 +476,6 @@
   @override
   DecoratedType? visitMixinDeclaration(MixinDeclaration node) {
     node.metadata.accept(this);
-    node.name.accept(this);
     node.typeParameters?.accept(this);
     node.members.accept(this);
     _handleSupertypeClauses(node, node.declaredElement!, null, null,
@@ -684,7 +680,7 @@
   }
 
   DecoratedType _createDecoratedTypeForClass(
-      ClassElement classElement, AstNode? node) {
+      InterfaceElement classElement, AstNode? node) {
     var typeArguments = classElement.typeParameters
         .map((t) => t.instantiate(nullabilitySuffix: NullabilitySuffix.star))
         .toList();
@@ -707,7 +703,7 @@
     for (var annotation in metadata) {
       var element = annotation.element;
       if (element is ConstructorElement) {
-        var name = element.enclosingElement2.name;
+        var name = element.enclosingElement3.name;
         if (_isAngularUri(element.librarySource.uri)) {
           if (name == 'ViewChild' || name == 'ContentChild') {
             return _AngularAnnotation.child;
@@ -749,7 +745,7 @@
         // Constructors have no explicit return type annotation, so use the
         // implicit return type.
         decoratedReturnType = _createDecoratedTypeForClass(
-            declaredElement.enclosingElement2, parameters!.parent);
+            declaredElement.enclosingElement3, parameters!.parent);
         instrumentation?.implicitReturnType(source, node, decoratedReturnType);
       } else {
         // Inferred return type.
@@ -850,7 +846,7 @@
     for (var annotation in node.metadata) {
       var element = annotation.element;
       if (element is ConstructorElement &&
-          element.enclosingElement2.name == 'Optional' &&
+          element.enclosingElement3.name == 'Optional' &&
           _isAngularUri(element.librarySource.uri)) {
         _graph.makeNullable(
             decoratedType!.node!, AngularAnnotationOrigin(source, node));
diff --git a/pkg/nnbd_migration/lib/src/nullability_node_target.dart b/pkg/nnbd_migration/lib/src/nullability_node_target.dart
index 8f6eb6e..a69b7c4 100644
--- a/pkg/nnbd_migration/lib/src/nullability_node_target.dart
+++ b/pkg/nnbd_migration/lib/src/nullability_node_target.dart
@@ -15,7 +15,7 @@
     } else {
       parts.add(name);
     }
-    element = element.enclosingElement2;
+    element = element.enclosingElement3;
   }
   if (parts.isEmpty) {
     assert(false, 'Could not compute a name for $element');
diff --git a/pkg/nnbd_migration/lib/src/utilities/built_value_transformer.dart b/pkg/nnbd_migration/lib/src/utilities/built_value_transformer.dart
index 85a14aa..892c0b5 100644
--- a/pkg/nnbd_migration/lib/src/utilities/built_value_transformer.dart
+++ b/pkg/nnbd_migration/lib/src/utilities/built_value_transformer.dart
@@ -13,7 +13,7 @@
           var element = annotation.element;
           if (element is PropertyAccessorElement &&
               element.name == 'nullable') {
-            if (element.enclosingElement2 is CompilationUnitElement) {
+            if (element.enclosingElement3 is CompilationUnitElement) {
               if (element.library.source.uri.toString() ==
                   'package:built_value/built_value.dart') {
                 return annotation;
diff --git a/pkg/nnbd_migration/lib/src/utilities/hint_utils.dart b/pkg/nnbd_migration/lib/src/utilities/hint_utils.dart
index 79d4edd..a6585e6 100644
--- a/pkg/nnbd_migration/lib/src/utilities/hint_utils.dart
+++ b/pkg/nnbd_migration/lib/src/utilities/hint_utils.dart
@@ -249,7 +249,7 @@
       } else if (parameter.returnType != null) {
         return parameter.returnType!.beginToken;
       } else {
-        return parameter.identifier.token;
+        return parameter.name;
       }
     } else if (parameter is SimpleFormalParameter) {
       if (parameter.covariantKeyword != null) {
@@ -259,7 +259,7 @@
       } else if (parameter.type != null) {
         return parameter.type!.beginToken;
       } else {
-        return parameter.identifier!.token;
+        return parameter.name;
       }
     }
     return null;
diff --git a/pkg/nnbd_migration/lib/src/utilities/where_not_null_transformer.dart b/pkg/nnbd_migration/lib/src/utilities/where_not_null_transformer.dart
index 997bf46..e2bc4fd 100644
--- a/pkg/nnbd_migration/lib/src/utilities/where_not_null_transformer.dart
+++ b/pkg/nnbd_migration/lib/src/utilities/where_not_null_transformer.dart
@@ -139,7 +139,7 @@
     if (element is MethodElement) {
       if (element.isStatic) return false;
       if (element.name != 'where') return false;
-      var enclosingElement = element.declaration.enclosingElement2;
+      var enclosingElement = element.declaration.enclosingElement3;
       if (enclosingElement is ClassElement) {
         // If the class is `Iterable` or a subtype of it, we consider the user
         // to be calling a transformable method.
diff --git a/pkg/nnbd_migration/lib/src/utilities/where_or_null_transformer.dart b/pkg/nnbd_migration/lib/src/utilities/where_or_null_transformer.dart
index edf4027..162d544 100644
--- a/pkg/nnbd_migration/lib/src/utilities/where_or_null_transformer.dart
+++ b/pkg/nnbd_migration/lib/src/utilities/where_or_null_transformer.dart
@@ -104,7 +104,7 @@
       if (element.isStatic) return null;
       var replacementName = _replacementNames[element.name];
       if (replacementName == null) return null;
-      var enclosingElement = element.declaration.enclosingElement2;
+      var enclosingElement = element.declaration.enclosingElement3;
       if (enclosingElement is ClassElement) {
         // If the class is `Iterable` or a subtype of it, we consider the user
         // to be calling a transformable method.
diff --git a/pkg/nnbd_migration/lib/src/variables.dart b/pkg/nnbd_migration/lib/src/variables.dart
index 4258fad..681852f 100644
--- a/pkg/nnbd_migration/lib/src/variables.dart
+++ b/pkg/nnbd_migration/lib/src/variables.dart
@@ -125,7 +125,7 @@
   /// nullabilities.
   DecoratedType? decoratedTypeParameterBound(TypeParameterElement typeParameter,
       {bool allowNullUnparentedBounds = false}) {
-    var enclosingElement = typeParameter.enclosingElement2;
+    var enclosingElement = typeParameter.enclosingElement3;
     var decoratedType =
         DecoratedTypeParameterBounds.current!.get(typeParameter);
     if (enclosingElement == null) {
@@ -431,7 +431,7 @@
   bool _isLoadLibraryElement(Element element) =>
       element.isSynthetic &&
       element is FunctionElement &&
-      element.enclosingElement2 is LibraryElement &&
+      element.enclosingElement3 is LibraryElement &&
       element.name == 'loadLibrary';
 
   /// Inverts the logic of [uniqueIdentifierForSpan], producing an (offset, end)
diff --git a/pkg/nnbd_migration/test/edge_builder_test.dart b/pkg/nnbd_migration/test/edge_builder_test.dart
index e1df28b..1f097a6 100644
--- a/pkg/nnbd_migration/test/edge_builder_test.dart
+++ b/pkg/nnbd_migration/test/edge_builder_test.dart
@@ -8296,7 +8296,7 @@
 
   @override
   DecoratedType getDecoratedSupertype(
-      ClassElement class_, ClassElement superclass) {
+      ClassElement class_, InterfaceElement superclass) {
     throw UnimplementedError('TODO(paulberry)');
   }
 }
diff --git a/pkg/nnbd_migration/test/node_builder_test.dart b/pkg/nnbd_migration/test/node_builder_test.dart
index 07fe1b9..737bb72 100644
--- a/pkg/nnbd_migration/test/node_builder_test.dart
+++ b/pkg/nnbd_migration/test/node_builder_test.dart
@@ -1033,7 +1033,7 @@
 }
 ''');
     var functionExpressionElement =
-        findNode.simpleParameter('int i').declaredElement!.enclosingElement2!;
+        findNode.simpleParameter('int i').declaredElement!.enclosingElement3!;
     var decoratedType =
         variables!.decoratedElementType(functionExpressionElement);
     expect(decoratedType.positionalParameters![0],
@@ -1050,7 +1050,7 @@
 }
 ''');
     var functionExpressionElement =
-        findNode.simpleParameter('int i').declaredElement!.enclosingElement2!;
+        findNode.simpleParameter('int i').declaredElement!.enclosingElement3!;
     var decoratedType =
         variables!.decoratedElementType(functionExpressionElement);
     expect(
diff --git a/pkg/nnbd_migration/tool/codegen/extract_resource.dart b/pkg/nnbd_migration/tool/codegen/extract_resource.dart
index 60b1719..bfc2490 100644
--- a/pkg/nnbd_migration/tool/codegen/extract_resource.dart
+++ b/pkg/nnbd_migration/tool/codegen/extract_resource.dart
@@ -38,7 +38,7 @@
     if (declaration is TopLevelVariableDeclaration) {
       for (var variable in declaration.variables.variables) {
         if (variable.initializer == null) continue;
-        var match = variableNameRegExp.matchAsPrefix(variable.name.name);
+        var match = variableNameRegExp.matchAsPrefix(variable.name2.lexeme);
         if (match == null) continue;
         var shortName = match.group(1);
         if (list) {
diff --git a/pkg/scrape/example/superclass_parameters.dart b/pkg/scrape/example/superclass_parameters.dart
index de5923e..b242525 100644
--- a/pkg/scrape/example/superclass_parameters.dart
+++ b/pkg/scrape/example/superclass_parameters.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:scrape/scrape.dart';
 
 enum ArgumentMatch {
@@ -76,12 +77,12 @@
     // See if any of them could use the feature.
     var positionalParamNames = node.parameters.parameters
         .where((param) => param.isPositional)
-        .map((param) => param.identifier!.name)
+        .map((param) => param.name!.lexeme)
         .toList();
 
     var namedParamNames = node.parameters.parameters
         .where((param) => param.isNamed)
-        .map((param) => param.identifier!.name)
+        .map((param) => param.name!.lexeme)
         .toSet();
 
     var matchedNamedArguments = 0;
@@ -290,8 +291,8 @@
     record('Insert super args', insert ? 'Yes' : 'No');
     record('Do not merge super args', noMerge ? 'Yes' : 'No');
 
-    var subName = _constructorName(node.name);
-    var superName = _constructorName(initializer.constructorName);
+    var subName = _constructorName(node.name2);
+    var superName = _constructorName(initializer.constructorName?.token);
 
     record('No explicit super(), call same name',
         (allParams && superName == subName) ? 'Yes' : 'No');
@@ -300,9 +301,9 @@
         (allParams && superName == '(unnamed)') ? 'Yes' : 'No');
   }
 
-  String _constructorName(SimpleIdentifier? name) {
+  String _constructorName(Token? name) {
     if (name == null) return '(unnamed)';
-    return name.name;
+    return name.lexeme;
   }
 
   SuperConstructorInvocation? _findSuper(ConstructorDeclaration node) {
diff --git a/pkg/scrape/lib/src/scrape_visitor.dart b/pkg/scrape/lib/src/scrape_visitor.dart
index 7869df9..789ed3a 100644
--- a/pkg/scrape/lib/src/scrape_visitor.dart
+++ b/pkg/scrape/lib/src/scrape_visitor.dart
@@ -46,8 +46,8 @@
   /// "BuildContext context".
   bool get isInFlutterBuildMethod => _inFlutterBuildMethods > 0;
 
-  bool _isBuildMethod(TypeAnnotation? returnType, SimpleIdentifier name,
-      FormalParameterList? parameters) {
+  bool _isBuildMethod(
+      TypeAnnotation? returnType, FormalParameterList? parameters) {
     var parameterString = parameters.toString();
 
     if (returnType.toString() == 'void') return false;
@@ -109,7 +109,7 @@
 
   @override
   void visitMethodDeclaration(MethodDeclaration node) {
-    var isBuild = _isBuildMethod(node.returnType, node.name, node.parameters);
+    var isBuild = _isBuildMethod(node.returnType, node.parameters);
     if (isBuild) _inFlutterBuildMethods++;
 
     try {
@@ -123,8 +123,8 @@
 
   @override
   void visitFunctionDeclaration(FunctionDeclaration node) {
-    var isBuild = _isBuildMethod(
-        node.returnType, node.name, node.functionExpression.parameters);
+    var isBuild =
+        _isBuildMethod(node.returnType, node.functionExpression.parameters);
     if (isBuild) _inFlutterBuildMethods++;
 
     try {
diff --git a/tools/VERSION b/tools/VERSION
index 5817f58..a27dd14 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 19
 PATCH 0
-PRERELEASE 57
+PRERELEASE 58
 PRERELEASE_PATCH 0
\ No newline at end of file
