Version 2.11.0-247.0.dev

Merge commit 'a669f440a630feb951b6a641d21bf0879bb5dd23' into 'dev'
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