Version 2.15.0-136.0.dev

Merge commit '8aa9716d36fd456a5b2510ac8c6b9a569c355f66' into 'dev'
diff --git a/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart b/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
index 1e03d65..dacab35 100644
--- a/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
+++ b/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
@@ -2,11 +2,14 @@
 // 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:front_end/src/api_unstable/dart2js.dart' as api;
 import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/type_environment.dart';
 
+import '../js_interop.dart' show getJSName;
+
 /// Replaces js_util methods with inline calls to foreign_helper JS which
 /// emits the code as a JavaScript code fragment.
 class JsUtilOptimizer extends Transformer {
@@ -82,6 +85,79 @@
     return node;
   }
 
+  @override
+  visitProcedure(Procedure node) {
+    _staticTypeContext.enterMember(node);
+    // Getters, setters, and fields declared as `static` will be skipped,
+    // because they do not have a node.kind of ProcedureKind.Method.
+    if (node.isExternal &&
+        node.isExtensionMember &&
+        node.kind == ProcedureKind.Method) {
+      var transformedBody;
+      if (api.getExtensionMemberKind(node) == ProcedureKind.Getter) {
+        transformedBody = _getExternalGetterBody(node);
+      } else if (api.getExtensionMemberKind(node) == ProcedureKind.Setter) {
+        transformedBody = _getExternalSetterBody(node);
+      }
+      // TODO(rileyporter): Add transformation for external extension methods,
+      // static members, and any operators we decide to support.
+      if (transformedBody != null) {
+        node.function.body = transformedBody;
+        node.isExternal = false;
+      }
+    } else {
+      node.transformChildren(this);
+    }
+    _staticTypeContext.leaveMember(node);
+    return node;
+  }
+
+  /// Returns a new function body for the given [node] external getter.
+  ///
+  /// The new function body will call the optimized version of
+  /// `js_util.getProperty` for the given external getter.
+  ReturnStatement _getExternalGetterBody(Procedure node) {
+    var function = node.function;
+    assert(function.positionalParameters.length == 1);
+    var getPropertyInvocation = StaticInvocation(
+        _getPropertyTarget,
+        Arguments([
+          VariableGet(function.positionalParameters.first),
+          StringLiteral(_getMemberName(node))
+        ]))
+      ..fileOffset = node.fileOffset;
+    return ReturnStatement(AsExpression(
+        _lowerGetProperty(getPropertyInvocation), function.returnType));
+  }
+
+  /// Returns a new function body for the given [node] external setter.
+  ///
+  /// The new function body will call the optimized version of
+  /// `js_util.setProperty` for the given external setter.
+  ReturnStatement _getExternalSetterBody(Procedure node) {
+    var function = node.function;
+    assert(function.positionalParameters.length == 2);
+    var setPropertyInvocation = StaticInvocation(
+        _setPropertyTarget,
+        Arguments([
+          VariableGet(function.positionalParameters.first),
+          StringLiteral(_getMemberName(node)),
+          VariableGet(function.positionalParameters.last)
+        ]))
+      ..fileOffset = node.fileOffset;
+    return ReturnStatement(AsExpression(
+        _lowerSetProperty(setPropertyInvocation), function.returnType));
+  }
+
+  /// Returns the member name, either from the `@JS` annotation if non-empty,
+  /// or parsed from CFE generated node name.
+  String _getMemberName(Procedure node) {
+    var jsAnnotationName = getJSName(node);
+    return jsAnnotationName.isNotEmpty
+        ? jsAnnotationName
+        : node.name.text.substring(node.name.text.indexOf('#') + 1);
+  }
+
   /// Replaces js_util method calls with optimization when possible.
   ///
   /// Lowers `getProperty` for any argument type straight to JS fragment call.
diff --git a/pkg/_js_interop_checks/pubspec.yaml b/pkg/_js_interop_checks/pubspec.yaml
index bae1992..27f50f2 100644
--- a/pkg/_js_interop_checks/pubspec.yaml
+++ b/pkg/_js_interop_checks/pubspec.yaml
@@ -8,5 +8,7 @@
 dependencies:
   _fe_analyzer_shared:
     path: ../_fe_analyzer_shared
+  front_end:
+    path: ../front_end
   kernel:
     path: ../kernel
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index 4271825..44a2362 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -167,7 +167,7 @@
     Set<SemanticTokenModifiers>? semanticModifiers;
     var parent = node.parent;
     var grandParent = parent?.parent;
