Version 3.8.0-151.0.dev

Merge c9aa87bf26ae37f2fab983bfddb09ad8a9c2bb8f into dev
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
index fe08517..5565722 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -5833,9 +5833,17 @@
 
     bool isDotShorthand = token.next!.isA(TokenType.PERIOD) &&
         (token.next!.next!.isIdentifier || token.next!.next!.isA(Keyword.NEW));
-    // TODO(kallentu): Once the parser handles dot shorthands by default,
-    // we don't need to parse for an error here.
-    token = parseUnaryExpression(token, allowCascades, constantPatternContext);
+    if (isDotShorthand) {
+      // TODO(kallentu): Once the analyzer implementation is done, we can avoid
+      // adding a synthetic identifier completely, but currently, the parser
+      // will crash without one.
+      //
+      // Insert a synthetic identifier to satisfy listeners.
+      token = rewriter.insertSyntheticIdentifier(token);
+    } else {
+      token =
+          parseUnaryExpression(token, allowCascades, constantPatternContext);
+    }
 
     Token bangToken = token;
     if (token.next!.isA(TokenType.BANG)) {
diff --git a/pkg/analysis_server/lib/src/status/diagnostics.dart b/pkg/analysis_server/lib/src/status/diagnostics.dart
index 3d24229..935da45 100644
--- a/pkg/analysis_server/lib/src/status/diagnostics.dart
+++ b/pkg/analysis_server/lib/src/status/diagnostics.dart
@@ -346,14 +346,14 @@
     buf.writeln(
       '<tr><th>Files Read</th><th>Time Taken</th><th>&nbsp;</th></tr>',
     );
-    for (var i = 0; i < byteStoreTimings.length - 1; i++) {
+    for (var i = 0; i < byteStoreTimings.length; i++) {
       var timing = byteStoreTimings[i];
       if (timing.readCount == 0) {
         continue;
       }
 
       var nextTiming =
-          i <= byteStoreTimings.length ? byteStoreTimings[i + 1] : null;
+          i + 1 < byteStoreTimings.length ? byteStoreTimings[i + 1] : null;
       var duration = (nextTiming?.time ?? DateTime.now()).difference(
         timing.time,
       );
@@ -491,6 +491,47 @@
     }
     collectedData['uniqueKnownFiles'] = uniqueKnownFiles.length;
 
+    // Data from the 'Analysis Driver Timings' page.
+    var buffer = StringBuffer();
+    server.analysisDriverScheduler.accumulatedPerformance.write(buffer: buffer);
+    collectedData['accumulatedPerformance'] = buffer.toString();
+
+    // FileByteStore timings
+    {
+      var byteStoreTimings =
+          server.byteStoreTimings
+              ?.where(
+                (timing) =>
+                    timing.readCount != 0 || timing.readTime != Duration.zero,
+              )
+              .toList();
+      if (byteStoreTimings != null && byteStoreTimings.isNotEmpty) {
+        var performance = [];
+        collectedData['byteStoreTimings'] = performance;
+        for (var i = 0; i < byteStoreTimings.length; i++) {
+          var timing = byteStoreTimings[i];
+          if (timing.readCount == 0) {
+            continue;
+          }
+
+          var nextTiming =
+              i + 1 < byteStoreTimings.length ? byteStoreTimings[i + 1] : null;
+          var duration = (nextTiming?.time ?? DateTime.now()).difference(
+            timing.time,
+          );
+          var description =
+              'Between ${timing.reason} and ${nextTiming?.reason ?? 'now'} '
+              '(${printMilliseconds(duration.inMilliseconds)}).';
+
+          var itemData = {};
+          performance.add(itemData);
+          itemData['file_reads'] = timing.readCount;
+          itemData['time'] = timing.readTime.inMilliseconds;
+          itemData['description'] = description;
+        }
+      }
+    }
+
     // Recorded performance data (timing and code completion).
     void collectPerformance(List<RequestPerformance> items, String type) {
       var performance = [];
diff --git a/pkg/analyzer/api.txt b/pkg/analyzer/api.txt
index a691b30..629474d 100644
--- a/pkg/analyzer/api.txt
+++ b/pkg/analyzer/api.txt
@@ -708,6 +708,7 @@
   DeclaredVariablePattern (class extends Object implements VariablePattern):
     declaredElement (getter: BindPatternVariableElement?)
     declaredElement2 (getter: BindPatternVariableElement2?)
+    declaredFragment (getter: BindPatternVariableFragment?)
     keyword (getter: Token?)
     type (getter: TypeAnnotation?)
   DefaultFormalParameter (class extends Object implements FormalParameter):
@@ -949,6 +950,7 @@
     returnType (getter: TypeAnnotation?)
     typeParameters (getter: TypeParameterList?)
   GenericFunctionType (class extends Object implements TypeAnnotation):
+    declaredFragment (getter: GenericFunctionTypeFragment?)
     functionKeyword (getter: Token)
     parameters (getter: FormalParameterList)
     returnType (getter: TypeAnnotation?)
@@ -1049,6 +1051,7 @@
     type (getter: TypeAnnotation)
   Label (class extends Object implements AstNode):
     colon (getter: Token)
+    declaredFragment (getter: LabelFragment?)
     label (getter: SimpleIdentifier)
   LabeledStatement (class extends Object implements Statement):
     labels (getter: NodeList<Label>)
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 82bfb61..1fb8935 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -100,7 +100,7 @@
 // TODO(scheglov): Clean up the list of implicitly analyzed files.
 class AnalysisDriver {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 433;
+  static const int DATA_VERSION = 434;
 
   /// The number of exception contexts allowed to write. Once this field is
   /// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index 7af393a..7d435bb 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -2,15 +2,12 @@
 // 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.
 
-// ignore_for_file: analyzer_use_new_elements
-
-import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/summary/format.dart';
@@ -18,11 +15,11 @@
 import 'package:collection/collection.dart';
 import 'package:meta/meta.dart';
 
-Element? declaredParameterElement(
+Element2? declaredParameterElement(
   SimpleIdentifier node,
-  Element? element,
+  Element2? element,
 ) {
-  if (element == null || element.enclosingElement3 != null) {
+  if (element == null || element.enclosingElement2 != null) {
     return element;
   }
 
@@ -30,14 +27,15 @@
   /// synthetic [ParameterElement]s, disconnected from the rest of the
   /// element model. But we want to index these parameter references
   /// as references to declared parameters.
-  ParameterElement? namedParameterElement(ExecutableElement? executable) {
+  FormalParameterElement? namedParameterElement(
+      ExecutableElement2? executable) {
     if (executable == null) {
       return null;
     }
 
     var parameterName = node.name;
-    return executable.declaration.parameters.where((parameter) {
-      return parameter.isNamed && parameter.name == parameterName;
+    return executable.baseElement.formalParameters.where((parameter) {
+      return parameter.isNamed && parameter.name3 == parameterName;
     }).first;
   }
 
@@ -49,11 +47,11 @@
       if (argumentList is ArgumentList) {
         var invocation = argumentList.parent;
         if (invocation is InstanceCreationExpression) {
-          var executable = invocation.constructorName.staticElement;
+          var executable = invocation.constructorName.element;
           return namedParameterElement(executable);
         } else if (invocation is MethodInvocation) {
-          var executable = invocation.methodName.staticElement;
-          if (executable is ExecutableElement) {
+          var executable = invocation.methodName.element;
+          if (executable is ExecutableElement2) {
             return namedParameterElement(executable);
           }
         }
@@ -111,16 +109,12 @@
   return element;
 }
 
-/// Return the [CompilationUnitElement] that should be used for [element].
+/// Return the [CompilationUnitElementImpl] that should be used for [element].
 /// Throw [StateError] if the [element] is not linked into a unit.
-CompilationUnitElement getUnitElement(Element element) {
-  for (Element? e = element; e != null; e = e.enclosingElement3) {
-    if (e is CompilationUnitElement) {
-      return e;
-    }
-    if (e is LibraryElement) {
-      return e.definingCompilationUnit;
-    }
+CompilationUnitElementImpl getUnitElement(Element2 element) {
+  var result = element.firstFragment.libraryFragment;
+  if (result case CompilationUnitElementImpl result) {
+    return result;
   }
   throw StateError('Element not contained in compilation unit: $element');
 }
@@ -135,25 +129,25 @@
   final String? classMemberName;
   final String? unitMemberName;
 
-  factory ElementNameComponents(Element element) {
+  factory ElementNameComponents(Element2 element) {
     String? parameterName;
-    if (element is ParameterElement) {
-      parameterName = element.name;
-      element = element.enclosingElement3!;
+    if (element.firstFragment case FormalParameterFragment fragment) {
+      parameterName = fragment.name2;
+      element = fragment.enclosingFragment!.element;
     }
 
     String? classMemberName;
-    if (element.enclosingElement3 is InterfaceElement ||
-        element.enclosingElement3 is ExtensionElement) {
-      classMemberName = element.name;
-      element = element.enclosingElement3!;
+    if (element.enclosingElement2 is InterfaceElement2 ||
+        element.enclosingElement2 is ExtensionElement2) {
+      classMemberName = element.lookupName;
+      element = element.enclosingElement2!;
     }
 
     String? unitMemberName;
-    if (element.enclosingElement3 is CompilationUnitElement) {
-      unitMemberName = element.name;
-      if (element is ExtensionElement && unitMemberName == null) {
-        var enclosingUnit = element.enclosingElement3;
+    if (element.firstFragment.enclosingFragment is CompilationUnitElementImpl) {
+      unitMemberName = element.lookupName;
+      if (element is ExtensionElement2 && unitMemberName == null) {
+        var enclosingUnit = element.enclosingElement2;
         var indexOf = enclosingUnit.extensions.indexOf(element);
         unitMemberName = 'extension-$indexOf';
       }
@@ -178,10 +172,10 @@
 /// corresponding non-synthetic field and [IndexSyntheticElementKind.getter] as
 /// the [kind].
 class IndexElementInfo {
-  final Element element;
+  final Element2 element;
   final IndexSyntheticElementKind kind;
 
-  factory IndexElementInfo(Element element) {
+  factory IndexElementInfo(Element2 element) {
     IndexSyntheticElementKind kind = IndexSyntheticElementKind.notSynthetic;
     ElementKind elementKind = element.kind;
     if (elementKind == ElementKind.LIBRARY ||
@@ -190,44 +184,44 @@
     } else if (element.isSynthetic) {
       if (elementKind == ElementKind.CONSTRUCTOR) {
         kind = IndexSyntheticElementKind.constructor;
-        element = element.enclosingElement3!;
-      } else if (element is FunctionElement &&
-          element.name == FunctionElement.LOAD_LIBRARY_NAME) {
+        element = element.enclosingElement2!;
+      } else if (element is TopLevelFunctionElement &&
+          element.name3 == TopLevelFunctionElement.LOAD_LIBRARY_NAME) {
         kind = IndexSyntheticElementKind.loadLibrary;
-        element = element.library;
+        element = element.library2;
       } else if (elementKind == ElementKind.FIELD) {
-        var field = element as FieldElement;
+        var field = element as FieldElement2;
         kind = IndexSyntheticElementKind.field;
-        element = (field.getter ?? field.setter)!;
+        element = (field.getter2 ?? field.setter2)!;
       } else if (elementKind == ElementKind.GETTER ||
           elementKind == ElementKind.SETTER) {
-        var accessor = element as PropertyAccessorElement;
-        Element enclosing = element.enclosingElement3;
-        bool isEnumGetter = enclosing is EnumElement;
-        if (isEnumGetter && accessor.name == 'index') {
+        var accessor = element as PropertyAccessorElement2;
+        var enclosing = element.enclosingElement2;
+        bool isEnumGetter = enclosing is EnumElement2;
+        if (isEnumGetter && accessor.name3 == 'index') {
           kind = IndexSyntheticElementKind.enumIndex;
           element = enclosing;
-        } else if (isEnumGetter && accessor.name == 'values') {
+        } else if (isEnumGetter && accessor.name3 == 'values') {
           kind = IndexSyntheticElementKind.enumValues;
           element = enclosing;
         } else {
-          kind = accessor.isGetter
+          kind = accessor is GetterElement
               ? IndexSyntheticElementKind.getter
               : IndexSyntheticElementKind.setter;
-          if (accessor.variable2 case var variable?) {
+          if (accessor.variable3 case var variable?) {
             element = variable;
           }
         }
-      } else if (element is MethodElement) {
-        Element enclosing = element.enclosingElement3;
-        bool isEnumMethod = enclosing is EnumElement;
-        if (isEnumMethod && element.name == 'toString') {
+      } else if (element is MethodElement2) {
+        var enclosing = element.enclosingElement2;
+        bool isEnumMethod = enclosing is EnumElement2;
+        if (isEnumMethod && element.name3 == 'toString') {
           kind = IndexSyntheticElementKind.enumToString;
           element = enclosing;
         }
-      } else if (element is TopLevelVariableElement) {
+      } else if (element is TopLevelVariableElement2) {
         kind = IndexSyntheticElementKind.topLevelVariable;
-        element = (element.getter ?? element.setter)!;
+        element = (element.getter2 ?? element.setter2)!;
       } else {
         throw ArgumentError(
             'Unsupported synthetic element ${element.runtimeType}');
@@ -241,7 +235,8 @@
 
 /// Information about an element referenced in index.
 class _ElementInfo {
-  /// The identifier of the [CompilationUnitElement] containing this element.
+  /// The identifier of the [CompilationUnitElementImpl] containing the first
+  /// fragment of this element.
   final int unitId;
 
   /// The identifier of the top-level name, or `null` if the element is a
@@ -295,20 +290,20 @@
   static const _nullString = '--nullString--';
 
   /// Map associating referenced elements with their [_ElementInfo]s.
-  final Map<Element, _ElementInfo> elementMap = {};
+  final Map<Element2, _ElementInfo> elementMap = {};
 
-  /// Map associating [CompilationUnitElement]s with their identifiers, which
-  /// are indices into [unitLibraryUris] and [unitUnitUris].
-  final Map<CompilationUnitElement, int> unitMap = {};
+  /// Map associating [CompilationUnitElementImpl]s with their identifiers,
+  /// which are indices into [unitLibraryUris] and [unitUnitUris].
+  final Map<CompilationUnitElementImpl, int> unitMap = {};
 
   /// The fields [unitLibraryUris] and [unitUnitUris] are used together to
-  /// describe each unique [CompilationUnitElement].
+  /// describe each unique [CompilationUnitElementImpl].
   ///
   /// This field contains the library URI of a unit.
   final List<_StringInfo> unitLibraryUris = [];
 
   /// The fields [unitLibraryUris] and [unitUnitUris] are used together to
-  /// describe each unique [CompilationUnitElement].
+  /// describe each unique [CompilationUnitElementImpl].
   ///
   /// This field contains the unit URI of a unit, which might be the same as
   /// the library URI for the defining unit, or a different one for a part.
@@ -326,6 +321,9 @@
   /// All subtypes declared in the unit.
   final List<_SubtypeInfo> subtypes = [];
 
+  /// All library fragment to library fragment references.
+  final List<_LibraryFragmentReference> libraryFragmentReferences = [];
+
   /// The [_StringInfo] to use for `null` strings.
   late final _StringInfo nullString;
 
@@ -333,13 +331,28 @@
     nullString = _getStringInfo(_nullString);
   }
 
-  void addElementRelation(Element element, IndexRelationKind kind, int offset,
+  void addElementRelation(Element2 element, IndexRelationKind kind, int offset,
       int length, bool isQualified) {
     _ElementInfo elementInfo = _getElementInfo(element);
     elementRelations.add(
         _ElementRelationInfo(elementInfo, kind, offset, length, isQualified));
   }
 
+  void addLibraryFragmentReference({
+    required CompilationUnitElementImpl target,
+    required int uriOffset,
+    required int uriLength,
+  }) {
+    var targetId = _getUnitId(target);
+    libraryFragmentReferences.add(
+      _LibraryFragmentReference(
+        targetId: targetId,
+        uriOffset: uriOffset,
+        uriLength: uriLength,
+      ),
+    );
+  }
+
   void addNameRelation(
       String name, IndexRelationKind kind, int offset, bool isQualified) {
     _StringInfo nameId = _getStringInfo(name);
@@ -347,21 +360,21 @@
   }
 
   /// Adds a prefix (or empty string for unprefixed) for an element.
-  void addPrefixForElement(Element element, {PrefixElement? prefix}) {
-    if (element is MultiplyDefinedElementImpl ||
+  void addPrefixForElement(Element2 element, {PrefixElement2? prefix}) {
+    if (element is MultiplyDefinedElementImpl2 ||
         // TODO(brianwilkerson): The last two conditions are here because the
         //  elements for `dynamic` and `Never` are singletons and hence don't have
         //  a parent element for which we can find an `_ElementInfo`. This means
         //  that any reference to either type via a prefix can't be stored in the
         //  index. The solution is to make those elements be normal (not unique)
         //  elements.
-        element is DynamicElementImpl ||
-        element is NeverElementImpl) {
+        element is DynamicElementImpl2 ||
+        element is NeverElementImpl2) {
       return;
     }
 
     _ElementInfo elementInfo = _getElementInfo(element);
-    elementInfo.importPrefixes.add(prefix?.name ?? '');
+    elementInfo.importPrefixes.add(prefix?.name3 ?? '');
   }
 
   void addSubtype(String name, List<String> members, List<String> supertypes) {
@@ -421,63 +434,75 @@
       return a.supertype.id - b.supertype.id;
     });
 
+    // Sort library fragment references by targets.
+    libraryFragmentReferences.sortedBy<num>((reference) => reference.targetId);
+
     return AnalysisDriverUnitIndexBuilder(
-        strings: stringInfoList.map((s) => s.value).toList(growable: false),
-        nullStringId: nullString.id,
-        unitLibraryUris:
-            unitLibraryUris.map((s) => s.id).toList(growable: false),
-        unitUnitUris: unitUnitUris.map((s) => s.id).toList(growable: false),
-        elementImportPrefixes: elementInfoList
-            .map((e) => e.importPrefixes.toList(growable: false).join(','))
-            .toList(growable: false),
-        elementKinds:
-            elementInfoList.map((e) => e.kind).toList(growable: false),
-        elementUnits:
-            elementInfoList.map((e) => e.unitId).toList(growable: false),
-        elementNameUnitMemberIds: elementInfoList
-            .map((e) => e.nameIdUnitMember.id)
-            .toList(growable: false),
-        elementNameClassMemberIds: elementInfoList
-            .map((e) => e.nameIdClassMember.id)
-            .toList(growable: false),
-        elementNameParameterIds: elementInfoList
-            .map((e) => e.nameIdParameter.id)
-            .toList(growable: false),
-        usedElements: elementRelations
-            .map((r) => r.elementInfo.id)
-            .toList(growable: false),
-        usedElementKinds:
-            elementRelations.map((r) => r.kind).toList(growable: false),
-        usedElementOffsets:
-            elementRelations.map((r) => r.offset).toList(growable: false),
-        usedElementLengths:
-            elementRelations.map((r) => r.length).toList(growable: false),
-        usedElementIsQualifiedFlags:
-            elementRelations.map((r) => r.isQualified).toList(growable: false),
-        usedNames:
-            nameRelations.map((r) => r.nameInfo.id).toList(growable: false),
-        usedNameKinds: nameRelations.map((r) => r.kind).toList(growable: false),
-        usedNameOffsets:
-            nameRelations.map((r) => r.offset).toList(growable: false),
-        usedNameIsQualifiedFlags:
-            nameRelations.map((r) => r.isQualified).toList(growable: false),
-        supertypes: subtypes.map((subtype) => subtype.supertype.id).toList(growable: false),
-        subtypes: subtypes.map((subtype) {
-          return AnalysisDriverSubtypeBuilder(
-            name: subtype.name.id,
-            members: subtype.members
-                .map((member) => member.id)
-                .toList(growable: false),
-          );
-        }).toList(growable: false));
+      strings: stringInfoList.map((s) => s.value).toList(growable: false),
+      nullStringId: nullString.id,
+      unitLibraryUris: unitLibraryUris.map((s) => s.id).toList(growable: false),
+      unitUnitUris: unitUnitUris.map((s) => s.id).toList(growable: false),
+      elementImportPrefixes: elementInfoList
+          .map((e) => e.importPrefixes.toList(growable: false).join(','))
+          .toList(growable: false),
+      elementKinds: elementInfoList.map((e) => e.kind).toList(growable: false),
+      elementUnits:
+          elementInfoList.map((e) => e.unitId).toList(growable: false),
+      elementNameUnitMemberIds: elementInfoList
+          .map((e) => e.nameIdUnitMember.id)
+          .toList(growable: false),
+      elementNameClassMemberIds: elementInfoList
+          .map((e) => e.nameIdClassMember.id)
+          .toList(growable: false),
+      elementNameParameterIds: elementInfoList
+          .map((e) => e.nameIdParameter.id)
+          .toList(growable: false),
+      usedElements:
+          elementRelations.map((r) => r.elementInfo.id).toList(growable: false),
+      usedElementKinds:
+          elementRelations.map((r) => r.kind).toList(growable: false),
+      usedElementOffsets:
+          elementRelations.map((r) => r.offset).toList(growable: false),
+      usedElementLengths:
+          elementRelations.map((r) => r.length).toList(growable: false),
+      usedElementIsQualifiedFlags:
+          elementRelations.map((r) => r.isQualified).toList(growable: false),
+      usedNames:
+          nameRelations.map((r) => r.nameInfo.id).toList(growable: false),
+      usedNameKinds: nameRelations.map((r) => r.kind).toList(growable: false),
+      usedNameOffsets:
+          nameRelations.map((r) => r.offset).toList(growable: false),
+      usedNameIsQualifiedFlags:
+          nameRelations.map((r) => r.isQualified).toList(growable: false),
+      supertypes: subtypes
+          .map((subtype) => subtype.supertype.id)
+          .toList(growable: false),
+      subtypes: subtypes.map((subtype) {
+        return AnalysisDriverSubtypeBuilder(
+          name: subtype.name.id,
+          members: subtype.members
+              .map((member) => member.id)
+              .toList(growable: false),
+        );
+      }).toList(growable: false),
+      libFragmentRefTargets: libraryFragmentReferences
+          .map((r) => r.targetId)
+          .toList(growable: false),
+      libFragmentRefUriOffsets: libraryFragmentReferences
+          .map((r) => r.uriOffset)
+          .toList(growable: false),
+      libFragmentRefUriLengths: libraryFragmentReferences
+          .map((r) => r.uriLength)
+          .toList(growable: false),
+    );
   }
 
   /// Return the unique [_ElementInfo] corresponding the [element].  The field
   /// [_ElementInfo.id] is filled by [assemble] during final sorting.
-  _ElementInfo _getElementInfo(Element element) {
-    element = element.declaration!;
+  _ElementInfo _getElementInfo(Element2 element) {
+    element = element.baseElement;
     return elementMap.putIfAbsent(element, () {
-      CompilationUnitElement unitElement = getUnitElement(element);
+      var unitElement = getUnitElement(element);
       int unitId = _getUnitId(unitElement);
       return _newElementInfo(unitId, element);
     });
@@ -498,7 +523,7 @@
   /// Add information about [unitElement] to [unitUnitUris] and
   /// [unitLibraryUris] if necessary, and return the location in those
   /// arrays representing [unitElement].
-  int _getUnitId(CompilationUnitElement unitElement) {
+  int _getUnitId(CompilationUnitElementImpl unitElement) {
     return unitMap.putIfAbsent(unitElement, () {
       assert(unitLibraryUris.length == unitUnitUris.length);
       int id = unitUnitUris.length;
@@ -517,7 +542,7 @@
 
   /// Return a new [_ElementInfo] for the given [element] in the given [unitId].
   /// This method is static, so it cannot add any information to the index.
-  _ElementInfo _newElementInfo(int unitId, Element element) {
+  _ElementInfo _newElementInfo(int unitId, Element2 element) {
     IndexElementInfo info = IndexElementInfo(element);
     element = info.element;
 
@@ -538,8 +563,8 @@
 
   _IndexContributor(this.assembler);
 
-  void recordIsAncestorOf(InterfaceElement descendant) {
-    _recordIsAncestorOf(descendant, descendant, false, <InterfaceElement>[]);
+  void recordIsAncestorOf(InterfaceElement2 descendant) {
+    _recordIsAncestorOf(descendant, descendant, false, <InterfaceElement2>[]);
   }
 
   /// Record that the name [node] has a relation of the given [kind].
@@ -548,8 +573,8 @@
     assembler.addNameRelation(node.name, kind, node.offset, isQualified);
   }
 
-  /// Record reference to the given operator [Element].
-  void recordOperatorReference(Token operator, Element? element) {
+  /// Record reference to the given operator [Element2].
+  void recordOperatorReference(Token operator, Element2? element) {
     recordRelationToken(element, IndexRelationKind.IS_INVOKED_BY, operator);
   }
 
@@ -557,7 +582,7 @@
   /// of the given [node].  The flag [isQualified] is `true` if [node] has an
   /// explicit or implicit qualifier, so cannot be shadowed by a local
   /// declaration.
-  void recordRelation(Element? element, IndexRelationKind kind,
+  void recordRelation(Element2? element, IndexRelationKind kind,
       SyntacticEntity node, bool isQualified) {
     if (element != null) {
       recordRelationOffset(
@@ -569,7 +594,7 @@
   /// [offset] and [length].  The flag [isQualified] is `true` if the relation
   /// has an explicit or implicit qualifier, so [element] cannot be shadowed by
   /// a local declaration.
-  void recordRelationOffset(Element? element, IndexRelationKind kind,
+  void recordRelationOffset(Element2? element, IndexRelationKind kind,
       int offset, int length, bool isQualified) {
     if (element == null) return;
 
@@ -583,15 +608,14 @@
         elementKind == ElementKind.PREFIX ||
         elementKind == ElementKind.TYPE_PARAMETER ||
         elementKind == ElementKind.FUNCTION &&
-            element is FunctionElement &&
-            element.enclosingElement3 is ExecutableElement ||
-        false) {
+            element is LocalFunctionElement) {
       return;
     }
     // Ignore named parameters of synthetic functions, e.g. created for LUB.
     // These functions are not bound to a source, we cannot index them.
-    if (elementKind == ElementKind.PARAMETER && element is ParameterElement) {
-      var enclosingElement = element.enclosingElement3;
+    if (elementKind == ElementKind.PARAMETER &&
+        element is FormalParameterElement) {
+      var enclosingElement = element.enclosingElement2;
       if (enclosingElement == null || enclosingElement.isSynthetic) {
         return;
       }
@@ -600,8 +624,8 @@
     // units, but don't have names. So, we cannot index references to their
     // named parameters. Ignore them.
     if (elementKind == ElementKind.PARAMETER &&
-        element is ParameterElement &&
-        element.enclosingElement3 is GenericFunctionTypeElement) {
+        element is FormalParameterElement &&
+        element.enclosingElement2 is GenericFunctionTypeElement2) {
       return;
     }
     // Add the relation.
@@ -611,7 +635,7 @@
   /// Record that [element] has a relation of the given [kind] at the location
   /// of the given [token].
   void recordRelationToken(
-    Element? element,
+    Element2? element,
     IndexRelationKind kind,
     Token token, {
     bool isQualified = true,
@@ -620,35 +644,35 @@
         element, kind, token.offset, token.length, isQualified);
   }
 
-  /// Record a relation between a super [namedType] and its [Element].
+  /// Record a relation between a super [namedType] and its [Element2].
   void recordSuperType(NamedType namedType, IndexRelationKind kind) {
     var isQualified = namedType.importPrefix != null;
-    var element = namedType.element;
+    var element = namedType.element2;
     recordRelation(element, kind, namedType.name2, isQualified);
   }
 
-  void recordUriReference(Element? element, StringLiteral uri) {
+  void recordUriReference(Element2? element, StringLiteral uri) {
     recordRelation(element, IndexRelationKind.IS_REFERENCED_BY, uri, true);
   }
 
   @override
   void visitAssignmentExpression(AssignmentExpression node) {
-    recordOperatorReference(node.operator, node.staticElement);
+    recordOperatorReference(node.operator, node.element);
     super.visitAssignmentExpression(node);
   }
 
   @override
   void visitBinaryExpression(BinaryExpression node) {
-    recordOperatorReference(node.operator, node.staticElement);
+    recordOperatorReference(node.operator, node.element);
     super.visitBinaryExpression(node);
   }
 
   @override
   void visitClassDeclaration(ClassDeclaration node) {
     _addSubtypeForClassDeclaration(node);
-    var declaredElement = node.declaredElement!;
+    var declaredElement = node.declaredFragment!.element;
     if (node.extendsClause == null) {
-      var objectElement = declaredElement.supertype?.element;
+      var objectElement = declaredElement.supertype?.element3;
       recordRelationOffset(objectElement, IndexRelationKind.IS_EXTENDED_BY,
           node.name.offset, 0, true);
     }
@@ -657,11 +681,11 @@
     // If the class has only a synthetic default constructor, then it
     // implicitly invokes the default super constructor. Associate the
     // invocation with the name of the class.
-    var defaultConstructor = declaredElement.constructors.singleOrNull;
-    if (defaultConstructor is ConstructorElementImpl &&
+    var defaultConstructor = declaredElement.constructors2.singleOrNull;
+    if (defaultConstructor is ConstructorElementImpl2 &&
         defaultConstructor.isSynthetic) {
       defaultConstructor.isDefaultConstructor;
-      var superConstructor = defaultConstructor.superConstructor;
+      var superConstructor = defaultConstructor.superConstructor2;
       if (superConstructor != null) {
         recordRelation(
             superConstructor, IndexRelationKind.IS_INVOKED_BY, node.name, true);
@@ -674,7 +698,7 @@
   @override
   void visitClassTypeAlias(ClassTypeAlias node) {
     _addSubtypeForClassTypeAlis(node);
-    recordIsAncestorOf(node.declaredElement!);
+    recordIsAncestorOf(node.declaredFragment!.element);
     recordSuperType(node.superclass, IndexRelationKind.IS_EXTENDED_BY);
     super.visitClassTypeAlias(node);
   }
@@ -683,8 +707,8 @@
   visitCommentReference(CommentReference node) {
     var expression = node.expression;
     if (expression is Identifier) {
-      var element = expression.staticElement;
-      if (element is ConstructorElement) {
+      var element = expression.element;
+      if (element is ConstructorElement2) {
         if (expression is PrefixedIdentifier) {
           var offset = expression.prefix.end;
           var length = expression.end - offset;
@@ -709,12 +733,12 @@
   }
 
   @override
-  visitConstructorDeclaration(ConstructorDeclaration node) {
+  visitConstructorDeclaration(covariant ConstructorDeclarationImpl node) {
     // If the constructor does not have an explicit `super` constructor
     // invocation, it implicitly invokes the unnamed constructor.
     if (node.initializers.none((e) => e is SuperConstructorInvocation)) {
-      var element = node.declaredElement as ConstructorElementImpl;
-      var superConstructor = element.superConstructor;
+      var element = node.declaredFragment!.element;
+      var superConstructor = element.superConstructor2;
       if (superConstructor != null) {
         var offset = node.returnType.offset;
         var end = (node.name ?? node.returnType).end;
@@ -729,14 +753,14 @@
   @override
   void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     var fieldName = node.fieldName;
-    var element = fieldName.staticElement;
+    var element = fieldName.element;
     recordRelation(element, IndexRelationKind.IS_WRITTEN_BY, fieldName, true);
     node.expression.accept(this);
   }
 
   @override
   void visitConstructorName(ConstructorName node) {
-    var element = node.staticElement?.declaration;
+    var element = node.element?.baseElement;
     element = _getActualConstructorElement(element);
 
     IndexRelationKind kind;
@@ -765,7 +789,7 @@
 
   @override
   void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
-    var constructorElement = node.constructorElement;
+    var constructorElement = node.constructorElement2;
     if (constructorElement != null) {
       int offset;
       int length;
@@ -800,21 +824,21 @@
       memberNodes: node.members,
     );
 
-    var declaredElement = node.declaredElement!;
+    var declaredElement = node.declaredFragment!.element;
     recordIsAncestorOf(declaredElement);
     super.visitEnumDeclaration(node);
   }
 
   @override
   void visitExportDirective(ExportDirective node) {
-    var element = node.element;
-    recordUriReference(element?.exportedLibrary, node.uri);
+    var element = node.libraryExport;
+    recordUriReference(element?.exportedLibrary2, node.uri);
     super.visitExportDirective(node);
   }
 
   @override
   void visitExpression(Expression node) {
-    ParameterElement? parameterElement = node.staticParameterElement;
+    var parameterElement = node.correspondingParameter;
     if (parameterElement != null && parameterElement.isOptionalPositional) {
       recordRelationOffset(parameterElement, IndexRelationKind.IS_REFERENCED_BY,
           node.offset, 0, true);
@@ -833,7 +857,7 @@
     _recordImportPrefixedElement(
       importPrefix: node.importPrefix,
       name: node.name,
-      element: node.element,
+      element: node.element2,
     );
 
     node.typeArguments?.accept(this);
@@ -848,20 +872,18 @@
       memberNodes: node.members,
     );
 
-    var declaredElement = node.declaredElement!;
+    var declaredElement = node.declaredFragment!.element;
     recordIsAncestorOf(declaredElement);
 
     super.visitExtensionTypeDeclaration(node);
   }
 
   @override
-  visitFieldFormalParameter(FieldFormalParameter node) {
-    var element = node.declaredElement;
-    if (element is FieldFormalParameterElement) {
-      var field = element.field;
-      if (field != null) {
-        recordRelation(field, IndexRelationKind.IS_WRITTEN_BY, node.name, true);
-      }
+  visitFieldFormalParameter(covariant FieldFormalParameterImpl node) {
+    var element = node.declaredFragment!.element;
+    var field = element.field2;
+    if (field != null) {
+      recordRelation(field, IndexRelationKind.IS_WRITTEN_BY, node.name, true);
     }
 
     return super.visitFieldFormalParameter(node);
@@ -877,15 +899,15 @@
 
   @override
   void visitImportDirective(ImportDirective node) {
-    var element = node.element;
-    recordUriReference(element?.importedLibrary, node.uri);
+    var element = node.libraryImport;
+    recordUriReference(element?.importedLibrary2, node.uri);
     super.visitImportDirective(node);
   }
 
   @override
   void visitIndexExpression(IndexExpression node) {
-    Element? element = node.writeOrReadElement;
-    if (element is MethodElement) {
+    var element = node.writeOrReadElement2;
+    if (element is MethodElement2) {
       Token operator = node.leftBracket;
       recordRelationToken(element, IndexRelationKind.IS_INVOKED_BY, operator);
     }
@@ -898,14 +920,14 @@
   @override
   void visitMethodInvocation(MethodInvocation node) {
     SimpleIdentifier name = node.methodName;
-    Element? element = name.staticElement;
+    var element = name.element;
     // unresolved name invocation
     bool isQualified = node.realTarget != null;
     if (element == null) {
       recordNameRelation(name, IndexRelationKind.IS_INVOKED_BY, isQualified);
     }
     // element invocation
-    IndexRelationKind kind = element is InterfaceElement
+    IndexRelationKind kind = element is InterfaceElement2
         ? IndexRelationKind.IS_REFERENCED_BY
         : IndexRelationKind.IS_INVOKED_BY;
     recordRelation(element, kind, name, isQualified);
@@ -917,7 +939,7 @@
   @override
   void visitMixinDeclaration(MixinDeclaration node) {
     _addSubtypeForMixinDeclaration(node);
-    recordIsAncestorOf(node.declaredElement!);
+    recordIsAncestorOf(node.declaredFragment!.element);
     super.visitMixinDeclaration(node);
   }
 
@@ -934,21 +956,24 @@
     _recordImportPrefixedElement(
       importPrefix: node.importPrefix,
       name: node.name2,
-      element: node.element,
+      element: node.element2,
     );
 
     node.typeArguments?.accept(this);
   }
 
   @override
-  void visitPartDirective(PartDirective node) {
-    var partElement = node.element;
-    if (partElement is PartElement) {
-      var partElementUri = partElement.uri;
-      if (partElementUri is DirectiveUriWithUnit) {
-        recordUriReference(partElementUri.unit, node.uri);
+  void visitPartDirective(covariant PartDirectiveImpl node) {
+    if (node.partInclude case var partInclude?) {
+      if (partInclude.includedFragment case var includedFragment?) {
+        assembler.addLibraryFragmentReference(
+          target: includedFragment,
+          uriOffset: node.uri.offset,
+          uriLength: node.uri.length,
+        );
       }
     }
+
     super.visitPartDirective(node);
   }
 
@@ -966,7 +991,7 @@
         offset = nameNode.offset;
         length = 0;
       }
-      recordRelationOffset(node.element, IndexRelationKind.IS_REFERENCED_BY,
+      recordRelationOffset(node.element2, IndexRelationKind.IS_REFERENCED_BY,
           offset, length, true);
     }
     return super.visitPatternField(node);
@@ -974,15 +999,15 @@
 
   @override
   void visitPostfixExpression(PostfixExpression node) {
-    recordOperatorReference(node.operator, node.staticElement);
+    recordOperatorReference(node.operator, node.element);
     super.visitPostfixExpression(node);
   }
 
   @override
   void visitPrefixedIdentifier(PrefixedIdentifier node) {
-    var element = node.staticElement;
-    var prefixElement = node.prefix.staticElement;
-    if (element != null && prefixElement is PrefixElement) {
+    var element = node.element;
+    var prefixElement = node.prefix.element;
+    if (element != null && prefixElement is PrefixElement2) {
       assembler.addPrefixForElement(element, prefix: prefixElement);
     }
     super.visitPrefixedIdentifier(node);
@@ -990,14 +1015,14 @@
 
   @override
   void visitPrefixExpression(PrefixExpression node) {
-    recordOperatorReference(node.operator, node.staticElement);
+    recordOperatorReference(node.operator, node.element);
     super.visitPrefixExpression(node);
   }
 
   @override
   void visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
-    var element = node.staticElement;
+    var element = node.element;
     if (node.constructorName != null) {
       int offset = node.period!.offset;
       int length = node.constructorName!.end - offset;
@@ -1018,14 +1043,14 @@
       return;
     }
 
-    Element? element = node.writeOrReadElement;
-    if (element is ParameterElement) {
+    var element = node.writeOrReadElement2;
+    if (element is FormalParameterElementImpl) {
       element = declaredParameterElement(node, element);
     }
 
     var parent = node.parent;
     if (element != null &&
-        element.enclosingElement3 is CompilationUnitElement &&
+        element.firstFragment.enclosingFragment is CompilationUnitElementImpl &&
         // We're only unprefixed when part of a PrefixedIdentifier if we're
         // the left side.
         (parent is! PrefixedIdentifier || parent.prefix == node)) {
@@ -1048,7 +1073,7 @@
       recordNameRelation(node, kind, isQualified);
     }
     // ignore a local reference to a parameter
-    if (element is ParameterElement && node.parent is! Label) {
+    if (element is FormalParameterElement && node.parent is! Label) {
       return;
     }
     // record specific relations
@@ -1058,7 +1083,7 @@
 
   @override
   void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    var element = node.staticElement;
+    var element = node.element;
     if (node.constructorName != null) {
       int offset = node.period!.offset;
       int length = node.constructorName!.end - offset;
@@ -1074,9 +1099,9 @@
 
   @override
   visitSuperFormalParameter(SuperFormalParameter node) {
-    var element = node.declaredElement;
-    if (element is SuperFormalParameterElementImpl) {
-      var superParameter = element.superConstructorParameter;
+    var element = node.declaredFragment!.element;
+    if (element is SuperFormalParameterElementImpl2) {
+      var superParameter = element.superConstructorParameter2;
       if (superParameter != null) {
         recordRelation(superParameter, IndexRelationKind.IS_REFERENCED_BY,
             node.name, true);
@@ -1104,14 +1129,16 @@
     List<String> supertypes = [];
     List<String> members = [];
 
-    String getInterfaceElementId(InterfaceElement element) {
-      return '${element.library.source.uri};'
-          '${element.source.uri};${element.name}';
+    String getInterfaceElementId(InterfaceElement2 element) {
+      var libraryUri = element.library2.uri;
+      var libraryFragment = element.firstFragment.libraryFragment;
+      var libraryFragmentUri = libraryFragment.source.uri;
+      return '$libraryUri;$libraryFragmentUri;${element.name3}';
     }
 
     void addSupertype(NamedType? type) {
-      var element = type?.element;
-      if (element is InterfaceElement) {
+      var element = type?.element2;
+      if (element is InterfaceElement2) {
         String id = getInterfaceElementId(element);
         supertypes.add(id);
       }
@@ -1174,17 +1201,17 @@
   /// If the given [constructor] is a synthetic constructor created for a
   /// [ClassTypeAlias], return the actual constructor of a [ClassDeclaration]
   /// which is invoked.  Return `null` if a redirection cycle is detected.
-  ConstructorElement? _getActualConstructorElement(
-      ConstructorElement? constructor) {
-    var seenConstructors = <ConstructorElement?>{};
-    while (constructor is ConstructorElementImpl && constructor.isSynthetic) {
-      var enclosing = constructor.enclosingElement3;
-      if (enclosing is ClassElementImpl && enclosing.isMixinApplication) {
-        var superInvocation = constructor.constantInitializers
+  ConstructorElement2? _getActualConstructorElement(
+      ConstructorElement2? constructor) {
+    var seenConstructors = <ConstructorElement2?>{};
+    while (constructor is ConstructorElementImpl2 && constructor.isSynthetic) {
+      var enclosing = constructor.enclosingElement2;
+      if (enclosing is ClassElementImpl2 && enclosing.isMixinApplication) {
+        var superInvocation = constructor.firstFragment.constantInitializers
             .whereType<SuperConstructorInvocation>()
             .singleOrNull;
         if (superInvocation != null) {
-          constructor = superInvocation.staticElement;
+          constructor = superInvocation.element;
         }
       } else {
         break;
@@ -1210,17 +1237,17 @@
   void _recordImportPrefixedElement({
     required ImportPrefixReference? importPrefix,
     required Token name,
-    required Element? element,
+    required Element2? element,
   }) {
     if (element == null) {
       return;
     }
 
     if (importPrefix != null) {
-      var prefixElement = importPrefix.element;
-      if (prefixElement is PrefixElement) {
+      var prefixElement = importPrefix.element2;
+      if (prefixElement is PrefixElement2) {
         recordRelationToken(
-          importPrefix.element,
+          importPrefix.element2,
           IndexRelationKind.IS_REFERENCED_BY,
           importPrefix.name,
           isQualified: false,
@@ -1239,40 +1266,55 @@
     );
   }
 
-  void _recordIsAncestorOf(Element descendant, InterfaceElement ancestor,
-      bool includeThis, List<InterfaceElement> visitedElements) {
+  void _recordIsAncestorOf(Element2 descendant, InterfaceElement2 ancestor,
+      bool includeThis, List<InterfaceElement2> visitedElements) {
     if (visitedElements.contains(ancestor)) {
       return;
     }
     visitedElements.add(ancestor);
     if (includeThis) {
-      int offset = descendant.nameOffset;
-      int length = descendant.nameLength;
-      assembler.addElementRelation(
-          ancestor, IndexRelationKind.IS_ANCESTOR_OF, offset, length, false);
+      var offset = descendant.firstFragment.nameOffset2;
+      var length = descendant.name3?.length;
+      if (offset != null && length != null) {
+        assembler.addElementRelation(
+            ancestor, IndexRelationKind.IS_ANCESTOR_OF, offset, length, false);
+      }
     }
     {
       var superType = ancestor.supertype;
       if (superType != null) {
         _recordIsAncestorOf(
-            descendant, superType.element, true, visitedElements);
+            descendant, superType.element3, true, visitedElements);
       }
     }
     for (InterfaceType mixinType in ancestor.mixins) {
-      _recordIsAncestorOf(descendant, mixinType.element, true, visitedElements);
+      _recordIsAncestorOf(
+          descendant, mixinType.element3, true, visitedElements);
     }
-    if (ancestor is MixinElement) {
+    if (ancestor is MixinElement2) {
       for (InterfaceType type in ancestor.superclassConstraints) {
-        _recordIsAncestorOf(descendant, type.element, true, visitedElements);
+        _recordIsAncestorOf(descendant, type.element3, true, visitedElements);
       }
     }
     for (InterfaceType implementedType in ancestor.interfaces) {
       _recordIsAncestorOf(
-          descendant, implementedType.element, true, visitedElements);
+          descendant, implementedType.element3, true, visitedElements);
     }
   }
 }
 
+class _LibraryFragmentReference {
+  final int targetId;
+  final int uriOffset;
+  final int uriLength;
+
+  _LibraryFragmentReference({
+    required this.targetId,
+    required this.uriOffset,
+    required this.uriLength,
+  });
+}
+
 /// Information about a single name relation in single compilation unit.
 class _NameRelationInfo {
   final _StringInfo nameInfo;
@@ -1308,3 +1350,31 @@
 
   _SubtypeInfo(this.supertype, this.name, this.members);
 }
+
+extension AnalysisDriverUnitIndexExtension on AnalysisDriverUnitIndex {
+  int getLibraryFragmentId(CompilationUnitElementImpl fragment) {
+    var libraryUriId = getUriId(fragment.element.uri);
+    var unitUriId = getUriId(fragment.source.uri);
+    for (var i = 0; i < unitLibraryUris.length; i++) {
+      if (unitLibraryUris[i] == libraryUriId && unitUnitUris[i] == unitUriId) {
+        return i;
+      }
+    }
+    return -1;
+  }
+
+  /// Returns the identifier of [str], or `-1` if not used.
+  int getStringId(String? str) {
+    if (str == null) {
+      return nullStringId;
+    }
+
+    return binarySearch(strings, str);
+  }
+
+  /// Returns the identifier of the [uri], or `-1` if not used.
+  int getUriId(Uri uri) {
+    var str = uri.toString();
+    return getStringId(str);
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index cf66ebd..8cc7036 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -381,7 +381,7 @@
       return _searchReferences(element, searchedFiles);
     } else if (element is ConstructorElement) {
       return await _searchReferences_Constructor(element, searchedFiles);
-    } else if (element is CompilationUnitElement) {
+    } else if (element is CompilationUnitElementImpl) {
       return _searchReferences_CompilationUnit(element);
     } else if (element is PropertyAccessorElement && element.isGetter) {
       return _searchReferences_Getter(element, searchedFiles);
@@ -692,7 +692,7 @@
   }
 
   Future<List<SearchResult>> _searchReferences_CompilationUnit(
-      CompilationUnitElement element) async {
+      CompilationUnitElementImpl element) async {
     String path = element.source.fullName;
 
     var file = _driver.resourceProvider.getFile(path);
@@ -704,8 +704,28 @@
     }
 
     // Check files that reference the given file.
-    List<SearchResult> results = <SearchResult>[];
+    var results = <SearchResult>[];
     for (var reference in fileState.referencingFiles) {
+      var index = await _driver.getIndex(reference.path);
+      if (index != null) {
+        var targetId = index.getLibraryFragmentId(element);
+        for (var i = 0; i < index.libFragmentRefTargets.length; i++) {
+          if (index.libFragmentRefTargets[i] == targetId) {
+            var refUnit = await _getUnitElement(reference.path);
+            results.add(
+              SearchResult._(
+                refUnit!,
+                SearchResultKind.REFERENCE,
+                index.libFragmentRefUriOffsets[i],
+                index.libFragmentRefUriLengths[i],
+                true,
+                true,
+              ),
+            );
+          }
+        }
+      }
+
       await _addResultsInFile(
         results,
         element,
@@ -1391,7 +1411,7 @@
 
   void addSubtypes(
       String superIdString, List<SubtypeResult> results, FileState file) {
-    var superId = getStringId(superIdString);
+    var superId = index.getStringId(superIdString);
     if (superId == -1) {
       return;
     }
@@ -1425,24 +1445,24 @@
   /// Return the [element]'s identifier in the [index] or `-1` if the
   /// [element] is not referenced in the [index].
   int findElementId(Element element) {
-    IndexElementInfo info = IndexElementInfo(element);
-    element = info.element;
+    IndexElementInfo info = IndexElementInfo(element.asElement2!);
+    element = info.element.asElement!;
     // Find the id of the element's unit.
     int unitId = getUnitId(element);
     if (unitId == -1) {
       return -1;
     }
     // Prepare information about the element.
-    var components = ElementNameComponents(element);
-    int unitMemberId = getStringId(components.unitMemberName);
+    var components = ElementNameComponents(element.asElement2!);
+    int unitMemberId = index.getStringId(components.unitMemberName);
     if (unitMemberId == -1) {
       return -1;
     }
-    int classMemberId = getStringId(components.classMemberName);
+    int classMemberId = index.getStringId(components.classMemberName);
     if (classMemberId == -1) {
       return -1;
     }
-    int parameterId = getStringId(components.parameterName);
+    int parameterId = index.getStringId(components.parameterName);
     if (parameterId == -1) {
       return -1;
     }
@@ -1511,35 +1531,11 @@
     return results;
   }
 
-  /// Return the identifier of [str] in the [index] or `-1` if [str] is not
-  /// used in the [index].
-  int getStringId(String? str) {
-    if (str == null) {
-      return index.nullStringId;
-    }
-
-    return binarySearch(index.strings, str);
-  }
-
   /// Return the identifier of the [CompilationUnitElement] containing the
   /// [element] in the [index] or `-1` if not found.
   int getUnitId(Element element) {
-    CompilationUnitElement unitElement = getUnitElement(element);
-    int libraryUriId = getUriId(unitElement.library.source.uri);
-    if (libraryUriId == -1) {
-      return -1;
-    }
-    int unitUriId = getUriId(unitElement.source.uri);
-    if (unitUriId == -1) {
-      return -1;
-    }
-    for (int i = 0; i < index.unitLibraryUris.length; i++) {
-      if (index.unitLibraryUris[i] == libraryUriId &&
-          index.unitUnitUris[i] == unitUriId) {
-        return i;
-      }
-    }
-    return -1;
+    var unitElement = getUnitElement(element.asElement2!);
+    return index.getLibraryFragmentId(unitElement);
   }
 
   /// Return a list of results where a class members with the given [name] is
@@ -1550,7 +1546,7 @@
       Future<CompilationUnitElement?> Function()
           getEnclosingUnitElement) async {
     // Find the name identifier.
-    int nameId = getStringId(name);
+    int nameId = index.getStringId(name);
     if (nameId == -1) {
       return const <SearchResult>[];
     }
@@ -1582,13 +1578,6 @@
     return results;
   }
 
-  /// Return the identifier of the [uri] in the [index] or `-1` if the [uri] is
-  /// not used in the [index].
-  int getUriId(Uri uri) {
-    String str = uri.toString();
-    return getStringId(str);
-  }
-
   /// Return the index of the first occurrence of the [value] in the
   /// [sortedList], or `-1` if the [value] is not in the list.
   int _findFirstOccurrence(List<int> sortedList, int value) {
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index b95f4f0..6e06dda 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -5025,6 +5025,11 @@
   @experimental
   BindPatternVariableElement2? get declaredElement2;
 
+  /// The fragment declared by this declaration.
+  ///
+  /// Returns `null` if the AST structure hasn't been resolved.
+  BindPatternVariableFragment? get declaredFragment;
+
   /// The `var` or `final` keyword.
   Token? get keyword;
 
@@ -5062,6 +5067,9 @@
   }
 
   @override
+  BindPatternVariableElementImpl? get declaredFragment => declaredElement;
+
+  @override
   Token get endToken => name;
 
   /// The `final` keyword, or `null` if the `final` keyword isn't used.
@@ -5686,7 +5694,7 @@
   final EnumConstantArgumentsImpl? arguments;
 
   @override
-  ConstructorElement? constructorElement;
+  ConstructorElementMixin? constructorElement;
 
   /// Initializes a newly created enum constant declaration.
   ///
@@ -5704,10 +5712,10 @@
 
   @experimental
   @override
-  ConstructorElement2? get constructorElement2 =>
+  ConstructorElementMixin2? get constructorElement2 =>
       constructorElement?.asElement2;
 
-  set constructorElement2(ConstructorElement2? value) {
+  set constructorElement2(ConstructorElementMixin2? value) {
     constructorElement = value?.asElement;
   }
 
@@ -9093,6 +9101,11 @@
 ///        [ normalParameterTypes ,? ]
 @AnalyzerPublicApi(message: 'exported by lib/dart/ast/ast.dart')
 abstract final class GenericFunctionType implements TypeAnnotation {
+  /// The fragment declared by this declaration.
+  ///
+  /// Returns `null` if the AST structure hasn't been resolved.
+  GenericFunctionTypeFragment? get declaredFragment;
+
   /// The `Function` keyword.
   Token get functionKeyword;
 
@@ -9148,6 +9161,7 @@
   @override
   Token get beginToken => _returnType?.beginToken ?? functionKeyword;
 
+  @override
   GenericFunctionTypeElementImpl? get declaredFragment {
     return declaredElement;
   }
@@ -10860,10 +10874,10 @@
   TypeArgumentListImpl? _typeArguments;
 
   @override
-  List<DartType>? typeArgumentTypes;
+  List<TypeImpl>? typeArgumentTypes;
 
   @override
-  DartType? staticInvokeType;
+  TypeImpl? staticInvokeType;
 
   /// Initializes a newly created invocation.
   InvocationExpressionImpl({
@@ -10988,6 +11002,11 @@
   /// The colon that separates the label from the statement.
   Token get colon;
 
+  /// The fragment declared by this declaration.
+  ///
+  /// Returns `null` if the AST structure hasn't been resolved.
+  LabelFragment? get declaredFragment;
+
   /// The label being associated with the statement.
   SimpleIdentifier get label;
 }
@@ -11077,6 +11096,10 @@
   Token get beginToken => _label.beginToken;
 
   @override
+  LabelElementImpl? get declaredFragment =>
+      (label.element as LabelElementImpl2?)?.firstFragment;
+
+  @override
   Token get endToken => colon;
 
   @override
@@ -13812,7 +13835,7 @@
 
   @experimental
   @override
-  PartInclude? get partInclude => element as PartInclude?;
+  PartElementImpl? get partInclude => element;
 
   @override
   ChildEntities get _childEntities => super._childEntities
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index aea2c42..dfd4c7d 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -130,7 +130,7 @@
   }
 
   @override
-  void visitConstantPattern(ConstantPattern node) {
+  void visitConstantPattern(covariant ConstantPatternImpl node) {
     var expression = node.expression.unParenthesized;
     if (expression.typeOrThrow is InvalidType) {
       return;
@@ -517,7 +517,7 @@
   /// Returns `false` if we can prove that `constant == value` always returns
   /// `false`, taking into account the fact that [constantType] has primitive
   /// equality.
-  bool _canBeEqual(DartType constantType, DartType valueType) {
+  bool _canBeEqual(TypeImpl constantType, TypeImpl valueType) {
     if (constantType is InterfaceType) {
       if (valueType is InterfaceTypeImpl) {
         if (constantType.isDartCoreInt && valueType.isDartCoreDouble) {
@@ -776,7 +776,7 @@
 
   /// Check if the object [obj] matches the type [type] according to runtime
   /// type checking rules.
-  bool _runtimeTypeMatch(DartObjectImpl obj, DartType type) {
+  bool _runtimeTypeMatch(DartObjectImpl obj, TypeImpl type) {
     return _currentLibrary.typeSystem.runtimeTypeMatch(obj, type);
   }
 
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index e1016ce..056ea78 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -2910,7 +2910,8 @@
         if (baseParameter.isInitializingFormal) {
           var field = (parameter as FieldFormalParameterElement).field;
           if (field != null) {
-            var fieldType = field.type;
+            // TODO(scheglov): eliminate this cast
+            var fieldType = field.type as TypeImpl;
             if (fieldType != parameter.type) {
               // We've already checked that the argument can be assigned to the
               // parameter; we also need to check that it can be assigned to
@@ -3192,7 +3193,7 @@
   /// type-checking rules.
   bool runtimeTypeMatch(
     DartObjectImpl obj,
-    DartType type,
+    TypeImpl type,
   ) {
     type = type.extensionTypeErasure;
     var objType = obj.type;
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 2501c83..36d1372 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1808,6 +1808,9 @@
   ConstructorElementImpl2 get baseElement;
 
   @override
+  InterfaceElementImpl2 get enclosingElement2;
+
+  @override
   InterfaceTypeImpl get returnType;
 }
 
@@ -1974,10 +1977,9 @@
       return null;
     }
 
+    // TODO(scheglov): eliminate this cast
+    superDefault as DartObjectImpl;
     var superDefaultType = superDefault.type;
-    if (superDefaultType == null) {
-      return null;
-    }
 
     var typeSystem = library?.typeSystem;
     if (typeSystem == null) {
@@ -2079,7 +2081,7 @@
   });
 
   @override
-  LibraryFragment get libraryFragment => unit;
+  CompilationUnitElementImpl get libraryFragment => unit;
 
   @override
   Source get source => unit.source;
@@ -3745,12 +3747,12 @@
   }
 
   @override
-  List<FieldElement> get constants {
+  List<FieldElementOrMember> get constants {
     return fields.where((field) => field.isEnumConstant).toList();
   }
 
   @override
-  List<FieldElement2> get constants2 =>
+  List<FieldElement2OrMember> get constants2 =>
       constants.map((e) => e.asElement2).toList();
 
   @override
@@ -4328,7 +4330,7 @@
   ConstructorElement2 get primaryConstructor2 => primaryConstructor.element;
 
   @override
-  FieldElement2 get representation2 => representation.asElement2;
+  FieldElement2OrMember get representation2 => representation.asElement2;
 
   @override
   T? accept2<T>(ElementVisitor2<T> visitor) {
@@ -4489,7 +4491,7 @@
   }
 
   @override
-  GetterElement? get getter2 => firstFragment.getter?.element as GetterElement?;
+  GetterElementImpl? get getter2 => firstFragment.getter?.element;
 
   @override
   bool get hasImplicitType => firstFragment.hasImplicitType;
@@ -4533,7 +4535,7 @@
   String? get name3 => firstFragment.name2;
 
   @override
-  SetterElement? get setter2 => firstFragment.setter?.element as SetterElement?;
+  SetterElementImpl? get setter2 => firstFragment.setter?.element;
 
   @override
   TypeImpl get type => firstFragment.type;
@@ -4611,8 +4613,9 @@
   FieldFormalParameterElementImpl2(super.firstFragment);
 
   @override
-  FieldElement2? get field2 => switch (firstFragment) {
-        FieldFormalParameterElementImpl(:FieldFragment field) => field.element,
+  FieldElementImpl2? get field2 => switch (firstFragment) {
+        FieldFormalParameterElementImpl(:FieldElementImpl field) =>
+          field.element,
         _ => null,
       };
 
@@ -5940,11 +5943,11 @@
   InstanceElementImpl get firstFragment;
 
   @override
-  List<GetterElement> get getters2 {
+  List<GetterElement2OrMember> get getters2 {
     _readMembers();
     return accessors
         .where((e) => e.isGetter)
-        .map((e) => e.asElement2 as GetterElement?)
+        .map((e) => e.asElement2 as GetterElement2OrMember)
         .nonNulls
         .toList();
   }
@@ -6484,7 +6487,7 @@
   }
 
   @override
-  PropertyAccessorElement? getSetter(String setterName) {
+  PropertyAccessorElementOrMember? getSetter(String setterName) {
     return getSetterFromAccessors(setterName, accessors);
   }
 
@@ -6708,8 +6711,8 @@
     }
   }
 
-  static PropertyAccessorElement? getSetterFromAccessors(
-      String setterName, List<PropertyAccessorElement> accessors) {
+  static PropertyAccessorElementOrMember? getSetterFromAccessors(
+      String setterName, List<PropertyAccessorElementOrMember> accessors) {
     // Do we need the check for isSetter below?
     if (!setterName.endsWith('=')) {
       setterName += '=';
@@ -7432,8 +7435,7 @@
   }
 
   @override
-  LibraryFragment get firstFragment =>
-      definingCompilationUnit as LibraryFragment;
+  CompilationUnitElementImpl get firstFragment => definingCompilationUnit;
 
   @override
   List<CompilationUnitElementImpl> get fragments {
@@ -7444,12 +7446,12 @@
   }
 
   @override
-  List<GetterElement> get getters {
-    var declarations = <GetterElement>{};
+  List<GetterElement2OrMember> get getters {
+    var declarations = <GetterElement2OrMember>{};
     for (var unit in units) {
       declarations.addAll(unit._accessors
           .where((accessor) => accessor.isGetter)
-          .map((accessor) => (accessor as GetterFragment).element));
+          .map((accessor) => accessor.element as GetterElement2OrMember));
     }
     return declarations.toList();
   }
@@ -9856,8 +9858,8 @@
   String get identifier => 'part';
 
   @override
-  LibraryFragment? get includedFragment {
-    if (uri case DirectiveUriWithUnit uri) {
+  CompilationUnitElementImpl? get includedFragment {
+    if (uri case DirectiveUriWithUnitImpl uri) {
       return uri.libraryFragment;
     }
     return null;
@@ -9867,7 +9869,7 @@
   ElementKind get kind => ElementKind.PART;
 
   @override
-  LibraryFragment get libraryFragment => enclosingUnit;
+  CompilationUnitElementImpl get libraryFragment => enclosingUnit;
 
   @override
   T? accept<T>(ElementVisitor<T> visitor) => visitor.visitPartElement(this);
@@ -10442,7 +10444,13 @@
 /// Common base class for all analyzer-internal classes that implement
 /// [PropertyInducingElement2].
 abstract class PropertyInducingElement2OrMember
-    implements VariableElement2OrMember, PropertyInducingElement2 {}
+    implements VariableElement2OrMember, PropertyInducingElement2 {
+  @override
+  GetterElement2OrMember? get getter2;
+
+  @override
+  SetterElement2OrMember? get setter2;
+}
 
 /// A concrete implementation of a [PropertyInducingElement].
 abstract class PropertyInducingElementImpl
@@ -10937,7 +10945,7 @@
   }
 
   @override
-  FormalParameterElement? get superConstructorParameter2 {
+  FormalParameterElementMixin? get superConstructorParameter2 {
     return firstFragment.superConstructorParameter?.asElement2;
   }
 
@@ -11098,7 +11106,8 @@
   }
 
   @override
-  GetterElement? get getter2 => firstFragment.getter2?.element;
+  GetterElementImpl? get getter2 =>
+      firstFragment.getter2?.element as GetterElementImpl?;
 
   @override
   bool get hasImplicitType => firstFragment.hasImplicitType;
@@ -11130,7 +11139,8 @@
   String? get name3 => firstFragment.name2;
 
   @override
-  SetterElement? get setter2 => firstFragment.setter2?.element;
+  SetterElementImpl? get setter2 =>
+      firstFragment.setter2?.element as SetterElementImpl?;
 
   @override
   TypeImpl get type => firstFragment.type;
diff --git a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
index d277536..93dd7ee 100644
--- a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
+++ b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
@@ -399,7 +399,7 @@
   void _checkArgumentsNotMatchingBounds({
     required SyntacticEntity? errorEntity,
     required ErrorReporter? errorReporter,
-    required List<DartType> typeArguments,
+    required List<TypeImpl> typeArguments,
   }) {
     for (int i = 0; i < _typeFormals.length; i++) {
       var parameter = _typeFormals[i];
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
index 7a0a97b..01d4535 100644
--- a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
+++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
@@ -83,16 +83,14 @@
   /// not `null`, add a new [Conflict] to it.
   ExecutableElementOrMember? combineSignatures({
     required InterfaceElement targetClass,
-    required List<ExecutableElement> candidates,
+    required List<ExecutableElementOrMember> candidates,
     required bool doTopMerge,
     required Name name,
     List<Conflict>? conflicts,
   }) {
     // If just one candidate, it is always valid.
     if (candidates.length == 1) {
-      // TODO(paulberry): eliminate this cast by changing the type of the
-      // parameter `candidates`.
-      return candidates[0] as ExecutableElementOrMember;
+      return candidates[0];
     }
 
     var targetLibrary = targetClass.library as LibraryElementImpl;
@@ -100,10 +98,7 @@
 
     var validOverrides = <ExecutableElementOrMember>[];
     for (var i = 0; i < candidates.length; i++) {
-      // TODO(paulberry): eliminate this cast by changing the type of the
-      // parameter `candidates`.
-      ExecutableElementOrMember? validOverride =
-          candidates[i] as ExecutableElementOrMember;
+      ExecutableElementOrMember? validOverride = candidates[i];
       var validOverrideType = validOverride.type;
       for (var j = 0; j < candidates.length; j++) {
         var candidate = candidates[j];
@@ -136,7 +131,7 @@
   }
 
   /// Return the result of [getInherited2] with [type] substitution.
-  ExecutableElement? getInherited(InterfaceType type, Name name) {
+  ExecutableElementOrMember? getInherited(InterfaceType type, Name name) {
     var rawElement = getInherited2(type.element, name);
     if (rawElement == null) {
       return null;
@@ -228,7 +223,7 @@
       _findMostSpecificFromNamedCandidates(
         element,
         inheritedMap,
-        element is ExtensionTypeElement
+        element is ExtensionTypeElementImpl
             ? interface.redeclared
             : interface.overridden,
         doTopMerge: false,
@@ -417,7 +412,8 @@
   /// Return all members of mixins, superclasses, and interfaces that a member
   /// with the given [name], defined in the [element], would override; or `null`
   /// if no members would be overridden.
-  List<ExecutableElementOrMember>? getOverridden2(InterfaceElement element, Name name) {
+  List<ExecutableElementOrMember>? getOverridden2(
+      InterfaceElement element, Name name) {
     var interface = getInterface(element);
     return interface.overridden[name];
   }
@@ -535,7 +531,7 @@
   List<Conflict> _findMostSpecificFromNamedCandidates(
     InterfaceElement targetClass,
     Map<Name, ExecutableElement> map,
-    Map<Name, List<ExecutableElement>> namedCandidates, {
+    Map<Name, List<ExecutableElementOrMember>> namedCandidates, {
     required bool doTopMerge,
   }) {
     var conflicts = <Conflict>[];
@@ -623,7 +619,8 @@
       //     }
       // So, each mixin always replaces members in the interface.
       // And there are individual override conflicts for each mixin.
-      var candidatesFromSuperAndMixin = <Name, List<ExecutableElement>>{};
+      var candidatesFromSuperAndMixin =
+          <Name, List<ExecutableElementOrMember>>{};
       var mixinConflicts = <Conflict>[];
       for (var entry in mixinInterface.map.entries) {
         var name = entry.key;
@@ -807,7 +804,7 @@
       }
     }
 
-    var redeclared = <Name, List<ExecutableElement>>{};
+    var redeclared = <Name, List<ExecutableElementOrMember>>{};
     var conflicts = <Conflict>[];
 
     // Add extension type members.
@@ -915,7 +912,7 @@
     }
 
     // Ensure unique overridden elements.
-    var uniqueRedeclared = <Name, List<ExecutableElement>>{};
+    var uniqueRedeclared = <Name, List<ExecutableElementOrMember>>{};
     for (var entry in redeclared.entries) {
       var name = entry.key;
       var elements = entry.value;
@@ -1267,7 +1264,7 @@
 
   /// The map of names to the signatures from superinterfaces that a member
   /// declaration in this extension type redeclares.
-  final Map<Name, List<ExecutableElement>> redeclared;
+  final Map<Name, List<ExecutableElementOrMember>> redeclared;
 
   /// The map of names to the signatures from superinterfaces that a member
   /// declaration in this extension type redeclares.
@@ -1308,7 +1305,7 @@
 
   /// The map of names to their signature in the interface.
   @experimental
-  Map<Name, ExecutableElement2> get map2 {
+  Map<Name, ExecutableElement2OrMember> get map2 {
     return map.mapValue((element) => element.asElement2);
   }
 
@@ -1420,7 +1417,7 @@
 
   _ExtensionTypeCandidates(this.name);
 
-  List<ExecutableElement> get all {
+  List<ExecutableElementOrMember> get all {
     return [...methods, ...getters, ...setters];
   }
 
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 8b3f83f..395605a 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -55,7 +55,7 @@
   String get displayName => declaration.displayName;
 
   @override
-  InterfaceElement2 get enclosingElement2 => _element2.enclosingElement2;
+  InterfaceElementImpl2 get enclosingElement2 => _element2.enclosingElement2;
 
   @override
   InterfaceElement get enclosingElement3 => declaration.enclosingElement3;
@@ -507,7 +507,7 @@
   ) : super._();
 
   @override
-  FieldElement? get field {
+  FieldElementOrMember? get field {
     var field = (declaration as FieldFormalParameterElement).field;
     if (field == null) {
       return null;
@@ -597,7 +597,7 @@
   }
 
   @override
-  GetterElement? get getter2 {
+  GetterElement2OrMember? get getter2 {
     var baseGetter = declaration.getter;
     if (baseGetter == null) {
       return null;
@@ -656,7 +656,7 @@
   }
 
   @override
-  SetterElement? get setter2 {
+  SetterElement2OrMember? get setter2 {
     var baseSetter = declaration.setter;
     if (baseSetter == null) {
       return null;
@@ -709,7 +709,8 @@
   /// from the [definingType], create a field member representing the given
   /// field. Return the member that was created, or the base field if no member
   /// was created.
-  static FieldElement from(FieldElement field, InterfaceType definingType) {
+  static FieldElementOrMember from(
+      FieldElementOrMember field, InterfaceType definingType) {
     if (definingType.typeArguments.isEmpty) {
       return field;
     }
@@ -1511,8 +1512,8 @@
   /// arguments from the [definingType], create an accessor member representing
   /// the given accessor. Return the member that was created, or the base
   /// accessor if no member was created.
-  static PropertyAccessorElement? from(
-      PropertyAccessorElement? accessor, InterfaceType definingType) {
+  static PropertyAccessorElementOrMember? from(
+      PropertyAccessorElementOrMember? accessor, InterfaceType definingType) {
     if (accessor == null || definingType.typeArguments.isEmpty) {
       return accessor;
     }
diff --git a/pkg/analyzer/lib/src/dart/element/subtype.dart b/pkg/analyzer/lib/src/dart/element/subtype.dart
index ff61e6b..388702f 100644
--- a/pkg/analyzer/lib/src/dart/element/subtype.dart
+++ b/pkg/analyzer/lib/src/dart/element/subtype.dart
@@ -6,7 +6,6 @@
     show Variance;
 import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
-import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
@@ -31,28 +30,25 @@
         _objectNone = _typeSystem.objectNone,
         _objectQuestion = _typeSystem.objectQuestion;
 
-  /// Return `true` if [T0_] is a subtype of [T1_].
-  bool isSubtypeOf(DartType T0_, DartType T1_) {
+  /// Return `true` if [T0] is a subtype of [T1].
+  bool isSubtypeOf(TypeImpl T0, TypeImpl T1) {
     // Reflexivity: if `T0` and `T1` are the same type then `T0 <: T1`.
-    if (identical(T0_, T1_)) {
+    if (identical(T0, T1)) {
       return true;
     }
 
     // `_` is treated as a top and a bottom type during inference.
-    if (identical(T0_, UnknownInferredType.instance) ||
-        identical(T1_, UnknownInferredType.instance)) {
+    if (identical(T0, UnknownInferredType.instance) ||
+        identical(T1, UnknownInferredType.instance)) {
       return true;
     }
 
     // `InvalidType` is treated as a top and a bottom type.
-    if (identical(T0_, InvalidTypeImpl.instance) ||
-        identical(T1_, InvalidTypeImpl.instance)) {
+    if (identical(T0, InvalidTypeImpl.instance) ||
+        identical(T1, InvalidTypeImpl.instance)) {
       return true;
     }
 
-    var T0 = T0_ as TypeImpl;
-    var T1 = T1_ as TypeImpl;
-
     var T1_nullability = T1.nullabilitySuffix;
     var T0_nullability = T0.nullabilitySuffix;
 
@@ -115,7 +111,7 @@
       // Extension types require explicit `Object` implementation.
       if (T0 is InterfaceTypeImpl && T0.element3 is ExtensionTypeElement2) {
         for (var interface in T0.interfaces) {
-          if (isSubtypeOf(interface, T1_)) {
+          if (isSubtypeOf(interface, T1)) {
             return true;
           }
         }
@@ -303,19 +299,19 @@
   }
 
   bool _interfaceArguments(
-    InterfaceElement2 element,
-    InterfaceType subType,
-    InterfaceType superType,
+    InterfaceElementImpl2 element,
+    InterfaceTypeImpl subType,
+    InterfaceTypeImpl superType,
   ) {
-    List<TypeParameterElement2> parameters = element.typeParameters2;
-    List<DartType> subArguments = subType.typeArguments;
-    List<DartType> superArguments = superType.typeArguments;
+    var parameters = element.typeParameters2;
+    var subArguments = subType.typeArguments;
+    var superArguments = superType.typeArguments;
 
     assert(subArguments.length == superArguments.length);
     assert(parameters.length == subArguments.length);
 
-    for (int i = 0; i < subArguments.length; i++) {
-      var parameter = parameters[i] as TypeParameterElementImpl2;
+    for (var i = 0; i < subArguments.length; i++) {
+      var parameter = parameters[i];
       var subArgument = subArguments[i];
       var superArgument = superArguments[i];
 
@@ -344,7 +340,7 @@
   }
 
   /// Check that [f] is a subtype of [g].
-  bool _isFunctionSubtypeOf(FunctionTypeImpl f, FunctionType g) {
+  bool _isFunctionSubtypeOf(FunctionTypeImpl f, FunctionTypeImpl g) {
     var fresh =
         _typeSystem.relateTypeParameters2(f.typeParameters, g.typeParameters);
     if (fresh == null) {
@@ -440,7 +436,10 @@
     return true;
   }
 
-  bool _isInterfaceSubtypeOf(InterfaceType subType, InterfaceType superType) {
+  bool _isInterfaceSubtypeOf(
+    InterfaceTypeImpl subType,
+    InterfaceTypeImpl superType,
+  ) {
     // Note: we should never reach `_isInterfaceSubtypeOf` with `i2 == Object`,
     // because top types are eliminated before `isSubtypeOf` calls this.
     // TODO(scheglov): Replace with assert().
@@ -468,7 +467,7 @@
       if (identical(interface.element3, superElement)) {
         var substitution = Substitution.fromInterfaceType(subType);
         var substitutedInterface =
-            substitution.substituteType(interface) as InterfaceType;
+            substitution.substituteType(interface) as InterfaceTypeImpl;
         return _interfaceArguments(
           superElement,
           substitutedInterface,
@@ -481,7 +480,7 @@
   }
 
   /// Check that [subType] is a subtype of [superType].
-  bool _isRecordSubtypeOf(RecordType subType, RecordType superType) {
+  bool _isRecordSubtypeOf(RecordTypeImpl subType, RecordTypeImpl superType) {
     var subPositional = subType.positionalFields;
     var superPositional = superType.positionalFields;
     if (subPositional.length != superPositional.length) {
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index a531e33..881069a 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -217,11 +217,11 @@
       };
 
   @override
-  List<DartType> get normalParameterTypes =>
+  List<TypeImpl> get normalParameterTypes =>
       positionalParameterTypes.sublist(0, requiredPositionalParameterCount);
 
   @override
-  List<DartType> get optionalParameterTypes =>
+  List<TypeImpl> get optionalParameterTypes =>
       positionalParameterTypes.sublist(requiredPositionalParameterCount);
 
   @override
@@ -645,7 +645,7 @@
   @override
   List<PropertyAccessorElement> get accessors {
     if (_accessors == null) {
-      List<PropertyAccessorElement> accessors = element.accessors;
+      var accessors = element.accessors;
       var members = <PropertyAccessorElement>[];
       for (int i = 0; i < accessors.length; i++) {
         members.add(PropertyAccessorMember.from(accessors[i], this)!);
@@ -937,7 +937,7 @@
   }
 
   @override
-  PropertyAccessorElement? getGetter(String getterName) =>
+  PropertyAccessorElementOrMember? getGetter(String getterName) =>
       PropertyAccessorMember.from(element.getGetter(getterName), this);
 
   @override
@@ -999,7 +999,7 @@
         }
       } else {
         var result = inheritance.getInherited(this, nameObj);
-        if (result is PropertyAccessorElement) {
+        if (result is PropertyAccessorElementOrMember) {
           return result;
         }
       }
@@ -1036,7 +1036,7 @@
   }
 
   @override
-  MethodElement? lookUpMethod2(
+  MethodElementOrMember? lookUpMethod2(
     String name,
     LibraryElement library, {
     bool concrete = false,
@@ -1054,7 +1054,7 @@
         }
       } else {
         var result = inheritance.getInherited(this, nameObj);
-        if (result is MethodElement) {
+        if (result is MethodElementOrMember) {
           return result;
         }
       }
@@ -1074,7 +1074,7 @@
   }
 
   @override
-  MethodElement2? lookUpMethod3(
+  MethodElement2OrMember? lookUpMethod3(
     String name,
     LibraryElement2 library, {
     bool concrete = false,
@@ -1109,7 +1109,7 @@
         }
       } else {
         var result = inheritance.getInherited(this, nameObj);
-        if (result is PropertyAccessorElement) {
+        if (result is PropertyAccessorElementOrMember) {
           return result;
         }
       }
diff --git a/pkg/analyzer/lib/src/dart/element/type_system.dart b/pkg/analyzer/lib/src/dart/element/type_system.dart
index ab9201b..a3784d7 100644
--- a/pkg/analyzer/lib/src/dart/element/type_system.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_system.dart
@@ -520,8 +520,8 @@
   ///
   /// This does not find extension methods (which are not defined on an
   /// interface type); it is meant to find implicit call references.
-  FunctionType? getCallMethodType(DartType t) {
-    if (t is InterfaceType) {
+  FunctionTypeImpl? getCallMethodType(DartType t) {
+    if (t is InterfaceTypeImpl) {
       return t
           .lookUpMethod3(MethodElement2.CALL_METHOD_NAME, t.element3.library2)
           ?.type;
@@ -859,8 +859,11 @@
   }
 
   @override
-  bool isAssignableTo(DartType fromType, DartType toType,
-      {bool strictCasts = false}) {
+  bool isAssignableTo(
+    covariant TypeImpl fromType,
+    covariant TypeImpl toType, {
+    bool strictCasts = false,
+  }) {
     // An actual subtype
     if (isSubtypeOf(fromType, toType)) {
       return true;
@@ -872,7 +875,7 @@
     }
 
     // A 'call' method tearoff.
-    if (fromType is InterfaceType &&
+    if (fromType is InterfaceTypeImpl &&
         !isNullable(fromType) &&
         acceptsFunctionType(toType)) {
       var callMethodType = getCallMethodType(fromType);
@@ -920,7 +923,7 @@
   /// Implements:
   /// https://github.com/dart-lang/language
   /// See `resources/type-system/subtyping.md#type-equality`
-  bool isEqualTo(DartType left, DartType right) {
+  bool isEqualTo(TypeImpl left, TypeImpl right) {
     return isSubtypeOf(left, right) && isSubtypeOf(right, left);
   }
 
@@ -1281,7 +1284,10 @@
   /// https://github.com/dart-lang/language
   /// See `resources/type-system/subtyping.md`
   @override
-  bool isSubtypeOf(DartType leftType, DartType rightType) {
+  bool isSubtypeOf(
+    covariant TypeImpl leftType,
+    covariant TypeImpl rightType,
+  ) {
     return _subtypeHelper.isSubtypeOf(leftType, rightType);
   }
 
@@ -1498,9 +1504,9 @@
   /// left operand has the type [leftType] and whose right operand has the type
   /// [rightType], given that resolution has so far produced the [currentType].
   TypeImpl refineBinaryExpressionType(
-      DartType leftType,
+      TypeImpl leftType,
       TokenType operator,
-      DartType rightType,
+      TypeImpl rightType,
       TypeImpl currentType,
       MethodElement2? operatorElement) {
     if (operatorElement == null) return currentType;
@@ -1514,9 +1520,9 @@
   /// [invocationContext], and the context type produced so far by resolution is
   /// [currentType].
   TypeImpl refineNumericInvocationContext2(
-      DartType? targetType,
+      TypeImpl? targetType,
       Element2? methodElement,
-      DartType invocationContext,
+      TypeImpl invocationContext,
       TypeImpl currentType) {
     if (targetType != null && methodElement is MethodElement2) {
       return _refineNumericInvocationContextNullSafe(
@@ -1534,9 +1540,9 @@
   ///
   // TODO(scheglov): I expected that [methodElement] is [MethodElement].
   TypeImpl refineNumericInvocationType(
-      DartType targetType,
+      TypeImpl targetType,
       Element2? methodElement,
-      List<DartType> argumentTypes,
+      List<TypeImpl> argumentTypes,
       TypeImpl currentType) {
     if (methodElement is MethodElement2) {
       return _refineNumericInvocationTypeNullSafe(
@@ -1554,7 +1560,7 @@
   /// be used to instantiate both function types, allowing further comparison.
   RelatedTypeParameters2? relateTypeParameters2(
     List<TypeParameterElementImpl2> typeParameters1,
-    List<TypeParameterElement2> typeParameters2,
+    List<TypeParameterElementImpl2> typeParameters2,
   ) {
     if (typeParameters1.length != typeParameters2.length) {
       return null;
@@ -1824,9 +1830,9 @@
   }
 
   TypeImpl _refineNumericInvocationContextNullSafe(
-      DartType targetType,
+      TypeImpl targetType,
       MethodElement2 methodElement,
-      DartType invocationContext,
+      TypeImpl invocationContext,
       TypeImpl currentType) {
     // If the method being invoked comes from an extension, don't refine the
     // type because we can only make guarantees about methods defined in the
@@ -1926,9 +1932,9 @@
   }
 
   TypeImpl _refineNumericInvocationTypeNullSafe(
-      DartType targetType,
+      TypeImpl targetType,
       MethodElement2 methodElement,
-      List<DartType> argumentTypes,
+      List<TypeImpl> argumentTypes,
       TypeImpl currentType) {
     // If the method being invoked comes from an extension, don't refine the
     // type because we can only make guarantees about methods defined in the
diff --git a/pkg/analyzer/lib/src/dart/element/well_bounded.dart b/pkg/analyzer/lib/src/dart/element/well_bounded.dart
index 5acc140..6324e93 100644
--- a/pkg/analyzer/lib/src/dart/element/well_bounded.dart
+++ b/pkg/analyzer/lib/src/dart/element/well_bounded.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
@@ -73,18 +74,18 @@
     return _isSuperBounded(type);
   }
 
-  TypeBoundedResult _isRegularBounded(DartType type) {
+  TypeBoundedResult _isRegularBounded(TypeImpl type) {
     List<TypeArgumentIssue>? issues;
 
     String? elementName;
-    List<TypeParameterElement2> typeParameters;
-    List<DartType> typeArguments;
+    List<TypeParameterElementImpl2> typeParameters;
+    List<TypeImpl> typeArguments;
     var alias = type.alias;
     if (alias != null) {
       elementName = alias.element2.name3;
       typeParameters = alias.element2.typeParameters2;
       typeArguments = alias.typeArguments;
-    } else if (type is InterfaceType) {
+    } else if (type is InterfaceTypeImpl) {
       elementName = type.element3.name3;
       typeParameters = type.element3.typeParameters2;
       typeArguments = type.typeArguments;
diff --git a/pkg/analyzer/lib/src/dart/resolver/applicable_extensions.dart b/pkg/analyzer/lib/src/dart/resolver/applicable_extensions.dart
index 7fef4bf..ae364e2 100644
--- a/pkg/analyzer/lib/src/dart/resolver/applicable_extensions.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/applicable_extensions.dart
@@ -18,7 +18,7 @@
 class InstantiatedExtensionWithMember {
   final _NotInstantiatedExtensionWithMember candidate;
   final MapSubstitution substitution;
-  final DartType extendedType;
+  final TypeImpl extendedType;
 
   InstantiatedExtensionWithMember(
     this.candidate,
@@ -71,7 +71,7 @@
 
   R instantiate({
     required MapSubstitution substitution,
-    required DartType extendedType,
+    required TypeImpl extendedType,
   });
 }
 
@@ -87,7 +87,7 @@
   @override
   InstantiatedExtensionWithMember instantiate({
     required MapSubstitution substitution,
-    required DartType extendedType,
+    required TypeImpl extendedType,
   }) {
     return InstantiatedExtensionWithMember(this, substitution, extendedType);
   }
diff --git a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
index 513792d..a656434 100644
--- a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
@@ -116,9 +116,9 @@
   }
 
   void _checkForInvalidAssignment(
-    DartType writeType,
+    TypeImpl writeType,
     Expression right,
-    DartType rightType, {
+    TypeImpl rightType, {
     required Map<SharedTypeView, NonPromotionReason> Function()? whyNotPromoted,
   }) {
     if (writeType is! VoidType && _checkForUseOfVoidResult(right)) {
@@ -131,10 +131,10 @@
       return;
     }
 
-    if (writeType is RecordType &&
+    if (writeType is RecordTypeImpl &&
         writeType.positionalFields.length == 1 &&
         rightType is! RecordType &&
-        right is ParenthesizedExpression) {
+        right is ParenthesizedExpressionImpl) {
       var field = writeType.positionalFields.first;
       if (_typeSystem.isAssignableTo(field.type, rightType,
           strictCasts: strictCasts)) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
index 25aa44a..e88b9f0 100644
--- a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
@@ -280,7 +280,7 @@
 
   void _resolveRightOperand(
     BinaryExpressionImpl node,
-    DartType contextType,
+    TypeImpl contextType,
   ) {
     var left = node.leftOperand;
 
@@ -317,7 +317,7 @@
   }
 
   void _resolveUserDefinable(BinaryExpressionImpl node,
-      {required DartType contextType}) {
+      {required TypeImpl contextType}) {
     var left = node.leftOperand;
 
     if (left is AugmentedExpressionImpl) {
@@ -354,7 +354,7 @@
   void _resolveUserDefinableAugmented(
     BinaryExpressionImpl node, {
     required AugmentedExpressionImpl left,
-    required DartType contextType,
+    required TypeImpl contextType,
   }) {
     var methodName = node.operator.lexeme;
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart b/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart
index fa2bcf0..a1c78f6 100644
--- a/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart
@@ -17,7 +17,7 @@
 
   /// The imposed return type, from the typing context.
   /// Might be `null` if an empty typing context.
-  final DartType? imposedType;
+  final TypeImpl? imposedType;
 
   /// The context type, computed from [imposedType].
   /// Might be `null` if an empty typing context.
diff --git a/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart
index 8742ef4..8a00bab 100644
--- a/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart
@@ -5,6 +5,7 @@
 import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
@@ -31,7 +32,8 @@
     var element = node.constructorName.element;
     if (element != null && !element.isFactory) {
       var enclosingElement = element.enclosingElement2;
-      if (enclosingElement is ClassElement2 && enclosingElement.isAbstract) {
+      if (enclosingElement is ClassElementImpl2 &&
+          enclosingElement.isAbstract) {
         _resolver.errorReporter.atNode(
           node,
           CompileTimeErrorCode
diff --git a/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
index eca3161..d9112eb 100644
--- a/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
@@ -260,7 +260,7 @@
   void _checkTypeArgumentsMatchingBounds(
     List<TypeParameterElementImpl2> typeParameters,
     TypeArgumentList? typeArgumentList,
-    List<DartType> typeArgumentTypes,
+    List<TypeImpl> typeArgumentTypes,
     Substitution substitution,
   ) {
     if (typeArgumentList != null) {
@@ -333,7 +333,7 @@
   /// If the number of explicit type arguments is different than the number
   /// of extension's type parameters, or inference fails, returns `dynamic`
   /// for all type parameters.
-  List<DartType>? _inferTypeArguments(
+  List<TypeImpl>? _inferTypeArguments(
       ExtensionOverrideImpl node, TypeImpl receiverType,
       {required TypeConstraintGenerationDataForTesting? dataForTesting,
       required AstNodeImpl? nodeForTesting}) {
@@ -345,7 +345,7 @@
       var arguments = typeArguments.arguments;
       if (arguments.length == typeParameters.length) {
         if (typeParameters.isEmpty) {
-          return const <DartType>[];
+          return const <TypeImpl>[];
         }
         return arguments.map((a) => a.typeOrThrow).toList();
       } else {
@@ -385,7 +385,7 @@
 
   /// Instantiate the extended type of the [extension] to the bounds of the
   /// type formals of the extension.
-  DartType _instantiateToBounds(ExtensionElement2 extension) {
+  TypeImpl _instantiateToBounds(ExtensionElement2 extension) {
     extension as ExtensionElementImpl2;
     var typeParameters = extension.typeParameters2;
     return Substitution.fromPairs2(
@@ -436,11 +436,11 @@
   }
 
   /// Ask the type system for a subtype check.
-  bool _isSubtypeOf(DartType type1, DartType type2) =>
+  bool _isSubtypeOf(TypeImpl type1, TypeImpl type2) =>
       _typeSystem.isSubtypeOf(type1, type2);
 
-  List<DartType> _listOfDynamic(List<Object?> parameters) {
-    return List<DartType>.filled(parameters.length, DynamicTypeImpl.instance);
+  List<TypeImpl> _listOfDynamic(List<Object?> parameters) {
+    return List<TypeImpl>.filled(parameters.length, DynamicTypeImpl.instance);
   }
 
   static bool _isCascadeTarget(ExtensionOverride node) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
index 841e859..03ff427 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
@@ -193,7 +193,7 @@
     _resolve(node, rawType, whyNotPromotedArguments, contextType: contextType);
   }
 
-  void _unresolved(FunctionExpressionInvocationImpl node, DartType type,
+  void _unresolved(FunctionExpressionInvocationImpl node, TypeImpl type,
       List<WhyNotPromotedGetter> whyNotPromotedArguments,
       {required TypeImpl contextType}) {
     _setExplicitTypeArgumentTypes(node);
@@ -218,7 +218,7 @@
           .map((typeArgument) => typeArgument.typeOrThrow)
           .toList();
     } else {
-      node.typeArgumentTypes = const <DartType>[];
+      node.typeArgumentTypes = const <TypeImpl>[];
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart b/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart
index abee317..44592796 100644
--- a/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart
@@ -159,7 +159,7 @@
     var typeArgumentList = _typeArguments;
     var originalType = rawType;
 
-    List<DartType>? typeArgumentTypes;
+    List<TypeImpl>? typeArgumentTypes;
     GenericInferrer? inferrer;
     Substitution? substitution;
     if (_isGenericInferenceDisabled) {
@@ -171,7 +171,7 @@
         substitution =
             Substitution.fromPairs(rawType.typeFormals, typeArgumentTypes);
       } else {
-        typeArgumentTypes = const <DartType>[];
+        typeArgumentTypes = const <TypeImpl>[];
       }
     } else if (typeArgumentList != null) {
       if (rawType != null &&
@@ -216,7 +216,7 @@
             Substitution.fromPairs(rawType.typeFormals, typeArgumentTypes);
       }
     } else if (rawType == null || rawType.typeFormals.isEmpty) {
-      typeArgumentTypes = const <DartType>[];
+      typeArgumentTypes = const <TypeImpl>[];
     } else {
       var typeParameters = [for (var tp in rawType.typeFormals) tp.element];
       rawType =
@@ -331,7 +331,7 @@
   }
 
   List<FormalParameterElement>? _storeResult(
-      List<DartType>? typeArgumentTypes, FunctionTypeImpl? invokeType) {
+      List<TypeImpl>? typeArgumentTypes, FunctionTypeImpl? invokeType) {
     return invokeType?.formalParameters;
   }
 }
@@ -424,7 +424,7 @@
 
   @override
   List<FormalParameterElement>? _storeResult(
-      List<DartType>? typeArgumentTypes, FunctionTypeImpl? invokeType) {
+      List<TypeImpl>? typeArgumentTypes, FunctionTypeImpl? invokeType) {
     node.typeArgumentTypes = typeArgumentTypes;
     node.staticInvokeType = invokeType ?? DynamicTypeImpl.instance;
     return super._storeResult(typeArgumentTypes, invokeType);
diff --git a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
index 6c6f492..693df05 100644
--- a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
@@ -77,7 +77,7 @@
   ///
   // TODO(scheglov): this is duplicate
   void _checkForInvalidAssignmentIncDec(
-      PostfixExpression node, Expression operand, DartType type) {
+      PostfixExpressionImpl node, Expression operand, TypeImpl type) {
     var operandWriteType = node.writeType!;
     if (!_typeSystem.isAssignableTo(type, operandWriteType,
         strictCasts: _resolver.analysisOptions.strictCasts)) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
index 5d6be72..937cc3c 100644
--- a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
@@ -99,7 +99,7 @@
   ///
   // TODO(scheglov): this is duplicate
   void _checkForInvalidAssignmentIncDec(
-      PrefixExpressionImpl node, DartType type) {
+      PrefixExpressionImpl node, TypeImpl type) {
     var operandWriteType = node.writeType!;
     if (!_typeSystem.isAssignableTo(type, operandWriteType,
         strictCasts: _resolver.analysisOptions.strictCasts)) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 0c2bccf..fa1bfb4 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -13,7 +13,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/scope.dart';
-import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
@@ -1825,7 +1824,7 @@
   void _verifyExtensionElementImplements(
     ExtensionTypeElementImpl declaredElement,
     NamedTypeImpl node,
-    DartType type,
+    TypeImpl type,
   ) {
     var typeSystem = _libraryElement.typeSystem;
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
index 6e29942..16a1fc7 100644
--- a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:_fe_analyzer_shared/src/types/shared_type.dart';
-import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
@@ -78,7 +77,7 @@
     var expression = node.expression;
     var expressionType = expression.typeOrThrow;
 
-    DartType impliedReturnType;
+    TypeImpl impliedReturnType;
     if (isYieldEach) {
       impliedReturnType = expressionType;
     } else if (bodyContext.isSynchronous) {
@@ -124,7 +123,7 @@
       // Since the declared return type might have been "dynamic", we need to
       // also check that the implied return type is assignable to generic
       // Iterable/Stream.
-      DartType requiredReturnType;
+      TypeImpl requiredReturnType;
       if (bodyContext.isSynchronous) {
         requiredReturnType = _typeProvider.iterableDynamicType;
       } else {
diff --git a/pkg/analyzer/lib/src/error/bool_expression_verifier.dart b/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
index 7d26f0f..4052ed8 100644
--- a/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
+++ b/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
@@ -5,7 +5,6 @@
 import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart';
 import 'package:_fe_analyzer_shared/src/types/shared_type.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
@@ -20,7 +19,7 @@
   final ErrorReporter _errorReporter;
   final NullableDereferenceVerifier _nullableDereferenceVerifier;
 
-  final InterfaceType _boolType;
+  final InterfaceTypeImpl _boolType;
 
   BoolExpressionVerifier({
     required ResolverVisitor resolver,
diff --git a/pkg/analyzer/lib/src/error/correct_override.dart b/pkg/analyzer/lib/src/error/correct_override.dart
index fd76e89..c366c9b 100644
--- a/pkg/analyzer/lib/src/error/correct_override.dart
+++ b/pkg/analyzer/lib/src/error/correct_override.dart
@@ -21,7 +21,7 @@
   final TypeSystemImpl _typeSystem;
 
   final ExecutableElement2OrMember _thisMember;
-  FunctionType? _thisTypeForSubtype;
+  FunctionTypeImpl? _thisTypeForSubtype;
 
   final DiagnosticFactory _diagnosticFactory = DiagnosticFactory();
 
@@ -35,7 +35,7 @@
 
   /// Return `true` if [_thisMember] is a correct override of [superMember].
   bool isCorrectOverrideOf({
-    required ExecutableElement2 superMember,
+    required ExecutableElement2OrMember superMember,
   }) {
     var superType = superMember.type;
     return _typeSystem.isSubtypeOf(_thisTypeForSubtype!, superType);
@@ -44,7 +44,7 @@
   /// If [_thisMember] is not a correct override of [superMember], report the
   /// error.
   void verify({
-    required ExecutableElement2 superMember,
+    required ExecutableElement2OrMember superMember,
     required ErrorReporter errorReporter,
     required SyntacticEntity errorNode,
     required ErrorCode errorCode,
@@ -100,10 +100,10 @@
   final AnalysisSessionImpl _session;
   final TypeSystemImpl _typeSystem;
 
-  final ExecutableElement2 _thisMember;
+  final ExecutableElement2OrMember _thisMember;
 
   CovariantParametersVerifier({
-    required ExecutableElement2 thisMember,
+    required ExecutableElement2OrMember thisMember,
   })  : _session = thisMember.library2.session as AnalysisSessionImpl,
         _typeSystem = thisMember.library2.typeSystem as TypeSystemImpl,
         _thisMember = thisMember;
@@ -159,8 +159,8 @@
     return superMembers;
   }
 
-  Map<FormalParameterElement, List<_SuperParameter>> _superParameters() {
-    var result = <FormalParameterElement, List<_SuperParameter>>{};
+  Map<FormalParameterElementMixin, List<_SuperParameter>> _superParameters() {
+    var result = <FormalParameterElementMixin, List<_SuperParameter>>{};
 
     List<_SuperMember>? superMembers;
     var parameters = _thisMember.formalParameters;
@@ -267,7 +267,7 @@
 
 class _SuperParameter {
   final FormalParameterElement element;
-  final DartType type;
+  final TypeImpl type;
 
   _SuperParameter(this.element, this.type);
 
diff --git a/pkg/analyzer/lib/src/error/dead_code_verifier.dart b/pkg/analyzer/lib/src/error/dead_code_verifier.dart
index c87361a..f976e01 100644
--- a/pkg/analyzer/lib/src/error/dead_code_verifier.dart
+++ b/pkg/analyzer/lib/src/error/dead_code_verifier.dart
@@ -6,12 +6,12 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element2.dart';
-import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
@@ -378,7 +378,7 @@
     }
   }
 
-  void verifyCatchClause(CatchClause node) {
+  void verifyCatchClause(CatchClauseImpl node) {
     var verifier = _catchClausesVerifiers.last;
     if (verifier._done) return;
 
@@ -506,7 +506,7 @@
   final List<CatchClause> catchClauses;
 
   bool _done = false;
-  final List<DartType> _visitedTypes = <DartType>[];
+  final List<TypeImpl> _visitedTypes = [];
 
   _CatchClausesVerifier(
     this._typeSystem,
@@ -514,7 +514,7 @@
     this.catchClauses,
   );
 
-  void nextCatchClause(CatchClause catchClause) {
+  void nextCatchClause(CatchClauseImpl catchClause) {
     var currentType = catchClause.exceptionType?.type;
 
     // Found catch clause that doesn't have an exception type.
diff --git a/pkg/analyzer/lib/src/error/error_handler_verifier.dart b/pkg/analyzer/lib/src/error/error_handler_verifier.dart
index d9b3cb3..f138efb 100644
--- a/pkg/analyzer/lib/src/error/error_handler_verifier.dart
+++ b/pkg/analyzer/lib/src/error/error_handler_verifier.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/error/codes.dart';
@@ -94,7 +95,7 @@
       if (callbackType == null) {
         return;
       }
-      if (callbackType is FunctionType) {
+      if (callbackType is FunctionTypeImpl) {
         // TODO(srawlins): Also check return type of the 'onError' named
         // argument to [Future<T>.then].
         _checkErrorHandlerFunctionType(
@@ -117,7 +118,7 @@
       if (callbackType == null) {
         return;
       }
-      if (callbackType is FunctionType) {
+      if (callbackType is FunctionTypeImpl) {
         _checkErrorHandlerFunctionType(
             callback, callbackType, _typeProvider.voidType,
             checkFirstParameterType: callback is FunctionExpression);
@@ -139,7 +140,7 @@
       if (callbackType == null) {
         return;
       }
-      if (callbackType is FunctionType) {
+      if (callbackType is FunctionTypeImpl) {
         _checkErrorHandlerFunctionType(
             callback, callbackType, _typeProvider.voidType,
             checkFirstParameterType: callback.expression is FunctionExpression);
@@ -160,7 +161,7 @@
       if (callbackType == null) {
         return;
       }
-      if (callbackType is FunctionType) {
+      if (callbackType is FunctionTypeImpl) {
         _checkErrorHandlerFunctionType(
             callback, callbackType, _typeProvider.voidType,
             checkFirstParameterType: callback is FunctionExpression);
@@ -178,7 +179,7 @@
   /// Certain error handlers are allowed to specify a different type for their
   /// first parameter.
   void _checkErrorHandlerFunctionType(Expression expression,
-      FunctionType expressionType, DartType expectedFunctionReturnType,
+      FunctionTypeImpl expressionType, DartType expectedFunctionReturnType,
       {bool checkFirstParameterType = true}) {
     void report() {
       _errorReporter.atNode(
@@ -223,7 +224,7 @@
     var expectedReturnType = _typeProvider.futureOrType(targetFutureType);
     if (callback is FunctionExpressionImpl) {
       // TODO(migration): should be FunctionType, not nullable
-      var callbackType = callback.staticType as FunctionType;
+      var callbackType = callback.staticType as FunctionTypeImpl;
       _checkErrorHandlerFunctionType(
           callback, callbackType, expectedReturnType);
       var catchErrorOnErrorExecutable = EnclosingExecutableContext(
@@ -237,7 +238,7 @@
       callback.body.accept(returnStatementVerifier);
     } else {
       var callbackType = callback.staticType;
-      if (callbackType is FunctionType) {
+      if (callbackType is FunctionTypeImpl) {
         _checkReturnType(expectedReturnType, callbackType.returnType, callback);
         _checkErrorHandlerFunctionType(
             callback, callbackType, expectedReturnType);
@@ -249,7 +250,7 @@
   }
 
   void _checkReturnType(
-      DartType expectedType, DartType functionReturnType, Expression callback) {
+      TypeImpl expectedType, TypeImpl functionReturnType, Expression callback) {
     if (!_typeSystem.isAssignableTo(functionReturnType, expectedType,
         strictCasts: _strictCasts)) {
       _errorReporter.atNode(
diff --git a/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart b/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart
index 79fff63..398e21e 100644
--- a/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart
+++ b/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart
@@ -3,9 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/element/element2.dart';
-import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/error/codes.dart';
 
@@ -22,18 +23,19 @@
   })  : _typeSystem = typeSystem,
         _errorReporter = errorReporter;
 
-  void checkExtension(ExtensionElement2 element) {
+  void checkExtension(ExtensionElementImpl2 element) {
     for (var getter in element.getters2) {
       _checkLocalGetter(getter);
     }
   }
 
-  void checkExtensionType(ExtensionTypeElement2 element, Interface interface) {
+  void checkExtensionType(
+      ExtensionTypeElementImpl2 element, Interface interface) {
     checkInterface(element, interface);
     checkStaticGetters(element.getters2);
   }
 
-  void checkInterface(InterfaceElement2 element, Interface interface) {
+  void checkInterface(InterfaceElementImpl2 element, Interface interface) {
     var libraryUri = element.library2.uri;
 
     var interfaceMap = interface.map2;
@@ -50,7 +52,7 @@
           if (!_typeSystem.isSubtypeOf(getterType, setterType)) {
             Element2 errorElement;
             if (getter.enclosingElement2 == element) {
-              if (element is ExtensionTypeElement2 &&
+              if (element is ExtensionTypeElementImpl2 &&
                   element.representation2.getter2 == getter) {
                 errorElement = setter;
               } else {
@@ -85,7 +87,7 @@
     }
   }
 
-  void checkStaticGetters(List<GetterElement> getters) {
+  void checkStaticGetters(List<GetterElement2OrMember> getters) {
     for (var getter in getters) {
       if (getter.isStatic) {
         _checkLocalGetter(getter);
@@ -93,7 +95,7 @@
     }
   }
 
-  void _checkLocalGetter(GetterElement getter) {
+  void _checkLocalGetter(GetterElement2OrMember getter) {
     var name = getter.name3;
     if (name == null) {
       return;
@@ -120,12 +122,12 @@
   }
 
   /// Return the return type of the [getter].
-  static DartType _getGetterType(GetterElement getter) {
+  static TypeImpl _getGetterType(GetterElement2OrMember getter) {
     return getter.returnType;
   }
 
   /// Return the type of the first parameter of the [setter].
-  static DartType? _getSetterType(SetterElement setter) {
+  static TypeImpl? _getSetterType(SetterElement2OrMember setter) {
     var parameters = setter.formalParameters;
     if (parameters.isNotEmpty) {
       return parameters[0].type;
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index c151e6f..8f72ae4 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -297,7 +297,7 @@
     GetterSetterTypesVerifier(
       typeSystem: typeSystem,
       errorReporter: reporter,
-    ).checkInterface(fragment.asElement2, interface);
+    ).checkInterface((fragment as InterfaceElementImpl).asElement2, interface);
 
     if (declaration is ClassElement && !declaration.isAbstract ||
         declaration is EnumElement) {
diff --git a/pkg/analyzer/lib/src/error/literal_element_verifier.dart b/pkg/analyzer/lib/src/error/literal_element_verifier.dart
index 59aeddb..b96037a 100644
--- a/pkg/analyzer/lib/src/error/literal_element_verifier.dart
+++ b/pkg/analyzer/lib/src/error/literal_element_verifier.dart
@@ -51,7 +51,7 @@
 
   /// Check that the given [type] is assignable to the [elementType], otherwise
   /// report the list or set error on the [errorNode].
-  void _checkAssignableToElementType(DartType type, AstNode errorNode) {
+  void _checkAssignableToElementType(TypeImpl type, AstNode errorNode) {
     var elementType = this.elementType;
 
     if (!typeSystem.isAssignableTo(type, elementType!,
diff --git a/pkg/analyzer/lib/src/error/return_type_verifier.dart b/pkg/analyzer/lib/src/error/return_type_verifier.dart
index aae43ae..1a06e47 100644
--- a/pkg/analyzer/lib/src/error/return_type_verifier.dart
+++ b/pkg/analyzer/lib/src/error/return_type_verifier.dart
@@ -3,12 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
@@ -82,7 +82,7 @@
       return;
     }
 
-    void checkElement(ClassElement2 expectedElement, ErrorCode errorCode) {
+    void checkElement(ClassElementImpl2 expectedElement, ErrorCode errorCode) {
       void reportError() {
         enclosingExecutable.hasLegalReturnType = false;
         _errorReporter.atNode(
@@ -291,8 +291,8 @@
     );
   }
 
-  bool _isLegalReturnType(ClassElement2 expectedElement) {
-    DartType returnType = enclosingExecutable.returnType;
+  bool _isLegalReturnType(ClassElementImpl2 expectedElement) {
+    var returnType = enclosingExecutable.returnType;
     //
     // When checking an async/sync*/async* method, we know the exact type
     // that will be returned (e.g. Future, Iterable, or Stream).
diff --git a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
index 32dff3f..8d6ff67 100644
--- a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
+++ b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
@@ -13,6 +13,7 @@
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
@@ -34,12 +35,12 @@
   TypeSystemImpl get _typeSystem =>
       _libraryElement.typeSystem as TypeSystemImpl;
 
-  void checkConstructorReference(ConstructorReference node) {
+  void checkConstructorReference(ConstructorReferenceImpl node) {
     var classElement = node.constructorName.type.element2;
-    List<TypeParameterElement2> typeParameters;
-    if (classElement is TypeAliasElement2) {
+    List<TypeParameterElementImpl2> typeParameters;
+    if (classElement is TypeAliasElementImpl2) {
       typeParameters = classElement.typeParameters2;
-    } else if (classElement is InterfaceElement2) {
+    } else if (classElement is InterfaceElementImpl2) {
       typeParameters = classElement.typeParameters2;
     } else {
       return;
@@ -99,7 +100,7 @@
     }
   }
 
-  void checkEnumConstantDeclaration(EnumConstantDeclaration node) {
+  void checkEnumConstantDeclaration(EnumConstantDeclarationImpl node) {
     var constructorElement = node.constructorElement2;
     if (constructorElement == null) {
       return;
@@ -293,9 +294,9 @@
       return;
     }
 
-    List<TypeParameterElement2> typeParameters;
+    List<TypeParameterElementImpl2> typeParameters;
     String? elementName;
-    List<DartType> typeArguments;
+    List<TypeImpl> typeArguments;
     var alias = type.alias;
     if (alias != null) {
       elementName = alias.element2.name3;
@@ -329,7 +330,7 @@
 
       var typeArgument = typeArguments[i];
 
-      if (typeArgument is FunctionType &&
+      if (typeArgument is FunctionTypeImpl &&
           typeArgument.typeParameters.isNotEmpty) {
         if (!_libraryElement.featureSet.isEnabled(Feature.generic_metadata)) {
           _errorReporter.atNode(
@@ -421,7 +422,7 @@
 
     // Prepare type arguments for checking for super-bounded.
     var invertedType = _typeSystem.replaceTopAndBottom(type);
-    List<DartType> invertedTypeArguments;
+    List<TypeImpl> invertedTypeArguments;
     var invertedAlias = invertedType.alias;
     if (invertedAlias != null) {
       invertedTypeArguments = invertedAlias.typeArguments;
@@ -499,9 +500,9 @@
       //     <TFrom, TTo extends Iterable<TFrom>>
       //     <T extends Cloneable<T>>
       //
-      DartType argType = typeArgs[i];
+      var argType = typeArgs[i];
 
-      if (argType is FunctionType && argType.typeParameters.isNotEmpty) {
+      if (argType is FunctionTypeImpl && argType.typeParameters.isNotEmpty) {
         if (!_libraryElement.featureSet.isEnabled(Feature.generic_metadata)) {
           _errorReporter.atNode(
             typeArgumentList[i],
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index c3d4e47..65bf042 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -4063,9 +4063,6 @@
         feature: ExperimentalFeatures.dot_shorthands,
         startToken: token,
       );
-
-      // Recovery.
-      pop();
     }
 
     // TODO(kallentu): Handle dot shorthands.
diff --git a/pkg/analyzer/lib/src/generated/error_detection_helpers.dart b/pkg/analyzer/lib/src/generated/error_detection_helpers.dart
index 935a8c0..bba1e30 100644
--- a/pkg/analyzer/lib/src/generated/error_detection_helpers.dart
+++ b/pkg/analyzer/lib/src/generated/error_detection_helpers.dart
@@ -41,8 +41,8 @@
   /// argument.
   void checkForArgumentTypeNotAssignable(
       Expression expression,
-      DartType expectedStaticType,
-      DartType actualStaticType,
+      TypeImpl expectedStaticType,
+      TypeImpl actualStaticType,
       ErrorCode errorCode,
       {Map<SharedTypeView, NonPromotionReason> Function()? whyNotPromoted}) {
     if (expectedStaticType is! VoidType &&
@@ -73,8 +73,8 @@
 
   void checkForAssignableExpressionAtType(
       Expression expression,
-      DartType actualStaticType,
-      DartType expectedStaticType,
+      TypeImpl actualStaticType,
+      TypeImpl expectedStaticType,
       ErrorCode errorCode,
       {Map<SharedTypeView, NonPromotionReason> Function()? whyNotPromoted}) {
     if (expectedStaticType is! VoidType &&
@@ -94,7 +94,7 @@
         return node;
       }
 
-      if (expectedStaticType is RecordType &&
+      if (expectedStaticType is RecordTypeImpl &&
           expectedStaticType.positionalFields.length == 1 &&
           actualStaticType is! RecordType &&
           expression is ParenthesizedExpression) {
@@ -111,8 +111,8 @@
       }
       if (errorCode == CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE) {
         var additionalInfo = <String>[];
-        if (expectedStaticType is RecordType &&
-            actualStaticType is RecordType) {
+        if (expectedStaticType is RecordTypeImpl &&
+            actualStaticType is RecordTypeImpl) {
           var actualPositionalFields = actualStaticType.positionalFields.length;
           var expectedPositionalFields =
               expectedStaticType.positionalFields.length;
@@ -169,16 +169,17 @@
   /// See [CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE], and
   /// [CompileTimeErrorCode.FIELD_INITIALIZER_NOT_ASSIGNABLE].
   void checkForFieldInitializerNotAssignable(
-      ConstructorFieldInitializer initializer, FieldElement2 fieldElement,
+      ConstructorFieldInitializerImpl initializer,
+      FieldElement2OrMember fieldElement,
       {required bool isConstConstructor,
       required Map<SharedTypeView, NonPromotionReason> Function()?
           whyNotPromoted}) {
     // prepare field type
-    DartType fieldType = fieldElement.type;
+    var fieldType = fieldElement.type;
     // prepare expression type
     Expression expression = initializer.expression;
     // test the static type of the expression
-    DartType staticType = expression.typeOrThrow;
+    var staticType = expression.typeOrThrow;
     if (typeSystem.isAssignableTo(staticType, fieldType,
         strictCasts: strictCasts)) {
       if (fieldType is! VoidType) {
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 9182bbd..8779e9e 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -168,7 +168,7 @@
   final CompilationUnitElementImpl _currentUnit;
 
   /// The type representing the type 'int'.
-  late final InterfaceType _intType;
+  late final InterfaceTypeImpl _intType;
 
   /// The options for verification.
   final AnalysisOptions options;
@@ -217,7 +217,7 @@
 
   /// The class containing the AST nodes being visited, or `null` if we are not
   /// in the scope of a class.
-  InterfaceElement2? _enclosingClass;
+  InterfaceElementImpl2? _enclosingClass;
 
   /// The element of the extension being visited, or `null` if we are not
   /// in the scope of an extension.
@@ -628,13 +628,13 @@
   }
 
   @override
-  void visitConstructorReference(ConstructorReference node) {
+  void visitConstructorReference(covariant ConstructorReferenceImpl node) {
     _typeArgumentsVerifier.checkConstructorReference(node);
     _checkForInvalidGenerativeConstructorReference(node.constructorName);
   }
 
   @override
-  void visitDefaultFormalParameter(DefaultFormalParameter node) {
+  void visitDefaultFormalParameter(covariant DefaultFormalParameterImpl node) {
     var defaultValue = node.defaultValue;
     if (defaultValue != null) {
       checkForAssignableExpressionAtType(
@@ -649,7 +649,8 @@
   }
 
   @override
-  void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+  void visitEnumConstantDeclaration(
+      covariant EnumConstantDeclarationImpl node) {
     var element = node.declaredElement as FieldElementImpl;
 
     _checkAugmentations(
@@ -1332,7 +1333,7 @@
   }
 
   @override
-  void visitPostfixExpression(PostfixExpression node) {
+  void visitPostfixExpression(covariant PostfixExpressionImpl node) {
     var operand = node.operand;
     if (node.operator.type == TokenType.BANG) {
       checkForUseOfVoidResult(node);
@@ -1356,9 +1357,9 @@
   }
 
   @override
-  void visitPrefixExpression(PrefixExpression node) {
-    TokenType operatorType = node.operator.type;
-    Expression operand = node.operand;
+  void visitPrefixExpression(covariant PrefixExpressionImpl node) {
+    var operatorType = node.operator.type;
+    var operand = node.operand;
     if (operatorType != TokenType.BANG) {
       if (operatorType.isIncrementOperator) {
         _checkForAssignmentToFinal(operand);
@@ -1705,7 +1706,7 @@
   void _checkAugmentationTypeParameters({
     required Token nameToken,
     required TypeParameterList? typeParameterList,
-    required List<TypeParameterElement> declarationTypeParameters,
+    required List<TypeParameterElementImpl> declarationTypeParameters,
   }) {
     if (declarationTypeParameters.isEmpty) {
       if (typeParameterList != null) {
@@ -1897,7 +1898,7 @@
       InterfaceElementImpl declarationElement,
       NamedCompilationUnitMember node,
       NamedType? superclass,
-      WithClause? withClause,
+      WithClauseImpl? withClause,
       ImplementsClause? implementsClause) {
     // Only check for all of the inheritance logic around clauses if there
     // isn't an error code such as "Cannot extend double" already on the
@@ -1996,7 +1997,7 @@
   ///
   /// See [CompileTimeErrorCode.MIXIN_CLASS_DECLARES_CONSTRUCTOR],
   /// [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT].
-  bool _checkForAllMixinErrorCodes(WithClause? withClause) {
+  bool _checkForAllMixinErrorCodes(WithClauseImpl? withClause) {
     if (withClause == null) {
       return false;
     }
@@ -2005,7 +2006,7 @@
     for (int mixinNameIndex = 0;
         mixinNameIndex < withClause.mixinTypes.length;
         mixinNameIndex++) {
-      NamedType mixinName = withClause.mixinTypes[mixinNameIndex];
+      var mixinName = withClause.mixinTypes[mixinNameIndex];
       DartType mixinType = mixinName.typeOrThrow;
       if (mixinType is InterfaceType) {
         mixinTypeIndex++;
@@ -2048,7 +2049,7 @@
 
   /// Check for errors related to the redirected constructors.
   void _checkForAllRedirectConstructorErrorCodes(
-      ConstructorDeclaration declaration) {
+      ConstructorDeclarationImpl declaration) {
     // Prepare redirected constructor node
     var redirectedConstructor = declaration.redirectedConstructor;
     if (redirectedConstructor == null) {
@@ -2076,12 +2077,12 @@
       }
       return;
     }
-    FunctionType redirectedType = redirectedElement.type;
-    DartType redirectedReturnType = redirectedType.returnType;
+    var redirectedType = redirectedElement.type;
+    var redirectedReturnType = redirectedType.returnType;
 
     // Report specific problem when return type is incompatible
-    FunctionType constructorType = declaration.declaredFragment!.element.type;
-    DartType constructorReturnType = constructorType.returnType;
+    var constructorType = declaration.declaredFragment!.element.type;
+    var constructorReturnType = constructorType.returnType;
     if (!typeSystem.isAssignableTo(redirectedReturnType, constructorReturnType,
         strictCasts: strictCasts)) {
       errorReporter.atNode(
@@ -3162,8 +3163,8 @@
     }
 
     // The type of the loop variable.
-    DartType variableType;
-    if (variableElement is VariableElement2) {
+    TypeImpl variableType;
+    if (variableElement is VariableElementImpl2) {
       variableType = variableElement.type;
     } else {
       return false;
@@ -3192,7 +3193,7 @@
       return false;
     }
 
-    DartType? sequenceElementType;
+    TypeImpl? sequenceElementType;
     {
       var sequenceElement = awaitKeyword != null
           ? _typeProvider.streamElement
@@ -3935,7 +3936,7 @@
   /// the argument value is implicit.
   ///
   /// See [CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
-  void _checkForIntNotAssignable(Expression argument) {
+  void _checkForIntNotAssignable(ExpressionImpl argument) {
     var parameterElement = argument.correspondingParameter;
     var parameterType = parameterElement?.type;
     if (parameterType != null) {
@@ -4178,7 +4179,7 @@
     }
   }
 
-  void _checkForMainFunction2(FunctionDeclaration functionDeclaration) {
+  void _checkForMainFunction2(FunctionDeclarationImpl functionDeclaration) {
     if (functionDeclaration.name.lexeme != 'main') {
       return;
     }
@@ -4429,8 +4430,8 @@
   /// the [mixinIndex] position in the mixins list are satisfied by the
   /// [_enclosingClass], or a previous mixin.
   bool _checkForMixinSuperclassConstraints(
-      int mixinIndex, NamedType mixinName) {
-    InterfaceType mixinType = mixinName.type as InterfaceType;
+      int mixinIndex, NamedTypeImpl mixinName) {
+    var mixinType = mixinName.type as InterfaceTypeImpl;
     for (var constraint in mixinType.superclassConstraints) {
       var superType = _enclosingClass!.supertype as InterfaceTypeImpl;
       superType = superType.withNullability(NullabilitySuffix.none);
@@ -5758,7 +5759,7 @@
       return;
     }
     var element = parameter.declaredFragment?.element;
-    if (element is FieldFormalParameterElement2) {
+    if (element is FieldFormalParameterElementImpl2) {
       var fieldElement = element.field2;
       if (fieldElement == null || fieldElement.isSynthetic) {
         errorReporter.atNode(
@@ -5768,9 +5769,9 @@
         );
       } else {
         var parameterElement = parameter.declaredFragment?.element;
-        if (parameterElement is FieldFormalParameterElement2) {
-          DartType declaredType = parameterElement.type;
-          DartType fieldType = fieldElement.type;
+        if (parameterElement is FieldFormalParameterElementImpl2) {
+          var declaredType = parameterElement.type;
+          var fieldType = fieldElement.type;
           if (fieldElement.isSynthetic) {
             errorReporter.atNode(
               parameter,
@@ -5900,9 +5901,7 @@
   void _checkForWrongTypeParameterVarianceInField(FieldDeclaration node) {
     if (_enclosingClass != null) {
       for (var typeParameter in _enclosingClass!.asElement.typeParameters) {
-        // TODO(kallentu): : Clean up TypeParameterElementImpl casting once
-        // variance is added to the interface.
-        if (!(typeParameter as TypeParameterElementImpl).isLegacyCovariant) {
+        if (!typeParameter.isLegacyCovariant) {
           var fields = node.fields;
           var fieldElement = fields.variables.first.declaredElement!;
           var fieldName = fields.variables.first.name;
@@ -5930,9 +5929,7 @@
     }
 
     for (var typeParameter in _enclosingClass!.asElement.typeParameters) {
-      // TODO(kallentu): : Clean up TypeParameterElementImpl casting once
-      // variance is added to the interface.
-      if ((typeParameter as TypeParameterElementImpl).isLegacyCovariant) {
+      if (typeParameter.isLegacyCovariant) {
         continue;
       }
 
@@ -5980,12 +5977,8 @@
     void checkOne(DartType? superInterface) {
       if (superInterface != null) {
         for (var typeParameter in _enclosingClass!.asElement.typeParameters) {
-          // TODO(kallentu): : Clean up TypeParameterElementImpl casting once
-          // variance is added to the interface.
-          var typeParameterElementImpl =
-              typeParameter as TypeParameterElementImpl;
           var superVariance =
-              typeParameterElementImpl.computeVarianceInType(superInterface);
+              typeParameter.computeVarianceInType(superInterface);
           // Let `D` be a class or mixin declaration, let `S` be a direct
           // superinterface of `D`, and let `X` be a type parameter declared by
           // `D`.
@@ -5995,16 +5988,15 @@
           // contravariant or unrelated position.
           // If `X` is an `inout` type parameter, it can occur in `S` in any
           // position.
-          if (!superVariance
-              .greaterThanOrEqual(typeParameterElementImpl.variance)) {
-            if (!typeParameterElementImpl.isLegacyCovariant) {
+          if (!superVariance.greaterThanOrEqual(typeParameter.variance)) {
+            if (!typeParameter.isLegacyCovariant) {
               errorReporter.atElement(
                 typeParameter,
                 CompileTimeErrorCode
                     .WRONG_EXPLICIT_TYPE_PARAMETER_VARIANCE_IN_SUPERINTERFACE,
                 arguments: [
                   typeParameter.name,
-                  typeParameterElementImpl.variance.keyword,
+                  typeParameter.variance.keyword,
                   superVariance.keyword,
                   superInterface,
                 ],
diff --git a/pkg/analyzer/lib/src/generated/ffi_verifier.dart b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
index 97a4833..27c4e89 100644
--- a/pkg/analyzer/lib/src/generated/ffi_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
@@ -118,7 +118,7 @@
       {required this.strictCasts});
 
   @override
-  void visitClassDeclaration(ClassDeclaration node) {
+  void visitClassDeclaration(covariant ClassDeclarationImpl node) {
     inCompound = false;
     compound = null;
     // Only the Allocator, Opaque and Struct class may be extended.
@@ -248,9 +248,10 @@
   }
 
   @override
-  void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+  void visitFunctionExpressionInvocation(
+      covariant FunctionExpressionInvocationImpl node) {
     var element = node.element;
-    if (element is MethodElement2) {
+    if (element is MethodElement2OrMember) {
       var enclosingElement = element.enclosingElement2;
       if (enclosingElement.isAllocatorExtension &&
           element.name3 == _allocateExtensionMethodName) {
@@ -261,7 +262,7 @@
   }
 
   @override
-  void visitIndexExpression(IndexExpression node) {
+  void visitIndexExpression(covariant IndexExpressionImpl node) {
     var element = node.element;
     if (element is MethodElement2) {
       var enclosingElement = element.enclosingElement2;
@@ -334,7 +335,7 @@
   @override
   void visitMethodInvocation(covariant MethodInvocationImpl node) {
     var element = node.methodName.element;
-    if (element is MethodElement2) {
+    if (element is MethodElement2OrMember) {
       var enclosingElement = element.enclosingElement2;
       if (enclosingElement.isPointer) {
         if (element.name3 == 'fromFunction') {
@@ -375,7 +376,7 @@
   }
 
   @override
-  void visitPrefixedIdentifier(PrefixedIdentifier node) {
+  void visitPrefixedIdentifier(covariant PrefixedIdentifierImpl node) {
     var element = node.element;
     if (element != null) {
       var enclosingElement = element.enclosingElement2;
@@ -394,7 +395,7 @@
   }
 
   @override
-  void visitPropertyAccess(PropertyAccess node) {
+  void visitPropertyAccess(covariant PropertyAccessImpl node) {
     var element = node.propertyName.element;
     if (element != null) {
       var enclosingElement = element.enclosingElement2;
@@ -429,7 +430,7 @@
     super.visitTopLevelVariableDeclaration(node);
   }
 
-  DartType? _canonicalFfiTypeForDartType(DartType dartType) {
+  TypeImpl? _canonicalFfiTypeForDartType(TypeImpl dartType) {
     if (dartType.isPointer || dartType.isCompoundSubtype || dartType.isArray) {
       return dartType;
     } else {
@@ -550,13 +551,13 @@
     Token errorToken,
     Element2 declarationElement,
     NodeList<Annotation> metadata,
-    DartType ffiSignature,
+    TypeImpl ffiSignature,
     DartObject annotationValue,
     bool allowVariableLength,
   ) {
-    DartType type;
+    TypeImpl type;
 
-    if (declarationElement is FieldElement2) {
+    if (declarationElement is FieldElement2OrMember) {
       if (!declarationElement.isStatic) {
         _errorReporter.atToken(
           errorToken,
@@ -564,9 +565,9 @@
         );
       }
       type = declarationElement.type;
-    } else if (declarationElement is TopLevelVariableElement2) {
+    } else if (declarationElement is TopLevelVariableElementImpl2) {
       type = declarationElement.type;
-    } else if (declarationElement is PropertyAccessorElement2) {
+    } else if (declarationElement is PropertyAccessorElement2OrMember) {
       var variable = declarationElement.variable3;
       if (variable == null) {
         return;
@@ -628,7 +629,7 @@
 
   void _checkFfiNativeFunction(
     Token errorToken,
-    ExecutableElement2 declarationElement,
+    ExecutableElement2OrMember declarationElement,
     FunctionTypeImpl ffiSignature,
     DartObject annotationValue,
     List<FormalParameter> formalParameters,
@@ -815,8 +816,8 @@
 
   /// Validates that the given type is a valid dart:ffi native function
   /// signature.
-  bool _isValidFfiNativeFunctionType(DartType nativeType) {
-    if (nativeType is FunctionType && !nativeType.isDartCoreFunction) {
+  bool _isValidFfiNativeFunctionType(TypeImpl nativeType) {
+    if (nativeType is FunctionTypeImpl && !nativeType.isDartCoreFunction) {
       if (nativeType.namedParameterTypes.isNotEmpty ||
           nativeType.optionalParameterTypes.isNotEmpty) {
         return false;
@@ -826,8 +827,7 @@
         return false;
       }
 
-      for (DartType typeArg
-          in nativeType.normalParameterTypes.flattenVarArgs()) {
+      for (var typeArg in nativeType.normalParameterTypes.flattenVarArgs()) {
         if (!_isValidFfiNativeType(typeArg, allowHandle: true)) {
           return false;
         }
@@ -839,14 +839,14 @@
 
   /// Validates that the given [nativeType] is a valid dart:ffi native type.
   bool _isValidFfiNativeType(
-    DartType? nativeType, {
+    TypeImpl? nativeType, {
     bool allowVoid = false,
     bool allowEmptyStruct = false,
     bool allowArray = false,
     bool allowHandle = false,
     bool allowOpaque = false,
   }) {
-    if (nativeType is InterfaceType) {
+    if (nativeType is InterfaceTypeImpl) {
       var primitiveType = _primitiveNativeType(nativeType);
       switch (primitiveType) {
         case _PrimitiveDartType.void_:
@@ -899,7 +899,7 @@
       if (allowArray && nativeType.isArray) {
         return _isValidFfiNativeType(nativeType.typeArguments.single);
       }
-    } else if (nativeType is FunctionType) {
+    } else if (nativeType is FunctionTypeImpl) {
       return _isValidFfiNativeFunctionType(nativeType);
     }
     return false;
@@ -1166,12 +1166,12 @@
     );
   }
 
-  void _validateAllocate(FunctionExpressionInvocation node) {
+  void _validateAllocate(FunctionExpressionInvocationImpl node) {
     var typeArgumentTypes = node.typeArgumentTypes;
     if (typeArgumentTypes == null || typeArgumentTypes.length != 1) {
       return;
     }
-    DartType dartType = typeArgumentTypes[0];
+    var dartType = typeArgumentTypes[0];
     if (!_isValidFfiNativeType(dartType,
         allowVoid: true, allowEmptyStruct: true)) {
       AstNode errorNode = node;
@@ -1234,7 +1234,8 @@
 
   /// Validate the invocation of the instance method
   /// `Pointer<T>.asFunction<F>()`.
-  void _validateAsFunction(MethodInvocation node, MethodElement2 element) {
+  void _validateAsFunction(
+      covariant MethodInvocationImpl node, MethodElement2OrMember element) {
     var typeArguments = node.typeArguments?.arguments;
     AstNode errorNode = typeArguments != null ? typeArguments[0] : node;
     if (typeArguments != null && typeArguments.length == 1) {
@@ -1244,12 +1245,12 @@
     }
     var target = node.realTarget!;
     var targetType = target.staticType;
-    if (targetType is InterfaceType && targetType.isPointer) {
-      DartType T = targetType.typeArguments[0];
+    if (targetType is InterfaceTypeImpl && targetType.isPointer) {
+      var T = targetType.typeArguments[0];
       if (!T.isNativeFunction) {
         return;
       }
-      DartType pointerTypeArg = (T as InterfaceType).typeArguments.single;
+      var pointerTypeArg = (T as InterfaceTypeImpl).typeArguments.single;
       if (pointerTypeArg is TypeParameterType) {
         _errorReporter.atNode(
           target,
@@ -1267,8 +1268,8 @@
         return;
       }
 
-      DartType TPrime = T.typeArguments[0];
-      DartType F = node.typeArgumentTypes![0];
+      var TPrime = T.typeArguments[0];
+      var F = node.typeArgumentTypes![0];
       var isLeaf = _isLeaf(node.argumentList.arguments);
       if (!_validateCompatibleFunctionTypes(
           _FfiTypeCheckDirection.nativeToDart, F, TPrime)) {
@@ -1291,15 +1292,15 @@
   /// types, and subtyping is allowed in either direction.
   bool _validateCompatibleFunctionTypes(
     _FfiTypeCheckDirection direction,
-    DartType dartType,
-    DartType nativeType, {
+    TypeImpl dartType,
+    TypeImpl nativeType, {
     bool nativeFieldWrappersAsPointer = false,
     bool permissiveReturnType = false,
   }) {
     // We require both to be valid function types.
-    if (dartType is! FunctionType ||
+    if (dartType is! FunctionTypeImpl ||
         dartType.isDartCoreFunction ||
-        nativeType is! FunctionType ||
+        nativeType is! FunctionTypeImpl ||
         nativeType.isDartCoreFunction) {
       return false;
     }
@@ -1360,14 +1361,14 @@
   /// [_FfiTypeCheckDirection.dartToNative].
   bool _validateCompatibleNativeType(
     _FfiTypeCheckDirection direction,
-    DartType dartType,
-    DartType nativeType, {
+    TypeImpl dartType,
+    TypeImpl nativeType, {
     bool nativeFieldWrappersAsPointer = false,
     bool allowFunctions = false,
   }) {
     var nativeReturnType = _primitiveNativeType(nativeType);
     if (nativeReturnType == _PrimitiveDartType.int ||
-        (nativeType is InterfaceType &&
+        (nativeType is InterfaceTypeImpl &&
             nativeType.superclass?.element3.name3 ==
                 _abiSpecificIntegerClassName)) {
       return dartType.isDartCoreInt;
@@ -1390,7 +1391,8 @@
         case _FfiTypeCheckDirection.nativeToDart:
           return typeSystem.isSubtypeOf(typeSystem.objectNone, dartType);
       }
-    } else if (dartType is InterfaceType && nativeType is InterfaceType) {
+    } else if (dartType is InterfaceTypeImpl &&
+        nativeType is InterfaceTypeImpl) {
       if (nativeFieldWrappersAsPointer &&
           _extendsNativeFieldWrapperClass1(dartType)) {
         // Must be `Pointer<Void>`, `Handle` already checked above.
@@ -1406,9 +1408,9 @@
       return direction == _FfiTypeCheckDirection.dartToNative
           ? typeSystem.isSubtypeOf(dartType, nativeType)
           : typeSystem.isSubtypeOf(nativeType, dartType);
-    } else if (dartType is FunctionType &&
+    } else if (dartType is FunctionTypeImpl &&
         allowFunctions &&
-        nativeType is InterfaceType &&
+        nativeType is InterfaceTypeImpl &&
         nativeType.isNativeFunction) {
       var nativeFunction = nativeType.typeArguments[0];
       return _validateCompatibleFunctionTypes(
@@ -1421,12 +1423,12 @@
     }
   }
 
-  void _validateCreate(MethodInvocation node, String errorClass) {
+  void _validateCreate(MethodInvocationImpl node, String errorClass) {
     var typeArgumentTypes = node.typeArgumentTypes;
     if (typeArgumentTypes == null || typeArgumentTypes.length != 1) {
       return;
     }
-    DartType dartType = typeArgumentTypes[0];
+    var dartType = typeArgumentTypes[0];
     if (!_isValidFfiNativeType(dartType)) {
       AstNode errorNode = node;
       _errorReporter.atNode(
@@ -1439,8 +1441,8 @@
 
   void _validateElementAt(MethodInvocation node) {
     var targetType = node.realTarget?.staticType;
-    if (targetType is InterfaceType && targetType.isPointer) {
-      DartType T = targetType.typeArguments[0];
+    if (targetType is InterfaceTypeImpl && targetType.isPointer) {
+      var T = targetType.typeArguments[0];
 
       if (!_isValidFfiNativeType(T, allowVoid: true, allowEmptyStruct: true)) {
         AstNode errorNode = node;
@@ -1576,7 +1578,8 @@
 
   /// Validate the invocation of the static method
   /// `Pointer<T>.fromFunction(f, e)`.
-  void _validateFromFunction(MethodInvocation node, MethodElement2 element) {
+  void _validateFromFunction(
+      MethodInvocationImpl node, MethodElement2 element) {
     int argCount = node.argumentList.arguments.length;
     if (argCount < 1 || argCount > 2) {
       // There are other diagnostics reported against the invocation and the
@@ -1584,7 +1587,7 @@
       return;
     }
 
-    DartType T = node.typeArgumentTypes![0];
+    var T = node.typeArgumentTypes![0];
     if (!_isValidFfiNativeFunctionType(T)) {
       AstNode errorNode = node.methodName;
       var typeArgument = node.typeArguments?.arguments[0];
@@ -1599,8 +1602,8 @@
       return;
     }
 
-    Expression f = node.argumentList.arguments[0];
-    DartType FT = f.typeOrThrow;
+    var f = node.argumentList.arguments[0];
+    var FT = f.typeOrThrow;
     if (!_validateCompatibleFunctionTypes(
         _FfiTypeCheckDirection.dartToNative, FT, T)) {
       _errorReporter.atNode(
@@ -1612,7 +1615,7 @@
     }
 
     // TODO(brianwilkerson): Validate that `f` is a top-level function.
-    DartType R = (T as FunctionType).returnType;
+    var R = (T as FunctionTypeImpl).returnType;
     if (_primitiveNativeType(R) == _PrimitiveDartType.void_ ||
         R.isPointer ||
         R.isHandle ||
@@ -1674,7 +1677,7 @@
 
   /// Validate the invocation of the instance method
   /// `DynamicLibrary.lookupFunction<S, F>()`.
-  void _validateLookupFunction(MethodInvocation node) {
+  void _validateLookupFunction(MethodInvocationImpl node) {
     var typeArguments = node.typeArguments?.arguments;
     if (typeArguments == null || typeArguments.length != 2) {
       // There are other diagnostics reported against the invocation and the
@@ -1682,9 +1685,9 @@
       return;
     }
 
-    List<DartType> argTypes = node.typeArgumentTypes!;
-    DartType S = argTypes[0];
-    DartType F = argTypes[1];
+    var argTypes = node.typeArgumentTypes!;
+    var S = argTypes[0];
+    var F = argTypes[1];
     if (!_isValidFfiNativeFunctionType(S)) {
       AstNode errorNode = typeArguments[0];
       _errorReporter.atNode(
@@ -1744,7 +1747,7 @@
             // When referencing a function, the target type must be a
             // `NativeFunction<T>` so that `T` matches the type from the
             // annotation.
-            if (targetType case InterfaceType(isNativeFunction: true)) {
+            if (targetType case InterfaceTypeImpl(isNativeFunction: true)) {
               var targetFunctionType = targetType.typeArguments[0];
               if (!typeSystem.isEqualTo(nativeType, targetFunctionType)) {
                 _errorReporter.atNode(
@@ -1779,7 +1782,7 @@
                   );
                 }
 
-                if (targetType case InterfaceType(isNativeFunction: true)) {
+                if (targetType case InterfaceTypeImpl(isNativeFunction: true)) {
                   var targetFunctionType = targetType.typeArguments[0];
                   if (!typeSystem.isEqualTo(staticType, targetFunctionType)) {
                     _errorReporter.atNode(
@@ -1840,6 +1843,8 @@
     }
 
     var typeArg = (node.staticType as ParameterizedType).typeArguments[0];
+    // TODO(scheglov): eliminate this cast
+    typeArg as TypeImpl;
     if (!_isValidFfiNativeFunctionType(typeArg)) {
       _errorReporter.atNode(
         node.constructorName,
@@ -1861,7 +1866,7 @@
       return;
     }
 
-    var natRetType = (typeArg as FunctionType).returnType;
+    var natRetType = (typeArg as FunctionTypeImpl).returnType;
     if (isolateLocal) {
       if (_primitiveNativeType(natRetType) == _PrimitiveDartType.void_ ||
           natRetType.isPointer ||
@@ -1957,8 +1962,8 @@
     }
   }
 
-  void _validateRefIndexed(IndexExpression node) {
-    var targetType = node.realTarget.staticType;
+  void _validateRefIndexed(IndexExpressionImpl node) {
+    var targetType = node.realTarget.typeOrThrow;
     if (!_isValidFfiNativeType(targetType,
         allowEmptyStruct: true, allowArray: true)) {
       AstNode errorNode = node;
@@ -1972,7 +1977,7 @@
 
   /// Validate the invocation of the extension method
   /// `Pointer<T extends Struct>.ref`.
-  void _validateRefPrefixedIdentifier(PrefixedIdentifier node) {
+  void _validateRefPrefixedIdentifier(PrefixedIdentifierImpl node) {
     var targetType = node.prefix.staticType;
     if (!_isValidFfiNativeType(targetType, allowEmptyStruct: true)) {
       AstNode errorNode = node;
@@ -1984,8 +1989,8 @@
     }
   }
 
-  void _validateRefPropertyAccess(PropertyAccess node) {
-    var targetType = node.realTarget.staticType;
+  void _validateRefPropertyAccess(PropertyAccessImpl node) {
+    var targetType = node.realTarget.typeOrThrow;
     if (!_isValidFfiNativeType(targetType, allowEmptyStruct: true)) {
       AstNode errorNode = node;
       _errorReporter.atNode(
@@ -1999,8 +2004,8 @@
   /// Validate the invocation of the
   /// `Pointer<T extends Struct>.refWithFinalizer` and
   /// `Pointer<T extends Union>.refWithFinalizer` extension methods.
-  void _validateRefWithFinalizer(MethodInvocation node) {
-    var targetType = node.realTarget?.staticType;
+  void _validateRefWithFinalizer(MethodInvocationImpl node) {
+    var targetType = node.realTarget?.typeOrThrow;
     if (!_isValidFfiNativeType(targetType, allowEmptyStruct: true)) {
       _errorReporter.atNode(
         node,
@@ -2010,12 +2015,12 @@
     }
   }
 
-  void _validateSizeOf(MethodInvocation node) {
+  void _validateSizeOf(MethodInvocationImpl node) {
     var typeArgumentTypes = node.typeArgumentTypes;
     if (typeArgumentTypes == null || typeArgumentTypes.length != 1) {
       return;
     }
-    DartType T = typeArgumentTypes[0];
+    var T = typeArgumentTypes[0];
     if (!_isValidFfiNativeType(T, allowVoid: true, allowEmptyStruct: true)) {
       AstNode errorNode = node;
       _errorReporter.atNode(
@@ -2725,7 +2730,7 @@
   }
 }
 
-extension on List<DartType> {
+extension on List<TypeImpl> {
   /// Removes the VarArgs from a DartType list.
   ///
   /// ```
@@ -2733,7 +2738,7 @@
   /// [Int8, VarArgs<(Int8,)>] -> [Int8, Int8]
   /// [Int8, VarArgs<(Int8, Int8)>] -> [Int8, Int8, Int8]
   /// ```
-  List<DartType> flattenVarArgs() {
+  List<TypeImpl> flattenVarArgs() {
     if (isEmpty) {
       return this;
     }
@@ -2741,8 +2746,8 @@
     if (!last.isVarArgs) {
       return this;
     }
-    var typeArgument = (last as InterfaceType).typeArguments.single;
-    if (typeArgument is! RecordType) {
+    var typeArgument = (last as InterfaceTypeImpl).typeArguments.single;
+    if (typeArgument is! RecordTypeImpl) {
       return this;
     }
     if (typeArgument.namedFields.isNotEmpty) {
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
index dc533eb..a1d2199 100644
--- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -178,7 +178,7 @@
   /// same contexttype
   /// </blockquote>
   void visitIntegerLiteral(IntegerLiteralImpl node,
-      {required DartType contextType}) {
+      {required TypeImpl contextType}) {
     var strictCasts = _resolver.analysisOptions.strictCasts;
     if (_typeSystem.isAssignableTo(_typeProvider.intType, contextType,
             strictCasts: strictCasts) ||
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index 13eb202..d65d811 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -890,6 +890,9 @@
   List<int>? _elementNameParameterIds;
   List<int>? _elementNameUnitMemberIds;
   List<int>? _elementUnits;
+  List<int>? _libFragmentRefTargets;
+  List<int>? _libFragmentRefUriLengths;
+  List<int>? _libFragmentRefUriOffsets;
   int? _nullStringId;
   List<String>? _strings;
   List<AnalysisDriverSubtypeBuilder>? _subtypes;
@@ -977,6 +980,42 @@
   }
 
   @override
+  List<int> get libFragmentRefTargets => _libFragmentRefTargets ??= <int>[];
+
+  /// Support for indexing `part` and `part of` directives.
+  ///
+  /// This is the index into [unitLibraryUris] and [unitUnitUris].
+  /// This is the library fragment referenced by the directive.
+  set libFragmentRefTargets(List<int> value) {
+    assert(value.every((e) => e >= 0));
+    this._libFragmentRefTargets = value;
+  }
+
+  @override
+  List<int> get libFragmentRefUriLengths =>
+      _libFragmentRefUriLengths ??= <int>[];
+
+  /// Support for indexing `part` and `part of` directives.
+  ///
+  /// The offset of the URI in the directive.
+  set libFragmentRefUriLengths(List<int> value) {
+    assert(value.every((e) => e >= 0));
+    this._libFragmentRefUriLengths = value;
+  }
+
+  @override
+  List<int> get libFragmentRefUriOffsets =>
+      _libFragmentRefUriOffsets ??= <int>[];
+
+  /// Support for indexing `part` and `part of` directives.
+  ///
+  /// The offset of the URI in the directive.
+  set libFragmentRefUriOffsets(List<int> value) {
+    assert(value.every((e) => e >= 0));
+    this._libFragmentRefUriOffsets = value;
+  }
+
+  @override
   int get nullStringId => _nullStringId ??= 0;
 
   /// Identifier of the null string in [strings].
@@ -1135,6 +1174,9 @@
       List<int>? elementNameParameterIds,
       List<int>? elementNameUnitMemberIds,
       List<int>? elementUnits,
+      List<int>? libFragmentRefTargets,
+      List<int>? libFragmentRefUriLengths,
+      List<int>? libFragmentRefUriOffsets,
       int? nullStringId,
       List<String>? strings,
       List<AnalysisDriverSubtypeBuilder>? subtypes,
@@ -1156,6 +1198,9 @@
         _elementNameParameterIds = elementNameParameterIds,
         _elementNameUnitMemberIds = elementNameUnitMemberIds,
         _elementUnits = elementUnits,
+        _libFragmentRefTargets = libFragmentRefTargets,
+        _libFragmentRefUriLengths = libFragmentRefUriLengths,
+        _libFragmentRefUriOffsets = libFragmentRefUriOffsets,
         _nullStringId = nullStringId,
         _strings = strings,
         _subtypes = subtypes,
@@ -1360,6 +1405,33 @@
         signatureSink.addString(x);
       }
     }
+    var libFragmentRefTargets = this._libFragmentRefTargets;
+    if (libFragmentRefTargets == null) {
+      signatureSink.addInt(0);
+    } else {
+      signatureSink.addInt(libFragmentRefTargets.length);
+      for (var x in libFragmentRefTargets) {
+        signatureSink.addInt(x);
+      }
+    }
+    var libFragmentRefUriOffsets = this._libFragmentRefUriOffsets;
+    if (libFragmentRefUriOffsets == null) {
+      signatureSink.addInt(0);
+    } else {
+      signatureSink.addInt(libFragmentRefUriOffsets.length);
+      for (var x in libFragmentRefUriOffsets) {
+        signatureSink.addInt(x);
+      }
+    }
+    var libFragmentRefUriLengths = this._libFragmentRefUriLengths;
+    if (libFragmentRefUriLengths == null) {
+      signatureSink.addInt(0);
+    } else {
+      signatureSink.addInt(libFragmentRefUriLengths.length);
+      for (var x in libFragmentRefUriLengths) {
+        signatureSink.addInt(x);
+      }
+    }
   }
 
   typed_data.Uint8List toBuffer() {
@@ -1374,6 +1446,9 @@
     fb.Offset? offset_elementNameParameterIds;
     fb.Offset? offset_elementNameUnitMemberIds;
     fb.Offset? offset_elementUnits;
+    fb.Offset? offset_libFragmentRefTargets;
+    fb.Offset? offset_libFragmentRefUriLengths;
+    fb.Offset? offset_libFragmentRefUriOffsets;
     fb.Offset? offset_strings;
     fb.Offset? offset_subtypes;
     fb.Offset? offset_supertypes;
@@ -1419,6 +1494,23 @@
     if (!(elementUnits == null || elementUnits.isEmpty)) {
       offset_elementUnits = fbBuilder.writeListUint32(elementUnits);
     }
+    var libFragmentRefTargets = _libFragmentRefTargets;
+    if (!(libFragmentRefTargets == null || libFragmentRefTargets.isEmpty)) {
+      offset_libFragmentRefTargets =
+          fbBuilder.writeListUint32(libFragmentRefTargets);
+    }
+    var libFragmentRefUriLengths = _libFragmentRefUriLengths;
+    if (!(libFragmentRefUriLengths == null ||
+        libFragmentRefUriLengths.isEmpty)) {
+      offset_libFragmentRefUriLengths =
+          fbBuilder.writeListUint32(libFragmentRefUriLengths);
+    }
+    var libFragmentRefUriOffsets = _libFragmentRefUriOffsets;
+    if (!(libFragmentRefUriOffsets == null ||
+        libFragmentRefUriOffsets.isEmpty)) {
+      offset_libFragmentRefUriOffsets =
+          fbBuilder.writeListUint32(libFragmentRefUriOffsets);
+    }
     var strings = _strings;
     if (!(strings == null || strings.isEmpty)) {
       offset_strings = fbBuilder
@@ -1502,6 +1594,15 @@
     if (offset_elementUnits != null) {
       fbBuilder.addOffset(5, offset_elementUnits);
     }
+    if (offset_libFragmentRefTargets != null) {
+      fbBuilder.addOffset(21, offset_libFragmentRefTargets);
+    }
+    if (offset_libFragmentRefUriLengths != null) {
+      fbBuilder.addOffset(23, offset_libFragmentRefUriLengths);
+    }
+    if (offset_libFragmentRefUriOffsets != null) {
+      fbBuilder.addOffset(22, offset_libFragmentRefUriOffsets);
+    }
     fbBuilder.addUint32(1, _nullStringId, 0);
     if (offset_strings != null) {
       fbBuilder.addOffset(0, offset_strings);
@@ -1577,6 +1678,9 @@
   List<int>? _elementNameParameterIds;
   List<int>? _elementNameUnitMemberIds;
   List<int>? _elementUnits;
+  List<int>? _libFragmentRefTargets;
+  List<int>? _libFragmentRefUriLengths;
+  List<int>? _libFragmentRefUriOffsets;
   int? _nullStringId;
   List<String>? _strings;
   List<idl.AnalysisDriverSubtype>? _subtypes;
@@ -1632,6 +1736,24 @@
   }
 
   @override
+  List<int> get libFragmentRefTargets {
+    return _libFragmentRefTargets ??= const fb.Uint32ListReader()
+        .vTableGet(_bc, _bcOffset, 21, const <int>[]);
+  }
+
+  @override
+  List<int> get libFragmentRefUriLengths {
+    return _libFragmentRefUriLengths ??= const fb.Uint32ListReader()
+        .vTableGet(_bc, _bcOffset, 23, const <int>[]);
+  }
+
+  @override
+  List<int> get libFragmentRefUriOffsets {
+    return _libFragmentRefUriOffsets ??= const fb.Uint32ListReader()
+        .vTableGet(_bc, _bcOffset, 22, const <int>[]);
+  }
+
+  @override
   int get nullStringId {
     return _nullStringId ??=
         const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
@@ -1755,6 +1877,18 @@
     if (local_elementUnits.isNotEmpty) {
       result["elementUnits"] = local_elementUnits;
     }
+    var local_libFragmentRefTargets = libFragmentRefTargets;
+    if (local_libFragmentRefTargets.isNotEmpty) {
+      result["libFragmentRefTargets"] = local_libFragmentRefTargets;
+    }
+    var local_libFragmentRefUriLengths = libFragmentRefUriLengths;
+    if (local_libFragmentRefUriLengths.isNotEmpty) {
+      result["libFragmentRefUriLengths"] = local_libFragmentRefUriLengths;
+    }
+    var local_libFragmentRefUriOffsets = libFragmentRefUriOffsets;
+    if (local_libFragmentRefUriOffsets.isNotEmpty) {
+      result["libFragmentRefUriOffsets"] = local_libFragmentRefUriOffsets;
+    }
     var local_nullStringId = nullStringId;
     if (local_nullStringId != 0) {
       result["nullStringId"] = local_nullStringId;
@@ -1831,6 +1965,9 @@
         "elementNameParameterIds": elementNameParameterIds,
         "elementNameUnitMemberIds": elementNameUnitMemberIds,
         "elementUnits": elementUnits,
+        "libFragmentRefTargets": libFragmentRefTargets,
+        "libFragmentRefUriLengths": libFragmentRefUriLengths,
+        "libFragmentRefUriOffsets": libFragmentRefUriOffsets,
         "nullStringId": nullStringId,
         "strings": strings,
         "subtypes": subtypes,
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs
index c0941df..f629d13 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -211,6 +211,22 @@
   /// specific unit where the element is declared.
   elementUnits:[uint] (id: 5);
 
+  /// Support for indexing `part` and `part of` directives.
+  ///
+  /// This is the index into [unitLibraryUris] and [unitUnitUris].
+  /// This is the library fragment referenced by the directive.
+  libFragmentRefTargets:[uint] (id: 21);
+
+  /// Support for indexing `part` and `part of` directives.
+  ///
+  /// The offset of the URI in the directive.
+  libFragmentRefUriLengths:[uint] (id: 23);
+
+  /// Support for indexing `part` and `part of` directives.
+  ///
+  /// The offset of the URI in the directive.
+  libFragmentRefUriOffsets:[uint] (id: 22);
+
   /// Identifier of the null string in [strings].
   nullStringId:uint (id: 1);
 
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index 96d9cfe..b43d540 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -187,6 +187,25 @@
   @Id(5)
   List<int> get elementUnits;
 
+  /// Support for indexing `part` and `part of` directives.
+  ///
+  /// This is the index into [unitLibraryUris] and [unitUnitUris].
+  /// This is the library fragment referenced by the directive.
+  @Id(21)
+  List<int> get libFragmentRefTargets;
+
+  /// Support for indexing `part` and `part of` directives.
+  ///
+  /// The offset of the URI in the directive.
+  @Id(23)
+  List<int> get libFragmentRefUriLengths;
+
+  /// Support for indexing `part` and `part of` directives.
+  ///
+  /// The offset of the URI in the directive.
+  @Id(22)
+  List<int> get libFragmentRefUriOffsets;
+
   /// Identifier of the null string in [strings].
   @Id(1)
   int get nullStringId;
diff --git a/pkg/analyzer/lib/src/test_utilities/find_element.dart b/pkg/analyzer/lib/src/test_utilities/find_element.dart
index 1f54c10..55d182e 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_element.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_element.dart
@@ -6,6 +6,7 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/test_utilities/function_ast_visitor.dart';
 import 'package:analyzer/src/utilities/extensions/element.dart';
 
@@ -221,7 +222,7 @@
     throw StateError('Not found: $name');
   }
 
-  CompilationUnitElement part(String targetUri) {
+  CompilationUnitElementImpl part(String targetUri) {
     CompilationUnitElement? result;
 
     for (var partElement in unitElement.parts) {
@@ -238,7 +239,7 @@
     }
 
     if (result != null) {
-      return result;
+      return result as CompilationUnitElementImpl;
     }
     throw StateError('Not found: $targetUri');
   }
diff --git a/pkg/analyzer/lib/src/test_utilities/find_element2.dart b/pkg/analyzer/lib/src/test_utilities/find_element2.dart
index 2e484a5..78b43a5 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_element2.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_element2.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element2.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/test_utilities/function_ast_visitor.dart';
 import 'package:analyzer/src/utilities/extensions/element.dart';
 import 'package:collection/collection.dart';
@@ -479,10 +480,10 @@
     return topVar(name).setter2!;
   }
 
-  TopLevelVariableElement2 topVar(String name) {
+  TopLevelVariableElementImpl2 topVar(String name) {
     for (var variable in libraryElement.topLevelVariables) {
       if (variable.name3 == name) {
-        return variable;
+        return variable as TopLevelVariableElementImpl2;
       }
     }
     throw StateError('Not found: $name');
diff --git a/pkg/analyzer/lib/src/utilities/extensions/element.dart b/pkg/analyzer/lib/src/utilities/extensions/element.dart
index e8edfbb..4df71ba 100644
--- a/pkg/analyzer/lib/src/utilities/extensions/element.dart
+++ b/pkg/analyzer/lib/src/utilities/extensions/element.dart
@@ -460,6 +460,16 @@
   }
 }
 
+extension FieldElementOrMemberExtension on FieldElementOrMember {
+  FieldElement2OrMember get asElement2 {
+    return switch (this) {
+      FieldElementImpl(:var element) => element,
+      FieldMember member => member,
+      _ => throw UnsupportedError('Unsupported type: $runtimeType'),
+    };
+  }
+}
+
 extension FormalParameterElementExtension on FormalParameterElement {
   ParameterElement get asElement {
     if (this case ParameterMember member) {
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
index 6a51b9f..4f84398 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
@@ -121,13 +121,12 @@
     // No code needs to be analyzed but we still need to call
     // assertNoErrorsInCode to get the typeProvider initialized.
     await assertNoErrorsInCode('');
-    InterfaceType intType = typeProvider.intType;
-    DartType dynamicType = typeProvider.dynamicType;
-    InterfaceType futureDynamicType = typeProvider.futureDynamicType;
-    InterfaceType futureIntType = typeProvider.futureType(intType);
-    InterfaceType futureFutureDynamicType =
-        typeProvider.futureType(futureDynamicType);
-    InterfaceType futureFutureIntType = typeProvider.futureType(futureIntType);
+    var intType = typeProvider.intType;
+    var dynamicType = typeProvider.dynamicType;
+    var futureDynamicType = typeProvider.futureDynamicType;
+    var futureIntType = typeProvider.futureType(intType);
+    var futureFutureDynamicType = typeProvider.futureType(futureDynamicType);
+    var futureFutureIntType = typeProvider.futureType(futureIntType);
     // flatten(int) = int
     expect(_flatten(intType), intType);
     // flatten(dynamic) = dynamic
@@ -406,5 +405,5 @@
     expect(node.staticType, same(typeProvider.bottomType));
   }
 
-  TypeImpl _flatten(DartType type) => typeSystem.flatten(type as TypeImpl);
+  TypeImpl _flatten(TypeImpl type) => typeSystem.flatten(type);
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/index_test.dart b/pkg/analyzer/test/src/dart/analysis/index_test.dart
index 05870a6..a4cd66b 100644
--- a/pkg/analyzer/test/src/dart/analysis/index_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/index_test.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/analysis/index.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/test_utilities/find_element.dart';
 import 'package:analyzer/src/utilities/extensions/element.dart';
@@ -48,6 +49,16 @@
     expect(actual, expected);
   }
 
+  void assertLibraryFragmentIndexText(
+      CompilationUnitElementImpl fragment, String expected) {
+    var actual = _getLibraryFragmentReferenceText(fragment);
+    if (actual != expected) {
+      print(actual);
+      NodeTextExpectationsCollector.add(actual);
+    }
+    expect(actual, expected);
+  }
+
   test_class_constructorElement_unnamed_implicitInvocation() async {
     await _indexTestUnit('''
 class A {
@@ -1068,9 +1079,9 @@
 library my_lib;
 part 'my_unit.dart';
 ''');
-    var element = findElement.part('package:test/my_unit.dart');
-    assertElementIndexText(element, r'''
-21 2:6 |'my_unit.dart'| IS_REFERENCED_BY qualified
+    var fragment = findElement.part('package:test/my_unit.dart');
+    assertLibraryFragmentIndexText(fragment, r'''
+21 2:6 |'my_unit.dart'|
 ''');
   }
 
@@ -2728,6 +2739,40 @@
       ..isUsed('x();', IndexRelationKind.IS_INVOKED_BY);
   }
 
+  String _getLibraryFragmentReferenceText(CompilationUnitElementImpl target) {
+    var lineInfo = result.lineInfo;
+    var targetId = index.getLibraryFragmentId(target);
+
+    expect(
+      index.libFragmentRefTargets.length,
+      index.libFragmentRefUriOffsets.length,
+    );
+
+    expect(
+      index.libFragmentRefTargets.length,
+      index.libFragmentRefUriLengths.length,
+    );
+
+    var buffer = StringBuffer();
+    for (var i = 0; i < index.libFragmentRefTargets.length; i++) {
+      if (index.libFragmentRefTargets[i] == targetId) {
+        var offset = index.libFragmentRefUriOffsets[i];
+        var length = index.libFragmentRefUriLengths[i];
+        var location = lineInfo.getLocation(offset);
+        var snippet = result.content.substring(offset, offset + length);
+        buffer.write(offset);
+        buffer.write(' ');
+        buffer.write(location.lineNumber);
+        buffer.write(':');
+        buffer.write(location.columnNumber);
+        buffer.write(' ');
+        buffer.write('|$snippet|');
+        buffer.writeln();
+      }
+    }
+    return buffer.toString();
+  }
+
   String _getRelationsText(Element element) {
     var lineInfo = result.lineInfo;
     var elementId = _findElementId(element);
@@ -2832,7 +2877,7 @@
 
   void _assertUsedName(String name, IndexRelationKind kind,
       ExpectedLocation expectedLocation, bool isNot) {
-    int nameId = _getStringId(name);
+    int nameId = index.getStringId(name);
     for (int i = 0; i < index.usedNames.length; i++) {
       if (index.usedNames[i] == nameId &&
           index.usedNameKinds[i] == kind &&
@@ -2883,14 +2928,14 @@
     var unitId = _getUnitId(element);
 
     // Prepare the element that was put into the index.
-    IndexElementInfo info = IndexElementInfo(element);
-    element = info.element;
+    IndexElementInfo info = IndexElementInfo(element.asElement2!);
+    element = info.element.asElement!;
 
     // Prepare element's name components.
-    var components = ElementNameComponents(element);
-    var unitMemberId = _getStringId(components.unitMemberName);
-    var classMemberId = _getStringId(components.classMemberName);
-    var parameterId = _getStringId(components.parameterName);
+    var components = ElementNameComponents(element.asElement2!);
+    var unitMemberId = index.getStringId(components.unitMemberName);
+    var classMemberId = index.getStringId(components.classMemberName);
+    var parameterId = index.getStringId(components.parameterName);
 
     // Find the element's id.
     for (int elementId = 0;
@@ -2908,36 +2953,9 @@
     return 0;
   }
 
-  int _getStringId(String? str) {
-    if (str == null) {
-      return index.nullStringId;
-    }
-
-    int id = index.strings.indexOf(str);
-    if (id < 0) {
-      _failWithIndexDump('String "$str" is not referenced');
-    }
-    return id;
-  }
-
   int _getUnitId(Element element) {
-    CompilationUnitElement unitElement = getUnitElement(element);
-    int libraryUriId = _getUriId(unitElement.library.source.uri);
-    int unitUriId = _getUriId(unitElement.source.uri);
-    expect(index.unitLibraryUris, hasLength(index.unitUnitUris.length));
-    for (int i = 0; i < index.unitLibraryUris.length; i++) {
-      if (index.unitLibraryUris[i] == libraryUriId &&
-          index.unitUnitUris[i] == unitUriId) {
-        return i;
-      }
-    }
-    _failWithIndexDump('Unit $unitElement of $element is not referenced');
-    return -1;
-  }
-
-  int _getUriId(Uri uri) {
-    String str = uri.toString();
-    return _getStringId(str);
+    var unitElement = getUnitElement(element.asElement2!);
+    return index.getLibraryFragmentId(unitElement);
   }
 
   Future<void> _indexTestUnit(String code) async {
diff --git a/pkg/analyzer/test/src/dart/element/assignable_test.dart b/pkg/analyzer/test/src/dart/element/assignable_test.dart
index 45afa00..239626b 100644
--- a/pkg/analyzer/test/src/dart/element/assignable_test.dart
+++ b/pkg/analyzer/test/src/dart/element/assignable_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -18,12 +18,12 @@
 class IsAssignableToTest extends AbstractTypeSystemTest {
   bool get strictCasts => analysisContext.analysisOptions.strictCasts;
 
-  void isAssignable(DartType from, DartType to) {
+  void isAssignable(TypeImpl from, TypeImpl to) {
     expect(
         typeSystem.isAssignableTo(from, to, strictCasts: strictCasts), isTrue);
   }
 
-  void isNotAssignable(DartType from, DartType to) {
+  void isNotAssignable(TypeImpl from, TypeImpl to) {
     expect(
         typeSystem.isAssignableTo(from, to, strictCasts: strictCasts), isFalse);
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart b/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart
index 8a49210..d72b6db 100644
--- a/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart
+++ b/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart
@@ -107,6 +107,11 @@
       argument: _ArgumentIndex(1),
     ),
     _AssertMethod(
+      className: 'IndexTest',
+      methodName: 'assertLibraryFragmentIndexText',
+      argument: _ArgumentIndex(1),
+    ),
+    _AssertMethod(
       className: '_InheritanceManager3Base2',
       methodName: 'assertInterfaceText',
       argument: _ArgumentIndex(1),
diff --git a/pkg/analyzer/test/src/diagnostics/experiment_not_enabled_test.dart b/pkg/analyzer/test/src/diagnostics/experiment_not_enabled_test.dart
index 60e1ad3d..c3877d0 100644
--- a/pkg/analyzer/test/src/diagnostics/experiment_not_enabled_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/experiment_not_enabled_test.dart
@@ -32,6 +32,18 @@
     ]);
   }
 
+  test_dotShorthands_disabled() async {
+    await assertErrorsInCode(r'''
+void main() {
+  Object c = .hash;
+  print(c);
+}
+''', [
+      error(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 27, 1),
+      error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 28, 4),
+    ]);
+  }
+
   test_nonFunctionTypeAliases_disabled() async {
     await assertErrorsInCode(r'''
 // @dart = 2.12
diff --git a/pkg/dart_service_protocol_shared/CHANGELOG.md b/pkg/dart_service_protocol_shared/CHANGELOG.md
index 06ff0ad..3177fff 100644
--- a/pkg/dart_service_protocol_shared/CHANGELOG.md
+++ b/pkg/dart_service_protocol_shared/CHANGELOG.md
@@ -1,3 +1,6 @@
+## 0.0.3-wip
+- Update sdk constraint to '^3.5.0'
+
 ## 0.0.2
 - Fixed an issue with streamNotify data type being too specific.
 
diff --git a/pkg/dart_service_protocol_shared/pubspec.yaml b/pkg/dart_service_protocol_shared/pubspec.yaml
index f42883d..6713501 100644
--- a/pkg/dart_service_protocol_shared/pubspec.yaml
+++ b/pkg/dart_service_protocol_shared/pubspec.yaml
@@ -1,11 +1,11 @@
 name: dart_service_protocol_shared
 description: A package that implements service extensions and stream managers.
 
-version: 0.0.2
+version: 0.0.3-wip
 repository: https://github.com/dart-lang/sdk/tree/main/pkg/dart_service_protocol_shared
 
 environment:
-  sdk: ">=3.0.0 <4.0.0"
+  sdk: ^3.5.0
 
 dependencies:
   meta: ^1.11.0
diff --git a/pkg/dds/CHANGELOG.md b/pkg/dds/CHANGELOG.md
index 89c1eac..8cef292 100644
--- a/pkg/dds/CHANGELOG.md
+++ b/pkg/dds/CHANGELOG.md
@@ -1,6 +1,7 @@
 # 5.0.1-wip
 
 - Widen the dependency on `package:shelf_web_socket`.
+- Require Dart SDK v. 3.5.0 or higher.
 
 # 5.0.0
 - [DAP] The debug adapter no longer spawns its own in-process copy of DDS, instead relying on one started by the Dart VM (or `Flutter`). This means the `enableDds` and `enableAuthCodes` arguments to the `DartDebugAdapter` base class have been deprecated and have any effect. Suppressing DDS (or auth codes) should be done in launch configuration (for example using `vmAdditionalArgs` or `toolArgs` depending on the target tool).
diff --git a/pkg/dds/lib/src/dds_impl.dart b/pkg/dds/lib/src/dds_impl.dart
index 34ee2a8..7c2ba66 100644
--- a/pkg/dds/lib/src/dds_impl.dart
+++ b/pkg/dds/lib/src/dds_impl.dart
@@ -388,7 +388,7 @@
         // If DDS is serving DevTools, install the DevTools handlers and
         // forward any unhandled HTTP requests to the VM service.
         final String buildDir =
-            _devToolsConfiguration!.customBuildDirectoryPath.toFilePath();
+            _devToolsConfiguration.customBuildDirectoryPath.toFilePath();
         return defaultHandler(
           dds: this,
           buildDir: buildDir,
diff --git a/pkg/dds/pubspec.yaml b/pkg/dds/pubspec.yaml
index 93b01eb..a321f02 100644
--- a/pkg/dds/pubspec.yaml
+++ b/pkg/dds/pubspec.yaml
@@ -6,7 +6,8 @@
 repository: https://github.com/dart-lang/sdk/tree/main/pkg/dds
 
 environment:
-  sdk: '>=3.0.0 <4.0.0'
+  sdk: ^3.5.0
+
 
 dependencies:
   args: ^2.0.0
diff --git a/pkg/dds_service_extensions/CHANGELOG.md b/pkg/dds_service_extensions/CHANGELOG.md
index f850800..019258b 100644
--- a/pkg/dds_service_extensions/CHANGELOG.md
+++ b/pkg/dds_service_extensions/CHANGELOG.md
@@ -1,3 +1,6 @@
+# 2.0.2-wip
+- Require dart sdk v. 3.5.0 or higher.
+
 # 2.0.1
 - Update `vm_service` to `>=14.0.0 <16.0.0`.
 
diff --git a/pkg/dds_service_extensions/pubspec.yaml b/pkg/dds_service_extensions/pubspec.yaml
index b4d87b8..ecbe5fb 100644
--- a/pkg/dds_service_extensions/pubspec.yaml
+++ b/pkg/dds_service_extensions/pubspec.yaml
@@ -1,12 +1,13 @@
 name: dds_service_extensions
-version: 2.0.1
+version: 2.0.2-wip
 description: >-
   Extension methods for `package:vm_service`, used to make requests a
   Dart Development Service (DDS) instance.
 repository: https://github.com/dart-lang/sdk/tree/main/pkg/dds_service_extensions
 
 environment:
-  sdk: ^3.0.0
+  sdk: ^3.5.0
+
 
 dependencies:
   async: ^2.4.1
diff --git a/pkg/dtd/CHANGELOG.md b/pkg/dtd/CHANGELOG.md
index e2468a1..9a137e5 100644
--- a/pkg/dtd/CHANGELOG.md
+++ b/pkg/dtd/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.4.1-wip
+
+- Update SDK constraints to `^3.5.0`.
+
 ## 2.4.0
 
 - Bump `unified_analytics` dependency to ^7.0.0.
diff --git a/pkg/dtd/pubspec.yaml b/pkg/dtd/pubspec.yaml
index 806f085..5c17757 100644
--- a/pkg/dtd/pubspec.yaml
+++ b/pkg/dtd/pubspec.yaml
@@ -4,7 +4,7 @@
 repository: https://github.com/dart-lang/sdk/tree/main/pkg/dtd
 
 environment:
-  sdk: ^3.0.0
+  sdk: ^3.5.0
 
 dependencies:
   json_rpc_2: ^3.0.2
diff --git a/pkg/front_end/lib/src/kernel/body_builder.dart b/pkg/front_end/lib/src/kernel/body_builder.dart
index 323fff8..afd040a 100644
--- a/pkg/front_end/lib/src/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/kernel/body_builder.dart
@@ -10007,15 +10007,13 @@
 
       // Recovery, avoid crashing with an extra selector.
       pop();
+      push(new ParserErrorGenerator(this, token, cfe.messageSyntheticToken));
       return;
     }
 
-    Object? selector = pop();
-    if (libraryFeatures.dotShorthands.isEnabled && selector is Selector) {
-      // TODO(kallentu): Remove this once we have more of the dot shorthands
-      // implementation complete.
-      pop(); // ParserGeneratorError
-
+    assert(checkState(token, [ValueKinds.Selector]));
+    Selector selector = pop() as Selector;
+    if (libraryFeatures.dotShorthands.isEnabled) {
       // TODO(kallentu): Handle invocations.
 
       push(forest.createDotShorthandPropertyGet(
diff --git a/pkg/front_end/parser_testcases/dot_shorthands/syntax.dart.expect b/pkg/front_end/parser_testcases/dot_shorthands/syntax.dart.expect
index 868d2ce..cf6c348 100644
--- a/pkg/front_end/parser_testcases/dot_shorthands/syntax.dart.expect
+++ b/pkg/front_end/parser_testcases/dot_shorthands/syntax.dart.expect
@@ -1,9 +1,3 @@
-Problems reported:
-
-parser/dot_shorthands/syntax:4:13: Expected an identifier, but got '.'.
-  Color c = .red;
-            ^
-
 beginCompilationUnit(enum)
   beginMetadataStar(enum)
   endMetadataStar(0)
@@ -67,11 +61,6 @@
           handleIdentifier(c, localVariableDeclaration)
           beginInitializedIdentifier(c)
             beginVariableInitializer(=)
-              handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got '.'., Try inserting an identifier before '.'., {lexeme: .}], ., .)
-              handleIdentifier(, expression)
-              handleNoTypeArguments(.)
-              handleNoArguments(.)
-              handleSend(, )
               handleIdentifier(red, expressionContinuation)
               handleNoTypeArguments(;)
               handleNoArguments(;)
diff --git a/pkg/front_end/parser_testcases/dot_shorthands/syntax.dart.intertwined.expect b/pkg/front_end/parser_testcases/dot_shorthands/syntax.dart.intertwined.expect
index 2bae6f3..7f6ba63 100644
--- a/pkg/front_end/parser_testcases/dot_shorthands/syntax.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/dot_shorthands/syntax.dart.intertwined.expect
@@ -104,19 +104,7 @@
                       listener: beginVariableInitializer(=)
                       parseExpression(=)
                         parsePrecedenceExpression(=, 1, true, ConstantPatternContext.none)
-                          parseUnaryExpression(=, true, ConstantPatternContext.none)
-                            parsePrimary(=, expression, ConstantPatternContext.none)
-                              parseSend(=, expression, ConstantPatternContext.none)
-                                isNextIdentifier(=)
-                                ensureIdentifier(=, expression)
-                                  reportRecoverableErrorWithToken(., Template(ExpectedIdentifier))
-                                    listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got '.'., Try inserting an identifier before '.'., {lexeme: .}], ., .)
-                                  rewriter()
-                                  listener: handleIdentifier(, expression)
-                                listener: handleNoTypeArguments(.)
-                                parseArgumentsOpt()
-                                  listener: handleNoArguments(.)
-                                listener: handleSend(, )
+                          rewriter()
                           parsePrimary(., expressionContinuation, ConstantPatternContext.none)
                             parseSendOrFunctionLiteral(., expressionContinuation, ConstantPatternContext.none)
                               parseSend(., expressionContinuation, ConstantPatternContext.none)
diff --git a/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.expect b/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.expect
index a02b6ea..174f17d 100644
--- a/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.expect
+++ b/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.expect
@@ -1,12 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/dot_shorthands/simple_class.dart:12:13: Error: Expected an identifier, but got '.'.
-// Try inserting an identifier before '.'.
-//   Color c = .red;
-//             ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.modular.expect b/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.modular.expect
index a02b6ea..174f17d 100644
--- a/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.modular.expect
@@ -1,12 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/dot_shorthands/simple_class.dart:12:13: Error: Expected an identifier, but got '.'.
-// Try inserting an identifier before '.'.
-//   Color c = .red;
-//             ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.transformed.expect b/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.transformed.expect
index a02b6ea..174f17d 100644
--- a/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.transformed.expect
@@ -1,12 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/dot_shorthands/simple_class.dart:12:13: Error: Expected an identifier, but got '.'.
-// Try inserting an identifier before '.'.
-//   Color c = .red;
-//             ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.expect b/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.expect
index 072b755..f609152 100644
--- a/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.expect
+++ b/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.expect
@@ -1,12 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/dot_shorthands/simple_enum.dart:8:13: Error: Expected an identifier, but got '.'.
-// Try inserting an identifier before '.'.
-//   Color c = .red;
-//             ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.modular.expect b/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.modular.expect
index 072b755..f609152 100644
--- a/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.modular.expect
@@ -1,12 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/dot_shorthands/simple_enum.dart:8:13: Error: Expected an identifier, but got '.'.
-// Try inserting an identifier before '.'.
-//   Color c = .red;
-//             ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.transformed.expect b/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.transformed.expect
index 072b755..f609152 100644
--- a/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.transformed.expect
@@ -1,12 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/dot_shorthands/simple_enum.dart:8:13: Error: Expected an identifier, but got '.'.
-// Try inserting an identifier before '.'.
-//   Color c = .red;
-//             ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.expect b/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.expect
index 0849169..be66ea0 100644
--- a/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.expect
+++ b/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.expect
@@ -1,12 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/dot_shorthands/tearoff.dart:6:14: Error: Expected an identifier, but got '.'.
-// Try inserting an identifier before '.'.
-//   Object o = .hash;
-//              ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.modular.expect b/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.modular.expect
index 0849169..be66ea0 100644
--- a/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.modular.expect
@@ -1,12 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/dot_shorthands/tearoff.dart:6:14: Error: Expected an identifier, but got '.'.
-// Try inserting an identifier before '.'.
-//   Object o = .hash;
-//              ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.transformed.expect b/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.transformed.expect
index 0849169..be66ea0 100644
--- a/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.transformed.expect
@@ -1,12 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/dot_shorthands/tearoff.dart:6:14: Error: Expected an identifier, but got '.'.
-// Try inserting an identifier before '.'.
-//   Object o = .hash;
-//              ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/linter/lib/src/rules/strict_top_level_inference.dart b/pkg/linter/lib/src/rules/strict_top_level_inference.dart
index 1b8be78..8008fd9 100644
--- a/pkg/linter/lib/src/rules/strict_top_level_inference.dart
+++ b/pkg/linter/lib/src/rules/strict_top_level_inference.dart
@@ -214,7 +214,9 @@
       );
       if (overriddenMember == null &&
           node.returnType == null &&
-          !container.isReflectiveTest) {
+          (!container.isReflectiveTest ||
+              (!node.name.lexeme.startsWith('test_') &&
+                  !node.name.lexeme.startsWith('solo_test_')))) {
         _report(node.name);
       }
       if (node.parameters case var parameters?) {
diff --git a/pkg/linter/test/rules/strict_top_level_inference_test.dart b/pkg/linter/test/rules/strict_top_level_inference_test.dart
index 3944549..d7843c2 100644
--- a/pkg/linter/test/rules/strict_top_level_inference_test.dart
+++ b/pkg/linter/test/rules/strict_top_level_inference_test.dart
@@ -24,6 +24,25 @@
   @override
   String get lintRule => LintNames.strict_top_level_inference;
 
+  void addReflectiveTestLoaderDep() {
+    // TODO(pq): share setup logic with unreachable_from_main_test
+    var testReflectiveLoaderPath = '$workspaceRootPath/test_reflective_loader';
+    var packageConfigBuilder = PackageConfigFileBuilder();
+    packageConfigBuilder.add(
+      name: 'test_reflective_loader',
+      rootPath: testReflectiveLoaderPath,
+    );
+    writeTestPackageConfig(packageConfigBuilder);
+    newFile('$testReflectiveLoaderPath/lib/test_reflective_loader.dart', r'''
+library test_reflective_loader;
+
+const Object reflectiveTest = _ReflectiveTest();
+class _ReflectiveTest {
+  const _ReflectiveTest();
+}
+''');
+  }
+
   test_constructorParameter_named() async {
     await assertDiagnostics(
       r'''
@@ -683,23 +702,35 @@
 ''');
   }
 
-  test_reflectiveTest() async {
-    // TODO(pq): share setup logic with unreachable_from_main_test
-    var testReflectiveLoaderPath = '$workspaceRootPath/test_reflective_loader';
-    var packageConfigBuilder = PackageConfigFileBuilder();
-    packageConfigBuilder.add(
-      name: 'test_reflective_loader',
-      rootPath: testReflectiveLoaderPath,
-    );
-    writeTestPackageConfig(packageConfigBuilder);
-    newFile('$testReflectiveLoaderPath/lib/test_reflective_loader.dart', r'''
-library test_reflective_loader;
+  test_reflectiveTest_nonTest() async {
+    addReflectiveTestLoaderDep();
+    await assertDiagnostics(
+      r'''
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-const Object reflectiveTest = _ReflectiveTest();
-class _ReflectiveTest {
-  const _ReflectiveTest();
+@reflectiveTest
+class ReflectiveTest {
+  foo() {}
+}
+''',
+      [lint(111, 3)],
+    );
+  }
+
+  test_reflectiveTest_soloTest() async {
+    addReflectiveTestLoaderDep();
+    await assertNoDiagnostics(r'''
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+@reflectiveTest
+class ReflectiveTest {
+  solo_test_foo() {}
 }
 ''');
+  }
+
+  test_reflectiveTest_test() async {
+    addReflectiveTestLoaderDep();
     await assertNoDiagnostics(r'''
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/native_stack_traces/CHANGELOG.md b/pkg/native_stack_traces/CHANGELOG.md
index 01afccd..1ad73eb 100644
--- a/pkg/native_stack_traces/CHANGELOG.md
+++ b/pkg/native_stack_traces/CHANGELOG.md
@@ -1,3 +1,6 @@
+## 0.6.1-wip
+- Update SDK constraint to `^3.5.0`.
+
 ## 0.6.0
 - Make return type of DwarfContainer reader methods nullable so null
   can be returned if there is no relevant DWARF information.
diff --git a/pkg/native_stack_traces/lib/src/convert.dart b/pkg/native_stack_traces/lib/src/convert.dart
index a824160..3a22e98 100644
--- a/pkg/native_stack_traces/lib/src/convert.dart
+++ b/pkg/native_stack_traces/lib/src/convert.dart
@@ -562,12 +562,12 @@
         Dwarf? unitDwarf;
         // Prefer the map that specifies loading unit IDs over the iterable.
         if (_dwarfByUnitId != null) {
-          unitDwarf = _dwarfByUnitId![unitId];
+          unitDwarf = _dwarfByUnitId[unitId];
         }
         if (unitDwarf == null &&
             _unitDwarfs != null &&
             offset.buildId != null) {
-          for (final d in _unitDwarfs!) {
+          for (final d in _unitDwarfs) {
             if (d.buildId(offset.architecture) == offset.buildId) {
               unitDwarf = d;
             }
diff --git a/pkg/native_stack_traces/pubspec.yaml b/pkg/native_stack_traces/pubspec.yaml
index 8b75fa9..4c2ef7b 100644
--- a/pkg/native_stack_traces/pubspec.yaml
+++ b/pkg/native_stack_traces/pubspec.yaml
@@ -1,10 +1,10 @@
 name: native_stack_traces
-version: 0.6.0
+version: 0.6.1-wip
 description: Utilities for working with non-symbolic stack traces.
 repository: https://github.com/dart-lang/sdk/tree/main/pkg/native_stack_traces
 
 environment:
-  sdk: '>=3.0.0 <4.0.0'
+  sdk: ^3.5.0
 
 executables:
   decode:
diff --git a/pkg/record_use/CHANGELOG.md b/pkg/record_use/CHANGELOG.md
index 631d73c..cfd2549 100644
--- a/pkg/record_use/CHANGELOG.md
+++ b/pkg/record_use/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.3.1-wip
+
+- Update SDK constraint to `^3.5.0`.
+
 ## 0.3.0
 
 - Make `InstanceConstant` a `Constant`.
diff --git a/pkg/record_use/pubspec.yaml b/pkg/record_use/pubspec.yaml
index 7633421..043bcdb 100644
--- a/pkg/record_use/pubspec.yaml
+++ b/pkg/record_use/pubspec.yaml
@@ -1,11 +1,11 @@
 name: record_use
 description: >
   The serialization logic and API for the usage recording SDK feature.
-version: 0.3.0
+version: 0.3.1-wip
 repository: https://github.com/dart-lang/sdk/tree/main/pkg/record_use
 
 environment:
-  sdk: ^3.4.0
+  sdk: ^3.5.0
 
 dependencies:
   collection: ^1.18.0
diff --git a/tests/language/dot_shorthands/feature_disabled_error_test.dart b/tests/language/dot_shorthands/feature_disabled_error_test.dart
index 661a814..c1a565c 100644
--- a/tests/language/dot_shorthands/feature_disabled_error_test.dart
+++ b/tests/language/dot_shorthands/feature_disabled_error_test.dart
@@ -12,7 +12,7 @@
   Color color = .blue;
   //            ^
   // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
-  // [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-  // [cfe] Expected an identifier, but got '.'.
   // [cfe] This requires the experimental 'dot-shorthands' language feature to be enabled.
+  //             ^^^^
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER
 }
diff --git a/tests/language/dot_shorthands/feature_enabled_error_test.dart b/tests/language/dot_shorthands/feature_enabled_error_test.dart
index 3f3a5fc..8dee8be 100644
--- a/tests/language/dot_shorthands/feature_enabled_error_test.dart
+++ b/tests/language/dot_shorthands/feature_enabled_error_test.dart
@@ -11,7 +11,7 @@
   Color color = .blue;
   //            ^
   // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
-  // [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-  // [cfe] Expected an identifier, but got '.'.
   // [cfe] This requires the experimental 'dot-shorthands' language feature to be enabled.
+  //             ^^^^
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER
 }
diff --git a/tests/language/explicit_type_instantiation_parsing_test.dart b/tests/language/explicit_type_instantiation_parsing_test.dart
index 85f185d..ddc2a64 100644
--- a/tests/language/explicit_type_instantiation_parsing_test.dart
+++ b/tests/language/explicit_type_instantiation_parsing_test.dart
@@ -249,9 +249,9 @@
   // [cfe] A comparison expression can't be an operand of another comparison expression.
   //  ^
   // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
-  // [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-  // [cfe] Expected an identifier, but got '.'.
   // [cfe] This requires the experimental 'dot-shorthands' language feature to be enabled.
+  //   ^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER
 
   X<2>.any;
   // ^
@@ -259,9 +259,9 @@
   // [cfe] A comparison expression can't be an operand of another comparison expression.
   //  ^
   // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
-  // [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-  // [cfe] Expected an identifier, but got '.'.
   // [cfe] This requires the experimental 'dot-shorthands' language feature to be enabled.
+  //   ^^^
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER
 
   // This would be invalid even if `X` had an `any` member. See next.
   X<X>.any; // Invalid, Class does not have any static `any` member.
diff --git a/tools/VERSION b/tools/VERSION
index 23200c0..2c090d5 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 3
 MINOR 8
 PATCH 0
-PRERELEASE 150
+PRERELEASE 151
 PRERELEASE_PATCH 0