diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_var.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_var.dart
index 270bb86..cd226a8 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_var.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_var.dart
@@ -45,7 +45,11 @@
         if (initializer is TypedLiteral) {
           if (initializer.typeArguments == null) {
             typeArgumentsText = utils.getNodeText(type.typeArguments);
-            typeArgumentsOffset = initializer.offset;
+            if (initializer is ListLiteral) {
+              typeArgumentsOffset = initializer.leftBracket.offset;
+            } else if (initializer is SetOrMapLiteral) {
+              typeArgumentsOffset = initializer.leftBracket.offset;
+            }
           }
         } else if (initializer is InstanceCreationExpression) {
           if (initializer.constructorName.type.typeArguments == null) {
diff --git a/pkg/analysis_server/lib/src/services/flutter/property.dart b/pkg/analysis_server/lib/src/services/flutter/property.dart
index 740ff85..ba6509a 100644
--- a/pkg/analysis_server/lib/src/services/flutter/property.dart
+++ b/pkg/analysis_server/lib/src/services/flutter/property.dart
@@ -24,7 +24,7 @@
 
 String getParameterDocumentation(ParameterElement parameter) {
   if (parameter is FieldFormalParameterElement) {
-    var rawComment = parameter.field.documentationComment;
+    var rawComment = parameter.field?.documentationComment;
     return getDartDocPlainText(rawComment);
   }
   return null;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_var_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_var_test.dart
index 4d4ad88..3e8258f 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_var_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_var_test.dart
@@ -123,6 +123,21 @@
 ''');
   }
 
+  Future<void> test_generic_listLiteral_const() async {
+    await resolveTestUnit('''
+String f() {
+  const List<String> values = const ['a'];
+  return values[0];
+}
+''');
+    await assertHasFix('''
+String f() {
+  const values = const <String>['a'];
+  return values[0];
+}
+''');
+  }
+
   Future<void> test_generic_mapLiteral() async {
     await resolveTestUnit('''
 Map f() {
@@ -138,6 +153,21 @@
 ''');
   }
 
+  Future<void> test_generic_mapLiteral_const() async {
+    await resolveTestUnit('''
+Map f() {
+  const Map<String, int> m = const {};
+  return m;
+}
+''');
+    await assertHasFix('''
+Map f() {
+  const m = const <String, int>{};
+  return m;
+}
+''');
+  }
+
   Future<void> test_generic_setLiteral() async {
     await resolveTestUnit('''
 Set f() {
@@ -163,6 +193,21 @@
     await assertNoFix();
   }
 
+  Future<void> test_generic_setLiteral_const() async {
+    await resolveTestUnit('''
+String f() {
+  const Set<String> s = const {'a'};
+  return s.first;
+}
+''');
+    await assertHasFix('''
+String f() {
+  const s = const <String>{'a'};
+  return s.first;
+}
+''');
+  }
+
   Future<void> test_simple() async {
     await resolveTestUnit('''
 String f() {
diff --git a/pkg/analysis_server/test/src/services/flutter/widget_descriptions_test.dart b/pkg/analysis_server/test/src/services/flutter/widget_descriptions_test.dart
index 4fcb4b3..dc0567d 100644
--- a/pkg/analysis_server/test/src/services/flutter/widget_descriptions_test.dart
+++ b/pkg/analysis_server/test/src/services/flutter/widget_descriptions_test.dart
@@ -17,6 +17,37 @@
 
 @reflectiveTest
 class GetDescriptionTest extends WidgetDescriptionBase {
+  Future<void> test_documentation_fieldFormalParameter() async {
+    await resolveTestUnit('''
+class MyWidget {
+  /// my doc
+  final int f;
+  MyWidget(this.f);
+}
+
+void f() {
+  MyWidget(0);
+}
+''');
+    var property = await getWidgetProperty('MyWidget(0', 'f');
+    expect(property.documentation, 'my doc');
+  }
+
+  Future<void> test_documentation_fieldFormalParameter_unresolvedField() async {
+    verifyNoTestUnitErrors = false;
+    await resolveTestUnit('''
+class MyWidget {
+  MyWidget(this.f);
+}
+
+void f() {
+  MyWidget(0);
+}
+''');
+    var property = await getWidgetProperty('MyWidget(0', 'f');
+    expect(property.documentation, isNull);
+  }
+
   Future<void> test_kind_named_notSet() async {
     await resolveTestUnit('''
 import 'package:flutter/material.dart';
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 36a2ff1..462daf1 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -85,7 +85,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 114;
+  static const int DATA_VERSION = 112;
 
   /// The length of the list returned by [_computeDeclaredVariablesSignature].
   static const int _declaredVariablesSignatureLength = 4;
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index df5d425..990cac0 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -42,7 +42,6 @@
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
 import 'package:analyzer/src/summary/idl.dart';
-import 'package:analyzer/src/summary2/lazy_ast.dart';
 import 'package:analyzer/src/summary2/linked_unit_context.dart';
 import 'package:analyzer/src/summary2/reference.dart';
 import 'package:analyzer/src/util/comment.dart';
@@ -501,7 +500,6 @@
 
     if (linkedNode != null) {
       if (linkedNode is ClassOrMixinDeclaration) {
-        LazyAst.applyResolution(linkedNode);
         _createPropertiesAndAccessors();
         assert(_accessors != null);
         return _accessors;
@@ -546,7 +544,6 @@
     }
 
     if (linkedNode != null) {
-      LazyAst.applyResolution(linkedNode);
       var context = enclosingUnit.linkedContext;
       var containerRef = reference.getChild('@constructor');
       _constructors = context.getConstructors(linkedNode).map((node) {
@@ -608,7 +605,6 @@
 
     if (linkedNode != null) {
       if (linkedNode is ClassOrMixinDeclaration) {
-        LazyAst.applyResolution(linkedNode);
         _createPropertiesAndAccessors();
         assert(_fields != null);
         return _fields;
@@ -709,7 +705,6 @@
     }
 
     if (linkedNode != null) {
-      LazyAst.applyResolution(linkedNode);
       var context = enclosingUnit.linkedContext;
       var implementsClause = context.getImplementsClause(linkedNode);
       if (implementsClause != null) {
@@ -785,7 +780,6 @@
     }
 
     if (linkedNode != null) {
-      LazyAst.applyResolution(linkedNode);
       var context = enclosingUnit.linkedContext;
       var containerRef = reference.getChild('@method');
       return _methods = context
@@ -822,7 +816,6 @@
     }
 
     if (linkedNode != null) {
-      LazyAst.applyResolution(linkedNode);
       var context = enclosingUnit.linkedContext;
       var withClause = context.getWithClause(linkedNode);
       if (withClause != null) {
@@ -872,18 +865,7 @@
     }
 
     if (linkedNode != null) {
-      var node = linkedNode;
-      LazyAst.applyResolution(node);
-
-      DartType type;
-      if (node is ClassDeclaration) {
-        type = node.extendsClause?.superclass?.type;
-      } else if (node is ClassTypeAlias) {
-        type = linkedContext.getSuperclass(linkedNode)?.type;
-      } else {
-        throw UnimplementedError('${node.runtimeType}');
-      }
-
+      var type = linkedContext.getSuperclass(linkedNode)?.type;
       if (_isInterfaceTypeClass(type)) {
         return _supertype = type;
       }
@@ -1982,9 +1964,9 @@
     if (_constantInitializers != null) return _constantInitializers;
 
     if (linkedNode != null) {
-      var node = linkedNode as ConstructorDeclaration;
-      LazyAst.applyResolution(node);
-      return _constantInitializers = node.initializers;
+      return _constantInitializers = linkedContext.getConstructorInitializers(
+        linkedNode,
+      );
     }
 
     return _constantInitializers;
@@ -2098,13 +2080,13 @@
     if (_redirectedConstructor != null) return _redirectedConstructor;
 
     if (linkedNode != null) {
-      var node = linkedNode as ConstructorDeclaration;
-      LazyAst.applyResolution(node);
+      var context = enclosingUnit.linkedContext;
       if (isFactory) {
-        return _redirectedConstructor =
-            node.redirectedConstructor?.staticElement;
+        var node = context.getConstructorRedirected(linkedNode);
+        return _redirectedConstructor = node?.staticElement;
       } else {
-        for (var initializer in node.initializers) {
+        var initializers = context.getConstructorInitializers(linkedNode);
+        for (var initializer in initializers) {
           if (initializer is RedirectingConstructorInvocation) {
             return _redirectedConstructor = initializer.staticElement;
           }
@@ -2232,7 +2214,6 @@
     if (_constantInitializer != null) return _constantInitializer;
 
     if (linkedNode != null) {
-      LazyAst.applyResolution(linkedNode);
       var context = enclosingUnit.linkedContext;
       return _constantInitializer = context.readInitializer(linkedNode);
     }
@@ -3001,10 +2982,8 @@
 
   @override
   List<ElementAnnotation> get metadata {
-    if (_metadata != null) return _metadata;
-
     if (linkedNode != null) {
-      LazyAst.applyResolution(linkedNode);
+      if (_metadata != null) return _metadata;
       var metadata = linkedContext.getMetadata(linkedNode);
       return _metadata = _buildAnnotations2(enclosingUnit, metadata);
     }
@@ -3510,9 +3489,6 @@
   ConstructorElement getNamedConstructor(String name) => null;
 
   void _resynthesizeMembers2() {
-    var node = linkedNode as EnumDeclaration;
-    LazyAst.applyResolution(node);
-
     var fields = <FieldElementImpl>[];
     var getters = <PropertyAccessorElementImpl>[];
 
@@ -3540,7 +3516,7 @@
 
     // Build fields for all enum constants.
     var containerRef = reference.getChild('@constant');
-    var constants = node.constants;
+    var constants = linkedContext.getEnumConstants(linkedNode);
     for (var i = 0; i < constants.length; ++i) {
       var constant = constants[i];
       var name = constant.name.name;
@@ -3725,11 +3701,10 @@
     if (_parameters != null) return _parameters;
 
     if (linkedNode != null) {
-      LazyAst.applyResolution(linkedNode);
       var context = enclosingUnit.linkedContext;
       var containerRef = reference.getChild('@parameter');
       var formalParameters = context.getFormalParameters(linkedNode);
-      return _parameters = ParameterElementImpl.forLinkedNodeList(
+      _parameters = ParameterElementImpl.forLinkedNodeList(
         this,
         context,
         containerRef,
@@ -3764,7 +3739,6 @@
     if (_returnType != null) return _returnType;
 
     if (linkedNode != null) {
-      LazyAst.applyResolution(linkedNode);
       var context = enclosingUnit.linkedContext;
       return _returnType = context.getReturnType(linkedNode);
     }
@@ -3953,7 +3927,6 @@
 
     if (linkedNode != null) {
       if (linkedNode is ExtensionDeclaration) {
-        LazyAst.applyResolution(linkedNode);
         _createPropertiesAndAccessors();
         assert(_accessors != null);
         return _accessors;
@@ -4013,9 +3986,7 @@
     if (_extendedType != null) return _extendedType;
 
     if (linkedNode != null) {
-      var node = linkedNode as ExtensionDeclaration;
-      LazyAst.applyResolution(linkedNode);
-      return _extendedType = node.extendedType.type;
+      return _extendedType = linkedContext.getExtendedType(linkedNode).type;
     }
 
     return _extendedType;
@@ -4029,7 +4000,6 @@
 
     if (linkedNode != null) {
       if (linkedNode is ExtensionDeclaration) {
-        LazyAst.applyResolution(linkedNode);
         _createPropertiesAndAccessors();
         assert(_fields != null);
         return _fields;
@@ -4069,7 +4039,6 @@
     }
 
     if (linkedNode != null) {
-      LazyAst.applyResolution(linkedNode);
       var context = enclosingUnit.linkedContext;
       var containerRef = reference.getChild('@method');
       return _methods = context
@@ -4535,17 +4504,15 @@
   GenericFunctionTypeElementImpl get function {
     if (_function != null) return _function;
 
-    var node = linkedNode;
-    if (node != null) {
-      LazyAst.applyResolution(node);
-      if (node is GenericTypeAlias) {
-        var function = node.functionType;
+    if (linkedNode != null) {
+      if (linkedNode is GenericTypeAlias) {
+        var context = enclosingUnit.linkedContext;
+        var function = context.getGeneticTypeAliasFunction(linkedNode);
         if (function != null) {
-          return _function = GenericFunctionTypeElementImpl.forLinkedNode(
-            this,
-            reference.getChild('@function'),
-            function,
-          );
+          var reference = context.getGenericFunctionTypeReference(function);
+          _function = reference.element;
+          encloseElement(_function);
+          return _function;
         } else {
           return _function = GenericFunctionTypeElementImpl.forOffset(-1)
             ..typeParameters = const <TypeParameterElement>[]
@@ -4740,20 +4707,17 @@
 
   @override
   List<ParameterElement> get parameters {
-    if (_parameters != null) return _parameters;
-
-    if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
-      var containerRef = reference.getChild('@parameter');
-      var formalParameters = context.getFormalParameters(linkedNode);
-      return _parameters = ParameterElementImpl.forLinkedNodeList(
-        this,
-        context,
-        containerRef,
-        formalParameters,
-      );
+    if (_parameters == null) {
+      if (linkedNode != null) {
+        var context = enclosingUnit.linkedContext;
+        return _parameters = ParameterElementImpl.forLinkedNodeList(
+          this,
+          context,
+          reference.getChild('@parameter'),
+          context.getFormalParameters(linkedNode),
+        );
+      }
     }
-
     return _parameters ?? const <ParameterElement>[];
   }
 
@@ -5873,10 +5837,8 @@
     if (_superclassConstraints != null) return _superclassConstraints;
 
     if (linkedNode != null) {
-      var node = linkedNode as MixinDeclaration;
-      LazyAst.applyResolution(node);
       List<InterfaceType> constraints;
-      var onClause = node.onClause;
+      var onClause = enclosingUnit.linkedContext.getOnClause(linkedNode);
       if (onClause != null) {
         constraints = onClause.superclassConstraints
             .map((node) => node.type)
@@ -6570,14 +6532,18 @@
 
     if (linkedNode != null) {
       var context = enclosingUnit.linkedContext;
-      var containerRef = reference.getChild('@parameter');
       var formalParameters = context.getFormalParameters(linkedNode);
-      return _parameters = ParameterElementImpl.forLinkedNodeList(
-        this,
-        context,
-        containerRef,
-        formalParameters,
-      );
+      if (formalParameters != null) {
+        var containerRef = reference.getChild('@parameter');
+        return _parameters = ParameterElementImpl.forLinkedNodeList(
+          this,
+          context,
+          containerRef,
+          formalParameters,
+        );
+      } else {
+        return _parameters ??= const <ParameterElement>[];
+      }
     }
 
     return _parameters ??= const <ParameterElement>[];
@@ -6597,9 +6563,8 @@
 
   @override
   DartType get typeInternal {
-    if (_type != null) return _type;
-
     if (linkedNode != null) {
+      if (_type != null) return _type;
       var context = enclosingUnit.linkedContext;
       return _type = context.getType(linkedNode);
     }
@@ -6611,7 +6576,7 @@
     if (_typeParameters != null) return _typeParameters;
 
     if (linkedNode != null) {
-      var typeParameters = linkedContext.getTypeParameters(linkedNode);
+      var typeParameters = linkedContext.getTypeParameters2(linkedNode);
       if (typeParameters == null) {
         return _typeParameters = const [];
       }
@@ -7192,7 +7157,6 @@
   DartType get typeInternal {
     if (linkedNode != null) {
       if (_type != null) return _type;
-      LazyAst.applyResolution(linkedNode);
       _type = linkedContext.getType(linkedNode);
 
       // While performing inference during linking, the first step is to collect
@@ -7426,8 +7390,8 @@
     if (_bound != null) return _bound;
 
     if (linkedNode != null) {
-      var node = linkedNode as TypeParameter;
-      return _bound = node.bound?.type;
+      var context = enclosingUnit.linkedContext;
+      return _bound = context.getTypeParameterBound(linkedNode)?.type;
     }
 
     return _bound;
@@ -7561,19 +7525,13 @@
     if (_typeParameterElements != null) return _typeParameterElements;
 
     if (linkedNode != null) {
-      LazyAst.applyResolution(linkedNode);
-      var typeParameters = linkedContext.getTypeParameters(linkedNode);
+      var typeParameters = linkedContext.getTypeParameters2(linkedNode);
       if (typeParameters == null) {
         return _typeParameterElements = const [];
       }
       var containerRef = reference.getChild('@typeParameter');
       return _typeParameterElements =
           typeParameters.typeParameters.map<TypeParameterElement>((node) {
-        var element = node.declaredElement;
-        if (element != null) {
-          return element;
-        }
-
         var reference = containerRef.getChild(node.name.name);
         if (reference.hasElementFor(node)) {
           return reference.element as TypeParameterElement;
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 6952f8f..db5240f 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -242,6 +242,7 @@
       for (var entry in member._substitution.map.entries) {
         map[entry.key] = substitution.substituteType(entry.value);
       }
+      map.addAll(substitution.map);
       combined = Substitution.fromMap(map);
     } else {
       typeProvider = element.library.typeProvider;
diff --git a/pkg/analyzer/lib/src/dart/element/type_system.dart b/pkg/analyzer/lib/src/dart/element/type_system.dart
index dae7afe..c38172a 100644
--- a/pkg/analyzer/lib/src/dart/element/type_system.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_system.dart
@@ -1230,19 +1230,6 @@
       typeParameters,
       considerExtendsClause: false,
     );
-
-    // It is an error to use a generic function type as a bound.
-    // What is worse, inference does not do anything to their type formals.
-    // So, we might be left with bounds of their type formals not replaced.
-    // Then we cannot store this linked information, because it references
-    // types that are not in scope.
-    for (var i = 0; i < inferredTypes.length; i++) {
-      var inferredType = inferredTypes[i];
-      if (inferredType is FunctionType && inferredType.typeFormals.isNotEmpty) {
-        inferredTypes[i] = DynamicTypeImpl.instance;
-      }
-    }
-
     var substitution = Substitution.fromPairs(typeParameters, inferredTypes);
 
     for (int i = 0; i < srcTypes.length; i++) {
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 8e39f8f..ba0c30b 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -721,8 +721,6 @@
               identifier, functionExpression.parameters);
         }
         _checkForNonVoidReturnTypeForSetter(returnType);
-        _checkForInvalidModifierOnBody(node.functionExpression.body,
-            CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER);
       }
       _checkForTypeAnnotationDeferredClass(returnType);
       _returnTypeVerifier.verifyReturnType(returnType);
@@ -916,8 +914,6 @@
         ).checkGetter(node.name, node.declaredElement);
       }
       if (node.isSetter) {
-        _checkForInvalidModifierOnBody(
-            node.body, CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER);
         _checkForWrongNumberOfParametersForSetter(node.name, node.parameters);
         _checkForNonVoidReturnTypeForSetter(returnType);
       } else if (node.isOperator) {
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index 74266ee..cddf91d 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -4449,7 +4449,10 @@
   List<LinkedNodeBuilder> _variantField_4;
   LinkedNodeBuilder _variantField_6;
   LinkedNodeBuilder _variantField_7;
+  int _variantField_17;
   LinkedNodeBuilder _variantField_8;
+  LinkedNodeTypeSubstitutionBuilder _variantField_38;
+  int _variantField_15;
   idl.UnlinkedTokenType _variantField_28;
   bool _variantField_27;
   LinkedNodeBuilder _variantField_9;
@@ -4459,17 +4462,15 @@
   List<String> _variantField_33;
   idl.LinkedNodeCommentType _variantField_29;
   List<LinkedNodeBuilder> _variantField_3;
-  List<int> _variantField_19;
-  LinkedLibraryLanguageVersionBuilder _variantField_39;
+  List<int> _variantField_41;
+  LinkedLibraryLanguageVersionBuilder _variantField_40;
   LinkedNodeBuilder _variantField_10;
   idl.LinkedNodeFormalParameterKind _variantField_26;
   double _variantField_21;
-  int _variantField_15;
   LinkedNodeTypeBuilder _variantField_25;
   String _variantField_20;
-  List<LinkedNodeTypeBuilder> _variantField_38;
+  List<LinkedNodeTypeBuilder> _variantField_39;
   int _flags;
-  int _variantField_17;
   String _variantField_1;
   int _variantField_36;
   int _variantField_16;
@@ -4478,13 +4479,13 @@
   idl.LinkedNodeKind _kind;
   bool _variantField_31;
   List<String> _variantField_34;
-  String _variantField_37;
-  LinkedNodeResolutionBuilder _resolution;
+  String _name;
   idl.UnlinkedTokenType _variantField_35;
   TopLevelInferenceErrorBuilder _variantField_32;
   LinkedNodeTypeBuilder _variantField_23;
   LinkedNodeBuilder _variantField_11;
   String _variantField_22;
+  int _variantField_19;
 
   @override
   LinkedNodeTypeBuilder get actualReturnType {
@@ -4498,8 +4499,7 @@
 
   @override
   LinkedNodeTypeBuilder get actualType {
-    assert(kind == idl.LinkedNodeKind.defaultFormalParameter ||
-        kind == idl.LinkedNodeKind.fieldFormalParameter ||
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
         kind == idl.LinkedNodeKind.simpleFormalParameter ||
         kind == idl.LinkedNodeKind.variableDeclaration);
@@ -4536,8 +4536,7 @@
   }
 
   set actualType(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.defaultFormalParameter ||
-        kind == idl.LinkedNodeKind.fieldFormalParameter ||
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
         kind == idl.LinkedNodeKind.simpleFormalParameter ||
         kind == idl.LinkedNodeKind.variableDeclaration);
@@ -6306,6 +6305,30 @@
   }
 
   @override
+  int get annotation_element {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get genericFunctionType_id {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    return _variantField_17 ??= 0;
+  }
+
+  set annotation_element(int value) {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set genericFunctionType_id(int value) {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  @override
   LinkedNodeBuilder get annotation_name {
     assert(kind == idl.LinkedNodeKind.annotation);
     return _variantField_8;
@@ -6493,6 +6516,277 @@
   }
 
   @override
+  LinkedNodeTypeSubstitutionBuilder get annotation_substitution {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    return _variantField_38;
+  }
+
+  @override
+  LinkedNodeTypeSubstitutionBuilder get assignmentExpression_substitution {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    return _variantField_38;
+  }
+
+  @override
+  LinkedNodeTypeSubstitutionBuilder get binaryExpression_substitution {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    return _variantField_38;
+  }
+
+  @override
+  LinkedNodeTypeSubstitutionBuilder get constructorName_substitution {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    return _variantField_38;
+  }
+
+  @override
+  LinkedNodeTypeSubstitutionBuilder get indexExpression_substitution {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    return _variantField_38;
+  }
+
+  @override
+  LinkedNodeTypeSubstitutionBuilder get postfixExpression_substitution {
+    assert(kind == idl.LinkedNodeKind.postfixExpression);
+    return _variantField_38;
+  }
+
+  @override
+  LinkedNodeTypeSubstitutionBuilder get prefixExpression_substitution {
+    assert(kind == idl.LinkedNodeKind.prefixExpression);
+    return _variantField_38;
+  }
+
+  @override
+  LinkedNodeTypeSubstitutionBuilder
+      get redirectingConstructorInvocation_substitution {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    return _variantField_38;
+  }
+
+  @override
+  LinkedNodeTypeSubstitutionBuilder get simpleIdentifier_substitution {
+    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
+    return _variantField_38;
+  }
+
+  @override
+  LinkedNodeTypeSubstitutionBuilder
+      get superConstructorInvocation_substitution {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    return _variantField_38;
+  }
+
+  set annotation_substitution(LinkedNodeTypeSubstitutionBuilder value) {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    _variantField_38 = value;
+  }
+
+  set assignmentExpression_substitution(
+      LinkedNodeTypeSubstitutionBuilder value) {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    _variantField_38 = value;
+  }
+
+  set binaryExpression_substitution(LinkedNodeTypeSubstitutionBuilder value) {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    _variantField_38 = value;
+  }
+
+  set constructorName_substitution(LinkedNodeTypeSubstitutionBuilder value) {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    _variantField_38 = value;
+  }
+
+  set indexExpression_substitution(LinkedNodeTypeSubstitutionBuilder value) {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    _variantField_38 = value;
+  }
+
+  set postfixExpression_substitution(LinkedNodeTypeSubstitutionBuilder value) {
+    assert(kind == idl.LinkedNodeKind.postfixExpression);
+    _variantField_38 = value;
+  }
+
+  set prefixExpression_substitution(LinkedNodeTypeSubstitutionBuilder value) {
+    assert(kind == idl.LinkedNodeKind.prefixExpression);
+    _variantField_38 = value;
+  }
+
+  set redirectingConstructorInvocation_substitution(
+      LinkedNodeTypeSubstitutionBuilder value) {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    _variantField_38 = value;
+  }
+
+  set simpleIdentifier_substitution(LinkedNodeTypeSubstitutionBuilder value) {
+    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
+    _variantField_38 = value;
+  }
+
+  set superConstructorInvocation_substitution(
+      LinkedNodeTypeSubstitutionBuilder value) {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    _variantField_38 = value;
+  }
+
+  @override
+  int get assignmentExpression_element {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get binaryExpression_element {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get constructorName_element {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get emptyFunctionBody_fake {
+    assert(kind == idl.LinkedNodeKind.emptyFunctionBody);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get emptyStatement_fake {
+    assert(kind == idl.LinkedNodeKind.emptyStatement);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get indexExpression_element {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get nullLiteral_fake {
+    assert(kind == idl.LinkedNodeKind.nullLiteral);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get postfixExpression_element {
+    assert(kind == idl.LinkedNodeKind.postfixExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get prefixExpression_element {
+    assert(kind == idl.LinkedNodeKind.prefixExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get redirectingConstructorInvocation_element {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get simpleIdentifier_element {
+    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get superConstructorInvocation_element {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get typeParameter_variance {
+    assert(kind == idl.LinkedNodeKind.typeParameter);
+    return _variantField_15 ??= 0;
+  }
+
+  set assignmentExpression_element(int value) {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  set binaryExpression_element(int value) {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  set constructorName_element(int value) {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  set emptyFunctionBody_fake(int value) {
+    assert(kind == idl.LinkedNodeKind.emptyFunctionBody);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  set emptyStatement_fake(int value) {
+    assert(kind == idl.LinkedNodeKind.emptyStatement);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  set indexExpression_element(int value) {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  set nullLiteral_fake(int value) {
+    assert(kind == idl.LinkedNodeKind.nullLiteral);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  set postfixExpression_element(int value) {
+    assert(kind == idl.LinkedNodeKind.postfixExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  set prefixExpression_element(int value) {
+    assert(kind == idl.LinkedNodeKind.prefixExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  set redirectingConstructorInvocation_element(int value) {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  set simpleIdentifier_element(int value) {
+    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  set superConstructorInvocation_element(int value) {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  set typeParameter_variance(int value) {
+    assert(kind == idl.LinkedNodeKind.typeParameter);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  @override
   idl.UnlinkedTokenType get assignmentExpression_operator {
     assert(kind == idl.LinkedNodeKind.assignmentExpression);
     return _variantField_28 ??= idl.UnlinkedTokenType.NOTHING;
@@ -6814,26 +7108,26 @@
   @override
   List<int> get compilationUnit_featureSet {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
-    return _variantField_19 ??= <int>[];
+    return _variantField_41 ??= <int>[];
   }
 
   set compilationUnit_featureSet(List<int> value) {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
     assert(value == null || value.every((e) => e >= 0));
-    _variantField_19 = value;
+    _variantField_41 = value;
   }
 
   @override
   LinkedLibraryLanguageVersionBuilder get compilationUnit_languageVersion {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
-    return _variantField_39;
+    return _variantField_40;
   }
 
   /// The language version information.
   set compilationUnit_languageVersion(
       LinkedLibraryLanguageVersionBuilder value) {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
-    _variantField_39 = value;
+    _variantField_40 = value;
   }
 
   @override
@@ -6871,60 +7165,11 @@
   }
 
   @override
-  int get emptyFunctionBody_fake {
-    assert(kind == idl.LinkedNodeKind.emptyFunctionBody);
-    return _variantField_15 ??= 0;
-  }
-
-  @override
-  int get emptyStatement_fake {
-    assert(kind == idl.LinkedNodeKind.emptyStatement);
-    return _variantField_15 ??= 0;
-  }
-
-  @override
-  int get nullLiteral_fake {
-    assert(kind == idl.LinkedNodeKind.nullLiteral);
-    return _variantField_15 ??= 0;
-  }
-
-  @override
-  int get typeParameter_variance {
-    assert(kind == idl.LinkedNodeKind.typeParameter);
-    return _variantField_15 ??= 0;
-  }
-
-  set emptyFunctionBody_fake(int value) {
-    assert(kind == idl.LinkedNodeKind.emptyFunctionBody);
-    assert(value == null || value >= 0);
-    _variantField_15 = value;
-  }
-
-  set emptyStatement_fake(int value) {
-    assert(kind == idl.LinkedNodeKind.emptyStatement);
-    assert(value == null || value >= 0);
-    _variantField_15 = value;
-  }
-
-  set nullLiteral_fake(int value) {
-    assert(kind == idl.LinkedNodeKind.nullLiteral);
-    assert(value == null || value >= 0);
-    _variantField_15 = value;
-  }
-
-  set typeParameter_variance(int value) {
-    assert(kind == idl.LinkedNodeKind.typeParameter);
-    assert(value == null || value >= 0);
-    _variantField_15 = value;
-  }
-
-  @override
   LinkedNodeTypeBuilder get expression_type {
     assert(kind == idl.LinkedNodeKind.assignmentExpression ||
         kind == idl.LinkedNodeKind.asExpression ||
         kind == idl.LinkedNodeKind.awaitExpression ||
         kind == idl.LinkedNodeKind.binaryExpression ||
-        kind == idl.LinkedNodeKind.booleanLiteral ||
         kind == idl.LinkedNodeKind.cascadeExpression ||
         kind == idl.LinkedNodeKind.conditionalExpression ||
         kind == idl.LinkedNodeKind.functionExpressionInvocation ||
@@ -6941,6 +7186,7 @@
         kind == idl.LinkedNodeKind.postfixExpression ||
         kind == idl.LinkedNodeKind.rethrowExpression ||
         kind == idl.LinkedNodeKind.setOrMapLiteral ||
+        kind == idl.LinkedNodeKind.simpleIdentifier ||
         kind == idl.LinkedNodeKind.superExpression ||
         kind == idl.LinkedNodeKind.symbolLiteral ||
         kind == idl.LinkedNodeKind.thisExpression ||
@@ -6959,7 +7205,6 @@
         kind == idl.LinkedNodeKind.asExpression ||
         kind == idl.LinkedNodeKind.awaitExpression ||
         kind == idl.LinkedNodeKind.binaryExpression ||
-        kind == idl.LinkedNodeKind.booleanLiteral ||
         kind == idl.LinkedNodeKind.cascadeExpression ||
         kind == idl.LinkedNodeKind.conditionalExpression ||
         kind == idl.LinkedNodeKind.functionExpressionInvocation ||
@@ -6976,6 +7221,7 @@
         kind == idl.LinkedNodeKind.postfixExpression ||
         kind == idl.LinkedNodeKind.rethrowExpression ||
         kind == idl.LinkedNodeKind.setOrMapLiteral ||
+        kind == idl.LinkedNodeKind.simpleIdentifier ||
         kind == idl.LinkedNodeKind.superExpression ||
         kind == idl.LinkedNodeKind.symbolLiteral ||
         kind == idl.LinkedNodeKind.thisExpression ||
@@ -7026,12 +7272,12 @@
   @override
   List<LinkedNodeTypeBuilder> get extensionOverride_typeArgumentTypes {
     assert(kind == idl.LinkedNodeKind.extensionOverride);
-    return _variantField_38 ??= <LinkedNodeTypeBuilder>[];
+    return _variantField_39 ??= <LinkedNodeTypeBuilder>[];
   }
 
   set extensionOverride_typeArgumentTypes(List<LinkedNodeTypeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.extensionOverride);
-    _variantField_38 = value;
+    _variantField_39 = value;
   }
 
   @override
@@ -7043,18 +7289,6 @@
   }
 
   @override
-  int get genericFunctionType_id {
-    assert(kind == idl.LinkedNodeKind.genericFunctionType);
-    return _variantField_17 ??= 0;
-  }
-
-  set genericFunctionType_id(int value) {
-    assert(kind == idl.LinkedNodeKind.genericFunctionType);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  @override
   String get importDirective_prefix {
     assert(kind == idl.LinkedNodeKind.importDirective);
     return _variantField_1 ??= '';
@@ -7249,53 +7483,10 @@
   }
 
   @override
-  String get name {
-    assert(kind == idl.LinkedNodeKind.classDeclaration ||
-        kind == idl.LinkedNodeKind.classTypeAlias ||
-        kind == idl.LinkedNodeKind.constructorDeclaration ||
-        kind == idl.LinkedNodeKind.enumDeclaration ||
-        kind == idl.LinkedNodeKind.enumConstantDeclaration ||
-        kind == idl.LinkedNodeKind.extensionDeclaration ||
-        kind == idl.LinkedNodeKind.fieldFormalParameter ||
-        kind == idl.LinkedNodeKind.functionDeclaration ||
-        kind == idl.LinkedNodeKind.functionTypeAlias ||
-        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
-        kind == idl.LinkedNodeKind.genericTypeAlias ||
-        kind == idl.LinkedNodeKind.methodDeclaration ||
-        kind == idl.LinkedNodeKind.mixinDeclaration ||
-        kind == idl.LinkedNodeKind.simpleFormalParameter ||
-        kind == idl.LinkedNodeKind.simpleIdentifier ||
-        kind == idl.LinkedNodeKind.typeParameter ||
-        kind == idl.LinkedNodeKind.variableDeclaration);
-    return _variantField_37 ??= '';
-  }
+  String get name => _name ??= '';
 
   set name(String value) {
-    assert(kind == idl.LinkedNodeKind.classDeclaration ||
-        kind == idl.LinkedNodeKind.classTypeAlias ||
-        kind == idl.LinkedNodeKind.constructorDeclaration ||
-        kind == idl.LinkedNodeKind.enumDeclaration ||
-        kind == idl.LinkedNodeKind.enumConstantDeclaration ||
-        kind == idl.LinkedNodeKind.extensionDeclaration ||
-        kind == idl.LinkedNodeKind.fieldFormalParameter ||
-        kind == idl.LinkedNodeKind.functionDeclaration ||
-        kind == idl.LinkedNodeKind.functionTypeAlias ||
-        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
-        kind == idl.LinkedNodeKind.genericTypeAlias ||
-        kind == idl.LinkedNodeKind.methodDeclaration ||
-        kind == idl.LinkedNodeKind.mixinDeclaration ||
-        kind == idl.LinkedNodeKind.simpleFormalParameter ||
-        kind == idl.LinkedNodeKind.simpleIdentifier ||
-        kind == idl.LinkedNodeKind.typeParameter ||
-        kind == idl.LinkedNodeKind.variableDeclaration);
-    _variantField_37 = value;
-  }
-
-  @override
-  LinkedNodeResolutionBuilder get resolution => _resolution;
-
-  set resolution(LinkedNodeResolutionBuilder value) {
-    this._resolution = value;
+    this._name = value;
   }
 
   @override
@@ -7372,6 +7563,22 @@
     _variantField_22 = value;
   }
 
+  @override
+  int get uriBasedDirective_uriElement {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.partDirective);
+    return _variantField_19 ??= 0;
+  }
+
+  set uriBasedDirective_uriElement(int value) {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.partDirective);
+    assert(value == null || value >= 0);
+    _variantField_19 = value;
+  }
+
   LinkedNodeBuilder.adjacentStrings({
     List<LinkedNodeBuilder> adjacentStrings_strings,
   })  : _kind = idl.LinkedNodeKind.adjacentStrings,
@@ -7380,11 +7587,15 @@
   LinkedNodeBuilder.annotation({
     LinkedNodeBuilder annotation_arguments,
     LinkedNodeBuilder annotation_constructorName,
+    int annotation_element,
     LinkedNodeBuilder annotation_name,
+    LinkedNodeTypeSubstitutionBuilder annotation_substitution,
   })  : _kind = idl.LinkedNodeKind.annotation,
         _variantField_6 = annotation_arguments,
         _variantField_7 = annotation_constructorName,
-        _variantField_8 = annotation_name;
+        _variantField_17 = annotation_element,
+        _variantField_8 = annotation_name,
+        _variantField_38 = annotation_substitution;
 
   LinkedNodeBuilder.argumentList({
     List<LinkedNodeBuilder> argumentList_arguments,
@@ -7417,11 +7628,15 @@
   LinkedNodeBuilder.assignmentExpression({
     LinkedNodeBuilder assignmentExpression_leftHandSide,
     LinkedNodeBuilder assignmentExpression_rightHandSide,
+    LinkedNodeTypeSubstitutionBuilder assignmentExpression_substitution,
+    int assignmentExpression_element,
     idl.UnlinkedTokenType assignmentExpression_operator,
     LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.assignmentExpression,
         _variantField_6 = assignmentExpression_leftHandSide,
         _variantField_7 = assignmentExpression_rightHandSide,
+        _variantField_38 = assignmentExpression_substitution,
+        _variantField_15 = assignmentExpression_element,
         _variantField_28 = assignmentExpression_operator,
         _variantField_25 = expression_type;
 
@@ -7436,12 +7651,16 @@
     LinkedNodeTypeBuilder binaryExpression_invokeType,
     LinkedNodeBuilder binaryExpression_leftOperand,
     LinkedNodeBuilder binaryExpression_rightOperand,
+    LinkedNodeTypeSubstitutionBuilder binaryExpression_substitution,
+    int binaryExpression_element,
     idl.UnlinkedTokenType binaryExpression_operator,
     LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.binaryExpression,
         _variantField_24 = binaryExpression_invokeType,
         _variantField_6 = binaryExpression_leftOperand,
         _variantField_7 = binaryExpression_rightOperand,
+        _variantField_38 = binaryExpression_substitution,
+        _variantField_15 = binaryExpression_element,
         _variantField_28 = binaryExpression_operator,
         _variantField_25 = expression_type;
 
@@ -7457,10 +7676,8 @@
 
   LinkedNodeBuilder.booleanLiteral({
     bool booleanLiteral_value,
-    LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.booleanLiteral,
-        _variantField_27 = booleanLiteral_value,
-        _variantField_25 = expression_type;
+        _variantField_27 = booleanLiteral_value;
 
   LinkedNodeBuilder.breakStatement({
     LinkedNodeBuilder breakStatement_label,
@@ -7498,7 +7715,6 @@
     LinkedNodeBuilder classOrMixinDeclaration_typeParameters,
     int informativeId,
     bool simplyBoundable_isSimplyBounded,
-    String name,
     LinkedNodeBuilder unused11,
   })  : _kind = idl.LinkedNodeKind.classDeclaration,
         _variantField_4 = annotatedNode_metadata,
@@ -7511,7 +7727,6 @@
         _variantField_13 = classOrMixinDeclaration_typeParameters,
         _variantField_36 = informativeId,
         _variantField_31 = simplyBoundable_isSimplyBounded,
-        _variantField_37 = name,
         _variantField_11 = unused11;
 
   LinkedNodeBuilder.classTypeAlias({
@@ -7522,7 +7737,6 @@
     LinkedNodeBuilder classTypeAlias_implementsClause,
     int informativeId,
     bool simplyBoundable_isSimplyBounded,
-    String name,
   })  : _kind = idl.LinkedNodeKind.classTypeAlias,
         _variantField_4 = annotatedNode_metadata,
         _variantField_6 = classTypeAlias_typeParameters,
@@ -7530,8 +7744,7 @@
         _variantField_8 = classTypeAlias_withClause,
         _variantField_9 = classTypeAlias_implementsClause,
         _variantField_36 = informativeId,
-        _variantField_31 = simplyBoundable_isSimplyBounded,
-        _variantField_37 = name;
+        _variantField_31 = simplyBoundable_isSimplyBounded;
 
   LinkedNodeBuilder.comment({
     List<LinkedNodeBuilder> comment_references,
@@ -7558,8 +7771,8 @@
         _variantField_2 = compilationUnit_declarations,
         _variantField_6 = compilationUnit_scriptTag,
         _variantField_3 = compilationUnit_directives,
-        _variantField_19 = compilationUnit_featureSet,
-        _variantField_39 = compilationUnit_languageVersion,
+        _variantField_41 = compilationUnit_featureSet,
+        _variantField_40 = compilationUnit_languageVersion,
         _variantField_36 = informativeId;
 
   LinkedNodeBuilder.conditionalExpression({
@@ -7590,7 +7803,6 @@
     LinkedNodeBuilder constructorDeclaration_redirectedConstructor,
     LinkedNodeBuilder constructorDeclaration_returnType,
     int informativeId,
-    String name,
   })  : _kind = idl.LinkedNodeKind.constructorDeclaration,
         _variantField_2 = constructorDeclaration_initializers,
         _variantField_4 = annotatedNode_metadata,
@@ -7598,8 +7810,7 @@
         _variantField_8 = constructorDeclaration_parameters,
         _variantField_9 = constructorDeclaration_redirectedConstructor,
         _variantField_10 = constructorDeclaration_returnType,
-        _variantField_36 = informativeId,
-        _variantField_37 = name;
+        _variantField_36 = informativeId;
 
   LinkedNodeBuilder.constructorFieldInitializer({
     LinkedNodeBuilder constructorFieldInitializer_expression,
@@ -7611,9 +7822,13 @@
   LinkedNodeBuilder.constructorName({
     LinkedNodeBuilder constructorName_name,
     LinkedNodeBuilder constructorName_type,
+    LinkedNodeTypeSubstitutionBuilder constructorName_substitution,
+    int constructorName_element,
   })  : _kind = idl.LinkedNodeKind.constructorName,
         _variantField_6 = constructorName_name,
-        _variantField_7 = constructorName_type;
+        _variantField_7 = constructorName_type,
+        _variantField_38 = constructorName_substitution,
+        _variantField_15 = constructorName_element;
 
   LinkedNodeBuilder.continueStatement({
     LinkedNodeBuilder continueStatement_label,
@@ -7630,13 +7845,11 @@
         _variantField_7 = declaredIdentifier_type;
 
   LinkedNodeBuilder.defaultFormalParameter({
-    LinkedNodeTypeBuilder actualType,
     LinkedNodeBuilder defaultFormalParameter_defaultValue,
     LinkedNodeBuilder defaultFormalParameter_parameter,
     idl.LinkedNodeFormalParameterKind defaultFormalParameter_kind,
     int informativeId,
   })  : _kind = idl.LinkedNodeKind.defaultFormalParameter,
-        _variantField_24 = actualType,
         _variantField_6 = defaultFormalParameter_defaultValue,
         _variantField_7 = defaultFormalParameter_parameter,
         _variantField_26 = defaultFormalParameter_kind,
@@ -7672,22 +7885,18 @@
   LinkedNodeBuilder.enumConstantDeclaration({
     List<LinkedNodeBuilder> annotatedNode_metadata,
     int informativeId,
-    String name,
   })  : _kind = idl.LinkedNodeKind.enumConstantDeclaration,
         _variantField_4 = annotatedNode_metadata,
-        _variantField_36 = informativeId,
-        _variantField_37 = name;
+        _variantField_36 = informativeId;
 
   LinkedNodeBuilder.enumDeclaration({
     List<LinkedNodeBuilder> enumDeclaration_constants,
     List<LinkedNodeBuilder> annotatedNode_metadata,
     int informativeId,
-    String name,
   })  : _kind = idl.LinkedNodeKind.enumDeclaration,
         _variantField_2 = enumDeclaration_constants,
         _variantField_4 = annotatedNode_metadata,
-        _variantField_36 = informativeId,
-        _variantField_37 = name;
+        _variantField_36 = informativeId;
 
   LinkedNodeBuilder.exportDirective({
     List<LinkedNodeBuilder> namespaceDirective_combinators,
@@ -7697,6 +7906,7 @@
     int informativeId,
     LinkedNodeBuilder uriBasedDirective_uri,
     String uriBasedDirective_uriContent,
+    int uriBasedDirective_uriElement,
   })  : _kind = idl.LinkedNodeKind.exportDirective,
         _variantField_2 = namespaceDirective_combinators,
         _variantField_4 = annotatedNode_metadata,
@@ -7704,7 +7914,8 @@
         _variantField_20 = namespaceDirective_selectedUri,
         _variantField_36 = informativeId,
         _variantField_14 = uriBasedDirective_uri,
-        _variantField_22 = uriBasedDirective_uriContent;
+        _variantField_22 = uriBasedDirective_uriContent,
+        _variantField_19 = uriBasedDirective_uriElement;
 
   LinkedNodeBuilder.expressionFunctionBody({
     LinkedNodeBuilder expressionFunctionBody_expression,
@@ -7728,15 +7939,13 @@
     List<LinkedNodeBuilder> extensionDeclaration_members,
     String extensionDeclaration_refName,
     int informativeId,
-    String name,
   })  : _kind = idl.LinkedNodeKind.extensionDeclaration,
         _variantField_4 = annotatedNode_metadata,
         _variantField_6 = extensionDeclaration_typeParameters,
         _variantField_7 = extensionDeclaration_extendedType,
         _variantField_5 = extensionDeclaration_members,
         _variantField_20 = extensionDeclaration_refName,
-        _variantField_36 = informativeId,
-        _variantField_37 = name;
+        _variantField_36 = informativeId;
 
   LinkedNodeBuilder.extensionOverride({
     LinkedNodeTypeBuilder extensionOverride_extendedType,
@@ -7749,7 +7958,7 @@
         _variantField_2 = extensionOverride_arguments,
         _variantField_7 = extensionOverride_extensionName,
         _variantField_8 = extensionOverride_typeArguments,
-        _variantField_38 = extensionOverride_typeArgumentTypes;
+        _variantField_39 = extensionOverride_typeArgumentTypes;
 
   LinkedNodeBuilder.fieldDeclaration({
     List<LinkedNodeBuilder> annotatedNode_metadata,
@@ -7768,7 +7977,6 @@
     LinkedNodeBuilder fieldFormalParameter_formalParameters,
     bool inheritsCovariant,
     int informativeId,
-    String name,
   })  : _kind = idl.LinkedNodeKind.fieldFormalParameter,
         _variantField_24 = actualType,
         _variantField_4 = normalFormalParameter_metadata,
@@ -7776,8 +7984,7 @@
         _variantField_7 = fieldFormalParameter_typeParameters,
         _variantField_8 = fieldFormalParameter_formalParameters,
         _variantField_27 = inheritsCovariant,
-        _variantField_36 = informativeId,
-        _variantField_37 = name;
+        _variantField_36 = informativeId;
 
   LinkedNodeBuilder.forEachPartsWithDeclaration({
     LinkedNodeBuilder forEachParts_iterable,
@@ -7836,14 +8043,12 @@
     LinkedNodeBuilder functionDeclaration_functionExpression,
     LinkedNodeBuilder functionDeclaration_returnType,
     int informativeId,
-    String name,
   })  : _kind = idl.LinkedNodeKind.functionDeclaration,
         _variantField_24 = actualReturnType,
         _variantField_4 = annotatedNode_metadata,
         _variantField_6 = functionDeclaration_functionExpression,
         _variantField_7 = functionDeclaration_returnType,
-        _variantField_36 = informativeId,
-        _variantField_37 = name;
+        _variantField_36 = informativeId;
 
   LinkedNodeBuilder.functionDeclarationStatement({
     LinkedNodeBuilder functionDeclarationStatement_functionDeclaration,
@@ -7883,7 +8088,6 @@
     bool typeAlias_hasSelfReference,
     int informativeId,
     bool simplyBoundable_isSimplyBounded,
-    String name,
   })  : _kind = idl.LinkedNodeKind.functionTypeAlias,
         _variantField_24 = actualReturnType,
         _variantField_4 = annotatedNode_metadata,
@@ -7892,8 +8096,7 @@
         _variantField_8 = functionTypeAlias_typeParameters,
         _variantField_27 = typeAlias_hasSelfReference,
         _variantField_36 = informativeId,
-        _variantField_31 = simplyBoundable_isSimplyBounded,
-        _variantField_37 = name;
+        _variantField_31 = simplyBoundable_isSimplyBounded;
 
   LinkedNodeBuilder.functionTypedFormalParameter({
     LinkedNodeTypeBuilder actualType,
@@ -7903,7 +8106,6 @@
     LinkedNodeBuilder functionTypedFormalParameter_typeParameters,
     bool inheritsCovariant,
     int informativeId,
-    String name,
   })  : _kind = idl.LinkedNodeKind.functionTypedFormalParameter,
         _variantField_24 = actualType,
         _variantField_4 = normalFormalParameter_metadata,
@@ -7911,23 +8113,22 @@
         _variantField_7 = functionTypedFormalParameter_returnType,
         _variantField_8 = functionTypedFormalParameter_typeParameters,
         _variantField_27 = inheritsCovariant,
-        _variantField_36 = informativeId,
-        _variantField_37 = name;
+        _variantField_36 = informativeId;
 
   LinkedNodeBuilder.genericFunctionType({
     LinkedNodeTypeBuilder actualReturnType,
     LinkedNodeBuilder genericFunctionType_typeParameters,
     LinkedNodeBuilder genericFunctionType_returnType,
+    int genericFunctionType_id,
     LinkedNodeBuilder genericFunctionType_formalParameters,
     LinkedNodeTypeBuilder genericFunctionType_type,
-    int genericFunctionType_id,
   })  : _kind = idl.LinkedNodeKind.genericFunctionType,
         _variantField_24 = actualReturnType,
         _variantField_6 = genericFunctionType_typeParameters,
         _variantField_7 = genericFunctionType_returnType,
+        _variantField_17 = genericFunctionType_id,
         _variantField_8 = genericFunctionType_formalParameters,
-        _variantField_25 = genericFunctionType_type,
-        _variantField_17 = genericFunctionType_id;
+        _variantField_25 = genericFunctionType_type;
 
   LinkedNodeBuilder.genericTypeAlias({
     List<LinkedNodeBuilder> annotatedNode_metadata,
@@ -7936,15 +8137,13 @@
     bool typeAlias_hasSelfReference,
     int informativeId,
     bool simplyBoundable_isSimplyBounded,
-    String name,
   })  : _kind = idl.LinkedNodeKind.genericTypeAlias,
         _variantField_4 = annotatedNode_metadata,
         _variantField_6 = genericTypeAlias_typeParameters,
         _variantField_7 = genericTypeAlias_functionType,
         _variantField_27 = typeAlias_hasSelfReference,
         _variantField_36 = informativeId,
-        _variantField_31 = simplyBoundable_isSimplyBounded,
-        _variantField_37 = name;
+        _variantField_31 = simplyBoundable_isSimplyBounded;
 
   LinkedNodeBuilder.hideCombinator({
     int informativeId,
@@ -7985,6 +8184,7 @@
     int informativeId,
     LinkedNodeBuilder uriBasedDirective_uri,
     String uriBasedDirective_uriContent,
+    int uriBasedDirective_uriElement,
   })  : _kind = idl.LinkedNodeKind.importDirective,
         _variantField_2 = namespaceDirective_combinators,
         _variantField_4 = annotatedNode_metadata,
@@ -7993,15 +8193,20 @@
         _variantField_1 = importDirective_prefix,
         _variantField_36 = informativeId,
         _variantField_14 = uriBasedDirective_uri,
-        _variantField_22 = uriBasedDirective_uriContent;
+        _variantField_22 = uriBasedDirective_uriContent,
+        _variantField_19 = uriBasedDirective_uriElement;
 
   LinkedNodeBuilder.indexExpression({
     LinkedNodeBuilder indexExpression_index,
     LinkedNodeBuilder indexExpression_target,
+    LinkedNodeTypeSubstitutionBuilder indexExpression_substitution,
+    int indexExpression_element,
     LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.indexExpression,
         _variantField_6 = indexExpression_index,
         _variantField_7 = indexExpression_target,
+        _variantField_38 = indexExpression_substitution,
+        _variantField_15 = indexExpression_element,
         _variantField_25 = expression_type;
 
   LinkedNodeBuilder.instanceCreationExpression({
@@ -8090,7 +8295,6 @@
     LinkedNodeBuilder methodDeclaration_typeParameters,
     int informativeId,
     bool methodDeclaration_hasOperatorEqualWithParameterTypeFromObject,
-    String name,
     TopLevelInferenceErrorBuilder topLevelTypeInferenceError,
   })  : _kind = idl.LinkedNodeKind.methodDeclaration,
         _variantField_24 = actualReturnType,
@@ -8102,7 +8306,6 @@
         _variantField_36 = informativeId,
         _variantField_31 =
             methodDeclaration_hasOperatorEqualWithParameterTypeFromObject,
-        _variantField_37 = name,
         _variantField_32 = topLevelTypeInferenceError;
 
   LinkedNodeBuilder.methodInvocation({
@@ -8129,7 +8332,6 @@
     int informativeId,
     bool simplyBoundable_isSimplyBounded,
     List<String> mixinDeclaration_superInvokedNames,
-    String name,
   })  : _kind = idl.LinkedNodeKind.mixinDeclaration,
         _variantField_4 = annotatedNode_metadata,
         _variantField_6 = mixinDeclaration_onClause,
@@ -8138,8 +8340,7 @@
         _variantField_13 = classOrMixinDeclaration_typeParameters,
         _variantField_36 = informativeId,
         _variantField_31 = simplyBoundable_isSimplyBounded,
-        _variantField_34 = mixinDeclaration_superInvokedNames,
-        _variantField_37 = name;
+        _variantField_34 = mixinDeclaration_superInvokedNames;
 
   LinkedNodeBuilder.namedExpression({
     LinkedNodeBuilder namedExpression_expression,
@@ -8182,11 +8383,13 @@
     int informativeId,
     LinkedNodeBuilder uriBasedDirective_uri,
     String uriBasedDirective_uriContent,
+    int uriBasedDirective_uriElement,
   })  : _kind = idl.LinkedNodeKind.partDirective,
         _variantField_4 = annotatedNode_metadata,
         _variantField_36 = informativeId,
         _variantField_14 = uriBasedDirective_uri,
-        _variantField_22 = uriBasedDirective_uriContent;
+        _variantField_22 = uriBasedDirective_uriContent,
+        _variantField_19 = uriBasedDirective_uriElement;
 
   LinkedNodeBuilder.partOfDirective({
     List<LinkedNodeBuilder> annotatedNode_metadata,
@@ -8201,19 +8404,27 @@
 
   LinkedNodeBuilder.postfixExpression({
     LinkedNodeBuilder postfixExpression_operand,
+    LinkedNodeTypeSubstitutionBuilder postfixExpression_substitution,
+    int postfixExpression_element,
     idl.UnlinkedTokenType postfixExpression_operator,
     LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.postfixExpression,
         _variantField_6 = postfixExpression_operand,
+        _variantField_38 = postfixExpression_substitution,
+        _variantField_15 = postfixExpression_element,
         _variantField_28 = postfixExpression_operator,
         _variantField_25 = expression_type;
 
   LinkedNodeBuilder.prefixExpression({
     LinkedNodeBuilder prefixExpression_operand,
+    LinkedNodeTypeSubstitutionBuilder prefixExpression_substitution,
+    int prefixExpression_element,
     idl.UnlinkedTokenType prefixExpression_operator,
     LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.prefixExpression,
         _variantField_6 = prefixExpression_operand,
+        _variantField_38 = prefixExpression_substitution,
+        _variantField_15 = prefixExpression_element,
         _variantField_28 = prefixExpression_operator,
         _variantField_25 = expression_type;
 
@@ -8240,9 +8451,14 @@
   LinkedNodeBuilder.redirectingConstructorInvocation({
     LinkedNodeBuilder redirectingConstructorInvocation_arguments,
     LinkedNodeBuilder redirectingConstructorInvocation_constructorName,
+    LinkedNodeTypeSubstitutionBuilder
+        redirectingConstructorInvocation_substitution,
+    int redirectingConstructorInvocation_element,
   })  : _kind = idl.LinkedNodeKind.redirectingConstructorInvocation,
         _variantField_6 = redirectingConstructorInvocation_arguments,
-        _variantField_7 = redirectingConstructorInvocation_constructorName;
+        _variantField_7 = redirectingConstructorInvocation_constructorName,
+        _variantField_38 = redirectingConstructorInvocation_substitution,
+        _variantField_15 = redirectingConstructorInvocation_element;
 
   LinkedNodeBuilder.rethrowExpression({
     LinkedNodeTypeBuilder expression_type,
@@ -8276,7 +8492,6 @@
     LinkedNodeBuilder simpleFormalParameter_type,
     bool inheritsCovariant,
     int informativeId,
-    String name,
     TopLevelInferenceErrorBuilder topLevelTypeInferenceError,
   })  : _kind = idl.LinkedNodeKind.simpleFormalParameter,
         _variantField_24 = actualType,
@@ -8284,13 +8499,16 @@
         _variantField_6 = simpleFormalParameter_type,
         _variantField_27 = inheritsCovariant,
         _variantField_36 = informativeId,
-        _variantField_37 = name,
         _variantField_32 = topLevelTypeInferenceError;
 
   LinkedNodeBuilder.simpleIdentifier({
-    String name,
+    LinkedNodeTypeSubstitutionBuilder simpleIdentifier_substitution,
+    int simpleIdentifier_element,
+    LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.simpleIdentifier,
-        _variantField_37 = name;
+        _variantField_38 = simpleIdentifier_substitution,
+        _variantField_15 = simpleIdentifier_element,
+        _variantField_25 = expression_type;
 
   LinkedNodeBuilder.simpleStringLiteral({
     String simpleStringLiteral_value,
@@ -8312,9 +8530,13 @@
   LinkedNodeBuilder.superConstructorInvocation({
     LinkedNodeBuilder superConstructorInvocation_arguments,
     LinkedNodeBuilder superConstructorInvocation_constructorName,
+    LinkedNodeTypeSubstitutionBuilder superConstructorInvocation_substitution,
+    int superConstructorInvocation_element,
   })  : _kind = idl.LinkedNodeKind.superConstructorInvocation,
         _variantField_6 = superConstructorInvocation_arguments,
-        _variantField_7 = superConstructorInvocation_constructorName;
+        _variantField_7 = superConstructorInvocation_constructorName,
+        _variantField_38 = superConstructorInvocation_substitution,
+        _variantField_15 = superConstructorInvocation_element;
 
   LinkedNodeBuilder.superExpression({
     LinkedNodeTypeBuilder expression_type,
@@ -8400,14 +8622,12 @@
     LinkedNodeBuilder typeParameter_bound,
     int typeParameter_variance,
     int informativeId,
-    String name,
     LinkedNodeTypeBuilder typeParameter_defaultType,
   })  : _kind = idl.LinkedNodeKind.typeParameter,
         _variantField_4 = annotatedNode_metadata,
         _variantField_6 = typeParameter_bound,
         _variantField_15 = typeParameter_variance,
         _variantField_36 = informativeId,
-        _variantField_37 = name,
         _variantField_23 = typeParameter_defaultType;
 
   LinkedNodeBuilder.typeParameterList({
@@ -8421,7 +8641,6 @@
     LinkedNodeBuilder variableDeclaration_initializer,
     bool inheritsCovariant,
     int informativeId,
-    String name,
     TopLevelInferenceErrorBuilder topLevelTypeInferenceError,
   })  : _kind = idl.LinkedNodeKind.variableDeclaration,
         _variantField_24 = actualType,
@@ -8429,7 +8648,6 @@
         _variantField_6 = variableDeclaration_initializer,
         _variantField_27 = inheritsCovariant,
         _variantField_36 = informativeId,
-        _variantField_37 = name,
         _variantField_32 = topLevelTypeInferenceError;
 
   LinkedNodeBuilder.variableDeclarationList({
@@ -8469,66 +8687,53 @@
   void flushInformative() {
     if (kind == idl.LinkedNodeKind.adjacentStrings) {
       adjacentStrings_strings?.forEach((b) => b.flushInformative());
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.annotation) {
       annotation_arguments?.flushInformative();
       annotation_constructorName?.flushInformative();
       annotation_name?.flushInformative();
-      resolution?.flushInformative();
+      annotation_substitution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.argumentList) {
       argumentList_arguments?.forEach((b) => b.flushInformative());
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.asExpression) {
       asExpression_expression?.flushInformative();
       asExpression_type?.flushInformative();
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.assertInitializer) {
       assertInitializer_condition?.flushInformative();
       assertInitializer_message?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.assertStatement) {
       assertStatement_condition?.flushInformative();
       assertStatement_message?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.assignmentExpression) {
       assignmentExpression_leftHandSide?.flushInformative();
       assignmentExpression_rightHandSide?.flushInformative();
+      assignmentExpression_substitution?.flushInformative();
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.awaitExpression) {
       awaitExpression_expression?.flushInformative();
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.binaryExpression) {
       binaryExpression_invokeType?.flushInformative();
       binaryExpression_leftOperand?.flushInformative();
       binaryExpression_rightOperand?.flushInformative();
+      binaryExpression_substitution?.flushInformative();
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.block) {
       block_statements?.forEach((b) => b.flushInformative());
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.blockFunctionBody) {
       blockFunctionBody_block?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.booleanLiteral) {
-      expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.breakStatement) {
       breakStatement_label?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.cascadeExpression) {
       cascadeExpression_sections?.forEach((b) => b.flushInformative());
       cascadeExpression_target?.flushInformative();
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.catchClause) {
       catchClause_body?.flushInformative();
       catchClause_exceptionParameter?.flushInformative();
       catchClause_exceptionType?.flushInformative();
       catchClause_stackTraceParameter?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.classDeclaration) {
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
       classDeclaration_extendsClause?.flushInformative();
@@ -8538,7 +8743,6 @@
       classOrMixinDeclaration_members?.forEach((b) => b.flushInformative());
       classOrMixinDeclaration_typeParameters?.flushInformative();
       informativeId = null;
-      resolution?.flushInformative();
       unused11?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.classTypeAlias) {
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
@@ -8547,31 +8751,25 @@
       classTypeAlias_withClause?.flushInformative();
       classTypeAlias_implementsClause?.flushInformative();
       informativeId = null;
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.comment) {
       comment_references?.forEach((b) => b.flushInformative());
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.commentReference) {
       commentReference_identifier?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.compilationUnit) {
       compilationUnit_declarations?.forEach((b) => b.flushInformative());
       compilationUnit_scriptTag?.flushInformative();
       compilationUnit_directives?.forEach((b) => b.flushInformative());
       compilationUnit_languageVersion?.flushInformative();
       informativeId = null;
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.conditionalExpression) {
       conditionalExpression_condition?.flushInformative();
       conditionalExpression_elseExpression?.flushInformative();
       conditionalExpression_thenExpression?.flushInformative();
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.configuration) {
       configuration_name?.flushInformative();
       configuration_value?.flushInformative();
       configuration_uri?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.constructorDeclaration) {
       constructorDeclaration_initializers?.forEach((b) => b.flushInformative());
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
@@ -8580,86 +8778,66 @@
       constructorDeclaration_redirectedConstructor?.flushInformative();
       constructorDeclaration_returnType?.flushInformative();
       informativeId = null;
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.constructorFieldInitializer) {
       constructorFieldInitializer_expression?.flushInformative();
       constructorFieldInitializer_fieldName?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.constructorName) {
       constructorName_name?.flushInformative();
       constructorName_type?.flushInformative();
-      resolution?.flushInformative();
+      constructorName_substitution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.continueStatement) {
       continueStatement_label?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.declaredIdentifier) {
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
       declaredIdentifier_identifier?.flushInformative();
       declaredIdentifier_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.defaultFormalParameter) {
-      actualType?.flushInformative();
       defaultFormalParameter_defaultValue?.flushInformative();
       defaultFormalParameter_parameter?.flushInformative();
       informativeId = null;
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.doStatement) {
       doStatement_body?.flushInformative();
       doStatement_condition?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.dottedName) {
       dottedName_components?.forEach((b) => b.flushInformative());
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.doubleLiteral) {
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.emptyFunctionBody) {
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.emptyStatement) {
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.enumConstantDeclaration) {
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
       informativeId = null;
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.enumDeclaration) {
       enumDeclaration_constants?.forEach((b) => b.flushInformative());
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
       informativeId = null;
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.exportDirective) {
       namespaceDirective_combinators?.forEach((b) => b.flushInformative());
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
       namespaceDirective_configurations?.forEach((b) => b.flushInformative());
       informativeId = null;
       uriBasedDirective_uri?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.expressionFunctionBody) {
       expressionFunctionBody_expression?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.expressionStatement) {
       expressionStatement_expression?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.extendsClause) {
       extendsClause_superclass?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.extensionDeclaration) {
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
       extensionDeclaration_typeParameters?.flushInformative();
       extensionDeclaration_extendedType?.flushInformative();
       extensionDeclaration_members?.forEach((b) => b.flushInformative());
       informativeId = null;
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.extensionOverride) {
       extensionOverride_extendedType?.flushInformative();
       extensionOverride_arguments?.forEach((b) => b.flushInformative());
       extensionOverride_extensionName?.flushInformative();
       extensionOverride_typeArguments?.flushInformative();
       extensionOverride_typeArgumentTypes?.forEach((b) => b.flushInformative());
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.fieldDeclaration) {
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
       fieldDeclaration_fields?.flushInformative();
       informativeId = null;
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.fieldFormalParameter) {
       actualType?.flushInformative();
       normalFormalParameter_metadata?.forEach((b) => b.flushInformative());
@@ -8667,59 +8845,47 @@
       fieldFormalParameter_typeParameters?.flushInformative();
       fieldFormalParameter_formalParameters?.flushInformative();
       informativeId = null;
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.forEachPartsWithDeclaration) {
       forEachParts_iterable?.flushInformative();
       forEachPartsWithDeclaration_loopVariable?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.forEachPartsWithIdentifier) {
       forEachParts_iterable?.flushInformative();
       forEachPartsWithIdentifier_identifier?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.forElement) {
       forMixin_forLoopParts?.flushInformative();
       forElement_body?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.forPartsWithDeclarations) {
       forParts_condition?.flushInformative();
       forPartsWithDeclarations_variables?.flushInformative();
       forParts_updaters?.forEach((b) => b.flushInformative());
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.forPartsWithExpression) {
       forParts_condition?.flushInformative();
       forPartsWithExpression_initialization?.flushInformative();
       forParts_updaters?.forEach((b) => b.flushInformative());
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.forStatement) {
       forMixin_forLoopParts?.flushInformative();
       forStatement_body?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.formalParameterList) {
       formalParameterList_parameters?.forEach((b) => b.flushInformative());
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.functionDeclaration) {
       actualReturnType?.flushInformative();
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
       functionDeclaration_functionExpression?.flushInformative();
       functionDeclaration_returnType?.flushInformative();
       informativeId = null;
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.functionDeclarationStatement) {
       functionDeclarationStatement_functionDeclaration?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.functionExpression) {
       actualReturnType?.flushInformative();
       functionExpression_body?.flushInformative();
       functionExpression_formalParameters?.flushInformative();
       functionExpression_typeParameters?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.functionExpressionInvocation) {
       invocationExpression_invokeType?.flushInformative();
       functionExpressionInvocation_function?.flushInformative();
       invocationExpression_typeArguments?.flushInformative();
       expression_type?.flushInformative();
       invocationExpression_arguments?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.functionTypeAlias) {
       actualReturnType?.flushInformative();
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
@@ -8727,7 +8893,6 @@
       functionTypeAlias_returnType?.flushInformative();
       functionTypeAlias_typeParameters?.flushInformative();
       informativeId = null;
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.functionTypedFormalParameter) {
       actualType?.flushInformative();
       normalFormalParameter_metadata?.forEach((b) => b.flushInformative());
@@ -8735,91 +8900,72 @@
       functionTypedFormalParameter_returnType?.flushInformative();
       functionTypedFormalParameter_typeParameters?.flushInformative();
       informativeId = null;
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.genericFunctionType) {
       actualReturnType?.flushInformative();
       genericFunctionType_typeParameters?.flushInformative();
       genericFunctionType_returnType?.flushInformative();
       genericFunctionType_formalParameters?.flushInformative();
       genericFunctionType_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.genericTypeAlias) {
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
       genericTypeAlias_typeParameters?.flushInformative();
       genericTypeAlias_functionType?.flushInformative();
       informativeId = null;
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.hideCombinator) {
       informativeId = null;
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.ifElement) {
       ifMixin_condition?.flushInformative();
       ifElement_thenElement?.flushInformative();
       ifElement_elseElement?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.ifStatement) {
       ifMixin_condition?.flushInformative();
       ifStatement_elseStatement?.flushInformative();
       ifStatement_thenStatement?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.implementsClause) {
       implementsClause_interfaces?.forEach((b) => b.flushInformative());
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.importDirective) {
       namespaceDirective_combinators?.forEach((b) => b.flushInformative());
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
       namespaceDirective_configurations?.forEach((b) => b.flushInformative());
       informativeId = null;
       uriBasedDirective_uri?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.indexExpression) {
       indexExpression_index?.flushInformative();
       indexExpression_target?.flushInformative();
+      indexExpression_substitution?.flushInformative();
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.instanceCreationExpression) {
       instanceCreationExpression_arguments
           ?.forEach((b) => b.flushInformative());
       instanceCreationExpression_constructorName?.flushInformative();
       instanceCreationExpression_typeArguments?.flushInformative();
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.integerLiteral) {
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.interpolationExpression) {
       interpolationExpression_expression?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.interpolationString) {
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.isExpression) {
       isExpression_expression?.flushInformative();
       isExpression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.label) {
       label_label?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.labeledStatement) {
       labeledStatement_labels?.forEach((b) => b.flushInformative());
       labeledStatement_statement?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.libraryDirective) {
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
       libraryDirective_name?.flushInformative();
       informativeId = null;
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.libraryIdentifier) {
       libraryIdentifier_components?.forEach((b) => b.flushInformative());
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.listLiteral) {
       typedLiteral_typeArguments?.forEach((b) => b.flushInformative());
       listLiteral_elements?.forEach((b) => b.flushInformative());
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.mapLiteralEntry) {
       mapLiteralEntry_key?.flushInformative();
       mapLiteralEntry_value?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.methodDeclaration) {
       actualReturnType?.flushInformative();
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
@@ -8828,7 +8974,6 @@
       methodDeclaration_returnType?.flushInformative();
       methodDeclaration_typeParameters?.flushInformative();
       informativeId = null;
-      resolution?.flushInformative();
       topLevelTypeInferenceError?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.methodInvocation) {
       invocationExpression_invokeType?.flushInformative();
@@ -8837,7 +8982,6 @@
       invocationExpression_typeArguments?.flushInformative();
       expression_type?.flushInformative();
       invocationExpression_arguments?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.mixinDeclaration) {
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
       mixinDeclaration_onClause?.flushInformative();
@@ -8845,174 +8989,137 @@
       classOrMixinDeclaration_members?.forEach((b) => b.flushInformative());
       classOrMixinDeclaration_typeParameters?.flushInformative();
       informativeId = null;
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.namedExpression) {
       namedExpression_expression?.flushInformative();
       namedExpression_name?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.nativeClause) {
       nativeClause_name?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.nativeFunctionBody) {
       nativeFunctionBody_stringLiteral?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.nullLiteral) {
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.onClause) {
       onClause_superclassConstraints?.forEach((b) => b.flushInformative());
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.parenthesizedExpression) {
       parenthesizedExpression_expression?.flushInformative();
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.partDirective) {
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
       informativeId = null;
       uriBasedDirective_uri?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.partOfDirective) {
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
       partOfDirective_libraryName?.flushInformative();
       partOfDirective_uri?.flushInformative();
       informativeId = null;
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.postfixExpression) {
       postfixExpression_operand?.flushInformative();
+      postfixExpression_substitution?.flushInformative();
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.prefixExpression) {
       prefixExpression_operand?.flushInformative();
+      prefixExpression_substitution?.flushInformative();
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.prefixedIdentifier) {
       prefixedIdentifier_identifier?.flushInformative();
       prefixedIdentifier_prefix?.flushInformative();
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.propertyAccess) {
       propertyAccess_propertyName?.flushInformative();
       propertyAccess_target?.flushInformative();
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.redirectingConstructorInvocation) {
       redirectingConstructorInvocation_arguments?.flushInformative();
       redirectingConstructorInvocation_constructorName?.flushInformative();
-      resolution?.flushInformative();
+      redirectingConstructorInvocation_substitution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.rethrowExpression) {
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.returnStatement) {
       returnStatement_expression?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.setOrMapLiteral) {
       typedLiteral_typeArguments?.forEach((b) => b.flushInformative());
       setOrMapLiteral_elements?.forEach((b) => b.flushInformative());
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.showCombinator) {
       informativeId = null;
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.simpleFormalParameter) {
       actualType?.flushInformative();
       normalFormalParameter_metadata?.forEach((b) => b.flushInformative());
       simpleFormalParameter_type?.flushInformative();
       informativeId = null;
-      resolution?.flushInformative();
       topLevelTypeInferenceError?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.simpleIdentifier) {
-      resolution?.flushInformative();
+      simpleIdentifier_substitution?.flushInformative();
+      expression_type?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.simpleStringLiteral) {
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.spreadElement) {
       spreadElement_expression?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.stringInterpolation) {
       stringInterpolation_elements?.forEach((b) => b.flushInformative());
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.superConstructorInvocation) {
       superConstructorInvocation_arguments?.flushInformative();
       superConstructorInvocation_constructorName?.flushInformative();
-      resolution?.flushInformative();
+      superConstructorInvocation_substitution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.superExpression) {
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.switchCase) {
       switchMember_statements?.forEach((b) => b.flushInformative());
       switchCase_expression?.flushInformative();
       switchMember_labels?.forEach((b) => b.flushInformative());
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.switchDefault) {
       switchMember_statements?.forEach((b) => b.flushInformative());
       switchMember_labels?.forEach((b) => b.flushInformative());
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.switchStatement) {
       switchStatement_members?.forEach((b) => b.flushInformative());
       switchStatement_expression?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.symbolLiteral) {
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.thisExpression) {
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.throwExpression) {
       throwExpression_expression?.flushInformative();
       expression_type?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.topLevelVariableDeclaration) {
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
       topLevelVariableDeclaration_variableList?.flushInformative();
       informativeId = null;
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.tryStatement) {
       tryStatement_catchClauses?.forEach((b) => b.flushInformative());
       tryStatement_body?.flushInformative();
       tryStatement_finallyBlock?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.typeArgumentList) {
       typeArgumentList_arguments?.forEach((b) => b.flushInformative());
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.typeName) {
       typeName_typeArguments?.forEach((b) => b.flushInformative());
       typeName_name?.flushInformative();
-      resolution?.flushInformative();
       typeName_type?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.typeParameter) {
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
       typeParameter_bound?.flushInformative();
       informativeId = null;
-      resolution?.flushInformative();
       typeParameter_defaultType?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.typeParameterList) {
       typeParameterList_typeParameters?.forEach((b) => b.flushInformative());
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.variableDeclaration) {
       actualType?.flushInformative();
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
       variableDeclaration_initializer?.flushInformative();
       informativeId = null;
-      resolution?.flushInformative();
       topLevelTypeInferenceError?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.variableDeclarationList) {
       variableDeclarationList_variables?.forEach((b) => b.flushInformative());
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
       variableDeclarationList_type?.flushInformative();
       informativeId = null;
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.variableDeclarationStatement) {
       variableDeclarationStatement_variables?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.whileStatement) {
       whileStatement_body?.flushInformative();
       whileStatement_condition?.flushInformative();
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.withClause) {
       withClause_mixinTypes?.forEach((b) => b.flushInformative());
-      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.yieldStatement) {
       yieldStatement_expression?.flushInformative();
-      resolution?.flushInformative();
     }
   }
 
@@ -9029,8 +9136,7 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.annotation) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.annotation_arguments != null);
@@ -9039,9 +9145,11 @@
       this.annotation_constructorName?.collectApiSignature(signature);
       signature.addBool(this.annotation_name != null);
       this.annotation_name?.collectApiSignature(signature);
+      signature.addInt(this.annotation_element ?? 0);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
+      signature.addBool(this.annotation_substitution != null);
+      this.annotation_substitution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.argumentList) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.argumentList_arguments == null) {
@@ -9053,8 +9161,7 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.asExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.asExpression_expression != null);
@@ -9064,8 +9171,7 @@
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.assertInitializer) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.assertInitializer_condition != null);
@@ -9073,8 +9179,7 @@
       signature.addBool(this.assertInitializer_message != null);
       this.assertInitializer_message?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.assertStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.assertStatement_condition != null);
@@ -9082,22 +9187,23 @@
       signature.addBool(this.assertStatement_message != null);
       this.assertStatement_message?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.assignmentExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.assignmentExpression_leftHandSide != null);
       this.assignmentExpression_leftHandSide?.collectApiSignature(signature);
       signature.addBool(this.assignmentExpression_rightHandSide != null);
       this.assignmentExpression_rightHandSide?.collectApiSignature(signature);
+      signature.addInt(this.assignmentExpression_element ?? 0);
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
       signature.addInt(this.assignmentExpression_operator == null
           ? 0
           : this.assignmentExpression_operator.index);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
+      signature.addBool(this.assignmentExpression_substitution != null);
+      this.assignmentExpression_substitution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.awaitExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.awaitExpression_expression != null);
@@ -9105,14 +9211,14 @@
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.binaryExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.binaryExpression_leftOperand != null);
       this.binaryExpression_leftOperand?.collectApiSignature(signature);
       signature.addBool(this.binaryExpression_rightOperand != null);
       this.binaryExpression_rightOperand?.collectApiSignature(signature);
+      signature.addInt(this.binaryExpression_element ?? 0);
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.binaryExpression_invokeType != null);
       this.binaryExpression_invokeType?.collectApiSignature(signature);
@@ -9121,8 +9227,9 @@
       signature.addInt(this.binaryExpression_operator == null
           ? 0
           : this.binaryExpression_operator.index);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
+      signature.addBool(this.binaryExpression_substitution != null);
+      this.binaryExpression_substitution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.block) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.block_statements == null) {
@@ -9134,30 +9241,24 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.blockFunctionBody) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.blockFunctionBody_block != null);
       this.blockFunctionBody_block?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.booleanLiteral) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.expression_type != null);
-      this.expression_type?.collectApiSignature(signature);
       signature.addBool(this.booleanLiteral_value == true);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.breakStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.breakStatement_label != null);
       this.breakStatement_label?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.cascadeExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.cascadeExpression_sections == null) {
@@ -9173,8 +9274,7 @@
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.catchClause) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.catchClause_body != null);
@@ -9186,8 +9286,7 @@
       signature.addBool(this.catchClause_stackTraceParameter != null);
       this.catchClause_stackTraceParameter?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.classDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -9226,8 +9325,6 @@
       signature.addBool(this.classDeclaration_isDartObject == true);
       signature.addBool(this.simplyBoundable_isSimplyBounded == true);
       signature.addString(this.name ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.classTypeAlias) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -9249,8 +9346,6 @@
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.simplyBoundable_isSimplyBounded == true);
       signature.addString(this.name ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.comment) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.comment_references == null) {
@@ -9271,15 +9366,13 @@
           signature.addString(x);
         }
       }
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.commentReference) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.commentReference_identifier != null);
       this.commentReference_identifier?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.compilationUnit) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.compilationUnit_declarations == null) {
@@ -9301,6 +9394,9 @@
       signature.addBool(this.compilationUnit_scriptTag != null);
       this.compilationUnit_scriptTag?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
+      signature.addString(this.name ?? '');
+      signature.addBool(this.compilationUnit_languageVersion != null);
+      this.compilationUnit_languageVersion?.collectApiSignature(signature);
       if (this.compilationUnit_featureSet == null) {
         signature.addInt(0);
       } else {
@@ -9309,10 +9405,6 @@
           signature.addInt(x);
         }
       }
-      signature.addBool(this.compilationUnit_languageVersion != null);
-      this.compilationUnit_languageVersion?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.conditionalExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.conditionalExpression_condition != null);
@@ -9324,8 +9416,7 @@
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.configuration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.configuration_name != null);
@@ -9335,8 +9426,7 @@
       signature.addBool(this.configuration_uri != null);
       this.configuration_uri?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.constructorDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.constructorDeclaration_initializers == null) {
@@ -9368,8 +9458,6 @@
       this.constructorDeclaration_returnType?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
       signature.addString(this.name ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.constructorFieldInitializer) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.constructorFieldInitializer_expression != null);
@@ -9381,24 +9469,24 @@
           .constructorFieldInitializer_fieldName
           ?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.constructorName) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.constructorName_name != null);
       this.constructorName_name?.collectApiSignature(signature);
       signature.addBool(this.constructorName_type != null);
       this.constructorName_type?.collectApiSignature(signature);
+      signature.addInt(this.constructorName_element ?? 0);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
+      signature.addBool(this.constructorName_substitution != null);
+      this.constructorName_substitution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.continueStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.continueStatement_label != null);
       this.continueStatement_label?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.declaredIdentifier) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -9414,8 +9502,7 @@
       signature.addBool(this.declaredIdentifier_type != null);
       this.declaredIdentifier_type?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.defaultFormalParameter) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.defaultFormalParameter_defaultValue != null);
@@ -9423,13 +9510,10 @@
       signature.addBool(this.defaultFormalParameter_parameter != null);
       this.defaultFormalParameter_parameter?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.actualType != null);
-      this.actualType?.collectApiSignature(signature);
       signature.addInt(this.defaultFormalParameter_kind == null
           ? 0
           : this.defaultFormalParameter_kind.index);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.doStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.doStatement_body != null);
@@ -9437,8 +9521,7 @@
       signature.addBool(this.doStatement_condition != null);
       this.doStatement_condition?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.dottedName) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.dottedName_components == null) {
@@ -9450,26 +9533,22 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.doubleLiteral) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.flags ?? 0);
       signature.addDouble(this.doubleLiteral_value ?? 0.0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.emptyFunctionBody) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.emptyFunctionBody_fake ?? 0);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.emptyStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.emptyStatement_fake ?? 0);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.enumConstantDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -9482,8 +9561,6 @@
       }
       signature.addInt(this.flags ?? 0);
       signature.addString(this.name ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.enumDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.enumDeclaration_constants == null) {
@@ -9504,8 +9581,6 @@
       }
       signature.addInt(this.flags ?? 0);
       signature.addString(this.name ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.exportDirective) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.namespaceDirective_combinators == null) {
@@ -9535,31 +9610,28 @@
       signature.addBool(this.uriBasedDirective_uri != null);
       this.uriBasedDirective_uri?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
+      signature.addInt(this.uriBasedDirective_uriElement ?? 0);
       signature.addString(this.namespaceDirective_selectedUri ?? '');
       signature.addString(this.uriBasedDirective_uriContent ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.expressionFunctionBody) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.expressionFunctionBody_expression != null);
       this.expressionFunctionBody_expression?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.expressionStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.expressionStatement_expression != null);
       this.expressionStatement_expression?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.extendsClause) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.extendsClause_superclass != null);
       this.extendsClause_superclass?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.extensionDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -9585,8 +9657,6 @@
       signature.addInt(this.flags ?? 0);
       signature.addString(this.extensionDeclaration_refName ?? '');
       signature.addString(this.name ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.extensionOverride) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.extensionOverride_arguments == null) {
@@ -9604,6 +9674,7 @@
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.extensionOverride_extendedType != null);
       this.extensionOverride_extendedType?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
       if (this.extensionOverride_typeArgumentTypes == null) {
         signature.addInt(0);
       } else {
@@ -9612,8 +9683,6 @@
           x?.collectApiSignature(signature);
         }
       }
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.fieldDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -9627,8 +9696,7 @@
       signature.addBool(this.fieldDeclaration_fields != null);
       this.fieldDeclaration_fields?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.fieldFormalParameter) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.normalFormalParameter_metadata == null) {
@@ -9652,8 +9720,6 @@
       this.actualType?.collectApiSignature(signature);
       signature.addBool(this.inheritsCovariant == true);
       signature.addString(this.name ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.forEachPartsWithDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.forEachParts_iterable != null);
@@ -9663,8 +9729,7 @@
           .forEachPartsWithDeclaration_loopVariable
           ?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.forEachPartsWithIdentifier) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.forEachParts_iterable != null);
@@ -9674,8 +9739,7 @@
           .forEachPartsWithIdentifier_identifier
           ?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.forElement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.forMixin_forLoopParts != null);
@@ -9683,8 +9747,7 @@
       signature.addBool(this.forElement_body != null);
       this.forElement_body?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.forPartsWithDeclarations) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.forParts_updaters == null) {
@@ -9700,8 +9763,7 @@
       signature.addBool(this.forPartsWithDeclarations_variables != null);
       this.forPartsWithDeclarations_variables?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.forPartsWithExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.forParts_updaters == null) {
@@ -9719,8 +9781,7 @@
           .forPartsWithExpression_initialization
           ?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.forStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.forMixin_forLoopParts != null);
@@ -9728,8 +9789,7 @@
       signature.addBool(this.forStatement_body != null);
       this.forStatement_body?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.formalParameterList) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.formalParameterList_parameters == null) {
@@ -9741,8 +9801,7 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.functionDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -9763,8 +9822,6 @@
       signature.addBool(this.actualReturnType != null);
       this.actualReturnType?.collectApiSignature(signature);
       signature.addString(this.name ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.functionDeclarationStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(
@@ -9773,8 +9830,7 @@
           .functionDeclarationStatement_functionDeclaration
           ?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.functionExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.functionExpression_body != null);
@@ -9786,8 +9842,7 @@
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.actualReturnType != null);
       this.actualReturnType?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.functionExpressionInvocation) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.functionExpressionInvocation_function != null);
@@ -9803,8 +9858,7 @@
       this.invocationExpression_invokeType?.collectApiSignature(signature);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.functionTypeAlias) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -9827,8 +9881,6 @@
       signature.addBool(this.typeAlias_hasSelfReference == true);
       signature.addBool(this.simplyBoundable_isSimplyBounded == true);
       signature.addString(this.name ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.functionTypedFormalParameter) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.normalFormalParameter_metadata == null) {
@@ -9858,8 +9910,6 @@
       this.actualType?.collectApiSignature(signature);
       signature.addBool(this.inheritsCovariant == true);
       signature.addString(this.name ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.genericFunctionType) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.genericFunctionType_typeParameters != null);
@@ -9874,8 +9924,7 @@
       this.actualReturnType?.collectApiSignature(signature);
       signature.addBool(this.genericFunctionType_type != null);
       this.genericFunctionType_type?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.genericTypeAlias) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -9894,8 +9943,6 @@
       signature.addBool(this.typeAlias_hasSelfReference == true);
       signature.addBool(this.simplyBoundable_isSimplyBounded == true);
       signature.addString(this.name ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.hideCombinator) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.flags ?? 0);
@@ -9907,8 +9954,7 @@
           signature.addString(x);
         }
       }
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.ifElement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.ifMixin_condition != null);
@@ -9918,8 +9964,7 @@
       signature.addBool(this.ifElement_elseElement != null);
       this.ifElement_elseElement?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.ifStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.ifMixin_condition != null);
@@ -9929,8 +9974,7 @@
       signature.addBool(this.ifStatement_thenStatement != null);
       this.ifStatement_thenStatement?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.implementsClause) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.implementsClause_interfaces == null) {
@@ -9942,8 +9986,7 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.importDirective) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addString(this.importDirective_prefix ?? '');
@@ -9974,21 +10017,23 @@
       signature.addBool(this.uriBasedDirective_uri != null);
       this.uriBasedDirective_uri?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
+      signature.addInt(this.uriBasedDirective_uriElement ?? 0);
       signature.addString(this.namespaceDirective_selectedUri ?? '');
       signature.addString(this.uriBasedDirective_uriContent ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.indexExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.indexExpression_index != null);
       this.indexExpression_index?.collectApiSignature(signature);
       signature.addBool(this.indexExpression_target != null);
       this.indexExpression_target?.collectApiSignature(signature);
+      signature.addInt(this.indexExpression_element ?? 0);
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
+      signature.addBool(this.indexExpression_substitution != null);
+      this.indexExpression_substitution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.instanceCreationExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.instanceCreationExpression_arguments == null) {
@@ -10011,29 +10056,25 @@
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.integerLiteral) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.integerLiteral_value ?? 0);
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.interpolationExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.interpolationExpression_expression != null);
       this.interpolationExpression_expression?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.interpolationString) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.flags ?? 0);
       signature.addString(this.interpolationString_value ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.isExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.isExpression_expression != null);
@@ -10041,15 +10082,13 @@
       signature.addBool(this.isExpression_type != null);
       this.isExpression_type?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.label) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.label_label != null);
       this.label_label?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.labeledStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.labeledStatement_labels == null) {
@@ -10063,8 +10102,7 @@
       signature.addBool(this.labeledStatement_statement != null);
       this.labeledStatement_statement?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.libraryDirective) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -10078,8 +10116,7 @@
       signature.addBool(this.libraryDirective_name != null);
       this.libraryDirective_name?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.libraryIdentifier) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.libraryIdentifier_components == null) {
@@ -10091,8 +10128,7 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.listLiteral) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.typedLiteral_typeArguments == null) {
@@ -10114,8 +10150,7 @@
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.mapLiteralEntry) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.mapLiteralEntry_key != null);
@@ -10123,8 +10158,7 @@
       signature.addBool(this.mapLiteralEntry_value != null);
       this.mapLiteralEntry_value?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.methodDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -10152,8 +10186,6 @@
       signature.addBool(this.topLevelTypeInferenceError != null);
       this.topLevelTypeInferenceError?.collectApiSignature(signature);
       signature.addString(this.name ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.methodInvocation) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.methodInvocation_methodName != null);
@@ -10169,8 +10201,7 @@
       this.invocationExpression_invokeType?.collectApiSignature(signature);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.mixinDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -10210,8 +10241,6 @@
         }
       }
       signature.addString(this.name ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.namedExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.namedExpression_expression != null);
@@ -10219,30 +10248,26 @@
       signature.addBool(this.namedExpression_name != null);
       this.namedExpression_name?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.nativeClause) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.nativeClause_name != null);
       this.nativeClause_name?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.nativeFunctionBody) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.nativeFunctionBody_stringLiteral != null);
       this.nativeFunctionBody_stringLiteral?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.nullLiteral) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.nullLiteral_fake ?? 0);
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.onClause) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.onClause_superclassConstraints == null) {
@@ -10254,8 +10279,7 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.parenthesizedExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.parenthesizedExpression_expression != null);
@@ -10263,8 +10287,7 @@
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.partDirective) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -10278,9 +10301,9 @@
       signature.addBool(this.uriBasedDirective_uri != null);
       this.uriBasedDirective_uri?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
+      signature.addInt(this.uriBasedDirective_uriElement ?? 0);
       signature.addString(this.uriBasedDirective_uriContent ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.partOfDirective) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -10296,32 +10319,35 @@
       signature.addBool(this.partOfDirective_uri != null);
       this.partOfDirective_uri?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.postfixExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.postfixExpression_operand != null);
       this.postfixExpression_operand?.collectApiSignature(signature);
+      signature.addInt(this.postfixExpression_element ?? 0);
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
       signature.addInt(this.postfixExpression_operator == null
           ? 0
           : this.postfixExpression_operator.index);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
+      signature.addBool(this.postfixExpression_substitution != null);
+      this.postfixExpression_substitution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.prefixExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.prefixExpression_operand != null);
       this.prefixExpression_operand?.collectApiSignature(signature);
+      signature.addInt(this.prefixExpression_element ?? 0);
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
       signature.addInt(this.prefixExpression_operator == null
           ? 0
           : this.prefixExpression_operator.index);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
+      signature.addBool(this.prefixExpression_substitution != null);
+      this.prefixExpression_substitution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.prefixedIdentifier) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.prefixedIdentifier_identifier != null);
@@ -10331,8 +10357,7 @@
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.propertyAccess) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.propertyAccess_propertyName != null);
@@ -10345,8 +10370,7 @@
       signature.addInt(this.propertyAccess_operator == null
           ? 0
           : this.propertyAccess_operator.index);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.redirectingConstructorInvocation) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature
@@ -10359,23 +10383,26 @@
       this
           .redirectingConstructorInvocation_constructorName
           ?.collectApiSignature(signature);
+      signature.addInt(this.redirectingConstructorInvocation_element ?? 0);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
+      signature
+          .addBool(this.redirectingConstructorInvocation_substitution != null);
+      this
+          .redirectingConstructorInvocation_substitution
+          ?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.rethrowExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.returnStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.returnStatement_expression != null);
       this.returnStatement_expression?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.setOrMapLiteral) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.typedLiteral_typeArguments == null) {
@@ -10397,8 +10424,7 @@
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.showCombinator) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.flags ?? 0);
@@ -10410,8 +10436,7 @@
           signature.addString(x);
         }
       }
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.simpleFormalParameter) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.normalFormalParameter_metadata == null) {
@@ -10431,20 +10456,20 @@
       signature.addBool(this.topLevelTypeInferenceError != null);
       this.topLevelTypeInferenceError?.collectApiSignature(signature);
       signature.addString(this.name ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.simpleIdentifier) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
+      signature.addInt(this.simpleIdentifier_element ?? 0);
       signature.addInt(this.flags ?? 0);
+      signature.addBool(this.expression_type != null);
+      this.expression_type?.collectApiSignature(signature);
       signature.addString(this.name ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addBool(this.simpleIdentifier_substitution != null);
+      this.simpleIdentifier_substitution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.simpleStringLiteral) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.flags ?? 0);
       signature.addString(this.simpleStringLiteral_value ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.spreadElement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.spreadElement_expression != null);
@@ -10453,8 +10478,7 @@
       signature.addInt(this.spreadElement_spreadOperator == null
           ? 0
           : this.spreadElement_spreadOperator.index);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.stringInterpolation) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.stringInterpolation_elements == null) {
@@ -10466,8 +10490,7 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.superConstructorInvocation) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.superConstructorInvocation_arguments != null);
@@ -10477,16 +10500,19 @@
       this
           .superConstructorInvocation_constructorName
           ?.collectApiSignature(signature);
+      signature.addInt(this.superConstructorInvocation_element ?? 0);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
+      signature.addBool(this.superConstructorInvocation_substitution != null);
+      this
+          .superConstructorInvocation_substitution
+          ?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.superExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.switchCase) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.switchMember_labels == null) {
@@ -10508,8 +10534,7 @@
       signature.addBool(this.switchCase_expression != null);
       this.switchCase_expression?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.switchDefault) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.switchMember_labels == null) {
@@ -10529,8 +10554,7 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.switchStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.switchStatement_members == null) {
@@ -10544,8 +10568,7 @@
       signature.addBool(this.switchStatement_expression != null);
       this.switchStatement_expression?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.symbolLiteral) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.flags ?? 0);
@@ -10559,15 +10582,13 @@
           signature.addString(x);
         }
       }
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.thisExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.throwExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.throwExpression_expression != null);
@@ -10575,8 +10596,7 @@
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.topLevelVariableDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -10592,8 +10612,7 @@
           .topLevelVariableDeclaration_variableList
           ?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.tryStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.tryStatement_catchClauses == null) {
@@ -10609,8 +10628,7 @@
       signature.addBool(this.tryStatement_finallyBlock != null);
       this.tryStatement_finallyBlock?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.typeArgumentList) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.typeArgumentList_arguments == null) {
@@ -10622,8 +10640,7 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.typeName) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.typeName_typeArguments == null) {
@@ -10639,8 +10656,7 @@
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.typeName_type != null);
       this.typeName_type?.collectApiSignature(signature);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.typeParameter) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -10658,8 +10674,6 @@
       signature.addBool(this.typeParameter_defaultType != null);
       this.typeParameter_defaultType?.collectApiSignature(signature);
       signature.addString(this.name ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.typeParameterList) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.typeParameterList_typeParameters == null) {
@@ -10671,8 +10685,7 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.variableDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -10692,8 +10705,6 @@
       signature.addBool(this.topLevelTypeInferenceError != null);
       this.topLevelTypeInferenceError?.collectApiSignature(signature);
       signature.addString(this.name ?? '');
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.variableDeclarationList) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.variableDeclarationList_variables == null) {
@@ -10715,8 +10726,7 @@
       signature.addBool(this.variableDeclarationList_type != null);
       this.variableDeclarationList_type?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.variableDeclarationStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.variableDeclarationStatement_variables != null);
@@ -10724,8 +10734,7 @@
           .variableDeclarationStatement_variables
           ?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.whileStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.whileStatement_body != null);
@@ -10733,8 +10742,7 @@
       signature.addBool(this.whileStatement_condition != null);
       this.whileStatement_condition?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.withClause) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.withClause_mixinTypes == null) {
@@ -10746,15 +10754,13 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.yieldStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.yieldStatement_expression != null);
       this.yieldStatement_expression?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.resolution != null);
-      this.resolution?.collectApiSignature(signature);
+      signature.addString(this.name ?? '');
     }
   }
 
@@ -10765,24 +10771,24 @@
     fb.Offset offset_variantField_6;
     fb.Offset offset_variantField_7;
     fb.Offset offset_variantField_8;
+    fb.Offset offset_variantField_38;
     fb.Offset offset_variantField_9;
     fb.Offset offset_variantField_12;
     fb.Offset offset_variantField_5;
     fb.Offset offset_variantField_13;
     fb.Offset offset_variantField_33;
     fb.Offset offset_variantField_3;
-    fb.Offset offset_variantField_19;
-    fb.Offset offset_variantField_39;
+    fb.Offset offset_variantField_41;
+    fb.Offset offset_variantField_40;
     fb.Offset offset_variantField_10;
     fb.Offset offset_variantField_25;
     fb.Offset offset_variantField_20;
-    fb.Offset offset_variantField_38;
+    fb.Offset offset_variantField_39;
     fb.Offset offset_variantField_1;
     fb.Offset offset_variantField_30;
     fb.Offset offset_variantField_14;
     fb.Offset offset_variantField_34;
-    fb.Offset offset_variantField_37;
-    fb.Offset offset_resolution;
+    fb.Offset offset_name;
     fb.Offset offset_variantField_32;
     fb.Offset offset_variantField_23;
     fb.Offset offset_variantField_11;
@@ -10807,6 +10813,9 @@
     if (_variantField_8 != null) {
       offset_variantField_8 = _variantField_8.finish(fbBuilder);
     }
+    if (_variantField_38 != null) {
+      offset_variantField_38 = _variantField_38.finish(fbBuilder);
+    }
     if (_variantField_9 != null) {
       offset_variantField_9 = _variantField_9.finish(fbBuilder);
     }
@@ -10828,11 +10837,11 @@
       offset_variantField_3 = fbBuilder
           .writeList(_variantField_3.map((b) => b.finish(fbBuilder)).toList());
     }
-    if (!(_variantField_19 == null || _variantField_19.isEmpty)) {
-      offset_variantField_19 = fbBuilder.writeListUint32(_variantField_19);
+    if (!(_variantField_41 == null || _variantField_41.isEmpty)) {
+      offset_variantField_41 = fbBuilder.writeListUint32(_variantField_41);
     }
-    if (_variantField_39 != null) {
-      offset_variantField_39 = _variantField_39.finish(fbBuilder);
+    if (_variantField_40 != null) {
+      offset_variantField_40 = _variantField_40.finish(fbBuilder);
     }
     if (_variantField_10 != null) {
       offset_variantField_10 = _variantField_10.finish(fbBuilder);
@@ -10843,9 +10852,9 @@
     if (_variantField_20 != null) {
       offset_variantField_20 = fbBuilder.writeString(_variantField_20);
     }
-    if (!(_variantField_38 == null || _variantField_38.isEmpty)) {
-      offset_variantField_38 = fbBuilder
-          .writeList(_variantField_38.map((b) => b.finish(fbBuilder)).toList());
+    if (!(_variantField_39 == null || _variantField_39.isEmpty)) {
+      offset_variantField_39 = fbBuilder
+          .writeList(_variantField_39.map((b) => b.finish(fbBuilder)).toList());
     }
     if (_variantField_1 != null) {
       offset_variantField_1 = fbBuilder.writeString(_variantField_1);
@@ -10860,11 +10869,8 @@
       offset_variantField_34 = fbBuilder.writeList(
           _variantField_34.map((b) => fbBuilder.writeString(b)).toList());
     }
-    if (_variantField_37 != null) {
-      offset_variantField_37 = fbBuilder.writeString(_variantField_37);
-    }
-    if (_resolution != null) {
-      offset_resolution = _resolution.finish(fbBuilder);
+    if (_name != null) {
+      offset_name = fbBuilder.writeString(_name);
     }
     if (_variantField_32 != null) {
       offset_variantField_32 = _variantField_32.finish(fbBuilder);
@@ -10894,9 +10900,18 @@
     if (offset_variantField_7 != null) {
       fbBuilder.addOffset(7, offset_variantField_7);
     }
+    if (_variantField_17 != null && _variantField_17 != 0) {
+      fbBuilder.addUint32(17, _variantField_17);
+    }
     if (offset_variantField_8 != null) {
       fbBuilder.addOffset(8, offset_variantField_8);
     }
+    if (offset_variantField_38 != null) {
+      fbBuilder.addOffset(38, offset_variantField_38);
+    }
+    if (_variantField_15 != null && _variantField_15 != 0) {
+      fbBuilder.addUint32(15, _variantField_15);
+    }
     if (_variantField_28 != null &&
         _variantField_28 != idl.UnlinkedTokenType.NOTHING) {
       fbBuilder.addUint8(28, _variantField_28.index);
@@ -10926,11 +10941,11 @@
     if (offset_variantField_3 != null) {
       fbBuilder.addOffset(3, offset_variantField_3);
     }
-    if (offset_variantField_19 != null) {
-      fbBuilder.addOffset(19, offset_variantField_19);
+    if (offset_variantField_41 != null) {
+      fbBuilder.addOffset(41, offset_variantField_41);
     }
-    if (offset_variantField_39 != null) {
-      fbBuilder.addOffset(39, offset_variantField_39);
+    if (offset_variantField_40 != null) {
+      fbBuilder.addOffset(40, offset_variantField_40);
     }
     if (offset_variantField_10 != null) {
       fbBuilder.addOffset(10, offset_variantField_10);
@@ -10943,24 +10958,18 @@
     if (_variantField_21 != null && _variantField_21 != 0.0) {
       fbBuilder.addFloat64(21, _variantField_21);
     }
-    if (_variantField_15 != null && _variantField_15 != 0) {
-      fbBuilder.addUint32(15, _variantField_15);
-    }
     if (offset_variantField_25 != null) {
       fbBuilder.addOffset(25, offset_variantField_25);
     }
     if (offset_variantField_20 != null) {
       fbBuilder.addOffset(20, offset_variantField_20);
     }
-    if (offset_variantField_38 != null) {
-      fbBuilder.addOffset(38, offset_variantField_38);
+    if (offset_variantField_39 != null) {
+      fbBuilder.addOffset(39, offset_variantField_39);
     }
     if (_flags != null && _flags != 0) {
       fbBuilder.addUint32(18, _flags);
     }
-    if (_variantField_17 != null && _variantField_17 != 0) {
-      fbBuilder.addUint32(17, _variantField_17);
-    }
     if (offset_variantField_1 != null) {
       fbBuilder.addOffset(1, offset_variantField_1);
     }
@@ -10985,11 +10994,8 @@
     if (offset_variantField_34 != null) {
       fbBuilder.addOffset(34, offset_variantField_34);
     }
-    if (offset_variantField_37 != null) {
-      fbBuilder.addOffset(37, offset_variantField_37);
-    }
-    if (offset_resolution != null) {
-      fbBuilder.addOffset(40, offset_resolution);
+    if (offset_name != null) {
+      fbBuilder.addOffset(37, offset_name);
     }
     if (_variantField_35 != null &&
         _variantField_35 != idl.UnlinkedTokenType.NOTHING) {
@@ -11007,6 +11013,9 @@
     if (offset_variantField_22 != null) {
       fbBuilder.addOffset(22, offset_variantField_22);
     }
+    if (_variantField_19 != null && _variantField_19 != 0) {
+      fbBuilder.addUint32(19, _variantField_19);
+    }
     return fbBuilder.endTable();
   }
 }
@@ -11032,7 +11041,10 @@
   List<idl.LinkedNode> _variantField_4;
   idl.LinkedNode _variantField_6;
   idl.LinkedNode _variantField_7;
+  int _variantField_17;
   idl.LinkedNode _variantField_8;
+  idl.LinkedNodeTypeSubstitution _variantField_38;
+  int _variantField_15;
   idl.UnlinkedTokenType _variantField_28;
   bool _variantField_27;
   idl.LinkedNode _variantField_9;
@@ -11042,17 +11054,15 @@
   List<String> _variantField_33;
   idl.LinkedNodeCommentType _variantField_29;
   List<idl.LinkedNode> _variantField_3;
-  List<int> _variantField_19;
-  idl.LinkedLibraryLanguageVersion _variantField_39;
+  List<int> _variantField_41;
+  idl.LinkedLibraryLanguageVersion _variantField_40;
   idl.LinkedNode _variantField_10;
   idl.LinkedNodeFormalParameterKind _variantField_26;
   double _variantField_21;
-  int _variantField_15;
   idl.LinkedNodeType _variantField_25;
   String _variantField_20;
-  List<idl.LinkedNodeType> _variantField_38;
+  List<idl.LinkedNodeType> _variantField_39;
   int _flags;
-  int _variantField_17;
   String _variantField_1;
   int _variantField_36;
   int _variantField_16;
@@ -11061,13 +11071,13 @@
   idl.LinkedNodeKind _kind;
   bool _variantField_31;
   List<String> _variantField_34;
-  String _variantField_37;
-  idl.LinkedNodeResolution _resolution;
+  String _name;
   idl.UnlinkedTokenType _variantField_35;
   idl.TopLevelInferenceError _variantField_32;
   idl.LinkedNodeType _variantField_23;
   idl.LinkedNode _variantField_11;
   String _variantField_22;
+  int _variantField_19;
 
   @override
   idl.LinkedNodeType get actualReturnType {
@@ -11083,8 +11093,7 @@
 
   @override
   idl.LinkedNodeType get actualType {
-    assert(kind == idl.LinkedNodeKind.defaultFormalParameter ||
-        kind == idl.LinkedNodeKind.fieldFormalParameter ||
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
         kind == idl.LinkedNodeKind.simpleFormalParameter ||
         kind == idl.LinkedNodeKind.variableDeclaration);
@@ -12373,6 +12382,22 @@
   }
 
   @override
+  int get annotation_element {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get genericFunctionType_id {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
   idl.LinkedNode get annotation_name {
     assert(kind == idl.LinkedNodeKind.annotation);
     _variantField_8 ??=
@@ -12509,6 +12534,191 @@
   }
 
   @override
+  idl.LinkedNodeTypeSubstitution get annotation_substitution {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    _variantField_38 ??= const _LinkedNodeTypeSubstitutionReader()
+        .vTableGet(_bc, _bcOffset, 38, null);
+    return _variantField_38;
+  }
+
+  @override
+  idl.LinkedNodeTypeSubstitution get assignmentExpression_substitution {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    _variantField_38 ??= const _LinkedNodeTypeSubstitutionReader()
+        .vTableGet(_bc, _bcOffset, 38, null);
+    return _variantField_38;
+  }
+
+  @override
+  idl.LinkedNodeTypeSubstitution get binaryExpression_substitution {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    _variantField_38 ??= const _LinkedNodeTypeSubstitutionReader()
+        .vTableGet(_bc, _bcOffset, 38, null);
+    return _variantField_38;
+  }
+
+  @override
+  idl.LinkedNodeTypeSubstitution get constructorName_substitution {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    _variantField_38 ??= const _LinkedNodeTypeSubstitutionReader()
+        .vTableGet(_bc, _bcOffset, 38, null);
+    return _variantField_38;
+  }
+
+  @override
+  idl.LinkedNodeTypeSubstitution get indexExpression_substitution {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    _variantField_38 ??= const _LinkedNodeTypeSubstitutionReader()
+        .vTableGet(_bc, _bcOffset, 38, null);
+    return _variantField_38;
+  }
+
+  @override
+  idl.LinkedNodeTypeSubstitution get postfixExpression_substitution {
+    assert(kind == idl.LinkedNodeKind.postfixExpression);
+    _variantField_38 ??= const _LinkedNodeTypeSubstitutionReader()
+        .vTableGet(_bc, _bcOffset, 38, null);
+    return _variantField_38;
+  }
+
+  @override
+  idl.LinkedNodeTypeSubstitution get prefixExpression_substitution {
+    assert(kind == idl.LinkedNodeKind.prefixExpression);
+    _variantField_38 ??= const _LinkedNodeTypeSubstitutionReader()
+        .vTableGet(_bc, _bcOffset, 38, null);
+    return _variantField_38;
+  }
+
+  @override
+  idl.LinkedNodeTypeSubstitution
+      get redirectingConstructorInvocation_substitution {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    _variantField_38 ??= const _LinkedNodeTypeSubstitutionReader()
+        .vTableGet(_bc, _bcOffset, 38, null);
+    return _variantField_38;
+  }
+
+  @override
+  idl.LinkedNodeTypeSubstitution get simpleIdentifier_substitution {
+    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
+    _variantField_38 ??= const _LinkedNodeTypeSubstitutionReader()
+        .vTableGet(_bc, _bcOffset, 38, null);
+    return _variantField_38;
+  }
+
+  @override
+  idl.LinkedNodeTypeSubstitution get superConstructorInvocation_substitution {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    _variantField_38 ??= const _LinkedNodeTypeSubstitutionReader()
+        .vTableGet(_bc, _bcOffset, 38, null);
+    return _variantField_38;
+  }
+
+  @override
+  int get assignmentExpression_element {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get binaryExpression_element {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get constructorName_element {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get emptyFunctionBody_fake {
+    assert(kind == idl.LinkedNodeKind.emptyFunctionBody);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get emptyStatement_fake {
+    assert(kind == idl.LinkedNodeKind.emptyStatement);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get indexExpression_element {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get nullLiteral_fake {
+    assert(kind == idl.LinkedNodeKind.nullLiteral);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get postfixExpression_element {
+    assert(kind == idl.LinkedNodeKind.postfixExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get prefixExpression_element {
+    assert(kind == idl.LinkedNodeKind.prefixExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get redirectingConstructorInvocation_element {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get simpleIdentifier_element {
+    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get superConstructorInvocation_element {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get typeParameter_variance {
+    assert(kind == idl.LinkedNodeKind.typeParameter);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
   idl.UnlinkedTokenType get assignmentExpression_operator {
     assert(kind == idl.LinkedNodeKind.assignmentExpression);
     _variantField_28 ??= const _UnlinkedTokenTypeReader()
@@ -12738,17 +12948,17 @@
   @override
   List<int> get compilationUnit_featureSet {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
-    _variantField_19 ??= const fb.Uint32ListReader()
-        .vTableGet(_bc, _bcOffset, 19, const <int>[]);
-    return _variantField_19;
+    _variantField_41 ??= const fb.Uint32ListReader()
+        .vTableGet(_bc, _bcOffset, 41, const <int>[]);
+    return _variantField_41;
   }
 
   @override
   idl.LinkedLibraryLanguageVersion get compilationUnit_languageVersion {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
-    _variantField_39 ??= const _LinkedLibraryLanguageVersionReader()
-        .vTableGet(_bc, _bcOffset, 39, null);
-    return _variantField_39;
+    _variantField_40 ??= const _LinkedLibraryLanguageVersionReader()
+        .vTableGet(_bc, _bcOffset, 40, null);
+    return _variantField_40;
   }
 
   @override
@@ -12779,44 +12989,11 @@
   }
 
   @override
-  int get emptyFunctionBody_fake {
-    assert(kind == idl.LinkedNodeKind.emptyFunctionBody);
-    _variantField_15 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
-    return _variantField_15;
-  }
-
-  @override
-  int get emptyStatement_fake {
-    assert(kind == idl.LinkedNodeKind.emptyStatement);
-    _variantField_15 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
-    return _variantField_15;
-  }
-
-  @override
-  int get nullLiteral_fake {
-    assert(kind == idl.LinkedNodeKind.nullLiteral);
-    _variantField_15 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
-    return _variantField_15;
-  }
-
-  @override
-  int get typeParameter_variance {
-    assert(kind == idl.LinkedNodeKind.typeParameter);
-    _variantField_15 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
-    return _variantField_15;
-  }
-
-  @override
   idl.LinkedNodeType get expression_type {
     assert(kind == idl.LinkedNodeKind.assignmentExpression ||
         kind == idl.LinkedNodeKind.asExpression ||
         kind == idl.LinkedNodeKind.awaitExpression ||
         kind == idl.LinkedNodeKind.binaryExpression ||
-        kind == idl.LinkedNodeKind.booleanLiteral ||
         kind == idl.LinkedNodeKind.cascadeExpression ||
         kind == idl.LinkedNodeKind.conditionalExpression ||
         kind == idl.LinkedNodeKind.functionExpressionInvocation ||
@@ -12833,6 +13010,7 @@
         kind == idl.LinkedNodeKind.postfixExpression ||
         kind == idl.LinkedNodeKind.rethrowExpression ||
         kind == idl.LinkedNodeKind.setOrMapLiteral ||
+        kind == idl.LinkedNodeKind.simpleIdentifier ||
         kind == idl.LinkedNodeKind.superExpression ||
         kind == idl.LinkedNodeKind.symbolLiteral ||
         kind == idl.LinkedNodeKind.thisExpression ||
@@ -12878,10 +13056,10 @@
   @override
   List<idl.LinkedNodeType> get extensionOverride_typeArgumentTypes {
     assert(kind == idl.LinkedNodeKind.extensionOverride);
-    _variantField_38 ??=
+    _variantField_39 ??=
         const fb.ListReader<idl.LinkedNodeType>(_LinkedNodeTypeReader())
-            .vTableGet(_bc, _bcOffset, 38, const <idl.LinkedNodeType>[]);
-    return _variantField_38;
+            .vTableGet(_bc, _bcOffset, 39, const <idl.LinkedNodeType>[]);
+    return _variantField_39;
   }
 
   @override
@@ -12891,14 +13069,6 @@
   }
 
   @override
-  int get genericFunctionType_id {
-    assert(kind == idl.LinkedNodeKind.genericFunctionType);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
   String get importDirective_prefix {
     assert(kind == idl.LinkedNodeKind.importDirective);
     _variantField_1 ??=
@@ -13024,33 +13194,8 @@
 
   @override
   String get name {
-    assert(kind == idl.LinkedNodeKind.classDeclaration ||
-        kind == idl.LinkedNodeKind.classTypeAlias ||
-        kind == idl.LinkedNodeKind.constructorDeclaration ||
-        kind == idl.LinkedNodeKind.enumDeclaration ||
-        kind == idl.LinkedNodeKind.enumConstantDeclaration ||
-        kind == idl.LinkedNodeKind.extensionDeclaration ||
-        kind == idl.LinkedNodeKind.fieldFormalParameter ||
-        kind == idl.LinkedNodeKind.functionDeclaration ||
-        kind == idl.LinkedNodeKind.functionTypeAlias ||
-        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
-        kind == idl.LinkedNodeKind.genericTypeAlias ||
-        kind == idl.LinkedNodeKind.methodDeclaration ||
-        kind == idl.LinkedNodeKind.mixinDeclaration ||
-        kind == idl.LinkedNodeKind.simpleFormalParameter ||
-        kind == idl.LinkedNodeKind.simpleIdentifier ||
-        kind == idl.LinkedNodeKind.typeParameter ||
-        kind == idl.LinkedNodeKind.variableDeclaration);
-    _variantField_37 ??=
-        const fb.StringReader().vTableGet(_bc, _bcOffset, 37, '');
-    return _variantField_37;
-  }
-
-  @override
-  idl.LinkedNodeResolution get resolution {
-    _resolution ??=
-        const _LinkedNodeResolutionReader().vTableGet(_bc, _bcOffset, 40, null);
-    return _resolution;
+    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 37, '');
+    return _name;
   }
 
   @override
@@ -13104,6 +13249,16 @@
         const fb.StringReader().vTableGet(_bc, _bcOffset, 22, '');
     return _variantField_22;
   }
+
+  @override
+  int get uriBasedDirective_uriElement {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.partDirective);
+    _variantField_19 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 19, 0);
+    return _variantField_19;
+  }
 }
 
 abstract class _LinkedNodeMixin implements idl.LinkedNode {
@@ -13116,8 +13271,8 @@
     if (kind != idl.LinkedNodeKind.adjacentStrings) {
       _result["kind"] = kind.toString().split('.')[1];
     }
-    if (resolution != null) {
-      _result["resolution"] = resolution.toJson();
+    if (name != '') {
+      _result["name"] = name;
     }
     if (kind == idl.LinkedNodeKind.adjacentStrings) {
       if (adjacentStrings_strings.isNotEmpty) {
@@ -13133,9 +13288,15 @@
         _result["annotation_constructorName"] =
             annotation_constructorName.toJson();
       }
+      if (annotation_element != 0) {
+        _result["annotation_element"] = annotation_element;
+      }
       if (annotation_name != null) {
         _result["annotation_name"] = annotation_name.toJson();
       }
+      if (annotation_substitution != null) {
+        _result["annotation_substitution"] = annotation_substitution.toJson();
+      }
     }
     if (kind == idl.LinkedNodeKind.argumentList) {
       if (argumentList_arguments.isNotEmpty) {
@@ -13182,6 +13343,13 @@
         _result["assignmentExpression_rightHandSide"] =
             assignmentExpression_rightHandSide.toJson();
       }
+      if (assignmentExpression_substitution != null) {
+        _result["assignmentExpression_substitution"] =
+            assignmentExpression_substitution.toJson();
+      }
+      if (assignmentExpression_element != 0) {
+        _result["assignmentExpression_element"] = assignmentExpression_element;
+      }
       if (assignmentExpression_operator != idl.UnlinkedTokenType.NOTHING) {
         _result["assignmentExpression_operator"] =
             assignmentExpression_operator.toString().split('.')[1];
@@ -13212,6 +13380,13 @@
         _result["binaryExpression_rightOperand"] =
             binaryExpression_rightOperand.toJson();
       }
+      if (binaryExpression_substitution != null) {
+        _result["binaryExpression_substitution"] =
+            binaryExpression_substitution.toJson();
+      }
+      if (binaryExpression_element != 0) {
+        _result["binaryExpression_element"] = binaryExpression_element;
+      }
       if (binaryExpression_operator != idl.UnlinkedTokenType.NOTHING) {
         _result["binaryExpression_operator"] =
             binaryExpression_operator.toString().split('.')[1];
@@ -13235,9 +13410,6 @@
       if (booleanLiteral_value != false) {
         _result["booleanLiteral_value"] = booleanLiteral_value;
       }
-      if (expression_type != null) {
-        _result["expression_type"] = expression_type.toJson();
-      }
     }
     if (kind == idl.LinkedNodeKind.breakStatement) {
       if (breakStatement_label != null) {
@@ -13316,9 +13488,6 @@
         _result["simplyBoundable_isSimplyBounded"] =
             simplyBoundable_isSimplyBounded;
       }
-      if (name != '') {
-        _result["name"] = name;
-      }
       if (unused11 != null) {
         _result["unused11"] = unused11.toJson();
       }
@@ -13351,9 +13520,6 @@
         _result["simplyBoundable_isSimplyBounded"] =
             simplyBoundable_isSimplyBounded;
       }
-      if (name != '') {
-        _result["name"] = name;
-      }
     }
     if (kind == idl.LinkedNodeKind.comment) {
       if (comment_references.isNotEmpty) {
@@ -13457,9 +13623,6 @@
       if (informativeId != 0) {
         _result["informativeId"] = informativeId;
       }
-      if (name != '') {
-        _result["name"] = name;
-      }
     }
     if (kind == idl.LinkedNodeKind.constructorFieldInitializer) {
       if (constructorFieldInitializer_expression != null) {
@@ -13478,6 +13641,13 @@
       if (constructorName_type != null) {
         _result["constructorName_type"] = constructorName_type.toJson();
       }
+      if (constructorName_substitution != null) {
+        _result["constructorName_substitution"] =
+            constructorName_substitution.toJson();
+      }
+      if (constructorName_element != 0) {
+        _result["constructorName_element"] = constructorName_element;
+      }
     }
     if (kind == idl.LinkedNodeKind.continueStatement) {
       if (continueStatement_label != null) {
@@ -13498,9 +13668,6 @@
       }
     }
     if (kind == idl.LinkedNodeKind.defaultFormalParameter) {
-      if (actualType != null) {
-        _result["actualType"] = actualType.toJson();
-      }
       if (defaultFormalParameter_defaultValue != null) {
         _result["defaultFormalParameter_defaultValue"] =
             defaultFormalParameter_defaultValue.toJson();
@@ -13557,9 +13724,6 @@
       if (informativeId != 0) {
         _result["informativeId"] = informativeId;
       }
-      if (name != '') {
-        _result["name"] = name;
-      }
     }
     if (kind == idl.LinkedNodeKind.enumDeclaration) {
       if (enumDeclaration_constants.isNotEmpty) {
@@ -13573,9 +13737,6 @@
       if (informativeId != 0) {
         _result["informativeId"] = informativeId;
       }
-      if (name != '') {
-        _result["name"] = name;
-      }
     }
     if (kind == idl.LinkedNodeKind.exportDirective) {
       if (namespaceDirective_combinators.isNotEmpty) {
@@ -13607,6 +13768,9 @@
       if (uriBasedDirective_uriContent != '') {
         _result["uriBasedDirective_uriContent"] = uriBasedDirective_uriContent;
       }
+      if (uriBasedDirective_uriElement != 0) {
+        _result["uriBasedDirective_uriElement"] = uriBasedDirective_uriElement;
+      }
     }
     if (kind == idl.LinkedNodeKind.expressionFunctionBody) {
       if (expressionFunctionBody_expression != null) {
@@ -13649,9 +13813,6 @@
       if (informativeId != 0) {
         _result["informativeId"] = informativeId;
       }
-      if (name != '') {
-        _result["name"] = name;
-      }
     }
     if (kind == idl.LinkedNodeKind.extensionOverride) {
       if (extensionOverride_extendedType != null) {
@@ -13718,9 +13879,6 @@
       if (informativeId != 0) {
         _result["informativeId"] = informativeId;
       }
-      if (name != '') {
-        _result["name"] = name;
-      }
     }
     if (kind == idl.LinkedNodeKind.forEachPartsWithDeclaration) {
       if (forEachParts_iterable != null) {
@@ -13809,9 +13967,6 @@
       if (informativeId != 0) {
         _result["informativeId"] = informativeId;
       }
-      if (name != '') {
-        _result["name"] = name;
-      }
     }
     if (kind == idl.LinkedNodeKind.functionDeclarationStatement) {
       if (functionDeclarationStatement_functionDeclaration != null) {
@@ -13886,9 +14041,6 @@
         _result["simplyBoundable_isSimplyBounded"] =
             simplyBoundable_isSimplyBounded;
       }
-      if (name != '') {
-        _result["name"] = name;
-      }
     }
     if (kind == idl.LinkedNodeKind.functionTypedFormalParameter) {
       if (actualType != null) {
@@ -13918,9 +14070,6 @@
       if (informativeId != 0) {
         _result["informativeId"] = informativeId;
       }
-      if (name != '') {
-        _result["name"] = name;
-      }
     }
     if (kind == idl.LinkedNodeKind.genericFunctionType) {
       if (actualReturnType != null) {
@@ -13934,6 +14083,9 @@
         _result["genericFunctionType_returnType"] =
             genericFunctionType_returnType.toJson();
       }
+      if (genericFunctionType_id != 0) {
+        _result["genericFunctionType_id"] = genericFunctionType_id;
+      }
       if (genericFunctionType_formalParameters != null) {
         _result["genericFunctionType_formalParameters"] =
             genericFunctionType_formalParameters.toJson();
@@ -13941,9 +14093,6 @@
       if (genericFunctionType_type != null) {
         _result["genericFunctionType_type"] = genericFunctionType_type.toJson();
       }
-      if (genericFunctionType_id != 0) {
-        _result["genericFunctionType_id"] = genericFunctionType_id;
-      }
     }
     if (kind == idl.LinkedNodeKind.genericTypeAlias) {
       if (annotatedNode_metadata.isNotEmpty) {
@@ -13968,9 +14117,6 @@
         _result["simplyBoundable_isSimplyBounded"] =
             simplyBoundable_isSimplyBounded;
       }
-      if (name != '') {
-        _result["name"] = name;
-      }
     }
     if (kind == idl.LinkedNodeKind.hideCombinator) {
       if (informativeId != 0) {
@@ -14044,6 +14190,9 @@
       if (uriBasedDirective_uriContent != '') {
         _result["uriBasedDirective_uriContent"] = uriBasedDirective_uriContent;
       }
+      if (uriBasedDirective_uriElement != 0) {
+        _result["uriBasedDirective_uriElement"] = uriBasedDirective_uriElement;
+      }
     }
     if (kind == idl.LinkedNodeKind.indexExpression) {
       if (indexExpression_index != null) {
@@ -14052,6 +14201,13 @@
       if (indexExpression_target != null) {
         _result["indexExpression_target"] = indexExpression_target.toJson();
       }
+      if (indexExpression_substitution != null) {
+        _result["indexExpression_substitution"] =
+            indexExpression_substitution.toJson();
+      }
+      if (indexExpression_element != 0) {
+        _result["indexExpression_element"] = indexExpression_element;
+      }
       if (expression_type != null) {
         _result["expression_type"] = expression_type.toJson();
       }
@@ -14189,9 +14345,6 @@
         _result["methodDeclaration_hasOperatorEqualWithParameterTypeFromObject"] =
             methodDeclaration_hasOperatorEqualWithParameterTypeFromObject;
       }
-      if (name != '') {
-        _result["name"] = name;
-      }
       if (topLevelTypeInferenceError != null) {
         _result["topLevelTypeInferenceError"] =
             topLevelTypeInferenceError.toJson();
@@ -14255,9 +14408,6 @@
         _result["mixinDeclaration_superInvokedNames"] =
             mixinDeclaration_superInvokedNames;
       }
-      if (name != '') {
-        _result["name"] = name;
-      }
     }
     if (kind == idl.LinkedNodeKind.namedExpression) {
       if (namedExpression_expression != null) {
@@ -14318,6 +14468,9 @@
       if (uriBasedDirective_uriContent != '') {
         _result["uriBasedDirective_uriContent"] = uriBasedDirective_uriContent;
       }
+      if (uriBasedDirective_uriElement != 0) {
+        _result["uriBasedDirective_uriElement"] = uriBasedDirective_uriElement;
+      }
     }
     if (kind == idl.LinkedNodeKind.partOfDirective) {
       if (annotatedNode_metadata.isNotEmpty) {
@@ -14340,6 +14493,13 @@
         _result["postfixExpression_operand"] =
             postfixExpression_operand.toJson();
       }
+      if (postfixExpression_substitution != null) {
+        _result["postfixExpression_substitution"] =
+            postfixExpression_substitution.toJson();
+      }
+      if (postfixExpression_element != 0) {
+        _result["postfixExpression_element"] = postfixExpression_element;
+      }
       if (postfixExpression_operator != idl.UnlinkedTokenType.NOTHING) {
         _result["postfixExpression_operator"] =
             postfixExpression_operator.toString().split('.')[1];
@@ -14352,6 +14512,13 @@
       if (prefixExpression_operand != null) {
         _result["prefixExpression_operand"] = prefixExpression_operand.toJson();
       }
+      if (prefixExpression_substitution != null) {
+        _result["prefixExpression_substitution"] =
+            prefixExpression_substitution.toJson();
+      }
+      if (prefixExpression_element != 0) {
+        _result["prefixExpression_element"] = prefixExpression_element;
+      }
       if (prefixExpression_operator != idl.UnlinkedTokenType.NOTHING) {
         _result["prefixExpression_operator"] =
             prefixExpression_operator.toString().split('.')[1];
@@ -14398,6 +14565,14 @@
         _result["redirectingConstructorInvocation_constructorName"] =
             redirectingConstructorInvocation_constructorName.toJson();
       }
+      if (redirectingConstructorInvocation_substitution != null) {
+        _result["redirectingConstructorInvocation_substitution"] =
+            redirectingConstructorInvocation_substitution.toJson();
+      }
+      if (redirectingConstructorInvocation_element != 0) {
+        _result["redirectingConstructorInvocation_element"] =
+            redirectingConstructorInvocation_element;
+      }
     }
     if (kind == idl.LinkedNodeKind.rethrowExpression) {
       if (expression_type != null) {
@@ -14452,17 +14627,21 @@
       if (informativeId != 0) {
         _result["informativeId"] = informativeId;
       }
-      if (name != '') {
-        _result["name"] = name;
-      }
       if (topLevelTypeInferenceError != null) {
         _result["topLevelTypeInferenceError"] =
             topLevelTypeInferenceError.toJson();
       }
     }
     if (kind == idl.LinkedNodeKind.simpleIdentifier) {
-      if (name != '') {
-        _result["name"] = name;
+      if (simpleIdentifier_substitution != null) {
+        _result["simpleIdentifier_substitution"] =
+            simpleIdentifier_substitution.toJson();
+      }
+      if (simpleIdentifier_element != 0) {
+        _result["simpleIdentifier_element"] = simpleIdentifier_element;
+      }
+      if (expression_type != null) {
+        _result["expression_type"] = expression_type.toJson();
       }
     }
     if (kind == idl.LinkedNodeKind.simpleStringLiteral) {
@@ -14495,6 +14674,14 @@
         _result["superConstructorInvocation_constructorName"] =
             superConstructorInvocation_constructorName.toJson();
       }
+      if (superConstructorInvocation_substitution != null) {
+        _result["superConstructorInvocation_substitution"] =
+            superConstructorInvocation_substitution.toJson();
+      }
+      if (superConstructorInvocation_element != 0) {
+        _result["superConstructorInvocation_element"] =
+            superConstructorInvocation_element;
+      }
     }
     if (kind == idl.LinkedNodeKind.superExpression) {
       if (expression_type != null) {
@@ -14615,9 +14802,6 @@
       if (informativeId != 0) {
         _result["informativeId"] = informativeId;
       }
-      if (name != '') {
-        _result["name"] = name;
-      }
       if (typeParameter_defaultType != null) {
         _result["typeParameter_defaultType"] =
             typeParameter_defaultType.toJson();
@@ -14649,9 +14833,6 @@
       if (informativeId != 0) {
         _result["informativeId"] = informativeId;
       }
-      if (name != '') {
-        _result["name"] = name;
-      }
       if (topLevelTypeInferenceError != null) {
         _result["topLevelTypeInferenceError"] =
             topLevelTypeInferenceError.toJson();
@@ -14712,17 +14893,19 @@
         "adjacentStrings_strings": adjacentStrings_strings,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.annotation) {
       return {
         "annotation_arguments": annotation_arguments,
         "annotation_constructorName": annotation_constructorName,
+        "annotation_element": annotation_element,
         "annotation_name": annotation_name,
+        "annotation_substitution": annotation_substitution,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.argumentList) {
@@ -14730,7 +14913,7 @@
         "argumentList_arguments": argumentList_arguments,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.asExpression) {
@@ -14740,7 +14923,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.assertInitializer) {
@@ -14749,7 +14932,7 @@
         "assertInitializer_message": assertInitializer_message,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.assertStatement) {
@@ -14758,7 +14941,7 @@
         "assertStatement_message": assertStatement_message,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.assignmentExpression) {
@@ -14766,11 +14949,13 @@
         "assignmentExpression_leftHandSide": assignmentExpression_leftHandSide,
         "assignmentExpression_rightHandSide":
             assignmentExpression_rightHandSide,
+        "assignmentExpression_substitution": assignmentExpression_substitution,
+        "assignmentExpression_element": assignmentExpression_element,
         "assignmentExpression_operator": assignmentExpression_operator,
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.awaitExpression) {
@@ -14779,7 +14964,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.binaryExpression) {
@@ -14787,11 +14972,13 @@
         "binaryExpression_invokeType": binaryExpression_invokeType,
         "binaryExpression_leftOperand": binaryExpression_leftOperand,
         "binaryExpression_rightOperand": binaryExpression_rightOperand,
+        "binaryExpression_substitution": binaryExpression_substitution,
+        "binaryExpression_element": binaryExpression_element,
         "binaryExpression_operator": binaryExpression_operator,
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.block) {
@@ -14799,7 +14986,7 @@
         "block_statements": block_statements,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.blockFunctionBody) {
@@ -14807,16 +14994,15 @@
         "blockFunctionBody_block": blockFunctionBody_block,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.booleanLiteral) {
       return {
         "booleanLiteral_value": booleanLiteral_value,
-        "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.breakStatement) {
@@ -14824,7 +15010,7 @@
         "breakStatement_label": breakStatement_label,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.cascadeExpression) {
@@ -14834,7 +15020,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.catchClause) {
@@ -14845,7 +15031,7 @@
         "catchClause_stackTraceParameter": catchClause_stackTraceParameter,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.classDeclaration) {
@@ -14865,7 +15051,6 @@
         "kind": kind,
         "simplyBoundable_isSimplyBounded": simplyBoundable_isSimplyBounded,
         "name": name,
-        "resolution": resolution,
         "unused11": unused11,
       };
     }
@@ -14881,7 +15066,6 @@
         "kind": kind,
         "simplyBoundable_isSimplyBounded": simplyBoundable_isSimplyBounded,
         "name": name,
-        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.comment) {
@@ -14891,7 +15075,7 @@
         "comment_type": comment_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.commentReference) {
@@ -14899,7 +15083,7 @@
         "commentReference_identifier": commentReference_identifier,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.compilationUnit) {
@@ -14912,7 +15096,7 @@
         "flags": flags,
         "informativeId": informativeId,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.conditionalExpression) {
@@ -14925,7 +15109,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.configuration) {
@@ -14935,7 +15119,7 @@
         "configuration_uri": configuration_uri,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.constructorDeclaration) {
@@ -14952,7 +15136,6 @@
         "informativeId": informativeId,
         "kind": kind,
         "name": name,
-        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.constructorFieldInitializer) {
@@ -14963,16 +15146,18 @@
             constructorFieldInitializer_fieldName,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.constructorName) {
       return {
         "constructorName_name": constructorName_name,
         "constructorName_type": constructorName_type,
+        "constructorName_substitution": constructorName_substitution,
+        "constructorName_element": constructorName_element,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.continueStatement) {
@@ -14980,7 +15165,7 @@
         "continueStatement_label": continueStatement_label,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.declaredIdentifier) {
@@ -14990,12 +15175,11 @@
         "declaredIdentifier_type": declaredIdentifier_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.defaultFormalParameter) {
       return {
-        "actualType": actualType,
         "defaultFormalParameter_defaultValue":
             defaultFormalParameter_defaultValue,
         "defaultFormalParameter_parameter": defaultFormalParameter_parameter,
@@ -15003,7 +15187,7 @@
         "flags": flags,
         "informativeId": informativeId,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.doStatement) {
@@ -15012,7 +15196,7 @@
         "doStatement_condition": doStatement_condition,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.dottedName) {
@@ -15020,7 +15204,7 @@
         "dottedName_components": dottedName_components,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.doubleLiteral) {
@@ -15028,7 +15212,7 @@
         "doubleLiteral_value": doubleLiteral_value,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.emptyFunctionBody) {
@@ -15036,7 +15220,7 @@
         "emptyFunctionBody_fake": emptyFunctionBody_fake,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.emptyStatement) {
@@ -15044,7 +15228,7 @@
         "emptyStatement_fake": emptyStatement_fake,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.enumConstantDeclaration) {
@@ -15054,7 +15238,6 @@
         "informativeId": informativeId,
         "kind": kind,
         "name": name,
-        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.enumDeclaration) {
@@ -15065,7 +15248,6 @@
         "informativeId": informativeId,
         "kind": kind,
         "name": name,
-        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.exportDirective) {
@@ -15078,8 +15260,9 @@
         "informativeId": informativeId,
         "uriBasedDirective_uri": uriBasedDirective_uri,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
         "uriBasedDirective_uriContent": uriBasedDirective_uriContent,
+        "uriBasedDirective_uriElement": uriBasedDirective_uriElement,
       };
     }
     if (kind == idl.LinkedNodeKind.expressionFunctionBody) {
@@ -15087,7 +15270,7 @@
         "expressionFunctionBody_expression": expressionFunctionBody_expression,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.expressionStatement) {
@@ -15095,7 +15278,7 @@
         "expressionStatement_expression": expressionStatement_expression,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.extendsClause) {
@@ -15103,7 +15286,7 @@
         "extendsClause_superclass": extendsClause_superclass,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.extensionDeclaration) {
@@ -15118,7 +15301,6 @@
         "informativeId": informativeId,
         "kind": kind,
         "name": name,
-        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.extensionOverride) {
@@ -15131,7 +15313,7 @@
             extensionOverride_typeArgumentTypes,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.fieldDeclaration) {
@@ -15141,7 +15323,7 @@
         "flags": flags,
         "informativeId": informativeId,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.fieldFormalParameter) {
@@ -15158,7 +15340,6 @@
         "informativeId": informativeId,
         "kind": kind,
         "name": name,
-        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.forEachPartsWithDeclaration) {
@@ -15168,7 +15349,7 @@
             forEachPartsWithDeclaration_loopVariable,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.forEachPartsWithIdentifier) {
@@ -15178,7 +15359,7 @@
             forEachPartsWithIdentifier_identifier,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.forElement) {
@@ -15187,7 +15368,7 @@
         "forElement_body": forElement_body,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.forPartsWithDeclarations) {
@@ -15198,7 +15379,7 @@
         "forParts_updaters": forParts_updaters,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.forPartsWithExpression) {
@@ -15209,7 +15390,7 @@
         "forParts_updaters": forParts_updaters,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.forStatement) {
@@ -15218,7 +15399,7 @@
         "forStatement_body": forStatement_body,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.formalParameterList) {
@@ -15226,7 +15407,7 @@
         "formalParameterList_parameters": formalParameterList_parameters,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.functionDeclaration) {
@@ -15240,7 +15421,6 @@
         "informativeId": informativeId,
         "kind": kind,
         "name": name,
-        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.functionDeclarationStatement) {
@@ -15249,7 +15429,7 @@
             functionDeclarationStatement_functionDeclaration,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.functionExpression) {
@@ -15261,7 +15441,7 @@
         "functionExpression_typeParameters": functionExpression_typeParameters,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.functionExpressionInvocation) {
@@ -15275,7 +15455,7 @@
         "flags": flags,
         "invocationExpression_arguments": invocationExpression_arguments,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.functionTypeAlias) {
@@ -15292,7 +15472,6 @@
         "kind": kind,
         "simplyBoundable_isSimplyBounded": simplyBoundable_isSimplyBounded,
         "name": name,
-        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.functionTypedFormalParameter) {
@@ -15310,7 +15489,6 @@
         "informativeId": informativeId,
         "kind": kind,
         "name": name,
-        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.genericFunctionType) {
@@ -15319,13 +15497,13 @@
         "genericFunctionType_typeParameters":
             genericFunctionType_typeParameters,
         "genericFunctionType_returnType": genericFunctionType_returnType,
+        "genericFunctionType_id": genericFunctionType_id,
         "genericFunctionType_formalParameters":
             genericFunctionType_formalParameters,
         "genericFunctionType_type": genericFunctionType_type,
         "flags": flags,
-        "genericFunctionType_id": genericFunctionType_id,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.genericTypeAlias) {
@@ -15339,7 +15517,6 @@
         "kind": kind,
         "simplyBoundable_isSimplyBounded": simplyBoundable_isSimplyBounded,
         "name": name,
-        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.hideCombinator) {
@@ -15348,7 +15525,7 @@
         "informativeId": informativeId,
         "kind": kind,
         "names": names,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.ifElement) {
@@ -15358,7 +15535,7 @@
         "ifElement_elseElement": ifElement_elseElement,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.ifStatement) {
@@ -15368,7 +15545,7 @@
         "ifStatement_thenStatement": ifStatement_thenStatement,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.implementsClause) {
@@ -15376,7 +15553,7 @@
         "implementsClause_interfaces": implementsClause_interfaces,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.importDirective) {
@@ -15390,18 +15567,21 @@
         "informativeId": informativeId,
         "uriBasedDirective_uri": uriBasedDirective_uri,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
         "uriBasedDirective_uriContent": uriBasedDirective_uriContent,
+        "uriBasedDirective_uriElement": uriBasedDirective_uriElement,
       };
     }
     if (kind == idl.LinkedNodeKind.indexExpression) {
       return {
         "indexExpression_index": indexExpression_index,
         "indexExpression_target": indexExpression_target,
+        "indexExpression_substitution": indexExpression_substitution,
+        "indexExpression_element": indexExpression_element,
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.instanceCreationExpression) {
@@ -15415,7 +15595,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.integerLiteral) {
@@ -15424,7 +15604,7 @@
         "flags": flags,
         "integerLiteral_value": integerLiteral_value,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.interpolationExpression) {
@@ -15433,7 +15613,7 @@
             interpolationExpression_expression,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.interpolationString) {
@@ -15441,7 +15621,7 @@
         "flags": flags,
         "interpolationString_value": interpolationString_value,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.isExpression) {
@@ -15450,7 +15630,7 @@
         "isExpression_type": isExpression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.label) {
@@ -15458,7 +15638,7 @@
         "label_label": label_label,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.labeledStatement) {
@@ -15467,7 +15647,7 @@
         "labeledStatement_statement": labeledStatement_statement,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.libraryDirective) {
@@ -15477,7 +15657,7 @@
         "flags": flags,
         "informativeId": informativeId,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.libraryIdentifier) {
@@ -15485,7 +15665,7 @@
         "libraryIdentifier_components": libraryIdentifier_components,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.listLiteral) {
@@ -15495,7 +15675,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.mapLiteralEntry) {
@@ -15504,7 +15684,7 @@
         "mapLiteralEntry_value": mapLiteralEntry_value,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.methodDeclaration) {
@@ -15522,7 +15702,6 @@
         "methodDeclaration_hasOperatorEqualWithParameterTypeFromObject":
             methodDeclaration_hasOperatorEqualWithParameterTypeFromObject,
         "name": name,
-        "resolution": resolution,
         "topLevelTypeInferenceError": topLevelTypeInferenceError,
       };
     }
@@ -15537,7 +15716,7 @@
         "flags": flags,
         "invocationExpression_arguments": invocationExpression_arguments,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.mixinDeclaration) {
@@ -15556,7 +15735,6 @@
         "mixinDeclaration_superInvokedNames":
             mixinDeclaration_superInvokedNames,
         "name": name,
-        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.namedExpression) {
@@ -15565,7 +15743,7 @@
         "namedExpression_name": namedExpression_name,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.nativeClause) {
@@ -15573,7 +15751,7 @@
         "nativeClause_name": nativeClause_name,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.nativeFunctionBody) {
@@ -15581,7 +15759,7 @@
         "nativeFunctionBody_stringLiteral": nativeFunctionBody_stringLiteral,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.nullLiteral) {
@@ -15590,7 +15768,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.onClause) {
@@ -15598,7 +15776,7 @@
         "onClause_superclassConstraints": onClause_superclassConstraints,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.parenthesizedExpression) {
@@ -15608,7 +15786,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.partDirective) {
@@ -15618,8 +15796,9 @@
         "informativeId": informativeId,
         "uriBasedDirective_uri": uriBasedDirective_uri,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
         "uriBasedDirective_uriContent": uriBasedDirective_uriContent,
+        "uriBasedDirective_uriElement": uriBasedDirective_uriElement,
       };
     }
     if (kind == idl.LinkedNodeKind.partOfDirective) {
@@ -15630,27 +15809,31 @@
         "flags": flags,
         "informativeId": informativeId,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.postfixExpression) {
       return {
         "postfixExpression_operand": postfixExpression_operand,
+        "postfixExpression_substitution": postfixExpression_substitution,
+        "postfixExpression_element": postfixExpression_element,
         "postfixExpression_operator": postfixExpression_operator,
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.prefixExpression) {
       return {
         "prefixExpression_operand": prefixExpression_operand,
+        "prefixExpression_substitution": prefixExpression_substitution,
+        "prefixExpression_element": prefixExpression_element,
         "prefixExpression_operator": prefixExpression_operator,
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.prefixedIdentifier) {
@@ -15660,7 +15843,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.propertyAccess) {
@@ -15671,7 +15854,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.redirectingConstructorInvocation) {
@@ -15680,9 +15863,13 @@
             redirectingConstructorInvocation_arguments,
         "redirectingConstructorInvocation_constructorName":
             redirectingConstructorInvocation_constructorName,
+        "redirectingConstructorInvocation_substitution":
+            redirectingConstructorInvocation_substitution,
+        "redirectingConstructorInvocation_element":
+            redirectingConstructorInvocation_element,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.rethrowExpression) {
@@ -15690,7 +15877,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.returnStatement) {
@@ -15698,7 +15885,7 @@
         "returnStatement_expression": returnStatement_expression,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.setOrMapLiteral) {
@@ -15708,7 +15895,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.showCombinator) {
@@ -15717,7 +15904,7 @@
         "informativeId": informativeId,
         "kind": kind,
         "names": names,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.simpleFormalParameter) {
@@ -15730,16 +15917,17 @@
         "informativeId": informativeId,
         "kind": kind,
         "name": name,
-        "resolution": resolution,
         "topLevelTypeInferenceError": topLevelTypeInferenceError,
       };
     }
     if (kind == idl.LinkedNodeKind.simpleIdentifier) {
       return {
+        "simpleIdentifier_substitution": simpleIdentifier_substitution,
+        "simpleIdentifier_element": simpleIdentifier_element,
+        "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
         "name": name,
-        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.simpleStringLiteral) {
@@ -15747,7 +15935,7 @@
         "simpleStringLiteral_value": simpleStringLiteral_value,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.spreadElement) {
@@ -15755,7 +15943,7 @@
         "spreadElement_expression": spreadElement_expression,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
         "spreadElement_spreadOperator": spreadElement_spreadOperator,
       };
     }
@@ -15764,7 +15952,7 @@
         "stringInterpolation_elements": stringInterpolation_elements,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.superConstructorInvocation) {
@@ -15773,9 +15961,13 @@
             superConstructorInvocation_arguments,
         "superConstructorInvocation_constructorName":
             superConstructorInvocation_constructorName,
+        "superConstructorInvocation_substitution":
+            superConstructorInvocation_substitution,
+        "superConstructorInvocation_element":
+            superConstructorInvocation_element,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.superExpression) {
@@ -15783,7 +15975,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.switchCase) {
@@ -15793,7 +15985,7 @@
         "switchMember_labels": switchMember_labels,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.switchDefault) {
@@ -15802,7 +15994,7 @@
         "switchMember_labels": switchMember_labels,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.switchStatement) {
@@ -15811,7 +16003,7 @@
         "switchStatement_expression": switchStatement_expression,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.symbolLiteral) {
@@ -15820,7 +16012,7 @@
         "flags": flags,
         "kind": kind,
         "names": names,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.thisExpression) {
@@ -15828,7 +16020,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.throwExpression) {
@@ -15837,7 +16029,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.topLevelVariableDeclaration) {
@@ -15848,7 +16040,7 @@
         "flags": flags,
         "informativeId": informativeId,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.tryStatement) {
@@ -15858,7 +16050,7 @@
         "tryStatement_finallyBlock": tryStatement_finallyBlock,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.typeArgumentList) {
@@ -15866,7 +16058,7 @@
         "typeArgumentList_arguments": typeArgumentList_arguments,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.typeName) {
@@ -15875,7 +16067,7 @@
         "typeName_name": typeName_name,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
         "typeName_type": typeName_type,
       };
     }
@@ -15888,7 +16080,6 @@
         "informativeId": informativeId,
         "kind": kind,
         "name": name,
-        "resolution": resolution,
         "typeParameter_defaultType": typeParameter_defaultType,
       };
     }
@@ -15897,7 +16088,7 @@
         "typeParameterList_typeParameters": typeParameterList_typeParameters,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.variableDeclaration) {
@@ -15910,7 +16101,6 @@
         "informativeId": informativeId,
         "kind": kind,
         "name": name,
-        "resolution": resolution,
         "topLevelTypeInferenceError": topLevelTypeInferenceError,
       };
     }
@@ -15922,7 +16112,7 @@
         "flags": flags,
         "informativeId": informativeId,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.variableDeclarationStatement) {
@@ -15931,7 +16121,7 @@
             variableDeclarationStatement_variables,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.whileStatement) {
@@ -15940,7 +16130,7 @@
         "whileStatement_condition": whileStatement_condition,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.withClause) {
@@ -15948,7 +16138,7 @@
         "withClause_mixinTypes": withClause_mixinTypes,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     if (kind == idl.LinkedNodeKind.yieldStatement) {
@@ -15956,7 +16146,7 @@
         "yieldStatement_expression": yieldStatement_expression,
         "flags": flags,
         "kind": kind,
-        "resolution": resolution,
+        "name": name,
       };
     }
     throw StateError("Unexpected $kind");
@@ -16471,179 +16661,6 @@
   String toString() => convert.json.encode(toJson());
 }
 
-class LinkedNodeResolutionBuilder extends Object
-    with _LinkedNodeResolutionMixin
-    implements idl.LinkedNodeResolution {
-  List<int> _elements;
-  List<LinkedNodeTypeSubstitutionBuilder> _substitutions;
-  List<LinkedNodeTypeBuilder> _types;
-
-  @override
-  List<int> get elements => _elements ??= <int>[];
-
-  set elements(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
-    this._elements = value;
-  }
-
-  @override
-  List<LinkedNodeTypeSubstitutionBuilder> get substitutions =>
-      _substitutions ??= <LinkedNodeTypeSubstitutionBuilder>[];
-
-  set substitutions(List<LinkedNodeTypeSubstitutionBuilder> value) {
-    this._substitutions = value;
-  }
-
-  @override
-  List<LinkedNodeTypeBuilder> get types => _types ??= <LinkedNodeTypeBuilder>[];
-
-  set types(List<LinkedNodeTypeBuilder> value) {
-    this._types = value;
-  }
-
-  LinkedNodeResolutionBuilder(
-      {List<int> elements,
-      List<LinkedNodeTypeSubstitutionBuilder> substitutions,
-      List<LinkedNodeTypeBuilder> types})
-      : _elements = elements,
-        _substitutions = substitutions,
-        _types = types;
-
-  /// Flush [informative] data recursively.
-  void flushInformative() {
-    _substitutions?.forEach((b) => b.flushInformative());
-    _types?.forEach((b) => b.flushInformative());
-  }
-
-  /// Accumulate non-[informative] data into [signature].
-  void collectApiSignature(api_sig.ApiSignature signature) {
-    if (this._elements == null) {
-      signature.addInt(0);
-    } else {
-      signature.addInt(this._elements.length);
-      for (var x in this._elements) {
-        signature.addInt(x);
-      }
-    }
-    if (this._substitutions == null) {
-      signature.addInt(0);
-    } else {
-      signature.addInt(this._substitutions.length);
-      for (var x in this._substitutions) {
-        x?.collectApiSignature(signature);
-      }
-    }
-    if (this._types == null) {
-      signature.addInt(0);
-    } else {
-      signature.addInt(this._types.length);
-      for (var x in this._types) {
-        x?.collectApiSignature(signature);
-      }
-    }
-  }
-
-  fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_elements;
-    fb.Offset offset_substitutions;
-    fb.Offset offset_types;
-    if (!(_elements == null || _elements.isEmpty)) {
-      offset_elements = fbBuilder.writeListUint32(_elements);
-    }
-    if (!(_substitutions == null || _substitutions.isEmpty)) {
-      offset_substitutions = fbBuilder
-          .writeList(_substitutions.map((b) => b.finish(fbBuilder)).toList());
-    }
-    if (!(_types == null || _types.isEmpty)) {
-      offset_types =
-          fbBuilder.writeList(_types.map((b) => b.finish(fbBuilder)).toList());
-    }
-    fbBuilder.startTable();
-    if (offset_elements != null) {
-      fbBuilder.addOffset(0, offset_elements);
-    }
-    if (offset_substitutions != null) {
-      fbBuilder.addOffset(1, offset_substitutions);
-    }
-    if (offset_types != null) {
-      fbBuilder.addOffset(2, offset_types);
-    }
-    return fbBuilder.endTable();
-  }
-}
-
-class _LinkedNodeResolutionReader
-    extends fb.TableReader<_LinkedNodeResolutionImpl> {
-  const _LinkedNodeResolutionReader();
-
-  @override
-  _LinkedNodeResolutionImpl createObject(fb.BufferContext bc, int offset) =>
-      _LinkedNodeResolutionImpl(bc, offset);
-}
-
-class _LinkedNodeResolutionImpl extends Object
-    with _LinkedNodeResolutionMixin
-    implements idl.LinkedNodeResolution {
-  final fb.BufferContext _bc;
-  final int _bcOffset;
-
-  _LinkedNodeResolutionImpl(this._bc, this._bcOffset);
-
-  List<int> _elements;
-  List<idl.LinkedNodeTypeSubstitution> _substitutions;
-  List<idl.LinkedNodeType> _types;
-
-  @override
-  List<int> get elements {
-    _elements ??=
-        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 0, const <int>[]);
-    return _elements;
-  }
-
-  @override
-  List<idl.LinkedNodeTypeSubstitution> get substitutions {
-    _substitutions ??= const fb.ListReader<idl.LinkedNodeTypeSubstitution>(
-            _LinkedNodeTypeSubstitutionReader())
-        .vTableGet(_bc, _bcOffset, 1, const <idl.LinkedNodeTypeSubstitution>[]);
-    return _substitutions;
-  }
-
-  @override
-  List<idl.LinkedNodeType> get types {
-    _types ??= const fb.ListReader<idl.LinkedNodeType>(_LinkedNodeTypeReader())
-        .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNodeType>[]);
-    return _types;
-  }
-}
-
-abstract class _LinkedNodeResolutionMixin implements idl.LinkedNodeResolution {
-  @override
-  Map<String, Object> toJson() {
-    Map<String, Object> _result = <String, Object>{};
-    if (elements.isNotEmpty) {
-      _result["elements"] = elements;
-    }
-    if (substitutions.isNotEmpty) {
-      _result["substitutions"] =
-          substitutions.map((_value) => _value.toJson()).toList();
-    }
-    if (types.isNotEmpty) {
-      _result["types"] = types.map((_value) => _value.toJson()).toList();
-    }
-    return _result;
-  }
-
-  @override
-  Map<String, Object> toMap() => {
-        "elements": elements,
-        "substitutions": substitutions,
-        "types": types,
-      };
-
-  @override
-  String toString() => convert.json.encode(toJson());
-}
-
 class LinkedNodeTypeBuilder extends Object
     with _LinkedNodeTypeMixin
     implements idl.LinkedNodeType {
@@ -16656,6 +16673,7 @@
   List<LinkedNodeTypeBuilder> _interfaceTypeArguments;
   idl.LinkedNodeTypeKind _kind;
   idl.EntityRefNullabilitySuffix _nullabilitySuffix;
+  int _typeParameterElement;
   int _typeParameterId;
 
   @override
@@ -16732,6 +16750,14 @@
   }
 
   @override
+  int get typeParameterElement => _typeParameterElement ??= 0;
+
+  set typeParameterElement(int value) {
+    assert(value == null || value >= 0);
+    this._typeParameterElement = value;
+  }
+
+  @override
   int get typeParameterId => _typeParameterId ??= 0;
 
   set typeParameterId(int value) {
@@ -16749,6 +16775,7 @@
       List<LinkedNodeTypeBuilder> interfaceTypeArguments,
       idl.LinkedNodeTypeKind kind,
       idl.EntityRefNullabilitySuffix nullabilitySuffix,
+      int typeParameterElement,
       int typeParameterId})
       : _functionFormalParameters = functionFormalParameters,
         _functionReturnType = functionReturnType,
@@ -16759,6 +16786,7 @@
         _interfaceTypeArguments = interfaceTypeArguments,
         _kind = kind,
         _nullabilitySuffix = nullabilitySuffix,
+        _typeParameterElement = typeParameterElement,
         _typeParameterId = typeParameterId;
 
   /// Flush [informative] data recursively.
@@ -16800,6 +16828,7 @@
       }
     }
     signature.addInt(this._kind == null ? 0 : this._kind.index);
+    signature.addInt(this._typeParameterElement ?? 0);
     signature.addInt(this._typeParameterId ?? 0);
     signature.addInt(
         this._nullabilitySuffix == null ? 0 : this._nullabilitySuffix.index);
@@ -16851,10 +16880,10 @@
       fbBuilder.addOffset(1, offset_functionReturnType);
     }
     if (_functionTypedef != null && _functionTypedef != 0) {
-      fbBuilder.addUint32(8, _functionTypedef);
+      fbBuilder.addUint32(9, _functionTypedef);
     }
     if (offset_functionTypedefTypeArguments != null) {
-      fbBuilder.addOffset(9, offset_functionTypedefTypeArguments);
+      fbBuilder.addOffset(10, offset_functionTypedefTypeArguments);
     }
     if (offset_functionTypeParameters != null) {
       fbBuilder.addOffset(2, offset_functionTypeParameters);
@@ -16870,10 +16899,13 @@
     }
     if (_nullabilitySuffix != null &&
         _nullabilitySuffix != idl.EntityRefNullabilitySuffix.starOrIrrelevant) {
-      fbBuilder.addUint8(7, _nullabilitySuffix.index);
+      fbBuilder.addUint8(8, _nullabilitySuffix.index);
+    }
+    if (_typeParameterElement != null && _typeParameterElement != 0) {
+      fbBuilder.addUint32(6, _typeParameterElement);
     }
     if (_typeParameterId != null && _typeParameterId != 0) {
-      fbBuilder.addUint32(6, _typeParameterId);
+      fbBuilder.addUint32(7, _typeParameterId);
     }
     return fbBuilder.endTable();
   }
@@ -16904,6 +16936,7 @@
   List<idl.LinkedNodeType> _interfaceTypeArguments;
   idl.LinkedNodeTypeKind _kind;
   idl.EntityRefNullabilitySuffix _nullabilitySuffix;
+  int _typeParameterElement;
   int _typeParameterId;
 
   @override
@@ -16926,7 +16959,7 @@
   @override
   int get functionTypedef {
     _functionTypedef ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 8, 0);
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 9, 0);
     return _functionTypedef;
   }
 
@@ -16934,7 +16967,7 @@
   List<idl.LinkedNodeType> get functionTypedefTypeArguments {
     _functionTypedefTypeArguments ??=
         const fb.ListReader<idl.LinkedNodeType>(_LinkedNodeTypeReader())
-            .vTableGet(_bc, _bcOffset, 9, const <idl.LinkedNodeType>[]);
+            .vTableGet(_bc, _bcOffset, 10, const <idl.LinkedNodeType>[]);
     return _functionTypedefTypeArguments;
   }
 
@@ -16972,14 +17005,21 @@
   @override
   idl.EntityRefNullabilitySuffix get nullabilitySuffix {
     _nullabilitySuffix ??= const _EntityRefNullabilitySuffixReader().vTableGet(
-        _bc, _bcOffset, 7, idl.EntityRefNullabilitySuffix.starOrIrrelevant);
+        _bc, _bcOffset, 8, idl.EntityRefNullabilitySuffix.starOrIrrelevant);
     return _nullabilitySuffix;
   }
 
   @override
+  int get typeParameterElement {
+    _typeParameterElement ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 6, 0);
+    return _typeParameterElement;
+  }
+
+  @override
   int get typeParameterId {
     _typeParameterId ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 6, 0);
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 7, 0);
     return _typeParameterId;
   }
 }
@@ -17020,6 +17060,9 @@
     if (nullabilitySuffix != idl.EntityRefNullabilitySuffix.starOrIrrelevant) {
       _result["nullabilitySuffix"] = nullabilitySuffix.toString().split('.')[1];
     }
+    if (typeParameterElement != 0) {
+      _result["typeParameterElement"] = typeParameterElement;
+    }
     if (typeParameterId != 0) {
       _result["typeParameterId"] = typeParameterId;
     }
@@ -17037,6 +17080,7 @@
         "interfaceTypeArguments": interfaceTypeArguments,
         "kind": kind,
         "nullabilitySuffix": nullabilitySuffix,
+        "typeParameterElement": typeParameterElement,
         "typeParameterId": typeParameterId,
       };
 
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs
index b20e97d..e9c6fe6 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -422,8 +422,6 @@
 
   never,
 
-  null_,
-
   typeParameter,
 
   void_
@@ -1090,8 +1088,14 @@
 
   variantField_7:LinkedNode (id: 7);
 
+  variantField_17:uint (id: 17);
+
   variantField_8:LinkedNode (id: 8);
 
+  variantField_38:LinkedNodeTypeSubstitution (id: 38);
+
+  variantField_15:uint (id: 15);
+
   variantField_28:UnlinkedTokenType (id: 28);
 
   variantField_27:bool (id: 27);
@@ -1110,10 +1114,10 @@
 
   variantField_3:[LinkedNode] (id: 3);
 
-  variantField_19:[uint] (id: 19);
+  variantField_41:[uint] (id: 41);
 
   /// The language version information.
-  variantField_39:LinkedLibraryLanguageVersion (id: 39);
+  variantField_40:LinkedLibraryLanguageVersion (id: 40);
 
   variantField_10:LinkedNode (id: 10);
 
@@ -1121,18 +1125,14 @@
 
   variantField_21:double (id: 21);
 
-  variantField_15:uint (id: 15);
-
   variantField_25:LinkedNodeType (id: 25);
 
   variantField_20:string (id: 20);
 
-  variantField_38:[LinkedNodeType] (id: 38);
+  variantField_39:[LinkedNodeType] (id: 39);
 
   flags:uint (id: 18);
 
-  variantField_17:uint (id: 17);
-
   variantField_1:string (id: 1);
 
   variantField_36:uint (id: 36);
@@ -1149,9 +1149,7 @@
 
   variantField_34:[string] (id: 34);
 
-  variantField_37:string (id: 37);
-
-  resolution:LinkedNodeResolution (id: 40);
+  name:string (id: 37);
 
   variantField_35:UnlinkedTokenType (id: 35);
 
@@ -1162,6 +1160,8 @@
   variantField_11:LinkedNode (id: 11);
 
   variantField_22:string (id: 22);
+
+  variantField_19:uint (id: 19);
 }
 
 /// Information about a group of libraries linked together, for example because
@@ -1195,17 +1195,6 @@
   parent:[uint] (id: 0);
 }
 
-/// Resolution information for the whole node, as the sequence of elements
-/// and types for sub-nodes, which the writer and reader visit in the same
-/// order.
-table LinkedNodeResolution {
-  elements:[uint] (id: 0);
-
-  substitutions:[LinkedNodeTypeSubstitution] (id: 1);
-
-  types:[LinkedNodeType] (id: 2);
-}
-
 /// Information about a Dart type.
 table LinkedNodeType {
   functionFormalParameters:[LinkedNodeTypeFormalParameter] (id: 0);
@@ -1213,9 +1202,9 @@
   functionReturnType:LinkedNodeType (id: 1);
 
   /// The typedef this function type is created for.
-  functionTypedef:uint (id: 8);
+  functionTypedef:uint (id: 9);
 
-  functionTypedefTypeArguments:[LinkedNodeType] (id: 9);
+  functionTypedefTypeArguments:[LinkedNodeType] (id: 10);
 
   functionTypeParameters:[LinkedNodeTypeTypeParameter] (id: 2);
 
@@ -1226,9 +1215,11 @@
 
   kind:LinkedNodeTypeKind (id: 5);
 
-  nullabilitySuffix:EntityRefNullabilitySuffix (id: 7);
+  nullabilitySuffix:EntityRefNullabilitySuffix (id: 8);
 
-  typeParameterId:uint (id: 6);
+  typeParameterElement:uint (id: 6);
+
+  typeParameterId:uint (id: 7);
 }
 
 /// Information about a formal parameter in a function type.
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index b8d7f63..4b84de9 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -666,7 +666,6 @@
 
   /// The explicit or inferred type of a variable.
   @VariantId(24, variantList: [
-    LinkedNodeKind.defaultFormalParameter,
     LinkedNodeKind.fieldFormalParameter,
     LinkedNodeKind.functionTypedFormalParameter,
     LinkedNodeKind.simpleFormalParameter,
@@ -709,9 +708,15 @@
   @VariantId(7, variant: LinkedNodeKind.annotation)
   LinkedNode get annotation_constructorName;
 
+  @VariantId(17, variant: LinkedNodeKind.annotation)
+  int get annotation_element;
+
   @VariantId(8, variant: LinkedNodeKind.annotation)
   LinkedNode get annotation_name;
 
+  @VariantId(38, variant: LinkedNodeKind.annotation)
+  LinkedNodeTypeSubstitution get annotation_substitution;
+
   @VariantId(2, variant: LinkedNodeKind.argumentList)
   List<LinkedNode> get argumentList_arguments;
 
@@ -733,6 +738,9 @@
   @VariantId(7, variant: LinkedNodeKind.assertStatement)
   LinkedNode get assertStatement_message;
 
+  @VariantId(15, variant: LinkedNodeKind.assignmentExpression)
+  int get assignmentExpression_element;
+
   @VariantId(6, variant: LinkedNodeKind.assignmentExpression)
   LinkedNode get assignmentExpression_leftHandSide;
 
@@ -742,9 +750,15 @@
   @VariantId(7, variant: LinkedNodeKind.assignmentExpression)
   LinkedNode get assignmentExpression_rightHandSide;
 
+  @VariantId(38, variant: LinkedNodeKind.assignmentExpression)
+  LinkedNodeTypeSubstitution get assignmentExpression_substitution;
+
   @VariantId(6, variant: LinkedNodeKind.awaitExpression)
   LinkedNode get awaitExpression_expression;
 
+  @VariantId(15, variant: LinkedNodeKind.binaryExpression)
+  int get binaryExpression_element;
+
   @VariantId(24, variant: LinkedNodeKind.binaryExpression)
   LinkedNodeType get binaryExpression_invokeType;
 
@@ -757,6 +771,9 @@
   @VariantId(7, variant: LinkedNodeKind.binaryExpression)
   LinkedNode get binaryExpression_rightOperand;
 
+  @VariantId(38, variant: LinkedNodeKind.binaryExpression)
+  LinkedNodeTypeSubstitution get binaryExpression_substitution;
+
   @VariantId(2, variant: LinkedNodeKind.block)
   List<LinkedNode> get block_statements;
 
@@ -847,11 +864,11 @@
   @VariantId(3, variant: LinkedNodeKind.compilationUnit)
   List<LinkedNode> get compilationUnit_directives;
 
-  @VariantId(19, variant: LinkedNodeKind.compilationUnit)
+  @VariantId(41, variant: LinkedNodeKind.compilationUnit)
   List<int> get compilationUnit_featureSet;
 
   /// The language version information.
-  @VariantId(39, variant: LinkedNodeKind.compilationUnit)
+  @VariantId(40, variant: LinkedNodeKind.compilationUnit)
   LinkedLibraryLanguageVersion get compilationUnit_languageVersion;
 
   @VariantId(6, variant: LinkedNodeKind.compilationUnit)
@@ -896,9 +913,15 @@
   @VariantId(7, variant: LinkedNodeKind.constructorFieldInitializer)
   LinkedNode get constructorFieldInitializer_fieldName;
 
+  @VariantId(15, variant: LinkedNodeKind.constructorName)
+  int get constructorName_element;
+
   @VariantId(6, variant: LinkedNodeKind.constructorName)
   LinkedNode get constructorName_name;
 
+  @VariantId(38, variant: LinkedNodeKind.constructorName)
+  LinkedNodeTypeSubstitution get constructorName_substitution;
+
   @VariantId(7, variant: LinkedNodeKind.constructorName)
   LinkedNode get constructorName_type;
 
@@ -946,7 +969,6 @@
     LinkedNodeKind.asExpression,
     LinkedNodeKind.awaitExpression,
     LinkedNodeKind.binaryExpression,
-    LinkedNodeKind.booleanLiteral,
     LinkedNodeKind.cascadeExpression,
     LinkedNodeKind.conditionalExpression,
     LinkedNodeKind.functionExpressionInvocation,
@@ -963,6 +985,7 @@
     LinkedNodeKind.postfixExpression,
     LinkedNodeKind.rethrowExpression,
     LinkedNodeKind.setOrMapLiteral,
+    LinkedNodeKind.simpleIdentifier,
     LinkedNodeKind.superExpression,
     LinkedNodeKind.symbolLiteral,
     LinkedNodeKind.thisExpression,
@@ -1003,7 +1026,7 @@
   @VariantId(8, variant: LinkedNodeKind.extensionOverride)
   LinkedNode get extensionOverride_typeArguments;
 
-  @VariantId(38, variant: LinkedNodeKind.extensionOverride)
+  @VariantId(39, variant: LinkedNodeKind.extensionOverride)
   List<LinkedNodeType> get extensionOverride_typeArgumentTypes;
 
   @VariantId(6, variant: LinkedNodeKind.fieldDeclaration)
@@ -1150,9 +1173,15 @@
   @VariantId(1, variant: LinkedNodeKind.importDirective)
   String get importDirective_prefix;
 
+  @VariantId(15, variant: LinkedNodeKind.indexExpression)
+  int get indexExpression_element;
+
   @VariantId(6, variant: LinkedNodeKind.indexExpression)
   LinkedNode get indexExpression_index;
 
+  @VariantId(38, variant: LinkedNodeKind.indexExpression)
+  LinkedNodeTypeSubstitution get indexExpression_substitution;
+
   @VariantId(7, variant: LinkedNodeKind.indexExpression)
   LinkedNode get indexExpression_target;
 
@@ -1294,25 +1323,7 @@
   @VariantId(34, variant: LinkedNodeKind.mixinDeclaration)
   List<String> get mixinDeclaration_superInvokedNames;
 
-  @VariantId(37, variantList: [
-    LinkedNodeKind.classDeclaration,
-    LinkedNodeKind.classTypeAlias,
-    LinkedNodeKind.constructorDeclaration,
-    LinkedNodeKind.enumDeclaration,
-    LinkedNodeKind.enumConstantDeclaration,
-    LinkedNodeKind.extensionDeclaration,
-    LinkedNodeKind.fieldFormalParameter,
-    LinkedNodeKind.functionDeclaration,
-    LinkedNodeKind.functionTypeAlias,
-    LinkedNodeKind.functionTypedFormalParameter,
-    LinkedNodeKind.genericTypeAlias,
-    LinkedNodeKind.methodDeclaration,
-    LinkedNodeKind.mixinDeclaration,
-    LinkedNodeKind.simpleFormalParameter,
-    LinkedNodeKind.simpleIdentifier,
-    LinkedNodeKind.typeParameter,
-    LinkedNodeKind.variableDeclaration,
-  ])
+  @Id(37)
   String get name;
 
   @VariantId(6, variant: LinkedNodeKind.namedExpression)
@@ -1374,24 +1385,36 @@
   @VariantId(7, variant: LinkedNodeKind.partOfDirective)
   LinkedNode get partOfDirective_uri;
 
+  @VariantId(15, variant: LinkedNodeKind.postfixExpression)
+  int get postfixExpression_element;
+
   @VariantId(6, variant: LinkedNodeKind.postfixExpression)
   LinkedNode get postfixExpression_operand;
 
   @VariantId(28, variant: LinkedNodeKind.postfixExpression)
   UnlinkedTokenType get postfixExpression_operator;
 
+  @VariantId(38, variant: LinkedNodeKind.postfixExpression)
+  LinkedNodeTypeSubstitution get postfixExpression_substitution;
+
   @VariantId(6, variant: LinkedNodeKind.prefixedIdentifier)
   LinkedNode get prefixedIdentifier_identifier;
 
   @VariantId(7, variant: LinkedNodeKind.prefixedIdentifier)
   LinkedNode get prefixedIdentifier_prefix;
 
+  @VariantId(15, variant: LinkedNodeKind.prefixExpression)
+  int get prefixExpression_element;
+
   @VariantId(6, variant: LinkedNodeKind.prefixExpression)
   LinkedNode get prefixExpression_operand;
 
   @VariantId(28, variant: LinkedNodeKind.prefixExpression)
   UnlinkedTokenType get prefixExpression_operator;
 
+  @VariantId(38, variant: LinkedNodeKind.prefixExpression)
+  LinkedNodeTypeSubstitution get prefixExpression_substitution;
+
   @VariantId(28, variant: LinkedNodeKind.propertyAccess)
   UnlinkedTokenType get propertyAccess_operator;
 
@@ -1407,8 +1430,11 @@
   @VariantId(7, variant: LinkedNodeKind.redirectingConstructorInvocation)
   LinkedNode get redirectingConstructorInvocation_constructorName;
 
-  @Id(40)
-  LinkedNodeResolution get resolution;
+  @VariantId(15, variant: LinkedNodeKind.redirectingConstructorInvocation)
+  int get redirectingConstructorInvocation_element;
+
+  @VariantId(38, variant: LinkedNodeKind.redirectingConstructorInvocation)
+  LinkedNodeTypeSubstitution get redirectingConstructorInvocation_substitution;
 
   @VariantId(6, variant: LinkedNodeKind.returnStatement)
   LinkedNode get returnStatement_expression;
@@ -1419,6 +1445,12 @@
   @VariantId(6, variant: LinkedNodeKind.simpleFormalParameter)
   LinkedNode get simpleFormalParameter_type;
 
+  @VariantId(15, variant: LinkedNodeKind.simpleIdentifier)
+  int get simpleIdentifier_element;
+
+  @VariantId(38, variant: LinkedNodeKind.simpleIdentifier)
+  LinkedNodeTypeSubstitution get simpleIdentifier_substitution;
+
   @VariantId(20, variant: LinkedNodeKind.simpleStringLiteral)
   String get simpleStringLiteral_value;
 
@@ -1446,6 +1478,12 @@
   @VariantId(7, variant: LinkedNodeKind.superConstructorInvocation)
   LinkedNode get superConstructorInvocation_constructorName;
 
+  @VariantId(15, variant: LinkedNodeKind.superConstructorInvocation)
+  int get superConstructorInvocation_element;
+
+  @VariantId(38, variant: LinkedNodeKind.superConstructorInvocation)
+  LinkedNodeTypeSubstitution get superConstructorInvocation_substitution;
+
   @VariantId(6, variant: LinkedNodeKind.switchCase)
   LinkedNode get switchCase_expression;
 
@@ -1544,6 +1582,13 @@
   ])
   String get uriBasedDirective_uriContent;
 
+  @VariantId(19, variantList: [
+    LinkedNodeKind.exportDirective,
+    LinkedNodeKind.importDirective,
+    LinkedNodeKind.partDirective,
+  ])
+  int get uriBasedDirective_uriElement;
+
   @VariantId(6, variant: LinkedNodeKind.variableDeclaration)
   LinkedNode get variableDeclaration_initializer;
 
@@ -1748,20 +1793,6 @@
   List<int> get parent;
 }
 
-/// Resolution information for the whole node, as the sequence of elements
-/// and types for sub-nodes, which the writer and reader visit in the same
-/// order.
-abstract class LinkedNodeResolution extends base.SummaryClass {
-  @Id(0)
-  List<int> get elements;
-
-  @Id(1)
-  List<LinkedNodeTypeSubstitution> get substitutions;
-
-  @Id(2)
-  List<LinkedNodeType> get types;
-}
-
 /// Information about a Dart type.
 abstract class LinkedNodeType extends base.SummaryClass {
   @Id(0)
@@ -1771,10 +1802,10 @@
   LinkedNodeType get functionReturnType;
 
   /// The typedef this function type is created for.
-  @Id(8)
+  @Id(9)
   int get functionTypedef;
 
-  @Id(9)
+  @Id(10)
   List<LinkedNodeType> get functionTypedefTypeArguments;
 
   @Id(2)
@@ -1790,10 +1821,13 @@
   @Id(5)
   LinkedNodeTypeKind get kind;
 
-  @Id(7)
+  @Id(8)
   EntityRefNullabilitySuffix get nullabilitySuffix;
 
   @Id(6)
+  int get typeParameterElement;
+
+  @Id(7)
   int get typeParameterId;
 }
 
@@ -1815,7 +1849,6 @@
   function,
   interface,
   never,
-  null_,
   typeParameter,
   void_
 }
diff --git a/pkg/analyzer/lib/src/summary2/apply_resolution.dart b/pkg/analyzer/lib/src/summary2/apply_resolution.dart
deleted file mode 100644
index e24a642..0000000
--- a/pkg/analyzer/lib/src/summary2/apply_resolution.dart
+++ /dev/null
@@ -1,852 +0,0 @@
-// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/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_algebra.dart';
-import 'package:analyzer/src/summary/idl.dart';
-import 'package:analyzer/src/summary2/ast_binary_flags.dart';
-import 'package:analyzer/src/summary2/lazy_ast.dart';
-import 'package:analyzer/src/summary2/linked_unit_context.dart';
-
-class ApplyResolutionVisitor extends ThrowingAstVisitor<void> {
-  final LinkedUnitContext _unitContext;
-  final LinkedNodeResolution _resolution;
-
-  int _elementPtr = 0;
-  int _typePtr = 0;
-
-  ApplyResolutionVisitor(this._unitContext, this._resolution);
-
-  void addParentTypeParameters(AstNode node) {
-    var enclosing = node.parent;
-    if (enclosing is ClassOrMixinDeclaration) {
-      var typeParameterList = enclosing.typeParameters;
-      if (typeParameterList == null) return;
-
-      for (var typeParameter in typeParameterList.typeParameters) {
-        var element = typeParameter.declaredElement;
-        _unitContext.typeParameterStack.add(element);
-      }
-    } else if (enclosing is ExtensionDeclaration) {
-      // TODO
-      var typeParameterList = enclosing.typeParameters;
-      if (typeParameterList == null) return;
-
-      for (var typeParameter in typeParameterList.typeParameters) {
-        var element = typeParameter.declaredElement;
-        _unitContext.typeParameterStack.add(element);
-      }
-    } else if (enclosing is VariableDeclarationList) {
-      var enclosing2 = enclosing.parent;
-      if (enclosing2 is FieldDeclaration) {
-        return addParentTypeParameters(enclosing2);
-      } else if (enclosing2 is TopLevelVariableDeclaration) {
-        return;
-      } else {
-        throw UnimplementedError('${enclosing2.runtimeType}');
-      }
-    } else {
-      throw UnimplementedError('${enclosing.runtimeType}');
-    }
-  }
-
-  @override
-  void visitAdjacentStrings(AdjacentStrings node) {
-    node.strings.accept(this);
-    // TODO(scheglov) type?
-  }
-
-  @override
-  void visitAnnotation(Annotation node) {
-    node.name.accept(this);
-    node.constructorName?.accept(this);
-    node.arguments?.accept(this);
-
-    node.element = _nextElement();
-  }
-
-  @override
-  void visitArgumentList(ArgumentList node) {
-    node.arguments.accept(this);
-  }
-
-  @override
-  void visitAsExpression(AsExpression node) {
-    node.expression.accept(this);
-    node.type.accept(this);
-  }
-
-  @override
-  void visitAssertInitializer(AssertInitializer node) {
-    node.condition.accept(this);
-    node.message?.accept(this);
-  }
-
-  @override
-  void visitAssignmentExpression(AssignmentExpression node) {
-    node.leftHandSide.accept(this);
-    node.rightHandSide.accept(this);
-    _expression(node);
-    node.staticElement = _nextElement();
-  }
-
-  @override
-  void visitBinaryExpression(BinaryExpression node) {
-    node.leftOperand.accept(this);
-    node.rightOperand.accept(this);
-
-    node.staticType = _nextType();
-    node.staticElement = _nextElement();
-  }
-
-  @override
-  void visitBooleanLiteral(BooleanLiteral node) {
-    node.staticType = _nextType();
-  }
-
-  @override
-  void visitCascadeExpression(CascadeExpression node) {
-    node.target.accept(this);
-    node.cascadeSections.accept(this);
-    _expression(node);
-  }
-
-  @override
-  visitClassDeclaration(ClassDeclaration node) {
-    var typeParameterStackHeight = _unitContext.typeParameterStack.length;
-
-    node.typeParameters?.accept(this);
-    node.extendsClause?.accept(this);
-    node.nativeClause?.accept(this);
-    node.withClause?.accept(this);
-    node.implementsClause?.accept(this);
-    _namedCompilationUnitMember(node);
-
-    _unitContext.typeParameterStack.length = typeParameterStackHeight;
-  }
-
-  @override
-  void visitClassTypeAlias(ClassTypeAlias node) {
-    var typeParameterStackHeight = _unitContext.typeParameterStack.length;
-
-    node.typeParameters?.accept(this);
-    node.superclass?.accept(this);
-    node.withClause?.accept(this);
-    node.implementsClause?.accept(this);
-    node.metadata?.accept(this);
-
-    _unitContext.typeParameterStack.length = typeParameterStackHeight;
-  }
-
-  @override
-  void visitConditionalExpression(ConditionalExpression node) {
-    node.condition.accept(this);
-    node.thenExpression.accept(this);
-    node.elseExpression.accept(this);
-    node.staticType = _nextType();
-  }
-
-  @override
-  void visitConfiguration(Configuration node) {
-    node.name?.accept(this);
-    node.value?.accept(this);
-    node.uri?.accept(this);
-  }
-
-  @override
-  void visitConstructorDeclaration(ConstructorDeclaration node) {
-    node.returnType?.accept(this);
-    node.parameters?.accept(this);
-    node.initializers?.accept(this);
-    node.redirectedConstructor?.accept(this);
-    node.metadata?.accept(this);
-  }
-
-  @override
-  void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
-    node.fieldName.accept(this);
-    node.expression.accept(this);
-  }
-
-  @override
-  void visitConstructorName(ConstructorName node) {
-    node.type.accept(this);
-    node.name?.accept(this);
-
-    node.staticElement = _nextElement();
-  }
-
-  @override
-  void visitDeclaredIdentifier(DeclaredIdentifier node) {
-    node.type?.accept(this);
-    node.identifier.accept(this);
-    _declaration(node);
-  }
-
-  @override
-  visitDefaultFormalParameter(DefaultFormalParameter node) {
-    node.parameter.accept(this);
-    node.defaultValue?.accept(this);
-  }
-
-  @override
-  void visitDottedName(DottedName node) {
-    node.components.accept(this);
-  }
-
-  @override
-  void visitDoubleLiteral(DoubleLiteral node) {
-    // TODO(scheglov) type?
-  }
-
-  @override
-  void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
-    node.metadata?.accept(this);
-  }
-
-  @override
-  void visitEnumDeclaration(EnumDeclaration node) {
-    node.constants.accept(this);
-    node.metadata?.accept(this);
-  }
-
-  @override
-  void visitExportDirective(ExportDirective node) {
-    _namespaceDirective(node);
-  }
-
-  @override
-  void visitExpressionFunctionBody(ExpressionFunctionBody node) {
-    node.expression.accept(this);
-  }
-
-  @override
-  visitExtendsClause(ExtendsClause node) {
-    node.superclass.accept(this);
-  }
-
-  @override
-  void visitExtensionDeclaration(ExtensionDeclaration node) {
-    var typeParameterStackHeight = _unitContext.typeParameterStack.length;
-
-    node.typeParameters?.accept(this);
-    node.extendedType?.accept(this);
-    node.metadata?.accept(this);
-
-    _unitContext.typeParameterStack.length = typeParameterStackHeight;
-  }
-
-  @override
-  void visitExtensionOverride(ExtensionOverride node) {
-    node.extensionName.accept(this);
-    node.typeArguments?.accept(this);
-    node.argumentList.accept(this);
-    (node as ExtensionOverrideImpl).extendedType = _nextType();
-    // TODO(scheglov) typeArgumentTypes?
-  }
-
-  @override
-  void visitFieldDeclaration(FieldDeclaration node) {
-    node.fields.accept(this);
-    node.metadata?.accept(this);
-  }
-
-  @override
-  void visitFieldFormalParameter(FieldFormalParameter node) {
-    var typeParameterStackHeight = _unitContext.typeParameterStack.length;
-
-    node.typeParameters?.accept(this);
-    node.type?.accept(this);
-    node.parameters?.accept(this);
-
-    _normalFormalParameter(node);
-
-    _unitContext.typeParameterStack.length = typeParameterStackHeight;
-  }
-
-  @override
-  void visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) {
-    node.loopVariable.accept(this);
-    _forEachParts(node);
-  }
-
-  @override
-  void visitForElement(ForElement node) {
-    node.body.accept(this);
-    node.forLoopParts.accept(this);
-  }
-
-  @override
-  visitFormalParameterList(FormalParameterList node) {
-    node.parameters.accept(this);
-  }
-
-  @override
-  void visitForPartsWithDeclarations(ForPartsWithDeclarations node) {
-    node.variables.accept(this);
-    _forParts(node);
-  }
-
-  @override
-  void visitFunctionDeclaration(FunctionDeclaration node) {
-    var typeParameterStackHeight = _unitContext.typeParameterStack.length;
-
-    var node2 = node.functionExpression;
-    node2.typeParameters?.accept(this);
-    node2.parameters?.accept(this);
-    node2.body?.accept(this);
-
-    node.returnType?.accept(this);
-    node.metadata?.accept(this);
-    _setActualReturnType(node);
-
-    _unitContext.typeParameterStack.length = typeParameterStackHeight;
-  }
-
-  @override
-  void visitFunctionExpression(FunctionExpression node) {
-    var typeParameterStackHeight = _unitContext.typeParameterStack.length;
-
-    node.typeParameters?.accept(this);
-    node.parameters?.accept(this);
-    node.body?.accept(this);
-
-    _unitContext.typeParameterStack.length = typeParameterStackHeight;
-  }
-
-  @override
-  void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
-    node.function.accept(this);
-    _invocationExpression(node);
-  }
-
-  @override
-  void visitFunctionTypeAlias(FunctionTypeAlias node) {
-    var typeParameterStackHeight = _unitContext.typeParameterStack.length;
-
-    node.typeParameters?.accept(this);
-    node.returnType?.accept(this);
-    node.parameters?.accept(this);
-    node.metadata?.accept(this);
-    _setActualReturnType(node);
-
-    _unitContext.typeParameterStack.length = typeParameterStackHeight;
-  }
-
-  @override
-  void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
-    var typeParameterStackHeight = _unitContext.typeParameterStack.length;
-
-    node.typeParameters?.accept(this);
-    node.returnType?.accept(this);
-    node.parameters?.accept(this);
-    _normalFormalParameter(node);
-
-    _unitContext.typeParameterStack.length = typeParameterStackHeight;
-  }
-
-  @override
-  void visitGenericFunctionType(GenericFunctionType node) {
-    var typeParameterStackHeight = _unitContext.typeParameterStack.length;
-
-    node.typeParameters?.accept(this);
-    node.returnType?.accept(this);
-    node.parameters?.accept(this);
-    (node as GenericFunctionTypeImpl).type = _nextType();
-    _setActualReturnType(node);
-
-    _unitContext.typeParameterStack.length = typeParameterStackHeight;
-  }
-
-  @override
-  void visitGenericTypeAlias(GenericTypeAlias node) {
-    var typeParameterStackHeight = _unitContext.typeParameterStack.length;
-
-    node.typeParameters?.accept(this);
-    node.functionType?.accept(this);
-    node.metadata?.accept(this);
-
-    _unitContext.typeParameterStack.length = typeParameterStackHeight;
-  }
-
-  @override
-  void visitHideCombinator(HideCombinator node) {}
-
-  @override
-  void visitIfElement(IfElement node) {
-    node.condition.accept(this);
-    node.thenElement.accept(this);
-    node.elseElement?.accept(this);
-  }
-
-  @override
-  visitImplementsClause(ImplementsClause node) {
-    node.interfaces.accept(this);
-  }
-
-  @override
-  void visitImportDirective(ImportDirective node) {
-    _namespaceDirective(node);
-  }
-
-  @override
-  void visitInstanceCreationExpression(InstanceCreationExpression node) {
-    node.constructorName.accept(this);
-    (node as InstanceCreationExpressionImpl).typeArguments?.accept(this);
-    node.argumentList.accept(this);
-    node.staticType = _nextType();
-  }
-
-  @override
-  void visitIntegerLiteral(IntegerLiteral node) {
-    node.staticType = _nextType();
-  }
-
-  @override
-  void visitInterpolationExpression(InterpolationExpression node) {
-    node.expression.accept(this);
-  }
-
-  @override
-  void visitInterpolationString(InterpolationString node) {
-    // TODO(scheglov) type?
-  }
-
-  @override
-  void visitIsExpression(IsExpression node) {
-    node.expression.accept(this);
-    node.type.accept(this);
-  }
-
-  @override
-  void visitLabel(Label node) {
-    node.label.accept(this);
-  }
-
-  @override
-  void visitLibraryDirective(LibraryDirective node) {
-    node.name.accept(this);
-    _directive(node);
-  }
-
-  @override
-  void visitLibraryIdentifier(LibraryIdentifier node) {
-    node.components.accept(this);
-  }
-
-  @override
-  void visitListLiteral(ListLiteral node) {
-    node.elements.accept(this);
-    node.staticType = _nextType();
-    node.typeArguments?.accept(this);
-  }
-
-  @override
-  void visitMapLiteralEntry(MapLiteralEntry node) {
-    node.key.accept(this);
-    node.value.accept(this);
-  }
-
-  @override
-  visitMethodDeclaration(MethodDeclaration node) {
-    var typeParameterStackHeight = _unitContext.typeParameterStack.length;
-
-    node.typeParameters?.accept(this);
-    node.returnType?.accept(this);
-    node.parameters?.accept(this);
-    node.metadata?.accept(this);
-    _setActualReturnType(node);
-
-    _unitContext.typeParameterStack.length = typeParameterStackHeight;
-  }
-
-  @override
-  void visitMethodInvocation(MethodInvocation node) {
-    node.target?.accept(this);
-    node.methodName.accept(this);
-    _invocationExpression(node);
-  }
-
-  @override
-  void visitMixinDeclaration(MixinDeclaration node) {
-    var typeParameterStackHeight = _unitContext.typeParameterStack.length;
-
-    node.typeParameters?.accept(this);
-    node.onClause?.accept(this);
-    node.implementsClause?.accept(this);
-    node.metadata?.accept(this);
-
-    _unitContext.typeParameterStack.length = typeParameterStackHeight;
-  }
-
-  @override
-  void visitNamedExpression(NamedExpression node) {
-    node.name.accept(this);
-    node.expression.accept(this);
-  }
-
-  @override
-  void visitNativeClause(NativeClause node) {
-    node.name.accept(this);
-  }
-
-  @override
-  void visitNullLiteral(NullLiteral node) {
-    // TODO(scheglov) type?
-  }
-
-  @override
-  void visitOnClause(OnClause node) {
-    node.superclassConstraints.accept(this);
-  }
-
-  @override
-  void visitParenthesizedExpression(ParenthesizedExpression node) {
-    node.expression.accept(this);
-    node.staticType = _nextType();
-  }
-
-  @override
-  void visitPartDirective(PartDirective node) {
-    _uriBasedDirective(node);
-  }
-
-  @override
-  void visitPostfixExpression(PostfixExpression node) {
-    node.operand.accept(this);
-    node.staticElement = _nextElement();
-    _expression(node);
-  }
-
-  @override
-  void visitPrefixedIdentifier(PrefixedIdentifier node) {
-    node.prefix.accept(this);
-    node.identifier.accept(this);
-
-    node.staticType = _nextType();
-  }
-
-  @override
-  void visitPrefixExpression(PrefixExpression node) {
-    node.operand.accept(this);
-    node.staticElement = _nextElement();
-    _expression(node);
-  }
-
-  @override
-  void visitPropertyAccess(PropertyAccess node) {
-    node.target.accept(this);
-    node.propertyName.accept(this);
-
-    node.staticType = _nextType();
-  }
-
-  @override
-  void visitRedirectingConstructorInvocation(
-      RedirectingConstructorInvocation node) {
-    node.constructorName?.accept(this);
-    node.argumentList.accept(this);
-    node.staticElement = _nextElement();
-  }
-
-  @override
-  void visitSetOrMapLiteral(SetOrMapLiteral node) {
-    node.elements.accept(this);
-    node.staticType = _nextType();
-    node.typeArguments?.accept(this);
-  }
-
-  @override
-  void visitShowCombinator(ShowCombinator node) {}
-
-  @override
-  visitSimpleFormalParameter(SimpleFormalParameter node) {
-    node.type?.accept(this);
-    _normalFormalParameter(node);
-  }
-
-  @override
-  visitSimpleIdentifier(SimpleIdentifier node) {
-    var data = LazyAst.getData(node);
-
-    node.staticElement = _nextElement();
-
-    if (AstBinaryFlags.hasType(data.flags)) {
-      node.staticType = _nextType();
-    }
-  }
-
-  @override
-  void visitSimpleStringLiteral(SimpleStringLiteral node) {
-    // TODO(scheglov) type?
-  }
-
-  @override
-  void visitSpreadElement(SpreadElement node) {
-    node.expression.accept(this);
-  }
-
-  @override
-  void visitStringInterpolation(StringInterpolation node) {
-    node.elements.accept(this);
-    // TODO(scheglov) type?
-  }
-
-  @override
-  void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    node.constructorName?.accept(this);
-    node.argumentList.accept(this);
-    node.staticElement = _nextElement();
-  }
-
-  @override
-  void visitSuperExpression(SuperExpression node) {
-    node.staticType = _nextType();
-  }
-
-  @override
-  void visitSymbolLiteral(SymbolLiteral node) {
-    node.staticType = _nextType();
-  }
-
-  @override
-  void visitThisExpression(ThisExpression node) {
-    node.staticType = _nextType();
-  }
-
-  @override
-  void visitThrowExpression(ThrowExpression node) {
-    node.expression.accept(this);
-    node.staticType = _nextType();
-  }
-
-  @override
-  void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
-    node.variables.accept(this);
-    node.metadata?.accept(this);
-  }
-
-  @override
-  visitTypeArgumentList(TypeArgumentList node) {
-    node.arguments?.accept(this);
-  }
-
-  @override
-  visitTypeName(TypeName node) {
-    node.name.accept(this);
-    node.typeArguments?.accept(this);
-
-    node.type = _nextType();
-    // print('[node: $node][type: ${node.type}]');
-  }
-
-  @override
-  visitTypeParameterList(TypeParameterList node) {
-    for (var typeParameter in node.typeParameters) {
-      var name = typeParameter.name;
-      var element = TypeParameterElementImpl(name.name, name.offset);
-      name.staticElement = element;
-      _unitContext.typeParameterStack.add(element);
-    }
-
-    for (var typeParameter in node.typeParameters) {
-      var element = typeParameter.declaredElement as TypeParameterElementImpl;
-      element.variance = LazyAst.getVariance(typeParameter);
-
-      typeParameter.bound?.accept(this);
-      element.bound = typeParameter.bound?.type;
-
-      element.defaultType = _nextType();
-
-      typeParameter.metadata?.accept(this);
-      element.metadata = _buildAnnotations2(
-        _unitContext.reference.element,
-        typeParameter.metadata,
-      );
-
-      {
-        var lazy = LazyTypeParameter.get(typeParameter);
-        var informative = _unitContext.getInformativeData(lazy.data);
-        element.setCodeRange(
-          informative?.codeOffset ?? 0,
-          informative?.codeLength ?? 0,
-        );
-      }
-
-      // TODO(scheglov) We used to do this with the previous elements impl.
-      // We probably still do this.
-      // But the code below is bad and incomplete.
-      // And why does this affect MethodMember(s)?
-      {
-        var parent = node.parent;
-        if (parent is ClassDeclaration) {
-          (parent.declaredElement as ElementImpl).encloseElement(element);
-        } else if (parent is ClassTypeAlias) {
-          (parent.declaredElement as ElementImpl).encloseElement(element);
-        } else if (parent is ExtensionDeclaration) {
-          (parent.declaredElement as ElementImpl).encloseElement(element);
-        } else if (parent is FunctionExpression) {
-          var parent2 = parent.parent;
-          if (parent2 is FunctionDeclaration) {
-            (parent2.declaredElement as ElementImpl).encloseElement(element);
-          }
-        } else if (parent is FunctionTypeAlias) {
-          (parent.declaredElement as ElementImpl).encloseElement(element);
-        } else if (parent is GenericTypeAlias) {
-          (parent.declaredElement as ElementImpl).encloseElement(element);
-        } else if (parent is MethodDeclaration) {
-          (parent.declaredElement as ElementImpl).encloseElement(element);
-        } else if (parent is MixinDeclaration) {
-          (parent.declaredElement as ElementImpl).encloseElement(element);
-        }
-      }
-    }
-  }
-
-  @override
-  void visitVariableDeclaration(VariableDeclaration node) {
-    node.initializer?.accept(this);
-    _setActualType(node);
-  }
-
-  @override
-  void visitVariableDeclarationList(VariableDeclarationList node) {
-    node.type?.accept(this);
-    node.variables.accept(this);
-    node.metadata?.accept(this);
-  }
-
-  @override
-  void visitWithClause(WithClause node) {
-    node.mixinTypes.accept(this);
-  }
-
-  void _annotatedNode(AnnotatedNode node) {
-    node.metadata?.accept(this);
-  }
-
-  /// Return annotations for the given [nodeList] in the [unit].
-  List<ElementAnnotation> _buildAnnotations2(
-      CompilationUnitElementImpl unit, List<Annotation> nodeList) {
-    var length = nodeList.length;
-    if (length == 0) {
-      return const <ElementAnnotation>[];
-    }
-
-    var annotations = List<ElementAnnotation>(length);
-    for (int i = 0; i < length; i++) {
-      var ast = nodeList[i];
-      annotations[i] = ElementAnnotationImpl(unit)
-        ..annotationAst = ast
-        ..element = ast.element;
-    }
-    return annotations;
-  }
-
-  void _compilationUnitMember(CompilationUnitMember node) {
-    _declaration(node);
-  }
-
-  void _declaration(Declaration node) {
-    _annotatedNode(node);
-  }
-
-  void _directive(Directive node) {
-    node.metadata?.accept(this);
-  }
-
-  void _expression(Expression node) {
-    node.staticType = _nextType();
-  }
-
-  void _forEachParts(ForEachParts node) {
-    _forLoopParts(node);
-    node.iterable.accept(this);
-  }
-
-  void _forLoopParts(ForLoopParts node) {}
-
-  void _formalParameter(FormalParameter node) {
-    _setActualType(node);
-  }
-
-  void _forParts(ForParts node) {
-    _forLoopParts(node);
-    node.condition?.accept(this);
-    node.updaters.accept(this);
-  }
-
-  void _invocationExpression(InvocationExpression node) {
-    _expression(node);
-    node.argumentList.accept(this);
-    node.staticInvokeType = _nextType();
-    node.typeArguments?.accept(this);
-  }
-
-  void _namedCompilationUnitMember(NamedCompilationUnitMember node) {
-    _compilationUnitMember(node);
-  }
-
-  void _namespaceDirective(NamespaceDirective node) {
-    _uriBasedDirective(node);
-    node.combinators?.accept(this);
-    node.configurations?.accept(this);
-  }
-
-  Element _nextElement() {
-    var ptr = _elementPtr++;
-    var elementIndex = _resolution.elements[ptr];
-    var element = _unitContext.elementOfIndex(elementIndex);
-
-    var substitutionNode = _resolution.substitutions[ptr];
-    if (substitutionNode.typeArguments.isNotEmpty) {
-      var typeParameters =
-          (element.enclosingElement as TypeParameterizedElement).typeParameters;
-      var typeArguments = substitutionNode.typeArguments
-          .map(_unitContext.readType)
-          .toList(growable: false);
-      var substitution = Substitution.fromPairs(typeParameters, typeArguments);
-      element = ExecutableMember.from2(element, substitution);
-    }
-
-    if (substitutionNode.isLegacy) {
-      element = Member.legacy(element);
-    }
-
-    return element;
-  }
-
-  DartType _nextType() {
-    var id = _typePtr++;
-    var data = _resolution.types[id];
-    var type = _unitContext.readType(data);
-    return type;
-  }
-
-  void _normalFormalParameter(NormalFormalParameter node) {
-    _formalParameter(node);
-    node.metadata?.accept(this);
-  }
-
-  void _setActualReturnType(AstNode node) {
-    var type = _nextType();
-    LazyAst.setReturnType(node, type);
-  }
-
-  void _setActualType(AstNode node) {
-    var type = _nextType();
-    LazyAst.setType(node, type);
-  }
-
-  void _uriBasedDirective(UriBasedDirective node) {
-    _directive(node);
-    node.uri.accept(this);
-  }
-}
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart b/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart
index 65d0148..beac780 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart
@@ -75,11 +75,6 @@
     TypeName,
   );
 
-  static final _hasType = _checkBit(
-    1,
-    SimpleIdentifier,
-  );
-
   static final _isAbstract = _checkBit(
     1,
     ClassDeclaration,
@@ -242,7 +237,6 @@
     bool hasSeparatorColon = false,
     bool hasSeparatorEquals = false,
     bool hasThis = false,
-    bool hasType = false,
     bool hasTypeArguments = false,
     bool isAbstract = false,
     bool isAsync = false,
@@ -304,9 +298,6 @@
     if (hasThis) {
       result |= _hasThis;
     }
-    if (hasType) {
-      result |= _hasType;
-    }
     if (hasTypeArguments) {
       result |= _hasTypeArguments;
     }
@@ -432,10 +423,6 @@
     return (flags & _hasThis) != 0;
   }
 
-  static bool hasType(int flags) {
-    return (flags & _hasType) != 0;
-  }
-
   static bool hasTypeArguments(int flags) {
     return (flags & _hasTypeArguments) != 0;
   }
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
index 3dda72c..4df499f 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -5,9 +5,13 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_ast_factory.dart';
 import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/ast_factory.dart';
+import 'package:analyzer/src/dart/element/member.dart';
+import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/dart/resolver/variance.dart';
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/testing/token_factory.dart';
@@ -33,8 +37,25 @@
   /// Set to `true` when this reader is used to lazily read its unit.
   bool isLazy = false;
 
+  /// Whether we are reading a directive.
+  ///
+  /// [StringLiteral]s in directives are not actual expressions, and don't need
+  /// a type. Moreover, when we are reading `dart:core` imports, the type
+  /// provider is not ready yet, so we cannot access type `String`.
+  bool _isReadingDirective = false;
+
   AstBinaryReader(this._unitContext);
 
+  InterfaceType get _boolType => _unitContext.typeProvider.boolType;
+
+  InterfaceType get _doubleType => _unitContext.typeProvider.doubleType;
+
+  InterfaceType get _intType => _unitContext.typeProvider.intType;
+
+  DartType get _nullType => _unitContext.typeProvider.nullType;
+
+  InterfaceType get _stringType => _unitContext.typeProvider.stringType;
+
   AstNode readNode(LinkedNode data) {
     timerAstBinaryReader.start();
     try {
@@ -44,6 +65,10 @@
     }
   }
 
+  DartType readType(LinkedNodeType data) {
+    return _readType(data);
+  }
+
   Token _combinatorKeyword(LinkedNode data, Keyword keyword, Token def) {
     var informativeData = _unitContext.getInformativeData(data);
     if (informativeData != null) {
@@ -71,10 +96,40 @@
     return def;
   }
 
+  Element _elementOfComponents(
+    int rawElementIndex,
+    LinkedNodeTypeSubstitution substitutionNode,
+  ) {
+    var element = _getElement(rawElementIndex);
+    if (substitutionNode == null) return element;
+
+    var typeParameters = substitutionNode.typeParameters
+        .map<TypeParameterElement>(_getElement)
+        .toList();
+    var typeArguments = substitutionNode.typeArguments.map(_readType).toList();
+    var substitution = Substitution.fromPairs(typeParameters, typeArguments);
+
+    var member = ExecutableMember.from2(element, substitution);
+    if (substitutionNode.isLegacy) {
+      member = Member.legacy(member);
+    }
+
+    return member;
+  }
+
+  T _getElement<T extends Element>(int index) {
+    var bundleContext = _unitContext.bundleContext;
+    return bundleContext.elementOfIndex(index);
+  }
+
   AdjacentStrings _read_adjacentStrings(LinkedNode data) {
-    return astFactory.adjacentStrings(
+    var node = astFactory.adjacentStrings(
       _readNodeList(data.adjacentStrings_strings),
     );
+    if (!_isReadingDirective) {
+      node.staticType = _stringType;
+    }
+    return node;
   }
 
   Annotation _read_annotation(LinkedNode data) {
@@ -84,7 +139,10 @@
       _Tokens.PERIOD,
       _readNode(data.annotation_constructorName),
       _readNode(data.annotation_arguments),
-    );
+    )..element = _elementOfComponents(
+        data.annotation_element,
+        data.annotation_substitution,
+      );
   }
 
   ArgumentList _read_argumentList(LinkedNode data) {
@@ -100,7 +158,7 @@
       _readNode(data.asExpression_expression),
       _Tokens.AS,
       _readNode(data.asExpression_type),
-    );
+    )..staticType = _readType(data.expression_type);
   }
 
   AssertInitializer _read_assertInitializer(LinkedNode data) {
@@ -131,14 +189,19 @@
       _readNode(data.assignmentExpression_leftHandSide),
       _Tokens.fromType(data.assignmentExpression_operator),
       _readNode(data.assignmentExpression_rightHandSide),
-    );
+    )
+      ..staticElement = _elementOfComponents(
+        data.assignmentExpression_element,
+        data.assignmentExpression_substitution,
+      )
+      ..staticType = _readType(data.expression_type);
   }
 
   AwaitExpression _read_awaitExpression(LinkedNode data) {
     return astFactory.awaitExpression(
       _Tokens.AWAIT,
       _readNode(data.awaitExpression_expression),
-    );
+    )..staticType = _readType(data.expression_type);
   }
 
   BinaryExpression _read_binaryExpression(LinkedNode data) {
@@ -146,7 +209,12 @@
       _readNode(data.binaryExpression_leftOperand),
       _Tokens.fromType(data.binaryExpression_operator),
       _readNode(data.binaryExpression_rightOperand),
-    );
+    )
+      ..staticElement = _elementOfComponents(
+        data.binaryExpression_element,
+        data.binaryExpression_substitution,
+      )
+      ..staticType = _readType(data.expression_type);
   }
 
   Block _read_block(LinkedNode data) {
@@ -176,7 +244,8 @@
   }
 
   BooleanLiteral _read_booleanLiteral(LinkedNode data) {
-    return AstTestFactory.booleanLiteral(data.booleanLiteral_value);
+    return AstTestFactory.booleanLiteral(data.booleanLiteral_value)
+      ..staticType = _boolType;
   }
 
   BreakStatement _read_breakStatement(LinkedNode data) {
@@ -191,7 +260,7 @@
     return astFactory.cascadeExpression(
       _readNode(data.cascadeExpression_target),
       _readNodeList(data.cascadeExpression_sections),
-    );
+    )..staticType = _readType(data.expression_type);
   }
 
   CatchClause _read_catchClause(LinkedNode data) {
@@ -216,20 +285,20 @@
     try {
       var node = astFactory.classDeclaration(
         _readDocumentationComment(data),
-        _readNodeList(data.annotatedNode_metadata),
+        _readNodeListLazy(data.annotatedNode_metadata),
         AstBinaryFlags.isAbstract(data.flags) ? _Tokens.ABSTRACT : null,
         _Tokens.CLASS,
         _declaredIdentifier(data),
         _readNode(data.classOrMixinDeclaration_typeParameters),
-        _readNode(data.classDeclaration_extendsClause),
-        _readNode(data.classDeclaration_withClause),
-        _readNode(data.classOrMixinDeclaration_implementsClause),
+        _readNodeLazy(data.classDeclaration_extendsClause),
+        _readNodeLazy(data.classDeclaration_withClause),
+        _readNodeLazy(data.classOrMixinDeclaration_implementsClause),
         _Tokens.OPEN_CURLY_BRACKET,
         _readNodeListLazy(data.classOrMixinDeclaration_members),
         _Tokens.CLOSE_CURLY_BRACKET,
       );
-      node.nativeClause = _readNode(data.classDeclaration_nativeClause);
-      LazyClassDeclaration.setData(_unitContext, data, node);
+      node.nativeClause = _readNodeLazy(data.classDeclaration_nativeClause);
+      LazyClassDeclaration.setData(node, data);
       return node;
     } finally {
       timerAstBinaryReaderClass.stop();
@@ -241,18 +310,18 @@
     try {
       var node = astFactory.classTypeAlias(
         _readDocumentationComment(data),
-        _readNodeList(data.annotatedNode_metadata),
+        _readNodeListLazy(data.annotatedNode_metadata),
         _Tokens.CLASS,
         _declaredIdentifier(data),
         _readNode(data.classTypeAlias_typeParameters),
         _Tokens.EQ,
         AstBinaryFlags.isAbstract(data.flags) ? _Tokens.ABSTRACT : null,
-        _readNode(data.classTypeAlias_superclass),
-        _readNode(data.classTypeAlias_withClause),
-        _readNode(data.classTypeAlias_implementsClause),
+        _readNodeLazy(data.classTypeAlias_superclass),
+        _readNodeLazy(data.classTypeAlias_withClause),
+        _readNodeLazy(data.classTypeAlias_implementsClause),
         _Tokens.SEMICOLON,
       );
-      LazyClassTypeAlias.setData(_unitContext, data, node);
+      LazyClassTypeAlias.setData(node, data);
       return node;
     } finally {
       timerAstBinaryReaderClass.stop();
@@ -311,7 +380,7 @@
       _readNode(data.conditionalExpression_thenExpression),
       _Tokens.COLON,
       _readNode(data.conditionalExpression_elseExpression),
-    );
+    )..staticType = _readType(data.expression_type);
   }
 
   Configuration _read_configuration(LinkedNode data) {
@@ -347,25 +416,25 @@
 
     var node = astFactory.constructorDeclaration(
       _readDocumentationComment(data),
-      _readNodeList(data.annotatedNode_metadata),
+      _readNodeListLazy(data.annotatedNode_metadata),
       AstBinaryFlags.isExternal(data.flags) ? _Tokens.EXTERNAL : null,
       AstBinaryFlags.isConst(data.flags) ? _Tokens.CONST : null,
       AstBinaryFlags.isFactory(data.flags) ? _Tokens.FACTORY : null,
       returnType,
       periodToken,
       nameIdentifier,
-      _readNode(data.constructorDeclaration_parameters),
+      _readNodeLazy(data.constructorDeclaration_parameters),
       _Tokens.choose(
         AstBinaryFlags.hasSeparatorColon(data.flags),
         _Tokens.COLON,
         AstBinaryFlags.hasSeparatorEquals(data.flags),
         _Tokens.EQ,
       ),
-      _readNodeList(data.constructorDeclaration_initializers),
-      _readNode(data.constructorDeclaration_redirectedConstructor),
-      _readNode(data.constructorDeclaration_body),
+      _readNodeListLazy(data.constructorDeclaration_initializers),
+      _readNodeLazy(data.constructorDeclaration_redirectedConstructor),
+      _readNodeLazy(data.constructorDeclaration_body),
     );
-    LazyConstructorDeclaration.setData(_unitContext, data, node);
+    LazyConstructorDeclaration.setData(node, data);
     return node;
   }
 
@@ -386,7 +455,10 @@
       _readNode(data.constructorName_type),
       data.constructorName_name != null ? _Tokens.PERIOD : null,
       _readNode(data.constructorName_name),
-    );
+    )..staticElement = _elementOfComponents(
+        data.constructorName_element,
+        data.constructorName_substitution,
+      );
   }
 
   ContinueStatement _read_continueStatement(LinkedNode data) {
@@ -419,7 +491,7 @@
       _readNode(data.defaultFormalParameter_parameter),
       _toParameterKind(data.defaultFormalParameter_kind),
       data.defaultFormalParameter_defaultValue != null ? _Tokens.COLON : null,
-      _readNode(data.defaultFormalParameter_defaultValue),
+      _readNodeLazy(data.defaultFormalParameter_defaultValue),
     );
     LazyFormalParameter.setData(node, data);
     return node;
@@ -444,7 +516,8 @@
   }
 
   DoubleLiteral _read_doubleLiteral(LinkedNode data) {
-    return AstTestFactory.doubleLiteral(data.doubleLiteral_value);
+    return AstTestFactory.doubleLiteral(data.doubleLiteral_value)
+      ..staticType = _doubleType;
   }
 
   EmptyFunctionBody _read_emptyFunctionBody(LinkedNode data) {
@@ -462,7 +535,7 @@
   EnumConstantDeclaration _read_enumConstantDeclaration(LinkedNode data) {
     var node = astFactory.enumConstantDeclaration(
       _readDocumentationComment(data),
-      _readNodeList(data.annotatedNode_metadata),
+      _readNodeListLazy(data.annotatedNode_metadata),
       _declaredIdentifier(data),
     );
     LazyEnumConstantDeclaration.setData(node, data);
@@ -472,32 +545,34 @@
   EnumDeclaration _read_enumDeclaration(LinkedNode data) {
     var node = astFactory.enumDeclaration(
       _readDocumentationComment(data),
-      _readNodeList(data.annotatedNode_metadata),
+      _readNodeListLazy(data.annotatedNode_metadata),
       _Tokens.ENUM,
       _declaredIdentifier(data),
       _Tokens.OPEN_CURLY_BRACKET,
-      _readNodeList(data.enumDeclaration_constants),
+      _readNodeListLazy(data.enumDeclaration_constants),
       _Tokens.CLOSE_CURLY_BRACKET,
     );
-    LazyEnumDeclaration.setData(_unitContext, data, node);
+    LazyEnumDeclaration.setData(node, data);
     return node;
   }
 
   ExportDirective _read_exportDirective(LinkedNode data) {
     timerAstBinaryReaderDirective.start();
+    _isReadingDirective = true;
     try {
       var node = astFactory.exportDirective(
         _readDocumentationComment(data),
-        _readNodeList(data.annotatedNode_metadata),
+        _readNodeListLazy(data.annotatedNode_metadata),
         _directiveKeyword(data, Keyword.EXPORT, _Tokens.EXPORT),
         _readNode(data.uriBasedDirective_uri),
         _readNodeList(data.namespaceDirective_configurations),
         _readNodeList(data.namespaceDirective_combinators),
         _Tokens.SEMICOLON,
       );
-      LazyDirective.setData(_unitContext, data, node);
+      LazyDirective.setData(node, data);
       return node;
     } finally {
+      _isReadingDirective = false;
       timerAstBinaryReaderDirective.stop();
     }
   }
@@ -540,17 +615,17 @@
     try {
       var node = astFactory.extensionDeclaration(
         comment: _readDocumentationComment(data),
-        metadata: _readNodeList(data.annotatedNode_metadata),
+        metadata: _readNodeListLazy(data.annotatedNode_metadata),
         extensionKeyword: _Tokens.EXTENSION,
         name: data.name.isNotEmpty ? _declaredIdentifier(data) : null,
         typeParameters: _readNode(data.extensionDeclaration_typeParameters),
         onKeyword: _Tokens.ON,
-        extendedType: _readNode(data.extensionDeclaration_extendedType),
+        extendedType: _readNodeLazy(data.extensionDeclaration_extendedType),
         leftBracket: _Tokens.OPEN_CURLY_BRACKET,
-        members: _readNodeList(data.extensionDeclaration_members),
+        members: _readNodeListLazy(data.extensionDeclaration_members),
         rightBracket: _Tokens.CLOSE_CURLY_BRACKET,
       );
-      LazyExtensionDeclaration(_unitContext, data, node);
+      LazyExtensionDeclaration(node, data);
       return node;
     } finally {
       timerAstBinaryReaderClass.stop();
@@ -569,6 +644,9 @@
       ),
       typeArguments: _readNode(data.extensionOverride_typeArguments),
     ) as ExtensionOverrideImpl;
+    node.extendedType = _readType(data.extensionOverride_extendedType);
+    node.typeArgumentTypes =
+        data.extensionOverride_typeArgumentTypes.map(_readType).toList();
     return node;
   }
 
@@ -582,12 +660,12 @@
       externalKeyword:
           AstBinaryFlags.isExternal(data.flags) ? _Tokens.EXTERNAL : null,
       fieldList: _readNode(data.fieldDeclaration_fields),
-      metadata: _readNodeList(data.annotatedNode_metadata),
+      metadata: _readNodeListLazy(data.annotatedNode_metadata),
       semicolon: _Tokens.SEMICOLON,
       staticKeyword:
           AstBinaryFlags.isStatic(data.flags) ? _Tokens.STATIC : null,
     );
-    LazyFieldDeclaration.setData(_unitContext, data, node);
+    LazyFieldDeclaration.setData(node, data);
     return node;
   }
 
@@ -609,8 +687,8 @@
       ),
       metadata: _readNodeList(data.normalFormalParameter_metadata),
       comment: _readDocumentationComment(data),
-      type: _readNode(data.fieldFormalParameter_type),
-      parameters: _readNode(data.fieldFormalParameter_formalParameters),
+      type: _readNodeLazy(data.fieldFormalParameter_type),
+      parameters: _readNodeLazy(data.fieldFormalParameter_formalParameters),
       question:
           AstBinaryFlags.hasQuestion(data.flags) ? _Tokens.QUESTION : null,
       requiredKeyword:
@@ -704,9 +782,9 @@
     try {
       var node = astFactory.functionDeclaration(
         _readDocumentationComment(data),
-        _readNodeList(data.annotatedNode_metadata),
+        _readNodeListLazy(data.annotatedNode_metadata),
         AstBinaryFlags.isExternal(data.flags) ? _Tokens.EXTERNAL : null,
-        _readNode(data.functionDeclaration_returnType),
+        _readNodeLazy(data.functionDeclaration_returnType),
         _Tokens.choose(
           AstBinaryFlags.isGet(data.flags),
           _Tokens.GET,
@@ -714,9 +792,9 @@
           _Tokens.SET,
         ),
         _declaredIdentifier(data),
-        _readNode(data.functionDeclaration_functionExpression),
+        _readNodeLazy(data.functionDeclaration_functionExpression),
       );
-      LazyFunctionDeclaration.setData(_unitContext, data, node);
+      LazyFunctionDeclaration.setData(node, data);
       return node;
     } finally {
       timerAstBinaryReaderFunctionDeclaration.stop();
@@ -733,8 +811,8 @@
   FunctionExpression _read_functionExpression(LinkedNode data) {
     var node = astFactory.functionExpression(
       _readNode(data.functionExpression_typeParameters),
-      _readNode(data.functionExpression_formalParameters),
-      _readNode(data.functionExpression_body),
+      _readNodeLazy(data.functionExpression_formalParameters),
+      _readNodeLazy(data.functionExpression_body),
     );
     LazyFunctionExpression.setData(node, data);
     return node;
@@ -746,21 +824,21 @@
       _readNode(data.functionExpressionInvocation_function),
       _readNode(data.invocationExpression_typeArguments),
       _readNode(data.invocationExpression_arguments),
-    );
+    )..staticInvokeType = _readType(data.invocationExpression_invokeType);
   }
 
   FunctionTypeAlias _read_functionTypeAlias(LinkedNode data) {
     var node = astFactory.functionTypeAlias(
       _readDocumentationComment(data),
-      _readNodeList(data.annotatedNode_metadata),
+      _readNodeListLazy(data.annotatedNode_metadata),
       _Tokens.TYPEDEF,
-      _readNode(data.functionTypeAlias_returnType),
+      _readNodeLazy(data.functionTypeAlias_returnType),
       _declaredIdentifier(data),
       _readNode(data.functionTypeAlias_typeParameters),
-      _readNode(data.functionTypeAlias_formalParameters),
+      _readNodeLazy(data.functionTypeAlias_formalParameters),
       _Tokens.SEMICOLON,
     );
-    LazyFunctionTypeAlias.setData(_unitContext, data, node);
+    LazyFunctionTypeAlias.setData(node, data);
     LazyFunctionTypeAlias.setHasSelfReference(
       node,
       data.typeAlias_hasSelfReference,
@@ -775,13 +853,13 @@
       covariantKeyword:
           AstBinaryFlags.isCovariant(data.flags) ? _Tokens.COVARIANT : null,
       identifier: _declaredIdentifier(data),
-      metadata: _readNodeList(data.normalFormalParameter_metadata),
-      parameters: _readNode(
+      metadata: _readNodeListLazy(data.normalFormalParameter_metadata),
+      parameters: _readNodeLazy(
         data.functionTypedFormalParameter_formalParameters,
       ),
       requiredKeyword:
           AstBinaryFlags.isRequired(data.flags) ? _Tokens.REQUIRED : null,
-      returnType: _readNode(data.functionTypedFormalParameter_returnType),
+      returnType: _readNodeLazy(data.functionTypedFormalParameter_returnType),
       typeParameters: _readNode(
         data.functionTypedFormalParameter_typeParameters,
       ),
@@ -791,32 +869,73 @@
   }
 
   GenericFunctionType _read_genericFunctionType(LinkedNode data) {
-    return astFactory.genericFunctionType(
-      readNode(data.genericFunctionType_returnType),
+    var id = data.genericFunctionType_id;
+
+    // Read type parameters, without bounds, to avoid forward references.
+    TypeParameterList typeParameterList;
+    var typeParameterListData = data.genericFunctionType_typeParameters;
+    if (typeParameterListData != null) {
+      var dataList = typeParameterListData.typeParameterList_typeParameters;
+      var typeParameters = List<TypeParameter>(dataList.length);
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        typeParameters[i] = astFactory.typeParameter(
+          _readDocumentationComment(data),
+          _readNodeList(data.annotatedNode_metadata),
+          _declaredIdentifier(data),
+          data.typeParameter_bound != null ? _Tokens.EXTENDS : null,
+          null,
+        );
+      }
+      typeParameterList = astFactory.typeParameterList(
+        _Tokens.LT,
+        typeParameters,
+        _Tokens.GT,
+      );
+    }
+
+    GenericFunctionTypeImpl node = astFactory.genericFunctionType(
+      null,
       _Tokens.FUNCTION,
-      _readNode(data.genericFunctionType_typeParameters),
-      _readNode(data.genericFunctionType_formalParameters),
+      typeParameterList,
+      null,
       question:
           AstBinaryFlags.hasQuestion(data.flags) ? _Tokens.QUESTION : null,
     );
+
+    // Create the node element, so now type parameter elements are available.
+    LazyAst.setGenericFunctionTypeId(node, id);
+    _unitContext.createGenericFunctionTypeElement(id, node);
+
+    // Finish reading.
+    if (typeParameterListData != null) {
+      var dataList = typeParameterListData.typeParameterList_typeParameters;
+      var typeParameters = typeParameterList.typeParameters;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        var node = typeParameters[i];
+        node.bound = _readNode(data.typeParameter_bound);
+      }
+    }
+    node.returnType = readNode(data.genericFunctionType_returnType);
+    node.parameters = _readNode(data.genericFunctionType_formalParameters);
+    node.type = _readType(data.genericFunctionType_type);
+
+    return node;
   }
 
   GenericTypeAlias _read_genericTypeAlias(LinkedNode data) {
     var node = astFactory.genericTypeAlias(
       _readDocumentationComment(data),
-      _readNodeList(data.annotatedNode_metadata),
+      _readNodeListLazy(data.annotatedNode_metadata),
       _Tokens.TYPEDEF,
       _declaredIdentifier(data),
       _readNode(data.genericTypeAlias_typeParameters),
       _Tokens.EQ,
-      _readNode(data.genericTypeAlias_functionType),
+      _readNodeLazy(data.genericTypeAlias_functionType),
       _Tokens.SEMICOLON,
     );
-    LazyGenericTypeAlias.setData(
-      _unitContext,
-      data,
-      node,
-    );
+    LazyGenericTypeAlias.setData(node, data);
     LazyGenericTypeAlias.setHasSelfReference(
       node,
       data.typeAlias_hasSelfReference,
@@ -868,6 +987,7 @@
 
   ImportDirective _read_importDirective(LinkedNode data) {
     timerAstBinaryReaderDirective.start();
+    _isReadingDirective = true;
     try {
       SimpleIdentifier prefix;
       if (data.importDirective_prefix.isNotEmpty) {
@@ -882,7 +1002,7 @@
 
       var node = astFactory.importDirective(
         _readDocumentationComment(data),
-        _readNodeList(data.annotatedNode_metadata),
+        _readNodeListLazy(data.annotatedNode_metadata),
         _directiveKeyword(data, Keyword.IMPORT, _Tokens.IMPORT),
         _readNode(data.uriBasedDirective_uri),
         _readNodeList(data.namespaceDirective_configurations),
@@ -892,9 +1012,10 @@
         _readNodeList(data.namespaceDirective_combinators),
         _Tokens.SEMICOLON,
       );
-      LazyDirective.setData(_unitContext, data, node);
+      LazyDirective.setData(node, data);
       return node;
     } finally {
+      _isReadingDirective = false;
       timerAstBinaryReaderDirective.stop();
     }
   }
@@ -907,8 +1028,14 @@
       leftBracket: _Tokens.OPEN_SQUARE_BRACKET,
       index: _readNode(data.indexExpression_index),
       rightBracket: _Tokens.CLOSE_SQUARE_BRACKET,
-    )..period =
-        AstBinaryFlags.hasPeriod(data.flags) ? _Tokens.PERIOD_PERIOD : null;
+    )
+      ..period =
+          AstBinaryFlags.hasPeriod(data.flags) ? _Tokens.PERIOD_PERIOD : null
+      ..staticElement = _elementOfComponents(
+        data.indexExpression_element,
+        data.indexExpression_substitution,
+      )
+      ..staticType = _readType(data.expression_type);
   }
 
   InstanceCreationExpression _read_instanceCreationExpression(LinkedNode data) {
@@ -929,11 +1056,14 @@
       ),
       typeArguments: _readNode(data.instanceCreationExpression_typeArguments),
     );
+    node.staticType = _readType(data.expression_type);
     return node;
   }
 
   IntegerLiteral _read_integerLiteral(LinkedNode data) {
-    return AstTestFactory.integer(data.integerLiteral_value);
+    // TODO(scheglov) Remove `?? _intType` after internal SDK roll.
+    return AstTestFactory.integer(data.integerLiteral_value)
+      ..staticType = _readType(data.expression_type) ?? _intType;
   }
 
   InterpolationExpression _read_interpolationExpression(LinkedNode data) {
@@ -961,7 +1091,7 @@
       _Tokens.IS,
       AstBinaryFlags.hasNot(data.flags) ? _Tokens.BANG : null,
       _readNode(data.isExpression_type),
-    );
+    )..staticType = _boolType;
   }
 
   Label _read_label(LinkedNode data) {
@@ -980,17 +1110,19 @@
 
   LibraryDirective _read_libraryDirective(LinkedNode data) {
     timerAstBinaryReaderDirective.start();
+    _isReadingDirective = true;
     try {
       var node = astFactory.libraryDirective(
         _unitContext.createComment(data),
-        _readNodeList(data.annotatedNode_metadata),
+        _readNodeListLazy(data.annotatedNode_metadata),
         _Tokens.LIBRARY,
         _readNode(data.libraryDirective_name),
         _Tokens.SEMICOLON,
       );
-      LazyDirective.setData(_unitContext, data, node);
+      LazyDirective.setData(node, data);
       return node;
     } finally {
+      _isReadingDirective = false;
       timerAstBinaryReaderDirective.stop();
     }
   }
@@ -1014,7 +1146,7 @@
       _Tokens.OPEN_SQUARE_BRACKET,
       _readNodeList(data.listLiteral_elements),
       _Tokens.CLOSE_SQUARE_BRACKET,
-    );
+    )..staticType = _readType(data.expression_type);
   }
 
   MapLiteralEntry _read_mapLiteralEntry(LinkedNode data) {
@@ -1037,10 +1169,10 @@
 
     var node = astFactory.methodDeclaration(
       _readDocumentationComment(data),
-      _readNodeList(data.annotatedNode_metadata),
+      _readNodeListLazy(data.annotatedNode_metadata),
       AstBinaryFlags.isExternal(data.flags) ? _Tokens.EXTERNAL : null,
       AstBinaryFlags.isStatic(data.flags) ? _Tokens.STATIC : null,
-      _readNode(data.methodDeclaration_returnType),
+      _readNodeLazy(data.methodDeclaration_returnType),
       _Tokens.choose(
         AstBinaryFlags.isGet(data.flags),
         _Tokens.GET,
@@ -1050,10 +1182,10 @@
       AstBinaryFlags.isOperator(data.flags) ? _Tokens.OPERATOR : null,
       _declaredIdentifier(data),
       _readNode(data.methodDeclaration_typeParameters),
-      _readNode(data.methodDeclaration_formalParameters),
+      _readNodeLazy(data.methodDeclaration_formalParameters),
       body,
     );
-    LazyMethodDeclaration.setData(_unitContext, data, node);
+    LazyMethodDeclaration.setData(node, data);
     LazyAst.setOperatorEqualParameterTypeFromObject(
       node,
       data.methodDeclaration_hasOperatorEqualWithParameterTypeFromObject,
@@ -1073,7 +1205,7 @@
       _readNode(data.methodInvocation_methodName),
       _readNode(data.invocationExpression_typeArguments),
       _readNode(data.invocationExpression_arguments),
-    );
+    )..staticInvokeType = _readType(data.invocationExpression_invokeType);
   }
 
   MixinDeclaration _read_mixinDeclaration(LinkedNode data) {
@@ -1081,17 +1213,17 @@
     try {
       var node = astFactory.mixinDeclaration(
         _readDocumentationComment(data),
-        _readNodeList(data.annotatedNode_metadata),
+        _readNodeListLazy(data.annotatedNode_metadata),
         _Tokens.MIXIN,
         _declaredIdentifier(data),
         _readNode(data.classOrMixinDeclaration_typeParameters),
-        _readNode(data.mixinDeclaration_onClause),
-        _readNode(data.classOrMixinDeclaration_implementsClause),
+        _readNodeLazy(data.mixinDeclaration_onClause),
+        _readNodeLazy(data.classOrMixinDeclaration_implementsClause),
         _Tokens.OPEN_CURLY_BRACKET,
         _readNodeListLazy(data.classOrMixinDeclaration_members),
         _Tokens.CLOSE_CURLY_BRACKET,
       );
-      LazyMixinDeclaration(_unitContext, data, node);
+      LazyMixinDeclaration(node, data);
       return node;
     } finally {
       timerAstBinaryReaderMixin.stop();
@@ -1124,7 +1256,7 @@
   NullLiteral _read_nullLiteral(LinkedNode data) {
     return astFactory.nullLiteral(
       _Tokens.NULL,
-    )..staticType;
+    )..staticType = _nullType;
   }
 
   OnClause _read_onClause(LinkedNode data) {
@@ -1139,41 +1271,45 @@
       _Tokens.OPEN_PAREN,
       _readNode(data.parenthesizedExpression_expression),
       _Tokens.CLOSE_PAREN,
-    );
+    )..staticType = _readType(data.expression_type);
   }
 
   PartDirective _read_partDirective(LinkedNode data) {
     timerAstBinaryReaderDirective.start();
+    _isReadingDirective = true;
     try {
       var node = astFactory.partDirective(
         _readDocumentationComment(data),
-        _readNodeList(data.annotatedNode_metadata),
+        _readNodeListLazy(data.annotatedNode_metadata),
         _Tokens.PART,
         _readNode(data.uriBasedDirective_uri),
         _Tokens.SEMICOLON,
       );
-      LazyDirective.setData(_unitContext, data, node);
+      LazyDirective.setData(node, data);
       return node;
     } finally {
+      _isReadingDirective = false;
       timerAstBinaryReaderDirective.stop();
     }
   }
 
   PartOfDirective _read_partOfDirective(LinkedNode data) {
     timerAstBinaryReaderDirective.start();
+    _isReadingDirective = true;
     try {
       var node = astFactory.partOfDirective(
         _readDocumentationComment(data),
-        _readNodeList(data.annotatedNode_metadata),
+        _readNodeListLazy(data.annotatedNode_metadata),
         _Tokens.PART,
         _Tokens.OF,
         _readNode(data.partOfDirective_uri),
         _readNode(data.partOfDirective_libraryName),
         _Tokens.SEMICOLON,
       );
-      LazyDirective.setData(_unitContext, data, node);
+      LazyDirective.setData(node, data);
       return node;
     } finally {
+      _isReadingDirective = false;
       timerAstBinaryReaderDirective.stop();
     }
   }
@@ -1182,7 +1318,12 @@
     return astFactory.postfixExpression(
       _readNode(data.postfixExpression_operand),
       _Tokens.fromType(data.postfixExpression_operator),
-    );
+    )
+      ..staticElement = _elementOfComponents(
+        data.postfixExpression_element,
+        data.postfixExpression_substitution,
+      )
+      ..staticType = _readType(data.expression_type);
   }
 
   PrefixedIdentifier _read_prefixedIdentifier(LinkedNode data) {
@@ -1190,14 +1331,19 @@
       _readNode(data.prefixedIdentifier_prefix),
       _Tokens.PERIOD,
       _readNode(data.prefixedIdentifier_identifier),
-    );
+    )..staticType = _readType(data.expression_type);
   }
 
   PrefixExpression _read_prefixExpression(LinkedNode data) {
     return astFactory.prefixExpression(
       _Tokens.fromType(data.prefixExpression_operator),
       _readNode(data.prefixExpression_operand),
-    );
+    )
+      ..staticElement = _elementOfComponents(
+        data.prefixExpression_element,
+        data.prefixExpression_substitution,
+      )
+      ..staticType = _readType(data.expression_type);
   }
 
   PropertyAccess _read_propertyAccess(LinkedNode data) {
@@ -1205,7 +1351,7 @@
       _readNode(data.propertyAccess_target),
       _Tokens.fromType(data.propertyAccess_operator),
       _readNode(data.propertyAccess_propertyName),
-    );
+    )..staticType = _readType(data.expression_type);
   }
 
   RedirectingConstructorInvocation _read_redirectingConstructorInvocation(
@@ -1216,13 +1362,16 @@
       hasThis ? _Tokens.PERIOD : null,
       _readNode(data.redirectingConstructorInvocation_constructorName),
       _readNode(data.redirectingConstructorInvocation_arguments),
-    );
+    )..staticElement = _elementOfComponents(
+        data.redirectingConstructorInvocation_element,
+        data.redirectingConstructorInvocation_substitution,
+      );
   }
 
   RethrowExpression _read_rethrowExpression(LinkedNode data) {
     return astFactory.rethrowExpression(
       _Tokens.RETHROW,
-    );
+    )..staticType = _readType(data.expression_type);
   }
 
   ReturnStatement _read_returnStatement(LinkedNode data) {
@@ -1246,7 +1395,7 @@
             )
           : null,
       rightBracket: _Tokens.CLOSE_CURLY_BRACKET,
-    );
+    )..staticType = _readType(data.expression_type);
     if (AstBinaryFlags.isMap(data.flags)) {
       node.becomeMap();
     } else if (AstBinaryFlags.isSet(data.flags)) {
@@ -1289,16 +1438,23 @@
   }
 
   SimpleIdentifier _read_simpleIdentifier(LinkedNode data) {
-    var node = astFactory.simpleIdentifier(
+    return astFactory.simpleIdentifier(
       TokenFactory.tokenFromString(data.name),
       isDeclaration: AstBinaryFlags.isDeclaration(data.flags),
-    );
-    LazyAst.setData(node, data);
-    return node;
+    )
+      ..staticElement = _elementOfComponents(
+        data.simpleIdentifier_element,
+        data.simpleIdentifier_substitution,
+      )
+      ..staticType = _readType(data.expression_type);
   }
 
   SimpleStringLiteral _read_simpleStringLiteral(LinkedNode data) {
-    return AstTestFactory.string2(data.simpleStringLiteral_value);
+    var node = AstTestFactory.string2(data.simpleStringLiteral_value);
+    if (!_isReadingDirective) {
+      node.staticType = _stringType;
+    }
+    return node;
   }
 
   SpreadElement _read_spreadElement(LinkedNode data) {
@@ -1309,9 +1465,13 @@
   }
 
   StringInterpolation _read_stringInterpolation(LinkedNode data) {
-    return astFactory.stringInterpolation(
+    var node = astFactory.stringInterpolation(
       _readNodeList(data.stringInterpolation_elements),
     );
+    if (!_isReadingDirective) {
+      node.staticType = _stringType;
+    }
+    return node;
   }
 
   SuperConstructorInvocation _read_superConstructorInvocation(LinkedNode data) {
@@ -1320,13 +1480,16 @@
       _Tokens.PERIOD,
       _readNode(data.superConstructorInvocation_constructorName),
       _readNode(data.superConstructorInvocation_arguments),
-    );
+    )..staticElement = _elementOfComponents(
+        data.superConstructorInvocation_element,
+        data.superConstructorInvocation_substitution,
+      );
   }
 
   SuperExpression _read_superExpression(LinkedNode data) {
     return astFactory.superExpression(
       _Tokens.SUPER,
-    );
+    )..staticType = _readType(data.expression_type);
   }
 
   SwitchCase _read_switchCase(LinkedNode data) {
@@ -1364,20 +1527,20 @@
     return astFactory.symbolLiteral(
       _Tokens.HASH,
       data.names.map((lexeme) => TokenFactory.tokenFromString(lexeme)).toList(),
-    );
+    )..staticType = _readType(data.expression_type);
   }
 
   ThisExpression _read_thisExpression(LinkedNode data) {
     return astFactory.thisExpression(
       _Tokens.THIS,
-    );
+    )..staticType = _readType(data.expression_type);
   }
 
   ThrowExpression _read_throwExpression(LinkedNode data) {
     return astFactory.throwExpression(
       _Tokens.THROW,
       _readNode(data.throwExpression_expression),
-    );
+    )..staticType = _readType(data.expression_type);
   }
 
   TopLevelVariableDeclaration _read_topLevelVariableDeclaration(
@@ -1386,13 +1549,13 @@
     try {
       var node = astFactory.topLevelVariableDeclaration(
         _readDocumentationComment(data),
-        _readNodeList(data.annotatedNode_metadata),
+        _readNodeListLazy(data.annotatedNode_metadata),
         _readNode(data.topLevelVariableDeclaration_variableList),
         _Tokens.SEMICOLON,
         externalKeyword:
             AstBinaryFlags.isExternal(data.flags) ? _Tokens.EXTERNAL : null,
       );
-      LazyTopLevelVariableDeclaration.setData(_unitContext, data, node);
+      LazyTopLevelVariableDeclaration.setData(node, data);
       return node;
     } finally {
       timerAstBinaryReaderTopLevelVar.stop();
@@ -1429,7 +1592,7 @@
           : null,
       question:
           AstBinaryFlags.hasQuestion(data.flags) ? _Tokens.QUESTION : null,
-    );
+    )..type = _readType(data.typeName_type);
   }
 
   TypeParameter _read_typeParameter(LinkedNode data) {
@@ -1437,10 +1600,10 @@
     // added to the interface.
     var node = (astFactory as AstFactoryImpl).typeParameter2(
       comment: _readDocumentationComment(data),
-      metadata: _readNodeList(data.annotatedNode_metadata),
+      metadata: _readNodeListLazy(data.annotatedNode_metadata),
       name: _declaredIdentifier(data),
       extendsKeyword: _Tokens.EXTENDS,
-      bound: _readNode(data.typeParameter_bound),
+      bound: _readNodeLazy(data.typeParameter_bound),
     );
     LazyAst.setVariance(node, _decodeVariance(data.typeParameter_variance));
     LazyTypeParameter.setData(node, data);
@@ -1459,7 +1622,7 @@
     var node = astFactory.variableDeclaration(
       _declaredIdentifier(data),
       _Tokens.EQ,
-      _readNode(data.variableDeclaration_initializer),
+      _readNodeLazy(data.variableDeclaration_initializer),
     );
     LazyVariableDeclaration.setData(node, data);
     LazyAst.setInheritsCovariant(node, data.inheritsCovariant);
@@ -1478,8 +1641,8 @@
         _Tokens.VAR,
       ),
       lateKeyword: AstBinaryFlags.isLate(data.flags) ? _Tokens.LATE : null,
-      metadata: _readNodeList(data.annotatedNode_metadata),
-      type: _readNode(data.variableDeclarationList_type),
+      metadata: _readNodeListLazy(data.annotatedNode_metadata),
+      type: _readNodeLazy(data.variableDeclarationList_type),
       variables: _readNodeList(data.variableDeclarationList_variables),
     );
     LazyVariableDeclarationList.setData(node, data);
@@ -1773,6 +1936,11 @@
     }
   }
 
+  AstNode _readNodeLazy(LinkedNode data) {
+    if (isLazy) return null;
+    return _readNode(data);
+  }
+
   List<T> _readNodeList<T>(List<LinkedNode> nodeList) {
     var result = List<T>.filled(nodeList.length, null);
     for (var i = 0; i < nodeList.length; ++i) {
@@ -1789,6 +1957,10 @@
     return _readNodeList(nodeList);
   }
 
+  DartType _readType(LinkedNodeType data) {
+    return _unitContext.readType(data);
+  }
+
   static Variance _decodeVariance(int encoding) {
     if (encoding == 0) {
       return null;
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
index 175ffc9..0035dd8 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
@@ -35,8 +35,6 @@
   /// so initializers of final fields should be written.
   bool _hasConstConstructor = false;
 
-  _ResolutionBuilder _resolutionBuilder;
-
   AstBinaryWriter(this._linkingContext);
 
   @override
@@ -48,10 +46,7 @@
 
   @override
   LinkedNodeBuilder visitAnnotation(Annotation node) {
-    var builder = LinkedNodeBuilder.annotation(
-      annotation_name: node.name?.accept(this),
-      annotation_constructorName: node.constructorName?.accept(this),
-    );
+    var elementComponents = _componentsOfElement(node.element);
 
     LinkedNodeBuilder storedArguments;
     var arguments = node.arguments;
@@ -62,11 +57,14 @@
         storedArguments = LinkedNodeBuilder.argumentList();
       }
     }
-    builder.annotation_arguments = storedArguments;
 
-    _componentsOfElement(node.element);
-
-    return builder;
+    return LinkedNodeBuilder.annotation(
+      annotation_arguments: storedArguments,
+      annotation_constructorName: node.constructorName?.accept(this),
+      annotation_element: elementComponents.rawElement,
+      annotation_substitution: elementComponents.substitution,
+      annotation_name: node.name?.accept(this),
+    );
   }
 
   @override
@@ -104,42 +102,40 @@
 
   @override
   LinkedNodeBuilder visitAssignmentExpression(AssignmentExpression node) {
-    var builder = LinkedNodeBuilder.assignmentExpression(
+    var elementComponents = _componentsOfElement(node.staticElement);
+    return LinkedNodeBuilder.assignmentExpression(
+      assignmentExpression_element: elementComponents.rawElement,
+      assignmentExpression_substitution: elementComponents.substitution,
       assignmentExpression_leftHandSide: node.leftHandSide.accept(this),
       assignmentExpression_operator: TokensWriter.astToBinaryTokenType(
         node.operator.type,
       ),
       assignmentExpression_rightHandSide: node.rightHandSide.accept(this),
+      expression_type: _writeType(node.staticType),
     );
-    _storeExpression(builder, node);
-
-    _componentsOfElement(node.staticElement);
-
-    return builder;
   }
 
   @override
   LinkedNodeBuilder visitAwaitExpression(AwaitExpression node) {
     return LinkedNodeBuilder.awaitExpression(
       awaitExpression_expression: node.expression.accept(this),
-      expression_type: _writeType('staticType', node.staticType),
+      expression_type: _writeType(node.staticType),
     );
   }
 
   @override
   LinkedNodeBuilder visitBinaryExpression(BinaryExpression node) {
-    var builder = LinkedNodeBuilder.binaryExpression(
+    var elementComponents = _componentsOfElement(node.staticElement);
+    return LinkedNodeBuilder.binaryExpression(
+      binaryExpression_element: elementComponents.rawElement,
+      binaryExpression_substitution: elementComponents.substitution,
       binaryExpression_leftOperand: node.leftOperand.accept(this),
       binaryExpression_operator: TokensWriter.astToBinaryTokenType(
         node.operator.type,
       ),
       binaryExpression_rightOperand: node.rightOperand.accept(this),
-      expression_type: _writeType('staticType', node.staticType),
+      expression_type: _writeType(node.staticType),
     );
-
-    _componentsOfElement(node.staticElement);
-
-    return builder;
   }
 
   @override
@@ -171,7 +167,6 @@
   LinkedNodeBuilder visitBooleanLiteral(BooleanLiteral node) {
     return LinkedNodeBuilder.booleanLiteral(
       booleanLiteral_value: node.value,
-      expression_type: _writeType('staticType', node.staticType),
     );
   }
 
@@ -209,8 +204,6 @@
     try {
       timerAstBinaryWriterClass.start();
 
-      _resolutionBuilder = _ResolutionBuilder();
-
       _hasConstConstructor = false;
       for (var member in node.members) {
         if (member is ConstructorDeclaration && member.constKeyword != null) {
@@ -219,29 +212,15 @@
         }
       }
 
-      var typeParameters = _enterTypeParameters(node.typeParameters);
-
       var builder = LinkedNodeBuilder.classDeclaration(
-        classOrMixinDeclaration_typeParameters:
-            node.typeParameters?.accept(this),
         classDeclaration_extendsClause: node.extendsClause?.accept(this),
         classDeclaration_nativeClause: node.nativeClause?.accept(this),
         classDeclaration_withClause: node.withClause?.accept(this),
-        classOrMixinDeclaration_implementsClause:
-            node.implementsClause?.accept(this),
       );
       builder.flags = AstBinaryFlags.encode(
         isAbstract: node.abstractKeyword != null,
       );
-
       _storeClassOrMixinDeclaration(builder, node);
-
-      _storeResolution(builder);
-
-      builder.classOrMixinDeclaration_members = _writeNodeList(node.members);
-
-      _linkingContext.typeParameterIndexer.exit(typeParameters);
-
       return builder;
     } finally {
       timerAstBinaryWriterClass.stop();
@@ -252,25 +231,17 @@
   LinkedNodeBuilder visitClassTypeAlias(ClassTypeAlias node) {
     timerAstBinaryWriterClass.start();
     try {
-      _resolutionBuilder = _ResolutionBuilder();
-
-      var typeParameters = _enterTypeParameters(node.typeParameters);
-
       var builder = LinkedNodeBuilder.classTypeAlias(
-        classTypeAlias_typeParameters: node.typeParameters?.accept(this),
-        classTypeAlias_superclass: node.superclass.accept(this),
-        classTypeAlias_withClause: node.withClause.accept(this),
         classTypeAlias_implementsClause: node.implementsClause?.accept(this),
+        classTypeAlias_superclass: node.superclass.accept(this),
+        classTypeAlias_typeParameters: node.typeParameters?.accept(this),
+        classTypeAlias_withClause: node.withClause.accept(this),
       );
       builder.flags = AstBinaryFlags.encode(
         isAbstract: node.abstractKeyword != null,
       );
       _storeTypeAlias(builder, node);
       _storeIsSimpleBounded(builder, node);
-
-      _storeResolution(builder);
-
-      _linkingContext.typeParameterIndexer.exit(typeParameters);
       return builder;
     } finally {
       timerAstBinaryWriterClass.stop();
@@ -341,8 +312,8 @@
   LinkedNodeBuilder visitConditionalExpression(ConditionalExpression node) {
     var builder = LinkedNodeBuilder.conditionalExpression(
       conditionalExpression_condition: node.condition.accept(this),
-      conditionalExpression_thenExpression: node.thenExpression.accept(this),
       conditionalExpression_elseExpression: node.elseExpression.accept(this),
+      conditionalExpression_thenExpression: node.thenExpression.accept(this),
     );
     _storeExpression(builder, node);
     return builder;
@@ -363,14 +334,12 @@
 
   @override
   LinkedNodeBuilder visitConstructorDeclaration(ConstructorDeclaration node) {
-    _resolutionBuilder = _ResolutionBuilder();
-
     var builder = LinkedNodeBuilder.constructorDeclaration(
-      constructorDeclaration_returnType: node.returnType.accept(this),
-      constructorDeclaration_parameters: node.parameters.accept(this),
       constructorDeclaration_initializers: _writeNodeList(node.initializers),
+      constructorDeclaration_parameters: node.parameters.accept(this),
       constructorDeclaration_redirectedConstructor:
           node.redirectedConstructor?.accept(this),
+      constructorDeclaration_returnType: node.returnType.accept(this),
       informativeId: getInformativeId(node),
     );
     builder.flags = AstBinaryFlags.encode(
@@ -384,9 +353,6 @@
     );
     builder.name = node.name?.name;
     _storeClassMember(builder, node);
-
-    _storeResolution(builder);
-
     return builder;
   }
 
@@ -394,8 +360,8 @@
   LinkedNodeBuilder visitConstructorFieldInitializer(
       ConstructorFieldInitializer node) {
     var builder = LinkedNodeBuilder.constructorFieldInitializer(
-      constructorFieldInitializer_fieldName: node.fieldName.accept(this),
       constructorFieldInitializer_expression: node.expression.accept(this),
+      constructorFieldInitializer_fieldName: node.fieldName.accept(this),
     );
     builder.flags = AstBinaryFlags.encode(
       hasThis: node.thisKeyword != null,
@@ -406,14 +372,13 @@
 
   @override
   LinkedNodeBuilder visitConstructorName(ConstructorName node) {
-    var builder = LinkedNodeBuilder.constructorName(
-      constructorName_type: node.type.accept(this),
+    var elementComponents = _componentsOfElement(node.staticElement);
+    return LinkedNodeBuilder.constructorName(
+      constructorName_element: elementComponents.rawElement,
+      constructorName_substitution: elementComponents.substitution,
       constructorName_name: node.name?.accept(this),
+      constructorName_type: node.type.accept(this),
     );
-
-    _componentsOfElement(node.staticElement);
-
-    return builder;
   }
 
   @override
@@ -428,8 +393,8 @@
   @override
   LinkedNodeBuilder visitDeclaredIdentifier(DeclaredIdentifier node) {
     var builder = LinkedNodeBuilder.declaredIdentifier(
-      declaredIdentifier_type: node.type?.accept(this),
       declaredIdentifier_identifier: node.identifier.accept(this),
+      declaredIdentifier_type: node.type?.accept(this),
     );
     builder.flags = AstBinaryFlags.encode(
       isConst: node.keyword?.keyword == Keyword.CONST,
@@ -448,9 +413,9 @@
     }
 
     var builder = LinkedNodeBuilder.defaultFormalParameter(
-      defaultFormalParameter_parameter: node.parameter.accept(this),
       defaultFormalParameter_defaultValue: defaultValue?.accept(this),
       defaultFormalParameter_kind: _toParameterKind(node),
+      defaultFormalParameter_parameter: node.parameter.accept(this),
       informativeId: getInformativeId(node),
     );
     builder.flags = AstBinaryFlags.encode(
@@ -505,12 +470,10 @@
 
   @override
   LinkedNodeBuilder visitEnumDeclaration(EnumDeclaration node) {
-    _resolutionBuilder = _ResolutionBuilder();
     var builder = LinkedNodeBuilder.enumDeclaration(
       enumDeclaration_constants: _writeNodeList(node.constants),
     );
     _storeNamedCompilationUnitMember(builder, node);
-    _storeResolution(builder);
     return builder;
   }
 
@@ -518,10 +481,8 @@
   LinkedNodeBuilder visitExportDirective(ExportDirective node) {
     timerAstBinaryWriterDirective.start();
     try {
-      _resolutionBuilder = _ResolutionBuilder();
       var builder = LinkedNodeBuilder.exportDirective();
       _storeNamespaceDirective(builder, node);
-      _storeResolution(builder);
       return builder;
     } finally {
       timerAstBinaryWriterDirective.stop();
@@ -561,12 +522,10 @@
 
   @override
   LinkedNodeBuilder visitExtensionDeclaration(ExtensionDeclaration node) {
-    var typeParameters = _enterTypeParameters(node.typeParameters);
-    _resolutionBuilder = _ResolutionBuilder();
-
     var builder = LinkedNodeBuilder.extensionDeclaration(
-      extensionDeclaration_typeParameters: node.typeParameters?.accept(this),
       extensionDeclaration_extendedType: node.extendedType.accept(this),
+      extensionDeclaration_members: _writeNodeList(node.members),
+      extensionDeclaration_typeParameters: node.typeParameters?.accept(this),
     );
 
     _storeCompilationUnitMember(builder, node);
@@ -574,34 +533,26 @@
     builder.name = node.name?.name;
     LazyExtensionDeclaration.get(node).put(builder);
 
-    _storeResolution(builder);
-
-    builder.extensionDeclaration_members = _writeNodeList(node.members);
-
-    _linkingContext.typeParameterIndexer.exit(typeParameters);
     return builder;
   }
 
   @override
   LinkedNodeBuilder visitExtensionOverride(ExtensionOverride node) {
     var builder = LinkedNodeBuilder.extensionOverride(
-      extensionOverride_extensionName: node.extensionName.accept(this),
-      extensionOverride_typeArguments: node.typeArguments?.accept(this),
       extensionOverride_arguments: _writeNodeList(
         node.argumentList.arguments,
       ),
-      extensionOverride_typeArgumentTypes: node.typeArgumentTypes
-          .map((t) => _writeType('typeArgumentType', t))
-          .toList(),
-      extensionOverride_extendedType:
-          _writeType('extendedType', node.extendedType),
+      extensionOverride_extensionName: node.extensionName.accept(this),
+      extensionOverride_typeArguments: node.typeArguments?.accept(this),
+      extensionOverride_typeArgumentTypes:
+          node.typeArgumentTypes.map(_writeType).toList(),
+      extensionOverride_extendedType: _writeType(node.extendedType),
     );
     return builder;
   }
 
   @override
   LinkedNodeBuilder visitFieldDeclaration(FieldDeclaration node) {
-    _resolutionBuilder = _ResolutionBuilder();
     var builder = LinkedNodeBuilder.fieldDeclaration(
       fieldDeclaration_fields: node.fields.accept(this),
       informativeId: getInformativeId(node),
@@ -613,22 +564,19 @@
       isStatic: node.staticKeyword != null,
     );
     _storeClassMember(builder, node);
-    _storeResolution(builder);
 
     return builder;
   }
 
   @override
   LinkedNodeBuilder visitFieldFormalParameter(FieldFormalParameter node) {
-    var typeParameters = _enterTypeParameters(node.typeParameters);
     var builder = LinkedNodeBuilder.fieldFormalParameter(
-      fieldFormalParameter_typeParameters: node.typeParameters?.accept(this),
-      fieldFormalParameter_type: node.type?.accept(this),
       fieldFormalParameter_formalParameters: node.parameters?.accept(this),
+      fieldFormalParameter_type: node.type?.accept(this),
+      fieldFormalParameter_typeParameters: node.typeParameters?.accept(this),
     );
     _storeNormalFormalParameter(builder, node, node.keyword);
     builder.flags |= AstBinaryFlags.encode(hasQuestion: node.question != null);
-    _linkingContext.typeParameterIndexer.exit(typeParameters);
     return builder;
   }
 
@@ -705,14 +653,10 @@
 
   @override
   LinkedNodeBuilder visitFunctionDeclaration(FunctionDeclaration node) {
-    _resolutionBuilder = _ResolutionBuilder();
-
-    var typeParameters =
-        _enterTypeParameters(node.functionExpression.typeParameters);
     var builder = LinkedNodeBuilder.functionDeclaration(
+      functionDeclaration_returnType: node.returnType?.accept(this),
       functionDeclaration_functionExpression:
           node.functionExpression?.accept(this),
-      functionDeclaration_returnType: node.returnType?.accept(this),
     );
     builder.flags = AstBinaryFlags.encode(
       isExternal: node.externalKeyword != null,
@@ -721,8 +665,6 @@
     );
     _storeNamedCompilationUnitMember(builder, node);
     _writeActualReturnType(builder, node);
-    _linkingContext.typeParameterIndexer.exit(typeParameters);
-    _storeResolution(builder);
     return builder;
   }
 
@@ -767,24 +709,16 @@
   LinkedNodeBuilder visitFunctionTypeAlias(FunctionTypeAlias node) {
     timerAstBinaryWriterTypedef.start();
     try {
-      var typeParameters = _enterTypeParameters(node.typeParameters);
-
-      _resolutionBuilder = _ResolutionBuilder();
-
       var builder = LinkedNodeBuilder.functionTypeAlias(
-        functionTypeAlias_typeParameters: node.typeParameters?.accept(this),
-        functionTypeAlias_returnType: node.returnType?.accept(this),
         functionTypeAlias_formalParameters: node.parameters.accept(this),
+        functionTypeAlias_returnType: node.returnType?.accept(this),
+        functionTypeAlias_typeParameters: node.typeParameters?.accept(this),
         typeAlias_hasSelfReference:
             LazyFunctionTypeAlias.getHasSelfReference(node),
       );
       _storeTypeAlias(builder, node);
       _writeActualReturnType(builder, node);
       _storeIsSimpleBounded(builder, node);
-
-      _storeResolution(builder);
-
-      _linkingContext.typeParameterIndexer.exit(typeParameters);
       return builder;
     } finally {
       timerAstBinaryWriterTypedef.stop();
@@ -794,16 +728,14 @@
   @override
   LinkedNodeBuilder visitFunctionTypedFormalParameter(
       FunctionTypedFormalParameter node) {
-    var typeParameters = _enterTypeParameters(node.typeParameters);
     var builder = LinkedNodeBuilder.functionTypedFormalParameter(
-      functionTypedFormalParameter_typeParameters:
-          node.typeParameters?.accept(this),
-      functionTypedFormalParameter_returnType: node.returnType?.accept(this),
       functionTypedFormalParameter_formalParameters:
           node.parameters.accept(this),
+      functionTypedFormalParameter_returnType: node.returnType?.accept(this),
+      functionTypedFormalParameter_typeParameters:
+          node.typeParameters?.accept(this),
     );
     _storeNormalFormalParameter(builder, node, null);
-    _linkingContext.typeParameterIndexer.exit(typeParameters);
     return builder;
   }
 
@@ -812,22 +744,18 @@
     var id = LazyAst.getGenericFunctionTypeId(node);
     assert(id != null);
 
-    var typeParameters = _enterTypeParameters(node.typeParameters);
-
     var builder = LinkedNodeBuilder.genericFunctionType(
       genericFunctionType_id: id,
-      genericFunctionType_typeParameters: node.typeParameters?.accept(this),
       genericFunctionType_returnType: node.returnType?.accept(this),
+      genericFunctionType_typeParameters: node.typeParameters?.accept(this),
       genericFunctionType_formalParameters: node.parameters.accept(this),
-      genericFunctionType_type: _writeType('type', node.type),
+      genericFunctionType_type: _writeType(node.type),
     );
     builder.flags = AstBinaryFlags.encode(
       hasQuestion: node.question != null,
     );
     _writeActualReturnType(builder, node);
 
-    _linkingContext.typeParameterIndexer.exit(typeParameters);
-
     return builder;
   }
 
@@ -835,10 +763,6 @@
   LinkedNodeBuilder visitGenericTypeAlias(GenericTypeAlias node) {
     timerAstBinaryWriterTypedef.start();
     try {
-      var typeParameters = _enterTypeParameters(node.typeParameters);
-
-      _resolutionBuilder = _ResolutionBuilder();
-
       var builder = LinkedNodeBuilder.genericTypeAlias(
         genericTypeAlias_typeParameters: node.typeParameters?.accept(this),
         genericTypeAlias_functionType: node.functionType?.accept(this),
@@ -847,10 +771,6 @@
       );
       _storeTypeAlias(builder, node);
       _storeIsSimpleBounded(builder, node);
-
-      _storeResolution(builder);
-
-      _linkingContext.typeParameterIndexer.exit(typeParameters);
       return builder;
     } finally {
       timerAstBinaryWriterTypedef.stop();
@@ -870,8 +790,8 @@
   LinkedNodeBuilder visitIfElement(IfElement node) {
     var builder = LinkedNodeBuilder.ifElement(
       ifMixin_condition: node.condition.accept(this),
-      ifElement_thenElement: node.thenElement.accept(this),
       ifElement_elseElement: node.elseElement?.accept(this),
+      ifElement_thenElement: node.thenElement.accept(this),
     );
     return builder;
   }
@@ -897,7 +817,6 @@
   LinkedNodeBuilder visitImportDirective(ImportDirective node) {
     timerAstBinaryWriterDirective.start();
     try {
-      _resolutionBuilder = _ResolutionBuilder();
       var builder = LinkedNodeBuilder.importDirective(
         importDirective_prefix: node.prefix?.name,
       );
@@ -905,7 +824,6 @@
         isDeferred: node.deferredKeyword != null,
       );
       _storeNamespaceDirective(builder, node);
-      _storeResolution(builder);
       return builder;
     } finally {
       timerAstBinaryWriterDirective.stop();
@@ -914,12 +832,14 @@
 
   @override
   LinkedNodeBuilder visitIndexExpression(IndexExpression node) {
+    var elementComponents = _componentsOfElement(node.staticElement);
     var builder = LinkedNodeBuilder.indexExpression(
+      indexExpression_element: elementComponents.rawElement,
+      indexExpression_substitution: elementComponents.substitution,
       indexExpression_index: node.index.accept(this),
       indexExpression_target: node.target?.accept(this),
-      expression_type: _writeType('staticType', node.staticType),
+      expression_type: _writeType(node.staticType),
     );
-    _componentsOfElement(node.staticElement);
     builder.flags = AstBinaryFlags.encode(
       hasPeriod: node.period != null,
       hasQuestion: node.question != null,
@@ -932,14 +852,14 @@
       InstanceCreationExpression node) {
     InstanceCreationExpressionImpl nodeImpl = node;
     var builder = LinkedNodeBuilder.instanceCreationExpression(
+      instanceCreationExpression_arguments: _writeNodeList(
+        node.argumentList.arguments,
+      ),
       instanceCreationExpression_constructorName:
           node.constructorName.accept(this),
       instanceCreationExpression_typeArguments:
           nodeImpl.typeArguments?.accept(this),
-      instanceCreationExpression_arguments: _writeNodeList(
-        node.argumentList.arguments,
-      ),
-      expression_type: _writeType('staticType', node.staticType),
+      expression_type: _writeType(node.staticType),
     );
     builder.flags = AstBinaryFlags.encode(
       isConst: node.keyword?.type == Keyword.CONST,
@@ -951,7 +871,7 @@
   @override
   LinkedNodeBuilder visitIntegerLiteral(IntegerLiteral node) {
     return LinkedNodeBuilder.integerLiteral(
-      expression_type: _writeType('staticType', node.staticType),
+      expression_type: _writeType(node.staticType),
       integerLiteral_value: node.value,
     );
   }
@@ -1004,13 +924,11 @@
   LinkedNodeBuilder visitLibraryDirective(LibraryDirective node) {
     timerAstBinaryWriterDirective.start();
     try {
-      _resolutionBuilder = _ResolutionBuilder();
       var builder = LinkedNodeBuilder.libraryDirective(
         informativeId: getInformativeId(node),
         libraryDirective_name: node.name.accept(this),
       );
       _storeDirective(builder, node);
-      _storeResolution(builder);
       return builder;
     } finally {
       timerAstBinaryWriterDirective.stop();
@@ -1043,13 +961,9 @@
 
   @override
   LinkedNodeBuilder visitMethodDeclaration(MethodDeclaration node) {
-    var typeParameters = _enterTypeParameters(node.typeParameters);
-
-    _resolutionBuilder = _ResolutionBuilder();
-
     var builder = LinkedNodeBuilder.methodDeclaration(
-      methodDeclaration_typeParameters: node.typeParameters?.accept(this),
       methodDeclaration_returnType: node.returnType?.accept(this),
+      methodDeclaration_typeParameters: node.typeParameters?.accept(this),
       methodDeclaration_formalParameters: node.parameters?.accept(this),
       methodDeclaration_hasOperatorEqualWithParameterTypeFromObject:
           LazyAst.hasOperatorEqualParameterTypeFromObject(node),
@@ -1066,22 +980,18 @@
       isSet: node.isSetter,
       isStatic: node.isStatic,
     );
-
-    _storeClassMember(builder, node);
-
     builder.topLevelTypeInferenceError = LazyAst.getTypeInferenceError(node);
+    _storeClassMember(builder, node);
     _storeInformativeId(builder, node);
     _writeActualReturnType(builder, node);
-    _linkingContext.typeParameterIndexer.exit(typeParameters);
-    _storeResolution(builder);
     return builder;
   }
 
   @override
   LinkedNodeBuilder visitMethodInvocation(MethodInvocation node) {
     var builder = LinkedNodeBuilder.methodInvocation(
-      methodInvocation_target: node.target?.accept(this),
       methodInvocation_methodName: node.methodName?.accept(this),
+      methodInvocation_target: node.target?.accept(this),
     );
     builder.flags = AstBinaryFlags.encode(
       hasPeriod: node.operator?.type == TokenType.PERIOD,
@@ -1095,26 +1005,10 @@
   LinkedNodeBuilder visitMixinDeclaration(MixinDeclaration node) {
     timerAstBinaryWriterMixin.start();
     try {
-      var typeParameters = _enterTypeParameters(node.typeParameters);
-
-      _resolutionBuilder = _ResolutionBuilder();
-
       var builder = LinkedNodeBuilder.mixinDeclaration(
-        classOrMixinDeclaration_typeParameters:
-            node.typeParameters?.accept(this),
         mixinDeclaration_onClause: node.onClause?.accept(this),
-        classOrMixinDeclaration_implementsClause:
-            node.implementsClause?.accept(this),
       );
-
       _storeClassOrMixinDeclaration(builder, node);
-
-      _storeResolution(builder);
-
-      builder.classOrMixinDeclaration_members = _writeNodeList(node.members);
-
-      _linkingContext.typeParameterIndexer.exit(typeParameters);
-
       LazyMixinDeclaration.get(node).put(builder);
       return builder;
     } finally {
@@ -1125,8 +1019,8 @@
   @override
   LinkedNodeBuilder visitNamedExpression(NamedExpression node) {
     return LinkedNodeBuilder.namedExpression(
-      namedExpression_name: node.name.accept(this),
       namedExpression_expression: node.expression.accept(this),
+      namedExpression_name: node.name.accept(this),
     );
   }
 
@@ -1170,10 +1064,8 @@
   LinkedNodeBuilder visitPartDirective(PartDirective node) {
     timerAstBinaryWriterDirective.start();
     try {
-      _resolutionBuilder = _ResolutionBuilder();
       var builder = LinkedNodeBuilder.partDirective();
       _storeUriBasedDirective(builder, node);
-      _storeResolution(builder);
       return builder;
     } finally {
       timerAstBinaryWriterDirective.stop();
@@ -1184,13 +1076,11 @@
   LinkedNodeBuilder visitPartOfDirective(PartOfDirective node) {
     timerAstBinaryWriterDirective.start();
     try {
-      _resolutionBuilder = _ResolutionBuilder();
       var builder = LinkedNodeBuilder.partOfDirective(
         partOfDirective_libraryName: node.libraryName?.accept(this),
         partOfDirective_uri: node.uri?.accept(this),
       );
       _storeDirective(builder, node);
-      _storeResolution(builder);
       return builder;
     } finally {
       timerAstBinaryWriterDirective.stop();
@@ -1199,53 +1089,49 @@
 
   @override
   LinkedNodeBuilder visitPostfixExpression(PostfixExpression node) {
-    var builder = LinkedNodeBuilder.postfixExpression(
+    var elementComponents = _componentsOfElement(node.staticElement);
+    return LinkedNodeBuilder.postfixExpression(
+      expression_type: _writeType(node.staticType),
+      postfixExpression_element: elementComponents.rawElement,
+      postfixExpression_substitution: elementComponents.substitution,
       postfixExpression_operand: node.operand.accept(this),
       postfixExpression_operator: TokensWriter.astToBinaryTokenType(
         node.operator.type,
       ),
     );
-
-    _componentsOfElement(node.staticElement);
-
-    _storeExpression(builder, node);
-
-    return builder;
   }
 
   @override
   LinkedNodeBuilder visitPrefixedIdentifier(PrefixedIdentifier node) {
     return LinkedNodeBuilder.prefixedIdentifier(
-      prefixedIdentifier_prefix: node.prefix.accept(this),
       prefixedIdentifier_identifier: node.identifier.accept(this),
-      expression_type: _writeType('staticType', node.staticType),
+      prefixedIdentifier_prefix: node.prefix.accept(this),
+      expression_type: _writeType(node.staticType),
     );
   }
 
   @override
   LinkedNodeBuilder visitPrefixExpression(PrefixExpression node) {
-    var builder = LinkedNodeBuilder.prefixExpression(
+    var elementComponents = _componentsOfElement(node.staticElement);
+    return LinkedNodeBuilder.prefixExpression(
+      expression_type: _writeType(node.staticType),
+      prefixExpression_element: elementComponents.rawElement,
+      prefixExpression_substitution: elementComponents.substitution,
       prefixExpression_operand: node.operand.accept(this),
       prefixExpression_operator: TokensWriter.astToBinaryTokenType(
         node.operator.type,
       ),
     );
-
-    _componentsOfElement(node.staticElement);
-
-    _storeExpression(builder, node);
-
-    return builder;
   }
 
   @override
   LinkedNodeBuilder visitPropertyAccess(PropertyAccess node) {
     var builder = LinkedNodeBuilder.propertyAccess(
-      propertyAccess_target: node.target?.accept(this),
       propertyAccess_operator: TokensWriter.astToBinaryTokenType(
         node.operator.type,
       ),
       propertyAccess_propertyName: node.propertyName.accept(this),
+      propertyAccess_target: node.target?.accept(this),
     );
     _storeExpression(builder, node);
     return builder;
@@ -1254,18 +1140,19 @@
   @override
   LinkedNodeBuilder visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
+    var elementComponents = _componentsOfElement(node.staticElement);
     var builder = LinkedNodeBuilder.redirectingConstructorInvocation(
-      redirectingConstructorInvocation_constructorName:
-          node.constructorName?.accept(this),
       redirectingConstructorInvocation_arguments:
           node.argumentList.accept(this),
+      redirectingConstructorInvocation_constructorName:
+          node.constructorName?.accept(this),
+      redirectingConstructorInvocation_element: elementComponents.rawElement,
+      redirectingConstructorInvocation_substitution:
+          elementComponents.substitution,
     );
     builder.flags = AstBinaryFlags.encode(
       hasThis: node.thisKeyword != null,
     );
-
-    _componentsOfElement(node.staticElement);
-
     _storeConstructorInitializer(builder, node);
     return builder;
   }
@@ -1273,7 +1160,7 @@
   @override
   LinkedNodeBuilder visitRethrowExpression(RethrowExpression node) {
     return LinkedNodeBuilder.rethrowExpression(
-      expression_type: _writeType('staticType', node.staticType),
+      expression_type: _writeType(node.staticType),
     );
   }
 
@@ -1328,22 +1215,16 @@
       }
     }
 
+    var elementComponents = _componentsOfElement(element);
     var builder = LinkedNodeBuilder.simpleIdentifier(
-      name: node.name,
+      simpleIdentifier_element: elementComponents.rawElement,
+      simpleIdentifier_substitution: elementComponents.substitution,
+      expression_type: _writeType(node.staticType),
     );
-
-    var hasType = node.staticType != null;
     builder.flags = AstBinaryFlags.encode(
       isDeclaration: node is DeclaredSimpleIdentifier,
-      hasType: hasType,
     );
-
-    _componentsOfElement(element);
-
-    if (hasType) {
-      _writeType('staticType', node.staticType);
-    }
-
+    builder.name = node.name;
     return builder;
   }
 
@@ -1375,14 +1256,14 @@
   @override
   LinkedNodeBuilder visitSuperConstructorInvocation(
       SuperConstructorInvocation node) {
+    var elementComponents = _componentsOfElement(node.staticElement);
     var builder = LinkedNodeBuilder.superConstructorInvocation(
+      superConstructorInvocation_arguments: node.argumentList.accept(this),
       superConstructorInvocation_constructorName:
           node.constructorName?.accept(this),
-      superConstructorInvocation_arguments: node.argumentList.accept(this),
+      superConstructorInvocation_element: elementComponents.rawElement,
+      superConstructorInvocation_substitution: elementComponents.substitution,
     );
-
-    _componentsOfElement(node.staticElement);
-
     _storeConstructorInitializer(builder, node);
     return builder;
   }
@@ -1438,7 +1319,7 @@
   LinkedNodeBuilder visitThrowExpression(ThrowExpression node) {
     return LinkedNodeBuilder.throwExpression(
       throwExpression_expression: node.expression.accept(this),
-      expression_type: _writeType('staticType', node.staticType),
+      expression_type: _writeType(node.staticType),
     );
   }
 
@@ -1447,7 +1328,6 @@
       TopLevelVariableDeclaration node) {
     timerAstBinaryWriterTopVar.start();
     try {
-      _resolutionBuilder = _ResolutionBuilder();
       var builder = LinkedNodeBuilder.topLevelVariableDeclaration(
         informativeId: getInformativeId(node),
         topLevelVariableDeclaration_variableList: node.variables?.accept(this),
@@ -1457,8 +1337,6 @@
       );
       _storeCompilationUnitMember(builder, node);
 
-      _storeResolution(builder);
-
       return builder;
     } finally {
       timerAstBinaryWriterTopVar.stop();
@@ -1483,26 +1361,23 @@
 
   @override
   LinkedNodeBuilder visitTypeName(TypeName node) {
-    var builder = LinkedNodeBuilder.typeName(
+    return LinkedNodeBuilder.typeName(
       typeName_name: node.name.accept(this),
+      typeName_type: _writeType(node.type),
       typeName_typeArguments: _writeNodeList(
         node.typeArguments?.arguments,
       ),
-      typeName_type: _writeType('type', node.type),
     )..flags = AstBinaryFlags.encode(
         hasQuestion: node.question != null,
         hasTypeArguments: node.typeArguments != null,
       );
-
-    return builder;
   }
 
   @override
   LinkedNodeBuilder visitTypeParameter(TypeParameter node) {
     var builder = LinkedNodeBuilder.typeParameter(
       typeParameter_bound: node.bound?.accept(this),
-      typeParameter_defaultType:
-          _writeType('defaultType', LazyAst.getDefaultType(node)),
+      typeParameter_defaultType: _writeType(LazyAst.getDefaultType(node)),
       typeParameter_variance: _encodeVariance(LazyAst.getVariance(node)),
       informativeId: getInformativeId(node),
     );
@@ -1614,54 +1489,24 @@
     }
   }
 
-  void _componentsOfElement(Element element) {
+  _ElementComponents _componentsOfElement(Element element) {
     if (element is ParameterMember) {
       element = element.declaration;
     }
 
     if (element is Member) {
-      var declaration = element.declaration;
-      var elementIndex = _indexOfElement(declaration);
-
-      var typeArguments = _enclosingClassTypeArguments(
-        declaration,
-        element.substitution.map,
-      );
+      var elementIndex = _indexOfElement(element.declaration);
+      var substitution = element.substitution.map;
       var substitutionBuilder = LinkedNodeTypeSubstitutionBuilder(
         isLegacy: element.isLegacy,
-        typeArguments: typeArguments
-            .map((type) => _linkingContext.writeType(type))
-            .toList(),
+        typeParameters: substitution.keys.map(_indexOfElement).toList(),
+        typeArguments: substitution.values.map(_writeType).toList(),
       );
-
-      if (_resolutionBuilder != null) {
-        _resolutionBuilder.elements.add(elementIndex);
-        _resolutionBuilder.substitutions.add(substitutionBuilder);
-      }
-    } else {
-      var elementIndex = _indexOfElement(element);
-
-      if (_resolutionBuilder != null) {
-        _resolutionBuilder.elements.add(elementIndex);
-        _resolutionBuilder.substitutions
-            .add(LinkedNodeTypeSubstitutionBuilder());
-      }
-    }
-  }
-
-  List<TypeParameterElement> _enterTypeParameters(TypeParameterList node) {
-    if (node == null) {
-      return const [];
+      return _ElementComponents(elementIndex, substitutionBuilder);
     }
 
-    var typeParameterElements = <TypeParameterElement>[];
-    for (var typeParameter in node.typeParameters) {
-      typeParameterElements.add(typeParameter.declaredElement);
-    }
-
-    _linkingContext.typeParameterIndexer.enter(typeParameterElements);
-
-    return typeParameterElements;
+    var elementIndex = _indexOfElement(element);
+    return _ElementComponents(elementIndex, null);
   }
 
   int _indexOfElement(Element element) {
@@ -1677,9 +1522,13 @@
   }
 
   void _storeClassOrMixinDeclaration(
-    LinkedNodeBuilder builder,
-    ClassOrMixinDeclaration node,
-  ) {
+      LinkedNodeBuilder builder, ClassOrMixinDeclaration node) {
+    builder
+      ..classOrMixinDeclaration_implementsClause =
+          node.implementsClause?.accept(this)
+      ..classOrMixinDeclaration_members = _writeNodeList(node.members)
+      ..classOrMixinDeclaration_typeParameters =
+          node.typeParameters?.accept(this);
     _storeNamedCompilationUnitMember(builder, node);
     _storeIsSimpleBounded(builder, node);
   }
@@ -1702,7 +1551,7 @@
   }
 
   void _storeExpression(LinkedNodeBuilder builder, Expression node) {
-    builder.expression_type = _writeType('staticType', node.staticType);
+    builder.expression_type = _writeType(node.staticType);
   }
 
   void _storeForEachParts(LinkedNodeBuilder builder, ForEachParts node) {
@@ -1746,8 +1595,7 @@
     _storeExpression(builder, node);
     builder
       ..invocationExpression_arguments = node.argumentList.accept(this)
-      ..invocationExpression_invokeType =
-          _writeType('invokeType', node.staticInvokeType)
+      ..invocationExpression_invokeType = _writeType(node.staticInvokeType)
       ..invocationExpression_typeArguments = node.typeArguments?.accept(this);
   }
 
@@ -1789,15 +1637,6 @@
       ..normalFormalParameter_metadata = _writeNodeList(node.metadata);
   }
 
-  void _storeResolution(LinkedNodeBuilder builder) {
-    builder.resolution = LinkedNodeResolutionBuilder(
-      elements: _resolutionBuilder.elements,
-      substitutions: _resolutionBuilder.substitutions,
-      types: _resolutionBuilder.types,
-    );
-    _resolutionBuilder = null;
-  }
-
   void _storeStatement(LinkedNodeBuilder builder, Statement node) {}
 
   void _storeSwitchMember(LinkedNodeBuilder builder, SwitchMember node) {
@@ -1829,19 +1668,20 @@
     _storeDirective(builder, node);
     builder
       ..uriBasedDirective_uri = node.uri.accept(this)
-      ..uriBasedDirective_uriContent = node.uriContent;
+      ..uriBasedDirective_uriContent = node.uriContent
+      ..uriBasedDirective_uriElement = _indexOfElement(node.uriElement);
   }
 
   void _writeActualReturnType(LinkedNodeBuilder builder, AstNode node) {
     var type = LazyAst.getReturnType(node);
     // TODO(scheglov) Check for `null` when writing resolved AST.
-    builder.actualReturnType = _writeType('actualReturnType', type);
+    builder.actualReturnType = _writeType(type);
   }
 
   void _writeActualType(LinkedNodeBuilder builder, AstNode node) {
     var type = LazyAst.getType(node);
     // TODO(scheglov) Check for `null` when writing resolved AST.
-    builder.actualType = _writeType('actualType', type);
+    builder.actualType = _writeType(type);
   }
 
   List<LinkedNodeBuilder> _writeNodeList(List<AstNode> nodeList) {
@@ -1860,38 +1700,8 @@
     return result;
   }
 
-  LinkedNodeTypeBuilder _writeType(String name, DartType type) {
-    var typeBuilder = _linkingContext.writeType(type);
-
-    if (_resolutionBuilder != null) {
-      _resolutionBuilder.addType(name, typeBuilder);
-      return null;
-    }
-
-    return typeBuilder;
-  }
-
-  static List<DartType> _enclosingClassTypeArguments(
-    Element declaration,
-    Map<TypeParameterElement, DartType> substitution,
-  ) {
-    var enclosing = declaration.enclosingElement;
-    if (enclosing is TypeParameterizedElement) {
-      if (enclosing is! ClassElement && enclosing is! ExtensionElement) {
-        return const <DartType>[];
-      }
-
-      var typeParameters = enclosing.typeParameters;
-      if (typeParameters.isEmpty) {
-        return const <DartType>[];
-      }
-
-      return typeParameters
-          .map((typeParameter) => substitution[typeParameter])
-          .toList(growable: false);
-    }
-
-    return const <DartType>[];
+  LinkedNodeTypeBuilder _writeType(DartType type) {
+    return _linkingContext.writeType(type);
   }
 
   static int _encodeVariance(Variance variance) {
@@ -1939,6 +1749,14 @@
   }
 }
 
+/// Components of a [Member] - the raw element, and the substitution.
+class _ElementComponents {
+  final int rawElement;
+  final LinkedNodeTypeSubstitutionBuilder substitution;
+
+  _ElementComponents(this.rawElement, this.substitution);
+}
+
 class _IsSerializableExpressionVisitor extends RecursiveAstVisitor<void> {
   bool result = true;
 
@@ -1947,13 +1765,3 @@
     result = false;
   }
 }
-
-class _ResolutionBuilder {
-  final List<int> elements = [];
-  final List<LinkedNodeTypeSubstitutionBuilder> substitutions = [];
-  final List<LinkedNodeTypeBuilder> types = [];
-
-  void addType(String name, LinkedNodeTypeBuilder type) {
-    types.add(type);
-  }
-}
diff --git a/pkg/analyzer/lib/src/summary2/default_types_builder.dart b/pkg/analyzer/lib/src/summary2/default_types_builder.dart
index 3eac814..4a8d0c5 100644
--- a/pkg/analyzer/lib/src/summary2/default_types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/default_types_builder.dart
@@ -235,7 +235,7 @@
           void recurseParameters(List<TypeParameterElement> parameters) {
             for (TypeParameterElementImpl parameter in parameters) {
               TypeParameter parameterNode = parameter.linkedNode;
-              var bound = parameterNode?.bound;
+              var bound = parameterNode.bound;
               if (bound != null) {
                 var tails = _findRawTypePathsToDeclaration(
                   parameterNode,
diff --git a/pkg/analyzer/lib/src/summary2/lazy_ast.dart b/pkg/analyzer/lib/src/summary2/lazy_ast.dart
index 25f5416..dea4fa9 100644
--- a/pkg/analyzer/lib/src/summary2/lazy_ast.dart
+++ b/pkg/analyzer/lib/src/summary2/lazy_ast.dart
@@ -9,7 +9,6 @@
 import 'package:analyzer/src/dart/resolver/variance.dart';
 import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
-import 'package:analyzer/src/summary2/apply_resolution.dart';
 import 'package:analyzer/src/summary2/ast_binary_flags.dart';
 import 'package:analyzer/src/summary2/ast_binary_reader.dart';
 import 'package:analyzer/src/summary2/linked_unit_context.dart';
@@ -31,78 +30,10 @@
   static const _typeKey = 'lazyAst_type';
   static const _varianceKey = 'lazyAst_variance';
 
-  static final Expando<LinkedNode> _dataExpando = Expando();
-
   final LinkedNode data;
 
   LazyAst(this.data);
 
-  static void applyResolution(AstNode node) {
-    if (node is ClassDeclaration) {
-      var lazy = LazyClassDeclaration.get(node);
-      lazy?.applyResolution();
-    } else if (node is ClassTypeAlias) {
-      var lazy = LazyClassTypeAlias.get(node);
-      lazy?.applyResolution();
-    } else if (node is CompilationUnit) {
-      // TODO(scheglov)
-    } else if (node is ConstructorDeclaration) {
-      var lazy = LazyConstructorDeclaration.get(node);
-      lazy?.applyResolution();
-    } else if (node is Directive) {
-      var lazy = LazyDirective.get(node);
-      lazy?.applyResolution();
-    } else if (node is EnumDeclaration) {
-      var lazy = LazyEnumDeclaration.get(node);
-      lazy?.applyResolution();
-    } else if (node is ExtensionDeclaration) {
-      var lazy = LazyExtensionDeclaration.get(node);
-      if (lazy?.data != null) {
-        lazy?.applyResolution();
-      }
-    } else if (node is FieldFormalParameter) {
-      // TODO(scheglov)
-    } else if (node is FunctionDeclaration) {
-      var lazy = LazyFunctionDeclaration.get(node);
-      lazy?.applyResolution();
-    } else if (node is FunctionTypeAlias) {
-      var lazy = LazyFunctionTypeAlias.get(node);
-      lazy?.applyResolution();
-    } else if (node is GenericFunctionType) {
-      // TODO(scheglov)
-    } else if (node is GenericTypeAlias) {
-      var lazy = LazyGenericTypeAlias.get(node);
-      lazy?.applyResolution();
-    } else if (node is ImportDirective) {
-      // TODO(scheglov)
-    } else if (node is MethodDeclaration) {
-      var lazy = LazyMethodDeclaration.get(node);
-      lazy?.applyResolution();
-    } else if (node is MixinDeclaration) {
-      var lazy = LazyMixinDeclaration.get(node);
-      if (lazy?.data != null) {
-        lazy?.applyResolution();
-      }
-    } else if (node is SimpleFormalParameter) {
-      // TODO(scheglov)
-    } else if (node is VariableDeclaration) {
-      var parent2 = node.parent.parent;
-      if (parent2 is FieldDeclaration) {
-        var lazy = LazyFieldDeclaration.get(parent2);
-        lazy?.applyResolution();
-      } else if (parent2 is TopLevelVariableDeclaration) {
-        var lazy = LazyTopLevelVariableDeclaration.get(parent2);
-        lazy?.applyResolution();
-      } else {
-        throw UnimplementedError('${parent2.runtimeType}');
-      }
-    }
-  }
-
-  static LinkedNode getData(AstNode node) {
-    return _dataExpando[node];
-  }
-
   static DartType getDefaultType(TypeParameter node) {
     return node.getProperty(_defaultTypeKey);
   }
@@ -148,10 +79,6 @@
     return node.getProperty(_isSimplyBoundedKey);
   }
 
-  static void setData(AstNode node, LinkedNode data) {
-    _dataExpando[node] = data;
-  }
-
   static void setDefaultType(TypeParameter node, DartType type) {
     node.setProperty(_defaultTypeKey, type);
   }
@@ -201,29 +128,16 @@
 class LazyClassDeclaration {
   static const _key = 'lazyAst';
 
-  final LinkedUnitContext unitContext;
   final LinkedNode data;
-  final ClassDeclaration node;
 
   bool _hasDocumentationComment = false;
+  bool _hasExtendsClause = false;
+  bool _hasImplementsClause = false;
   bool _hasMembers = false;
-  bool _hasResolutionApplied = false;
+  bool _hasMetadata = false;
+  bool _hasWithClause = false;
 
-  LazyClassDeclaration(this.unitContext, this.data, this.node);
-
-  void applyResolution() {
-    if (_hasResolutionApplied) {
-      return;
-    }
-    _hasResolutionApplied = true;
-
-    unitContext.pushTypeParameterStack();
-
-    var visitor = ApplyResolutionVisitor(unitContext, data.resolution);
-    node.accept(visitor);
-
-    unitContext.popTypeParameterStack();
-  }
+  LazyClassDeclaration(this.data);
 
   static LazyClassDeclaration get(ClassDeclaration node) {
     return node.getProperty(_key);
@@ -262,6 +176,32 @@
     }
   }
 
+  static void readExtendsClause(
+    AstBinaryReader reader,
+    ClassDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasExtendsClause) {
+      node.extendsClause = reader.readNode(
+        lazy.data.classDeclaration_extendsClause,
+      );
+      lazy._hasExtendsClause = true;
+    }
+  }
+
+  static void readImplementsClause(
+    AstBinaryReader reader,
+    ClassDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasImplementsClause) {
+      node.implementsClause = reader.readNode(
+        lazy.data.classOrMixinDeclaration_implementsClause,
+      );
+      lazy._hasImplementsClause = true;
+    }
+  }
+
   static void readMembers(
     AstBinaryReader reader,
     ClassDeclaration node,
@@ -277,12 +217,36 @@
     }
   }
 
-  static void setData(
-    LinkedUnitContext unitContext,
-    LinkedNode data,
+  static void readMetadata(
+    AstBinaryReader reader,
     ClassDeclaration node,
   ) {
-    node.setProperty(_key, LazyClassDeclaration(unitContext, data, node));
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void readWithClause(
+    AstBinaryReader reader,
+    ClassDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasWithClause) {
+      node.withClause = reader.readNode(
+        lazy.data.classDeclaration_withClause,
+      );
+      lazy._hasWithClause = true;
+    }
+  }
+
+  static void setData(ClassDeclaration node, LinkedNode data) {
+    node.setProperty(_key, LazyClassDeclaration(data));
     LazyAst.setSimplyBounded(node, data.simplyBoundable_isSimplyBounded);
   }
 }
@@ -290,28 +254,15 @@
 class LazyClassTypeAlias {
   static const _key = 'lazyAst';
 
-  final LinkedUnitContext unitContext;
   final LinkedNode data;
-  final ClassTypeAlias node;
 
   bool _hasDocumentationComment = false;
-  bool _hasResolutionApplied = false;
+  bool _hasImplementsClause = false;
+  bool _hasMetadata = false;
+  bool _hasSuperclass = false;
+  bool _hasWithClause = false;
 
-  LazyClassTypeAlias(this.unitContext, this.data, this.node);
-
-  void applyResolution() {
-    if (_hasResolutionApplied) {
-      return;
-    }
-    _hasResolutionApplied = true;
-
-    unitContext.pushTypeParameterStack();
-
-    var visitor = ApplyResolutionVisitor(unitContext, data.resolution);
-    node.accept(visitor);
-
-    unitContext.popTypeParameterStack();
-  }
+  LazyClassTypeAlias(this.data);
 
   static LazyClassTypeAlias get(ClassTypeAlias node) {
     return node.getProperty(_key);
@@ -350,12 +301,62 @@
     }
   }
 
-  static void setData(
-    LinkedUnitContext unitContext,
-    LinkedNode data,
+  static void readImplementsClause(
+    AstBinaryReader reader,
     ClassTypeAlias node,
   ) {
-    node.setProperty(_key, LazyClassTypeAlias(unitContext, data, node));
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasImplementsClause) {
+      node.implementsClause = reader.readNode(
+        lazy.data.classTypeAlias_implementsClause,
+      );
+      lazy._hasImplementsClause = true;
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    ClassTypeAlias node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void readSuperclass(
+    AstBinaryReader reader,
+    ClassTypeAlias node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasSuperclass) {
+      node.superclass = reader.readNode(
+        lazy.data.classTypeAlias_superclass,
+      );
+      lazy._hasSuperclass = true;
+    }
+  }
+
+  static void readWithClause(
+    AstBinaryReader reader,
+    ClassTypeAlias node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasWithClause) {
+      node.withClause = reader.readNode(
+        lazy.data.classTypeAlias_withClause,
+      );
+      lazy._hasWithClause = true;
+    }
+  }
+
+  static void setData(ClassTypeAlias node, LinkedNode data) {
+    node.setProperty(_key, LazyClassTypeAlias(data));
     LazyAst.setSimplyBounded(node, data.simplyBoundable_isSimplyBounded);
   }
 }
@@ -418,29 +419,16 @@
 class LazyConstructorDeclaration {
   static const _key = 'lazyAst';
 
-  final LinkedUnitContext unitContext;
   final LinkedNode data;
-  final ConstructorDeclaration node;
 
+  bool _hasBody = false;
   bool _hasDocumentationComment = false;
-  bool _hasResolutionApplied = false;
+  bool _hasFormalParameters = false;
+  bool _hasInitializers = false;
+  bool _hasMetadata = false;
+  bool _hasRedirectedConstructor = false;
 
-  LazyConstructorDeclaration(this.unitContext, this.data, this.node);
-
-  void applyResolution() {
-    if (_hasResolutionApplied) {
-      return;
-    }
-    _hasResolutionApplied = true;
-
-    unitContext.pushTypeParameterStack();
-
-    var visitor = ApplyResolutionVisitor(unitContext, data.resolution);
-    visitor.addParentTypeParameters(node);
-    node.accept(visitor);
-
-    unitContext.popTypeParameterStack();
-  }
+  LazyConstructorDeclaration(this.data);
 
   static LazyConstructorDeclaration get(ConstructorDeclaration node) {
     return node.getProperty(_key);
@@ -468,6 +456,19 @@
     return node.offset;
   }
 
+  static void readBody(
+    AstBinaryReader reader,
+    ConstructorDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasBody) {
+      node.body = reader.readNode(
+        lazy.data.constructorDeclaration_body,
+      );
+      lazy._hasBody = true;
+    }
+  }
+
   static void readDocumentationComment(
     LinkedUnitContext context,
     ConstructorDeclaration node,
@@ -479,12 +480,64 @@
     }
   }
 
-  static void setData(
-    LinkedUnitContext unitContext,
-    LinkedNode data,
+  static void readFormalParameters(
+    AstBinaryReader reader,
     ConstructorDeclaration node,
   ) {
-    node.setProperty(_key, LazyConstructorDeclaration(unitContext, data, node));
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasFormalParameters) {
+      node.parameters = reader.readNode(
+        lazy.data.constructorDeclaration_parameters,
+      );
+      lazy._hasFormalParameters = true;
+    }
+  }
+
+  static void readInitializers(
+    AstBinaryReader reader,
+    ConstructorDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasInitializers) {
+      var dataList = lazy.data.constructorDeclaration_initializers;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.initializers[i] = reader.readNode(data);
+      }
+      lazy._hasInitializers = true;
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    ConstructorDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void readRedirectedConstructor(
+    AstBinaryReader reader,
+    ConstructorDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasRedirectedConstructor) {
+      node.redirectedConstructor = reader.readNode(
+        lazy.data.constructorDeclaration_redirectedConstructor,
+      );
+      lazy._hasRedirectedConstructor = true;
+    }
+  }
+
+  static void setData(ConstructorDeclaration node, LinkedNode data) {
+    node.setProperty(_key, LazyConstructorDeclaration(data));
   }
 }
 
@@ -492,24 +545,11 @@
   static const _key = 'lazyAst';
   static const _uriKey = 'lazyAst_selectedUri';
 
-  final LinkedUnitContext unitContext;
   final LinkedNode data;
-  final Directive node;
 
-  bool _hasResolutionApplied = false;
+  bool _hasMetadata = false;
 
-  LazyDirective(this.unitContext, this.data, this.node);
-
-  void applyResolution() {
-    if (_hasResolutionApplied) {
-      return;
-    }
-
-    var visitor = ApplyResolutionVisitor(unitContext, data.resolution);
-    node.accept(visitor);
-
-    _hasResolutionApplied = true;
-  }
+  LazyDirective(this.data);
 
   static LazyDirective get(Directive node) {
     return node.getProperty(_key);
@@ -519,12 +559,20 @@
     return node.getProperty(_uriKey);
   }
 
-  static void setData(
-    LinkedUnitContext unitContext,
-    LinkedNode data,
-    Directive node,
-  ) {
-    node.setProperty(_key, LazyDirective(unitContext, data, node));
+  static void readMetadata(AstBinaryReader reader, Directive node) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void setData(Directive node, LinkedNode data) {
+    node.setProperty(_key, LazyDirective(data));
     if (node is NamespaceDirective) {
       node.setProperty(_uriKey, data.namespaceDirective_selectedUri);
     }
@@ -541,6 +589,7 @@
   final LinkedNode data;
 
   bool _hasDocumentationComment = false;
+  bool _hasMetadata = false;
 
   LazyEnumConstantDeclaration(this.data);
 
@@ -581,6 +630,21 @@
     }
   }
 
+  static void readMetadata(
+    AstBinaryReader reader,
+    EnumConstantDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
   static void setData(EnumConstantDeclaration node, LinkedNode data) {
     node.setProperty(_key, LazyEnumConstantDeclaration(data));
   }
@@ -589,28 +653,13 @@
 class LazyEnumDeclaration {
   static const _key = 'lazyAst';
 
-  final LinkedUnitContext unitContext;
   final LinkedNode data;
-  final EnumDeclaration node;
 
+  bool _hasConstants = false;
   bool _hasDocumentationComment = false;
-  bool _hasResolutionApplied = false;
+  bool _hasMetadata = false;
 
-  LazyEnumDeclaration(this.unitContext, this.data, this.node);
-
-  void applyResolution() {
-    if (_hasResolutionApplied) {
-      return;
-    }
-    _hasResolutionApplied = true;
-
-    unitContext.pushTypeParameterStack();
-
-    var visitor = ApplyResolutionVisitor(unitContext, data.resolution);
-    node.accept(visitor);
-
-    unitContext.popTypeParameterStack();
-  }
+  LazyEnumDeclaration(this.data);
 
   static LazyEnumDeclaration get(EnumDeclaration node) {
     return node.getProperty(_key);
@@ -638,6 +687,21 @@
     return node.offset;
   }
 
+  static void readConstants(
+    AstBinaryReader reader,
+    EnumDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasConstants) {
+      var dataList = lazy.data.enumDeclaration_constants;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.constants[i] = reader.readNode(data);
+      }
+      lazy._hasConstants = true;
+    }
+  }
+
   static void readDocumentationComment(
     LinkedUnitContext context,
     EnumDeclaration node,
@@ -649,31 +713,41 @@
     }
   }
 
-  static void setData(
-    LinkedUnitContext unitContext,
-    LinkedNode data,
+  static void readMetadata(
+    AstBinaryReader reader,
     EnumDeclaration node,
   ) {
-    node.setProperty(_key, LazyEnumDeclaration(unitContext, data, node));
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void setData(EnumDeclaration node, LinkedNode data) {
+    node.setProperty(_key, LazyEnumDeclaration(data));
   }
 }
 
 class LazyExtensionDeclaration {
   static const _key = 'lazyAst';
 
-  final LinkedUnitContext unitContext;
   final LinkedNode data;
-  final ExtensionDeclaration node;
 
   bool _hasDocumentationComment = false;
+  bool _hasExtendedType = false;
   bool _hasMembers = false;
-  bool _hasResolutionApplied = false;
+  bool _hasMetadata = false;
 
   /// The name for use in `Reference`. If the extension is named, the name
   /// of the extension. If the extension is unnamed, a synthetic name.
   String _refName;
 
-  LazyExtensionDeclaration(this.unitContext, this.data, this.node) {
+  LazyExtensionDeclaration(ExtensionDeclaration node, this.data) {
     node.setProperty(_key, this);
     if (data != null) {
       _refName = data.extensionDeclaration_refName;
@@ -682,16 +756,6 @@
 
   String get refName => _refName;
 
-  void applyResolution() {
-    if (_hasResolutionApplied) {
-      return;
-    }
-    _hasResolutionApplied = true;
-
-    var visitor = ApplyResolutionVisitor(unitContext, data.resolution);
-    node.accept(visitor);
-  }
-
   void put(LinkedNodeBuilder builder) {
     assert(_refName != null);
     builder.extensionDeclaration_refName = _refName;
@@ -704,7 +768,7 @@
   static LazyExtensionDeclaration get(ExtensionDeclaration node) {
     LazyExtensionDeclaration lazy = node.getProperty(_key);
     if (lazy == null) {
-      return LazyExtensionDeclaration(null, null, node);
+      return LazyExtensionDeclaration(node, null);
     }
     return lazy;
   }
@@ -742,6 +806,19 @@
     }
   }
 
+  static void readExtendedType(
+    AstBinaryReader reader,
+    ExtensionDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy?.data != null && !lazy._hasExtendedType) {
+      (node as ExtensionDeclarationImpl).extendedType = reader.readNode(
+        lazy.data.extensionDeclaration_extendedType,
+      );
+      lazy._hasExtendedType = true;
+    }
+  }
+
   static void readMembers(
     AstBinaryReader reader,
     ExtensionDeclaration node,
@@ -756,34 +833,32 @@
       lazy._hasMembers = true;
     }
   }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    ExtensionDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy?.data != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
 }
 
 class LazyFieldDeclaration {
   static const _key = 'lazyAst';
 
-  final LinkedUnitContext unitContext;
   final LinkedNode data;
-  final FieldDeclaration node;
 
   bool _hasDocumentationComment = false;
-  bool _hasResolutionApplied = false;
+  bool _hasMetadata = false;
 
-  LazyFieldDeclaration(this.unitContext, this.data, this.node);
-
-  void applyResolution() {
-    if (_hasResolutionApplied) {
-      return;
-    }
-    _hasResolutionApplied = true;
-
-    unitContext.pushTypeParameterStack();
-
-    var visitor = ApplyResolutionVisitor(unitContext, data.resolution);
-    visitor.addParentTypeParameters(node);
-    node.accept(visitor);
-
-    unitContext.popTypeParameterStack();
-  }
+  LazyFieldDeclaration(this.data);
 
   static LazyFieldDeclaration get(FieldDeclaration node) {
     return node.getProperty(_key);
@@ -800,12 +875,23 @@
     }
   }
 
-  static void setData(
-    LinkedUnitContext unitContext,
-    LinkedNode data,
+  static void readMetadata(
+    AstBinaryReader reader,
     FieldDeclaration node,
   ) {
-    node.setProperty(_key, LazyFieldDeclaration(unitContext, data, node));
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void setData(FieldDeclaration node, LinkedNode data) {
+    node.setProperty(_key, LazyFieldDeclaration(data));
   }
 }
 
@@ -814,7 +900,12 @@
 
   final LinkedNode data;
 
+  bool _hasDefaultValue = false;
+  bool _hasFormalParameters = false;
+  bool _hasMetadata = false;
+  bool _hasType = false;
   bool _hasTypeInferenceError = false;
+  bool _hasTypeNode = false;
 
   LazyFormalParameter(this.data);
 
@@ -859,6 +950,19 @@
     }
   }
 
+  static DartType getType(
+    AstBinaryReader reader,
+    FormalParameter node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasType) {
+      var type = reader.readType(lazy.data.actualType);
+      LazyAst.setType(node, type);
+      lazy._hasType = true;
+    }
+    return LazyAst.getType(node);
+  }
+
   static TopLevelInferenceError getTypeInferenceError(FormalParameter node) {
     var lazy = get(node);
     if (lazy != null && !lazy._hasTypeInferenceError) {
@@ -878,6 +982,68 @@
     }
   }
 
+  static void readDefaultValue(
+    AstBinaryReader reader,
+    DefaultFormalParameter node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasDefaultValue) {
+      node.defaultValue = reader.readNode(
+        lazy.data.defaultFormalParameter_defaultValue,
+      );
+      lazy._hasDefaultValue = true;
+    }
+  }
+
+  static void readFormalParameters(
+    AstBinaryReader reader,
+    FormalParameter node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasFormalParameters) {
+      if (node is FunctionTypedFormalParameter) {
+        node.parameters = reader.readNode(
+          lazy.data.functionTypedFormalParameter_formalParameters,
+        );
+      } else if (node is FieldFormalParameter) {
+        node.parameters = reader.readNode(
+          lazy.data.fieldFormalParameter_formalParameters,
+        );
+      }
+      lazy._hasFormalParameters = true;
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    FormalParameter node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.normalFormalParameter_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void readTypeNode(
+    AstBinaryReader reader,
+    FormalParameter node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasTypeNode) {
+      if (node is SimpleFormalParameter) {
+        node.type = reader.readNode(
+          lazy.data.simpleFormalParameter_type,
+        );
+      }
+      lazy._hasTypeNode = true;
+    }
+  }
+
   static void setData(FormalParameter node, LinkedNode data) {
     node.setProperty(_key, LazyFormalParameter(data));
   }
@@ -886,28 +1052,14 @@
 class LazyFunctionDeclaration {
   static const _key = 'lazyAst';
 
-  final LinkedUnitContext unitContext;
   final LinkedNode data;
-  final FunctionDeclaration node;
 
   bool _hasDocumentationComment = false;
-  bool _hasResolutionApplied = false;
+  bool _hasMetadata = false;
+  bool _hasReturnType = false;
+  bool _hasReturnTypeNode = false;
 
-  LazyFunctionDeclaration(this.unitContext, this.data, this.node);
-
-  void applyResolution() {
-    if (_hasResolutionApplied) {
-      return;
-    }
-    _hasResolutionApplied = true;
-
-    unitContext.pushTypeParameterStack();
-
-    var visitor = ApplyResolutionVisitor(unitContext, data.resolution);
-    node.accept(visitor);
-
-    unitContext.popTypeParameterStack();
-  }
+  LazyFunctionDeclaration(this.data);
 
   static LazyFunctionDeclaration get(FunctionDeclaration node) {
     return node.getProperty(_key);
@@ -935,6 +1087,22 @@
     return node.offset;
   }
 
+  static DartType getReturnType(
+    AstBinaryReader reader,
+    FunctionDeclaration node,
+  ) {
+    readFunctionExpression(reader, node);
+
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasReturnType) {
+      var type = reader.readType(lazy.data.actualReturnType);
+      LazyAst.setReturnType(node, type);
+      lazy._hasReturnType = true;
+    }
+
+    return LazyAst.getReturnType(node);
+  }
+
   static void readDocumentationComment(
     LinkedUnitContext context,
     FunctionDeclaration node,
@@ -946,12 +1114,48 @@
     }
   }
 
-  static void setData(
-    LinkedUnitContext unitContext,
-    LinkedNode data,
+  static void readFunctionExpression(
+    AstBinaryReader reader,
     FunctionDeclaration node,
   ) {
-    node.setProperty(_key, LazyFunctionDeclaration(unitContext, data, node));
+    if (node.functionExpression == null) {
+      var lazy = get(node);
+      node.functionExpression = reader.readNode(
+        lazy.data.functionDeclaration_functionExpression,
+      );
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    FunctionDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void readReturnTypeNode(
+    AstBinaryReader reader,
+    FunctionDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasReturnTypeNode) {
+      node.returnType = reader.readNode(
+        lazy.data.functionDeclaration_returnType,
+      );
+      lazy._hasReturnTypeNode = true;
+    }
+  }
+
+  static void setData(FunctionDeclaration node, LinkedNode data) {
+    node.setProperty(_key, LazyFunctionDeclaration(data));
   }
 }
 
@@ -961,6 +1165,7 @@
   final LinkedNode data;
 
   bool _hasBody = false;
+  bool _hasFormalParameters = false;
 
   LazyFunctionExpression(this.data);
 
@@ -999,6 +1204,19 @@
     }
   }
 
+  static void readFormalParameters(
+    AstBinaryReader reader,
+    FunctionExpression node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasFormalParameters) {
+      node.parameters = reader.readNode(
+        lazy.data.functionExpression_formalParameters,
+      );
+      lazy._hasFormalParameters = true;
+    }
+  }
+
   static void setData(FunctionExpression node, LinkedNode data) {
     node.setProperty(_key, LazyFunctionExpression(data));
   }
@@ -1008,25 +1226,15 @@
   static const _key = 'lazyAst';
   static const _hasSelfReferenceKey = 'lazyAst_hasSelfReferenceKey';
 
-  final LinkedUnitContext unitContext;
   final LinkedNode data;
-  final FunctionTypeAlias node;
 
   bool _hasDocumentationComment = false;
-  bool _hasResolutionApplied = false;
+  bool _hasFormalParameters = false;
+  bool _hasMetadata = false;
+  bool _hasReturnType = false;
+  bool _hasReturnTypeNode = false;
 
-  LazyFunctionTypeAlias(this.unitContext, this.data, this.node);
-
-  void applyResolution() {
-    if (_hasResolutionApplied) {
-      return;
-    }
-
-    var visitor = ApplyResolutionVisitor(unitContext, data.resolution);
-    node.accept(visitor);
-
-    _hasResolutionApplied = true;
-  }
+  LazyFunctionTypeAlias(this.data);
 
   static LazyFunctionTypeAlias get(FunctionTypeAlias node) {
     return node.getProperty(_key);
@@ -1058,6 +1266,19 @@
     return node.getProperty(_hasSelfReferenceKey);
   }
 
+  static DartType getReturnType(
+    AstBinaryReader reader,
+    FunctionTypeAlias node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasReturnType) {
+      var type = reader.readType(lazy.data.actualReturnType);
+      LazyAst.setReturnType(node, type);
+      lazy._hasReturnType = true;
+    }
+    return LazyAst.getReturnType(node);
+  }
+
   static void readDocumentationComment(
     LinkedUnitContext context,
     FunctionTypeAlias node,
@@ -1069,12 +1290,49 @@
     }
   }
 
-  static void setData(
-    LinkedUnitContext unitContext,
-    LinkedNode data,
+  static void readFormalParameters(
+    AstBinaryReader reader,
     FunctionTypeAlias node,
   ) {
-    node.setProperty(_key, LazyFunctionTypeAlias(unitContext, data, node));
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasFormalParameters) {
+      node.parameters = reader.readNode(
+        lazy.data.functionTypeAlias_formalParameters,
+      );
+      lazy._hasFormalParameters = true;
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    FunctionTypeAlias node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void readReturnTypeNode(
+    AstBinaryReader reader,
+    FunctionTypeAlias node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasReturnTypeNode) {
+      node.returnType = reader.readNode(
+        lazy.data.functionTypeAlias_returnType,
+      );
+      lazy._hasReturnTypeNode = true;
+    }
+  }
+
+  static void setData(FunctionTypeAlias node, LinkedNode data) {
+    node.setProperty(_key, LazyFunctionTypeAlias(data));
     LazyAst.setSimplyBounded(node, data.simplyBoundable_isSimplyBounded);
   }
 
@@ -1087,25 +1345,13 @@
   static const _key = 'lazyAst';
   static const _hasSelfReferenceKey = 'lazyAst_hasSelfReferenceKey';
 
-  final LinkedUnitContext unitContext;
   final LinkedNode data;
-  final GenericTypeAlias node;
 
   bool _hasDocumentationComment = false;
-  bool _hasResolutionApplied = false;
+  bool _hasFunction = false;
+  bool _hasMetadata = false;
 
-  LazyGenericTypeAlias(this.unitContext, this.data, this.node);
-
-  void applyResolution() {
-    if (_hasResolutionApplied) {
-      return;
-    }
-
-    var visitor = ApplyResolutionVisitor(unitContext, data.resolution);
-    node.accept(visitor);
-
-    _hasResolutionApplied = true;
-  }
+  LazyGenericTypeAlias(this.data);
 
   static LazyGenericTypeAlias get(GenericTypeAlias node) {
     return node.getProperty(_key);
@@ -1148,12 +1394,36 @@
     }
   }
 
-  static void setData(
-    LinkedUnitContext unitContext,
-    LinkedNode data,
+  static void readFunctionType(
+    AstBinaryReader reader,
     GenericTypeAlias node,
   ) {
-    node.setProperty(_key, LazyGenericTypeAlias(unitContext, data, node));
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasFunction) {
+      node.functionType = reader.readNode(
+        lazy.data.genericTypeAlias_functionType,
+      );
+      lazy._hasFunction = true;
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    GenericTypeAlias node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void setData(GenericTypeAlias node, LinkedNode data) {
+    node.setProperty(_key, LazyGenericTypeAlias(data));
     LazyAst.setSimplyBounded(node, data.simplyBoundable_isSimplyBounded);
   }
 
@@ -1165,30 +1435,17 @@
 class LazyMethodDeclaration {
   static const _key = 'lazyAst';
 
-  final LinkedUnitContext unitContext;
   final LinkedNode data;
-  final MethodDeclaration node;
 
+  bool _hasBody = false;
   bool _hasDocumentationComment = false;
+  bool _hasFormalParameters = false;
+  bool _hasMetadata = false;
+  bool _hasReturnType = false;
+  bool _hasReturnTypeNode = false;
   bool _hasTypeInferenceError = false;
-  bool _hasResolutionApplied = false;
 
-  LazyMethodDeclaration(this.unitContext, this.data, this.node);
-
-  void applyResolution() {
-    if (_hasResolutionApplied) {
-      return;
-    }
-    _hasResolutionApplied = true;
-
-    unitContext.pushTypeParameterStack();
-
-    var visitor = ApplyResolutionVisitor(unitContext, data.resolution);
-    visitor.addParentTypeParameters(node);
-    node.accept(visitor);
-
-    unitContext.popTypeParameterStack();
-  }
+  LazyMethodDeclaration(this.data);
 
   static LazyMethodDeclaration get(MethodDeclaration node) {
     return node.getProperty(_key);
@@ -1216,6 +1473,19 @@
     return node.offset;
   }
 
+  static DartType getReturnType(
+    AstBinaryReader reader,
+    MethodDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasReturnType) {
+      var type = reader.readType(lazy.data.actualReturnType);
+      LazyAst.setReturnType(node, type);
+      lazy._hasReturnType = true;
+    }
+    return LazyAst.getReturnType(node);
+  }
+
   static TopLevelInferenceError getTypeInferenceError(MethodDeclaration node) {
     var lazy = get(node);
     if (lazy != null && !lazy._hasTypeInferenceError) {
@@ -1253,6 +1523,19 @@
     }
   }
 
+  static void readBody(
+    AstBinaryReader reader,
+    MethodDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasBody) {
+      node.body = reader.readNode(
+        lazy.data.methodDeclaration_body,
+      );
+      lazy._hasBody = true;
+    }
+  }
+
   static void readDocumentationComment(
     LinkedUnitContext context,
     MethodDeclaration node,
@@ -1264,49 +1547,72 @@
     }
   }
 
-  static void setData(
-    LinkedUnitContext unitContext,
-    LinkedNode data,
+  static void readFormalParameters(
+    AstBinaryReader reader,
     MethodDeclaration node,
   ) {
-    node.setProperty(_key, LazyMethodDeclaration(unitContext, data, node));
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasFormalParameters) {
+      node.parameters = reader.readNode(
+        lazy.data.methodDeclaration_formalParameters,
+      );
+      lazy._hasFormalParameters = true;
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    MethodDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void readReturnTypeNode(
+    AstBinaryReader reader,
+    MethodDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasReturnTypeNode) {
+      node.returnType = reader.readNode(
+        lazy.data.methodDeclaration_returnType,
+      );
+      lazy._hasReturnTypeNode = true;
+    }
+  }
+
+  static void setData(MethodDeclaration node, LinkedNode data) {
+    node.setProperty(_key, LazyMethodDeclaration(data));
   }
 }
 
 class LazyMixinDeclaration {
   static const _key = 'lazyAst';
 
-  final LinkedUnitContext unitContext;
   final LinkedNode data;
-  final MixinDeclaration node;
 
   bool _hasDocumentationComment = false;
+  bool _hasOnClause = false;
+  bool _hasImplementsClause = false;
   bool _hasMembers = false;
-  bool _hasResolutionApplied = false;
+  bool _hasMetadata = false;
 
   List<String> _superInvokedNames;
 
-  LazyMixinDeclaration(this.unitContext, this.data, this.node) {
+  LazyMixinDeclaration(MixinDeclaration node, this.data) {
     node.setProperty(_key, this);
     if (data != null) {
       LazyAst.setSimplyBounded(node, data.simplyBoundable_isSimplyBounded);
     }
   }
 
-  void applyResolution() {
-    if (_hasResolutionApplied) {
-      return;
-    }
-    _hasResolutionApplied = true;
-
-    unitContext.pushTypeParameterStack();
-
-    var visitor = ApplyResolutionVisitor(unitContext, data.resolution);
-    node.accept(visitor);
-
-    unitContext.popTypeParameterStack();
-  }
-
   List<String> getSuperInvokedNames() {
     return _superInvokedNames ??= data.mixinDeclaration_superInvokedNames;
   }
@@ -1322,7 +1628,7 @@
   static LazyMixinDeclaration get(MixinDeclaration node) {
     LazyMixinDeclaration lazy = node.getProperty(_key);
     if (lazy == null) {
-      return LazyMixinDeclaration(null, null, node);
+      return LazyMixinDeclaration(node, null);
     }
     return lazy;
   }
@@ -1360,6 +1666,19 @@
     }
   }
 
+  static void readImplementsClause(
+    AstBinaryReader reader,
+    MixinDeclarationImpl node,
+  ) {
+    var lazy = get(node);
+    if (lazy.data != null && !lazy._hasImplementsClause) {
+      node.implementsClause = reader.readNode(
+        lazy.data.classOrMixinDeclaration_implementsClause,
+      );
+      lazy._hasImplementsClause = true;
+    }
+  }
+
   static void readMembers(
     AstBinaryReader reader,
     MixinDeclaration node,
@@ -1374,33 +1693,45 @@
       lazy._hasMembers = true;
     }
   }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    MixinDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy.data != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void readOnClause(
+    AstBinaryReader reader,
+    MixinDeclarationImpl node,
+  ) {
+    var lazy = get(node);
+    if (lazy.data != null && !lazy._hasOnClause) {
+      node.onClause = reader.readNode(
+        lazy.data.mixinDeclaration_onClause,
+      );
+      lazy._hasOnClause = true;
+    }
+  }
 }
 
 class LazyTopLevelVariableDeclaration {
   static const _key = 'lazyAst';
 
-  final LinkedUnitContext unitContext;
   final LinkedNode data;
-  final TopLevelVariableDeclaration node;
 
   bool _hasDocumentationComment = false;
-  bool _hasResolutionApplied = false;
+  bool _hasMetadata = false;
 
-  LazyTopLevelVariableDeclaration(this.unitContext, this.data, this.node);
-
-  void applyResolution() {
-    if (_hasResolutionApplied) {
-      return;
-    }
-    _hasResolutionApplied = true;
-
-    unitContext.pushTypeParameterStack();
-
-    var visitor = ApplyResolutionVisitor(unitContext, data.resolution);
-    node.accept(visitor);
-
-    unitContext.popTypeParameterStack();
-  }
+  LazyTopLevelVariableDeclaration(this.data);
 
   static LazyTopLevelVariableDeclaration get(TopLevelVariableDeclaration node) {
     return node.getProperty(_key);
@@ -1417,24 +1748,35 @@
     }
   }
 
-  static void setData(
-    LinkedUnitContext unitContext,
-    LinkedNode data,
+  static void readMetadata(
+    AstBinaryReader reader,
     TopLevelVariableDeclaration node,
   ) {
-    node.setProperty(
-      _key,
-      LazyTopLevelVariableDeclaration(unitContext, data, node),
-    );
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void setData(TopLevelVariableDeclaration node, LinkedNode data) {
+    node.setProperty(_key, LazyTopLevelVariableDeclaration(data));
   }
 }
 
-/// TODO(scheglov) remove completely?
 class LazyTypeParameter {
   static const _key = 'lazyAst';
 
   final LinkedNode data;
 
+  bool _hasBound = false;
+  bool _hasDefaultType = false;
+  bool _hasMetadata = false;
+
   LazyTypeParameter(this.data);
 
   static LazyTypeParameter get(TypeParameter node) {
@@ -1463,17 +1805,52 @@
     return node.offset;
   }
 
+  static DartType getDefaultType(AstBinaryReader reader, TypeParameter node) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasDefaultType) {
+      lazy._hasDefaultType = true;
+      var type = reader.readType(lazy.data.typeParameter_defaultType);
+      LazyAst.setDefaultType(node, type);
+      return type;
+    }
+    return LazyAst.getDefaultType(node);
+  }
+
+  static void readBound(AstBinaryReader reader, TypeParameter node) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasBound) {
+      node.bound = reader.readNode(lazy.data.typeParameter_bound);
+      lazy._hasBound = true;
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    TypeParameter node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
   static void setData(TypeParameter node, LinkedNode data) {
     node.setProperty(_key, LazyTypeParameter(data));
   }
 }
 
-/// TODO(scheglov) remove completely?
 class LazyVariableDeclaration {
   static const _key = 'lazyAst';
 
   final LinkedNode data;
 
+  bool _hasInitializer = false;
+  bool _hasType = false;
   bool _hasTypeInferenceError = false;
 
   LazyVariableDeclaration(this.data);
@@ -1514,6 +1891,19 @@
     }
   }
 
+  static DartType getType(
+    AstBinaryReader reader,
+    VariableDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasType) {
+      var type = reader.readType(lazy.data.actualType);
+      LazyAst.setType(node, type);
+      lazy._hasType = true;
+    }
+    return LazyAst.getType(node);
+  }
+
   static TopLevelInferenceError getTypeInferenceError(
       VariableDeclaration node) {
     var lazy = get(node);
@@ -1534,6 +1924,19 @@
     }
   }
 
+  static void readInitializer(
+    AstBinaryReader reader,
+    VariableDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasInitializer) {
+      node.initializer = reader.readNode(
+        lazy.data.variableDeclaration_initializer,
+      );
+      lazy._hasInitializer = true;
+    }
+  }
+
   static void setData(VariableDeclaration node, LinkedNode data) {
     node.setProperty(_key, LazyVariableDeclaration(data));
   }
diff --git a/pkg/analyzer/lib/src/summary2/linked_bundle_context.dart b/pkg/analyzer/lib/src/summary2/linked_bundle_context.dart
index 8b8269b..7047fb0 100644
--- a/pkg/analyzer/lib/src/summary2/linked_bundle_context.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_bundle_context.dart
@@ -93,7 +93,7 @@
   }
 
   T elementOfIndex<T extends Element>(int index) {
-    var reference = referenceOfIndex(index >> 1);
+    var reference = referenceOfIndex(index);
     return elementFactory.elementOfReference(reference);
   }
 
diff --git a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
index 8666757..ff54b07 100644
--- a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
@@ -41,8 +41,13 @@
   CompilationUnit _unit;
   bool _hasDirectivesRead = false;
 
-  final List<List<TypeParameterElement>> _typeParameterStack = [];
-  List<TypeParameterElement> typeParameterStack = [];
+  /// Mapping from identifiers to synthetic type parameters.
+  ///
+  /// Synthetic type parameters are added when [readType] begins reading a
+  /// [FunctionType], and removed when reading is done.
+  final Map<int, TypeParameterElementImpl> _typeParameters = {};
+
+  int _nextSyntheticTypeParameterId = 0x10000;
 
   LinkedUnitContext(
       this.bundleContext,
@@ -112,6 +117,17 @@
     return astFactory.documentationComment(tokens);
   }
 
+  void createGenericFunctionTypeElement(int id, GenericFunctionTypeImpl node) {
+    var containerRef = this.reference.getChild('@genericFunctionType');
+    var reference = containerRef.getChild('$id');
+    var element = GenericFunctionTypeElementImpl.forLinkedNode(
+      this.reference.element,
+      reference,
+      node,
+    );
+    node.declaredElement = element;
+  }
+
   /// Return the [LibraryElement] referenced in the [node].
   LibraryElement directiveLibrary(UriBasedDirective node) {
     var uriStr = LazyDirective.getSelectedUri(node);
@@ -119,13 +135,6 @@
     return bundleContext.elementFactory.libraryOfUri(uriStr);
   }
 
-  T elementOfIndex<T extends Element>(int index) {
-    if ((index & 0x1) == 0x1) {
-      return typeParameterStack[index >> 1] as T;
-    }
-    return bundleContext.elementOfIndex(index);
-  }
-
   int getCodeLength(AstNode node) {
     if (node is ClassDeclaration) {
       return LazyClassDeclaration.getCodeLength(this, node);
@@ -204,6 +213,18 @@
     return LazyCombinator.getEnd(this, node);
   }
 
+  List<ConstructorInitializer> getConstructorInitializers(
+    ConstructorDeclaration node,
+  ) {
+    LazyConstructorDeclaration.readInitializers(_astReader, node);
+    return node.initializers;
+  }
+
+  ConstructorName getConstructorRedirected(ConstructorDeclaration node) {
+    LazyConstructorDeclaration.readRedirectedConstructor(_astReader, node);
+    return node.redirectedConstructor;
+  }
+
   Iterable<ConstructorDeclaration> getConstructors(AstNode node) sync* {
     if (node is ClassOrMixinDeclaration) {
       var members = _getClassOrExtensionOrMixinMembers(node);
@@ -216,7 +237,7 @@
   }
 
   DartType getDefaultType(TypeParameter node) {
-    var type = LazyAst.getDefaultType(node);
+    var type = LazyTypeParameter.getDefaultType(_astReader, node);
     if (type is TypeBuilder) {
       type = (type as TypeBuilder).build();
       LazyAst.setDefaultType(node, type);
@@ -293,6 +314,16 @@
     }
   }
 
+  List<EnumConstantDeclaration> getEnumConstants(EnumDeclaration node) {
+    LazyEnumDeclaration.readConstants(_astReader, node);
+    return node.constants;
+  }
+
+  TypeAnnotation getExtendedType(ExtensionDeclaration node) {
+    LazyExtensionDeclaration.readExtendedType(_astReader, node);
+    return node.extendedType;
+  }
+
   String getExtensionRefName(ExtensionDeclaration node) {
     return LazyExtensionDeclaration.get(node).refName;
   }
@@ -320,32 +351,50 @@
 
   List<FormalParameter> getFormalParameters(AstNode node) {
     if (node is ConstructorDeclaration) {
+      LazyConstructorDeclaration.readFormalParameters(_astReader, node);
       return node.parameters.parameters;
     } else if (node is FunctionDeclaration) {
+      LazyFunctionDeclaration.readFunctionExpression(_astReader, node);
       return getFormalParameters(node.functionExpression);
     } else if (node is FunctionExpression) {
+      LazyFunctionExpression.readFormalParameters(_astReader, node);
       return node.parameters?.parameters;
     } else if (node is FormalParameter) {
       if (node is DefaultFormalParameter) {
         return getFormalParameters(node.parameter);
       } else if (node is FieldFormalParameter) {
+        LazyFormalParameter.readFormalParameters(_astReader, node);
         return node.parameters?.parameters;
       } else if (node is FunctionTypedFormalParameter) {
+        LazyFormalParameter.readFormalParameters(_astReader, node);
         return node.parameters.parameters;
       } else {
         return null;
       }
     } else if (node is FunctionTypeAlias) {
+      LazyFunctionTypeAlias.readFormalParameters(_astReader, node);
       return node.parameters.parameters;
     } else if (node is GenericFunctionType) {
       return node.parameters.parameters;
     } else if (node is MethodDeclaration) {
+      LazyMethodDeclaration.readFormalParameters(_astReader, node);
       return node.parameters?.parameters;
     } else {
       throw UnimplementedError('${node.runtimeType}');
     }
   }
 
+  Reference getGenericFunctionTypeReference(GenericFunctionType node) {
+    var containerRef = reference.getChild('@genericFunctionType');
+    var id = LazyAst.getGenericFunctionTypeId(node);
+    return containerRef.getChild('$id');
+  }
+
+  GenericFunctionType getGeneticTypeAliasFunction(GenericTypeAlias node) {
+    LazyGenericTypeAlias.readFunctionType(_astReader, node);
+    return node.functionType;
+  }
+
   bool getHasTypedefSelfReference(AstNode node) {
     if (node is FunctionTypeAlias) {
       return LazyFunctionTypeAlias.getHasSelfReference(node);
@@ -357,10 +406,13 @@
 
   ImplementsClause getImplementsClause(AstNode node) {
     if (node is ClassDeclaration) {
+      LazyClassDeclaration.readImplementsClause(_astReader, node);
       return node.implementsClause;
     } else if (node is ClassTypeAlias) {
+      LazyClassTypeAlias.readImplementsClause(_astReader, node);
       return node.implementsClause;
     } else if (node is MixinDeclaration) {
+      LazyMixinDeclaration.readImplementsClause(_astReader, node);
       return node.implementsClause;
     } else {
       throw UnimplementedError('${node.runtimeType}');
@@ -404,7 +456,6 @@
   List<Annotation> getLibraryMetadata(CompilationUnit unit) {
     for (var directive in unit.directives) {
       if (directive is LibraryDirective) {
-        LazyAst.applyResolution(directive);
         return getMetadata(directive);
       }
     }
@@ -413,8 +464,10 @@
 
   List<Annotation> getMetadata(AstNode node) {
     if (node is ClassDeclaration) {
+      LazyClassDeclaration.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is ClassTypeAlias) {
+      LazyClassTypeAlias.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is CompilationUnit) {
       assert(node == _unit);
@@ -424,36 +477,50 @@
         return const <Annotation>[];
       }
     } else if (node is ConstructorDeclaration) {
+      LazyConstructorDeclaration.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is DefaultFormalParameter) {
       return getMetadata(node.parameter);
     } else if (node is Directive) {
+      LazyDirective.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is EnumConstantDeclaration) {
+      LazyEnumConstantDeclaration.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is EnumDeclaration) {
+      LazyEnumDeclaration.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is ExtensionDeclaration) {
+      LazyExtensionDeclaration.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is FormalParameter) {
+      LazyFormalParameter.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is FunctionDeclaration) {
+      LazyFunctionDeclaration.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is FunctionTypeAlias) {
+      LazyFunctionTypeAlias.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is GenericTypeAlias) {
+      LazyGenericTypeAlias.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is MethodDeclaration) {
+      LazyMethodDeclaration.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is MixinDeclaration) {
+      LazyMixinDeclaration.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is TypeParameter) {
+      LazyTypeParameter.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is VariableDeclaration) {
       var parent2 = node.parent.parent;
       if (parent2 is FieldDeclaration) {
+        LazyFieldDeclaration.readMetadata(_astReader, parent2);
         return parent2.metadata;
       } else if (parent2 is TopLevelVariableDeclaration) {
+        LazyTopLevelVariableDeclaration.readMetadata(_astReader, parent2);
         return parent2.metadata;
       }
     }
@@ -498,16 +565,21 @@
     throw UnimplementedError('${node.runtimeType}');
   }
 
+  OnClause getOnClause(MixinDeclaration node) {
+    LazyMixinDeclaration.readOnClause(_astReader, node);
+    return node.onClause;
+  }
+
   /// Return the actual return type for the [node] - explicit or inferred.
   DartType getReturnType(AstNode node) {
     if (node is FunctionDeclaration) {
-      return LazyAst.getReturnType(node);
+      return LazyFunctionDeclaration.getReturnType(_astReader, node);
     } else if (node is FunctionTypeAlias) {
-      return LazyAst.getReturnType(node);
+      return LazyFunctionTypeAlias.getReturnType(_astReader, node);
     } else if (node is GenericFunctionType) {
       return node.returnType?.type ?? DynamicTypeImpl.instance;
     } else if (node is MethodDeclaration) {
-      return LazyAst.getReturnType(node);
+      return LazyMethodDeclaration.getReturnType(_astReader, node);
     } else {
       throw UnimplementedError('${node.runtimeType}');
     }
@@ -515,12 +587,15 @@
 
   TypeAnnotation getReturnTypeNode(AstNode node) {
     if (node is FunctionTypeAlias) {
+      LazyFunctionTypeAlias.readReturnTypeNode(_astReader, node);
       return node.returnType;
     } else if (node is GenericFunctionType) {
       return node.returnType;
     } else if (node is FunctionDeclaration) {
+      LazyFunctionDeclaration.readReturnTypeNode(_astReader, node);
       return node.returnType;
     } else if (node is MethodDeclaration) {
+      LazyMethodDeclaration.readReturnTypeNode(_astReader, node);
       return node.returnType;
     } else {
       throw UnimplementedError('${node.runtimeType}');
@@ -533,8 +608,10 @@
 
   TypeName getSuperclass(AstNode node) {
     if (node is ClassDeclaration) {
+      LazyClassDeclaration.readExtendsClause(_astReader, node);
       return node.extendsClause?.superclass;
     } else if (node is ClassTypeAlias) {
+      LazyClassTypeAlias.readSuperclass(_astReader, node);
       return node.superclass;
     } else {
       throw StateError('${node.runtimeType}');
@@ -546,9 +623,9 @@
     if (node is DefaultFormalParameter) {
       return getType(node.parameter);
     } else if (node is FormalParameter) {
-      return LazyAst.getType(node);
+      return LazyFormalParameter.getType(_astReader, node);
     } else if (node is VariableDeclaration) {
-      return LazyAst.getType(node);
+      return LazyVariableDeclaration.getType(_astReader, node);
     } else {
       throw UnimplementedError('${node.runtimeType}');
     }
@@ -564,7 +641,12 @@
     }
   }
 
-  TypeParameterList getTypeParameters(AstNode node) {
+  TypeAnnotation getTypeParameterBound(TypeParameter node) {
+    LazyTypeParameter.readBound(_astReader, node);
+    return node.bound;
+  }
+
+  TypeParameterList getTypeParameters2(AstNode node) {
     if (node is ClassDeclaration) {
       return node.typeParameters;
     } else if (node is ClassTypeAlias) {
@@ -572,13 +654,14 @@
     } else if (node is ConstructorDeclaration) {
       return null;
     } else if (node is DefaultFormalParameter) {
-      return getTypeParameters(node.parameter);
+      return getTypeParameters2(node.parameter);
     } else if (node is ExtensionDeclaration) {
       return node.typeParameters;
     } else if (node is FieldFormalParameter) {
       return node.typeParameters;
     } else if (node is FunctionDeclaration) {
-      return getTypeParameters(node.functionExpression);
+      LazyFunctionDeclaration.readFunctionExpression(_astReader, node);
+      return getTypeParameters2(node.functionExpression);
     } else if (node is FunctionExpression) {
       return node.typeParameters;
     } else if (node is FunctionTypedFormalParameter) {
@@ -606,8 +689,10 @@
 
   WithClause getWithClause(AstNode node) {
     if (node is ClassDeclaration) {
+      LazyClassDeclaration.readWithClause(_astReader, node);
       return node.withClause;
     } else if (node is ClassTypeAlias) {
+      LazyClassTypeAlias.readWithClause(_astReader, node);
       return node.withClause;
     } else {
       throw UnimplementedError('${node.runtimeType}');
@@ -623,9 +708,11 @@
 
   bool hasImplicitReturnType(AstNode node) {
     if (node is FunctionDeclaration) {
+      LazyFunctionDeclaration.readReturnTypeNode(_astReader, node);
       return node.returnType == null;
     }
     if (node is MethodDeclaration) {
+      LazyMethodDeclaration.readReturnTypeNode(_astReader, node);
       return node.returnType == null;
     }
     return false;
@@ -692,6 +779,7 @@
     if (node is ConstructorDeclaration) {
       return false;
     } else if (node is FunctionDeclaration) {
+      LazyFunctionDeclaration.readFunctionExpression(_astReader, node);
       return isAsynchronous(node.functionExpression);
     } else if (node is FunctionExpression) {
       return LazyFunctionExpression.isAsynchronous(node);
@@ -771,6 +859,7 @@
     if (node is ConstructorDeclaration) {
       return false;
     } else if (node is FunctionDeclaration) {
+      LazyFunctionDeclaration.readFunctionExpression(_astReader, node);
       return isGenerator(node.functionExpression);
     } else if (node is FunctionExpression) {
       return LazyFunctionExpression.isGenerator(node);
@@ -835,25 +924,12 @@
     throw UnimplementedError('${node.runtimeType}');
   }
 
-  /// Restore the stack previously saved by [pushTypeParameterStack].
-  void popTypeParameterStack() {
-    typeParameterStack = _typeParameterStack.removeLast();
-  }
-
-  /// We are about to start applying resolution to a declaration. But this
-  /// might be a recursive process, and so we might still be applying
-  /// resolution to some other declaration. These have their own indexes for
-  /// type parameters, so we want to push the current stack, and start with
-  /// a new one. Later we will restore it with [popTypeParameterStack].
-  void pushTypeParameterStack() {
-    _typeParameterStack.add(typeParameterStack);
-    typeParameterStack = [];
-  }
-
   Expression readInitializer(AstNode node) {
     if (node is DefaultFormalParameter) {
+      LazyFormalParameter.readDefaultValue(_astReader, node);
       return node.defaultValue;
     } else if (node is VariableDeclaration) {
+      LazyVariableDeclaration.readInitializer(_astReader, node);
       return node.initializer;
     } else {
       throw StateError('${node.runtimeType}');
@@ -864,9 +940,7 @@
     if (linkedType == null) return null;
 
     var kind = linkedType.kind;
-    if (kind == LinkedNodeTypeKind.null_) {
-      return null;
-    } else if (kind == LinkedNodeTypeKind.dynamic_) {
+    if (kind == LinkedNodeTypeKind.dynamic_) {
       return DynamicTypeImpl.instance;
     } else if (kind == LinkedNodeTypeKind.function) {
       var typeParameterDataList = linkedType.functionTypeParameters;
@@ -877,11 +951,9 @@
         var typeParameterData = typeParameterDataList[i];
         var element = TypeParameterElementImpl(typeParameterData.name, -1);
         typeParameters[i] = element;
+        _typeParameters[_nextSyntheticTypeParameterId++] = element;
       }
 
-      var typeParameterStackHeight = typeParameterStack.length;
-      typeParameterStack.addAll(typeParameters);
-
       // Type parameters might use each other in bounds, including forward
       // references. So, we read bounds after reading all type parameters.
       for (var i = 0; i < typeParametersLength; ++i) {
@@ -897,7 +969,9 @@
         return ParameterElementImpl.synthetic(p.name, type, kind);
       }).toList();
 
-      typeParameterStack.length = typeParameterStackHeight;
+      for (var i = 0; i < typeParametersLength; ++i) {
+        _typeParameters.remove(--_nextSyntheticTypeParameterId);
+      }
 
       FunctionTypeAliasElement typedefElement;
       List<DartType> typedefTypeArguments = const <DartType>[];
@@ -930,7 +1004,15 @@
       var nullabilitySuffix = _nullabilitySuffix(linkedType.nullabilitySuffix);
       return NeverTypeImpl.instance.withNullability(nullabilitySuffix);
     } else if (kind == LinkedNodeTypeKind.typeParameter) {
-      var element = elementOfIndex(linkedType.typeParameterId);
+      TypeParameterElement element;
+      var id = linkedType.typeParameterId;
+      if (id != 0) {
+        element = _typeParameters[id];
+        assert(element != null);
+      } else {
+        var index = linkedType.typeParameterElement;
+        element = bundleContext.elementOfIndex(index);
+      }
       var nullabilitySuffix = _nullabilitySuffix(linkedType.nullabilitySuffix);
       return TypeParameterTypeImpl(
         element: element,
@@ -1061,7 +1143,7 @@
       if (directive is PartDirective) {
         partDirectiveIndex++;
         if (partDirectiveIndex == indexInLibrary) {
-          LazyAst.applyResolution(directive);
+          LazyDirective.readMetadata(definingContext._astReader, directive);
           return directive.metadata;
         }
       }
diff --git a/pkg/analyzer/lib/src/summary2/linking_bundle_context.dart b/pkg/analyzer/lib/src/summary2/linking_bundle_context.dart
index 8c3b810..81cf9c2b 100644
--- a/pkg/analyzer/lib/src/summary2/linking_bundle_context.dart
+++ b/pkg/analyzer/lib/src/summary2/linking_bundle_context.dart
@@ -29,7 +29,8 @@
     name: [''],
   );
 
-  final _TypeParameterIndexer typeParameterIndexer = _TypeParameterIndexer();
+  final Map<TypeParameterElement, int> _typeParameters = Map.identity();
+  int _nextSyntheticTypeParameterId = 0x10000;
 
   LinkingBundleContext(this.dynamicReference);
 
@@ -43,21 +44,21 @@
     }
   }
 
+  int idOfTypeParameter(TypeParameterElement element) {
+    return _typeParameters[element];
+  }
+
   int indexOfElement(Element element) {
     if (element == null) return 0;
     if (element is MultiplyDefinedElement) return 0;
     assert(element is! Member);
 
-    if (element is TypeParameterElement) {
-      return typeParameterIndexer[element] << 1 | 0x1;
-    }
-
     if (identical(element, DynamicElementImpl.instance)) {
-      return indexOfReference(dynamicReference) << 1;
+      return indexOfReference(dynamicReference);
     }
 
     var reference = (element as ElementImpl).reference;
-    return indexOfReference(reference) << 1;
+    return indexOfReference(reference);
   }
 
   int indexOfReference(Reference reference) {
@@ -75,11 +76,9 @@
   }
 
   LinkedNodeTypeBuilder writeType(DartType type) {
-    if (type == null) {
-      return LinkedNodeTypeBuilder(
-        kind: LinkedNodeTypeKind.null_,
-      );
-    } else if (type.isDynamic) {
+    if (type == null) return null;
+
+    if (type.isDynamic) {
       return LinkedNodeTypeBuilder(
         kind: LinkedNodeTypeKind.dynamic_,
       );
@@ -98,11 +97,22 @@
         nullabilitySuffix: _nullabilitySuffix(type),
       );
     } else if (type is TypeParameterType) {
-      return LinkedNodeTypeBuilder(
-        kind: LinkedNodeTypeKind.typeParameter,
-        nullabilitySuffix: _nullabilitySuffix(type),
-        typeParameterId: indexOfElement(type.element),
-      );
+      TypeParameterElementImpl element = type.element;
+      var id = _typeParameters[element];
+      if (id != null) {
+        return LinkedNodeTypeBuilder(
+          kind: LinkedNodeTypeKind.typeParameter,
+          nullabilitySuffix: _nullabilitySuffix(type),
+          typeParameterId: id,
+        );
+      } else {
+        var index = indexOfElement(element);
+        return LinkedNodeTypeBuilder(
+          kind: LinkedNodeTypeKind.typeParameter,
+          nullabilitySuffix: _nullabilitySuffix(type),
+          typeParameterElement: index,
+        );
+      }
     } else if (type is VoidType) {
       return LinkedNodeTypeBuilder(
         kind: LinkedNodeTypeKind.void_,
@@ -146,16 +156,17 @@
     var typeParameterBuilders = <LinkedNodeTypeTypeParameterBuilder>[];
 
     var typeParameters = type.typeFormals;
-    typeParameterIndexer.enter(typeParameters);
+    for (var i = 0; i < typeParameters.length; ++i) {
+      var typeParameter = typeParameters[i];
+      _typeParameters[typeParameter] = _nextSyntheticTypeParameterId++;
+      typeParameterBuilders.add(
+        LinkedNodeTypeTypeParameterBuilder(name: typeParameter.name),
+      );
+    }
 
     for (var i = 0; i < typeParameters.length; ++i) {
       var typeParameter = typeParameters[i];
-      typeParameterBuilders.add(
-        LinkedNodeTypeTypeParameterBuilder(
-          name: typeParameter.name,
-          bound: writeType(typeParameter.bound),
-        ),
-      );
+      typeParameterBuilders[i].bound = writeType(typeParameter.bound);
     }
 
     Element typedefElement;
@@ -188,7 +199,10 @@
       nullabilitySuffix: _nullabilitySuffix(type),
     );
 
-    typeParameterIndexer.exit(typeParameters);
+    for (var typeParameter in typeParameters) {
+      _typeParameters.remove(typeParameter);
+      --_nextSyntheticTypeParameterId;
+    }
 
     return result;
   }
@@ -207,27 +221,3 @@
     }
   }
 }
-
-class _TypeParameterIndexer {
-  final Map<TypeParameterElement, int> _index = Map.identity();
-  int _stackHeight = 0;
-
-  int operator [](TypeParameterElement parameter) {
-    return _index[parameter] ??
-        (throw ArgumentError('Type parameter $parameter is not indexed'));
-  }
-
-  void enter(List<TypeParameterElement> typeParameters) {
-    for (var i = 0; i < typeParameters.length; i++) {
-      var parameter = typeParameters[i];
-      _index[parameter] = _stackHeight++;
-    }
-  }
-
-  void exit(List<TypeParameterElement> typeParameters) {
-    _stackHeight -= typeParameters.length;
-    for (var i = 0; i < typeParameters.length; i++) {
-      _index.remove(typeParameters[i]);
-    }
-  }
-}
diff --git a/pkg/analyzer/test/generated/invalid_code_test.dart b/pkg/analyzer/test/generated/invalid_code_test.dart
index fefa0f8..a116216 100644
--- a/pkg/analyzer/test/generated/invalid_code_test.dart
+++ b/pkg/analyzer/test/generated/invalid_code_test.dart
@@ -196,10 +196,11 @@
 ''');
   }
 
+  @failingTest
   test_fuzz_12() async {
-    // This code used to crash because we were reading AST lazily, so we did
-    // not read metadata `@b` for `c`. But now we read AST of each declaration
-    // (`f` here) fully, and apply resolution. So, it works now.
+    // This code crashed with summary2 because usually AST reader is lazy,
+    // so we did not read metadata `@b` for `c`. But default values must be
+    // read fully.
     await _assertCanBeAnalyzed(r'''
 void f({a = [for (@b c = 0;;)]}) {}
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/const_initialized_with_non_constant_value_test.dart b/pkg/analyzer/test/src/diagnostics/const_initialized_with_non_constant_value_test.dart
index 6277909..8e28cd4 100644
--- a/pkg/analyzer/test/src/diagnostics/const_initialized_with_non_constant_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_initialized_with_non_constant_value_test.dart
@@ -16,20 +16,6 @@
 @reflectiveTest
 class ConstInitializedWithNonConstantValueTest
     extends PubPackageResolutionTest {
-  test_cascade() async {
-    await assertErrorsInCode(r'''
-class A {
-  const A();
-  void foo() {}
-}
-
-const a = const A()..foo();
-''', [
-      error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 52,
-          16),
-    ]);
-  }
-
   test_dynamic() async {
     await assertErrorsInCode(r'''
 f(p) {
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_modifier_on_setter_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_modifier_on_setter_test.dart
index f5fb7e2..58a00af 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_modifier_on_setter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_modifier_on_setter_test.dart
@@ -16,15 +16,12 @@
 @reflectiveTest
 class InvalidModifierOnSetterTest extends PubPackageResolutionTest {
   test_member_async() async {
-    // TODO(danrubel): Investigate why error message is duplicated when
-    // using fasta parser.
     await assertErrorsInCode(r'''
 class A {
   set x(v) async {}
 }
 ''', [
       error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 21, 5),
-      error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 21, 5),
     ]);
   }
 
@@ -35,7 +32,6 @@
 }
 ''', [
       error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 21, 5),
-      error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 21, 5),
     ]);
   }
 
@@ -46,7 +42,6 @@
 }
 ''', [
       error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 21, 4),
-      error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 21, 4),
     ]);
   }
 
@@ -55,7 +50,6 @@
 set x(v) async {}
 ''', [
       error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 9, 5),
-      error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 9, 5),
     ]);
   }
 
@@ -64,7 +58,6 @@
 set x(v) async* {}
 ''', [
       error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 9, 5),
-      error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 9, 5),
     ]);
   }
 
@@ -73,7 +66,6 @@
 set x(v) sync* {}
 ''', [
       error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 9, 4),
-      error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 9, 4),
     ]);
   }
 }
diff --git a/pkg/analyzer_cli/lib/src/build_mode.dart b/pkg/analyzer_cli/lib/src/build_mode.dart
index 636e11d..3098758 100644
--- a/pkg/analyzer_cli/lib/src/build_mode.dart
+++ b/pkg/analyzer_cli/lib/src/build_mode.dart
@@ -557,9 +557,7 @@
 
   Iterable<String> get dependencies => _dependencies;
 
-  void record(String path) {
-    _dependencies.add(path);
-  }
+  void record(String path) => _dependencies.add(path);
 }
 
 /// [PackageBundleProvider] that always reads from the [ResourceProvider].
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index 45d42ab..cae931f 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -253,19 +253,34 @@
 class B extends A {}
 ''');
 
-      // When we get resolved class `B`, we apply its full resolution.
-      // So, we ask for `A`, so dependency on "a".
+      // We don't invoke anything on class `B`, so don't ask its supertype.
+      // So, no dependency on "a".
       await _assertDependencies('c', [a, b], '''
 import 'package:b/b.dart';
 B x;
-''', [a, b]);
+''', [b]);
 
-      // When we get resolved class `B`, we apply its full resolution.
-      // So, we ask for `A`, so dependency on "a".
+      // We infer the type of `x` to `B`.
+      // But we don't ask `B` for its supertype.
+      // So, no dependency on "a".
       await _assertDependencies('c', [a, b], '''
 import 'package:b/b.dart';
 var x = B();
-''', [a, b]);
+''', [b]);
+
+      // We perform full analysis, and check that `new B()` is assignable
+      // to `B x`. This is trivially true, we don't need the supertype of `B`.
+      // So, no dependency on "a".
+      await _assertDependencies(
+        'c',
+        [a, b],
+        '''
+import 'package:b/b.dart';
+var x = B();
+''',
+        [b],
+        summaryOnly: false,
+      );
     });
   }
 
diff --git a/tools/VERSION b/tools/VERSION
index f71a9a1..dcbe123 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 11
 PATCH 0
-PRERELEASE 246
+PRERELEASE 247
 PRERELEASE_PATCH 0
\ No newline at end of file