-    if (parent is TypeName &&
+    if (parent is NamedType &&
         grandParent is ConstructorName &&
         grandParent.parent is InstanceCreationExpression) {
       // new Class()
diff --git a/pkg/analysis_server/lib/src/computer/computer_hover.dart b/pkg/analysis_server/lib/src/computer/computer_hover.dart
index 6cf3f1b..d51da04 100644
--- a/pkg/analysis_server/lib/src/computer/computer_hover.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_hover.dart
@@ -31,7 +31,7 @@
     }
     var parent = node.parent;
     var grandParent = parent?.parent;
-    if (parent is TypeName &&
+    if (parent is NamedType &&
         grandParent is ConstructorName &&
         grandParent.parent is InstanceCreationExpression) {
       node = grandParent.parent;
diff --git a/pkg/analysis_server/lib/src/computer/computer_type_arguments_signature.dart b/pkg/analysis_server/lib/src/computer/computer_type_arguments_signature.dart
index 58aafe2..3c3d68b 100644
--- a/pkg/analysis_server/lib/src/computer/computer_type_arguments_signature.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_type_arguments_signature.dart
@@ -43,7 +43,7 @@
     }
     final parent = argumentList.parent;
     Element? element;
-    if (parent is TypeName) {
+    if (parent is NamedType) {
       element = ElementLocator.locate(parent.name);
     } else if (parent is MethodInvocation) {
       element = ElementLocator.locate(parent.methodName);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
index 18ebdde..975d96c 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
@@ -39,7 +39,7 @@
       PrefixElement elem,
       List<ImportElement> imports) {
     var parent = request.target.containingNode.parent;
-    var typesOnly = parent is TypeName;
+    var typesOnly = parent is NamedType;
     var isConstructor = parent?.parent is ConstructorName;
     for (var importElem in imports) {
       if (importElem.prefix?.name == elem.name) {
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 728ea51..b97e431 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
@@ -437,7 +437,7 @@
   bool _isUnused(String identifier) => RegExp(r'^_+$').hasMatch(identifier);
 
   bool _isVoid(TypeAnnotation? returnType) {
-    if (returnType is TypeName) {
+    if (returnType is NamedType) {
       var id = returnType.name;
       if (id.name == 'void') {
         return true;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
index a0cec5d..93a1727 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
@@ -21,8 +21,8 @@
       if (libraryElement == null) {
         return;
       }
-      var typeName = node.type;
-      var type = typeName.type;
+      var namedType = node.type;
+      var type = namedType.type;
       if (type != null) {
         var element = type.element;
         if (element is ClassElement) {
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 6b96dcf..e67d203 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
@@ -129,9 +129,9 @@
   @override
   void declaredFunction(FunctionDeclaration declaration) {
     if (declaration.name.name == targetName) {
-      var typeName = declaration.returnType;
-      if (typeName != null) {
-        var type = typeName.type;
+      var returnType = declaration.returnType;
+      if (returnType != null) {
+        var type = returnType.type;
         if (type != null) {
           typeFound = type;
         }
@@ -143,9 +143,9 @@
   @override
   void declaredFunctionTypeAlias(FunctionTypeAlias declaration) {
     if (declaration.name.name == targetName) {
-      var typeName = declaration.returnType;
-      if (typeName != null) {
-        var type = typeName.type;
+      var returnType = declaration.returnType;
+      if (returnType != null) {
+        var type = returnType.type;
         if (type != null) {
           typeFound = type;
         }
@@ -157,9 +157,9 @@
   @override
   void declaredGenericTypeAlias(GenericTypeAlias declaration) {
     if (declaration.name.name == targetName) {
-      var typeName = declaration.functionType?.returnType;
-      if (typeName != null) {
-        var type = typeName.type;
+      var returnType = declaration.functionType?.returnType;
+      if (returnType != null) {
+        var type = returnType.type;
         if (type != null) {
           typeFound = type;
         }
@@ -188,9 +188,9 @@
   @override
   void declaredMethod(MethodDeclaration declaration) {
     if (declaration.name.name == targetName) {
-      var typeName = declaration.returnType;
-      if (typeName != null) {
-        var type = typeName.type;
+      var returnType = declaration.returnType;
+      if (returnType != null) {
+        var type = returnType.type;
         if (type != null) {
           typeFound = type;
         }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
index 26a1a94..d8d642e 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
@@ -29,7 +29,7 @@
 };
 
 /// A marker used in place of `null` when a function has no return type.
-final TypeName NO_RETURN_TYPE = astFactory.typeName(
+final NamedType NO_RETURN_TYPE = astFactory.typeName(
     astFactory.simpleIdentifier(StringToken(TokenType.IDENTIFIER, '', 0)),
     null);
 
@@ -246,7 +246,7 @@
 
   // If the type is unresolved, use the declared type.
   if (type.isDynamic) {
-    if (declaredType is TypeName) {
+    if (declaredType is NamedType) {
       return declaredType.name.name;
     }
     return DYNAMIC;
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 e2b1b0b..ba74ab0 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
@@ -111,7 +111,7 @@
   }
 
   static Identifier? _typeAnnotationIdentifier(TypeAnnotation? type) {
-    if (type is TypeName) {
+    if (type is NamedType) {
       return type.name;
     }
     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 a586ac4..56442ae 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
@@ -539,7 +539,7 @@
   bool mightBeTypeIdentifier(AstNode node) {
     if (node is SimpleIdentifier) {
       var parent = node.parent;
-      if (parent is TypeName) {
+      if (parent is NamedType) {
         return true;
       }
       return _isNameOfType(node.name);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_const.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_const.dart
index 74c7d31..de6f8d5 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_const.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_const.dart
@@ -79,7 +79,7 @@
       await insertAtOffset(targetNode);
       return;
     }
-    if (targetNode is TypeName) {
+    if (targetNode is NamedType) {
       targetNode = targetNode.parent;
     }
     if (targetNode is ConstructorName) {
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 6c5b68c..af2fe16 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
@@ -165,7 +165,7 @@
         if (parameter is SimpleFormalParameter) {
           final type = parameter.type;
           final identifier = parameter.identifier;
-          if (type is TypeName && identifier != null) {
+          if (type is NamedType && identifier != null) {
             if (type.name.name == 'DiagnosticPropertiesBuilder') {
               propertiesBuilderName = identifier.name;
               break;
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 0d0583d..2ec24e4 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
@@ -68,7 +68,7 @@
     // Prepare the optional import prefix name.
     String? prefixName;
     if (node is PrefixedIdentifier &&
-        node.parent is TypeName &&
+        node.parent is NamedType &&
         node.prefix.staticElement is PrefixElement) {
       prefixName = node.prefix.name;
       node = node.identifier;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart
index dbc9020..b9934c4 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart
@@ -28,7 +28,7 @@
     if (node is SimpleIdentifier) {
       var parent = node.parent;
       var grandParent = parent?.parent;
-      if (parent is TypeName &&
+      if (parent is NamedType &&
           grandParent is ConstructorName &&
           grandParent.parent is InstanceCreationExpression) {
         return;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart b/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
index a3cd739..415f155 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
@@ -143,7 +143,7 @@
     }
     if (node is PrefixedIdentifier) {
       var parent = node.parent;
-      if (parent is TypeName) {
+      if (parent is NamedType) {
         return 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 6e71c21..d3089fb 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
@@ -151,7 +151,7 @@
 class _ReferenceFinder extends RecursiveAstVisitor {
   final String typeName;
 
-  TypeName? reference;
+  NamedType? reference;
 
   int count = 0;
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/move_type_arguments_to_class.dart b/pkg/analysis_server/lib/src/services/correction/dart/move_type_arguments_to_class.dart
index 0230ec5..82676c6 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/move_type_arguments_to_class.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/move_type_arguments_to_class.dart
@@ -27,17 +27,17 @@
       return;
     }
 
-    var typeName = creation.constructorName.type;
-    if (typeName.typeArguments != null) {
+    var namedType = creation.constructorName.type;
+    if (namedType.typeArguments != null) {
       return;
     }
 
-    var element = typeName.typeOrThrow.element;
+    var element = namedType.typeOrThrow.element;
     if (element is ClassElement &&
         element.typeParameters.length == typeArguments.arguments.length) {
       await builder.addDartFileEdit(file, (builder) {
         var argumentText = utils.getNodeText(typeArguments);
-        builder.addSimpleInsertion(typeName.end, argumentText);
+        builder.addSimpleInsertion(namedType.end, argumentText);
         builder.addDeletion(range.node(typeArguments));
       });
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_question_mark.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_question_mark.dart
index 945b3b6..ff50a63 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_question_mark.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_question_mark.dart
@@ -33,7 +33,7 @@
         return;
       }
     }
-    if (targetNode is TypeName) {
+    if (targetNode is NamedType) {
       var questionMark = targetNode.question;
       if (questionMark == null) {
         return;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_future.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_future.dart
index c19cf4a..fb29e4f 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_future.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_future.dart
@@ -15,13 +15,13 @@
   @override
   Future<void> compute(ChangeBuilder builder) async {
     // prepare the existing type
-    var typeName = node.thisOrAncestorOfType<TypeAnnotation>();
-    if (typeName == null) {
+    var typeAnnotation = node.thisOrAncestorOfType<TypeAnnotation>();
+    if (typeAnnotation == null) {
       return;
     }
 
     await builder.addDartFileEdit(file, (builder) {
-      builder.replaceTypeWithFuture(typeName, typeProvider);
+      builder.replaceTypeWithFuture(typeAnnotation, typeProvider);
     });
   }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_filled.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_filled.dart
index 860e620..176694e 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_filled.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_filled.dart
@@ -15,10 +15,10 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    var typeName = node is SimpleIdentifier ? node.parent : node;
-    var creation = typeName?.parent?.parent;
-    if (typeName is TypeName && creation is InstanceCreationExpression) {
-      var elementType = (typeName.type as InterfaceType).typeArguments[0];
+    var namedType = node is SimpleIdentifier ? node.parent : node;
+    var creation = namedType?.parent?.parent;
+    if (namedType is NamedType && creation is InstanceCreationExpression) {
+      var elementType = (namedType.type as InterfaceType).typeArguments[0];
       if (typeSystem.isNullable(elementType)) {
         var argumentList = creation.argumentList;
         if (argumentList.arguments.length == 1) {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_template.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_template.dart
index ce509a1..9599855 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_template.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_template.dart
@@ -100,7 +100,7 @@
         return parent.parent?.parent?.parent;
       } else if (parent is MethodInvocation && parent.methodName == node) {
         return parent;
-      } else if (parent is TypeName &&
+      } else if (parent is NamedType &&
           parent.parent is ConstructorName &&
           parent.parent?.parent is InstanceCreationExpression) {
         return parent.parent?.parent;
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 097c93c..b3645cd 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
@@ -127,7 +127,7 @@
         // don't represent parameters as elements, the element we need to match
         // against is the invocation containing those arguments.
         return _componentsFromParent(parent.parent!.parent!);
-      } else if (parent is TypeName && parent.parent is ConstructorName) {
+      } else if (parent is NamedType && parent.parent is ConstructorName) {
         return ['', node.name];
       } else if (parent is MethodDeclaration && node == parent.name) {
         return [node.name];
@@ -139,7 +139,7 @@
       return _componentsFromIdentifier(node);
     } else if (node is PrefixedIdentifier) {
       var parent = node.parent;
-      if (parent is TypeName && parent.parent is ConstructorName) {
+      if (parent is NamedType && parent.parent is ConstructorName) {
         return ['', node.identifier.name];
       }
       return [node.identifier.name];
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
index 56e83f4..c71ea13 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
@@ -244,7 +244,7 @@
     } else if (grandParent is InvocationExpression) {
       var argumentList = grandParent.argumentList;
       return _Data(argumentList);
-    } else if (parent is TypeName &&
+    } else if (parent is NamedType &&
         grandParent is ConstructorName &&
         greatGrandParent is InstanceCreationExpression) {
       var argumentList = greatGrandParent.argumentList;
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename.dart
index d3089e9..104d268 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename.dart
@@ -48,7 +48,7 @@
           // named constructor.
           builder.addSimpleReplacement(range.node(nameNode), newName);
         }
-      } else if (parent is TypeName && parent.parent is ConstructorName) {
+      } else if (parent is NamedType && parent.parent is ConstructorName) {
         // The constructor was renamed from an unnamed constructor to a named
         // constructor.
         builder.addSimpleInsertion(parent.end, '.$newName');
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 f501ed0..93de681 100644
--- a/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
+++ b/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
@@ -181,8 +181,8 @@
     name = expression.methodName.name;
   } else if (expression is InstanceCreationExpression) {
     var constructorName = expression.constructorName;
-    var typeName = constructorName.type;
-    var typeNameIdentifier = typeName.name;
+    var namedType = constructorName.type;
+    var typeNameIdentifier = namedType.name;
     // new ClassName()
     if (typeNameIdentifier is SimpleIdentifier) {
       return typeNameIdentifier.name;
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 ced0ca3..b902a8b 100644
--- a/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
+++ b/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
@@ -558,7 +558,7 @@
     // return type
     //
     var returnType = node.returnType;
-    if (returnType is TypeName) {
+    if (returnType is NamedType) {
       _handleRefEdge(
         returnType.name.staticElement,
         const <String>[schema.REF_EDGE],
@@ -1235,7 +1235,7 @@
     addEdge(funcTypeVName, schema.PARAM_EDGE, fnBuiltin, ordinalIntValue: i++);
 
     KytheVName? returnTypeVName;
-    if (returnNode is TypeName) {
+    if (returnNode is NamedType) {
       // MethodDeclaration and FunctionDeclaration both return a TypeName from
       // returnType
       if (returnNode.typeOrThrow.isVoid) {
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 7d361dc..4afc45f 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
@@ -281,7 +281,7 @@
           node is TypeArgumentList) {
         continue;
       }
-      if (node is ConstructorName || node is Label || node is TypeName) {
+      if (node is ConstructorName || node is Label || node is NamedType) {
         singleExpression = null;
         coveringExpressionOffsets.clear();
         coveringExpressionLengths.clear();
diff --git a/pkg/analysis_server/lib/src/utilities/flutter.dart b/pkg/analysis_server/lib/src/utilities/flutter.dart
index cb513a3..b733540 100644
--- a/pkg/analysis_server/lib/src/utilities/flutter.dart
+++ b/pkg/analysis_server/lib/src/utilities/flutter.dart
@@ -558,7 +558,7 @@
     if (node == null) {
       return false;
     }
-    if (node.parent is TypeName || node.parent?.parent is TypeName) {
+    if (node.parent is NamedType || node.parent?.parent is NamedType) {
       return false;
     }
     if (node.parent is ConstructorName) {
diff --git a/pkg/analysis_server/test/src/utilities/flutter_test.dart b/pkg/analysis_server/test/src/utilities/flutter_test.dart
index 4b35f0a..d616586 100644
--- a/pkg/analysis_server/test/src/utilities/flutter_test.dart
+++ b/pkg/analysis_server/test/src/utilities/flutter_test.dart
@@ -125,11 +125,11 @@
       var statement = statements[0] as ExpressionStatement;
       var creation = statement.expression as InstanceCreationExpression;
       var constructorName = creation.constructorName;
-      var typeName = constructorName.type;
+      var namedType = constructorName.type;
       var argumentList = creation.argumentList;
       expect(_flutter.identifyWidgetExpression(creation), creation);
       expect(_flutter.identifyWidgetExpression(constructorName), creation);
-      expect(_flutter.identifyWidgetExpression(typeName), creation);
+      expect(_flutter.identifyWidgetExpression(namedType), creation);
       expect(_flutter.identifyWidgetExpression(argumentList), isNull);
       expect(
         _flutter.identifyWidgetExpression(argumentList.arguments[0]),
@@ -142,12 +142,12 @@
       var statement = statements[1] as ExpressionStatement;
       var creation = statement.expression as InstanceCreationExpression;
       var constructorName = creation.constructorName;
-      var typeName = constructorName.type;
+      var namedType = constructorName.type;
       var argumentList = creation.argumentList;
       expect(_flutter.identifyWidgetExpression(creation), creation);
       expect(_flutter.identifyWidgetExpression(constructorName), creation);
-      expect(_flutter.identifyWidgetExpression(typeName), creation);
-      expect(_flutter.identifyWidgetExpression(typeName.name), creation);
+      expect(_flutter.identifyWidgetExpression(namedType), creation);
+      expect(_flutter.identifyWidgetExpression(namedType.name), creation);
       expect(_flutter.identifyWidgetExpression(constructorName.name), creation);
       expect(_flutter.identifyWidgetExpression(argumentList), isNull);
       expect(
diff --git a/pkg/analysis_server/tool/code_completion/completion_metrics.dart b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
index 59a0623..4522ce8 100644
--- a/pkg/analysis_server/tool/code_completion/completion_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
@@ -1791,7 +1791,7 @@
           return CompletionGroup.mixinElement;
         }
         if (entity is SimpleIdentifier &&
-            entity.parent is TypeName &&
+            entity.parent is NamedType &&
             entity.parent!.parent is ConstructorName &&
             entity.parent!.parent!.parent is InstanceCreationExpression) {
           return CompletionGroup.constructorElement;
diff --git a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
index 8a24e94..aa88b80 100644
--- a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
@@ -845,8 +845,8 @@
   @override
   void visitImplementsClause(ImplementsClause node) {
     // At the start of each type name.
-    for (var typeName in node.interfaces) {
-      _recordDataForNode('ImplementsClause (type)', typeName);
+    for (var namedType in node.interfaces) {
+      _recordDataForNode('ImplementsClause (type)', namedType);
     }
     super.visitImplementsClause(node);
   }
@@ -1351,8 +1351,8 @@
 
   @override
   void visitWithClause(WithClause node) {
-    for (var typeName in node.mixinTypes) {
-      _recordDataForNode('WithClause (type)', typeName);
+    for (var namedType in node.mixinTypes) {
+      _recordDataForNode('WithClause (type)', namedType);
     }
     super.visitWithClause(node);
   }
diff --git a/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart b/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
index 3e2af94..9e8f224 100644
--- a/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
+++ b/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
@@ -819,8 +819,8 @@
   @override
   void visitImplementsClause(ImplementsClause node) {
     // At the start of each type name.
-    for (var typeName in node.interfaces) {
-      _recordDataForNode('ImplementsClause_interface', typeName);
+    for (var namedType in node.interfaces) {
+      _recordDataForNode('ImplementsClause_interface', namedType);
     }
     super.visitImplementsClause(node);
   }
@@ -1251,8 +1251,8 @@
 
   @override
   void visitWithClause(WithClause node) {
-    for (var typeName in node.mixinTypes) {
-      _recordDataForNode('WithClause_mixinType', typeName);
+    for (var namedType in node.mixinTypes) {
+      _recordDataForNode('WithClause_mixinType', namedType);
     }
     super.visitWithClause(node);
   }
diff --git a/pkg/analyzer/lib/dart/ast/ast_factory.dart b/pkg/analyzer/lib/dart/ast/ast_factory.dart
index 7dc28ed..c8ea01f 100644
--- a/pkg/analyzer/lib/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/dart/ast/ast_factory.dart
@@ -149,7 +149,7 @@
       TypeParameterList? typeParameters,
       Token equals,
       Token? abstractKeyword,
-      TypeName superclass,
+      NamedType superclass,
       WithClause withClause,
       ImplementsClause? implementsClause,
       Token semicolon);
@@ -230,7 +230,7 @@
   /// Returns a newly created constructor name. The [period] and [name] can be
   /// `null` if the constructor being named is the unnamed constructor.
   ConstructorName constructorName(
-      TypeName type, Token? period, SimpleIdentifier? name);
+      NamedType type, Token? period, SimpleIdentifier? name);
 
   /// Returns a newly created constructor reference.
   ConstructorReference constructorReference(
@@ -344,7 +344,7 @@
       Expression expression, Token? semicolon);
 
   /// Returns a newly created extends clause.
-  ExtendsClause extendsClause(Token extendsKeyword, TypeName superclass);
+  ExtendsClause extendsClause(Token extendsKeyword, NamedType superclass);
 
   /// Return a newly created extension declaration. The list of [typeParameters]
   /// can be `null` if there are no type parameters.
@@ -578,7 +578,7 @@
 
   /// Returns a newly created implements clause.
   ImplementsClause implementsClause(
-      Token implementsKeyword, List<TypeName> interfaces);
+      Token implementsKeyword, List<NamedType> interfaces);
 
   /// Returns a newly created import directive. Either or both of the
   /// [comment] and [metadata] can be `null` if the function does not have the
@@ -712,6 +712,15 @@
   /// Returns a newly created named expression.
   NamedExpression namedExpression(Label name, Expression expression);
 
+  /// Returns a newly created named type. The [typeArguments] can be `null` if
+  /// there are no type arguments. The [question] can be `null` if there is no
+  /// question mark.
+  NamedType namedType({
+    required Identifier name,
+    TypeArgumentList? typeArguments,
+    Token? question,
+  });
+
   /// Returns a newly created native clause.
   NativeClause nativeClause(Token nativeKeyword, StringLiteral? name);
 
@@ -728,7 +737,7 @@
   NullLiteral nullLiteral(Token literal);
 
   /// Return a newly created on clause.
-  OnClause onClause(Token onKeyword, List<TypeName> superclassConstraints);
+  OnClause onClause(Token onKeyword, List<NamedType> superclassConstraints);
 
   /// Returns a newly created parenthesized expression.
   ParenthesizedExpression parenthesizedExpression(
@@ -904,7 +913,7 @@
       Token leftBracket, List<TypeAnnotation> arguments, Token rightBracket);
 
   /// Returns a newly created type literal.
-  TypeLiteral typeLiteral({required TypeName typeName});
+  TypeLiteral typeLiteral({required NamedType typeName});
 
   /// Returns a newly created type name. The [typeArguments] can be `null` if
   /// there are no type arguments. The [question] can be `null` if there is no
@@ -962,7 +971,7 @@
       Expression condition, Token rightParenthesis, Statement body);
 
   /// Returns a newly created with clause.
-  WithClause withClause(Token withKeyword, List<TypeName> mixinTypes);
+  WithClause withClause(Token withKeyword, List<NamedType> mixinTypes);
 
   /// Returns a newly created yield expression. The [star] can be `null` if no
   /// star was provided.
diff --git a/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart b/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart
index 9147be7..848cf02 100644
--- a/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart
@@ -169,7 +169,7 @@
   void _addClassOrMixin(ClassOrMixinDeclaration node) {
     var enclosingClassName = node.name.name;
 
-    TypeName? enclosingSuperClass;
+    NamedType? enclosingSuperClass;
     if (node is ClassDeclaration) {
       enclosingSuperClass = node.extendsClause?.superclass;
     }
@@ -303,7 +303,7 @@
 
   void _addConstructor(
     Node enclosingClass,
-    TypeName? enclosingSuperClass,
+    NamedType? enclosingSuperClass,
     List<Node> classMembers,
     ConstructorDeclaration node,
   ) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart b/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
index fe3dce6..88b61ee 100644
--- a/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
@@ -56,7 +56,7 @@
       {String? enclosingClassName,
       String? thisNodeName,
       List<ConstructorInitializer>? constructorInitializers,
-      TypeName? enclosingSuperClass,
+      NamedType? enclosingSuperClass,
       Expression? expression,
       ExtendsClause? extendsClause,
       FormalParameterList? formalParameters,
@@ -66,7 +66,7 @@
       OnClause? onClause,
       ConstructorName? redirectedConstructor,
       TypeAnnotation? returnType,
-      TypeName? superClass,
+      NamedType? superClass,
       TypeAnnotation? type,
       TypeParameterList? typeParameters,
       TypeParameterList? typeParameters2,
@@ -264,7 +264,7 @@
   }
 
   /// Record reference to the constructor of the [type] with the given [name].
-  void _visitConstructor(TypeName type, SimpleIdentifier? name) {
+  void _visitConstructor(NamedType type, SimpleIdentifier? name) {
     _visitTypeAnnotation(type);
 
     if (name != null) {
@@ -275,7 +275,7 @@
   }
 
   void _visitConstructorInitializers(
-      TypeName? superClass, List<ConstructorInitializer>? initializers) {
+      NamedType? superClass, List<ConstructorInitializer>? initializers) {
     if (initializers == null) return;
 
     for (var i = 0; i < initializers.length; i++) {
@@ -805,7 +805,7 @@
       _visitFormalParameterList(node.parameters);
 
       _localScopes.exit();
-    } else if (node is TypeName) {
+    } else if (node is NamedType) {
       var identifier = node.name;
       _visitExpression(identifier);
       _visitTypeArguments(node.typeArguments);
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index 26da055..90b8d68 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -522,9 +522,9 @@
     recordRelationOffset(element, kind, token.offset, token.length, true);
   }
 
-  /// Record a relation between a super [typeName] and its [Element].
-  void recordSuperType(TypeName typeName, IndexRelationKind kind) {
-    Identifier name = typeName.name;
+  /// Record a relation between a super [namedType] and its [Element].
+  void recordSuperType(NamedType namedType, IndexRelationKind kind) {
+    Identifier name = namedType.name;
     Element? element = name.staticElement;
     bool isQualified;
     SimpleIdentifier relNode;
@@ -538,7 +538,7 @@
     recordRelation(element, kind, relNode, isQualified);
     recordRelation(
         element, IndexRelationKind.IS_REFERENCED_BY, relNode, isQualified);
-    typeName.typeArguments?.accept(this);
+    namedType.typeArguments?.accept(this);
   }
 
   void recordUriReference(Element? element, StringLiteral uri) {
@@ -660,8 +660,8 @@
 
   @override
   void visitImplementsClause(ImplementsClause node) {
-    for (TypeName typeName in node.interfaces) {
-      recordSuperType(typeName, IndexRelationKind.IS_IMPLEMENTED_BY);
+    for (NamedType namedType in node.interfaces) {
+      recordSuperType(namedType, IndexRelationKind.IS_IMPLEMENTED_BY);
     }
   }
 
@@ -713,8 +713,8 @@
 
   @override
   void visitOnClause(OnClause node) {
-    for (TypeName typeName in node.superclassConstraints) {
-      recordSuperType(typeName, IndexRelationKind.IS_IMPLEMENTED_BY);
+    for (NamedType namedType in node.superclassConstraints) {
+      recordSuperType(namedType, IndexRelationKind.IS_IMPLEMENTED_BY);
     }
   }
 
@@ -830,14 +830,14 @@
 
   @override
   void visitWithClause(WithClause node) {
-    for (TypeName typeName in node.mixinTypes) {
-      recordSuperType(typeName, IndexRelationKind.IS_MIXED_IN_BY);
+    for (NamedType namedType in node.mixinTypes) {
+      recordSuperType(namedType, IndexRelationKind.IS_MIXED_IN_BY);
     }
   }
 
   /// Record the given class as a subclass of its direct superclasses.
   void _addSubtype(String name,
-      {TypeName? superclass,
+      {NamedType? superclass,
       WithClause? withClause,
       OnClause? onClause,
       ImplementsClause? implementsClause,
@@ -853,7 +853,7 @@
           element.name;
     }
 
-    void addSupertype(TypeName? type) {
+    void addSupertype(NamedType? type) {
       var element = type?.name.staticElement;
       if (element is ClassElement) {
         String id = getClassElementId(element);
diff --git a/pkg/analyzer/lib/src/dart/analysis/referenced_names.dart b/pkg/analyzer/lib/src/dart/analysis/referenced_names.dart
index 2461021..073d6f6 100644
--- a/pkg/analyzer/lib/src/dart/analysis/referenced_names.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/referenced_names.dart
@@ -17,7 +17,7 @@
 Set<String> computeSubtypedNames(CompilationUnit unit) {
   Set<String> subtypedNames = <String>{};
 
-  void _addSubtypedName(TypeName? type) {
+  void _addSubtypedName(NamedType? type) {
     if (type != null) {
       Identifier name = type.name;
       if (name is SimpleIdentifier) {
@@ -28,7 +28,7 @@
     }
   }
 
-  void _addSubtypedNames(List<TypeName>? types) {
+  void _addSubtypedNames(List<NamedType>? types) {
     types?.forEach(_addSubtypedName);
   }
 
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index a8b5cae..bdcb763 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -5759,8 +5759,8 @@
   final NodeListImpl<TypeName> _interfaces = NodeListImpl._();
 
   /// Initialize a newly created implements clause.
-  ImplementsClauseImpl(this.implementsKeyword, List<TypeName> interfaces) {
-    _interfaces._initialize(this, interfaces);
+  ImplementsClauseImpl(this.implementsKeyword, List<NamedType> interfaces) {
+    _interfaces._initialize2(this, interfaces);
   }
 
   @override
@@ -7635,6 +7635,20 @@
       }
     }
   }
+
+  /// Set the [owner] of this container, and populate it with [elements].
+  /// TODO(scheglov) Remove this method, it exists only to implicitly cast.
+  void _initialize2<E2>(AstNodeImpl owner, List<E2>? elements) {
+    _owner = owner;
+    if (elements != null) {
+      var length = elements.length;
+      for (var i = 0; i < length; i++) {
+        var node = elements[i] as E;
+        _elements.add(node);
+        owner._becomeParentOf(node as AstNodeImpl);
+      }
+    }
+  }
 }
 
 /// A formal parameter that is required (is not optional).
@@ -7825,8 +7839,8 @@
   final NodeListImpl<TypeName> _superclassConstraints = NodeListImpl._();
 
   /// Initialize a newly created on clause.
-  OnClauseImpl(this.onKeyword, List<TypeName> superclassConstraints) {
-    _superclassConstraints._initialize(this, superclassConstraints);
+  OnClauseImpl(this.onKeyword, List<NamedType> superclassConstraints) {
+    _superclassConstraints._initialize2(this, superclassConstraints);
   }
 
   @override
@@ -10866,8 +10880,8 @@
   final NodeListImpl<TypeName> _mixinTypes = NodeListImpl._();
 
   /// Initialize a newly created with clause.
-  WithClauseImpl(this.withKeyword, List<TypeName> mixinTypes) {
-    _mixinTypes._initialize(this, mixinTypes);
+  WithClauseImpl(this.withKeyword, List<NamedType> mixinTypes) {
+    _mixinTypes._initialize2(this, mixinTypes);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
index 0b36161..36ae79d 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
@@ -185,7 +185,7 @@
           TypeParameterList? typeParameters,
           Token equals,
           Token? abstractKeyword,
-          TypeName superclass,
+          NamedType superclass,
           WithClause withClause,
           ImplementsClause? implementsClause,
           Token semicolon) =>
@@ -296,7 +296,7 @@
 
   @override
   ConstructorNameImpl constructorName(
-          TypeName type, Token? period, SimpleIdentifier? name) =>
+          NamedType type, Token? period, SimpleIdentifier? name) =>
       ConstructorNameImpl(
           type as TypeNameImpl, period, name as SimpleIdentifierImpl?);
 
@@ -433,7 +433,7 @@
       ExpressionStatementImpl(expression as ExpressionImpl, semicolon);
 
   @override
-  ExtendsClauseImpl extendsClause(Token extendsKeyword, TypeName superclass) =>
+  ExtendsClauseImpl extendsClause(Token extendsKeyword, NamedType superclass) =>
       ExtendsClauseImpl(extendsKeyword, superclass as TypeNameImpl);
 
   @override
@@ -782,7 +782,7 @@
 
   @override
   ImplementsClauseImpl implementsClause(
-          Token implementsKeyword, List<TypeName> interfaces) =>
+          Token implementsKeyword, List<NamedType> interfaces) =>
       ImplementsClauseImpl(implementsKeyword, interfaces);
 
   @override
@@ -980,6 +980,16 @@
       NamedExpressionImpl(name as LabelImpl, expression as ExpressionImpl);
 
   @override
+  TypeNameImpl namedType({
+    required Identifier name,
+    TypeArgumentList? typeArguments,
+    Token? question,
+  }) =>
+      TypeNameImpl(
+          name as IdentifierImpl, typeArguments as TypeArgumentListImpl?,
+          question: question);
+
+  @override
   NativeClauseImpl nativeClause(Token nativeKeyword, StringLiteral? name) =>
       NativeClauseImpl(nativeKeyword, name as StringLiteralImpl?);
 
@@ -998,7 +1008,7 @@
 
   @override
   OnClauseImpl onClause(
-          Token onKeyword, List<TypeName> superclassConstraints) =>
+          Token onKeyword, List<NamedType> superclassConstraints) =>
       OnClauseImpl(onKeyword, superclassConstraints);
 
   @override
@@ -1231,7 +1241,7 @@
       TypeArgumentListImpl(leftBracket, arguments, rightBracket);
 
   @override
-  TypeLiteralImpl typeLiteral({required TypeName typeName}) =>
+  TypeLiteralImpl typeLiteral({required NamedType typeName}) =>
       TypeLiteralImpl(typeName as TypeNameImpl);
 
   @override
@@ -1316,7 +1326,7 @@
           condition as ExpressionImpl, rightParenthesis, body as StatementImpl);
 
   @override
-  WithClauseImpl withClause(Token withKeyword, List<TypeName> mixinTypes) =>
+  WithClauseImpl withClause(Token withKeyword, List<NamedType> mixinTypes) =>
       WithClauseImpl(withKeyword, mixinTypes);
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index fbfbc17..98d8a04 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -143,9 +143,9 @@
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     if (node.isConst) {
-      TypeName typeName = node.constructorName.type;
+      NamedType namedType = node.constructorName.type;
       _checkForConstWithTypeParameters(
-          typeName, CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS);
+          namedType, CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS);
 
       node.argumentList.accept(this);
 
@@ -285,7 +285,7 @@
   /// See [CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS].
   void _checkForConstWithTypeParameters(
       TypeAnnotation type, ErrorCode errorCode) {
-    if (type is TypeName) {
+    if (type is NamedType) {
       Identifier name = type.name;
       // Should not be a type parameter.
       if (name.staticElement is TypeParameterElement) {
diff --git a/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart b/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
index 62c8072..3b37d629 100644
--- a/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
+++ b/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
@@ -348,7 +348,7 @@
   /// Return `true` if the [node] is a constant type expression.
   bool check(TypeAnnotation? node) {
     if (potentially) {
-      if (node is TypeName) {
+      if (node is NamedType) {
         var element = node.name.staticElement;
         if (element is TypeParameterElement) {
           var enclosing = element.enclosingElement;
@@ -357,7 +357,7 @@
       }
     }
 
-    if (node is TypeName) {
+    if (node is NamedType) {
       if (_isConstantTypeName(node.name)) {
         var arguments = node.typeArguments?.arguments;
         if (arguments != null) {
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 b24466b..14d554a 100644
--- a/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
@@ -63,7 +63,7 @@
       identifier.staticType = type;
       return;
     } else if (element is TypeAliasElement) {
-      if (node.parent is TypeName) {
+      if (node.parent is NamedType) {
         // no type
       } else {
         var type = _typeProvider.typeType;
@@ -129,7 +129,7 @@
         parent is MethodInvocation ||
         parent is PrefixedIdentifier && parent.prefix == node ||
         parent is PropertyAccess ||
-        parent is TypeName) {
+        parent is NamedType) {
       return false;
     }
     return true;
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 379b087..3275ca4 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -1241,36 +1241,36 @@
     var redirectedConstructor = node.redirectedConstructor;
     if (redirectedConstructor == null) return;
 
-    var typeName = redirectedConstructor.type;
-    _typeNameResolver.redirectedConstructor_typeName = typeName;
+    var namedType = redirectedConstructor.type;
+    _typeNameResolver.redirectedConstructor_typeName = namedType;
 
     redirectedConstructor.accept(this);
 
     _typeNameResolver.redirectedConstructor_typeName = null;
   }
 
-  /// Return the [InterfaceType] of the given [typeName].
+  /// Return the [InterfaceType] of the given [namedType].
   ///
   /// If the resulting type is not a valid interface type, return `null`.
   ///
   /// The flag [asClass] specifies if the type will be used as a class, so mixin
   /// declarations are not valid (they declare interfaces and mixins, but not
   /// classes).
-  void _resolveType(TypeNameImpl typeName, ErrorCode errorCode,
+  void _resolveType(TypeNameImpl namedType, ErrorCode errorCode,
       {bool asClass = false}) {
-    _typeNameResolver.classHierarchy_typeName = typeName;
-    visitTypeName(typeName);
+    _typeNameResolver.classHierarchy_typeName = namedType;
+    visitTypeName(namedType);
     _typeNameResolver.classHierarchy_typeName = null;
 
     if (_typeNameResolver.hasErrorReported) {
       return;
     }
 
-    DartType type = typeName.typeOrThrow;
+    DartType type = namedType.typeOrThrow;
     if (type is InterfaceType) {
       ClassElement element = type.element;
       if (element.isEnum || element.isMixin && asClass) {
-        _errorReporter.reportErrorForNode(errorCode, typeName);
+        _errorReporter.reportErrorForNode(errorCode, namedType);
         return;
       }
       return;
@@ -1278,7 +1278,7 @@
 
     // If the type is not an InterfaceType, then visitTypeName() sets the type
     // to be a DynamicTypeImpl
-    Identifier name = typeName.name;
+    Identifier name = namedType.name;
     if (!_libraryElement.shouldIgnoreUndefinedIdentifier(name)) {
       _errorReporter.reportErrorForNode(errorCode, name);
     }
@@ -1293,19 +1293,19 @@
   ///        be an enum
   /// @param dynamicTypeError the error to produce if the type name is "dynamic"
   /// @return an array containing all of the types that were resolved.
-  void _resolveTypes(NodeList<TypeName> typeNames, ErrorCode errorCode) {
-    for (var typeName in typeNames) {
-      _resolveType(typeName as TypeNameImpl, errorCode);
+  void _resolveTypes(NodeList<NamedType> namedTypes, ErrorCode errorCode) {
+    for (var namedType in namedTypes) {
+      _resolveType(namedType as TypeNameImpl, errorCode);
     }
   }
 
   void _resolveWithClause(WithClause? clause) {
     if (clause == null) return;
 
-    for (var typeName in clause.mixinTypes) {
-      _typeNameResolver.withClause_typeName = typeName;
+    for (var namedType in clause.mixinTypes) {
+      _typeNameResolver.withClause_typeName = namedType;
       _resolveType(
-        typeName as TypeNameImpl,
+        namedType as TypeNameImpl,
         CompileTimeErrorCode.MIXIN_OF_NON_CLASS,
       );
       _typeNameResolver.withClause_typeName = null;
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 4c872f9..198ba56 100644
--- a/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart
@@ -82,7 +82,7 @@
         parent is MethodInvocation ||
         parent is PrefixedIdentifier && parent.prefix == node ||
         parent is PropertyAccess ||
-        parent is TypeName) {
+        parent is NamedType) {
       return false;
     }
     return true;
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index e7ac1b0..fb503dd 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -813,7 +813,7 @@
 
     // `is dynamic` or `is! dynamic`
     if (rightType.isDynamic) {
-      var rightTypeStr = rightNode is TypeName ? rightNode.name.name : null;
+      var rightTypeStr = rightNode is NamedType ? rightNode.name.name : null;
       if (rightTypeStr == Keyword.DYNAMIC.lexeme) {
         report();
         return true;
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index 696dfb6..928a9f5 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -100,7 +100,7 @@
   final List<ClassMember> members;
   final ImplementsClause? implementsClause;
   final OnClause? onClause;
-  final TypeName? superclass;
+  final NamedType? superclass;
   final WithClause? withClause;
 
   final List<InterfaceType> directSuperInterfaces = [];
@@ -318,10 +318,10 @@
     }
   }
 
-  /// Verify that the given [typeName] does not extend, implement, or mixes-in
+  /// Verify that the given [namedType] does not extend, implement, or mixes-in
   /// types such as `num` or `String`.
-  bool _checkDirectSuperType(TypeName typeName, ErrorCode errorCode) {
-    if (typeName.isSynthetic) {
+  bool _checkDirectSuperType(NamedType namedType, ErrorCode errorCode) {
+    if (namedType.isSynthetic) {
       return false;
     }
 
@@ -331,10 +331,10 @@
       return false;
     }
 
-    DartType type = typeName.typeOrThrow;
+    DartType type = namedType.typeOrThrow;
     if (type is InterfaceType &&
         typeProvider.isNonSubtypableClass(type.element)) {
-      reporter.reportErrorForNode(errorCode, typeName, [type]);
+      reporter.reportErrorForNode(errorCode, namedType, [type]);
       return true;
     }
 
@@ -347,9 +347,9 @@
   bool _checkDirectSuperTypes() {
     var hasError = false;
     if (implementsClause != null) {
-      for (var typeName in implementsClause!.interfaces) {
+      for (var namedType in implementsClause!.interfaces) {
         if (_checkDirectSuperType(
-          typeName,
+          namedType,
           CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
         )) {
           hasError = true;
@@ -357,9 +357,9 @@
       }
     }
     if (onClause != null) {
-      for (var typeName in onClause!.superclassConstraints) {
+      for (var namedType in onClause!.superclassConstraints) {
         if (_checkDirectSuperType(
-          typeName,
+          namedType,
           CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_DISALLOWED_CLASS,
         )) {
           hasError = true;
@@ -375,9 +375,9 @@
       }
     }
     if (withClause != null) {
-      for (var typeName in withClause!.mixinTypes) {
+      for (var namedType in withClause!.mixinTypes) {
         if (_checkDirectSuperType(
-          typeName,
+          namedType,
           CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS,
         )) {
           hasError = true;
diff --git a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
index 71ab7b9..c6edd49 100644
--- a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
+++ b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
@@ -147,6 +147,15 @@
     _checkForImplicitDynamicInvoke(node);
   }
 
+  void checkNamedType(NamedType node) {
+    _checkForTypeArgumentNotMatchingBounds(node);
+    var parent = node.parent;
+    if (parent is! ConstructorName ||
+        parent.parent is! InstanceCreationExpression) {
+      _checkForRawTypeName(node);
+    }
+  }
+
   void checkSetLiteral(SetOrMapLiteral node) {
     var typeArguments = node.typeArguments;
     if (typeArguments != null) {
@@ -162,15 +171,6 @@
     _checkForImplicitDynamicTypedLiteral(node);
   }
 
-  void checkTypeName(TypeName node) {
-    _checkForTypeArgumentNotMatchingBounds(node);
-    var parent = node.parent;
-    if (parent is! ConstructorName ||
-        parent.parent is! InstanceCreationExpression) {
-      _checkForRawTypeName(node);
-    }
-  }
-
   void _checkForImplicitDynamicInvoke(InvocationExpression node) {
     if (_options.implicitDynamic || node.typeArguments != null) {
       return;
@@ -232,10 +232,10 @@
   /// This checks if [node] refers to a generic type and does not have explicit
   /// or inferred type arguments. When that happens, it reports error code
   /// [HintCode.STRICT_RAW_TYPE].
-  void _checkForRawTypeName(TypeName node) {
-    AstNode parentEscapingTypeArguments(TypeName node) {
+  void _checkForRawTypeName(NamedType node) {
+    AstNode parentEscapingTypeArguments(NamedType node) {
       var parent = node.parent!;
-      while (parent is TypeArgumentList || parent is TypeName) {
+      while (parent is TypeArgumentList || parent is NamedType) {
         if (parent.parent == null) {
           return parent;
         }
@@ -262,10 +262,10 @@
     }
   }
 
-  /// Verify that the type arguments in the given [typeName] are all within
+  /// Verify that the type arguments in the given [namedType] are all within
   /// their bounds.
-  void _checkForTypeArgumentNotMatchingBounds(TypeName typeName) {
-    var type = typeName.type;
+  void _checkForTypeArgumentNotMatchingBounds(NamedType namedType) {
+    var type = namedType.type;
     if (type == null) {
       return;
     }
@@ -298,7 +298,7 @@
         if (!_libraryElement.featureSet.isEnabled(Feature.generic_metadata)) {
           _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT,
-            _typeArgumentErrorNode(typeName, i),
+            _typeArgumentErrorNode(namedType, i),
           );
           continue;
         }
@@ -326,11 +326,11 @@
     }
 
     // If not allowed to be super-bounded, report issues.
-    if (!_shouldAllowSuperBoundedTypes(typeName)) {
+    if (!_shouldAllowSuperBoundedTypes(namedType)) {
       for (var issue in issues) {
         _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
-          _typeArgumentErrorNode(typeName, issue.index),
+          _typeArgumentErrorNode(namedType, issue.index),
           [issue.argument, issue.parameter.name, issue.parameterBound],
         );
       }
@@ -365,7 +365,7 @@
       if (!_typeSystem.isSubtypeOf(typeArgument, bound)) {
         _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
-          _typeArgumentErrorNode(typeName, i),
+          _typeArgumentErrorNode(namedType, i),
           [typeArgument, typeParameter.name, bound],
         );
       }
@@ -442,7 +442,7 @@
   void _checkTypeArgumentConst(
       NodeList<TypeAnnotation> arguments, ErrorCode errorCode) {
     for (TypeAnnotation type in arguments) {
-      if (type is TypeName && type.type is TypeParameterType) {
+      if (type is NamedType && type.type is TypeParameterType) {
         _errorReporter.reportErrorForNode(errorCode, type, [type.name]);
       }
     }
@@ -515,10 +515,10 @@
     return false;
   }
 
-  /// Determines if the given [typeName] occurs in a context where super-bounded
-  /// types are allowed.
-  bool _shouldAllowSuperBoundedTypes(TypeName typeName) {
-    var parent = typeName.parent;
+  /// Determines if the given [namedType] occurs in a context where
+  /// super-bounded types are allowed.
+  bool _shouldAllowSuperBoundedTypes(NamedType namedType) {
+    var parent = namedType.parent;
     if (parent is ExtendsClause) return false;
     if (parent is OnClause) return false;
     if (parent is ClassTypeAlias) return false;
@@ -530,7 +530,7 @@
   }
 
   /// Return the type arguments at [index] from [node], or the [node] itself.
-  static TypeAnnotation _typeArgumentErrorNode(TypeName node, int index) {
+  static TypeAnnotation _typeArgumentErrorNode(NamedType node, int index) {
     var typeArguments = node.typeArguments?.arguments;
     if (typeArguments != null && index < typeArguments.length) {
       return typeArguments[index];
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 8e7e1ae..0d64b24 100644
--- a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
+++ b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
@@ -252,7 +252,7 @@
       return;
     }
     // Ignore places where the element is not actually used.
-    if (node.parent is TypeName) {
+    if (node.parent is NamedType) {
       if (element is ClassElement) {
         AstNode parent2 = node.parent!.parent!;
         if (parent2 is IsExpression) {
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 73d7faf..6493ae6 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -868,23 +868,24 @@
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     ConstructorName constructorName = node.constructorName;
-    TypeName typeName = constructorName.type;
-    DartType type = typeName.typeOrThrow;
+    NamedType namedType = constructorName.type;
+    DartType type = namedType.typeOrThrow;
     if (type is InterfaceType) {
-      _checkForConstOrNewWithAbstractClass(node, typeName, type);
-      _checkForConstOrNewWithEnum(node, typeName, type);
-      _checkForConstOrNewWithMixin(node, typeName, type);
+      _checkForConstOrNewWithAbstractClass(node, namedType, type);
+      _checkForConstOrNewWithEnum(node, namedType, type);
+      _checkForConstOrNewWithMixin(node, namedType, type);
       _requiredParametersVerifier.visitInstanceCreationExpression(node);
       if (node.isConst) {
         _checkForConstWithNonConst(node);
-        _checkForConstWithUndefinedConstructor(node, constructorName, typeName);
-        _checkForConstDeferredClass(node, constructorName, typeName);
+        _checkForConstWithUndefinedConstructor(
+            node, constructorName, namedType);
+        _checkForConstDeferredClass(node, constructorName, namedType);
       } else {
-        _checkForNewWithUndefinedConstructor(node, constructorName, typeName);
+        _checkForNewWithUndefinedConstructor(node, constructorName, namedType);
       }
       _checkForListConstructor(node, type);
     }
-    _checkForImplicitDynamicType(typeName);
+    _checkForImplicitDynamicType(namedType);
     super.visitInstanceCreationExpression(node);
   }
 
@@ -1218,7 +1219,7 @@
 
   @override
   void visitTypeName(TypeName node) {
-    _typeArgumentsVerifier.checkTypeName(node);
+    _typeArgumentsVerifier.checkNamedType(node);
     super.visitTypeName(node);
   }
 
@@ -1296,7 +1297,7 @@
   /// interfaces.
   void _checkClassInheritance(
       NamedCompilationUnitMember node,
-      TypeName? superclass,
+      NamedType? superclass,
       WithClause? withClause,
       ImplementsClause? implementsClause) {
     // Only check for all of the inheritance logic around clauses if there
@@ -1385,7 +1386,7 @@
     for (int mixinNameIndex = 0;
         mixinNameIndex < withClause.mixinTypes.length;
         mixinNameIndex++) {
-      TypeName mixinName = withClause.mixinTypes[mixinNameIndex];
+      NamedType mixinName = withClause.mixinTypes[mixinNameIndex];
       DartType mixinType = mixinName.typeOrThrow;
       if (mixinType is InterfaceType) {
         mixinTypeIndex++;
@@ -1435,11 +1436,11 @@
     if (redirectedElement == null) {
       // If the element is null, we check for the
       // REDIRECT_TO_MISSING_CONSTRUCTOR case
-      TypeName constructorTypeName = redirectedConstructor.type;
-      DartType redirectedType = constructorTypeName.typeOrThrow;
+      NamedType constructorNamedType = redirectedConstructor.type;
+      DartType redirectedType = constructorNamedType.typeOrThrow;
       if (redirectedType.element != null && !redirectedType.isDynamic) {
         // Prepare the constructor name
-        String constructorStrName = constructorTypeName.name.name;
+        String constructorStrName = constructorNamedType.name.name;
         if (redirectedConstructor.name != null) {
           constructorStrName += ".${redirectedConstructor.name!.name}";
         }
@@ -1636,7 +1637,7 @@
     }
 
     if (withClause != null) {
-      for (TypeName type in withClause.mixinTypes) {
+      for (NamedType type in withClause.mixinTypes) {
         var mixinElement = type.name.staticElement;
         if (mixinElement != null && mixinElement.name == "Function") {
           errorReporter.reportErrorForNode(
@@ -1979,13 +1980,13 @@
 
   /// Verify that the given 'const' instance creation [expression] is not
   /// creating a deferred type. The [constructorName] is the constructor name,
-  /// always non-`null`. The [typeName] is the name of the type defining the
+  /// always non-`null`. The [namedType] is the name of the type defining the
   /// constructor, always non-`null`.
   ///
   /// See [CompileTimeErrorCode.CONST_DEFERRED_CLASS].
   void _checkForConstDeferredClass(InstanceCreationExpression expression,
-      ConstructorName constructorName, TypeName typeName) {
-    if (typeName.isDeferred) {
+      ConstructorName constructorName, NamedType namedType) {
+    if (namedType.isDeferred) {
       errorReporter.reportErrorForNode(
           CompileTimeErrorCode.CONST_DEFERRED_CLASS, constructorName);
     }
@@ -2003,13 +2004,13 @@
   }
 
   /// Verify that the given instance creation [expression] is not being invoked
-  /// on an abstract class. The [typeName] is the [TypeName] of the
+  /// on an abstract class. The [namedType] is the [NamedType] of the
   /// [ConstructorName] from the [InstanceCreationExpression], this is the AST
   /// node that the error is attached to. The [type] is the type being
   /// constructed with this [InstanceCreationExpression].
   void _checkForConstOrNewWithAbstractClass(
       InstanceCreationExpression expression,
-      TypeName typeName,
+      NamedType namedType,
       InterfaceType type) {
     if (type.element.isAbstract && !type.element.isMixin) {
       var element = expression.constructorName.staticElement;
@@ -2018,36 +2019,36 @@
             (expression as InstanceCreationExpressionImpl).isImplicit;
         if (!isImplicit) {
           errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.INSTANTIATE_ABSTRACT_CLASS, typeName);
+              CompileTimeErrorCode.INSTANTIATE_ABSTRACT_CLASS, namedType);
         } else {
           errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.INSTANTIATE_ABSTRACT_CLASS, typeName);
+              CompileTimeErrorCode.INSTANTIATE_ABSTRACT_CLASS, namedType);
         }
       }
     }
   }
 
   /// Verify that the given instance creation [expression] is not being invoked
-  /// on an enum. The [typeName] is the [TypeName] of the [ConstructorName] from
+  /// on an enum. The [namedType] is the [NamedType] of the [ConstructorName] from
   /// the [InstanceCreationExpression], this is the AST node that the error is
   /// attached to. The [type] is the type being constructed with this
   /// [InstanceCreationExpression].
   ///
   /// See [CompileTimeErrorCode.INSTANTIATE_ENUM].
   void _checkForConstOrNewWithEnum(InstanceCreationExpression expression,
-      TypeName typeName, InterfaceType type) {
+      NamedType namedType, InterfaceType type) {
     if (type.element.isEnum) {
       errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.INSTANTIATE_ENUM, typeName);
+          CompileTimeErrorCode.INSTANTIATE_ENUM, namedType);
     }
   }
 
   /// Verify that the given [expression] is not a mixin instantiation.
   void _checkForConstOrNewWithMixin(InstanceCreationExpression expression,
-      TypeName typeName, InterfaceType type) {
+      NamedType namedType, InterfaceType type) {
     if (type.element.isMixin) {
       errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.MIXIN_INSTANTIATE, typeName);
+          CompileTimeErrorCode.MIXIN_INSTANTIATE, namedType);
     }
   }
 
@@ -2073,7 +2074,7 @@
 
   /// Verify that if the given 'const' instance creation [expression] is being
   /// invoked on the resolved constructor. The [constructorName] is the
-  /// constructor name, always non-`null`. The [typeName] is the name of the
+  /// constructor name, always non-`null`. The [namedType] is the name of the
   /// type defining the constructor, always non-`null`.
   ///
   /// This method assumes that the instance creation was tested to be 'const'
@@ -2084,12 +2085,12 @@
   void _checkForConstWithUndefinedConstructor(
       InstanceCreationExpression expression,
       ConstructorName constructorName,
-      TypeName typeName) {
+      NamedType namedType) {
     // OK if resolved
     if (constructorName.staticElement != null) {
       return;
     }
-    DartType type = typeName.typeOrThrow;
+    DartType type = namedType.typeOrThrow;
     if (type is InterfaceType) {
       ClassElement element = type.element;
       if (element.isEnum) {
@@ -2097,7 +2098,7 @@
         return;
       }
     }
-    Identifier className = typeName.name;
+    Identifier className = namedType.name;
     // report as named or default constructor absence
     var name = constructorName.name;
     if (name != null) {
@@ -2206,7 +2207,7 @@
     }
 
     // Use an explicit string instead of [loopType] to remove the "<E>".
-    String loopTypeName = awaitKeyword != null ? "Stream" : "Iterable";
+    String loopNamedType = awaitKeyword != null ? "Stream" : "Iterable";
 
     // The object being iterated has to implement Iterable<T> for some T that
     // is assignable to the variable's type.
@@ -2225,7 +2226,7 @@
       errorReporter.reportErrorForNode(
         CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE,
         node.iterable,
-        [iterableType, loopTypeName],
+        [iterableType, loopNamedType],
       );
       return false;
     }
@@ -2249,7 +2250,7 @@
       errorReporter.reportErrorForNode(
         CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE,
         node.iterable,
-        [iterableType, loopTypeName, variableType],
+        [iterableType, loopNamedType, variableType],
       );
     }
 
@@ -2322,7 +2323,7 @@
   /// Verify that the given extends [clause] does not extend a deferred class.
   ///
   /// See [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS].
-  void _checkForExtendsDeferredClass(TypeName? superclass) {
+  void _checkForExtendsDeferredClass(NamedType? superclass) {
     if (superclass == null) {
       return;
     }
@@ -2334,7 +2335,7 @@
   /// 'num' or 'String'.
   ///
   /// See [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS].
-  bool _checkForExtendsDisallowedClass(TypeName? superclass) {
+  bool _checkForExtendsDisallowedClass(NamedType? superclass) {
     if (superclass == null) {
       return false;
     }
@@ -2342,7 +2343,7 @@
         superclass, CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS);
   }
 
-  /// Verify that the given [typeName] does not extend, implement or mixin
+  /// Verify that the given [namedType] does not extend, implement or mixin
   /// classes that are deferred.
   ///
   /// See [_checkForExtendsDeferredClass],
@@ -2353,18 +2354,18 @@
   /// [CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS], and
   /// [CompileTimeErrorCode.MIXIN_DEFERRED_CLASS].
   bool _checkForExtendsOrImplementsDeferredClass(
-      TypeName typeName, ErrorCode errorCode) {
-    if (typeName.isSynthetic) {
+      NamedType namedType, ErrorCode errorCode) {
+    if (namedType.isSynthetic) {
       return false;
     }
-    if (typeName.isDeferred) {
-      errorReporter.reportErrorForNode(errorCode, typeName);
+    if (namedType.isDeferred) {
+      errorReporter.reportErrorForNode(errorCode, namedType);
       return true;
     }
     return false;
   }
 
-  /// Verify that the given [typeName] does not extend, implement or mixin
+  /// Verify that the given [namedType] does not extend, implement or mixin
   /// classes such as 'num' or 'String'.
   ///
   /// TODO(scheglov) Remove this method, when all inheritance / override
@@ -2372,8 +2373,8 @@
   /// inheritance is completely wrong, so that we don't need to check anything
   /// else.
   bool _checkForExtendsOrImplementsDisallowedClass(
-      TypeName typeName, ErrorCode errorCode) {
-    if (typeName.isSynthetic) {
+      NamedType namedType, ErrorCode errorCode) {
+    if (namedType.isSynthetic) {
       return false;
     }
     // The SDK implementation may implement disallowed types. For example,
@@ -2381,7 +2382,7 @@
     if (_currentLibrary.source.isInSystemLibrary) {
       return false;
     }
-    var type = typeName.type;
+    var type = namedType.type;
     return type is InterfaceType &&
         _typeProvider.isNonSubtypableClass(type.element);
   }
@@ -2538,7 +2539,7 @@
       return false;
     }
     bool foundError = false;
-    for (TypeName type in clause.interfaces) {
+    for (NamedType type in clause.interfaces) {
       if (_checkForExtendsOrImplementsDisallowedClass(
           type, CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS)) {
         foundError = true;
@@ -2587,7 +2588,7 @@
   void _checkForImplicitDynamicType(TypeAnnotation? node) {
     if (_options.implicitDynamic ||
         node == null ||
-        (node is TypeName && node.typeArguments != null)) {
+        (node is NamedType && node.typeArguments != null)) {
       return;
     }
     DartType type = node.typeOrThrow;
@@ -3046,7 +3047,7 @@
   ///
   /// See [CompileTimeErrorCode.MIXIN_CLASS_DECLARES_CONSTRUCTOR].
   bool _checkForMixinClassDeclaresConstructor(
-      TypeName mixinName, ClassElement mixinElement) {
+      NamedType mixinName, ClassElement mixinElement) {
     for (ConstructorElement constructor in mixinElement.constructors) {
       if (!constructor.isSynthetic && !constructor.isFactory) {
         errorReporter.reportErrorForNode(
@@ -3066,7 +3067,7 @@
   ///
   /// See [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT].
   bool _checkForMixinInheritsNotFromObject(
-      TypeName mixinName, ClassElement mixinElement) {
+      NamedType mixinName, ClassElement mixinElement) {
     var mixinSupertype = mixinElement.supertype;
     if (mixinSupertype == null || mixinSupertype.isDartCoreObject) {
       var mixins = mixinElement.mixins;
@@ -3087,7 +3088,8 @@
   /// Check that superclass constrains for the mixin type of [mixinName] at
   /// the [mixinIndex] position in the mixins list are satisfied by the
   /// [_enclosingClass], or a previous mixin.
-  bool _checkForMixinSuperclassConstraints(int mixinIndex, TypeName mixinName) {
+  bool _checkForMixinSuperclassConstraints(
+      int mixinIndex, NamedType mixinName) {
     InterfaceType mixinType = mixinName.type as InterfaceType;
     for (var constraint in mixinType.superclassConstraints) {
       var superType = _enclosingClass!.supertype as InterfaceTypeImpl;
@@ -3121,7 +3123,7 @@
   /// Check that the superclass of the given [mixinElement] at the given
   /// [mixinIndex] in the list of mixins of [_enclosingClass] has concrete
   /// implementations of all the super-invoked members of the [mixinElement].
-  bool _checkForMixinSuperInvokedMembers(int mixinIndex, TypeName mixinName,
+  bool _checkForMixinSuperInvokedMembers(int mixinIndex, NamedType mixinName,
       ClassElement mixinElement, InterfaceType mixinType) {
     var mixinElementImpl = mixinElement as ClassElementImpl;
     if (mixinElementImpl.superInvokedNames.isEmpty) {
@@ -3173,7 +3175,7 @@
   /// library that defines a private member that conflicts with a private name
   /// from the same library but from a superclass or a different mixin.
   void _checkForMixinWithConflictingPrivateMember(
-      WithClause? withClause, TypeName? superclassName) {
+      WithClause? withClause, NamedType? superclassName) {
     if (withClause == null) {
       return;
     }
@@ -3188,18 +3190,18 @@
     /// (which is defined in the given [library]) and it conflicts with another
     /// definition of that name inherited from the superclass.
     bool isConflictingName(
-        String name, LibraryElement library, TypeName typeName) {
+        String name, LibraryElement library, NamedType namedType) {
       if (Identifier.isPrivateName(name)) {
         Map<String, String> names =
             mixedInNames.putIfAbsent(library, () => <String, String>{});
         if (names.containsKey(name)) {
           errorReporter.reportErrorForNode(
               CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION,
-              typeName,
-              [name, typeName.name.name, names[name]]);
+              namedType,
+              [name, namedType.name.name, names[name]]);
           return true;
         }
-        names[name] = typeName.name.name;
+        names[name] = namedType.name.name;
         var inheritedMember = _inheritanceManager.getMember2(
           declaredSupertype.element,
           Name(library.source.uri, name),
@@ -3208,9 +3210,9 @@
         if (inheritedMember != null) {
           errorReporter.reportErrorForNode(
               CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION,
-              typeName, [
+              namedType, [
             name,
-            typeName.name.name,
+            namedType.name.name,
             inheritedMember.enclosingElement.name
           ]);
           return true;
@@ -3219,7 +3221,7 @@
       return false;
     }
 
-    for (TypeName mixinType in withClause.mixinTypes) {
+    for (NamedType mixinType in withClause.mixinTypes) {
       DartType type = mixinType.typeOrThrow;
       if (type is InterfaceType) {
         LibraryElement library = type.element.library;
@@ -3272,8 +3274,8 @@
   }
 
   /// Verify that the given instance creation [expression] invokes an existing
-  /// constructor. The [constructorName] is the constructor name. The [typeName]
-  /// is the name of the type defining the constructor.
+  /// constructor. The [constructorName] is the constructor name.
+  /// The [namedType] is the name of the type defining the constructor.
   ///
   /// This method assumes that the instance creation was tested to be 'new'
   /// before being called.
@@ -3282,12 +3284,12 @@
   void _checkForNewWithUndefinedConstructor(
       InstanceCreationExpression expression,
       ConstructorName constructorName,
-      TypeName typeName) {
+      NamedType namedType) {
     // OK if resolved
     if (constructorName.staticElement != null) {
       return;
     }
-    DartType type = typeName.typeOrThrow;
+    DartType type = namedType.typeOrThrow;
     if (type is InterfaceType) {
       ClassElement element = type.element;
       if (element.isEnum || element.isMixin) {
@@ -3296,7 +3298,7 @@
       }
     }
     // prepare class name
-    Identifier className = typeName.name;
+    Identifier className = namedType.name;
     // report as named or default constructor absence
     var name = constructorName.name;
     if (name != null) {
@@ -3361,7 +3363,7 @@
     }
   }
 
-  bool _checkForNoGenerativeConstructorsInSuperclass(TypeName? superclass) {
+  bool _checkForNoGenerativeConstructorsInSuperclass(NamedType? superclass) {
     var superType = _enclosingClass!.supertype;
     if (superType == null) {
       return false;
@@ -3441,16 +3443,16 @@
     }
   }
 
-  /// Verify the [typeName], used as the return type of a setter, is valid
+  /// Verify the [namedType], used as the return type of a setter, is valid
   /// (either `null` or the type 'void').
   ///
   /// See [StaticWarningCode.NON_VOID_RETURN_FOR_SETTER].
-  void _checkForNonVoidReturnTypeForSetter(TypeAnnotation? typeName) {
-    if (typeName != null) {
-      DartType type = typeName.typeOrThrow;
+  void _checkForNonVoidReturnTypeForSetter(TypeAnnotation? namedType) {
+    if (namedType != null) {
+      DartType type = namedType.typeOrThrow;
       if (!type.isVoid) {
         errorReporter.reportErrorForNode(
-            CompileTimeErrorCode.NON_VOID_RETURN_FOR_SETTER, typeName);
+            CompileTimeErrorCode.NON_VOID_RETURN_FOR_SETTER, namedType);
       }
     }
   }
@@ -3548,17 +3550,17 @@
       return false;
     }
     bool problemReported = false;
-    for (TypeName typeName in onClause.superclassConstraints) {
-      DartType type = typeName.typeOrThrow;
+    for (NamedType namedType in onClause.superclassConstraints) {
+      DartType type = namedType.typeOrThrow;
       if (type is InterfaceType) {
         if (_checkForExtendsOrImplementsDisallowedClass(
-            typeName,
+            namedType,
             CompileTimeErrorCode
                 .MIXIN_SUPER_CLASS_CONSTRAINT_DISALLOWED_CLASS)) {
           problemReported = true;
         } else {
           if (_checkForExtendsOrImplementsDeferredClass(
-              typeName,
+              namedType,
               CompileTimeErrorCode
                   .MIXIN_SUPER_CLASS_CONSTRAINT_DEFERRED_CLASS)) {
             problemReported = true;
@@ -3737,8 +3739,8 @@
           redirectedClass.isAbstract &&
           redirectedElement != null &&
           !redirectedElement.isFactory) {
-        String enclosingTypeName = _enclosingClass!.displayName;
-        String constructorStrName = enclosingTypeName;
+        String enclosingNamedType = _enclosingClass!.displayName;
+        String constructorStrName = enclosingNamedType;
         if (declaration.name != null) {
           constructorStrName += ".${declaration.name!.name}";
         }
@@ -3761,15 +3763,15 @@
           RedirectingConstructorInvocation invocation = initializer;
           var redirectingElement = invocation.staticElement;
           if (redirectingElement == null) {
-            String enclosingTypeName = _enclosingClass!.displayName;
-            String constructorStrName = enclosingTypeName;
+            String enclosingNamedType = _enclosingClass!.displayName;
+            String constructorStrName = enclosingNamedType;
             if (invocation.constructorName != null) {
               constructorStrName += ".${invocation.constructorName!.name}";
             }
             errorReporter.reportErrorForNode(
                 CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR,
                 invocation,
-                [constructorStrName, enclosingTypeName]);
+                [constructorStrName, enclosingNamedType]);
           } else {
             if (redirectingElement.isFactory) {
               errorReporter.reportErrorForNode(
@@ -3844,20 +3846,20 @@
     }
   }
 
-  void _checkForRepeatedType(List<TypeName>? typeNames, ErrorCode errorCode) {
-    if (typeNames == null) {
+  void _checkForRepeatedType(List<NamedType>? namedTypes, ErrorCode errorCode) {
+    if (namedTypes == null) {
       return;
     }
 
-    int count = typeNames.length;
+    int count = namedTypes.length;
     List<bool> detectedRepeatOnIndex = List<bool>.filled(count, false);
     for (int i = 0; i < count; i++) {
       if (!detectedRepeatOnIndex[i]) {
-        var type = typeNames[i].type;
+        var type = namedTypes[i].type;
         if (type is InterfaceType) {
           var element = type.element;
           for (int j = i + 1; j < count; j++) {
-            var otherNode = typeNames[j];
+            var otherNode = namedTypes[j];
             var otherType = otherNode.type;
             if (otherType is InterfaceType && otherType.element == element) {
               detectedRepeatOnIndex[j] = true;
@@ -4035,7 +4037,7 @@
   ///
   /// See [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS].
   void _checkForTypeAnnotationDeferredClass(TypeAnnotation? type) {
-    if (type is TypeName && type.isDeferred) {
+    if (type is NamedType && type.isDeferred) {
       errorReporter.reportErrorForNode(
           CompileTimeErrorCode.TYPE_ANNOTATION_DEFERRED_CLASS,
           type,
@@ -4060,7 +4062,7 @@
         TypeParameter? current = parameter;
         for (var step = 0; current != null; step++) {
           var bound = current.bound;
-          if (bound is TypeName) {
+          if (bound is NamedType) {
             current = elementToNode[bound.name.staticElement];
           } else {
             current = null;
@@ -4636,16 +4638,16 @@
     var interfacesMerger = InterfacesMerger(typeSystem);
     interfacesMerger.addWithSupertypes(supertype);
 
-    for (var typeName in withClause.mixinTypes) {
-      var mixinType = typeName.type;
+    for (var namedType in withClause.mixinTypes) {
+      var mixinType = namedType.type;
       if (mixinType is InterfaceType) {
         var mixinElement = mixinType.element;
-        if (typeName.typeArguments == null) {
+        if (namedType.typeArguments == null) {
           var mixinSupertypeConstraints = typeSystem
               .gatherMixinSupertypeConstraintsForInference(mixinElement);
           if (mixinSupertypeConstraints.isNotEmpty) {
             var matchingInterfaceTypes = _findInterfaceTypesForConstraints(
-              typeName,
+              namedType,
               mixinSupertypeConstraints,
               interfacesMerger.typeList,
             );
@@ -4664,8 +4666,8 @@
                 errorReporter.reportErrorForToken(
                     CompileTimeErrorCode
                         .MIXIN_INFERENCE_NO_POSSIBLE_SUBSTITUTION,
-                    typeName.name.beginToken,
-                    [typeName]);
+                    namedType.name.beginToken,
+                    [namedType]);
               }
             }
           }
@@ -4810,7 +4812,7 @@
     }
   }
 
-  InterfaceType? _findInterfaceTypeForMixin(TypeName mixin,
+  InterfaceType? _findInterfaceTypeForMixin(NamedType mixin,
       InterfaceType supertypeConstraint, List<InterfaceType> interfaceTypes) {
     var element = supertypeConstraint.element;
     InterfaceType? foundInterfaceType;
@@ -4838,7 +4840,7 @@
   }
 
   List<InterfaceType>? _findInterfaceTypesForConstraints(
-      TypeName mixin,
+      NamedType mixin,
       List<InterfaceType> supertypeConstraints,
       List<InterfaceType> interfaceTypes) {
     var result = <InterfaceType>[];
diff --git a/pkg/analyzer/lib/src/generated/ffi_verifier.dart b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
index 5c672ce..f7ecada 100644
--- a/pkg/analyzer/lib/src/generated/ffi_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
@@ -69,7 +69,7 @@
     // Only the Allocator, Opaque and Struct class may be extended.
     var extendsClause = node.extendsClause;
     if (extendsClause != null) {
-      final TypeName superclass = extendsClause.superclass;
+      final NamedType superclass = extendsClause.superclass;
       final ffiClass = superclass.ffiClass;
       if (ffiClass != null) {
         final className = ffiClass.name;
@@ -99,7 +99,7 @@
     }
 
     // No classes from the FFI may be explicitly implemented.
-    void checkSupertype(TypeName typename, FfiCode subtypeOfFfiCode,
+    void checkSupertype(NamedType typename, FfiCode subtypeOfFfiCode,
         FfiCode subtypeOfStructCode) {
       final superName = typename.name.staticElement?.name;
       if (superName == _allocatorClassName) {
@@ -116,14 +116,14 @@
 
     var implementsClause = node.implementsClause;
     if (implementsClause != null) {
-      for (TypeName type in implementsClause.interfaces) {
+      for (NamedType type in implementsClause.interfaces) {
         checkSupertype(type, FfiCode.SUBTYPE_OF_FFI_CLASS_IN_IMPLEMENTS,
             FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_IMPLEMENTS);
       }
     }
     var withClause = node.withClause;
     if (withClause != null) {
-      for (TypeName type in withClause.mixinTypes) {
+      for (NamedType type in withClause.mixinTypes) {
         checkSupertype(type, FfiCode.SUBTYPE_OF_FFI_CLASS_IN_WITH,
             FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_WITH);
       }
@@ -702,7 +702,7 @@
         final typeArg = (declaredType as InterfaceType).typeArguments.single;
         if (!_isSized(typeArg)) {
           AstNode errorNode = fieldType;
-          if (fieldType is TypeName) {
+          if (fieldType is NamedType) {
             var typeArguments = fieldType.typeArguments?.arguments;
             if (typeArguments != null && typeArguments.isNotEmpty) {
               errorNode = typeArguments[0];
@@ -1354,7 +1354,7 @@
   }
 }
 
-extension on TypeName {
+extension on NamedType {
   /// If this is a name of class from `dart:ffi`, return it.
   ClassElement? get ffiClass {
     return name.staticElement.ffiClass;
diff --git a/pkg/analyzer/lib/src/services/available_declarations.dart b/pkg/analyzer/lib/src/services/available_declarations.dart
index 715eef2..588b150 100644
--- a/pkg/analyzer/lib/src/services/available_declarations.dart
+++ b/pkg/analyzer/lib/src/services/available_declarations.dart
@@ -1694,7 +1694,7 @@
             returnType: _getTypeAnnotationString(functionType.returnType),
             typeParameters: functionType.typeParameters?.toSource(),
           );
-        } else if (type is TypeName && type.name.name.isNotEmpty) {
+        } else if (type is NamedType && type.name.name.isNotEmpty) {
           addDeclaration(
             isDeprecated: isDeprecated,
             kind: DeclarationKind.TYPE_ALIAS,
diff --git a/pkg/analyzer/lib/src/summary2/default_types_builder.dart b/pkg/analyzer/lib/src/summary2/default_types_builder.dart
index 388c95b..356de04 100644
--- a/pkg/analyzer/lib/src/summary2/default_types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/default_types_builder.dart
@@ -122,7 +122,7 @@
             current != null && step < typeParameters.length;
             ++step) {
           var bound = current.bound;
-          if (bound is TypeName) {
+          if (bound is NamedType) {
             var typeNameIdentifier = bound.name;
             if (typeNameIdentifier is SimpleIdentifier) {
               current = typeParametersByName[typeNameIdentifier.name];
diff --git a/pkg/analyzer/lib/src/summary2/simply_bounded.dart b/pkg/analyzer/lib/src/summary2/simply_bounded.dart
index f279f1b..cc9870c 100644
--- a/pkg/analyzer/lib/src/summary2/simply_bounded.dart
+++ b/pkg/analyzer/lib/src/summary2/simply_bounded.dart
@@ -252,7 +252,7 @@
   /// Otherwise `true` is returned.
   bool _visitType(List<SimplyBoundedNode> dependencies, TypeAnnotation type,
       bool allowTypeParameters) {
-    if (type is TypeName) {
+    if (type is NamedType) {
       var element = type.name.staticElement;
 
       if (element is TypeParameterElement) {
diff --git a/pkg/analyzer/lib/src/summary2/type_alias.dart b/pkg/analyzer/lib/src/summary2/type_alias.dart
index b48b646..2c241ad 100644
--- a/pkg/analyzer/lib/src/summary2/type_alias.dart
+++ b/pkg/analyzer/lib/src/summary2/type_alias.dart
@@ -85,7 +85,7 @@
     if (hasSelfReference) return;
     if (node == null) return;
 
-    if (node is TypeName) {
+    if (node is NamedType) {
       var element = node.name.staticElement;
       if (element is! ElementImpl) {
         return;
diff --git a/pkg/analyzer/lib/src/summary2/types_builder.dart b/pkg/analyzer/lib/src/summary2/types_builder.dart
index 4f9d087..fd30689 100644
--- a/pkg/analyzer/lib/src/summary2/types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/types_builder.dart
@@ -40,7 +40,7 @@
   return true;
 }
 
-List<InterfaceType> _toInterfaceTypeList(List<TypeName>? nodeList) {
+List<InterfaceType> _toInterfaceTypeList(List<NamedType>? nodeList) {
   if (nodeList != null) {
     return nodeList
         .map((e) => e.type)
diff --git a/pkg/analyzer/test/generated/expression_parser_test.dart b/pkg/analyzer/test/generated/expression_parser_test.dart
index 9119e76..c077772 100644
--- a/pkg/analyzer/test/generated/expression_parser_test.dart
+++ b/pkg/analyzer/test/generated/expression_parser_test.dart
@@ -1044,7 +1044,7 @@
     expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
-    TypeName type = name.type;
+    NamedType type = name.type;
     expect(type.name.name, 'A.B');
     expect(type.typeArguments, isNull);
     expect(name.period, isNull);
@@ -1061,7 +1061,7 @@
     expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
-    TypeName type = name.type;
+    NamedType type = name.type;
     expect(type, isNotNull);
     expect(type.typeArguments, isNull);
     expect(name.period, isNotNull);
@@ -1079,7 +1079,7 @@
     expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
-    TypeName type = name.type;
+    NamedType type = name.type;
     expect(type, isNotNull);
     expect(type.typeArguments!.arguments, hasLength(1));
     expect(name.period, isNotNull);
@@ -1096,7 +1096,7 @@
     expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
-    TypeName type = name.type;
+    NamedType type = name.type;
     expect(type, isNotNull);
     expect(type.typeArguments!.arguments, hasLength(1));
     expect(name.period, isNull);
@@ -1113,7 +1113,7 @@
     expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
-    TypeName type = name.type;
+    NamedType type = name.type;
     expect(type, isNotNull);
     expect(type.typeArguments, isNull);
     expect(name.period, isNull);
@@ -1130,7 +1130,7 @@
     expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
-    TypeName type = name.type;
+    NamedType type = name.type;
     expect(type, isNotNull);
     expect(type.typeArguments, isNull);
     expect(name.period, isNull);
@@ -1147,7 +1147,7 @@
     expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
-    TypeName type = name.type;
+    NamedType type = name.type;
     expect(type, isNotNull);
     expect(type.typeArguments!.arguments, hasLength(1));
     expect(name.period, isNotNull);
@@ -1164,7 +1164,7 @@
     expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
-    TypeName type = name.type;
+    NamedType type = name.type;
     expect(type, isNotNull);
     expect(type.typeArguments, isNull);
     expect(name.period, isNotNull);
@@ -1182,7 +1182,7 @@
     expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
-    TypeName type = name.type;
+    NamedType type = name.type;
     expect(type, isNotNull);
     expect(type.typeArguments!.arguments, hasLength(1));
     expect(name.period, isNull);
@@ -1776,8 +1776,8 @@
     var identifier = asExpression.expression as SimpleIdentifier;
     expect(identifier.name, 'x');
     expect(asExpression.asOperator, isNotNull);
-    var typeName = asExpression.type as NamedType;
-    expect(typeName.name.name, 'Y');
+    var namedType = asExpression.type as NamedType;
+    expect(namedType.name.name, 'Y');
   }
 
   void test_parseRelationalExpression_as_functionType_noReturnType() {
@@ -1850,8 +1850,8 @@
     var identifier = isExpression.expression as SimpleIdentifier;
     expect(identifier.name, 'x');
     expect(isExpression.isOperator, isNotNull);
-    var typeName = isExpression.type as NamedType;
-    expect(typeName.name.name, 'Y');
+    var namedType = isExpression.type as NamedType;
+    expect(namedType.name.name, 'Y');
   }
 
   void test_parseRelationalExpression_isNot() {
diff --git a/pkg/analyzer/test/generated/recovery_parser_test.dart b/pkg/analyzer/test/generated/recovery_parser_test.dart
index e110012..dd2b25d 100644
--- a/pkg/analyzer/test/generated/recovery_parser_test.dart
+++ b/pkg/analyzer/test/generated/recovery_parser_test.dart
@@ -1086,7 +1086,7 @@
     expect(expression.notOperator, isNotNull);
     TypeAnnotation type = expression.type;
     expect(type, isNotNull);
-    expect(type is TypeName && type.name.isSynthetic, isTrue);
+    expect(type is NamedType && type.name.isSynthetic, isTrue);
     var thenStatement = ifStatement.thenStatement as ExpressionStatement;
     expect(thenStatement.semicolon!.isSynthetic, isTrue);
     var simpleId = thenStatement.expression as SimpleIdentifier;
diff --git a/pkg/analyzer/test/generated/simple_parser_test.dart b/pkg/analyzer/test/generated/simple_parser_test.dart
index a5072f7..73804a4 100644
--- a/pkg/analyzer/test/generated/simple_parser_test.dart
+++ b/pkg/analyzer/test/generated/simple_parser_test.dart
@@ -1750,8 +1750,8 @@
 
   void test_parseTypeAnnotation_named() {
     createParser('A<B>');
-    var typeName = parser.parseTypeAnnotation(false) as NamedType;
-    expectNotNullIfNoErrors(typeName);
+    var namedType = parser.parseTypeAnnotation(false) as NamedType;
+    expectNotNullIfNoErrors(namedType);
     assertNoErrors();
   }
 
@@ -1851,20 +1851,20 @@
 
   void test_parseTypeName_parameterized() {
     createParser('List<int>');
-    TypeName typeName = parser.parseTypeName(false);
-    expectNotNullIfNoErrors(typeName);
+    NamedType namedType = parser.parseTypeName(false);
+    expectNotNullIfNoErrors(namedType);
     assertNoErrors();
-    expect(typeName.name, isNotNull);
-    expect(typeName.typeArguments, isNotNull);
+    expect(namedType.name, isNotNull);
+    expect(namedType.typeArguments, isNotNull);
   }
 
   void test_parseTypeName_simple() {
     createParser('int');
-    TypeName typeName = parser.parseTypeName(false);
-    expectNotNullIfNoErrors(typeName);
+    NamedType namedType = parser.parseTypeName(false);
+    expectNotNullIfNoErrors(namedType);
     assertNoErrors();
-    expect(typeName.name, isNotNull);
-    expect(typeName.typeArguments, isNull);
+    expect(namedType.name, isNotNull);
+    expect(namedType.typeArguments, isNull);
   }
 
   void test_parseTypeParameter_bounded_functionType_noReturn() {
diff --git a/pkg/analyzer/test/generated/top_level_parser_test.dart b/pkg/analyzer/test/generated/top_level_parser_test.dart
index 0ec3d0a..6962aff 100644
--- a/pkg/analyzer/test/generated/top_level_parser_test.dart
+++ b/pkg/analyzer/test/generated/top_level_parser_test.dart
@@ -92,15 +92,15 @@
     // Ensure type parsed as "Future<List<[empty name]>>".
     expect(declaration.variables.type, isNotNull);
     expect(declaration.variables.type!.question, isNull);
-    expect(declaration.variables.type, TypeMatcher<TypeName>());
+    expect(declaration.variables.type, TypeMatcher<NamedType>());
     var type = declaration.variables.type as NamedType;
     expect(type.name.name, "Future");
     expect(type.typeArguments!.arguments.length, 1);
-    expect(type.typeArguments!.arguments.single, TypeMatcher<TypeName>());
+    expect(type.typeArguments!.arguments.single, TypeMatcher<NamedType>());
     var subType = type.typeArguments!.arguments.single as NamedType;
     expect(subType.name.name, "List");
     expect(subType.typeArguments!.arguments.length, 1);
-    expect(subType.typeArguments!.arguments.single, TypeMatcher<TypeName>());
+    expect(subType.typeArguments!.arguments.single, TypeMatcher<NamedType>());
     var subSubType = subType.typeArguments!.arguments.single as NamedType;
     expect(subSubType.name.name, "");
     expect(subSubType.typeArguments, isNull);
@@ -573,7 +573,7 @@
     expect(unit.declarations, hasLength(1));
   }
 
-  void test_parseCompilationUnit_pseudo_asTypeName() {
+  void test_parseCompilationUnit_pseudo_asNamedType() {
     for (Keyword keyword in Keyword.values) {
       if (keyword.isPseudo) {
         String lexeme = keyword.lexeme;
@@ -1949,7 +1949,7 @@
     expect(declaration.onClause, isNull);
     var implementsClause = declaration.implementsClause!;
     expect(implementsClause.implementsKeyword, isNotNull);
-    NodeList<TypeName> interfaces = implementsClause.interfaces;
+    NodeList<NamedType> interfaces = implementsClause.interfaces;
     expect(interfaces, hasLength(1));
     expect(interfaces[0].name.name, 'B');
     expect(interfaces[0].typeArguments, isNull);
@@ -1971,7 +1971,7 @@
     expect(declaration.onClause, isNull);
     var implementsClause = declaration.implementsClause!;
     expect(implementsClause.implementsKeyword, isNotNull);
-    NodeList<TypeName> interfaces = implementsClause.interfaces;
+    NodeList<NamedType> interfaces = implementsClause.interfaces;
     expect(interfaces, hasLength(2));
     expect(interfaces[0].name.name, 'B');
     expect(interfaces[0].typeArguments!.arguments, hasLength(1));
@@ -2013,7 +2013,7 @@
     expect(declaration.documentationComment, isNull);
     var onClause = declaration.onClause!;
     expect(onClause.onKeyword, isNotNull);
-    NodeList<TypeName> constraints = onClause.superclassConstraints;
+    NodeList<NamedType> constraints = onClause.superclassConstraints;
     expect(constraints, hasLength(1));
     expect(constraints[0].name.name, 'B');
     expect(constraints[0].typeArguments, isNull);
@@ -2035,7 +2035,7 @@
     expect(declaration.documentationComment, isNull);
     var onClause = declaration.onClause!;
     expect(onClause.onKeyword, isNotNull);
-    NodeList<TypeName> constraints = onClause.superclassConstraints;
+    NodeList<NamedType> constraints = onClause.superclassConstraints;
     expect(constraints, hasLength(2));
     expect(constraints[0].name.name, 'B');
     expect(constraints[0].typeArguments, isNull);
@@ -2059,13 +2059,13 @@
     expect(declaration.documentationComment, isNull);
     var onClause = declaration.onClause!;
     expect(onClause.onKeyword, isNotNull);
-    NodeList<TypeName> constraints = onClause.superclassConstraints;
+    NodeList<NamedType> constraints = onClause.superclassConstraints;
     expect(constraints, hasLength(1));
     expect(constraints[0].name.name, 'B');
     expect(constraints[0].typeArguments, isNull);
     var implementsClause = declaration.implementsClause!;
     expect(implementsClause.implementsKeyword, isNotNull);
-    NodeList<TypeName> interfaces = implementsClause.interfaces;
+    NodeList<NamedType> interfaces = implementsClause.interfaces;
     expect(interfaces, hasLength(1));
     expect(interfaces[0].name.name, 'C');
     expect(interfaces[0].typeArguments, isNull);
diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart
index b6d2157..4b26412 100644
--- a/pkg/analyzer/test/generated/utilities_test.dart
+++ b/pkg/analyzer/test/generated/utilities_test.dart
@@ -264,9 +264,9 @@
 }
 
 class Getter_NodeReplacerTest_test_classTypeAlias
-    implements NodeReplacerTest_Getter<ClassTypeAlias, TypeName> {
+    implements NodeReplacerTest_Getter<ClassTypeAlias, NamedType> {
   @override
-  TypeName get(ClassTypeAlias node) => node.superclass;
+  NamedType get(ClassTypeAlias node) => node.superclass;
 }
 
 class Getter_NodeReplacerTest_test_classTypeAlias_2
@@ -372,9 +372,9 @@
 }
 
 class Getter_NodeReplacerTest_test_constructorName
-    implements NodeReplacerTest_Getter<ConstructorName, TypeName> {
+    implements NodeReplacerTest_Getter<ConstructorName, NamedType> {
   @override
-  TypeName get(ConstructorName node) => node.type;
+  NamedType get(ConstructorName node) => node.type;
 }
 
 class Getter_NodeReplacerTest_test_constructorName_2
@@ -452,9 +452,9 @@
 }
 
 class Getter_NodeReplacerTest_test_extendsClause
-    implements NodeReplacerTest_Getter<ExtendsClause, TypeName> {
+    implements NodeReplacerTest_Getter<ExtendsClause, NamedType> {
   @override
-  TypeName get(ExtendsClause node) => node.superclass;
+  NamedType get(ExtendsClause node) => node.superclass;
 }
 
 class Getter_NodeReplacerTest_test_fieldDeclaration
@@ -947,15 +947,15 @@
 }
 
 class Getter_NodeReplacerTest_test_typeName
-    implements NodeReplacerTest_Getter<TypeName, TypeArgumentList> {
+    implements NodeReplacerTest_Getter<NamedType, TypeArgumentList> {
   @override
-  TypeArgumentList? get(TypeName node) => node.typeArguments;
+  TypeArgumentList? get(NamedType node) => node.typeArguments;
 }
 
 class Getter_NodeReplacerTest_test_typeName_2
-    implements NodeReplacerTest_Getter<TypeName, Identifier> {
+    implements NodeReplacerTest_Getter<NamedType, Identifier> {
   @override
-  Identifier get(TypeName node) => node.name;
+  Identifier get(NamedType node) => node.name;
 }
 
 class Getter_NodeReplacerTest_test_typeParameter
@@ -1221,11 +1221,11 @@
 }
 
 class ListGetter_NodeReplacerTest_test_implementsClause
-    extends NodeReplacerTest_ListGetter<ImplementsClause, TypeName> {
+    extends NodeReplacerTest_ListGetter<ImplementsClause, NamedType> {
   ListGetter_NodeReplacerTest_test_implementsClause(int arg0) : super(arg0);
 
   @override
-  NodeList<TypeName> getList(ImplementsClause node) => node.interfaces;
+  NodeList<NamedType> getList(ImplementsClause node) => node.interfaces;
 }
 
 class ListGetter_NodeReplacerTest_test_labeledStatement
@@ -1323,11 +1323,11 @@
 }
 
 class ListGetter_NodeReplacerTest_test_withClause
-    extends NodeReplacerTest_ListGetter<WithClause, TypeName> {
+    extends NodeReplacerTest_ListGetter<WithClause, NamedType> {
   ListGetter_NodeReplacerTest_test_withClause(int arg0) : super(arg0);
 
   @override
-  NodeList<TypeName> getList(WithClause node) => node.mixinTypes;
+  NodeList<NamedType> getList(WithClause node) => node.mixinTypes;
 }
 
 class ListGetter_NodeReplacerTest_testAnnotatedNode
@@ -2189,7 +2189,7 @@
   }
 
   void test_typeName() {
-    TypeName node = AstTestFactory.typeName4(
+    NamedType node = AstTestFactory.typeName4(
         "T", [AstTestFactory.typeName4("E"), AstTestFactory.typeName4("F")]);
     _assertReplace(node, Getter_NodeReplacerTest_test_typeName_2());
     _assertReplace(node, Getter_NodeReplacerTest_test_typeName());
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 31572f3..de0bea2 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -1309,10 +1309,10 @@
       var constructorName = constructor.redirectedConstructor!;
       expect(constructorName.staticElement, same(aUnnamed));
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.type, interfaceTypeNone(aElement));
+      NamedType namedType = constructorName.type;
+      expect(namedType.type, interfaceTypeNone(aElement));
 
-      var identifier = typeName.name as SimpleIdentifier;
+      var identifier = namedType.name as SimpleIdentifier;
       expect(identifier.staticElement, same(aElement));
       expect(identifier.staticType, isNull);
 
@@ -1329,10 +1329,10 @@
       var constructorName = constructor.redirectedConstructor!;
       expect(constructorName.staticElement, same(aNamed));
 
-      var typeName = constructorName.type;
-      expect(typeName.type, interfaceTypeNone(aElement));
+      var namedType = constructorName.type;
+      expect(namedType.type, interfaceTypeNone(aElement));
 
-      var identifier = typeName.name as SimpleIdentifier;
+      var identifier = namedType.name as SimpleIdentifier;
       expect(identifier.staticElement, same(aElement));
       expect(identifier.staticType, isNull);
 
@@ -1378,10 +1378,10 @@
       var constructorName = constructor.redirectedConstructor!;
       expect(constructorName.staticElement, same(actualMember));
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.type, auType);
+      NamedType namedType = constructorName.type;
+      expect(namedType.type, auType);
 
-      var identifier = typeName.name as SimpleIdentifier;
+      var identifier = namedType.name as SimpleIdentifier;
       expect(identifier.staticElement, same(aElement));
       expect(identifier.staticType, isNull);
 
@@ -1400,10 +1400,10 @@
       var constructorName = constructor.redirectedConstructor!;
       expect(constructorName.staticElement, same(actualMember));
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.type, auType);
+      NamedType namedType = constructorName.type;
+      expect(namedType.type, auType);
 
-      var identifier = typeName.name as SimpleIdentifier;
+      var identifier = namedType.name as SimpleIdentifier;
       expect(identifier.staticElement, same(aElement));
       expect(identifier.staticType, isNull);
 
@@ -1723,9 +1723,9 @@
 
     var statement = statements[0] as VariableDeclarationStatement;
 
-    var typeName = statement.variables.type as NamedType;
-    expect(typeName.type, isDynamicType);
-    expect(typeName.typeArguments!.arguments[0].type, typeProvider.intType);
+    var namedType = statement.variables.type as NamedType;
+    expect(namedType.type, isDynamicType);
+    expect(namedType.typeArguments!.arguments[0].type, typeProvider.intType);
 
     VariableDeclaration vNode = statement.variables.variables[0];
     expect(vNode.name.staticType, isNull);
@@ -2077,10 +2077,10 @@
       expect(constructorName.name, isNull);
       expect(constructorName.staticElement, defaultConstructor);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments, isNull);
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments, isNull);
 
-      Identifier typeIdentifier = typeName.name;
+      Identifier typeIdentifier = namedType.name;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
     }
@@ -2095,10 +2095,10 @@
       expect(constructorName.staticElement, namedConstructor);
       expect(constructorName.name!.staticType, isNull);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments, isNull);
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments, isNull);
 
-      var typeIdentifier = typeName.name as SimpleIdentifier;
+      var typeIdentifier = namedType.name as SimpleIdentifier;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
     }
@@ -2130,10 +2130,10 @@
     expect(constructorName.name, isNull);
     expect(constructorName.staticElement, constructorElement);
 
-    TypeName typeName = constructorName.type;
-    expect(typeName.typeArguments, isNull);
+    NamedType namedType = constructorName.type;
+    expect(namedType.typeArguments, isNull);
 
-    Identifier typeIdentifier = typeName.name;
+    Identifier typeIdentifier = namedType.name;
     expect(typeIdentifier.staticElement, xElement);
     expect(typeIdentifier.staticType, isNull);
 
@@ -2171,10 +2171,10 @@
       expect(constructorName.name, isNull);
       expect(constructorName.staticElement, defaultConstructor);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments, isNull);
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments, isNull);
 
-      Identifier typeIdentifier = typeName.name;
+      Identifier typeIdentifier = namedType.name;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
 
@@ -2193,10 +2193,10 @@
       expect(constructorName.name!.staticElement, namedConstructor);
       expect(constructorName.name!.staticType, isNull);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments, isNull);
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments, isNull);
 
-      var typeIdentifier = typeName.name as SimpleIdentifier;
+      var typeIdentifier = namedType.name as SimpleIdentifier;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
 
@@ -2245,10 +2245,10 @@
       expect(constructorName.name, isNull);
       expect(constructorName.staticElement, defaultConstructor);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments, isNull);
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments, isNull);
 
-      var typeIdentifier = typeName.name as PrefixedIdentifier;
+      var typeIdentifier = namedType.name as PrefixedIdentifier;
       expect(typeIdentifier.staticElement, same(cElement));
       expect(typeIdentifier.staticType, isNull);
 
@@ -2275,10 +2275,10 @@
       expect(constructorName.name!.staticType, isNull);
       expect(constructorName.staticElement, namedConstructor);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments, isNull);
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments, isNull);
 
-      var typeIdentifier = typeName.name as PrefixedIdentifier;
+      var typeIdentifier = namedType.name as PrefixedIdentifier;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
 
@@ -2305,12 +2305,12 @@
       expect(constructorName.name!.staticType, isNull);
       expect(constructorName.staticElement, namedConstructor);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments!.arguments, hasLength(1));
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments!.arguments, hasLength(1));
       _assertTypeNameSimple(
-          typeName.typeArguments!.arguments[0], typeProvider.boolType);
+          namedType.typeArguments!.arguments[0], typeProvider.boolType);
 
-      var typeIdentifier = typeName.name as PrefixedIdentifier;
+      var typeIdentifier = namedType.name as PrefixedIdentifier;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
 
@@ -2360,10 +2360,10 @@
       expect(constructorName.name, isNull);
       expect(constructorName.staticElement, defaultConstructor);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments, isNull);
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments, isNull);
 
-      var typeIdentifier = typeName.name as SimpleIdentifier;
+      var typeIdentifier = namedType.name as SimpleIdentifier;
       expect(typeIdentifier.staticElement, same(cElement));
       expect(typeIdentifier.staticType, isNull);
     }
@@ -2382,12 +2382,12 @@
       expect(constructorName.name, isNull);
       expect(constructorName.staticElement, defaultConstructor);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments!.arguments, hasLength(1));
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments!.arguments, hasLength(1));
       _assertTypeNameSimple(
-          typeName.typeArguments!.arguments[0], typeProvider.boolType);
+          namedType.typeArguments!.arguments[0], typeProvider.boolType);
 
-      var typeIdentifier = typeName.name as SimpleIdentifier;
+      var typeIdentifier = namedType.name as SimpleIdentifier;
       expect(typeIdentifier.staticElement, same(cElement));
       expect(typeIdentifier.staticType, isNull);
     }
@@ -2407,10 +2407,10 @@
       expect(constructorName.name!.staticType, isNull);
       expect(constructorName.staticElement, namedConstructor);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments, isNull);
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments, isNull);
 
-      var typeIdentifier = typeName.name as SimpleIdentifier;
+      var typeIdentifier = namedType.name as SimpleIdentifier;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
     }
@@ -2430,12 +2430,12 @@
       expect(constructorName.name!.staticType, isNull);
       expect(constructorName.staticElement, namedConstructor);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments!.arguments, hasLength(1));
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments!.arguments, hasLength(1));
       _assertTypeNameSimple(
-          typeName.typeArguments!.arguments[0], typeProvider.boolType);
+          namedType.typeArguments!.arguments[0], typeProvider.boolType);
 
-      var typeIdentifier = typeName.name as SimpleIdentifier;
+      var typeIdentifier = namedType.name as SimpleIdentifier;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
     }
@@ -2462,10 +2462,10 @@
       assertMember(creation, defaultConstructor, {'K': 'int', 'V': 'double'});
       assertType(creation, 'C<int, double>');
 
-      var typeName = creation.constructorName.type;
-      assertNamedType(typeName, cElement, 'C<int, double>');
+      var namedType = creation.constructorName.type;
+      assertNamedType(namedType, cElement, 'C<int, double>');
 
-      var typeArguments = typeName.typeArguments!.arguments;
+      var typeArguments = namedType.typeArguments!.arguments;
       assertNamedType(typeArguments[0] as NamedType, intElement, 'int');
       assertNamedType(typeArguments[1] as NamedType, doubleElement, 'double');
 
@@ -2481,10 +2481,10 @@
       assertMember(creation, namedConstructor, {'K': 'num', 'V': 'String'});
       assertType(creation, 'C<num, String>');
 
-      var typeName = creation.constructorName.type;
-      assertNamedType(typeName, cElement, 'C<num, String>');
+      var namedType = creation.constructorName.type;
+      assertNamedType(namedType, cElement, 'C<num, String>');
 
-      var typeArguments = typeName.typeArguments!.arguments;
+      var typeArguments = namedType.typeArguments!.arguments;
       assertNamedType(typeArguments[0] as NamedType, numElement, 'num');
       assertNamedType(typeArguments[1] as NamedType, stringElement, 'String');
 
@@ -3077,7 +3077,7 @@
       ConstructorName constructorName = creation.constructorName;
       expect(constructorName.name, isNull);
 
-      TypeName type = constructorName.type;
+      NamedType type = constructorName.type;
       expect(type.typeArguments, isNull);
       assertElement(type.name, c);
       assertTypeNull(type.name);
@@ -3094,7 +3094,7 @@
       ConstructorName constructorName = creation.constructorName;
       expect(constructorName.name!.name, 'named');
 
-      TypeName type = constructorName.type;
+      NamedType type = constructorName.type;
       expect(type.typeArguments, isNull);
       assertElement(type.name, c);
       assertType(type.name, 'C<bool>');
@@ -3111,7 +3111,7 @@
       ConstructorName constructorName = creation.constructorName;
       expect(constructorName.name!.name, 'named2');
 
-      TypeName type = constructorName.type;
+      NamedType type = constructorName.type;
       assertTypeArguments(type.typeArguments!, [doubleType]);
       assertElement(type.name, c);
       assertType(type.name, 'C<double>');
@@ -3640,8 +3640,8 @@
     assertElement(tRef, tElement);
     assertTypeDynamic(tRef);
 
-    var typeName = prefixedName.parent as NamedType;
-    expect(typeName.type, isDynamicType);
+    var namedType = prefixedName.parent as NamedType;
+    expect(namedType.type, isDynamicType);
   }
 
   @failingTest
@@ -3708,8 +3708,8 @@
     assertElement(tRef, tElement);
     assertTypeDynamic(tRef);
 
-    var typeName = prefixedName.parent as NamedType;
-    expect(typeName.type, isDynamicType);
+    var namedType = prefixedName.parent as NamedType;
+    expect(namedType.type, isDynamicType);
   }
 
   @failingTest
@@ -6949,7 +6949,7 @@
         nullabilitySuffix: NullabilitySuffix.none,
       );
 
-      TypeName superClass = dNode.extendsClause!.superclass;
+      NamedType superClass = dNode.extendsClause!.superclass;
       expect(superClass.type, expectedType);
 
       var identifier = superClass.name as SimpleIdentifier;
@@ -6963,7 +6963,7 @@
         nullabilitySuffix: NullabilitySuffix.none,
       );
 
-      TypeName mixinType = dNode.withClause!.mixinTypes[0];
+      NamedType mixinType = dNode.withClause!.mixinTypes[0];
       expect(mixinType.type, expectedType);
 
       var identifier = mixinType.name as SimpleIdentifier;
@@ -6977,7 +6977,7 @@
         nullabilitySuffix: NullabilitySuffix.none,
       );
 
-      TypeName implementedType = dNode.implementsClause!.interfaces[0];
+      NamedType implementedType = dNode.implementsClause!.interfaces[0];
       expect(implementedType.type, expectedType);
 
       var identifier = implementedType.name as SimpleIdentifier;
@@ -7018,7 +7018,7 @@
         nullabilitySuffix: NullabilitySuffix.none,
       );
 
-      TypeName superClass = dNode.superclass;
+      NamedType superClass = dNode.superclass;
       expect(superClass.type, expectedType);
 
       var identifier = superClass.name as SimpleIdentifier;
@@ -7032,7 +7032,7 @@
         nullabilitySuffix: NullabilitySuffix.none,
       );
 
-      TypeName mixinType = dNode.withClause.mixinTypes[0];
+      NamedType mixinType = dNode.withClause.mixinTypes[0];
       expect(mixinType.type, expectedType);
 
       var identifier = mixinType.name as SimpleIdentifier;
@@ -7046,7 +7046,7 @@
         nullabilitySuffix: NullabilitySuffix.none,
       );
 
-      TypeName interfaceType = dNode.implementsClause!.interfaces[0];
+      NamedType interfaceType = dNode.implementsClause!.interfaces[0];
       expect(interfaceType.type, expectedType);
 
       var identifier = interfaceType.name as SimpleIdentifier;
@@ -7348,8 +7348,8 @@
       FieldElement bElement = cElement.getField('b')!;
       var bDeclaration = cNode.members[1] as FieldDeclaration;
 
-      var typeName = bDeclaration.fields.type as NamedType;
-      var typeIdentifier = typeName.name as SimpleIdentifier;
+      var namedType = bDeclaration.fields.type as NamedType;
+      var typeIdentifier = namedType.name as SimpleIdentifier;
       expect(typeIdentifier.staticElement, same(tElement));
       expect(typeIdentifier.staticType, isNull);
 
@@ -7438,8 +7438,8 @@
       expect(bElement, same(unitElement.topLevelVariables[1]));
       expect(bElement.type, typeProvider.doubleType);
 
-      var typeName = bDeclaration.variables.type as NamedType;
-      _assertTypeNameSimple(typeName, typeProvider.doubleType);
+      var namedType = bDeclaration.variables.type as NamedType;
+      _assertTypeNameSimple(namedType, typeProvider.doubleType);
 
       expect(bNode.name.staticElement, same(bElement));
       expect(bNode.name.staticType, isNull);
@@ -7792,9 +7792,9 @@
         statements[0] as VariableDeclarationStatement;
     var type = variableDeclarationStatement.variables.type as NamedType;
     expect(type.type, isDynamicType);
-    var typeName = type.name;
-    assertTypeNull(typeName);
-    expect(typeName.staticElement, same(typeProvider.dynamicType.element));
+    var namedType = type.name;
+    assertTypeNull(namedType);
+    expect(namedType.staticElement, same(typeProvider.dynamicType.element));
   }
 
   test_type_functionTypeAlias() async {
@@ -7812,14 +7812,14 @@
 
     FieldDeclaration fDeclaration = findNode.fieldDeclaration('F<int> f');
 
-    var typeName = fDeclaration.fields.type as NamedType;
-    assertType(typeName, 'int Function(bool)');
+    var namedType = fDeclaration.fields.type as NamedType;
+    assertType(namedType, 'int Function(bool)');
 
-    var typeIdentifier = typeName.name as SimpleIdentifier;
+    var typeIdentifier = namedType.name as SimpleIdentifier;
     expect(typeIdentifier.staticElement, same(aliasElement));
     expect(typeIdentifier.staticType, isNull);
 
-    List<TypeAnnotation> typeArguments = typeName.typeArguments!.arguments;
+    List<TypeAnnotation> typeArguments = namedType.typeArguments!.arguments;
     expect(typeArguments, hasLength(1));
     _assertTypeNameSimple(typeArguments[0], typeProvider.intType);
   }
@@ -7836,9 +7836,9 @@
         statements[0] as VariableDeclarationStatement;
     var type = variableDeclarationStatement.variables.type as NamedType;
     expect(type.type, isVoidType);
-    var typeName = type.name;
-    expect(typeName.staticType, isNull);
-    expect(typeName.staticElement, isNull);
+    var namedType = type.name;
+    expect(namedType.staticType, isNull);
+    expect(namedType.staticElement, isNull);
   }
 
   test_typeAnnotation_prefixed() async {
@@ -7863,9 +7863,9 @@
 
     {
       var declaration = unit.declarations[0] as TopLevelVariableDeclaration;
-      var typeName = declaration.variables.type as NamedType;
+      var namedType = declaration.variables.type as NamedType;
 
-      var typeIdentifier = typeName.name as PrefixedIdentifier;
+      var typeIdentifier = namedType.name as PrefixedIdentifier;
       expect(typeIdentifier.staticElement, aClass);
 
       expect(typeIdentifier.prefix.name, 'b');
@@ -7876,9 +7876,9 @@
 
     {
       var declaration = unit.declarations[1] as TopLevelVariableDeclaration;
-      var typeName = declaration.variables.type as NamedType;
+      var namedType = declaration.variables.type as NamedType;
 
-      var typeIdentifier = typeName.name as PrefixedIdentifier;
+      var typeIdentifier = namedType.name as PrefixedIdentifier;
       expect(typeIdentifier.staticElement, aClass);
 
       expect(typeIdentifier.prefix.name, 'c');
@@ -7951,14 +7951,14 @@
     ConstructorName constructorName = creation.constructorName;
     expect(constructorName.name, isNull);
 
-    TypeName typeName = constructorName.type;
-    expect(typeName.type, isDynamicType);
+    NamedType namedType = constructorName.type;
+    expect(namedType.type, isDynamicType);
 
-    var typeIdentifier = typeName.name as SimpleIdentifier;
+    var typeIdentifier = namedType.name as SimpleIdentifier;
     expect(typeIdentifier.staticElement, isNull);
     expect(typeIdentifier.staticType, isNull);
 
-    assertTypeArguments(typeName.typeArguments!, [intType, doubleType]);
+    assertTypeArguments(namedType.typeArguments!, [intType, doubleType]);
     _assertInvocationArguments(creation.argumentList,
         [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]);
   }
@@ -7983,10 +7983,10 @@
     ConstructorName constructorName = creation.constructorName;
     expect(constructorName.name, isNull);
 
-    TypeName typeName = constructorName.type;
-    expect(typeName.type, isDynamicType);
+    NamedType namedType = constructorName.type;
+    expect(namedType.type, isDynamicType);
 
-    var typePrefixed = typeName.name as PrefixedIdentifier;
+    var typePrefixed = namedType.name as PrefixedIdentifier;
     expect(typePrefixed.staticElement, isNull);
     expect(typePrefixed.staticType, isDynamicType);
 
@@ -7998,7 +7998,7 @@
     expect(typeIdentifier.staticElement, isNull);
     expect(typeIdentifier.staticType, isDynamicType);
 
-    assertTypeArguments(typeName.typeArguments!, [intType, doubleType]);
+    assertTypeArguments(namedType.typeArguments!, [intType, doubleType]);
     _assertInvocationArguments(creation.argumentList,
         [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]);
   }
@@ -8027,10 +8027,10 @@
     ConstructorName constructorName = creation.constructorName;
     expect(constructorName.name, isNull);
 
-    TypeName typeName = constructorName.type;
-    expect(typeName.type, isDynamicType);
+    NamedType namedType = constructorName.type;
+    expect(namedType.type, isDynamicType);
 
-    var typePrefixed = typeName.name as PrefixedIdentifier;
+    var typePrefixed = namedType.name as PrefixedIdentifier;
     expect(typePrefixed.staticElement, isNull);
     expect(typePrefixed.staticType, isDynamicType);
 
@@ -8042,7 +8042,7 @@
     expect(typeIdentifier.staticElement, isNull);
     expect(typeIdentifier.staticType, isDynamicType);
 
-    assertTypeArguments(typeName.typeArguments!, [intType, doubleType]);
+    assertTypeArguments(namedType.typeArguments!, [intType, doubleType]);
     _assertInvocationArguments(creation.argumentList,
         [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]);
   }
@@ -8065,10 +8065,10 @@
 
     ConstructorName constructorName = creation.constructorName;
 
-    TypeName typeName = constructorName.type;
-    expect(typeName.type, isDynamicType);
+    NamedType namedType = constructorName.type;
+    expect(namedType.type, isDynamicType);
 
-    var typePrefixed = typeName.name as PrefixedIdentifier;
+    var typePrefixed = namedType.name as PrefixedIdentifier;
     assertElementNull(typePrefixed);
     assertTypeNull(typePrefixed);
 
@@ -8083,7 +8083,7 @@
     assertElementNull(constructorName.name);
     assertTypeNull(constructorName.name!);
 
-    assertTypeArguments(typeName.typeArguments!, [intType, doubleType]);
+    assertTypeArguments(namedType.typeArguments!, [intType, doubleType]);
     _assertInvocationArguments(creation.argumentList,
         [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]);
   }
@@ -8111,10 +8111,10 @@
 
     ConstructorName constructorName = creation.constructorName;
 
-    TypeName typeName = constructorName.type;
-    expect(typeName.type, isDynamicType);
+    NamedType namedType = constructorName.type;
+    expect(namedType.type, isDynamicType);
 
-    var typePrefixed = typeName.name as PrefixedIdentifier;
+    var typePrefixed = namedType.name as PrefixedIdentifier;
     assertElementNull(typePrefixed);
     assertTypeNull(typePrefixed);
 
@@ -8129,7 +8129,7 @@
     assertElementNull(constructorName.name);
     assertTypeNull(constructorName.name!);
 
-    assertTypeArguments(typeName.typeArguments!, [intType, doubleType]);
+    assertTypeArguments(namedType.typeArguments!, [intType, doubleType]);
     _assertInvocationArguments(creation.argumentList,
         [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]);
   }
@@ -8158,10 +8158,10 @@
 
     ConstructorName constructorName = creation.constructorName;
 
-    TypeName typeName = constructorName.type;
-    assertType(typeName, 'Random');
+    NamedType namedType = constructorName.type;
+    assertType(namedType, 'Random');
 
-    var typePrefixed = typeName.name as PrefixedIdentifier;
+    var typePrefixed = namedType.name as PrefixedIdentifier;
     assertElement(typePrefixed, randomElement);
     assertTypeNull(typePrefixed);
 
@@ -8176,7 +8176,7 @@
     assertElementNull(constructorName.name);
     assertTypeNull(constructorName.name!);
 
-    assertTypeArguments(typeName.typeArguments!, [intType, doubleType]);
+    assertTypeArguments(namedType.typeArguments!, [intType, doubleType]);
     _assertInvocationArguments(creation.argumentList,
         [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]);
   }
@@ -8627,10 +8627,10 @@
     var constructorElement = classElement.unnamedConstructor;
     expect(constructorName.staticElement, constructorElement);
 
-    var typeName = constructorName.type;
-    expect(typeName.typeArguments, isNull);
+    var namedType = constructorName.type;
+    expect(namedType.typeArguments, isNull);
 
-    var typeIdentifier = typeName.name as SimpleIdentifier;
+    var typeIdentifier = namedType.name as SimpleIdentifier;
     assertElement(typeIdentifier, classElement);
     assertTypeNull(typeIdentifier);
 
@@ -8681,18 +8681,18 @@
     expect(node.declaredElement, same(element));
     expect(node.identifier!.staticElement, same(element));
 
-    var typeName = node.type as NamedType?;
-    if (typeName != null) {
-      expect(typeName.type, type);
-      expect(typeName.name.staticElement, same(type!.element));
+    var namedType = node.type as NamedType?;
+    if (namedType != null) {
+      expect(namedType.type, type);
+      expect(namedType.name.staticElement, same(type!.element));
     }
   }
 
-  void _assertTypeNameSimple(TypeAnnotation typeName, DartType type) {
-    typeName as NamedType;
-    expect(typeName.type, type);
+  void _assertTypeNameSimple(TypeAnnotation namedType, DartType type) {
+    namedType as NamedType;
+    expect(namedType.type, type);
 
-    var identifier = typeName.name as SimpleIdentifier;
+    var identifier = namedType.name as SimpleIdentifier;
     expect(identifier.staticElement, same(type.element));
     expect(identifier.staticType, isNull);
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 98342e7..5f835d6 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -181,9 +181,9 @@
     assertElement(node, expectedConstructorElement);
     assertType(node, expectedType);
 
-    var typeName = node.constructorName.type;
+    var namedType = node.constructorName.type;
     expectedTypeNameElement ??= expectedClassElement;
-    assertNamedType(typeName, expectedTypeNameElement, null,
+    assertNamedType(namedType, expectedTypeNameElement, null,
         expectedPrefix: expectedPrefix);
   }
 
@@ -461,9 +461,9 @@
 
     assertType(creation, expectedType);
 
-    var typeName = creation.constructorName.type;
+    var namedType = creation.constructorName.type;
     expectedTypeNameElement ??= expectedClassElement;
-    assertNamedType(typeName, expectedTypeNameElement, expectedType,
+    assertNamedType(namedType, expectedTypeNameElement, expectedType,
         expectedPrefix: expectedPrefix);
   }
 
@@ -763,7 +763,7 @@
       actual = typeOrNode.staticType;
     } else if (typeOrNode is GenericFunctionType) {
       actual = typeOrNode.type;
-    } else if (typeOrNode is TypeName) {
+    } else if (typeOrNode is NamedType) {
       actual = typeOrNode.type;
     } else {
       fail('Unsupported node: (${typeOrNode.runtimeType}) $typeOrNode');
@@ -913,7 +913,7 @@
       return node.staticElement;
     } else if (node is PropertyAccess) {
       return node.propertyName.staticElement;
-    } else if (node is TypeName) {
+    } else if (node is NamedType) {
       return node.name.staticElement;
     } else {
       fail('Unsupported node: (${node.runtimeType}) $node');
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
index d855849..d444d31 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
@@ -1120,7 +1120,7 @@
         return;
       }
       optype.isPrefixed = true;
-      if (node.parent is TypeName && node.parent?.parent is ConstructorName) {
+      if (node.parent is NamedType && node.parent?.parent is ConstructorName) {
         optype.includeConstructorSuggestions = true;
       } else if (node.parent is Annotation) {
         optype.includeConstructorSuggestions = true;
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 8181406..4a7dd04 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
@@ -12,7 +12,7 @@
 /// declarations in those nodes. Consumers typically call [visit] which catches
 /// the exception thrown by [finished].
 abstract class LocalDeclarationVisitor extends GeneralizingAstVisitor {
-  static final TypeName STACKTRACE_TYPE = astFactory.typeName(
+  static final NamedType STACKTRACE_TYPE = astFactory.typeName(
       astFactory
           .simpleIdentifier(StringToken(TokenType.IDENTIFIER, 'StackTrace', 0)),
       null);
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index 9092f5c..3b8b71b 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -144,14 +144,14 @@
     var nativeClasses = JsInteropChecks.getNativeClasses(component);
     var jsUtilOptimizer = JsUtilOptimizer(coreTypes, hierarchy);
     for (var library in libraries) {
-      // TODO (rileyporter): Merge js_util optimizations with other lowerings
-      // in the single pass in `transformations/lowering.dart`.
-      jsUtilOptimizer.visitLibrary(library);
       JsInteropChecks(
               coreTypes,
               diagnosticReporter as DiagnosticReporter<Message, LocatedMessage>,
               nativeClasses)
           .visitLibrary(library);
+      // TODO (rileyporter): Merge js_util optimizations with other lowerings
+      // in the single pass in `transformations/lowering.dart`.
+      jsUtilOptimizer.visitLibrary(library);
     }
     lowering.transformLibraries(libraries, coreTypes, hierarchy, options);
     logger?.call("Lowering transformations performed");
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 2f8ae5c..0ee8532 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -160,12 +160,12 @@
     var jsUtilOptimizer = JsUtilOptimizer(coreTypes, hierarchy);
     for (var library in libraries) {
       _CovarianceTransformer(library).transform();
-      jsUtilOptimizer.visitLibrary(library);
       JsInteropChecks(
               coreTypes,
               diagnosticReporter as DiagnosticReporter<Message, LocatedMessage>,
               _nativeClasses!)
           .visitLibrary(library);
+      jsUtilOptimizer.visitLibrary(library);
     }
   }
 
diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart
index 078631a..e355526 100644
--- a/pkg/nnbd_migration/lib/src/edge_builder.dart
+++ b/pkg/nnbd_migration/lib/src/edge_builder.dart
@@ -1934,7 +1934,7 @@
       // _nullCheckHints.
       var token = typeName.endToken;
       _nullCheckHints[token] = getPostfixHint(token);
-      typeNameVisited(
+      namedTypeVisited(
           typeName); // Note this has been visited to TypeNameTracker.
       return null;
     } finally {
diff --git a/pkg/nnbd_migration/lib/src/edge_origin.dart b/pkg/nnbd_migration/lib/src/edge_origin.dart
index 91bb299..b12f9ec 100644
--- a/pkg/nnbd_migration/lib/src/edge_origin.dart
+++ b/pkg/nnbd_migration/lib/src/edge_origin.dart
@@ -384,7 +384,7 @@
 /// this class is used for the edge connecting the type of x's type parameter
 /// with the type bound in the declaration of C.
 class InstantiateToBoundsOrigin extends EdgeOrigin {
-  InstantiateToBoundsOrigin(Source? source, TypeName node)
+  InstantiateToBoundsOrigin(Source? source, NamedType node)
       : super(source, node);
 
   @override
@@ -671,7 +671,7 @@
 /// unioned with references to the nodes referring to source code. The origin of
 /// those union edges will be [TypedefReferenceOrigin].
 class TypedefReferenceOrigin extends EdgeOrigin {
-  TypedefReferenceOrigin(Source? source, TypeName node) : super(source, node);
+  TypedefReferenceOrigin(Source? source, NamedType node) : super(source, node);
 
   @override
   String get description => 'reference to typedef';
diff --git a/pkg/nnbd_migration/lib/src/node_builder.dart b/pkg/nnbd_migration/lib/src/node_builder.dart
index 3b8b51c..624c4df 100644
--- a/pkg/nnbd_migration/lib/src/node_builder.dart
+++ b/pkg/nnbd_migration/lib/src/node_builder.dart
@@ -539,7 +539,7 @@
     Map<String, DecoratedType?> namedParameters =
         const <String, DecoratedType>{};
     if (type is InterfaceType && type.element.typeParameters.isNotEmpty) {
-      if (node is TypeName) {
+      if (node is NamedType) {
         if (node.typeArguments == null) {
           int index = 0;
           typeArguments = type.typeArguments
@@ -621,7 +621,7 @@
 
   @override
   DecoratedType visitTypeName(TypeName node) {
-    typeNameVisited(node); // Note this has been visited to TypeNameTracker.
+    namedTypeVisited(node); // Note this has been visited to TypeNameTracker.
     return visitTypeAnnotation(node);
   }
 
@@ -864,11 +864,11 @@
   void _handleSupertypeClauses(
       NamedCompilationUnitMember astNode,
       ClassElement declaredElement,
-      TypeName? superclass,
+      NamedType? superclass,
       WithClause? withClause,
       ImplementsClause? implementsClause,
       OnClause? onClause) {
-    var supertypes = <TypeName?>[];
+    var supertypes = <NamedType?>[];
     supertypes.add(superclass);
     if (withClause != null) {
       supertypes.addAll(withClause.mixinTypes);
diff --git a/pkg/nnbd_migration/lib/src/utilities/completeness_tracker.dart b/pkg/nnbd_migration/lib/src/utilities/completeness_tracker.dart
index 520fda8..4e36f91 100644
--- a/pkg/nnbd_migration/lib/src/utilities/completeness_tracker.dart
+++ b/pkg/nnbd_migration/lib/src/utilities/completeness_tracker.dart
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:nnbd_migration/src/utilities/permissive_mode.dart';
 import 'package:nnbd_migration/src/utilities/annotation_tracker.dart';
+import 'package:nnbd_migration/src/utilities/permissive_mode.dart';
 import 'package:nnbd_migration/src/utilities/type_name_tracker.dart';
 
 /// Mixin that verifies (via assertion checks) that a visitor visits a
@@ -17,12 +17,6 @@
   AnnotationTracker? _annotationTracker;
   TypeNameTracker? _typeNameTracker;
 
-  @override
-  T? visitAnnotation(Annotation node) {
-    annotationVisited(node);
-    return super.visitAnnotation(node);
-  }
-
   void annotationVisited(Annotation node) {
     assert(() {
       _annotationTracker!.nodeVisited(node);
@@ -30,7 +24,7 @@
     }());
   }
 
-  void typeNameVisited(TypeName node) {
+  void namedTypeVisited(NamedType node) {
     assert(() {
       _typeNameTracker!.nodeVisited(node);
       return true;
@@ -38,6 +32,12 @@
   }
 
   @override
+  T? visitAnnotation(Annotation node) {
+    annotationVisited(node);
+    return super.visitAnnotation(node);
+  }
+
+  @override
   T? visitCompilationUnit(CompilationUnit node) {
     T? result;
     reportExceptionsIfPermissive(node, () {
diff --git a/pkg/nnbd_migration/lib/src/utilities/type_name_tracker.dart b/pkg/nnbd_migration/lib/src/utilities/type_name_tracker.dart
index 67a1817..90d8b06 100644
--- a/pkg/nnbd_migration/lib/src/utilities/type_name_tracker.dart
+++ b/pkg/nnbd_migration/lib/src/utilities/type_name_tracker.dart
@@ -5,11 +5,11 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 
-/// A simple class to find all [TypeName]s and track if they all get visited.
+/// A simple class to find all [NamedType]s and track if they all get visited.
 class TypeNameTracker extends RecursiveAstVisitor<void> {
-  final Set<TypeName> _nodes = {};
+  final Set<NamedType> _nodes = {};
 
-  bool _isTrueTypeName(TypeName node) {
+  bool _isTrueNamedType(NamedType node) {
     final parent = node.parent;
     if (parent is ConstructorName) {
       // We only need to visit C in `new C()`, just `int` in `new C<int>()`.
@@ -21,14 +21,14 @@
 
   @override
   void visitTypeName(TypeName node) {
-    if (_isTrueTypeName(node)) {
+    if (_isTrueNamedType(node)) {
       _nodes.add(node);
     }
     super.visitTypeName(node);
   }
 
-  void nodeVisited(TypeName node) {
-    if (_isTrueTypeName(node) && !_nodes.remove(node)) {
+  void nodeVisited(NamedType node) {
+    if (_isTrueNamedType(node) && !_nodes.remove(node)) {
       throw StateError('Visited unexpected type name $node');
     }
   }
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index 11775fc..eefb057 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -1559,7 +1559,7 @@
 static void GenerateWriteBarrierStubHelper(Assembler* assembler,
                                            Address stub_code,
                                            bool cards) {
-  Label add_to_mark_stack, remember_card;
+  Label add_to_mark_stack, remember_card, lost_race;
   __ tst(R0, Operand(1 << target::ObjectAlignment::kNewObjectBitPosition));
   __ b(&add_to_mark_stack, ZERO);
 
@@ -1581,13 +1581,15 @@
   // Save values being destroyed.
   __ PushList((1 << R2) | (1 << R3) | (1 << R4));
 
-  // Atomically set the remembered bit of the object header.
+  // Atomically clear kOldAndNotRememberedBit.
   ASSERT(target::Object::tags_offset() == 0);
   __ sub(R3, R1, Operand(kHeapObjectTag));
   // R3: Untagged address of header word (ldrex/strex do not support offsets).
   Label retry;
   __ Bind(&retry);
   __ ldrex(R2, R3);
+  __ tst(R2, Operand(1 << target::UntaggedObject::kOldAndNotRememberedBit));
+  __ b(&lost_race, ZERO);
   __ bic(R2, R2, Operand(1 << target::UntaggedObject::kOldAndNotRememberedBit));
   __ strex(R4, R2, R3);
   __ cmp(R4, Operand(1));
@@ -1629,7 +1631,7 @@
   __ Bind(&add_to_mark_stack);
   __ PushList((1 << R2) | (1 << R3) | (1 << R4));  // Spill.
 
-  Label marking_retry, lost_race, marking_overflow;
+  Label marking_retry, marking_overflow;
   // Atomically clear kOldAndNotMarkedBit.
   ASSERT(target::Object::tags_offset() == 0);
   __ sub(R3, R0, Operand(kHeapObjectTag));
@@ -1665,6 +1667,7 @@
   __ Ret();
 
   __ Bind(&lost_race);
+  __ clrex();
   __ PopList((1 << R2) | (1 << R3) | (1 << R4));  // Unspill.
   __ Ret();
 
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index 9af7272..0eeef85 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -1717,7 +1717,7 @@
 static void GenerateWriteBarrierStubHelper(Assembler* assembler,
                                            Address stub_code,
                                            bool cards) {
-  Label add_to_mark_stack, remember_card;
+  Label add_to_mark_stack, remember_card, lost_race;
   __ tbz(&add_to_mark_stack, R0,
          target::ObjectAlignment::kNewObjectBitPosition);
 
@@ -1739,13 +1739,14 @@
   __ Push(R3);
   __ Push(R4);
 
-  // Atomically set the remembered bit of the object header.
+  // Atomically clear kOldAndNotRememberedBit.
   ASSERT(target::Object::tags_offset() == 0);
   __ sub(R3, R1, Operand(kHeapObjectTag));
   // R3: Untagged address of header word (ldxr/stxr do not support offsets).
   Label retry;
   __ Bind(&retry);
   __ ldxr(R2, R3, kEightBytes);
+  __ tbz(&lost_race, R2, target::UntaggedObject::kOldAndNotRememberedBit);
   __ AndImmediate(R2, R2,
                   ~(1 << target::UntaggedObject::kOldAndNotRememberedBit));
   __ stxr(R4, R2, R3, kEightBytes);
@@ -1791,7 +1792,7 @@
   __ Push(R4);  // Spill.
 
   // Atomically clear kOldAndNotMarkedBit.
-  Label marking_retry, lost_race, marking_overflow;
+  Label marking_retry, marking_overflow;
   ASSERT(target::Object::tags_offset() == 0);
   __ sub(R3, R0, Operand(kHeapObjectTag));
   // R3: Untagged address of header word (ldxr/stxr do not support offsets).
@@ -1828,6 +1829,7 @@
   __ ret();
 
   __ Bind(&lost_race);
+  __ clrex();
   __ Pop(R4);  // Unspill.
   __ Pop(R3);  // Unspill.
   __ Pop(R2);  // Unspill.
diff --git a/runtime/vm/compiler/stub_code_compiler_ia32.cc b/runtime/vm/compiler/stub_code_compiler_ia32.cc
index ea1b6a4..654e0ef 100644
--- a/runtime/vm/compiler/stub_code_compiler_ia32.cc
+++ b/runtime/vm/compiler/stub_code_compiler_ia32.cc
@@ -1349,10 +1349,20 @@
 #endif
   }
 
-  // lock+andl is an atomic read-modify-write.
-  __ lock();
-  __ andl(FieldAddress(EDX, target::Object::tags_offset()),
+  // Atomically clear kOldAndNotRememberedBit.
+  Label retry, lost_race;
+  __ movl(EAX, FieldAddress(EDX, target::Object::tags_offset()));
+  __ Bind(&retry);
+  __ movl(ECX, EAX);
+  __ testl(ECX,
+           Immediate(1 << target::UntaggedObject::kOldAndNotRememberedBit));
+  __ j(ZERO, &lost_race);  // Remembered by another thread.
+  __ andl(ECX,
           Immediate(~(1 << target::UntaggedObject::kOldAndNotRememberedBit)));
+  // Cmpxchgl: compare value = implicit operand EAX, new value = ECX.
+  // On failure, EAX is updated with the current value.
+  __ LockCmpxchgl(FieldAddress(EDX, target::Object::tags_offset()), ECX);
+  __ j(NOT_EQUAL, &retry, Assembler::kNearJump);
 
   // Load the StoreBuffer block out of the thread. Then load top_ out of the
   // StoreBufferBlock and add the address to the pointers_.
@@ -1390,6 +1400,11 @@
   __ LeaveCallRuntimeFrame();
   __ ret();
 
+  __ Bind(&lost_race);
+  __ popl(ECX);  // Unspill.
+  __ popl(EAX);  // Unspill.
+  __ ret();
+
   if (cards) {
     Label remember_card_slow;
 
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index 4017ed4..12079e9 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -1657,7 +1657,7 @@
 static void GenerateWriteBarrierStubHelper(Assembler* assembler,
                                            Address stub_code,
                                            bool cards) {
-  Label add_to_mark_stack, remember_card;
+  Label add_to_mark_stack, remember_card, lost_race;
   __ testq(RAX, Immediate(1 << target::ObjectAlignment::kNewObjectBitPosition));
   __ j(ZERO, &add_to_mark_stack);
 
@@ -1676,17 +1676,23 @@
 #endif
   }
 
-  // Update the tags that this object has been remembered.
-  // RDX: Address being stored
-  // RAX: Current tag value
-  // lock+andq is an atomic read-modify-write.
-  __ lock();
-  __ andq(FieldAddress(RDX, target::Object::tags_offset()),
-          Immediate(~(1 << target::UntaggedObject::kOldAndNotRememberedBit)));
+  __ pushq(RAX);  // Spill.
+  __ pushq(RCX);  // Spill.
 
-  // Save registers being destroyed.
-  __ pushq(RAX);
-  __ pushq(RCX);
+  // Atomically clear kOldAndNotRemembered.
+  Label retry;
+  __ movq(RAX, FieldAddress(RDX, target::Object::tags_offset()));
+  __ Bind(&retry);
+  __ movq(RCX, RAX);
+  __ testq(RCX,
+           Immediate(1 << target::UntaggedObject::kOldAndNotRememberedBit));
+  __ j(ZERO, &lost_race);  // Remembered by another thread.
+  __ andq(RCX,
+          Immediate(~(1 << target::UntaggedObject::kOldAndNotRememberedBit)));
+  // Cmpxchgq: compare value = implicit operand RAX, new value = RCX.
+  // On failure, RAX is updated with the current value.
+  __ LockCmpxchgq(FieldAddress(RDX, target::Object::tags_offset()), RCX);
+  __ j(NOT_EQUAL, &retry, Assembler::kNearJump);
 
   // Load the StoreBuffer block out of the thread. Then load top_ out of the
   // StoreBufferBlock and add the address to the pointers_.
@@ -1704,9 +1710,8 @@
   __ incq(RCX);
   __ movl(Address(RAX, target::StoreBufferBlock::top_offset()), RCX);
   __ cmpl(RCX, Immediate(target::StoreBufferBlock::kSize));
-  // Restore values.
-  __ popq(RCX);
-  __ popq(RAX);
+  __ popq(RCX);  // Unspill.
+  __ popq(RAX);  // Unspill.
   __ j(EQUAL, &overflow, Assembler::kNearJump);
   __ ret();
 
@@ -1728,15 +1733,17 @@
   __ movq(TMP, RAX);  // RAX is fixed implicit operand of CAS.
 
   // Atomically clear kOldAndNotMarkedBit.
-  Label retry, lost_race, marking_overflow;
+  Label retry_marking, marking_overflow;
   __ movq(RAX, FieldAddress(TMP, target::Object::tags_offset()));
-  __ Bind(&retry);
+  __ Bind(&retry_marking);
   __ movq(RCX, RAX);
   __ testq(RCX, Immediate(1 << target::UntaggedObject::kOldAndNotMarkedBit));
   __ j(ZERO, &lost_race);  // Marked by another thread.
   __ andq(RCX, Immediate(~(1 << target::UntaggedObject::kOldAndNotMarkedBit)));
+  // Cmpxchgq: compare value = implicit operand RAX, new value = RCX.
+  // On failure, RAX is updated with the current value.
   __ LockCmpxchgq(FieldAddress(TMP, target::Object::tags_offset()), RCX);
-  __ j(NOT_EQUAL, &retry, Assembler::kNearJump);
+  __ j(NOT_EQUAL, &retry_marking, Assembler::kNearJump);
 
   __ movq(RAX, Address(THR, target::Thread::marking_stack_block_offset()));
   __ movl(RCX, Address(RAX, target::MarkingStackBlock::top_offset()));
diff --git a/tests/lib/js/external_extension_members_test.dart b/tests/lib/js/external_extension_members_test.dart
new file mode 100644
index 0000000..6c9caa2
--- /dev/null
+++ b/tests/lib/js/external_extension_members_test.dart
@@ -0,0 +1,107 @@
+// Copyright (c) 2021, 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 file.
+
+// Tests behavior of external extension members, which are routed to js_util
+// calls by a CFE transformation.
+
+@JS()
+library external_extension_members_test;
+
+import 'package:js/js.dart';
+import 'package:js/js_util.dart' as js_util;
+import 'package:expect/minitest.dart';
+
+@JS()
+external void eval(String code);
+
+@JS()
+class Foo {
+  external Foo(int a);
+}
+
+extension FooExt on Foo {
+  external var field;
+  external final finalField;
+  @JS('fieldAnnotation')
+  external var annotatedField;
+
+  external get getter;
+  @JS('getterAnnotation')
+  external get annotatedGetter;
+
+  external set setter(_);
+  @JS('setterAnnotation')
+  external set annotatedSetter(_);
+}
+
+@JS('module.Bar')
+class Bar {
+  external Bar(int a);
+}
+
+extension BarExt on Bar {
+  @JS('field')
+  external var barField;
+}
+
+void main() {
+  eval(r"""
+    function Foo(a) {
+      this.field = a;
+      this.fieldAnnotation = a;
+      this.finalField = a;
+
+      this.getter = a;
+      this.getterAnnotation = a;
+    }
+
+    var module = {Bar: Foo};
+    """);
+
+  test('fields', () {
+    var foo = Foo(42);
+    // field getters
+    expect(foo.field, equals(42));
+    expect(foo.finalField, equals(42));
+    expect(foo.annotatedField, equals(42));
+
+    // field setters
+    foo.field = 'squid';
+    expect(foo.field, equals('squid'));
+
+    foo.annotatedField = 'octopus';
+    expect(foo.annotatedField, equals('octopus'));
+    js_util.setProperty(foo, 'fieldAnnotation', 'clownfish');
+    expect(foo.annotatedField, equals('clownfish'));
+  });
+
+  test('getters', () {
+    var foo = Foo(42);
+    expect(foo.getter, equals(42));
+    expect(foo.annotatedGetter, equals(42));
+
+    js_util.setProperty(foo, 'getterAnnotation', 'eel');
+    expect(foo.annotatedGetter, equals('eel'));
+  });
+
+  test('setters', () {
+    var foo = Foo(42);
+    foo.setter = 'starfish';
+    expect(js_util.getProperty(foo, 'setter'), equals('starfish'));
+
+    foo.annotatedSetter = 'whale';
+    expect(js_util.getProperty(foo, 'setterAnnotation'), equals('whale'));
+  });
+
+  test('module class', () {
+    var bar = Bar(5);
+    expect(js_util.getProperty(bar, 'fieldAnnotation'), equals(5));
+    expect(bar.barField, equals(5));
+    expect(js_util.getProperty(bar, 'field'), equals(5));
+
+    bar.barField = 10;
+    expect(js_util.getProperty(bar, 'fieldAnnotation'), equals(5));
+    expect(js_util.getProperty(bar, 'field'), equals(10));
+  });
+}
diff --git a/tests/lib_2/js/external_extension_members_test.dart b/tests/lib_2/js/external_extension_members_test.dart
new file mode 100644
index 0000000..a2c08a1
--- /dev/null
+++ b/tests/lib_2/js/external_extension_members_test.dart
@@ -0,0 +1,89 @@
+// Copyright (c) 2021, 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 file.
+
+// @dart = 2.9
+
+// Tests behavior of external extension members, which are routed to js_util
+// calls by a CFE transformation.
+
+@JS()
+library external_extension_members_test;
+
+import 'package:js/js.dart';
+import 'package:js/js_util.dart' as js_util;
+import 'package:expect/minitest.dart';
+
+@JS()
+external void eval(String code);
+
+@JS()
+class Foo {
+  external Foo(int a);
+}
+
+extension FooExt on Foo {
+  external get getter;
+  @JS('getterAnnotation')
+  external get annotatedGetter;
+
+  external set setter(_);
+  @JS('setterAnnotation')
+  external set annotatedSetter(_);
+}
+
+@JS('module.Bar')
+class Bar {
+  external Bar(int a);
+}
+
+extension BarExt on Bar {
+  @JS('field')
+  external get barFieldGetter;
+  @JS('field')
+  external set barFieldSetter(_);
+}
+
+void main() {
+  eval(r"""
+    function Foo(a) {
+      this.field = a;
+      this.fieldAnnotation = a;
+      this.finalField = a;
+
+      this.getter = a;
+      this.getterAnnotation = a;
+    }
+
+    var module = {Bar: Foo};
+    """);
+
+  test('getters', () {
+    var foo = Foo(42);
+    expect(foo.getter, equals(42));
+    expect(foo.annotatedGetter, equals(42));
+
+    js_util.setProperty(foo, 'getterAnnotation', 'eel');
+    expect(foo.annotatedGetter, equals('eel'));
+  });
+
+  test('setters', () {
+    var foo = Foo(42);
+    foo.setter = 'starfish';
+    expect(js_util.getProperty(foo, 'setter'), equals('starfish'));
+
+    foo.annotatedSetter = 'whale';
+    expect(js_util.getProperty(foo, 'setterAnnotation'), equals('whale'));
+  });
+
+  test('module class', () {
+    var bar = Bar(5);
+    expect(js_util.getProperty(bar, 'fieldAnnotation'), equals(5));
+    expect(bar.barFieldGetter, equals(5));
+    expect(js_util.getProperty(bar, 'field'), equals(5));
+
+    bar.barFieldSetter = 10;
+    expect(js_util.getProperty(bar, 'fieldAnnotation'), equals(5));
+    expect(js_util.getProperty(bar, 'field'), equals(10));
+  });
+}
diff --git a/tools/VERSION b/tools/VERSION
index eb841a6..24ddf59 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 135
+PRERELEASE 136
 PRERELEASE_PATCH 0
\ No newline at end of file