Version 2.11.0-230.0.dev

Merge commit 'e5f1b4bb2cf3fe136d8a8fc7313619cf93c07944' into 'dev'
diff --git a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
index e637557..0d6be78 100644
--- a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
@@ -297,6 +297,9 @@
     CompileTimeErrorCode.UNDEFINED_METHOD: [
       DataDriven.newInstance,
     ],
+    CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER: [
+      DataDriven.newInstance,
+    ],
     CompileTimeErrorCode.UNDEFINED_SETTER: [
       DataDriven.newInstance,
     ],
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart b/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart
index a12a858..d9d82b5 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart
@@ -101,7 +101,11 @@
       return const [ElementKind.extensionKind];
     } else if (node is InstanceCreationExpression) {
       return const [ElementKind.constructorKind];
+    } else if (node is Label) {
+      var argumentList = node.parent.parent;
+      return _kindsForNode(argumentList.parent, child: argumentList);
     } else if (node is MethodInvocation) {
+      assert(child != null);
       if (node.target == child) {
         return const [
           ElementKind.classKind,
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
index 3cd6143..a2c627e 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
@@ -226,6 +226,11 @@
     if (parent is InvocationExpression) {
       var argumentList = parent.argumentList;
       return _Data(argumentList);
+    } else if (parent is Label) {
+      var argumentList = parent.parent.parent;
+      if (argumentList is ArgumentList) {
+        return _Data(argumentList);
+      }
     }
     return null;
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index d04d443..f7ef511 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -591,6 +591,7 @@
     ],
     CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER: [
       ChangeArgumentName.newInstance,
+      DataDriven.newInstance,
     ],
     CompileTimeErrorCode.UNDEFINED_SETTER: [
       DataDriven.newInstance,
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart
index 290dd94..675f008 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart
@@ -642,6 +642,31 @@
 ''');
   }
 
+  Future<void>
+      test_remove_middle_optionalNamed_withArg_notRenamed_deprecated() async {
+    setPackageContent('''
+class C {
+  void m({int a, @deprecated int b, int c}) {}
+}
+''');
+    setPackageData(
+        _modify(['C', 'm'], [RemoveParameter(NamedParameterReference('b'))]));
+    await resolveTestUnit('''
+import '$importUri';
+
+void f(C c) {
+  c.m(a: 0, b: 1, c: 2);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(C c) {
+  c.m(a: 0, c: 2);
+}
+''');
+  }
+
   Future<void> test_remove_multiple_deprecated() async {
     setPackageContent('''
 class C {
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 9dbb2f8d..7320f05 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 = 112;
+  static const int DATA_VERSION = 114;
 
   /// 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 b88a11e..b20f3f8 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -42,6 +42,7 @@
 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';
@@ -500,6 +501,7 @@
 
     if (linkedNode != null) {
       if (linkedNode is ClassOrMixinDeclaration) {
+        LazyAst.applyResolution(linkedNode);
         _createPropertiesAndAccessors();
         assert(_accessors != null);
         return _accessors;
@@ -544,6 +546,7 @@
     }
 
     if (linkedNode != null) {
+      LazyAst.applyResolution(linkedNode);
       var context = enclosingUnit.linkedContext;
       var containerRef = reference.getChild('@constructor');
       _constructors = context.getConstructors(linkedNode).map((node) {
@@ -605,6 +608,7 @@
 
     if (linkedNode != null) {
       if (linkedNode is ClassOrMixinDeclaration) {
+        LazyAst.applyResolution(linkedNode);
         _createPropertiesAndAccessors();
         assert(_fields != null);
         return _fields;
@@ -705,6 +709,7 @@
     }
 
     if (linkedNode != null) {
+      LazyAst.applyResolution(linkedNode);
       var context = enclosingUnit.linkedContext;
       var implementsClause = context.getImplementsClause(linkedNode);
       if (implementsClause != null) {
@@ -780,6 +785,7 @@
     }
 
     if (linkedNode != null) {
+      LazyAst.applyResolution(linkedNode);
       var context = enclosingUnit.linkedContext;
       var containerRef = reference.getChild('@method');
       return _methods = context
@@ -816,6 +822,7 @@
     }
 
     if (linkedNode != null) {
+      LazyAst.applyResolution(linkedNode);
       var context = enclosingUnit.linkedContext;
       var withClause = context.getWithClause(linkedNode);
       if (withClause != null) {
@@ -865,7 +872,18 @@
     }
 
     if (linkedNode != null) {
-      var type = linkedContext.getSuperclass(linkedNode)?.type;
+      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}');
+      }
+
       if (_isInterfaceTypeClass(type)) {
         return _supertype = type;
       }
@@ -1964,9 +1982,9 @@
     if (_constantInitializers != null) return _constantInitializers;
 
     if (linkedNode != null) {
-      return _constantInitializers = linkedContext.getConstructorInitializers(
-        linkedNode,
-      );
+      var node = linkedNode as ConstructorDeclaration;
+      LazyAst.applyResolution(node);
+      return _constantInitializers = node.initializers;
     }
 
     return _constantInitializers;
@@ -2080,13 +2098,13 @@
     if (_redirectedConstructor != null) return _redirectedConstructor;
 
     if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
+      var node = linkedNode as ConstructorDeclaration;
+      LazyAst.applyResolution(node);
       if (isFactory) {
-        var node = context.getConstructorRedirected(linkedNode);
-        return _redirectedConstructor = node?.staticElement;
+        return _redirectedConstructor =
+            node.redirectedConstructor?.staticElement;
       } else {
-        var initializers = context.getConstructorInitializers(linkedNode);
-        for (var initializer in initializers) {
+        for (var initializer in node.initializers) {
           if (initializer is RedirectingConstructorInvocation) {
             return _redirectedConstructor = initializer.staticElement;
           }
@@ -2214,6 +2232,7 @@
     if (_constantInitializer != null) return _constantInitializer;
 
     if (linkedNode != null) {
+      LazyAst.applyResolution(linkedNode);
       var context = enclosingUnit.linkedContext;
       return _constantInitializer = context.readInitializer(linkedNode);
     }
@@ -2984,8 +3003,10 @@
 
   @override
   List<ElementAnnotation> get metadata {
+    if (_metadata != null) return _metadata;
+
     if (linkedNode != null) {
-      if (_metadata != null) return _metadata;
+      LazyAst.applyResolution(linkedNode);
       var metadata = linkedContext.getMetadata(linkedNode);
       return _metadata = _buildAnnotations2(enclosingUnit, metadata);
     }
@@ -3491,6 +3512,9 @@
   ConstructorElement getNamedConstructor(String name) => null;
 
   void _resynthesizeMembers2() {
+    var node = linkedNode as EnumDeclaration;
+    LazyAst.applyResolution(node);
+
     var fields = <FieldElementImpl>[];
     var getters = <PropertyAccessorElementImpl>[];
 
@@ -3518,7 +3542,7 @@
 
     // Build fields for all enum constants.
     var containerRef = reference.getChild('@constant');
-    var constants = linkedContext.getEnumConstants(linkedNode);
+    var constants = node.constants;
     for (var i = 0; i < constants.length; ++i) {
       var constant = constants[i];
       var name = constant.name.name;
@@ -3703,6 +3727,7 @@
     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);
@@ -3741,6 +3766,7 @@
     if (_returnType != null) return _returnType;
 
     if (linkedNode != null) {
+      LazyAst.applyResolution(linkedNode);
       var context = enclosingUnit.linkedContext;
       return _returnType = context.getReturnType(linkedNode);
     }
@@ -3929,6 +3955,7 @@
 
     if (linkedNode != null) {
       if (linkedNode is ExtensionDeclaration) {
+        LazyAst.applyResolution(linkedNode);
         _createPropertiesAndAccessors();
         assert(_accessors != null);
         return _accessors;
@@ -3988,7 +4015,9 @@
     if (_extendedType != null) return _extendedType;
 
     if (linkedNode != null) {
-      return _extendedType = linkedContext.getExtendedType(linkedNode).type;
+      var node = linkedNode as ExtensionDeclaration;
+      LazyAst.applyResolution(linkedNode);
+      return _extendedType = node.extendedType.type;
     }
 
     return _extendedType;
@@ -4002,6 +4031,7 @@
 
     if (linkedNode != null) {
       if (linkedNode is ExtensionDeclaration) {
+        LazyAst.applyResolution(linkedNode);
         _createPropertiesAndAccessors();
         assert(_fields != null);
         return _fields;
@@ -4041,6 +4071,7 @@
     }
 
     if (linkedNode != null) {
+      LazyAst.applyResolution(linkedNode);
       var context = enclosingUnit.linkedContext;
       var containerRef = reference.getChild('@method');
       return _methods = context
@@ -4507,14 +4538,16 @@
     if (_function != null) return _function;
 
     if (linkedNode != null) {
+      LazyAst.applyResolution(linkedNode);
       if (linkedNode is GenericTypeAlias) {
         var context = enclosingUnit.linkedContext;
         var function = context.getGeneticTypeAliasFunction(linkedNode);
         if (function != null) {
-          var reference = context.getGenericFunctionTypeReference(function);
-          _function = reference.element;
-          encloseElement(_function);
-          return _function;
+          return _function = GenericFunctionTypeElementImpl.forLinkedNode(
+            this,
+            reference.getChild('@function'),
+            function,
+          );
         } else {
           return _function = GenericFunctionTypeElementImpl.forOffset(-1)
             ..typeParameters = const <TypeParameterElement>[]
@@ -5839,8 +5872,10 @@
     if (_superclassConstraints != null) return _superclassConstraints;
 
     if (linkedNode != null) {
+      var node = linkedNode as MixinDeclaration;
+      LazyAst.applyResolution(node);
       List<InterfaceType> constraints;
-      var onClause = enclosingUnit.linkedContext.getOnClause(linkedNode);
+      var onClause = node.onClause;
       if (onClause != null) {
         constraints = onClause.superclassConstraints
             .map((node) => node.type)
@@ -6565,8 +6600,9 @@
 
   @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);
     }
@@ -7159,6 +7195,7 @@
   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
@@ -7527,6 +7564,7 @@
     if (_typeParameterElements != null) return _typeParameterElements;
 
     if (linkedNode != null) {
+      LazyAst.applyResolution(linkedNode);
       var typeParameters = linkedContext.getTypeParameters2(linkedNode);
       if (typeParameters == null) {
         return _typeParameterElements = const [];
@@ -7534,6 +7572,11 @@
       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 db5240f..6952f8f 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -242,7 +242,6 @@
       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 c38172a..dae7afe 100644
--- a/pkg/analyzer/lib/src/dart/element/type_system.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_system.dart
@@ -1230,6 +1230,19 @@
       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/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index cddf91d..74266ee 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -4449,10 +4449,7 @@
   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;
@@ -4462,15 +4459,17 @@
   List<String> _variantField_33;
   idl.LinkedNodeCommentType _variantField_29;
   List<LinkedNodeBuilder> _variantField_3;
-  List<int> _variantField_41;
-  LinkedLibraryLanguageVersionBuilder _variantField_40;
+  List<int> _variantField_19;
+  LinkedLibraryLanguageVersionBuilder _variantField_39;
   LinkedNodeBuilder _variantField_10;
   idl.LinkedNodeFormalParameterKind _variantField_26;
   double _variantField_21;
+  int _variantField_15;
   LinkedNodeTypeBuilder _variantField_25;
   String _variantField_20;
-  List<LinkedNodeTypeBuilder> _variantField_39;
+  List<LinkedNodeTypeBuilder> _variantField_38;
   int _flags;
+  int _variantField_17;
   String _variantField_1;
   int _variantField_36;
   int _variantField_16;
@@ -4479,13 +4478,13 @@
   idl.LinkedNodeKind _kind;
   bool _variantField_31;
   List<String> _variantField_34;
-  String _name;
+  String _variantField_37;
+  LinkedNodeResolutionBuilder _resolution;
   idl.UnlinkedTokenType _variantField_35;
   TopLevelInferenceErrorBuilder _variantField_32;
   LinkedNodeTypeBuilder _variantField_23;
   LinkedNodeBuilder _variantField_11;
   String _variantField_22;
-  int _variantField_19;
 
   @override
   LinkedNodeTypeBuilder get actualReturnType {
@@ -4499,7 +4498,8 @@
 
   @override
   LinkedNodeTypeBuilder get actualType {
-    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+    assert(kind == idl.LinkedNodeKind.defaultFormalParameter ||
+        kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
         kind == idl.LinkedNodeKind.simpleFormalParameter ||
         kind == idl.LinkedNodeKind.variableDeclaration);
@@ -4536,7 +4536,8 @@
   }
 
   set actualType(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+    assert(kind == idl.LinkedNodeKind.defaultFormalParameter ||
+        kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
         kind == idl.LinkedNodeKind.simpleFormalParameter ||
         kind == idl.LinkedNodeKind.variableDeclaration);
@@ -6305,30 +6306,6 @@
   }
 
   @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;
@@ -6516,277 +6493,6 @@
   }
 
   @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;
@@ -7108,26 +6814,26 @@
   @override
   List<int> get compilationUnit_featureSet {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
-    return _variantField_41 ??= <int>[];
+    return _variantField_19 ??= <int>[];
   }
 
   set compilationUnit_featureSet(List<int> value) {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
     assert(value == null || value.every((e) => e >= 0));
-    _variantField_41 = value;
+    _variantField_19 = value;
   }
 
   @override
   LinkedLibraryLanguageVersionBuilder get compilationUnit_languageVersion {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
-    return _variantField_40;
+    return _variantField_39;
   }
 
   /// The language version information.
   set compilationUnit_languageVersion(
       LinkedLibraryLanguageVersionBuilder value) {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
-    _variantField_40 = value;
+    _variantField_39 = value;
   }
 
   @override
@@ -7165,11 +6871,60 @@
   }
 
   @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 ||
@@ -7186,7 +6941,6 @@
         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 ||
@@ -7205,6 +6959,7 @@
         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 ||
@@ -7221,7 +6976,6 @@
         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 ||
@@ -7272,12 +7026,12 @@
   @override
   List<LinkedNodeTypeBuilder> get extensionOverride_typeArgumentTypes {
     assert(kind == idl.LinkedNodeKind.extensionOverride);
-    return _variantField_39 ??= <LinkedNodeTypeBuilder>[];
+    return _variantField_38 ??= <LinkedNodeTypeBuilder>[];
   }
 
   set extensionOverride_typeArgumentTypes(List<LinkedNodeTypeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.extensionOverride);
-    _variantField_39 = value;
+    _variantField_38 = value;
   }
 
   @override
@@ -7289,6 +7043,18 @@
   }
 
   @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 ??= '';
@@ -7483,10 +7249,53 @@
   }
 
   @override
-  String get name => _name ??= '';
+  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 ??= '';
+  }
 
   set name(String value) {
-    this._name = 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;
   }
 
   @override
@@ -7563,22 +7372,6 @@
     _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,
@@ -7587,15 +7380,11 @@
   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_17 = annotation_element,
-        _variantField_8 = annotation_name,
-        _variantField_38 = annotation_substitution;
+        _variantField_8 = annotation_name;
 
   LinkedNodeBuilder.argumentList({
     List<LinkedNodeBuilder> argumentList_arguments,
@@ -7628,15 +7417,11 @@
   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;
 
@@ -7651,16 +7436,12 @@
     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;
 
@@ -7676,8 +7457,10 @@
 
   LinkedNodeBuilder.booleanLiteral({
     bool booleanLiteral_value,
+    LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.booleanLiteral,
-        _variantField_27 = booleanLiteral_value;
+        _variantField_27 = booleanLiteral_value,
+        _variantField_25 = expression_type;
 
   LinkedNodeBuilder.breakStatement({
     LinkedNodeBuilder breakStatement_label,
@@ -7715,6 +7498,7 @@
     LinkedNodeBuilder classOrMixinDeclaration_typeParameters,
     int informativeId,
     bool simplyBoundable_isSimplyBounded,
+    String name,
     LinkedNodeBuilder unused11,
   })  : _kind = idl.LinkedNodeKind.classDeclaration,
         _variantField_4 = annotatedNode_metadata,
@@ -7727,6 +7511,7 @@
         _variantField_13 = classOrMixinDeclaration_typeParameters,
         _variantField_36 = informativeId,
         _variantField_31 = simplyBoundable_isSimplyBounded,
+        _variantField_37 = name,
         _variantField_11 = unused11;
 
   LinkedNodeBuilder.classTypeAlias({
@@ -7737,6 +7522,7 @@
     LinkedNodeBuilder classTypeAlias_implementsClause,
     int informativeId,
     bool simplyBoundable_isSimplyBounded,
+    String name,
   })  : _kind = idl.LinkedNodeKind.classTypeAlias,
         _variantField_4 = annotatedNode_metadata,
         _variantField_6 = classTypeAlias_typeParameters,
@@ -7744,7 +7530,8 @@
         _variantField_8 = classTypeAlias_withClause,
         _variantField_9 = classTypeAlias_implementsClause,
         _variantField_36 = informativeId,
-        _variantField_31 = simplyBoundable_isSimplyBounded;
+        _variantField_31 = simplyBoundable_isSimplyBounded,
+        _variantField_37 = name;
 
   LinkedNodeBuilder.comment({
     List<LinkedNodeBuilder> comment_references,
@@ -7771,8 +7558,8 @@
         _variantField_2 = compilationUnit_declarations,
         _variantField_6 = compilationUnit_scriptTag,
         _variantField_3 = compilationUnit_directives,
-        _variantField_41 = compilationUnit_featureSet,
-        _variantField_40 = compilationUnit_languageVersion,
+        _variantField_19 = compilationUnit_featureSet,
+        _variantField_39 = compilationUnit_languageVersion,
         _variantField_36 = informativeId;
 
   LinkedNodeBuilder.conditionalExpression({
@@ -7803,6 +7590,7 @@
     LinkedNodeBuilder constructorDeclaration_redirectedConstructor,
     LinkedNodeBuilder constructorDeclaration_returnType,
     int informativeId,
+    String name,
   })  : _kind = idl.LinkedNodeKind.constructorDeclaration,
         _variantField_2 = constructorDeclaration_initializers,
         _variantField_4 = annotatedNode_metadata,
@@ -7810,7 +7598,8 @@
         _variantField_8 = constructorDeclaration_parameters,
         _variantField_9 = constructorDeclaration_redirectedConstructor,
         _variantField_10 = constructorDeclaration_returnType,
-        _variantField_36 = informativeId;
+        _variantField_36 = informativeId,
+        _variantField_37 = name;
 
   LinkedNodeBuilder.constructorFieldInitializer({
     LinkedNodeBuilder constructorFieldInitializer_expression,
@@ -7822,13 +7611,9 @@
   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_38 = constructorName_substitution,
-        _variantField_15 = constructorName_element;
+        _variantField_7 = constructorName_type;
 
   LinkedNodeBuilder.continueStatement({
     LinkedNodeBuilder continueStatement_label,
@@ -7845,11 +7630,13 @@
         _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,
@@ -7885,18 +7672,22 @@
   LinkedNodeBuilder.enumConstantDeclaration({
     List<LinkedNodeBuilder> annotatedNode_metadata,
     int informativeId,
+    String name,
   })  : _kind = idl.LinkedNodeKind.enumConstantDeclaration,
         _variantField_4 = annotatedNode_metadata,
-        _variantField_36 = informativeId;
+        _variantField_36 = informativeId,
+        _variantField_37 = name;
 
   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_36 = informativeId,
+        _variantField_37 = name;
 
   LinkedNodeBuilder.exportDirective({
     List<LinkedNodeBuilder> namespaceDirective_combinators,
@@ -7906,7 +7697,6 @@
     int informativeId,
     LinkedNodeBuilder uriBasedDirective_uri,
     String uriBasedDirective_uriContent,
-    int uriBasedDirective_uriElement,
   })  : _kind = idl.LinkedNodeKind.exportDirective,
         _variantField_2 = namespaceDirective_combinators,
         _variantField_4 = annotatedNode_metadata,
@@ -7914,8 +7704,7 @@
         _variantField_20 = namespaceDirective_selectedUri,
         _variantField_36 = informativeId,
         _variantField_14 = uriBasedDirective_uri,
-        _variantField_22 = uriBasedDirective_uriContent,
-        _variantField_19 = uriBasedDirective_uriElement;
+        _variantField_22 = uriBasedDirective_uriContent;
 
   LinkedNodeBuilder.expressionFunctionBody({
     LinkedNodeBuilder expressionFunctionBody_expression,
@@ -7939,13 +7728,15 @@
     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_36 = informativeId,
+        _variantField_37 = name;
 
   LinkedNodeBuilder.extensionOverride({
     LinkedNodeTypeBuilder extensionOverride_extendedType,
@@ -7958,7 +7749,7 @@
         _variantField_2 = extensionOverride_arguments,
         _variantField_7 = extensionOverride_extensionName,
         _variantField_8 = extensionOverride_typeArguments,
-        _variantField_39 = extensionOverride_typeArgumentTypes;
+        _variantField_38 = extensionOverride_typeArgumentTypes;
 
   LinkedNodeBuilder.fieldDeclaration({
     List<LinkedNodeBuilder> annotatedNode_metadata,
@@ -7977,6 +7768,7 @@
     LinkedNodeBuilder fieldFormalParameter_formalParameters,
     bool inheritsCovariant,
     int informativeId,
+    String name,
   })  : _kind = idl.LinkedNodeKind.fieldFormalParameter,
         _variantField_24 = actualType,
         _variantField_4 = normalFormalParameter_metadata,
@@ -7984,7 +7776,8 @@
         _variantField_7 = fieldFormalParameter_typeParameters,
         _variantField_8 = fieldFormalParameter_formalParameters,
         _variantField_27 = inheritsCovariant,
-        _variantField_36 = informativeId;
+        _variantField_36 = informativeId,
+        _variantField_37 = name;
 
   LinkedNodeBuilder.forEachPartsWithDeclaration({
     LinkedNodeBuilder forEachParts_iterable,
@@ -8043,12 +7836,14 @@
     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_36 = informativeId,
+        _variantField_37 = name;
 
   LinkedNodeBuilder.functionDeclarationStatement({
     LinkedNodeBuilder functionDeclarationStatement_functionDeclaration,
@@ -8088,6 +7883,7 @@
     bool typeAlias_hasSelfReference,
     int informativeId,
     bool simplyBoundable_isSimplyBounded,
+    String name,
   })  : _kind = idl.LinkedNodeKind.functionTypeAlias,
         _variantField_24 = actualReturnType,
         _variantField_4 = annotatedNode_metadata,
@@ -8096,7 +7892,8 @@
         _variantField_8 = functionTypeAlias_typeParameters,
         _variantField_27 = typeAlias_hasSelfReference,
         _variantField_36 = informativeId,
-        _variantField_31 = simplyBoundable_isSimplyBounded;
+        _variantField_31 = simplyBoundable_isSimplyBounded,
+        _variantField_37 = name;
 
   LinkedNodeBuilder.functionTypedFormalParameter({
     LinkedNodeTypeBuilder actualType,
@@ -8106,6 +7903,7 @@
     LinkedNodeBuilder functionTypedFormalParameter_typeParameters,
     bool inheritsCovariant,
     int informativeId,
+    String name,
   })  : _kind = idl.LinkedNodeKind.functionTypedFormalParameter,
         _variantField_24 = actualType,
         _variantField_4 = normalFormalParameter_metadata,
@@ -8113,22 +7911,23 @@
         _variantField_7 = functionTypedFormalParameter_returnType,
         _variantField_8 = functionTypedFormalParameter_typeParameters,
         _variantField_27 = inheritsCovariant,
-        _variantField_36 = informativeId;
+        _variantField_36 = informativeId,
+        _variantField_37 = name;
 
   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_25 = genericFunctionType_type,
+        _variantField_17 = genericFunctionType_id;
 
   LinkedNodeBuilder.genericTypeAlias({
     List<LinkedNodeBuilder> annotatedNode_metadata,
@@ -8137,13 +7936,15 @@
     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_31 = simplyBoundable_isSimplyBounded,
+        _variantField_37 = name;
 
   LinkedNodeBuilder.hideCombinator({
     int informativeId,
@@ -8184,7 +7985,6 @@
     int informativeId,
     LinkedNodeBuilder uriBasedDirective_uri,
     String uriBasedDirective_uriContent,
-    int uriBasedDirective_uriElement,
   })  : _kind = idl.LinkedNodeKind.importDirective,
         _variantField_2 = namespaceDirective_combinators,
         _variantField_4 = annotatedNode_metadata,
@@ -8193,20 +7993,15 @@
         _variantField_1 = importDirective_prefix,
         _variantField_36 = informativeId,
         _variantField_14 = uriBasedDirective_uri,
-        _variantField_22 = uriBasedDirective_uriContent,
-        _variantField_19 = uriBasedDirective_uriElement;
+        _variantField_22 = uriBasedDirective_uriContent;
 
   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({
@@ -8295,6 +8090,7 @@
     LinkedNodeBuilder methodDeclaration_typeParameters,
     int informativeId,
     bool methodDeclaration_hasOperatorEqualWithParameterTypeFromObject,
+    String name,
     TopLevelInferenceErrorBuilder topLevelTypeInferenceError,
   })  : _kind = idl.LinkedNodeKind.methodDeclaration,
         _variantField_24 = actualReturnType,
@@ -8306,6 +8102,7 @@
         _variantField_36 = informativeId,
         _variantField_31 =
             methodDeclaration_hasOperatorEqualWithParameterTypeFromObject,
+        _variantField_37 = name,
         _variantField_32 = topLevelTypeInferenceError;
 
   LinkedNodeBuilder.methodInvocation({
@@ -8332,6 +8129,7 @@
     int informativeId,
     bool simplyBoundable_isSimplyBounded,
     List<String> mixinDeclaration_superInvokedNames,
+    String name,
   })  : _kind = idl.LinkedNodeKind.mixinDeclaration,
         _variantField_4 = annotatedNode_metadata,
         _variantField_6 = mixinDeclaration_onClause,
@@ -8340,7 +8138,8 @@
         _variantField_13 = classOrMixinDeclaration_typeParameters,
         _variantField_36 = informativeId,
         _variantField_31 = simplyBoundable_isSimplyBounded,
-        _variantField_34 = mixinDeclaration_superInvokedNames;
+        _variantField_34 = mixinDeclaration_superInvokedNames,
+        _variantField_37 = name;
 
   LinkedNodeBuilder.namedExpression({
     LinkedNodeBuilder namedExpression_expression,
@@ -8383,13 +8182,11 @@
     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_19 = uriBasedDirective_uriElement;
+        _variantField_22 = uriBasedDirective_uriContent;
 
   LinkedNodeBuilder.partOfDirective({
     List<LinkedNodeBuilder> annotatedNode_metadata,
@@ -8404,27 +8201,19 @@
 
   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;
 
@@ -8451,14 +8240,9 @@
   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_38 = redirectingConstructorInvocation_substitution,
-        _variantField_15 = redirectingConstructorInvocation_element;
+        _variantField_7 = redirectingConstructorInvocation_constructorName;
 
   LinkedNodeBuilder.rethrowExpression({
     LinkedNodeTypeBuilder expression_type,
@@ -8492,6 +8276,7 @@
     LinkedNodeBuilder simpleFormalParameter_type,
     bool inheritsCovariant,
     int informativeId,
+    String name,
     TopLevelInferenceErrorBuilder topLevelTypeInferenceError,
   })  : _kind = idl.LinkedNodeKind.simpleFormalParameter,
         _variantField_24 = actualType,
@@ -8499,16 +8284,13 @@
         _variantField_6 = simpleFormalParameter_type,
         _variantField_27 = inheritsCovariant,
         _variantField_36 = informativeId,
+        _variantField_37 = name,
         _variantField_32 = topLevelTypeInferenceError;
 
   LinkedNodeBuilder.simpleIdentifier({
-    LinkedNodeTypeSubstitutionBuilder simpleIdentifier_substitution,
-    int simpleIdentifier_element,
-    LinkedNodeTypeBuilder expression_type,
+    String name,
   })  : _kind = idl.LinkedNodeKind.simpleIdentifier,
-        _variantField_38 = simpleIdentifier_substitution,
-        _variantField_15 = simpleIdentifier_element,
-        _variantField_25 = expression_type;
+        _variantField_37 = name;
 
   LinkedNodeBuilder.simpleStringLiteral({
     String simpleStringLiteral_value,
@@ -8530,13 +8312,9 @@
   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_38 = superConstructorInvocation_substitution,
-        _variantField_15 = superConstructorInvocation_element;
+        _variantField_7 = superConstructorInvocation_constructorName;
 
   LinkedNodeBuilder.superExpression({
     LinkedNodeTypeBuilder expression_type,
@@ -8622,12 +8400,14 @@
     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({
@@ -8641,6 +8421,7 @@
     LinkedNodeBuilder variableDeclaration_initializer,
     bool inheritsCovariant,
     int informativeId,
+    String name,
     TopLevelInferenceErrorBuilder topLevelTypeInferenceError,
   })  : _kind = idl.LinkedNodeKind.variableDeclaration,
         _variantField_24 = actualType,
@@ -8648,6 +8429,7 @@
         _variantField_6 = variableDeclaration_initializer,
         _variantField_27 = inheritsCovariant,
         _variantField_36 = informativeId,
+        _variantField_37 = name,
         _variantField_32 = topLevelTypeInferenceError;
 
   LinkedNodeBuilder.variableDeclarationList({
@@ -8687,53 +8469,66 @@
   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();
-      annotation_substitution?.flushInformative();
+      resolution?.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();
@@ -8743,6 +8538,7 @@
       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());
@@ -8751,25 +8547,31 @@
       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());
@@ -8778,66 +8580,86 @@
       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();
-      constructorName_substitution?.flushInformative();
+      resolution?.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());
@@ -8845,47 +8667,59 @@
       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());
@@ -8893,6 +8727,7 @@
       functionTypeAlias_returnType?.flushInformative();
       functionTypeAlias_typeParameters?.flushInformative();
       informativeId = null;
+      resolution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.functionTypedFormalParameter) {
       actualType?.flushInformative();
       normalFormalParameter_metadata?.forEach((b) => b.flushInformative());
@@ -8900,72 +8735,91 @@
       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());
@@ -8974,6 +8828,7 @@
       methodDeclaration_returnType?.flushInformative();
       methodDeclaration_typeParameters?.flushInformative();
       informativeId = null;
+      resolution?.flushInformative();
       topLevelTypeInferenceError?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.methodInvocation) {
       invocationExpression_invokeType?.flushInformative();
@@ -8982,6 +8837,7 @@
       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();
@@ -8989,137 +8845,174 @@
       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();
-      redirectingConstructorInvocation_substitution?.flushInformative();
+      resolution?.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) {
-      simpleIdentifier_substitution?.flushInformative();
-      expression_type?.flushInformative();
+      resolution?.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();
-      superConstructorInvocation_substitution?.flushInformative();
+      resolution?.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();
     }
   }
 
@@ -9136,7 +9029,8 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.annotation) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.annotation_arguments != null);
@@ -9145,11 +9039,9 @@
       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.addString(this.name ?? '');
-      signature.addBool(this.annotation_substitution != null);
-      this.annotation_substitution?.collectApiSignature(signature);
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.argumentList) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.argumentList_arguments == null) {
@@ -9161,7 +9053,8 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.asExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.asExpression_expression != null);
@@ -9171,7 +9064,8 @@
       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);
     } else if (kind == idl.LinkedNodeKind.assertInitializer) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.assertInitializer_condition != null);
@@ -9179,7 +9073,8 @@
       signature.addBool(this.assertInitializer_message != null);
       this.assertInitializer_message?.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.assertStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.assertStatement_condition != null);
@@ -9187,23 +9082,22 @@
       signature.addBool(this.assertStatement_message != null);
       this.assertStatement_message?.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.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.addString(this.name ?? '');
-      signature.addBool(this.assignmentExpression_substitution != null);
-      this.assignmentExpression_substitution?.collectApiSignature(signature);
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.awaitExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.awaitExpression_expression != null);
@@ -9211,14 +9105,14 @@
       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);
     } 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);
@@ -9227,9 +9121,8 @@
       signature.addInt(this.binaryExpression_operator == null
           ? 0
           : this.binaryExpression_operator.index);
-      signature.addString(this.name ?? '');
-      signature.addBool(this.binaryExpression_substitution != null);
-      this.binaryExpression_substitution?.collectApiSignature(signature);
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.block) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.block_statements == null) {
@@ -9241,24 +9134,30 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } 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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } 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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } 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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.cascadeExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.cascadeExpression_sections == null) {
@@ -9274,7 +9173,8 @@
       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);
     } else if (kind == idl.LinkedNodeKind.catchClause) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.catchClause_body != null);
@@ -9286,7 +9186,8 @@
       signature.addBool(this.catchClause_stackTraceParameter != null);
       this.catchClause_stackTraceParameter?.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.classDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -9325,6 +9226,8 @@
       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) {
@@ -9346,6 +9249,8 @@
       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) {
@@ -9366,13 +9271,15 @@
           signature.addString(x);
         }
       }
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } 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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.compilationUnit) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.compilationUnit_declarations == null) {
@@ -9394,9 +9301,6 @@
       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 {
@@ -9405,6 +9309,10 @@
           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);
@@ -9416,7 +9324,8 @@
       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);
     } else if (kind == idl.LinkedNodeKind.configuration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.configuration_name != null);
@@ -9426,7 +9335,8 @@
       signature.addBool(this.configuration_uri != null);
       this.configuration_uri?.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.constructorDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.constructorDeclaration_initializers == null) {
@@ -9458,6 +9368,8 @@
       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);
@@ -9469,24 +9381,24 @@
           .constructorFieldInitializer_fieldName
           ?.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.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.addString(this.name ?? '');
-      signature.addBool(this.constructorName_substitution != null);
-      this.constructorName_substitution?.collectApiSignature(signature);
+      signature.addBool(this.resolution != null);
+      this.resolution?.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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.declaredIdentifier) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -9502,7 +9414,8 @@
       signature.addBool(this.declaredIdentifier_type != null);
       this.declaredIdentifier_type?.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.defaultFormalParameter) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.defaultFormalParameter_defaultValue != null);
@@ -9510,10 +9423,13 @@
       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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.doStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.doStatement_body != null);
@@ -9521,7 +9437,8 @@
       signature.addBool(this.doStatement_condition != null);
       this.doStatement_condition?.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.dottedName) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.dottedName_components == null) {
@@ -9533,22 +9450,26 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } 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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } 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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } 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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.enumConstantDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -9561,6 +9482,8 @@
       }
       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) {
@@ -9581,6 +9504,8 @@
       }
       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) {
@@ -9610,28 +9535,31 @@
       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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } 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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } 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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } 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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.extensionDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -9657,6 +9585,8 @@
       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) {
@@ -9674,7 +9604,6 @@
       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 {
@@ -9683,6 +9612,8 @@
           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) {
@@ -9696,7 +9627,8 @@
       signature.addBool(this.fieldDeclaration_fields != null);
       this.fieldDeclaration_fields?.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.fieldFormalParameter) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.normalFormalParameter_metadata == null) {
@@ -9720,6 +9652,8 @@
       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);
@@ -9729,7 +9663,8 @@
           .forEachPartsWithDeclaration_loopVariable
           ?.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.forEachPartsWithIdentifier) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.forEachParts_iterable != null);
@@ -9739,7 +9674,8 @@
           .forEachPartsWithIdentifier_identifier
           ?.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.forElement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.forMixin_forLoopParts != null);
@@ -9747,7 +9683,8 @@
       signature.addBool(this.forElement_body != null);
       this.forElement_body?.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.forPartsWithDeclarations) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.forParts_updaters == null) {
@@ -9763,7 +9700,8 @@
       signature.addBool(this.forPartsWithDeclarations_variables != null);
       this.forPartsWithDeclarations_variables?.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.forPartsWithExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.forParts_updaters == null) {
@@ -9781,7 +9719,8 @@
           .forPartsWithExpression_initialization
           ?.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.forStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.forMixin_forLoopParts != null);
@@ -9789,7 +9728,8 @@
       signature.addBool(this.forStatement_body != null);
       this.forStatement_body?.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.formalParameterList) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.formalParameterList_parameters == null) {
@@ -9801,7 +9741,8 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.functionDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -9822,6 +9763,8 @@
       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(
@@ -9830,7 +9773,8 @@
           .functionDeclarationStatement_functionDeclaration
           ?.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.functionExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.functionExpression_body != null);
@@ -9842,7 +9786,8 @@
       signature.addInt(this.flags ?? 0);
       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.functionExpressionInvocation) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.functionExpressionInvocation_function != null);
@@ -9858,7 +9803,8 @@
       this.invocationExpression_invokeType?.collectApiSignature(signature);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.functionTypeAlias) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -9881,6 +9827,8 @@
       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) {
@@ -9910,6 +9858,8 @@
       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);
@@ -9924,7 +9874,8 @@
       this.actualReturnType?.collectApiSignature(signature);
       signature.addBool(this.genericFunctionType_type != null);
       this.genericFunctionType_type?.collectApiSignature(signature);
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.genericTypeAlias) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -9943,6 +9894,8 @@
       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);
@@ -9954,7 +9907,8 @@
           signature.addString(x);
         }
       }
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.ifElement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.ifMixin_condition != null);
@@ -9964,7 +9918,8 @@
       signature.addBool(this.ifElement_elseElement != null);
       this.ifElement_elseElement?.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.ifStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.ifMixin_condition != null);
@@ -9974,7 +9929,8 @@
       signature.addBool(this.ifStatement_thenStatement != null);
       this.ifStatement_thenStatement?.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.implementsClause) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.implementsClause_interfaces == null) {
@@ -9986,7 +9942,8 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.importDirective) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addString(this.importDirective_prefix ?? '');
@@ -10017,23 +9974,21 @@
       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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } 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.addString(this.name ?? '');
-      signature.addBool(this.indexExpression_substitution != null);
-      this.indexExpression_substitution?.collectApiSignature(signature);
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.instanceCreationExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.instanceCreationExpression_arguments == null) {
@@ -10056,25 +10011,29 @@
       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);
     } 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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } 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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } 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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.isExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.isExpression_expression != null);
@@ -10082,13 +10041,15 @@
       signature.addBool(this.isExpression_type != null);
       this.isExpression_type?.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.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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.labeledStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.labeledStatement_labels == null) {
@@ -10102,7 +10063,8 @@
       signature.addBool(this.labeledStatement_statement != null);
       this.labeledStatement_statement?.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.libraryDirective) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -10116,7 +10078,8 @@
       signature.addBool(this.libraryDirective_name != null);
       this.libraryDirective_name?.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.libraryIdentifier) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.libraryIdentifier_components == null) {
@@ -10128,7 +10091,8 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.listLiteral) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.typedLiteral_typeArguments == null) {
@@ -10150,7 +10114,8 @@
       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);
     } else if (kind == idl.LinkedNodeKind.mapLiteralEntry) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.mapLiteralEntry_key != null);
@@ -10158,7 +10123,8 @@
       signature.addBool(this.mapLiteralEntry_value != null);
       this.mapLiteralEntry_value?.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.methodDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -10186,6 +10152,8 @@
       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);
@@ -10201,7 +10169,8 @@
       this.invocationExpression_invokeType?.collectApiSignature(signature);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.mixinDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -10241,6 +10210,8 @@
         }
       }
       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);
@@ -10248,26 +10219,30 @@
       signature.addBool(this.namedExpression_name != null);
       this.namedExpression_name?.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.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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } 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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } 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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.onClause) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.onClause_superclassConstraints == null) {
@@ -10279,7 +10254,8 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.parenthesizedExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.parenthesizedExpression_expression != null);
@@ -10287,7 +10263,8 @@
       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);
     } else if (kind == idl.LinkedNodeKind.partDirective) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -10301,9 +10278,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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.partOfDirective) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -10319,35 +10296,32 @@
       signature.addBool(this.partOfDirective_uri != null);
       this.partOfDirective_uri?.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.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.addString(this.name ?? '');
-      signature.addBool(this.postfixExpression_substitution != null);
-      this.postfixExpression_substitution?.collectApiSignature(signature);
+      signature.addBool(this.resolution != null);
+      this.resolution?.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.addString(this.name ?? '');
-      signature.addBool(this.prefixExpression_substitution != null);
-      this.prefixExpression_substitution?.collectApiSignature(signature);
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.prefixedIdentifier) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.prefixedIdentifier_identifier != null);
@@ -10357,7 +10331,8 @@
       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);
     } else if (kind == idl.LinkedNodeKind.propertyAccess) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.propertyAccess_propertyName != null);
@@ -10370,7 +10345,8 @@
       signature.addInt(this.propertyAccess_operator == null
           ? 0
           : this.propertyAccess_operator.index);
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.redirectingConstructorInvocation) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature
@@ -10383,26 +10359,23 @@
       this
           .redirectingConstructorInvocation_constructorName
           ?.collectApiSignature(signature);
-      signature.addInt(this.redirectingConstructorInvocation_element ?? 0);
       signature.addInt(this.flags ?? 0);
-      signature.addString(this.name ?? '');
-      signature
-          .addBool(this.redirectingConstructorInvocation_substitution != null);
-      this
-          .redirectingConstructorInvocation_substitution
-          ?.collectApiSignature(signature);
+      signature.addBool(this.resolution != null);
+      this.resolution?.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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } 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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.setOrMapLiteral) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.typedLiteral_typeArguments == null) {
@@ -10424,7 +10397,8 @@
       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);
     } else if (kind == idl.LinkedNodeKind.showCombinator) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.flags ?? 0);
@@ -10436,7 +10410,8 @@
           signature.addString(x);
         }
       }
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.simpleFormalParameter) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.normalFormalParameter_metadata == null) {
@@ -10456,20 +10431,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.simpleIdentifier_substitution != null);
-      this.simpleIdentifier_substitution?.collectApiSignature(signature);
+      signature.addBool(this.resolution != null);
+      this.resolution?.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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.spreadElement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.spreadElement_expression != null);
@@ -10478,7 +10453,8 @@
       signature.addInt(this.spreadElement_spreadOperator == null
           ? 0
           : this.spreadElement_spreadOperator.index);
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.stringInterpolation) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.stringInterpolation_elements == null) {
@@ -10490,7 +10466,8 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.superConstructorInvocation) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.superConstructorInvocation_arguments != null);
@@ -10500,19 +10477,16 @@
       this
           .superConstructorInvocation_constructorName
           ?.collectApiSignature(signature);
-      signature.addInt(this.superConstructorInvocation_element ?? 0);
       signature.addInt(this.flags ?? 0);
-      signature.addString(this.name ?? '');
-      signature.addBool(this.superConstructorInvocation_substitution != null);
-      this
-          .superConstructorInvocation_substitution
-          ?.collectApiSignature(signature);
+      signature.addBool(this.resolution != null);
+      this.resolution?.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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.switchCase) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.switchMember_labels == null) {
@@ -10534,7 +10508,8 @@
       signature.addBool(this.switchCase_expression != null);
       this.switchCase_expression?.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.switchDefault) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.switchMember_labels == null) {
@@ -10554,7 +10529,8 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.switchStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.switchStatement_members == null) {
@@ -10568,7 +10544,8 @@
       signature.addBool(this.switchStatement_expression != null);
       this.switchStatement_expression?.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.symbolLiteral) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.flags ?? 0);
@@ -10582,13 +10559,15 @@
           signature.addString(x);
         }
       }
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } 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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.throwExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.throwExpression_expression != null);
@@ -10596,7 +10575,8 @@
       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);
     } else if (kind == idl.LinkedNodeKind.topLevelVariableDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -10612,7 +10592,8 @@
           .topLevelVariableDeclaration_variableList
           ?.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.tryStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.tryStatement_catchClauses == null) {
@@ -10628,7 +10609,8 @@
       signature.addBool(this.tryStatement_finallyBlock != null);
       this.tryStatement_finallyBlock?.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.typeArgumentList) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.typeArgumentList_arguments == null) {
@@ -10640,7 +10622,8 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.typeName) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.typeName_typeArguments == null) {
@@ -10656,7 +10639,8 @@
       signature.addInt(this.flags ?? 0);
       signature.addBool(this.typeName_type != null);
       this.typeName_type?.collectApiSignature(signature);
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.typeParameter) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -10674,6 +10658,8 @@
       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) {
@@ -10685,7 +10671,8 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.variableDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -10705,6 +10692,8 @@
       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) {
@@ -10726,7 +10715,8 @@
       signature.addBool(this.variableDeclarationList_type != null);
       this.variableDeclarationList_type?.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.variableDeclarationStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.variableDeclarationStatement_variables != null);
@@ -10734,7 +10724,8 @@
           .variableDeclarationStatement_variables
           ?.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.whileStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.whileStatement_body != null);
@@ -10742,7 +10733,8 @@
       signature.addBool(this.whileStatement_condition != null);
       this.whileStatement_condition?.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.withClause) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.withClause_mixinTypes == null) {
@@ -10754,13 +10746,15 @@
         }
       }
       signature.addInt(this.flags ?? 0);
-      signature.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     } 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.addString(this.name ?? '');
+      signature.addBool(this.resolution != null);
+      this.resolution?.collectApiSignature(signature);
     }
   }
 
@@ -10771,24 +10765,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_41;
-    fb.Offset offset_variantField_40;
+    fb.Offset offset_variantField_19;
+    fb.Offset offset_variantField_39;
     fb.Offset offset_variantField_10;
     fb.Offset offset_variantField_25;
     fb.Offset offset_variantField_20;
-    fb.Offset offset_variantField_39;
+    fb.Offset offset_variantField_38;
     fb.Offset offset_variantField_1;
     fb.Offset offset_variantField_30;
     fb.Offset offset_variantField_14;
     fb.Offset offset_variantField_34;
-    fb.Offset offset_name;
+    fb.Offset offset_variantField_37;
+    fb.Offset offset_resolution;
     fb.Offset offset_variantField_32;
     fb.Offset offset_variantField_23;
     fb.Offset offset_variantField_11;
@@ -10813,9 +10807,6 @@
     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);
     }
@@ -10837,11 +10828,11 @@
       offset_variantField_3 = fbBuilder
           .writeList(_variantField_3.map((b) => b.finish(fbBuilder)).toList());
     }
-    if (!(_variantField_41 == null || _variantField_41.isEmpty)) {
-      offset_variantField_41 = fbBuilder.writeListUint32(_variantField_41);
+    if (!(_variantField_19 == null || _variantField_19.isEmpty)) {
+      offset_variantField_19 = fbBuilder.writeListUint32(_variantField_19);
     }
-    if (_variantField_40 != null) {
-      offset_variantField_40 = _variantField_40.finish(fbBuilder);
+    if (_variantField_39 != null) {
+      offset_variantField_39 = _variantField_39.finish(fbBuilder);
     }
     if (_variantField_10 != null) {
       offset_variantField_10 = _variantField_10.finish(fbBuilder);
@@ -10852,9 +10843,9 @@
     if (_variantField_20 != null) {
       offset_variantField_20 = fbBuilder.writeString(_variantField_20);
     }
-    if (!(_variantField_39 == null || _variantField_39.isEmpty)) {
-      offset_variantField_39 = fbBuilder
-          .writeList(_variantField_39.map((b) => b.finish(fbBuilder)).toList());
+    if (!(_variantField_38 == null || _variantField_38.isEmpty)) {
+      offset_variantField_38 = fbBuilder
+          .writeList(_variantField_38.map((b) => b.finish(fbBuilder)).toList());
     }
     if (_variantField_1 != null) {
       offset_variantField_1 = fbBuilder.writeString(_variantField_1);
@@ -10869,8 +10860,11 @@
       offset_variantField_34 = fbBuilder.writeList(
           _variantField_34.map((b) => fbBuilder.writeString(b)).toList());
     }
-    if (_name != null) {
-      offset_name = fbBuilder.writeString(_name);
+    if (_variantField_37 != null) {
+      offset_variantField_37 = fbBuilder.writeString(_variantField_37);
+    }
+    if (_resolution != null) {
+      offset_resolution = _resolution.finish(fbBuilder);
     }
     if (_variantField_32 != null) {
       offset_variantField_32 = _variantField_32.finish(fbBuilder);
@@ -10900,18 +10894,9 @@
     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);
@@ -10941,11 +10926,11 @@
     if (offset_variantField_3 != null) {
       fbBuilder.addOffset(3, offset_variantField_3);
     }
-    if (offset_variantField_41 != null) {
-      fbBuilder.addOffset(41, offset_variantField_41);
+    if (offset_variantField_19 != null) {
+      fbBuilder.addOffset(19, offset_variantField_19);
     }
-    if (offset_variantField_40 != null) {
-      fbBuilder.addOffset(40, offset_variantField_40);
+    if (offset_variantField_39 != null) {
+      fbBuilder.addOffset(39, offset_variantField_39);
     }
     if (offset_variantField_10 != null) {
       fbBuilder.addOffset(10, offset_variantField_10);
@@ -10958,18 +10943,24 @@
     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_39 != null) {
-      fbBuilder.addOffset(39, offset_variantField_39);
+    if (offset_variantField_38 != null) {
+      fbBuilder.addOffset(38, offset_variantField_38);
     }
     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);
     }
@@ -10994,8 +10985,11 @@
     if (offset_variantField_34 != null) {
       fbBuilder.addOffset(34, offset_variantField_34);
     }
-    if (offset_name != null) {
-      fbBuilder.addOffset(37, offset_name);
+    if (offset_variantField_37 != null) {
+      fbBuilder.addOffset(37, offset_variantField_37);
+    }
+    if (offset_resolution != null) {
+      fbBuilder.addOffset(40, offset_resolution);
     }
     if (_variantField_35 != null &&
         _variantField_35 != idl.UnlinkedTokenType.NOTHING) {
@@ -11013,9 +11007,6 @@
     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();
   }
 }
@@ -11041,10 +11032,7 @@
   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;
@@ -11054,15 +11042,17 @@
   List<String> _variantField_33;
   idl.LinkedNodeCommentType _variantField_29;
   List<idl.LinkedNode> _variantField_3;
-  List<int> _variantField_41;
-  idl.LinkedLibraryLanguageVersion _variantField_40;
+  List<int> _variantField_19;
+  idl.LinkedLibraryLanguageVersion _variantField_39;
   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_39;
+  List<idl.LinkedNodeType> _variantField_38;
   int _flags;
+  int _variantField_17;
   String _variantField_1;
   int _variantField_36;
   int _variantField_16;
@@ -11071,13 +11061,13 @@
   idl.LinkedNodeKind _kind;
   bool _variantField_31;
   List<String> _variantField_34;
-  String _name;
+  String _variantField_37;
+  idl.LinkedNodeResolution _resolution;
   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 {
@@ -11093,7 +11083,8 @@
 
   @override
   idl.LinkedNodeType get actualType {
-    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+    assert(kind == idl.LinkedNodeKind.defaultFormalParameter ||
+        kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
         kind == idl.LinkedNodeKind.simpleFormalParameter ||
         kind == idl.LinkedNodeKind.variableDeclaration);
@@ -12382,22 +12373,6 @@
   }
 
   @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 ??=
@@ -12534,191 +12509,6 @@
   }
 
   @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()
@@ -12948,17 +12738,17 @@
   @override
   List<int> get compilationUnit_featureSet {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
-    _variantField_41 ??= const fb.Uint32ListReader()
-        .vTableGet(_bc, _bcOffset, 41, const <int>[]);
-    return _variantField_41;
+    _variantField_19 ??= const fb.Uint32ListReader()
+        .vTableGet(_bc, _bcOffset, 19, const <int>[]);
+    return _variantField_19;
   }
 
   @override
   idl.LinkedLibraryLanguageVersion get compilationUnit_languageVersion {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
-    _variantField_40 ??= const _LinkedLibraryLanguageVersionReader()
-        .vTableGet(_bc, _bcOffset, 40, null);
-    return _variantField_40;
+    _variantField_39 ??= const _LinkedLibraryLanguageVersionReader()
+        .vTableGet(_bc, _bcOffset, 39, null);
+    return _variantField_39;
   }
 
   @override
@@ -12989,11 +12779,44 @@
   }
 
   @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 ||
@@ -13010,7 +12833,6 @@
         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 ||
@@ -13056,10 +12878,10 @@
   @override
   List<idl.LinkedNodeType> get extensionOverride_typeArgumentTypes {
     assert(kind == idl.LinkedNodeKind.extensionOverride);
-    _variantField_39 ??=
+    _variantField_38 ??=
         const fb.ListReader<idl.LinkedNodeType>(_LinkedNodeTypeReader())
-            .vTableGet(_bc, _bcOffset, 39, const <idl.LinkedNodeType>[]);
-    return _variantField_39;
+            .vTableGet(_bc, _bcOffset, 38, const <idl.LinkedNodeType>[]);
+    return _variantField_38;
   }
 
   @override
@@ -13069,6 +12891,14 @@
   }
 
   @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 ??=
@@ -13194,8 +13024,33 @@
 
   @override
   String get name {
-    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 37, '');
-    return _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;
   }
 
   @override
@@ -13249,16 +13104,6 @@
         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 {
@@ -13271,8 +13116,8 @@
     if (kind != idl.LinkedNodeKind.adjacentStrings) {
       _result["kind"] = kind.toString().split('.')[1];
     }
-    if (name != '') {
-      _result["name"] = name;
+    if (resolution != null) {
+      _result["resolution"] = resolution.toJson();
     }
     if (kind == idl.LinkedNodeKind.adjacentStrings) {
       if (adjacentStrings_strings.isNotEmpty) {
@@ -13288,15 +13133,9 @@
         _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) {
@@ -13343,13 +13182,6 @@
         _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];
@@ -13380,13 +13212,6 @@
         _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];
@@ -13410,6 +13235,9 @@
       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) {
@@ -13488,6 +13316,9 @@
         _result["simplyBoundable_isSimplyBounded"] =
             simplyBoundable_isSimplyBounded;
       }
+      if (name != '') {
+        _result["name"] = name;
+      }
       if (unused11 != null) {
         _result["unused11"] = unused11.toJson();
       }
@@ -13520,6 +13351,9 @@
         _result["simplyBoundable_isSimplyBounded"] =
             simplyBoundable_isSimplyBounded;
       }
+      if (name != '') {
+        _result["name"] = name;
+      }
     }
     if (kind == idl.LinkedNodeKind.comment) {
       if (comment_references.isNotEmpty) {
@@ -13623,6 +13457,9 @@
       if (informativeId != 0) {
         _result["informativeId"] = informativeId;
       }
+      if (name != '') {
+        _result["name"] = name;
+      }
     }
     if (kind == idl.LinkedNodeKind.constructorFieldInitializer) {
       if (constructorFieldInitializer_expression != null) {
@@ -13641,13 +13478,6 @@
       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) {
@@ -13668,6 +13498,9 @@
       }
     }
     if (kind == idl.LinkedNodeKind.defaultFormalParameter) {
+      if (actualType != null) {
+        _result["actualType"] = actualType.toJson();
+      }
       if (defaultFormalParameter_defaultValue != null) {
         _result["defaultFormalParameter_defaultValue"] =
             defaultFormalParameter_defaultValue.toJson();
@@ -13724,6 +13557,9 @@
       if (informativeId != 0) {
         _result["informativeId"] = informativeId;
       }
+      if (name != '') {
+        _result["name"] = name;
+      }
     }
     if (kind == idl.LinkedNodeKind.enumDeclaration) {
       if (enumDeclaration_constants.isNotEmpty) {
@@ -13737,6 +13573,9 @@
       if (informativeId != 0) {
         _result["informativeId"] = informativeId;
       }
+      if (name != '') {
+        _result["name"] = name;
+      }
     }
     if (kind == idl.LinkedNodeKind.exportDirective) {
       if (namespaceDirective_combinators.isNotEmpty) {
@@ -13768,9 +13607,6 @@
       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) {
@@ -13813,6 +13649,9 @@
       if (informativeId != 0) {
         _result["informativeId"] = informativeId;
       }
+      if (name != '') {
+        _result["name"] = name;
+      }
     }
     if (kind == idl.LinkedNodeKind.extensionOverride) {
       if (extensionOverride_extendedType != null) {
@@ -13879,6 +13718,9 @@
       if (informativeId != 0) {
         _result["informativeId"] = informativeId;
       }
+      if (name != '') {
+        _result["name"] = name;
+      }
     }
     if (kind == idl.LinkedNodeKind.forEachPartsWithDeclaration) {
       if (forEachParts_iterable != null) {
@@ -13967,6 +13809,9 @@
       if (informativeId != 0) {
         _result["informativeId"] = informativeId;
       }
+      if (name != '') {
+        _result["name"] = name;
+      }
     }
     if (kind == idl.LinkedNodeKind.functionDeclarationStatement) {
       if (functionDeclarationStatement_functionDeclaration != null) {
@@ -14041,6 +13886,9 @@
         _result["simplyBoundable_isSimplyBounded"] =
             simplyBoundable_isSimplyBounded;
       }
+      if (name != '') {
+        _result["name"] = name;
+      }
     }
     if (kind == idl.LinkedNodeKind.functionTypedFormalParameter) {
       if (actualType != null) {
@@ -14070,6 +13918,9 @@
       if (informativeId != 0) {
         _result["informativeId"] = informativeId;
       }
+      if (name != '') {
+        _result["name"] = name;
+      }
     }
     if (kind == idl.LinkedNodeKind.genericFunctionType) {
       if (actualReturnType != null) {
@@ -14083,9 +13934,6 @@
         _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();
@@ -14093,6 +13941,9 @@
       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) {
@@ -14117,6 +13968,9 @@
         _result["simplyBoundable_isSimplyBounded"] =
             simplyBoundable_isSimplyBounded;
       }
+      if (name != '') {
+        _result["name"] = name;
+      }
     }
     if (kind == idl.LinkedNodeKind.hideCombinator) {
       if (informativeId != 0) {
@@ -14190,9 +14044,6 @@
       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) {
@@ -14201,13 +14052,6 @@
       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();
       }
@@ -14345,6 +14189,9 @@
         _result["methodDeclaration_hasOperatorEqualWithParameterTypeFromObject"] =
             methodDeclaration_hasOperatorEqualWithParameterTypeFromObject;
       }
+      if (name != '') {
+        _result["name"] = name;
+      }
       if (topLevelTypeInferenceError != null) {
         _result["topLevelTypeInferenceError"] =
             topLevelTypeInferenceError.toJson();
@@ -14408,6 +14255,9 @@
         _result["mixinDeclaration_superInvokedNames"] =
             mixinDeclaration_superInvokedNames;
       }
+      if (name != '') {
+        _result["name"] = name;
+      }
     }
     if (kind == idl.LinkedNodeKind.namedExpression) {
       if (namedExpression_expression != null) {
@@ -14468,9 +14318,6 @@
       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) {
@@ -14493,13 +14340,6 @@
         _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];
@@ -14512,13 +14352,6 @@
       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];
@@ -14565,14 +14398,6 @@
         _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) {
@@ -14627,21 +14452,17 @@
       if (informativeId != 0) {
         _result["informativeId"] = informativeId;
       }
+      if (name != '') {
+        _result["name"] = name;
+      }
       if (topLevelTypeInferenceError != null) {
         _result["topLevelTypeInferenceError"] =
             topLevelTypeInferenceError.toJson();
       }
     }
     if (kind == idl.LinkedNodeKind.simpleIdentifier) {
-      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 (name != '') {
+        _result["name"] = name;
       }
     }
     if (kind == idl.LinkedNodeKind.simpleStringLiteral) {
@@ -14674,14 +14495,6 @@
         _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) {
@@ -14802,6 +14615,9 @@
       if (informativeId != 0) {
         _result["informativeId"] = informativeId;
       }
+      if (name != '') {
+        _result["name"] = name;
+      }
       if (typeParameter_defaultType != null) {
         _result["typeParameter_defaultType"] =
             typeParameter_defaultType.toJson();
@@ -14833,6 +14649,9 @@
       if (informativeId != 0) {
         _result["informativeId"] = informativeId;
       }
+      if (name != '') {
+        _result["name"] = name;
+      }
       if (topLevelTypeInferenceError != null) {
         _result["topLevelTypeInferenceError"] =
             topLevelTypeInferenceError.toJson();
@@ -14893,19 +14712,17 @@
         "adjacentStrings_strings": adjacentStrings_strings,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     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,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.argumentList) {
@@ -14913,7 +14730,7 @@
         "argumentList_arguments": argumentList_arguments,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.asExpression) {
@@ -14923,7 +14740,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.assertInitializer) {
@@ -14932,7 +14749,7 @@
         "assertInitializer_message": assertInitializer_message,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.assertStatement) {
@@ -14941,7 +14758,7 @@
         "assertStatement_message": assertStatement_message,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.assignmentExpression) {
@@ -14949,13 +14766,11 @@
         "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,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.awaitExpression) {
@@ -14964,7 +14779,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.binaryExpression) {
@@ -14972,13 +14787,11 @@
         "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,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.block) {
@@ -14986,7 +14799,7 @@
         "block_statements": block_statements,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.blockFunctionBody) {
@@ -14994,15 +14807,16 @@
         "blockFunctionBody_block": blockFunctionBody_block,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.booleanLiteral) {
       return {
         "booleanLiteral_value": booleanLiteral_value,
+        "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.breakStatement) {
@@ -15010,7 +14824,7 @@
         "breakStatement_label": breakStatement_label,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.cascadeExpression) {
@@ -15020,7 +14834,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.catchClause) {
@@ -15031,7 +14845,7 @@
         "catchClause_stackTraceParameter": catchClause_stackTraceParameter,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.classDeclaration) {
@@ -15051,6 +14865,7 @@
         "kind": kind,
         "simplyBoundable_isSimplyBounded": simplyBoundable_isSimplyBounded,
         "name": name,
+        "resolution": resolution,
         "unused11": unused11,
       };
     }
@@ -15066,6 +14881,7 @@
         "kind": kind,
         "simplyBoundable_isSimplyBounded": simplyBoundable_isSimplyBounded,
         "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.comment) {
@@ -15075,7 +14891,7 @@
         "comment_type": comment_type,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.commentReference) {
@@ -15083,7 +14899,7 @@
         "commentReference_identifier": commentReference_identifier,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.compilationUnit) {
@@ -15096,7 +14912,7 @@
         "flags": flags,
         "informativeId": informativeId,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.conditionalExpression) {
@@ -15109,7 +14925,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.configuration) {
@@ -15119,7 +14935,7 @@
         "configuration_uri": configuration_uri,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.constructorDeclaration) {
@@ -15136,6 +14952,7 @@
         "informativeId": informativeId,
         "kind": kind,
         "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.constructorFieldInitializer) {
@@ -15146,18 +14963,16 @@
             constructorFieldInitializer_fieldName,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     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,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.continueStatement) {
@@ -15165,7 +14980,7 @@
         "continueStatement_label": continueStatement_label,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.declaredIdentifier) {
@@ -15175,11 +14990,12 @@
         "declaredIdentifier_type": declaredIdentifier_type,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.defaultFormalParameter) {
       return {
+        "actualType": actualType,
         "defaultFormalParameter_defaultValue":
             defaultFormalParameter_defaultValue,
         "defaultFormalParameter_parameter": defaultFormalParameter_parameter,
@@ -15187,7 +15003,7 @@
         "flags": flags,
         "informativeId": informativeId,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.doStatement) {
@@ -15196,7 +15012,7 @@
         "doStatement_condition": doStatement_condition,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.dottedName) {
@@ -15204,7 +15020,7 @@
         "dottedName_components": dottedName_components,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.doubleLiteral) {
@@ -15212,7 +15028,7 @@
         "doubleLiteral_value": doubleLiteral_value,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.emptyFunctionBody) {
@@ -15220,7 +15036,7 @@
         "emptyFunctionBody_fake": emptyFunctionBody_fake,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.emptyStatement) {
@@ -15228,7 +15044,7 @@
         "emptyStatement_fake": emptyStatement_fake,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.enumConstantDeclaration) {
@@ -15238,6 +15054,7 @@
         "informativeId": informativeId,
         "kind": kind,
         "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.enumDeclaration) {
@@ -15248,6 +15065,7 @@
         "informativeId": informativeId,
         "kind": kind,
         "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.exportDirective) {
@@ -15260,9 +15078,8 @@
         "informativeId": informativeId,
         "uriBasedDirective_uri": uriBasedDirective_uri,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
         "uriBasedDirective_uriContent": uriBasedDirective_uriContent,
-        "uriBasedDirective_uriElement": uriBasedDirective_uriElement,
       };
     }
     if (kind == idl.LinkedNodeKind.expressionFunctionBody) {
@@ -15270,7 +15087,7 @@
         "expressionFunctionBody_expression": expressionFunctionBody_expression,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.expressionStatement) {
@@ -15278,7 +15095,7 @@
         "expressionStatement_expression": expressionStatement_expression,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.extendsClause) {
@@ -15286,7 +15103,7 @@
         "extendsClause_superclass": extendsClause_superclass,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.extensionDeclaration) {
@@ -15301,6 +15118,7 @@
         "informativeId": informativeId,
         "kind": kind,
         "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.extensionOverride) {
@@ -15313,7 +15131,7 @@
             extensionOverride_typeArgumentTypes,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.fieldDeclaration) {
@@ -15323,7 +15141,7 @@
         "flags": flags,
         "informativeId": informativeId,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.fieldFormalParameter) {
@@ -15340,6 +15158,7 @@
         "informativeId": informativeId,
         "kind": kind,
         "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.forEachPartsWithDeclaration) {
@@ -15349,7 +15168,7 @@
             forEachPartsWithDeclaration_loopVariable,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.forEachPartsWithIdentifier) {
@@ -15359,7 +15178,7 @@
             forEachPartsWithIdentifier_identifier,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.forElement) {
@@ -15368,7 +15187,7 @@
         "forElement_body": forElement_body,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.forPartsWithDeclarations) {
@@ -15379,7 +15198,7 @@
         "forParts_updaters": forParts_updaters,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.forPartsWithExpression) {
@@ -15390,7 +15209,7 @@
         "forParts_updaters": forParts_updaters,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.forStatement) {
@@ -15399,7 +15218,7 @@
         "forStatement_body": forStatement_body,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.formalParameterList) {
@@ -15407,7 +15226,7 @@
         "formalParameterList_parameters": formalParameterList_parameters,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.functionDeclaration) {
@@ -15421,6 +15240,7 @@
         "informativeId": informativeId,
         "kind": kind,
         "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.functionDeclarationStatement) {
@@ -15429,7 +15249,7 @@
             functionDeclarationStatement_functionDeclaration,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.functionExpression) {
@@ -15441,7 +15261,7 @@
         "functionExpression_typeParameters": functionExpression_typeParameters,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.functionExpressionInvocation) {
@@ -15455,7 +15275,7 @@
         "flags": flags,
         "invocationExpression_arguments": invocationExpression_arguments,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.functionTypeAlias) {
@@ -15472,6 +15292,7 @@
         "kind": kind,
         "simplyBoundable_isSimplyBounded": simplyBoundable_isSimplyBounded,
         "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.functionTypedFormalParameter) {
@@ -15489,6 +15310,7 @@
         "informativeId": informativeId,
         "kind": kind,
         "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.genericFunctionType) {
@@ -15497,13 +15319,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,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.genericTypeAlias) {
@@ -15517,6 +15339,7 @@
         "kind": kind,
         "simplyBoundable_isSimplyBounded": simplyBoundable_isSimplyBounded,
         "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.hideCombinator) {
@@ -15525,7 +15348,7 @@
         "informativeId": informativeId,
         "kind": kind,
         "names": names,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.ifElement) {
@@ -15535,7 +15358,7 @@
         "ifElement_elseElement": ifElement_elseElement,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.ifStatement) {
@@ -15545,7 +15368,7 @@
         "ifStatement_thenStatement": ifStatement_thenStatement,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.implementsClause) {
@@ -15553,7 +15376,7 @@
         "implementsClause_interfaces": implementsClause_interfaces,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.importDirective) {
@@ -15567,21 +15390,18 @@
         "informativeId": informativeId,
         "uriBasedDirective_uri": uriBasedDirective_uri,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
         "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,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.instanceCreationExpression) {
@@ -15595,7 +15415,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.integerLiteral) {
@@ -15604,7 +15424,7 @@
         "flags": flags,
         "integerLiteral_value": integerLiteral_value,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.interpolationExpression) {
@@ -15613,7 +15433,7 @@
             interpolationExpression_expression,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.interpolationString) {
@@ -15621,7 +15441,7 @@
         "flags": flags,
         "interpolationString_value": interpolationString_value,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.isExpression) {
@@ -15630,7 +15450,7 @@
         "isExpression_type": isExpression_type,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.label) {
@@ -15638,7 +15458,7 @@
         "label_label": label_label,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.labeledStatement) {
@@ -15647,7 +15467,7 @@
         "labeledStatement_statement": labeledStatement_statement,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.libraryDirective) {
@@ -15657,7 +15477,7 @@
         "flags": flags,
         "informativeId": informativeId,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.libraryIdentifier) {
@@ -15665,7 +15485,7 @@
         "libraryIdentifier_components": libraryIdentifier_components,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.listLiteral) {
@@ -15675,7 +15495,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.mapLiteralEntry) {
@@ -15684,7 +15504,7 @@
         "mapLiteralEntry_value": mapLiteralEntry_value,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.methodDeclaration) {
@@ -15702,6 +15522,7 @@
         "methodDeclaration_hasOperatorEqualWithParameterTypeFromObject":
             methodDeclaration_hasOperatorEqualWithParameterTypeFromObject,
         "name": name,
+        "resolution": resolution,
         "topLevelTypeInferenceError": topLevelTypeInferenceError,
       };
     }
@@ -15716,7 +15537,7 @@
         "flags": flags,
         "invocationExpression_arguments": invocationExpression_arguments,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.mixinDeclaration) {
@@ -15735,6 +15556,7 @@
         "mixinDeclaration_superInvokedNames":
             mixinDeclaration_superInvokedNames,
         "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.namedExpression) {
@@ -15743,7 +15565,7 @@
         "namedExpression_name": namedExpression_name,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.nativeClause) {
@@ -15751,7 +15573,7 @@
         "nativeClause_name": nativeClause_name,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.nativeFunctionBody) {
@@ -15759,7 +15581,7 @@
         "nativeFunctionBody_stringLiteral": nativeFunctionBody_stringLiteral,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.nullLiteral) {
@@ -15768,7 +15590,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.onClause) {
@@ -15776,7 +15598,7 @@
         "onClause_superclassConstraints": onClause_superclassConstraints,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.parenthesizedExpression) {
@@ -15786,7 +15608,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.partDirective) {
@@ -15796,9 +15618,8 @@
         "informativeId": informativeId,
         "uriBasedDirective_uri": uriBasedDirective_uri,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
         "uriBasedDirective_uriContent": uriBasedDirective_uriContent,
-        "uriBasedDirective_uriElement": uriBasedDirective_uriElement,
       };
     }
     if (kind == idl.LinkedNodeKind.partOfDirective) {
@@ -15809,31 +15630,27 @@
         "flags": flags,
         "informativeId": informativeId,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     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,
-        "name": name,
+        "resolution": resolution,
       };
     }
     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,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.prefixedIdentifier) {
@@ -15843,7 +15660,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.propertyAccess) {
@@ -15854,7 +15671,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.redirectingConstructorInvocation) {
@@ -15863,13 +15680,9 @@
             redirectingConstructorInvocation_arguments,
         "redirectingConstructorInvocation_constructorName":
             redirectingConstructorInvocation_constructorName,
-        "redirectingConstructorInvocation_substitution":
-            redirectingConstructorInvocation_substitution,
-        "redirectingConstructorInvocation_element":
-            redirectingConstructorInvocation_element,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.rethrowExpression) {
@@ -15877,7 +15690,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.returnStatement) {
@@ -15885,7 +15698,7 @@
         "returnStatement_expression": returnStatement_expression,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.setOrMapLiteral) {
@@ -15895,7 +15708,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.showCombinator) {
@@ -15904,7 +15717,7 @@
         "informativeId": informativeId,
         "kind": kind,
         "names": names,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.simpleFormalParameter) {
@@ -15917,17 +15730,16 @@
         "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) {
@@ -15935,7 +15747,7 @@
         "simpleStringLiteral_value": simpleStringLiteral_value,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.spreadElement) {
@@ -15943,7 +15755,7 @@
         "spreadElement_expression": spreadElement_expression,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
         "spreadElement_spreadOperator": spreadElement_spreadOperator,
       };
     }
@@ -15952,7 +15764,7 @@
         "stringInterpolation_elements": stringInterpolation_elements,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.superConstructorInvocation) {
@@ -15961,13 +15773,9 @@
             superConstructorInvocation_arguments,
         "superConstructorInvocation_constructorName":
             superConstructorInvocation_constructorName,
-        "superConstructorInvocation_substitution":
-            superConstructorInvocation_substitution,
-        "superConstructorInvocation_element":
-            superConstructorInvocation_element,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.superExpression) {
@@ -15975,7 +15783,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.switchCase) {
@@ -15985,7 +15793,7 @@
         "switchMember_labels": switchMember_labels,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.switchDefault) {
@@ -15994,7 +15802,7 @@
         "switchMember_labels": switchMember_labels,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.switchStatement) {
@@ -16003,7 +15811,7 @@
         "switchStatement_expression": switchStatement_expression,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.symbolLiteral) {
@@ -16012,7 +15820,7 @@
         "flags": flags,
         "kind": kind,
         "names": names,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.thisExpression) {
@@ -16020,7 +15828,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.throwExpression) {
@@ -16029,7 +15837,7 @@
         "expression_type": expression_type,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.topLevelVariableDeclaration) {
@@ -16040,7 +15848,7 @@
         "flags": flags,
         "informativeId": informativeId,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.tryStatement) {
@@ -16050,7 +15858,7 @@
         "tryStatement_finallyBlock": tryStatement_finallyBlock,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.typeArgumentList) {
@@ -16058,7 +15866,7 @@
         "typeArgumentList_arguments": typeArgumentList_arguments,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.typeName) {
@@ -16067,7 +15875,7 @@
         "typeName_name": typeName_name,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
         "typeName_type": typeName_type,
       };
     }
@@ -16080,6 +15888,7 @@
         "informativeId": informativeId,
         "kind": kind,
         "name": name,
+        "resolution": resolution,
         "typeParameter_defaultType": typeParameter_defaultType,
       };
     }
@@ -16088,7 +15897,7 @@
         "typeParameterList_typeParameters": typeParameterList_typeParameters,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.variableDeclaration) {
@@ -16101,6 +15910,7 @@
         "informativeId": informativeId,
         "kind": kind,
         "name": name,
+        "resolution": resolution,
         "topLevelTypeInferenceError": topLevelTypeInferenceError,
       };
     }
@@ -16112,7 +15922,7 @@
         "flags": flags,
         "informativeId": informativeId,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.variableDeclarationStatement) {
@@ -16121,7 +15931,7 @@
             variableDeclarationStatement_variables,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.whileStatement) {
@@ -16130,7 +15940,7 @@
         "whileStatement_condition": whileStatement_condition,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.withClause) {
@@ -16138,7 +15948,7 @@
         "withClause_mixinTypes": withClause_mixinTypes,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     if (kind == idl.LinkedNodeKind.yieldStatement) {
@@ -16146,7 +15956,7 @@
         "yieldStatement_expression": yieldStatement_expression,
         "flags": flags,
         "kind": kind,
-        "name": name,
+        "resolution": resolution,
       };
     }
     throw StateError("Unexpected $kind");
@@ -16661,6 +16471,179 @@
   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 {
@@ -16673,7 +16656,6 @@
   List<LinkedNodeTypeBuilder> _interfaceTypeArguments;
   idl.LinkedNodeTypeKind _kind;
   idl.EntityRefNullabilitySuffix _nullabilitySuffix;
-  int _typeParameterElement;
   int _typeParameterId;
 
   @override
@@ -16750,14 +16732,6 @@
   }
 
   @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) {
@@ -16775,7 +16749,6 @@
       List<LinkedNodeTypeBuilder> interfaceTypeArguments,
       idl.LinkedNodeTypeKind kind,
       idl.EntityRefNullabilitySuffix nullabilitySuffix,
-      int typeParameterElement,
       int typeParameterId})
       : _functionFormalParameters = functionFormalParameters,
         _functionReturnType = functionReturnType,
@@ -16786,7 +16759,6 @@
         _interfaceTypeArguments = interfaceTypeArguments,
         _kind = kind,
         _nullabilitySuffix = nullabilitySuffix,
-        _typeParameterElement = typeParameterElement,
         _typeParameterId = typeParameterId;
 
   /// Flush [informative] data recursively.
@@ -16828,7 +16800,6 @@
       }
     }
     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);
@@ -16880,10 +16851,10 @@
       fbBuilder.addOffset(1, offset_functionReturnType);
     }
     if (_functionTypedef != null && _functionTypedef != 0) {
-      fbBuilder.addUint32(9, _functionTypedef);
+      fbBuilder.addUint32(8, _functionTypedef);
     }
     if (offset_functionTypedefTypeArguments != null) {
-      fbBuilder.addOffset(10, offset_functionTypedefTypeArguments);
+      fbBuilder.addOffset(9, offset_functionTypedefTypeArguments);
     }
     if (offset_functionTypeParameters != null) {
       fbBuilder.addOffset(2, offset_functionTypeParameters);
@@ -16899,13 +16870,10 @@
     }
     if (_nullabilitySuffix != null &&
         _nullabilitySuffix != idl.EntityRefNullabilitySuffix.starOrIrrelevant) {
-      fbBuilder.addUint8(8, _nullabilitySuffix.index);
-    }
-    if (_typeParameterElement != null && _typeParameterElement != 0) {
-      fbBuilder.addUint32(6, _typeParameterElement);
+      fbBuilder.addUint8(7, _nullabilitySuffix.index);
     }
     if (_typeParameterId != null && _typeParameterId != 0) {
-      fbBuilder.addUint32(7, _typeParameterId);
+      fbBuilder.addUint32(6, _typeParameterId);
     }
     return fbBuilder.endTable();
   }
@@ -16936,7 +16904,6 @@
   List<idl.LinkedNodeType> _interfaceTypeArguments;
   idl.LinkedNodeTypeKind _kind;
   idl.EntityRefNullabilitySuffix _nullabilitySuffix;
-  int _typeParameterElement;
   int _typeParameterId;
 
   @override
@@ -16959,7 +16926,7 @@
   @override
   int get functionTypedef {
     _functionTypedef ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 9, 0);
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 8, 0);
     return _functionTypedef;
   }
 
@@ -16967,7 +16934,7 @@
   List<idl.LinkedNodeType> get functionTypedefTypeArguments {
     _functionTypedefTypeArguments ??=
         const fb.ListReader<idl.LinkedNodeType>(_LinkedNodeTypeReader())
-            .vTableGet(_bc, _bcOffset, 10, const <idl.LinkedNodeType>[]);
+            .vTableGet(_bc, _bcOffset, 9, const <idl.LinkedNodeType>[]);
     return _functionTypedefTypeArguments;
   }
 
@@ -17005,21 +16972,14 @@
   @override
   idl.EntityRefNullabilitySuffix get nullabilitySuffix {
     _nullabilitySuffix ??= const _EntityRefNullabilitySuffixReader().vTableGet(
-        _bc, _bcOffset, 8, idl.EntityRefNullabilitySuffix.starOrIrrelevant);
+        _bc, _bcOffset, 7, 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, 7, 0);
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 6, 0);
     return _typeParameterId;
   }
 }
@@ -17060,9 +17020,6 @@
     if (nullabilitySuffix != idl.EntityRefNullabilitySuffix.starOrIrrelevant) {
       _result["nullabilitySuffix"] = nullabilitySuffix.toString().split('.')[1];
     }
-    if (typeParameterElement != 0) {
-      _result["typeParameterElement"] = typeParameterElement;
-    }
     if (typeParameterId != 0) {
       _result["typeParameterId"] = typeParameterId;
     }
@@ -17080,7 +17037,6 @@
         "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 e9c6fe6..b20e97d 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -422,6 +422,8 @@
 
   never,
 
+  null_,
+
   typeParameter,
 
   void_
@@ -1088,14 +1090,8 @@
 
   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);
@@ -1114,10 +1110,10 @@
 
   variantField_3:[LinkedNode] (id: 3);
 
-  variantField_41:[uint] (id: 41);
+  variantField_19:[uint] (id: 19);
 
   /// The language version information.
-  variantField_40:LinkedLibraryLanguageVersion (id: 40);
+  variantField_39:LinkedLibraryLanguageVersion (id: 39);
 
   variantField_10:LinkedNode (id: 10);
 
@@ -1125,14 +1121,18 @@
 
   variantField_21:double (id: 21);
 
+  variantField_15:uint (id: 15);
+
   variantField_25:LinkedNodeType (id: 25);
 
   variantField_20:string (id: 20);
 
-  variantField_39:[LinkedNodeType] (id: 39);
+  variantField_38:[LinkedNodeType] (id: 38);
 
   flags:uint (id: 18);
 
+  variantField_17:uint (id: 17);
+
   variantField_1:string (id: 1);
 
   variantField_36:uint (id: 36);
@@ -1149,7 +1149,9 @@
 
   variantField_34:[string] (id: 34);
 
-  name:string (id: 37);
+  variantField_37:string (id: 37);
+
+  resolution:LinkedNodeResolution (id: 40);
 
   variantField_35:UnlinkedTokenType (id: 35);
 
@@ -1160,8 +1162,6 @@
   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,6 +1195,17 @@
   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);
@@ -1202,9 +1213,9 @@
   functionReturnType:LinkedNodeType (id: 1);
 
   /// The typedef this function type is created for.
-  functionTypedef:uint (id: 9);
+  functionTypedef:uint (id: 8);
 
-  functionTypedefTypeArguments:[LinkedNodeType] (id: 10);
+  functionTypedefTypeArguments:[LinkedNodeType] (id: 9);
 
   functionTypeParameters:[LinkedNodeTypeTypeParameter] (id: 2);
 
@@ -1215,11 +1226,9 @@
 
   kind:LinkedNodeTypeKind (id: 5);
 
-  nullabilitySuffix:EntityRefNullabilitySuffix (id: 8);
+  nullabilitySuffix:EntityRefNullabilitySuffix (id: 7);
 
-  typeParameterElement:uint (id: 6);
-
-  typeParameterId:uint (id: 7);
+  typeParameterId:uint (id: 6);
 }
 
 /// 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 4b84de9..b8d7f63 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -666,6 +666,7 @@
 
   /// The explicit or inferred type of a variable.
   @VariantId(24, variantList: [
+    LinkedNodeKind.defaultFormalParameter,
     LinkedNodeKind.fieldFormalParameter,
     LinkedNodeKind.functionTypedFormalParameter,
     LinkedNodeKind.simpleFormalParameter,
@@ -708,15 +709,9 @@
   @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;
 
@@ -738,9 +733,6 @@
   @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;
 
@@ -750,15 +742,9 @@
   @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;
 
@@ -771,9 +757,6 @@
   @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;
 
@@ -864,11 +847,11 @@
   @VariantId(3, variant: LinkedNodeKind.compilationUnit)
   List<LinkedNode> get compilationUnit_directives;
 
-  @VariantId(41, variant: LinkedNodeKind.compilationUnit)
+  @VariantId(19, variant: LinkedNodeKind.compilationUnit)
   List<int> get compilationUnit_featureSet;
 
   /// The language version information.
-  @VariantId(40, variant: LinkedNodeKind.compilationUnit)
+  @VariantId(39, variant: LinkedNodeKind.compilationUnit)
   LinkedLibraryLanguageVersion get compilationUnit_languageVersion;
 
   @VariantId(6, variant: LinkedNodeKind.compilationUnit)
@@ -913,15 +896,9 @@
   @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;
 
@@ -969,6 +946,7 @@
     LinkedNodeKind.asExpression,
     LinkedNodeKind.awaitExpression,
     LinkedNodeKind.binaryExpression,
+    LinkedNodeKind.booleanLiteral,
     LinkedNodeKind.cascadeExpression,
     LinkedNodeKind.conditionalExpression,
     LinkedNodeKind.functionExpressionInvocation,
@@ -985,7 +963,6 @@
     LinkedNodeKind.postfixExpression,
     LinkedNodeKind.rethrowExpression,
     LinkedNodeKind.setOrMapLiteral,
-    LinkedNodeKind.simpleIdentifier,
     LinkedNodeKind.superExpression,
     LinkedNodeKind.symbolLiteral,
     LinkedNodeKind.thisExpression,
@@ -1026,7 +1003,7 @@
   @VariantId(8, variant: LinkedNodeKind.extensionOverride)
   LinkedNode get extensionOverride_typeArguments;
 
-  @VariantId(39, variant: LinkedNodeKind.extensionOverride)
+  @VariantId(38, variant: LinkedNodeKind.extensionOverride)
   List<LinkedNodeType> get extensionOverride_typeArgumentTypes;
 
   @VariantId(6, variant: LinkedNodeKind.fieldDeclaration)
@@ -1173,15 +1150,9 @@
   @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;
 
@@ -1323,7 +1294,25 @@
   @VariantId(34, variant: LinkedNodeKind.mixinDeclaration)
   List<String> get mixinDeclaration_superInvokedNames;
 
-  @Id(37)
+  @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,
+  ])
   String get name;
 
   @VariantId(6, variant: LinkedNodeKind.namedExpression)
@@ -1385,36 +1374,24 @@
   @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;
 
@@ -1430,11 +1407,8 @@
   @VariantId(7, variant: LinkedNodeKind.redirectingConstructorInvocation)
   LinkedNode get redirectingConstructorInvocation_constructorName;
 
-  @VariantId(15, variant: LinkedNodeKind.redirectingConstructorInvocation)
-  int get redirectingConstructorInvocation_element;
-
-  @VariantId(38, variant: LinkedNodeKind.redirectingConstructorInvocation)
-  LinkedNodeTypeSubstitution get redirectingConstructorInvocation_substitution;
+  @Id(40)
+  LinkedNodeResolution get resolution;
 
   @VariantId(6, variant: LinkedNodeKind.returnStatement)
   LinkedNode get returnStatement_expression;
@@ -1445,12 +1419,6 @@
   @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;
 
@@ -1478,12 +1446,6 @@
   @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;
 
@@ -1582,13 +1544,6 @@
   ])
   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;
 
@@ -1793,6 +1748,20 @@
   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)
@@ -1802,10 +1771,10 @@
   LinkedNodeType get functionReturnType;
 
   /// The typedef this function type is created for.
-  @Id(9)
+  @Id(8)
   int get functionTypedef;
 
-  @Id(10)
+  @Id(9)
   List<LinkedNodeType> get functionTypedefTypeArguments;
 
   @Id(2)
@@ -1821,13 +1790,10 @@
   @Id(5)
   LinkedNodeTypeKind get kind;
 
-  @Id(8)
+  @Id(7)
   EntityRefNullabilitySuffix get nullabilitySuffix;
 
   @Id(6)
-  int get typeParameterElement;
-
-  @Id(7)
   int get typeParameterId;
 }
 
@@ -1849,6 +1815,7 @@
   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
new file mode 100644
index 0000000..e24a642
--- /dev/null
+++ b/pkg/analyzer/lib/src/summary2/apply_resolution.dart
@@ -0,0 +1,852 @@
+// 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 beac780..65d0148 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart
@@ -75,6 +75,11 @@
     TypeName,
   );
 
+  static final _hasType = _checkBit(
+    1,
+    SimpleIdentifier,
+  );
+
   static final _isAbstract = _checkBit(
     1,
     ClassDeclaration,
@@ -237,6 +242,7 @@
     bool hasSeparatorColon = false,
     bool hasSeparatorEquals = false,
     bool hasThis = false,
+    bool hasType = false,
     bool hasTypeArguments = false,
     bool isAbstract = false,
     bool isAsync = false,
@@ -298,6 +304,9 @@
     if (hasThis) {
       result |= _hasThis;
     }
+    if (hasType) {
+      result |= _hasType;
+    }
     if (hasTypeArguments) {
       result |= _hasTypeArguments;
     }
@@ -423,6 +432,10 @@
     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 4df499f..3dda72c 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -5,13 +5,9 @@
 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';
@@ -37,25 +33,8 @@
   /// 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 {
@@ -65,10 +44,6 @@
     }
   }
 
-  DartType readType(LinkedNodeType data) {
-    return _readType(data);
-  }
-
   Token _combinatorKeyword(LinkedNode data, Keyword keyword, Token def) {
     var informativeData = _unitContext.getInformativeData(data);
     if (informativeData != null) {
@@ -96,40 +71,10 @@
     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) {
-    var node = astFactory.adjacentStrings(
+    return astFactory.adjacentStrings(
       _readNodeList(data.adjacentStrings_strings),
     );
-    if (!_isReadingDirective) {
-      node.staticType = _stringType;
-    }
-    return node;
   }
 
   Annotation _read_annotation(LinkedNode data) {
@@ -139,10 +84,7 @@
       _Tokens.PERIOD,
       _readNode(data.annotation_constructorName),
       _readNode(data.annotation_arguments),
-    )..element = _elementOfComponents(
-        data.annotation_element,
-        data.annotation_substitution,
-      );
+    );
   }
 
   ArgumentList _read_argumentList(LinkedNode data) {
@@ -158,7 +100,7 @@
       _readNode(data.asExpression_expression),
       _Tokens.AS,
       _readNode(data.asExpression_type),
-    )..staticType = _readType(data.expression_type);
+    );
   }
 
   AssertInitializer _read_assertInitializer(LinkedNode data) {
@@ -189,19 +131,14 @@
       _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) {
@@ -209,12 +146,7 @@
       _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) {
@@ -244,8 +176,7 @@
   }
 
   BooleanLiteral _read_booleanLiteral(LinkedNode data) {
-    return AstTestFactory.booleanLiteral(data.booleanLiteral_value)
-      ..staticType = _boolType;
+    return AstTestFactory.booleanLiteral(data.booleanLiteral_value);
   }
 
   BreakStatement _read_breakStatement(LinkedNode data) {
@@ -260,7 +191,7 @@
     return astFactory.cascadeExpression(
       _readNode(data.cascadeExpression_target),
       _readNodeList(data.cascadeExpression_sections),
-    )..staticType = _readType(data.expression_type);
+    );
   }
 
   CatchClause _read_catchClause(LinkedNode data) {
@@ -285,20 +216,20 @@
     try {
       var node = astFactory.classDeclaration(
         _readDocumentationComment(data),
-        _readNodeListLazy(data.annotatedNode_metadata),
+        _readNodeList(data.annotatedNode_metadata),
         AstBinaryFlags.isAbstract(data.flags) ? _Tokens.ABSTRACT : null,
         _Tokens.CLASS,
         _declaredIdentifier(data),
         _readNode(data.classOrMixinDeclaration_typeParameters),
-        _readNodeLazy(data.classDeclaration_extendsClause),
-        _readNodeLazy(data.classDeclaration_withClause),
-        _readNodeLazy(data.classOrMixinDeclaration_implementsClause),
+        _readNode(data.classDeclaration_extendsClause),
+        _readNode(data.classDeclaration_withClause),
+        _readNode(data.classOrMixinDeclaration_implementsClause),
         _Tokens.OPEN_CURLY_BRACKET,
         _readNodeListLazy(data.classOrMixinDeclaration_members),
         _Tokens.CLOSE_CURLY_BRACKET,
       );
-      node.nativeClause = _readNodeLazy(data.classDeclaration_nativeClause);
-      LazyClassDeclaration.setData(node, data);
+      node.nativeClause = _readNode(data.classDeclaration_nativeClause);
+      LazyClassDeclaration.setData(_unitContext, data, node);
       return node;
     } finally {
       timerAstBinaryReaderClass.stop();
@@ -310,18 +241,18 @@
     try {
       var node = astFactory.classTypeAlias(
         _readDocumentationComment(data),
-        _readNodeListLazy(data.annotatedNode_metadata),
+        _readNodeList(data.annotatedNode_metadata),
         _Tokens.CLASS,
         _declaredIdentifier(data),
         _readNode(data.classTypeAlias_typeParameters),
         _Tokens.EQ,
         AstBinaryFlags.isAbstract(data.flags) ? _Tokens.ABSTRACT : null,
-        _readNodeLazy(data.classTypeAlias_superclass),
-        _readNodeLazy(data.classTypeAlias_withClause),
-        _readNodeLazy(data.classTypeAlias_implementsClause),
+        _readNode(data.classTypeAlias_superclass),
+        _readNode(data.classTypeAlias_withClause),
+        _readNode(data.classTypeAlias_implementsClause),
         _Tokens.SEMICOLON,
       );
-      LazyClassTypeAlias.setData(node, data);
+      LazyClassTypeAlias.setData(_unitContext, data, node);
       return node;
     } finally {
       timerAstBinaryReaderClass.stop();
@@ -380,7 +311,7 @@
       _readNode(data.conditionalExpression_thenExpression),
       _Tokens.COLON,
       _readNode(data.conditionalExpression_elseExpression),
-    )..staticType = _readType(data.expression_type);
+    );
   }
 
   Configuration _read_configuration(LinkedNode data) {
@@ -416,25 +347,25 @@
 
     var node = astFactory.constructorDeclaration(
       _readDocumentationComment(data),
-      _readNodeListLazy(data.annotatedNode_metadata),
+      _readNodeList(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,
-      _readNodeLazy(data.constructorDeclaration_parameters),
+      _readNode(data.constructorDeclaration_parameters),
       _Tokens.choose(
         AstBinaryFlags.hasSeparatorColon(data.flags),
         _Tokens.COLON,
         AstBinaryFlags.hasSeparatorEquals(data.flags),
         _Tokens.EQ,
       ),
-      _readNodeListLazy(data.constructorDeclaration_initializers),
-      _readNodeLazy(data.constructorDeclaration_redirectedConstructor),
-      _readNodeLazy(data.constructorDeclaration_body),
+      _readNodeList(data.constructorDeclaration_initializers),
+      _readNode(data.constructorDeclaration_redirectedConstructor),
+      _readNode(data.constructorDeclaration_body),
     );
-    LazyConstructorDeclaration.setData(node, data);
+    LazyConstructorDeclaration.setData(_unitContext, data, node);
     return node;
   }
 
@@ -455,10 +386,7 @@
       _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) {
@@ -491,7 +419,7 @@
       _readNode(data.defaultFormalParameter_parameter),
       _toParameterKind(data.defaultFormalParameter_kind),
       data.defaultFormalParameter_defaultValue != null ? _Tokens.COLON : null,
-      _readNodeLazy(data.defaultFormalParameter_defaultValue),
+      _readNode(data.defaultFormalParameter_defaultValue),
     );
     LazyFormalParameter.setData(node, data);
     return node;
@@ -516,8 +444,7 @@
   }
 
   DoubleLiteral _read_doubleLiteral(LinkedNode data) {
-    return AstTestFactory.doubleLiteral(data.doubleLiteral_value)
-      ..staticType = _doubleType;
+    return AstTestFactory.doubleLiteral(data.doubleLiteral_value);
   }
 
   EmptyFunctionBody _read_emptyFunctionBody(LinkedNode data) {
@@ -535,7 +462,7 @@
   EnumConstantDeclaration _read_enumConstantDeclaration(LinkedNode data) {
     var node = astFactory.enumConstantDeclaration(
       _readDocumentationComment(data),
-      _readNodeListLazy(data.annotatedNode_metadata),
+      _readNodeList(data.annotatedNode_metadata),
       _declaredIdentifier(data),
     );
     LazyEnumConstantDeclaration.setData(node, data);
@@ -545,34 +472,32 @@
   EnumDeclaration _read_enumDeclaration(LinkedNode data) {
     var node = astFactory.enumDeclaration(
       _readDocumentationComment(data),
-      _readNodeListLazy(data.annotatedNode_metadata),
+      _readNodeList(data.annotatedNode_metadata),
       _Tokens.ENUM,
       _declaredIdentifier(data),
       _Tokens.OPEN_CURLY_BRACKET,
-      _readNodeListLazy(data.enumDeclaration_constants),
+      _readNodeList(data.enumDeclaration_constants),
       _Tokens.CLOSE_CURLY_BRACKET,
     );
-    LazyEnumDeclaration.setData(node, data);
+    LazyEnumDeclaration.setData(_unitContext, data, node);
     return node;
   }
 
   ExportDirective _read_exportDirective(LinkedNode data) {
     timerAstBinaryReaderDirective.start();
-    _isReadingDirective = true;
     try {
       var node = astFactory.exportDirective(
         _readDocumentationComment(data),
-        _readNodeListLazy(data.annotatedNode_metadata),
+        _readNodeList(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(node, data);
+      LazyDirective.setData(_unitContext, data, node);
       return node;
     } finally {
-      _isReadingDirective = false;
       timerAstBinaryReaderDirective.stop();
     }
   }
@@ -615,17 +540,17 @@
     try {
       var node = astFactory.extensionDeclaration(
         comment: _readDocumentationComment(data),
-        metadata: _readNodeListLazy(data.annotatedNode_metadata),
+        metadata: _readNodeList(data.annotatedNode_metadata),
         extensionKeyword: _Tokens.EXTENSION,
         name: data.name.isNotEmpty ? _declaredIdentifier(data) : null,
         typeParameters: _readNode(data.extensionDeclaration_typeParameters),
         onKeyword: _Tokens.ON,
-        extendedType: _readNodeLazy(data.extensionDeclaration_extendedType),
+        extendedType: _readNode(data.extensionDeclaration_extendedType),
         leftBracket: _Tokens.OPEN_CURLY_BRACKET,
-        members: _readNodeListLazy(data.extensionDeclaration_members),
+        members: _readNodeList(data.extensionDeclaration_members),
         rightBracket: _Tokens.CLOSE_CURLY_BRACKET,
       );
-      LazyExtensionDeclaration(node, data);
+      LazyExtensionDeclaration(_unitContext, data, node);
       return node;
     } finally {
       timerAstBinaryReaderClass.stop();
@@ -644,9 +569,6 @@
       ),
       typeArguments: _readNode(data.extensionOverride_typeArguments),
     ) as ExtensionOverrideImpl;
-    node.extendedType = _readType(data.extensionOverride_extendedType);
-    node.typeArgumentTypes =
-        data.extensionOverride_typeArgumentTypes.map(_readType).toList();
     return node;
   }
 
@@ -660,12 +582,12 @@
       externalKeyword:
           AstBinaryFlags.isExternal(data.flags) ? _Tokens.EXTERNAL : null,
       fieldList: _readNode(data.fieldDeclaration_fields),
-      metadata: _readNodeListLazy(data.annotatedNode_metadata),
+      metadata: _readNodeList(data.annotatedNode_metadata),
       semicolon: _Tokens.SEMICOLON,
       staticKeyword:
           AstBinaryFlags.isStatic(data.flags) ? _Tokens.STATIC : null,
     );
-    LazyFieldDeclaration.setData(node, data);
+    LazyFieldDeclaration.setData(_unitContext, data, node);
     return node;
   }
 
@@ -687,8 +609,8 @@
       ),
       metadata: _readNodeList(data.normalFormalParameter_metadata),
       comment: _readDocumentationComment(data),
-      type: _readNodeLazy(data.fieldFormalParameter_type),
-      parameters: _readNodeLazy(data.fieldFormalParameter_formalParameters),
+      type: _readNode(data.fieldFormalParameter_type),
+      parameters: _readNode(data.fieldFormalParameter_formalParameters),
       question:
           AstBinaryFlags.hasQuestion(data.flags) ? _Tokens.QUESTION : null,
       requiredKeyword:
@@ -782,9 +704,9 @@
     try {
       var node = astFactory.functionDeclaration(
         _readDocumentationComment(data),
-        _readNodeListLazy(data.annotatedNode_metadata),
+        _readNodeList(data.annotatedNode_metadata),
         AstBinaryFlags.isExternal(data.flags) ? _Tokens.EXTERNAL : null,
-        _readNodeLazy(data.functionDeclaration_returnType),
+        _readNode(data.functionDeclaration_returnType),
         _Tokens.choose(
           AstBinaryFlags.isGet(data.flags),
           _Tokens.GET,
@@ -792,9 +714,9 @@
           _Tokens.SET,
         ),
         _declaredIdentifier(data),
-        _readNodeLazy(data.functionDeclaration_functionExpression),
+        _readNode(data.functionDeclaration_functionExpression),
       );
-      LazyFunctionDeclaration.setData(node, data);
+      LazyFunctionDeclaration.setData(_unitContext, data, node);
       return node;
     } finally {
       timerAstBinaryReaderFunctionDeclaration.stop();
@@ -811,8 +733,8 @@
   FunctionExpression _read_functionExpression(LinkedNode data) {
     var node = astFactory.functionExpression(
       _readNode(data.functionExpression_typeParameters),
-      _readNodeLazy(data.functionExpression_formalParameters),
-      _readNodeLazy(data.functionExpression_body),
+      _readNode(data.functionExpression_formalParameters),
+      _readNode(data.functionExpression_body),
     );
     LazyFunctionExpression.setData(node, data);
     return node;
@@ -824,21 +746,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),
-      _readNodeListLazy(data.annotatedNode_metadata),
+      _readNodeList(data.annotatedNode_metadata),
       _Tokens.TYPEDEF,
-      _readNodeLazy(data.functionTypeAlias_returnType),
+      _readNode(data.functionTypeAlias_returnType),
       _declaredIdentifier(data),
       _readNode(data.functionTypeAlias_typeParameters),
-      _readNodeLazy(data.functionTypeAlias_formalParameters),
+      _readNode(data.functionTypeAlias_formalParameters),
       _Tokens.SEMICOLON,
     );
-    LazyFunctionTypeAlias.setData(node, data);
+    LazyFunctionTypeAlias.setData(_unitContext, data, node);
     LazyFunctionTypeAlias.setHasSelfReference(
       node,
       data.typeAlias_hasSelfReference,
@@ -853,13 +775,13 @@
       covariantKeyword:
           AstBinaryFlags.isCovariant(data.flags) ? _Tokens.COVARIANT : null,
       identifier: _declaredIdentifier(data),
-      metadata: _readNodeListLazy(data.normalFormalParameter_metadata),
-      parameters: _readNodeLazy(
+      metadata: _readNodeList(data.normalFormalParameter_metadata),
+      parameters: _readNode(
         data.functionTypedFormalParameter_formalParameters,
       ),
       requiredKeyword:
           AstBinaryFlags.isRequired(data.flags) ? _Tokens.REQUIRED : null,
-      returnType: _readNodeLazy(data.functionTypedFormalParameter_returnType),
+      returnType: _readNode(data.functionTypedFormalParameter_returnType),
       typeParameters: _readNode(
         data.functionTypedFormalParameter_typeParameters,
       ),
@@ -869,73 +791,32 @@
   }
 
   GenericFunctionType _read_genericFunctionType(LinkedNode data) {
-    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,
+    return astFactory.genericFunctionType(
+      readNode(data.genericFunctionType_returnType),
       _Tokens.FUNCTION,
-      typeParameterList,
-      null,
+      _readNode(data.genericFunctionType_typeParameters),
+      _readNode(data.genericFunctionType_formalParameters),
       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),
-      _readNodeListLazy(data.annotatedNode_metadata),
+      _readNodeList(data.annotatedNode_metadata),
       _Tokens.TYPEDEF,
       _declaredIdentifier(data),
       _readNode(data.genericTypeAlias_typeParameters),
       _Tokens.EQ,
-      _readNodeLazy(data.genericTypeAlias_functionType),
+      _readNode(data.genericTypeAlias_functionType),
       _Tokens.SEMICOLON,
     );
-    LazyGenericTypeAlias.setData(node, data);
+    LazyGenericTypeAlias.setData(
+      _unitContext,
+      data,
+      node,
+    );
     LazyGenericTypeAlias.setHasSelfReference(
       node,
       data.typeAlias_hasSelfReference,
@@ -987,7 +868,6 @@
 
   ImportDirective _read_importDirective(LinkedNode data) {
     timerAstBinaryReaderDirective.start();
-    _isReadingDirective = true;
     try {
       SimpleIdentifier prefix;
       if (data.importDirective_prefix.isNotEmpty) {
@@ -1002,7 +882,7 @@
 
       var node = astFactory.importDirective(
         _readDocumentationComment(data),
-        _readNodeListLazy(data.annotatedNode_metadata),
+        _readNodeList(data.annotatedNode_metadata),
         _directiveKeyword(data, Keyword.IMPORT, _Tokens.IMPORT),
         _readNode(data.uriBasedDirective_uri),
         _readNodeList(data.namespaceDirective_configurations),
@@ -1012,10 +892,9 @@
         _readNodeList(data.namespaceDirective_combinators),
         _Tokens.SEMICOLON,
       );
-      LazyDirective.setData(node, data);
+      LazyDirective.setData(_unitContext, data, node);
       return node;
     } finally {
-      _isReadingDirective = false;
       timerAstBinaryReaderDirective.stop();
     }
   }
@@ -1028,14 +907,8 @@
       leftBracket: _Tokens.OPEN_SQUARE_BRACKET,
       index: _readNode(data.indexExpression_index),
       rightBracket: _Tokens.CLOSE_SQUARE_BRACKET,
-    )
-      ..period =
-          AstBinaryFlags.hasPeriod(data.flags) ? _Tokens.PERIOD_PERIOD : null
-      ..staticElement = _elementOfComponents(
-        data.indexExpression_element,
-        data.indexExpression_substitution,
-      )
-      ..staticType = _readType(data.expression_type);
+    )..period =
+        AstBinaryFlags.hasPeriod(data.flags) ? _Tokens.PERIOD_PERIOD : null;
   }
 
   InstanceCreationExpression _read_instanceCreationExpression(LinkedNode data) {
@@ -1056,14 +929,11 @@
       ),
       typeArguments: _readNode(data.instanceCreationExpression_typeArguments),
     );
-    node.staticType = _readType(data.expression_type);
     return node;
   }
 
   IntegerLiteral _read_integerLiteral(LinkedNode data) {
-    // TODO(scheglov) Remove `?? _intType` after internal SDK roll.
-    return AstTestFactory.integer(data.integerLiteral_value)
-      ..staticType = _readType(data.expression_type) ?? _intType;
+    return AstTestFactory.integer(data.integerLiteral_value);
   }
 
   InterpolationExpression _read_interpolationExpression(LinkedNode data) {
@@ -1091,7 +961,7 @@
       _Tokens.IS,
       AstBinaryFlags.hasNot(data.flags) ? _Tokens.BANG : null,
       _readNode(data.isExpression_type),
-    )..staticType = _boolType;
+    );
   }
 
   Label _read_label(LinkedNode data) {
@@ -1110,19 +980,17 @@
 
   LibraryDirective _read_libraryDirective(LinkedNode data) {
     timerAstBinaryReaderDirective.start();
-    _isReadingDirective = true;
     try {
       var node = astFactory.libraryDirective(
         _unitContext.createComment(data),
-        _readNodeListLazy(data.annotatedNode_metadata),
+        _readNodeList(data.annotatedNode_metadata),
         _Tokens.LIBRARY,
         _readNode(data.libraryDirective_name),
         _Tokens.SEMICOLON,
       );
-      LazyDirective.setData(node, data);
+      LazyDirective.setData(_unitContext, data, node);
       return node;
     } finally {
-      _isReadingDirective = false;
       timerAstBinaryReaderDirective.stop();
     }
   }
@@ -1146,7 +1014,7 @@
       _Tokens.OPEN_SQUARE_BRACKET,
       _readNodeList(data.listLiteral_elements),
       _Tokens.CLOSE_SQUARE_BRACKET,
-    )..staticType = _readType(data.expression_type);
+    );
   }
 
   MapLiteralEntry _read_mapLiteralEntry(LinkedNode data) {
@@ -1169,10 +1037,10 @@
 
     var node = astFactory.methodDeclaration(
       _readDocumentationComment(data),
-      _readNodeListLazy(data.annotatedNode_metadata),
+      _readNodeList(data.annotatedNode_metadata),
       AstBinaryFlags.isExternal(data.flags) ? _Tokens.EXTERNAL : null,
       AstBinaryFlags.isStatic(data.flags) ? _Tokens.STATIC : null,
-      _readNodeLazy(data.methodDeclaration_returnType),
+      _readNode(data.methodDeclaration_returnType),
       _Tokens.choose(
         AstBinaryFlags.isGet(data.flags),
         _Tokens.GET,
@@ -1182,10 +1050,10 @@
       AstBinaryFlags.isOperator(data.flags) ? _Tokens.OPERATOR : null,
       _declaredIdentifier(data),
       _readNode(data.methodDeclaration_typeParameters),
-      _readNodeLazy(data.methodDeclaration_formalParameters),
+      _readNode(data.methodDeclaration_formalParameters),
       body,
     );
-    LazyMethodDeclaration.setData(node, data);
+    LazyMethodDeclaration.setData(_unitContext, data, node);
     LazyAst.setOperatorEqualParameterTypeFromObject(
       node,
       data.methodDeclaration_hasOperatorEqualWithParameterTypeFromObject,
@@ -1205,7 +1073,7 @@
       _readNode(data.methodInvocation_methodName),
       _readNode(data.invocationExpression_typeArguments),
       _readNode(data.invocationExpression_arguments),
-    )..staticInvokeType = _readType(data.invocationExpression_invokeType);
+    );
   }
 
   MixinDeclaration _read_mixinDeclaration(LinkedNode data) {
@@ -1213,17 +1081,17 @@
     try {
       var node = astFactory.mixinDeclaration(
         _readDocumentationComment(data),
-        _readNodeListLazy(data.annotatedNode_metadata),
+        _readNodeList(data.annotatedNode_metadata),
         _Tokens.MIXIN,
         _declaredIdentifier(data),
         _readNode(data.classOrMixinDeclaration_typeParameters),
-        _readNodeLazy(data.mixinDeclaration_onClause),
-        _readNodeLazy(data.classOrMixinDeclaration_implementsClause),
+        _readNode(data.mixinDeclaration_onClause),
+        _readNode(data.classOrMixinDeclaration_implementsClause),
         _Tokens.OPEN_CURLY_BRACKET,
         _readNodeListLazy(data.classOrMixinDeclaration_members),
         _Tokens.CLOSE_CURLY_BRACKET,
       );
-      LazyMixinDeclaration(node, data);
+      LazyMixinDeclaration(_unitContext, data, node);
       return node;
     } finally {
       timerAstBinaryReaderMixin.stop();
@@ -1256,7 +1124,7 @@
   NullLiteral _read_nullLiteral(LinkedNode data) {
     return astFactory.nullLiteral(
       _Tokens.NULL,
-    )..staticType = _nullType;
+    )..staticType;
   }
 
   OnClause _read_onClause(LinkedNode data) {
@@ -1271,45 +1139,41 @@
       _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),
-        _readNodeListLazy(data.annotatedNode_metadata),
+        _readNodeList(data.annotatedNode_metadata),
         _Tokens.PART,
         _readNode(data.uriBasedDirective_uri),
         _Tokens.SEMICOLON,
       );
-      LazyDirective.setData(node, data);
+      LazyDirective.setData(_unitContext, data, node);
       return node;
     } finally {
-      _isReadingDirective = false;
       timerAstBinaryReaderDirective.stop();
     }
   }
 
   PartOfDirective _read_partOfDirective(LinkedNode data) {
     timerAstBinaryReaderDirective.start();
-    _isReadingDirective = true;
     try {
       var node = astFactory.partOfDirective(
         _readDocumentationComment(data),
-        _readNodeListLazy(data.annotatedNode_metadata),
+        _readNodeList(data.annotatedNode_metadata),
         _Tokens.PART,
         _Tokens.OF,
         _readNode(data.partOfDirective_uri),
         _readNode(data.partOfDirective_libraryName),
         _Tokens.SEMICOLON,
       );
-      LazyDirective.setData(node, data);
+      LazyDirective.setData(_unitContext, data, node);
       return node;
     } finally {
-      _isReadingDirective = false;
       timerAstBinaryReaderDirective.stop();
     }
   }
@@ -1318,12 +1182,7 @@
     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) {
@@ -1331,19 +1190,14 @@
       _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) {
@@ -1351,7 +1205,7 @@
       _readNode(data.propertyAccess_target),
       _Tokens.fromType(data.propertyAccess_operator),
       _readNode(data.propertyAccess_propertyName),
-    )..staticType = _readType(data.expression_type);
+    );
   }
 
   RedirectingConstructorInvocation _read_redirectingConstructorInvocation(
@@ -1362,16 +1216,13 @@
       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) {
@@ -1395,7 +1246,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)) {
@@ -1438,23 +1289,16 @@
   }
 
   SimpleIdentifier _read_simpleIdentifier(LinkedNode data) {
-    return astFactory.simpleIdentifier(
+    var node = astFactory.simpleIdentifier(
       TokenFactory.tokenFromString(data.name),
       isDeclaration: AstBinaryFlags.isDeclaration(data.flags),
-    )
-      ..staticElement = _elementOfComponents(
-        data.simpleIdentifier_element,
-        data.simpleIdentifier_substitution,
-      )
-      ..staticType = _readType(data.expression_type);
+    );
+    LazyAst.setData(node, data);
+    return node;
   }
 
   SimpleStringLiteral _read_simpleStringLiteral(LinkedNode data) {
-    var node = AstTestFactory.string2(data.simpleStringLiteral_value);
-    if (!_isReadingDirective) {
-      node.staticType = _stringType;
-    }
-    return node;
+    return AstTestFactory.string2(data.simpleStringLiteral_value);
   }
 
   SpreadElement _read_spreadElement(LinkedNode data) {
@@ -1465,13 +1309,9 @@
   }
 
   StringInterpolation _read_stringInterpolation(LinkedNode data) {
-    var node = astFactory.stringInterpolation(
+    return astFactory.stringInterpolation(
       _readNodeList(data.stringInterpolation_elements),
     );
-    if (!_isReadingDirective) {
-      node.staticType = _stringType;
-    }
-    return node;
   }
 
   SuperConstructorInvocation _read_superConstructorInvocation(LinkedNode data) {
@@ -1480,16 +1320,13 @@
       _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) {
@@ -1527,20 +1364,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(
@@ -1549,13 +1386,13 @@
     try {
       var node = astFactory.topLevelVariableDeclaration(
         _readDocumentationComment(data),
-        _readNodeListLazy(data.annotatedNode_metadata),
+        _readNodeList(data.annotatedNode_metadata),
         _readNode(data.topLevelVariableDeclaration_variableList),
         _Tokens.SEMICOLON,
         externalKeyword:
             AstBinaryFlags.isExternal(data.flags) ? _Tokens.EXTERNAL : null,
       );
-      LazyTopLevelVariableDeclaration.setData(node, data);
+      LazyTopLevelVariableDeclaration.setData(_unitContext, data, node);
       return node;
     } finally {
       timerAstBinaryReaderTopLevelVar.stop();
@@ -1592,7 +1429,7 @@
           : null,
       question:
           AstBinaryFlags.hasQuestion(data.flags) ? _Tokens.QUESTION : null,
-    )..type = _readType(data.typeName_type);
+    );
   }
 
   TypeParameter _read_typeParameter(LinkedNode data) {
@@ -1600,10 +1437,10 @@
     // added to the interface.
     var node = (astFactory as AstFactoryImpl).typeParameter2(
       comment: _readDocumentationComment(data),
-      metadata: _readNodeListLazy(data.annotatedNode_metadata),
+      metadata: _readNodeList(data.annotatedNode_metadata),
       name: _declaredIdentifier(data),
       extendsKeyword: _Tokens.EXTENDS,
-      bound: _readNodeLazy(data.typeParameter_bound),
+      bound: _readNode(data.typeParameter_bound),
     );
     LazyAst.setVariance(node, _decodeVariance(data.typeParameter_variance));
     LazyTypeParameter.setData(node, data);
@@ -1622,7 +1459,7 @@
     var node = astFactory.variableDeclaration(
       _declaredIdentifier(data),
       _Tokens.EQ,
-      _readNodeLazy(data.variableDeclaration_initializer),
+      _readNode(data.variableDeclaration_initializer),
     );
     LazyVariableDeclaration.setData(node, data);
     LazyAst.setInheritsCovariant(node, data.inheritsCovariant);
@@ -1641,8 +1478,8 @@
         _Tokens.VAR,
       ),
       lateKeyword: AstBinaryFlags.isLate(data.flags) ? _Tokens.LATE : null,
-      metadata: _readNodeListLazy(data.annotatedNode_metadata),
-      type: _readNodeLazy(data.variableDeclarationList_type),
+      metadata: _readNodeList(data.annotatedNode_metadata),
+      type: _readNode(data.variableDeclarationList_type),
       variables: _readNodeList(data.variableDeclarationList_variables),
     );
     LazyVariableDeclarationList.setData(node, data);
@@ -1936,11 +1773,6 @@
     }
   }
 
-  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) {
@@ -1957,10 +1789,6 @@
     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 0035dd8..175ffc9 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
@@ -35,6 +35,8 @@
   /// so initializers of final fields should be written.
   bool _hasConstConstructor = false;
 
+  _ResolutionBuilder _resolutionBuilder;
+
   AstBinaryWriter(this._linkingContext);
 
   @override
@@ -46,7 +48,10 @@
 
   @override
   LinkedNodeBuilder visitAnnotation(Annotation node) {
-    var elementComponents = _componentsOfElement(node.element);
+    var builder = LinkedNodeBuilder.annotation(
+      annotation_name: node.name?.accept(this),
+      annotation_constructorName: node.constructorName?.accept(this),
+    );
 
     LinkedNodeBuilder storedArguments;
     var arguments = node.arguments;
@@ -57,14 +62,11 @@
         storedArguments = LinkedNodeBuilder.argumentList();
       }
     }
+    builder.annotation_arguments = storedArguments;
 
-    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),
-    );
+    _componentsOfElement(node.element);
+
+    return builder;
   }
 
   @override
@@ -102,40 +104,42 @@
 
   @override
   LinkedNodeBuilder visitAssignmentExpression(AssignmentExpression node) {
-    var elementComponents = _componentsOfElement(node.staticElement);
-    return LinkedNodeBuilder.assignmentExpression(
-      assignmentExpression_element: elementComponents.rawElement,
-      assignmentExpression_substitution: elementComponents.substitution,
+    var builder = LinkedNodeBuilder.assignmentExpression(
       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(node.staticType),
+      expression_type: _writeType('staticType', node.staticType),
     );
   }
 
   @override
   LinkedNodeBuilder visitBinaryExpression(BinaryExpression node) {
-    var elementComponents = _componentsOfElement(node.staticElement);
-    return LinkedNodeBuilder.binaryExpression(
-      binaryExpression_element: elementComponents.rawElement,
-      binaryExpression_substitution: elementComponents.substitution,
+    var builder = LinkedNodeBuilder.binaryExpression(
       binaryExpression_leftOperand: node.leftOperand.accept(this),
       binaryExpression_operator: TokensWriter.astToBinaryTokenType(
         node.operator.type,
       ),
       binaryExpression_rightOperand: node.rightOperand.accept(this),
-      expression_type: _writeType(node.staticType),
+      expression_type: _writeType('staticType', node.staticType),
     );
+
+    _componentsOfElement(node.staticElement);
+
+    return builder;
   }
 
   @override
@@ -167,6 +171,7 @@
   LinkedNodeBuilder visitBooleanLiteral(BooleanLiteral node) {
     return LinkedNodeBuilder.booleanLiteral(
       booleanLiteral_value: node.value,
+      expression_type: _writeType('staticType', node.staticType),
     );
   }
 
@@ -204,6 +209,8 @@
     try {
       timerAstBinaryWriterClass.start();
 
+      _resolutionBuilder = _ResolutionBuilder();
+
       _hasConstConstructor = false;
       for (var member in node.members) {
         if (member is ConstructorDeclaration && member.constKeyword != null) {
@@ -212,15 +219,29 @@
         }
       }
 
+      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();
@@ -231,17 +252,25 @@
   LinkedNodeBuilder visitClassTypeAlias(ClassTypeAlias node) {
     timerAstBinaryWriterClass.start();
     try {
+      _resolutionBuilder = _ResolutionBuilder();
+
+      var typeParameters = _enterTypeParameters(node.typeParameters);
+
       var builder = LinkedNodeBuilder.classTypeAlias(
-        classTypeAlias_implementsClause: node.implementsClause?.accept(this),
-        classTypeAlias_superclass: node.superclass.accept(this),
         classTypeAlias_typeParameters: node.typeParameters?.accept(this),
+        classTypeAlias_superclass: node.superclass.accept(this),
         classTypeAlias_withClause: node.withClause.accept(this),
+        classTypeAlias_implementsClause: node.implementsClause?.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();
@@ -312,8 +341,8 @@
   LinkedNodeBuilder visitConditionalExpression(ConditionalExpression node) {
     var builder = LinkedNodeBuilder.conditionalExpression(
       conditionalExpression_condition: node.condition.accept(this),
-      conditionalExpression_elseExpression: node.elseExpression.accept(this),
       conditionalExpression_thenExpression: node.thenExpression.accept(this),
+      conditionalExpression_elseExpression: node.elseExpression.accept(this),
     );
     _storeExpression(builder, node);
     return builder;
@@ -334,12 +363,14 @@
 
   @override
   LinkedNodeBuilder visitConstructorDeclaration(ConstructorDeclaration node) {
+    _resolutionBuilder = _ResolutionBuilder();
+
     var builder = LinkedNodeBuilder.constructorDeclaration(
-      constructorDeclaration_initializers: _writeNodeList(node.initializers),
+      constructorDeclaration_returnType: node.returnType.accept(this),
       constructorDeclaration_parameters: node.parameters.accept(this),
+      constructorDeclaration_initializers: _writeNodeList(node.initializers),
       constructorDeclaration_redirectedConstructor:
           node.redirectedConstructor?.accept(this),
-      constructorDeclaration_returnType: node.returnType.accept(this),
       informativeId: getInformativeId(node),
     );
     builder.flags = AstBinaryFlags.encode(
@@ -353,6 +384,9 @@
     );
     builder.name = node.name?.name;
     _storeClassMember(builder, node);
+
+    _storeResolution(builder);
+
     return builder;
   }
 
@@ -360,8 +394,8 @@
   LinkedNodeBuilder visitConstructorFieldInitializer(
       ConstructorFieldInitializer node) {
     var builder = LinkedNodeBuilder.constructorFieldInitializer(
-      constructorFieldInitializer_expression: node.expression.accept(this),
       constructorFieldInitializer_fieldName: node.fieldName.accept(this),
+      constructorFieldInitializer_expression: node.expression.accept(this),
     );
     builder.flags = AstBinaryFlags.encode(
       hasThis: node.thisKeyword != null,
@@ -372,13 +406,14 @@
 
   @override
   LinkedNodeBuilder visitConstructorName(ConstructorName node) {
-    var elementComponents = _componentsOfElement(node.staticElement);
-    return LinkedNodeBuilder.constructorName(
-      constructorName_element: elementComponents.rawElement,
-      constructorName_substitution: elementComponents.substitution,
-      constructorName_name: node.name?.accept(this),
+    var builder = LinkedNodeBuilder.constructorName(
       constructorName_type: node.type.accept(this),
+      constructorName_name: node.name?.accept(this),
     );
+
+    _componentsOfElement(node.staticElement);
+
+    return builder;
   }
 
   @override
@@ -393,8 +428,8 @@
   @override
   LinkedNodeBuilder visitDeclaredIdentifier(DeclaredIdentifier node) {
     var builder = LinkedNodeBuilder.declaredIdentifier(
-      declaredIdentifier_identifier: node.identifier.accept(this),
       declaredIdentifier_type: node.type?.accept(this),
+      declaredIdentifier_identifier: node.identifier.accept(this),
     );
     builder.flags = AstBinaryFlags.encode(
       isConst: node.keyword?.keyword == Keyword.CONST,
@@ -413,9 +448,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(
@@ -470,10 +505,12 @@
 
   @override
   LinkedNodeBuilder visitEnumDeclaration(EnumDeclaration node) {
+    _resolutionBuilder = _ResolutionBuilder();
     var builder = LinkedNodeBuilder.enumDeclaration(
       enumDeclaration_constants: _writeNodeList(node.constants),
     );
     _storeNamedCompilationUnitMember(builder, node);
+    _storeResolution(builder);
     return builder;
   }
 
@@ -481,8 +518,10 @@
   LinkedNodeBuilder visitExportDirective(ExportDirective node) {
     timerAstBinaryWriterDirective.start();
     try {
+      _resolutionBuilder = _ResolutionBuilder();
       var builder = LinkedNodeBuilder.exportDirective();
       _storeNamespaceDirective(builder, node);
+      _storeResolution(builder);
       return builder;
     } finally {
       timerAstBinaryWriterDirective.stop();
@@ -522,10 +561,12 @@
 
   @override
   LinkedNodeBuilder visitExtensionDeclaration(ExtensionDeclaration node) {
+    var typeParameters = _enterTypeParameters(node.typeParameters);
+    _resolutionBuilder = _ResolutionBuilder();
+
     var builder = LinkedNodeBuilder.extensionDeclaration(
-      extensionDeclaration_extendedType: node.extendedType.accept(this),
-      extensionDeclaration_members: _writeNodeList(node.members),
       extensionDeclaration_typeParameters: node.typeParameters?.accept(this),
+      extensionDeclaration_extendedType: node.extendedType.accept(this),
     );
 
     _storeCompilationUnitMember(builder, node);
@@ -533,26 +574,34 @@
     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_extensionName: node.extensionName.accept(this),
-      extensionOverride_typeArguments: node.typeArguments?.accept(this),
-      extensionOverride_typeArgumentTypes:
-          node.typeArgumentTypes.map(_writeType).toList(),
-      extensionOverride_extendedType: _writeType(node.extendedType),
+      extensionOverride_typeArgumentTypes: node.typeArgumentTypes
+          .map((t) => _writeType('typeArgumentType', t))
+          .toList(),
+      extensionOverride_extendedType:
+          _writeType('extendedType', node.extendedType),
     );
     return builder;
   }
 
   @override
   LinkedNodeBuilder visitFieldDeclaration(FieldDeclaration node) {
+    _resolutionBuilder = _ResolutionBuilder();
     var builder = LinkedNodeBuilder.fieldDeclaration(
       fieldDeclaration_fields: node.fields.accept(this),
       informativeId: getInformativeId(node),
@@ -564,19 +613,22 @@
       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_formalParameters: node.parameters?.accept(this),
-      fieldFormalParameter_type: node.type?.accept(this),
       fieldFormalParameter_typeParameters: node.typeParameters?.accept(this),
+      fieldFormalParameter_type: node.type?.accept(this),
+      fieldFormalParameter_formalParameters: node.parameters?.accept(this),
     );
     _storeNormalFormalParameter(builder, node, node.keyword);
     builder.flags |= AstBinaryFlags.encode(hasQuestion: node.question != null);
+    _linkingContext.typeParameterIndexer.exit(typeParameters);
     return builder;
   }
 
@@ -653,10 +705,14 @@
 
   @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,
@@ -665,6 +721,8 @@
     );
     _storeNamedCompilationUnitMember(builder, node);
     _writeActualReturnType(builder, node);
+    _linkingContext.typeParameterIndexer.exit(typeParameters);
+    _storeResolution(builder);
     return builder;
   }
 
@@ -709,16 +767,24 @@
   LinkedNodeBuilder visitFunctionTypeAlias(FunctionTypeAlias node) {
     timerAstBinaryWriterTypedef.start();
     try {
+      var typeParameters = _enterTypeParameters(node.typeParameters);
+
+      _resolutionBuilder = _ResolutionBuilder();
+
       var builder = LinkedNodeBuilder.functionTypeAlias(
-        functionTypeAlias_formalParameters: node.parameters.accept(this),
-        functionTypeAlias_returnType: node.returnType?.accept(this),
         functionTypeAlias_typeParameters: node.typeParameters?.accept(this),
+        functionTypeAlias_returnType: node.returnType?.accept(this),
+        functionTypeAlias_formalParameters: node.parameters.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();
@@ -728,14 +794,16 @@
   @override
   LinkedNodeBuilder visitFunctionTypedFormalParameter(
       FunctionTypedFormalParameter node) {
+    var typeParameters = _enterTypeParameters(node.typeParameters);
     var builder = LinkedNodeBuilder.functionTypedFormalParameter(
-      functionTypedFormalParameter_formalParameters:
-          node.parameters.accept(this),
-      functionTypedFormalParameter_returnType: node.returnType?.accept(this),
       functionTypedFormalParameter_typeParameters:
           node.typeParameters?.accept(this),
+      functionTypedFormalParameter_returnType: node.returnType?.accept(this),
+      functionTypedFormalParameter_formalParameters:
+          node.parameters.accept(this),
     );
     _storeNormalFormalParameter(builder, node, null);
+    _linkingContext.typeParameterIndexer.exit(typeParameters);
     return builder;
   }
 
@@ -744,18 +812,22 @@
     var id = LazyAst.getGenericFunctionTypeId(node);
     assert(id != null);
 
+    var typeParameters = _enterTypeParameters(node.typeParameters);
+
     var builder = LinkedNodeBuilder.genericFunctionType(
       genericFunctionType_id: id,
-      genericFunctionType_returnType: node.returnType?.accept(this),
       genericFunctionType_typeParameters: node.typeParameters?.accept(this),
+      genericFunctionType_returnType: node.returnType?.accept(this),
       genericFunctionType_formalParameters: node.parameters.accept(this),
-      genericFunctionType_type: _writeType(node.type),
+      genericFunctionType_type: _writeType('type', node.type),
     );
     builder.flags = AstBinaryFlags.encode(
       hasQuestion: node.question != null,
     );
     _writeActualReturnType(builder, node);
 
+    _linkingContext.typeParameterIndexer.exit(typeParameters);
+
     return builder;
   }
 
@@ -763,6 +835,10 @@
   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),
@@ -771,6 +847,10 @@
       );
       _storeTypeAlias(builder, node);
       _storeIsSimpleBounded(builder, node);
+
+      _storeResolution(builder);
+
+      _linkingContext.typeParameterIndexer.exit(typeParameters);
       return builder;
     } finally {
       timerAstBinaryWriterTypedef.stop();
@@ -790,8 +870,8 @@
   LinkedNodeBuilder visitIfElement(IfElement node) {
     var builder = LinkedNodeBuilder.ifElement(
       ifMixin_condition: node.condition.accept(this),
-      ifElement_elseElement: node.elseElement?.accept(this),
       ifElement_thenElement: node.thenElement.accept(this),
+      ifElement_elseElement: node.elseElement?.accept(this),
     );
     return builder;
   }
@@ -817,6 +897,7 @@
   LinkedNodeBuilder visitImportDirective(ImportDirective node) {
     timerAstBinaryWriterDirective.start();
     try {
+      _resolutionBuilder = _ResolutionBuilder();
       var builder = LinkedNodeBuilder.importDirective(
         importDirective_prefix: node.prefix?.name,
       );
@@ -824,6 +905,7 @@
         isDeferred: node.deferredKeyword != null,
       );
       _storeNamespaceDirective(builder, node);
+      _storeResolution(builder);
       return builder;
     } finally {
       timerAstBinaryWriterDirective.stop();
@@ -832,14 +914,12 @@
 
   @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(node.staticType),
+      expression_type: _writeType('staticType', node.staticType),
     );
+    _componentsOfElement(node.staticElement);
     builder.flags = AstBinaryFlags.encode(
       hasPeriod: node.period != null,
       hasQuestion: node.question != null,
@@ -852,14 +932,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),
-      expression_type: _writeType(node.staticType),
+      instanceCreationExpression_arguments: _writeNodeList(
+        node.argumentList.arguments,
+      ),
+      expression_type: _writeType('staticType', node.staticType),
     );
     builder.flags = AstBinaryFlags.encode(
       isConst: node.keyword?.type == Keyword.CONST,
@@ -871,7 +951,7 @@
   @override
   LinkedNodeBuilder visitIntegerLiteral(IntegerLiteral node) {
     return LinkedNodeBuilder.integerLiteral(
-      expression_type: _writeType(node.staticType),
+      expression_type: _writeType('staticType', node.staticType),
       integerLiteral_value: node.value,
     );
   }
@@ -924,11 +1004,13 @@
   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();
@@ -961,9 +1043,13 @@
 
   @override
   LinkedNodeBuilder visitMethodDeclaration(MethodDeclaration node) {
+    var typeParameters = _enterTypeParameters(node.typeParameters);
+
+    _resolutionBuilder = _ResolutionBuilder();
+
     var builder = LinkedNodeBuilder.methodDeclaration(
-      methodDeclaration_returnType: node.returnType?.accept(this),
       methodDeclaration_typeParameters: node.typeParameters?.accept(this),
+      methodDeclaration_returnType: node.returnType?.accept(this),
       methodDeclaration_formalParameters: node.parameters?.accept(this),
       methodDeclaration_hasOperatorEqualWithParameterTypeFromObject:
           LazyAst.hasOperatorEqualParameterTypeFromObject(node),
@@ -980,18 +1066,22 @@
       isSet: node.isSetter,
       isStatic: node.isStatic,
     );
-    builder.topLevelTypeInferenceError = LazyAst.getTypeInferenceError(node);
+
     _storeClassMember(builder, node);
+
+    builder.topLevelTypeInferenceError = LazyAst.getTypeInferenceError(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_methodName: node.methodName?.accept(this),
       methodInvocation_target: node.target?.accept(this),
+      methodInvocation_methodName: node.methodName?.accept(this),
     );
     builder.flags = AstBinaryFlags.encode(
       hasPeriod: node.operator?.type == TokenType.PERIOD,
@@ -1005,10 +1095,26 @@
   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 {
@@ -1019,8 +1125,8 @@
   @override
   LinkedNodeBuilder visitNamedExpression(NamedExpression node) {
     return LinkedNodeBuilder.namedExpression(
-      namedExpression_expression: node.expression.accept(this),
       namedExpression_name: node.name.accept(this),
+      namedExpression_expression: node.expression.accept(this),
     );
   }
 
@@ -1064,8 +1170,10 @@
   LinkedNodeBuilder visitPartDirective(PartDirective node) {
     timerAstBinaryWriterDirective.start();
     try {
+      _resolutionBuilder = _ResolutionBuilder();
       var builder = LinkedNodeBuilder.partDirective();
       _storeUriBasedDirective(builder, node);
+      _storeResolution(builder);
       return builder;
     } finally {
       timerAstBinaryWriterDirective.stop();
@@ -1076,11 +1184,13 @@
   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();
@@ -1089,49 +1199,53 @@
 
   @override
   LinkedNodeBuilder visitPostfixExpression(PostfixExpression node) {
-    var elementComponents = _componentsOfElement(node.staticElement);
-    return LinkedNodeBuilder.postfixExpression(
-      expression_type: _writeType(node.staticType),
-      postfixExpression_element: elementComponents.rawElement,
-      postfixExpression_substitution: elementComponents.substitution,
+    var builder = LinkedNodeBuilder.postfixExpression(
       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_identifier: node.identifier.accept(this),
       prefixedIdentifier_prefix: node.prefix.accept(this),
-      expression_type: _writeType(node.staticType),
+      prefixedIdentifier_identifier: node.identifier.accept(this),
+      expression_type: _writeType('staticType', node.staticType),
     );
   }
 
   @override
   LinkedNodeBuilder visitPrefixExpression(PrefixExpression node) {
-    var elementComponents = _componentsOfElement(node.staticElement);
-    return LinkedNodeBuilder.prefixExpression(
-      expression_type: _writeType(node.staticType),
-      prefixExpression_element: elementComponents.rawElement,
-      prefixExpression_substitution: elementComponents.substitution,
+    var builder = LinkedNodeBuilder.prefixExpression(
       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;
@@ -1140,19 +1254,18 @@
   @override
   LinkedNodeBuilder visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
-    var elementComponents = _componentsOfElement(node.staticElement);
     var builder = LinkedNodeBuilder.redirectingConstructorInvocation(
-      redirectingConstructorInvocation_arguments:
-          node.argumentList.accept(this),
       redirectingConstructorInvocation_constructorName:
           node.constructorName?.accept(this),
-      redirectingConstructorInvocation_element: elementComponents.rawElement,
-      redirectingConstructorInvocation_substitution:
-          elementComponents.substitution,
+      redirectingConstructorInvocation_arguments:
+          node.argumentList.accept(this),
     );
     builder.flags = AstBinaryFlags.encode(
       hasThis: node.thisKeyword != null,
     );
+
+    _componentsOfElement(node.staticElement);
+
     _storeConstructorInitializer(builder, node);
     return builder;
   }
@@ -1160,7 +1273,7 @@
   @override
   LinkedNodeBuilder visitRethrowExpression(RethrowExpression node) {
     return LinkedNodeBuilder.rethrowExpression(
-      expression_type: _writeType(node.staticType),
+      expression_type: _writeType('staticType', node.staticType),
     );
   }
 
@@ -1215,16 +1328,22 @@
       }
     }
 
-    var elementComponents = _componentsOfElement(element);
     var builder = LinkedNodeBuilder.simpleIdentifier(
-      simpleIdentifier_element: elementComponents.rawElement,
-      simpleIdentifier_substitution: elementComponents.substitution,
-      expression_type: _writeType(node.staticType),
+      name: node.name,
     );
+
+    var hasType = node.staticType != null;
     builder.flags = AstBinaryFlags.encode(
       isDeclaration: node is DeclaredSimpleIdentifier,
+      hasType: hasType,
     );
-    builder.name = node.name;
+
+    _componentsOfElement(element);
+
+    if (hasType) {
+      _writeType('staticType', node.staticType);
+    }
+
     return builder;
   }
 
@@ -1256,14 +1375,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_element: elementComponents.rawElement,
-      superConstructorInvocation_substitution: elementComponents.substitution,
+      superConstructorInvocation_arguments: node.argumentList.accept(this),
     );
+
+    _componentsOfElement(node.staticElement);
+
     _storeConstructorInitializer(builder, node);
     return builder;
   }
@@ -1319,7 +1438,7 @@
   LinkedNodeBuilder visitThrowExpression(ThrowExpression node) {
     return LinkedNodeBuilder.throwExpression(
       throwExpression_expression: node.expression.accept(this),
-      expression_type: _writeType(node.staticType),
+      expression_type: _writeType('staticType', node.staticType),
     );
   }
 
@@ -1328,6 +1447,7 @@
       TopLevelVariableDeclaration node) {
     timerAstBinaryWriterTopVar.start();
     try {
+      _resolutionBuilder = _ResolutionBuilder();
       var builder = LinkedNodeBuilder.topLevelVariableDeclaration(
         informativeId: getInformativeId(node),
         topLevelVariableDeclaration_variableList: node.variables?.accept(this),
@@ -1337,6 +1457,8 @@
       );
       _storeCompilationUnitMember(builder, node);
 
+      _storeResolution(builder);
+
       return builder;
     } finally {
       timerAstBinaryWriterTopVar.stop();
@@ -1361,23 +1483,26 @@
 
   @override
   LinkedNodeBuilder visitTypeName(TypeName node) {
-    return LinkedNodeBuilder.typeName(
+    var builder = 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(LazyAst.getDefaultType(node)),
+      typeParameter_defaultType:
+          _writeType('defaultType', LazyAst.getDefaultType(node)),
       typeParameter_variance: _encodeVariance(LazyAst.getVariance(node)),
       informativeId: getInformativeId(node),
     );
@@ -1489,24 +1614,54 @@
     }
   }
 
-  _ElementComponents _componentsOfElement(Element element) {
+  void _componentsOfElement(Element element) {
     if (element is ParameterMember) {
       element = element.declaration;
     }
 
     if (element is Member) {
-      var elementIndex = _indexOfElement(element.declaration);
-      var substitution = element.substitution.map;
+      var declaration = element.declaration;
+      var elementIndex = _indexOfElement(declaration);
+
+      var typeArguments = _enclosingClassTypeArguments(
+        declaration,
+        element.substitution.map,
+      );
       var substitutionBuilder = LinkedNodeTypeSubstitutionBuilder(
         isLegacy: element.isLegacy,
-        typeParameters: substitution.keys.map(_indexOfElement).toList(),
-        typeArguments: substitution.values.map(_writeType).toList(),
+        typeArguments: typeArguments
+            .map((type) => _linkingContext.writeType(type))
+            .toList(),
       );
-      return _ElementComponents(elementIndex, substitutionBuilder);
+
+      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 [];
     }
 
-    var elementIndex = _indexOfElement(element);
-    return _ElementComponents(elementIndex, null);
+    var typeParameterElements = <TypeParameterElement>[];
+    for (var typeParameter in node.typeParameters) {
+      typeParameterElements.add(typeParameter.declaredElement);
+    }
+
+    _linkingContext.typeParameterIndexer.enter(typeParameterElements);
+
+    return typeParameterElements;
   }
 
   int _indexOfElement(Element element) {
@@ -1522,13 +1677,9 @@
   }
 
   void _storeClassOrMixinDeclaration(
-      LinkedNodeBuilder builder, ClassOrMixinDeclaration node) {
-    builder
-      ..classOrMixinDeclaration_implementsClause =
-          node.implementsClause?.accept(this)
-      ..classOrMixinDeclaration_members = _writeNodeList(node.members)
-      ..classOrMixinDeclaration_typeParameters =
-          node.typeParameters?.accept(this);
+    LinkedNodeBuilder builder,
+    ClassOrMixinDeclaration node,
+  ) {
     _storeNamedCompilationUnitMember(builder, node);
     _storeIsSimpleBounded(builder, node);
   }
@@ -1551,7 +1702,7 @@
   }
 
   void _storeExpression(LinkedNodeBuilder builder, Expression node) {
-    builder.expression_type = _writeType(node.staticType);
+    builder.expression_type = _writeType('staticType', node.staticType);
   }
 
   void _storeForEachParts(LinkedNodeBuilder builder, ForEachParts node) {
@@ -1595,7 +1746,8 @@
     _storeExpression(builder, node);
     builder
       ..invocationExpression_arguments = node.argumentList.accept(this)
-      ..invocationExpression_invokeType = _writeType(node.staticInvokeType)
+      ..invocationExpression_invokeType =
+          _writeType('invokeType', node.staticInvokeType)
       ..invocationExpression_typeArguments = node.typeArguments?.accept(this);
   }
 
@@ -1637,6 +1789,15 @@
       ..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) {
@@ -1668,20 +1829,19 @@
     _storeDirective(builder, node);
     builder
       ..uriBasedDirective_uri = node.uri.accept(this)
-      ..uriBasedDirective_uriContent = node.uriContent
-      ..uriBasedDirective_uriElement = _indexOfElement(node.uriElement);
+      ..uriBasedDirective_uriContent = node.uriContent;
   }
 
   void _writeActualReturnType(LinkedNodeBuilder builder, AstNode node) {
     var type = LazyAst.getReturnType(node);
     // TODO(scheglov) Check for `null` when writing resolved AST.
-    builder.actualReturnType = _writeType(type);
+    builder.actualReturnType = _writeType('actualReturnType', type);
   }
 
   void _writeActualType(LinkedNodeBuilder builder, AstNode node) {
     var type = LazyAst.getType(node);
     // TODO(scheglov) Check for `null` when writing resolved AST.
-    builder.actualType = _writeType(type);
+    builder.actualType = _writeType('actualType', type);
   }
 
   List<LinkedNodeBuilder> _writeNodeList(List<AstNode> nodeList) {
@@ -1700,8 +1860,38 @@
     return result;
   }
 
-  LinkedNodeTypeBuilder _writeType(DartType type) {
-    return _linkingContext.writeType(type);
+  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>[];
   }
 
   static int _encodeVariance(Variance variance) {
@@ -1749,14 +1939,6 @@
   }
 }
 
-/// 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;
 
@@ -1765,3 +1947,13 @@
     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 4a8d0c5..3eac814 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 dea4fa9..25f5416 100644
--- a/pkg/analyzer/lib/src/summary2/lazy_ast.dart
+++ b/pkg/analyzer/lib/src/summary2/lazy_ast.dart
@@ -9,6 +9,7 @@
 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';
@@ -30,10 +31,78 @@
   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);
   }
@@ -79,6 +148,10 @@
     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);
   }
@@ -128,16 +201,29 @@
 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 _hasMetadata = false;
-  bool _hasWithClause = false;
+  bool _hasResolutionApplied = false;
 
-  LazyClassDeclaration(this.data);
+  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();
+  }
 
   static LazyClassDeclaration get(ClassDeclaration node) {
     return node.getProperty(_key);
@@ -176,32 +262,6 @@
     }
   }
 
-  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,
@@ -217,36 +277,12 @@
     }
   }
 
-  static void readMetadata(
-    AstBinaryReader reader,
+  static void setData(
+    LinkedUnitContext unitContext,
+    LinkedNode data,
     ClassDeclaration 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));
+    node.setProperty(_key, LazyClassDeclaration(unitContext, data, node));
     LazyAst.setSimplyBounded(node, data.simplyBoundable_isSimplyBounded);
   }
 }
@@ -254,15 +290,28 @@
 class LazyClassTypeAlias {
   static const _key = 'lazyAst';
 
+  final LinkedUnitContext unitContext;
   final LinkedNode data;
+  final ClassTypeAlias node;
 
   bool _hasDocumentationComment = false;
-  bool _hasImplementsClause = false;
-  bool _hasMetadata = false;
-  bool _hasSuperclass = false;
-  bool _hasWithClause = false;
+  bool _hasResolutionApplied = false;
 
-  LazyClassTypeAlias(this.data);
+  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();
+  }
 
   static LazyClassTypeAlias get(ClassTypeAlias node) {
     return node.getProperty(_key);
@@ -301,62 +350,12 @@
     }
   }
 
-  static void readImplementsClause(
-    AstBinaryReader reader,
+  static void setData(
+    LinkedUnitContext unitContext,
+    LinkedNode data,
     ClassTypeAlias 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));
+    node.setProperty(_key, LazyClassTypeAlias(unitContext, data, node));
     LazyAst.setSimplyBounded(node, data.simplyBoundable_isSimplyBounded);
   }
 }
@@ -419,16 +418,29 @@
 class LazyConstructorDeclaration {
   static const _key = 'lazyAst';
 
+  final LinkedUnitContext unitContext;
   final LinkedNode data;
+  final ConstructorDeclaration node;
 
-  bool _hasBody = false;
   bool _hasDocumentationComment = false;
-  bool _hasFormalParameters = false;
-  bool _hasInitializers = false;
-  bool _hasMetadata = false;
-  bool _hasRedirectedConstructor = false;
+  bool _hasResolutionApplied = false;
 
-  LazyConstructorDeclaration(this.data);
+  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();
+  }
 
   static LazyConstructorDeclaration get(ConstructorDeclaration node) {
     return node.getProperty(_key);
@@ -456,19 +468,6 @@
     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,
@@ -480,64 +479,12 @@
     }
   }
 
-  static void readFormalParameters(
-    AstBinaryReader reader,
+  static void setData(
+    LinkedUnitContext unitContext,
+    LinkedNode data,
     ConstructorDeclaration 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));
+    node.setProperty(_key, LazyConstructorDeclaration(unitContext, data, node));
   }
 }
 
@@ -545,11 +492,24 @@
   static const _key = 'lazyAst';
   static const _uriKey = 'lazyAst_selectedUri';
 
+  final LinkedUnitContext unitContext;
   final LinkedNode data;
+  final Directive node;
 
-  bool _hasMetadata = false;
+  bool _hasResolutionApplied = false;
 
-  LazyDirective(this.data);
+  LazyDirective(this.unitContext, this.data, this.node);
+
+  void applyResolution() {
+    if (_hasResolutionApplied) {
+      return;
+    }
+
+    var visitor = ApplyResolutionVisitor(unitContext, data.resolution);
+    node.accept(visitor);
+
+    _hasResolutionApplied = true;
+  }
 
   static LazyDirective get(Directive node) {
     return node.getProperty(_key);
@@ -559,20 +519,12 @@
     return node.getProperty(_uriKey);
   }
 
-  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));
+  static void setData(
+    LinkedUnitContext unitContext,
+    LinkedNode data,
+    Directive node,
+  ) {
+    node.setProperty(_key, LazyDirective(unitContext, data, node));
     if (node is NamespaceDirective) {
       node.setProperty(_uriKey, data.namespaceDirective_selectedUri);
     }
@@ -589,7 +541,6 @@
   final LinkedNode data;
 
   bool _hasDocumentationComment = false;
-  bool _hasMetadata = false;
 
   LazyEnumConstantDeclaration(this.data);
 
@@ -630,21 +581,6 @@
     }
   }
 
-  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));
   }
@@ -653,13 +589,28 @@
 class LazyEnumDeclaration {
   static const _key = 'lazyAst';
 
+  final LinkedUnitContext unitContext;
   final LinkedNode data;
+  final EnumDeclaration node;
 
-  bool _hasConstants = false;
   bool _hasDocumentationComment = false;
-  bool _hasMetadata = false;
+  bool _hasResolutionApplied = false;
 
-  LazyEnumDeclaration(this.data);
+  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();
+  }
 
   static LazyEnumDeclaration get(EnumDeclaration node) {
     return node.getProperty(_key);
@@ -687,21 +638,6 @@
     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,
@@ -713,41 +649,31 @@
     }
   }
 
-  static void readMetadata(
-    AstBinaryReader reader,
+  static void setData(
+    LinkedUnitContext unitContext,
+    LinkedNode data,
     EnumDeclaration 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));
+    node.setProperty(_key, LazyEnumDeclaration(unitContext, data, node));
   }
 }
 
 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 _hasMetadata = false;
+  bool _hasResolutionApplied = 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(ExtensionDeclaration node, this.data) {
+  LazyExtensionDeclaration(this.unitContext, this.data, this.node) {
     node.setProperty(_key, this);
     if (data != null) {
       _refName = data.extensionDeclaration_refName;
@@ -756,6 +682,16 @@
 
   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;
@@ -768,7 +704,7 @@
   static LazyExtensionDeclaration get(ExtensionDeclaration node) {
     LazyExtensionDeclaration lazy = node.getProperty(_key);
     if (lazy == null) {
-      return LazyExtensionDeclaration(node, null);
+      return LazyExtensionDeclaration(null, null, node);
     }
     return lazy;
   }
@@ -806,19 +742,6 @@
     }
   }
 
-  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,
@@ -833,32 +756,34 @@
       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 _hasMetadata = false;
+  bool _hasResolutionApplied = false;
 
-  LazyFieldDeclaration(this.data);
+  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();
+  }
 
   static LazyFieldDeclaration get(FieldDeclaration node) {
     return node.getProperty(_key);
@@ -875,23 +800,12 @@
     }
   }
 
-  static void readMetadata(
-    AstBinaryReader reader,
+  static void setData(
+    LinkedUnitContext unitContext,
+    LinkedNode data,
     FieldDeclaration 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));
+    node.setProperty(_key, LazyFieldDeclaration(unitContext, data, node));
   }
 }
 
@@ -900,12 +814,7 @@
 
   final LinkedNode data;
 
-  bool _hasDefaultValue = false;
-  bool _hasFormalParameters = false;
-  bool _hasMetadata = false;
-  bool _hasType = false;
   bool _hasTypeInferenceError = false;
-  bool _hasTypeNode = false;
 
   LazyFormalParameter(this.data);
 
@@ -950,19 +859,6 @@
     }
   }
 
-  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) {
@@ -982,68 +878,6 @@
     }
   }
 
-  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));
   }
@@ -1052,14 +886,28 @@
 class LazyFunctionDeclaration {
   static const _key = 'lazyAst';
 
+  final LinkedUnitContext unitContext;
   final LinkedNode data;
+  final FunctionDeclaration node;
 
   bool _hasDocumentationComment = false;
-  bool _hasMetadata = false;
-  bool _hasReturnType = false;
-  bool _hasReturnTypeNode = false;
+  bool _hasResolutionApplied = false;
 
-  LazyFunctionDeclaration(this.data);
+  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();
+  }
 
   static LazyFunctionDeclaration get(FunctionDeclaration node) {
     return node.getProperty(_key);
@@ -1087,22 +935,6 @@
     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,
@@ -1114,48 +946,12 @@
     }
   }
 
-  static void readFunctionExpression(
-    AstBinaryReader reader,
+  static void setData(
+    LinkedUnitContext unitContext,
+    LinkedNode data,
     FunctionDeclaration 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));
+    node.setProperty(_key, LazyFunctionDeclaration(unitContext, data, node));
   }
 }
 
@@ -1165,7 +961,6 @@
   final LinkedNode data;
 
   bool _hasBody = false;
-  bool _hasFormalParameters = false;
 
   LazyFunctionExpression(this.data);
 
@@ -1204,19 +999,6 @@
     }
   }
 
-  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));
   }
@@ -1226,15 +1008,25 @@
   static const _key = 'lazyAst';
   static const _hasSelfReferenceKey = 'lazyAst_hasSelfReferenceKey';
 
+  final LinkedUnitContext unitContext;
   final LinkedNode data;
+  final FunctionTypeAlias node;
 
   bool _hasDocumentationComment = false;
-  bool _hasFormalParameters = false;
-  bool _hasMetadata = false;
-  bool _hasReturnType = false;
-  bool _hasReturnTypeNode = false;
+  bool _hasResolutionApplied = false;
 
-  LazyFunctionTypeAlias(this.data);
+  LazyFunctionTypeAlias(this.unitContext, this.data, this.node);
+
+  void applyResolution() {
+    if (_hasResolutionApplied) {
+      return;
+    }
+
+    var visitor = ApplyResolutionVisitor(unitContext, data.resolution);
+    node.accept(visitor);
+
+    _hasResolutionApplied = true;
+  }
 
   static LazyFunctionTypeAlias get(FunctionTypeAlias node) {
     return node.getProperty(_key);
@@ -1266,19 +1058,6 @@
     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,
@@ -1290,49 +1069,12 @@
     }
   }
 
-  static void readFormalParameters(
-    AstBinaryReader reader,
+  static void setData(
+    LinkedUnitContext unitContext,
+    LinkedNode data,
     FunctionTypeAlias 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));
+    node.setProperty(_key, LazyFunctionTypeAlias(unitContext, data, node));
     LazyAst.setSimplyBounded(node, data.simplyBoundable_isSimplyBounded);
   }
 
@@ -1345,13 +1087,25 @@
   static const _key = 'lazyAst';
   static const _hasSelfReferenceKey = 'lazyAst_hasSelfReferenceKey';
 
+  final LinkedUnitContext unitContext;
   final LinkedNode data;
+  final GenericTypeAlias node;
 
   bool _hasDocumentationComment = false;
-  bool _hasFunction = false;
-  bool _hasMetadata = false;
+  bool _hasResolutionApplied = false;
 
-  LazyGenericTypeAlias(this.data);
+  LazyGenericTypeAlias(this.unitContext, this.data, this.node);
+
+  void applyResolution() {
+    if (_hasResolutionApplied) {
+      return;
+    }
+
+    var visitor = ApplyResolutionVisitor(unitContext, data.resolution);
+    node.accept(visitor);
+
+    _hasResolutionApplied = true;
+  }
 
   static LazyGenericTypeAlias get(GenericTypeAlias node) {
     return node.getProperty(_key);
@@ -1394,36 +1148,12 @@
     }
   }
 
-  static void readFunctionType(
-    AstBinaryReader reader,
+  static void setData(
+    LinkedUnitContext unitContext,
+    LinkedNode data,
     GenericTypeAlias 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));
+    node.setProperty(_key, LazyGenericTypeAlias(unitContext, data, node));
     LazyAst.setSimplyBounded(node, data.simplyBoundable_isSimplyBounded);
   }
 
@@ -1435,17 +1165,30 @@
 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.data);
+  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();
+  }
 
   static LazyMethodDeclaration get(MethodDeclaration node) {
     return node.getProperty(_key);
@@ -1473,19 +1216,6 @@
     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) {
@@ -1523,19 +1253,6 @@
     }
   }
 
-  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,
@@ -1547,72 +1264,49 @@
     }
   }
 
-  static void readFormalParameters(
-    AstBinaryReader reader,
+  static void setData(
+    LinkedUnitContext unitContext,
+    LinkedNode data,
     MethodDeclaration 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));
+    node.setProperty(_key, LazyMethodDeclaration(unitContext, data, node));
   }
 }
 
 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 _hasMetadata = false;
+  bool _hasResolutionApplied = false;
 
   List<String> _superInvokedNames;
 
-  LazyMixinDeclaration(MixinDeclaration node, this.data) {
+  LazyMixinDeclaration(this.unitContext, this.data, this.node) {
     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;
   }
@@ -1628,7 +1322,7 @@
   static LazyMixinDeclaration get(MixinDeclaration node) {
     LazyMixinDeclaration lazy = node.getProperty(_key);
     if (lazy == null) {
-      return LazyMixinDeclaration(node, null);
+      return LazyMixinDeclaration(null, null, node);
     }
     return lazy;
   }
@@ -1666,19 +1360,6 @@
     }
   }
 
-  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,
@@ -1693,45 +1374,33 @@
       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 _hasMetadata = false;
+  bool _hasResolutionApplied = false;
 
-  LazyTopLevelVariableDeclaration(this.data);
+  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();
+  }
 
   static LazyTopLevelVariableDeclaration get(TopLevelVariableDeclaration node) {
     return node.getProperty(_key);
@@ -1748,35 +1417,24 @@
     }
   }
 
-  static void readMetadata(
-    AstBinaryReader reader,
+  static void setData(
+    LinkedUnitContext unitContext,
+    LinkedNode data,
     TopLevelVariableDeclaration 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));
+    node.setProperty(
+      _key,
+      LazyTopLevelVariableDeclaration(unitContext, data, node),
+    );
   }
 }
 
+/// 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) {
@@ -1805,52 +1463,17 @@
     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);
@@ -1891,19 +1514,6 @@
     }
   }
 
-  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);
@@ -1924,19 +1534,6 @@
     }
   }
 
-  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 7047fb0..8b8269b 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);
+    var reference = referenceOfIndex(index >> 1);
     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 ff54b07..13ceb21 100644
--- a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
@@ -41,13 +41,8 @@
   CompilationUnit _unit;
   bool _hasDirectivesRead = false;
 
-  /// 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;
+  final List<List<TypeParameterElement>> _typeParameterStack = [];
+  List<TypeParameterElement> typeParameterStack = [];
 
   LinkedUnitContext(
       this.bundleContext,
@@ -117,17 +112,6 @@
     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);
@@ -135,6 +119,13 @@
     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);
@@ -213,18 +204,6 @@
     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);
@@ -237,7 +216,7 @@
   }
 
   DartType getDefaultType(TypeParameter node) {
-    var type = LazyTypeParameter.getDefaultType(_astReader, node);
+    var type = LazyAst.getDefaultType(node);
     if (type is TypeBuilder) {
       type = (type as TypeBuilder).build();
       LazyAst.setDefaultType(node, type);
@@ -314,16 +293,6 @@
     }
   }
 
-  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;
   }
@@ -351,33 +320,33 @@
 
   List<FormalParameter> getFormalParameters(AstNode node) {
     if (node is ConstructorDeclaration) {
-      LazyConstructorDeclaration.readFormalParameters(_astReader, node);
+      // LazyConstructorDeclaration.readFormalParameters(_astReader, node);
       return node.parameters.parameters;
     } else if (node is FunctionDeclaration) {
-      LazyFunctionDeclaration.readFunctionExpression(_astReader, node);
+      // LazyFunctionDeclaration.readFunctionExpression(_astReader, node);
       return getFormalParameters(node.functionExpression);
     } else if (node is FunctionExpression) {
-      LazyFunctionExpression.readFormalParameters(_astReader, node);
+      // 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);
+        // LazyFormalParameter.readFormalParameters(_astReader, node);
         return node.parameters?.parameters;
       } else if (node is FunctionTypedFormalParameter) {
-        LazyFormalParameter.readFormalParameters(_astReader, node);
+        // LazyFormalParameter.readFormalParameters(_astReader, node);
         return node.parameters.parameters;
       } else {
         return null;
       }
     } else if (node is FunctionTypeAlias) {
-      LazyFunctionTypeAlias.readFormalParameters(_astReader, node);
+      // 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);
+      // LazyMethodDeclaration.readFormalParameters(_astReader, node);
       return node.parameters?.parameters;
     } else {
       throw UnimplementedError('${node.runtimeType}');
@@ -391,7 +360,7 @@
   }
 
   GenericFunctionType getGeneticTypeAliasFunction(GenericTypeAlias node) {
-    LazyGenericTypeAlias.readFunctionType(_astReader, node);
+    // LazyGenericTypeAlias.readFunctionType(_astReader, node);
     return node.functionType;
   }
 
@@ -406,13 +375,13 @@
 
   ImplementsClause getImplementsClause(AstNode node) {
     if (node is ClassDeclaration) {
-      LazyClassDeclaration.readImplementsClause(_astReader, node);
+      // LazyClassDeclaration.readImplementsClause(_astReader, node);
       return node.implementsClause;
     } else if (node is ClassTypeAlias) {
-      LazyClassTypeAlias.readImplementsClause(_astReader, node);
+      // LazyClassTypeAlias.readImplementsClause(_astReader, node);
       return node.implementsClause;
     } else if (node is MixinDeclaration) {
-      LazyMixinDeclaration.readImplementsClause(_astReader, node);
+      // LazyMixinDeclaration.readImplementsClause(_astReader, node);
       return node.implementsClause;
     } else {
       throw UnimplementedError('${node.runtimeType}');
@@ -456,6 +425,7 @@
   List<Annotation> getLibraryMetadata(CompilationUnit unit) {
     for (var directive in unit.directives) {
       if (directive is LibraryDirective) {
+        LazyAst.applyResolution(directive);
         return getMetadata(directive);
       }
     }
@@ -464,10 +434,10 @@
 
   List<Annotation> getMetadata(AstNode node) {
     if (node is ClassDeclaration) {
-      LazyClassDeclaration.readMetadata(_astReader, node);
+      // LazyClassDeclaration.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is ClassTypeAlias) {
-      LazyClassTypeAlias.readMetadata(_astReader, node);
+      // LazyClassTypeAlias.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is CompilationUnit) {
       assert(node == _unit);
@@ -477,50 +447,50 @@
         return const <Annotation>[];
       }
     } else if (node is ConstructorDeclaration) {
-      LazyConstructorDeclaration.readMetadata(_astReader, node);
+      // 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);
+      // LazyDirective.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is EnumConstantDeclaration) {
-      LazyEnumConstantDeclaration.readMetadata(_astReader, node);
+      // LazyEnumConstantDeclaration.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is EnumDeclaration) {
-      LazyEnumDeclaration.readMetadata(_astReader, node);
+      // LazyEnumDeclaration.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is ExtensionDeclaration) {
-      LazyExtensionDeclaration.readMetadata(_astReader, node);
+      // LazyExtensionDeclaration.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is FormalParameter) {
-      LazyFormalParameter.readMetadata(_astReader, node);
+      // LazyFormalParameter.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is FunctionDeclaration) {
-      LazyFunctionDeclaration.readMetadata(_astReader, node);
+      // LazyFunctionDeclaration.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is FunctionTypeAlias) {
-      LazyFunctionTypeAlias.readMetadata(_astReader, node);
+      // LazyFunctionTypeAlias.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is GenericTypeAlias) {
-      LazyGenericTypeAlias.readMetadata(_astReader, node);
+      // LazyGenericTypeAlias.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is MethodDeclaration) {
-      LazyMethodDeclaration.readMetadata(_astReader, node);
+      // LazyMethodDeclaration.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is MixinDeclaration) {
-      LazyMixinDeclaration.readMetadata(_astReader, node);
+      // LazyMixinDeclaration.readMetadata(_astReader, node);
       return node.metadata;
     } else if (node is TypeParameter) {
-      LazyTypeParameter.readMetadata(_astReader, node);
+      // 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);
+        // LazyFieldDeclaration.readMetadata(_astReader, parent2);
         return parent2.metadata;
       } else if (parent2 is TopLevelVariableDeclaration) {
-        LazyTopLevelVariableDeclaration.readMetadata(_astReader, parent2);
+        // LazyTopLevelVariableDeclaration.readMetadata(_astReader, parent2);
         return parent2.metadata;
       }
     }
@@ -565,21 +535,19 @@
     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 LazyFunctionDeclaration.getReturnType(_astReader, node);
+      return LazyAst.getReturnType(node);
+      // return LazyFunctionDeclaration.getReturnType(_astReader, node);
     } else if (node is FunctionTypeAlias) {
-      return LazyFunctionTypeAlias.getReturnType(_astReader, node);
+      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 LazyMethodDeclaration.getReturnType(_astReader, node);
+      return LazyAst.getReturnType(node);
+      // return LazyMethodDeclaration.getReturnType(_astReader, node);
     } else {
       throw UnimplementedError('${node.runtimeType}');
     }
@@ -587,15 +555,12 @@
 
   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}');
@@ -608,10 +573,10 @@
 
   TypeName getSuperclass(AstNode node) {
     if (node is ClassDeclaration) {
-      LazyClassDeclaration.readExtendsClause(_astReader, node);
+      // LazyClassDeclaration.readExtendsClause(_astReader, node);
       return node.extendsClause?.superclass;
     } else if (node is ClassTypeAlias) {
-      LazyClassTypeAlias.readSuperclass(_astReader, node);
+      // LazyClassTypeAlias.readSuperclass(_astReader, node);
       return node.superclass;
     } else {
       throw StateError('${node.runtimeType}');
@@ -623,9 +588,11 @@
     if (node is DefaultFormalParameter) {
       return getType(node.parameter);
     } else if (node is FormalParameter) {
-      return LazyFormalParameter.getType(_astReader, node);
+      return LazyAst.getType(node);
+      // return LazyFormalParameter.getType(_astReader, node);
     } else if (node is VariableDeclaration) {
-      return LazyVariableDeclaration.getType(_astReader, node);
+      return LazyAst.getType(node);
+      // return LazyVariableDeclaration.getType(_astReader, node);
     } else {
       throw UnimplementedError('${node.runtimeType}');
     }
@@ -642,7 +609,7 @@
   }
 
   TypeAnnotation getTypeParameterBound(TypeParameter node) {
-    LazyTypeParameter.readBound(_astReader, node);
+    // LazyTypeParameter.readBound(_astReader, node);
     return node.bound;
   }
 
@@ -660,7 +627,7 @@
     } else if (node is FieldFormalParameter) {
       return node.typeParameters;
     } else if (node is FunctionDeclaration) {
-      LazyFunctionDeclaration.readFunctionExpression(_astReader, node);
+      // LazyFunctionDeclaration.readFunctionExpression(_astReader, node);
       return getTypeParameters2(node.functionExpression);
     } else if (node is FunctionExpression) {
       return node.typeParameters;
@@ -689,10 +656,10 @@
 
   WithClause getWithClause(AstNode node) {
     if (node is ClassDeclaration) {
-      LazyClassDeclaration.readWithClause(_astReader, node);
+      // LazyClassDeclaration.readWithClause(_astReader, node);
       return node.withClause;
     } else if (node is ClassTypeAlias) {
-      LazyClassTypeAlias.readWithClause(_astReader, node);
+      // LazyClassTypeAlias.readWithClause(_astReader, node);
       return node.withClause;
     } else {
       throw UnimplementedError('${node.runtimeType}');
@@ -708,11 +675,9 @@
 
   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;
@@ -779,7 +744,7 @@
     if (node is ConstructorDeclaration) {
       return false;
     } else if (node is FunctionDeclaration) {
-      LazyFunctionDeclaration.readFunctionExpression(_astReader, node);
+      // LazyFunctionDeclaration.readFunctionExpression(_astReader, node);
       return isAsynchronous(node.functionExpression);
     } else if (node is FunctionExpression) {
       return LazyFunctionExpression.isAsynchronous(node);
@@ -859,7 +824,7 @@
     if (node is ConstructorDeclaration) {
       return false;
     } else if (node is FunctionDeclaration) {
-      LazyFunctionDeclaration.readFunctionExpression(_astReader, node);
+      // LazyFunctionDeclaration.readFunctionExpression(_astReader, node);
       return isGenerator(node.functionExpression);
     } else if (node is FunctionExpression) {
       return LazyFunctionExpression.isGenerator(node);
@@ -924,12 +889,27 @@
     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);
+      // LazyFormalParameter.readDefaultValue(_astReader, node);
       return node.defaultValue;
     } else if (node is VariableDeclaration) {
-      LazyVariableDeclaration.readInitializer(_astReader, node);
+      // LazyVariableDeclaration.readInitializer(_astReader, node);
       return node.initializer;
     } else {
       throw StateError('${node.runtimeType}');
@@ -940,7 +920,9 @@
     if (linkedType == null) return null;
 
     var kind = linkedType.kind;
-    if (kind == LinkedNodeTypeKind.dynamic_) {
+    if (kind == LinkedNodeTypeKind.null_) {
+      return null;
+    } else if (kind == LinkedNodeTypeKind.dynamic_) {
       return DynamicTypeImpl.instance;
     } else if (kind == LinkedNodeTypeKind.function) {
       var typeParameterDataList = linkedType.functionTypeParameters;
@@ -951,9 +933,11 @@
         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) {
@@ -969,9 +953,7 @@
         return ParameterElementImpl.synthetic(p.name, type, kind);
       }).toList();
 
-      for (var i = 0; i < typeParametersLength; ++i) {
-        _typeParameters.remove(--_nextSyntheticTypeParameterId);
-      }
+      typeParameterStack.length = typeParameterStackHeight;
 
       FunctionTypeAliasElement typedefElement;
       List<DartType> typedefTypeArguments = const <DartType>[];
@@ -1004,15 +986,7 @@
       var nullabilitySuffix = _nullabilitySuffix(linkedType.nullabilitySuffix);
       return NeverTypeImpl.instance.withNullability(nullabilitySuffix);
     } else if (kind == LinkedNodeTypeKind.typeParameter) {
-      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 element = elementOfIndex(linkedType.typeParameterId);
       var nullabilitySuffix = _nullabilitySuffix(linkedType.nullabilitySuffix);
       return TypeParameterTypeImpl(
         element: element,
@@ -1143,7 +1117,8 @@
       if (directive is PartDirective) {
         partDirectiveIndex++;
         if (partDirectiveIndex == indexInLibrary) {
-          LazyDirective.readMetadata(definingContext._astReader, directive);
+          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 81cf9c2b..8c3b810 100644
--- a/pkg/analyzer/lib/src/summary2/linking_bundle_context.dart
+++ b/pkg/analyzer/lib/src/summary2/linking_bundle_context.dart
@@ -29,8 +29,7 @@
     name: [''],
   );
 
-  final Map<TypeParameterElement, int> _typeParameters = Map.identity();
-  int _nextSyntheticTypeParameterId = 0x10000;
+  final _TypeParameterIndexer typeParameterIndexer = _TypeParameterIndexer();
 
   LinkingBundleContext(this.dynamicReference);
 
@@ -44,21 +43,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);
+      return indexOfReference(dynamicReference) << 1;
     }
 
     var reference = (element as ElementImpl).reference;
-    return indexOfReference(reference);
+    return indexOfReference(reference) << 1;
   }
 
   int indexOfReference(Reference reference) {
@@ -76,9 +75,11 @@
   }
 
   LinkedNodeTypeBuilder writeType(DartType type) {
-    if (type == null) return null;
-
-    if (type.isDynamic) {
+    if (type == null) {
+      return LinkedNodeTypeBuilder(
+        kind: LinkedNodeTypeKind.null_,
+      );
+    } else if (type.isDynamic) {
       return LinkedNodeTypeBuilder(
         kind: LinkedNodeTypeKind.dynamic_,
       );
@@ -97,22 +98,11 @@
         nullabilitySuffix: _nullabilitySuffix(type),
       );
     } else if (type is TypeParameterType) {
-      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,
-        );
-      }
+      return LinkedNodeTypeBuilder(
+        kind: LinkedNodeTypeKind.typeParameter,
+        nullabilitySuffix: _nullabilitySuffix(type),
+        typeParameterId: indexOfElement(type.element),
+      );
     } else if (type is VoidType) {
       return LinkedNodeTypeBuilder(
         kind: LinkedNodeTypeKind.void_,
@@ -156,17 +146,16 @@
     var typeParameterBuilders = <LinkedNodeTypeTypeParameterBuilder>[];
 
     var typeParameters = type.typeFormals;
-    for (var i = 0; i < typeParameters.length; ++i) {
-      var typeParameter = typeParameters[i];
-      _typeParameters[typeParameter] = _nextSyntheticTypeParameterId++;
-      typeParameterBuilders.add(
-        LinkedNodeTypeTypeParameterBuilder(name: typeParameter.name),
-      );
-    }
+    typeParameterIndexer.enter(typeParameters);
 
     for (var i = 0; i < typeParameters.length; ++i) {
       var typeParameter = typeParameters[i];
-      typeParameterBuilders[i].bound = writeType(typeParameter.bound);
+      typeParameterBuilders.add(
+        LinkedNodeTypeTypeParameterBuilder(
+          name: typeParameter.name,
+          bound: writeType(typeParameter.bound),
+        ),
+      );
     }
 
     Element typedefElement;
@@ -199,10 +188,7 @@
       nullabilitySuffix: _nullabilitySuffix(type),
     );
 
-    for (var typeParameter in typeParameters) {
-      _typeParameters.remove(typeParameter);
-      --_nextSyntheticTypeParameterId;
-    }
+    typeParameterIndexer.exit(typeParameters);
 
     return result;
   }
@@ -221,3 +207,27 @@
     }
   }
 }
+
+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/lib/src/task/strong_mode.dart b/pkg/analyzer/lib/src/task/strong_mode.dart
index 2f72a64..e6a5f7c 100644
--- a/pkg/analyzer/lib/src/task/strong_mode.dart
+++ b/pkg/analyzer/lib/src/task/strong_mode.dart
@@ -153,8 +153,11 @@
         name: setterName,
       );
       if (combinedSetter != null) {
-        var type = combinedSetter.parameters[0].type;
-        return typeSystem.nonNullifyLegacy(type);
+        var parameters = combinedSetter.parameters;
+        if (parameters.isNotEmpty) {
+          var type = parameters[0].type;
+          return typeSystem.nonNullifyLegacy(type);
+        }
       }
       return DynamicTypeImpl.instance;
     }
diff --git a/pkg/analyzer/test/generated/invalid_code_test.dart b/pkg/analyzer/test/generated/invalid_code_test.dart
index a116216..fefa0f8 100644
--- a/pkg/analyzer/test/generated/invalid_code_test.dart
+++ b/pkg/analyzer/test/generated/invalid_code_test.dart
@@ -196,11 +196,10 @@
 ''');
   }
 
-  @failingTest
   test_fuzz_12() async {
-    // 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.
+    // 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.
     await _assertCanBeAnalyzed(r'''
 void f({a = [for (@b c = 0;;)]}) {}
 ''');
diff --git a/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart b/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart
index ac4be3b..ad8a1e9 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart
@@ -869,6 +869,19 @@
     _assertSetterTypeDynamic(foo);
   }
 
+  test_setter_single_setter_withoutParameter() async {
+    await resolveTestCode('''
+class A {
+  set foo() {}
+}
+class B implements A {
+  set foo(x) {}
+}
+''');
+    var foo = findElement.setter('foo', of: 'B');
+    _assertSetterType(foo, 'dynamic');
+  }
+
   void _assertFieldType(
     FieldElement field,
     String type, {
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 8e28cd4..6277909 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,6 +16,20 @@
 @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_cli/lib/src/build_mode.dart b/pkg/analyzer_cli/lib/src/build_mode.dart
index 3098758..636e11d 100644
--- a/pkg/analyzer_cli/lib/src/build_mode.dart
+++ b/pkg/analyzer_cli/lib/src/build_mode.dart
@@ -557,7 +557,9 @@
 
   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 126856d..ffd85a2 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -253,34 +253,19 @@
 class B extends A {}
 ''');
 
-      // We don't invoke anything on class `B`, so don't ask its supertype.
-      // So, no dependency on "a".
+      // When we get resolved class `B`, we apply its full resolution.
+      // So, we ask for `A`, so dependency on "a".
       await _assertDependencies('c', [a, b], '''
 import 'package:b/b.dart';
 B x;
-''', [b]);
+''', [a, b]);
 
-      // We infer the type of `x` to `B`.
-      // But we don't ask `B` for its supertype.
-      // So, no dependency on "a".
+      // When we get resolved class `B`, we apply its full resolution.
+      // So, we ask for `A`, so dependency on "a".
       await _assertDependencies('c', [a, b], '''
 import 'package:b/b.dart';
 var x = 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,
-      );
+''', [a, b]);
     });
   }
 
diff --git a/pkg/nnbd_migration/lib/src/front_end/resources/migration.css b/pkg/nnbd_migration/lib/src/front_end/resources/migration.css
index 4c121b8..d847c0d 100644
--- a/pkg/nnbd_migration/lib/src/front_end/resources/migration.css
+++ b/pkg/nnbd_migration/lib/src/front_end/resources/migration.css
@@ -229,6 +229,7 @@
 
 .nav-inner li {
   list-style-type: none;
+  white-space: nowrap;
 }
 
 .nav-inner li:not(.dir) {
diff --git a/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart b/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart
index e3a70a4..3e20299 100644
--- a/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart
@@ -7487,7 +7487,7 @@
 ''';
 
 String _migration_css;
-// migration_css md5 is 'aa4c1eeef41fd9f06779ba7bac691ac2'
+// migration_css md5 is 'd04b15b458b599db0c03c6cb93023a10'
 String _migration_css_base64 = '''
 LyogQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUg
 dGhlIEFVVEhPUlMgZmlsZSAgKi8KLyogZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVz
@@ -7551,139 +7551,139 @@
 dDogNnB4Owp9CgoubmF2LXRyZWUgLm1hdGVyaWFsLWljb25zIHsKICBmb250LXNpemU6IDIwcHg7CiAg
 cG9zaXRpb246IHJlbGF0aXZlOwogIHRvcDogNXB4OwogIG1hcmdpbi1yaWdodDogOHB4OwogIGNvbG9y
 OiAjNjc2NzY3Owp9CgoubmF2LWlubmVyIHVsIHsKICBwYWRkaW5nLWxlZnQ6IDEycHg7CiAgbWFyZ2lu
-OiAwOwp9CgoubmF2LWlubmVyIGxpIHsKICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7Cn0KCi5uYXYtaW5u
-ZXIgbGk6bm90KC5kaXIpIHsKICBtYXJnaW4tbGVmdDogMjBweDsKICBtYXJnaW4tYm90dG9tOiAzcHg7
-Cn0KCi5uYXYtaW5uZXIgbGkuZGlyIC5hcnJvdyB7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6
-IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEwcHg7CiAgbWFyZ2luLXJpZ2h0OiA0cHg7CiAgdHJh
-bnNpdGlvbjogdHJhbnNmb3JtIDAuNXMgZWFzZS1vdXQ7Cn0KCi5uYXYtaW5uZXIgbGkuZGlyIC5hcnJv
-dy5jb2xsYXBzZWQgewogIHRyYW5zZm9ybTogcm90YXRlKC05MGRlZyk7Cn0KCi5uYXYtaW5uZXIgdWwg
-ewogIG1heC1oZWlnaHQ6IDIwMDBweDsKICB0cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuNXMgZWFzZS1v
-dXQ7Cn0KCi5uYXYtaW5uZXIgdWwuY29sbGFwc2VkIHsKICBtYXgtaGVpZ2h0OiAwICFpbXBvcnRhbnQ7
-CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm5hdi1pbm5lciAuc2VsZWN0ZWQtZmlsZSB7CiAgY29sb3I6
-IHdoaXRlOwogIGN1cnNvcjogaW5oZXJpdDsKICBmb250LXdlaWdodDogNjAwOwogIHRleHQtZGVjb3Jh
-dGlvbjogbm9uZTsKfQoKLmVkaXQtY291bnQgewogIGJhY2tncm91bmQtY29sb3I6ICM2NzY3Njc7CiAg
-Ym9yZGVyLXJhZGl1czogMTBweDsKICBjb2xvcjogI2ZmZjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7
-CiAgZm9udC1zaXplOiAxMXB4OwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgbWFyZ2luLWxlZnQ6IDVweDsK
-ICBtaW4td2lkdGg6IDI1cHg7CiAgcGFkZGluZzogNHB4IDAgMnB4IDA7CiAgdGV4dC1hbGlnbjogY2Vu
-dGVyOwogIGxpbmUtaGVpZ2h0OiAxZW07Cn0KCi5jb250ZW50IHsKICBmbGV4OiA0IDMwMHB4OwogIGJh
-Y2tncm91bmQ6ICMxMjIwMmY7CiAgZm9udC1mYW1pbHk6ICJSb2JvdG8gTW9ubyIsIG1vbm9zcGFjZTsK
-ICBtYXJnaW46IDAgNnB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB3aGl0ZS1zcGFjZTogcHJlOwog
-IG92ZXJmbG93OiBzY3JvbGw7Cn0KCi5jb2RlIHsKICBwYWRkaW5nOiAwLjVlbTsKICBwb3NpdGlvbjog
-YWJzb2x1dGU7CiAgbGVmdDogMDsKICB0b3A6IDA7CiAgbWFyZ2luLWxlZnQ6IDU2cHg7Cn0KCi5jb2Rl
-IC53ZWxjb21lIHsKICBmb250LWZhbWlseTogIkdvb2dsZSBTYW5zIiwiUm9ib3RvIixzYW5zLXNlcmlm
-OwogIGZvbnQtc2l6ZTogMThweDsKICBtYXJnaW4tcmlnaHQ6IDYycHg7CiAgY29sb3I6ICM3Nzc7Cn0K
-Ci5jb2RlIC5uYXYtbGluayB7CiAgY29sb3I6ICMxNmFkY2E7CiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6
-IG5vbmU7Cn0KCi5jb2RlIC5uYXYtbGluazp2aXNpdGVkIHsKICBjb2xvcjogIzEzOWJiNTsgLyogIzE2
-YWRjYSBkYXJrZW5lZCAxMCUgKi8KICB0ZXh0LWRlY29yYXRpb24tbGluZTogbm9uZTsKfQoKLmNvZGUg
-Lm5hdi1saW5rOmhvdmVyIHsKICB0ZXh0LWRlY29yYXRpb24tbGluZTogdW5kZXJsaW5lOwogIGZvbnQt
-d2VpZ2h0OiA2MDA7Cn0KCi5yZWdpb25zIHsKICBwYWRkaW5nOiAwLjVlbTsKICBwb3NpdGlvbjogYWJz
-b2x1dGU7CiAgbGVmdDogMDsKICB0b3A6IDA7Cn0KCi5yZWdpb25zIHRhYmxlIHsKICBib3JkZXItc3Bh
-Y2luZzogMDsKICBmb250LXNpemU6IGluaGVyaXQ7Cn0KCi5yZWdpb25zIHRkIHsKICBib3JkZXI6IG5v
-bmU7CiAgLyogVGhlIGNvbnRlbnQgb2YgdGhlIHJlZ2lvbnMgaXMgbm90IHZpc2libGU7IHRoZSB1c2Vy
-IGluc3RlYWQgd2lsbCBzZWUgdGhlCiAgICogaGlnaGxpZ2h0ZWQgY29weSBvZiB0aGUgY29udGVudC4g
-Ki8KICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwKTsKICBwYWRkaW5nOiAwOwogIHdoaXRlLXNw
-YWNlOiBwcmU7Cn0KCi5yZWdpb25zIHRkOmVtcHR5OmFmdGVyIHsKICBjb250ZW50OiAiXDAwYTAiOwp9
-CgoucmVnaW9ucyB0ci5oaWdobGlnaHQgdGQ6bGFzdC1jaGlsZCB7CiAgYmFja2dyb3VuZC1jb2xvcjog
-IzQ0NDQ0NDsKICBjb2xvcjogd2hpdGU7Cn0KCi5yZWdpb25zIHRkLmxpbmUtbm8gewogIGJvcmRlci1y
-aWdodDogc29saWQgIzEyMjAyZiAycHg7CiAgY29sb3I6ICM5OTk5OTk7CiAgcGFkZGluZy1yaWdodDog
-NHB4OwogIHRleHQtYWxpZ246IHJpZ2h0OwogIHZpc2liaWxpdHk6IHZpc2libGU7CiAgd2lkdGg6IDUw
-cHg7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgoucmVnaW9ucyB0ci5oaWdobGlnaHQgdGQubGlu
-ZS1ubyB7CiAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAjY2NjIDJweDsKfQoKLnJlZ2lvbiB7CiAgZGlzcGxh
-eTogaW5saW5lLWJsb2NrOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB2aXNpYmlsaXR5OiB2aXNpYmxl
-OwogIHotaW5kZXg6IDIwMDsKfQoKLnJlZ2lvbi5hZGRlZC1yZWdpb24gewogIGJhY2tncm91bmQtY29s
-b3I6ICMxNzhhZmQ7CiAgY29sb3I6ICNmZmY7Cn0KCi5yZWdpb24ucmVtb3ZlZC1yZWdpb24gewogIGJh
-Y2tncm91bmQtY29sb3I6ICNGQTU1N2Q7IC8qICRkYXJrLXBpbmsgKi8KICBjb2xvcjogI2ZmZjsKfQoK
-LnJlZ2lvbi5pbmZvcm1hdGl2ZS1yZWdpb24gewogIGJhY2tncm91bmQtY29sb3I6ICMyNjM5NTI7CiAg
-Y29sb3I6ICNmZmY7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGhlaWdodDogMTVweDsKICBwb3Np
-dGlvbjogcmVsYXRpdmU7CiAgdG9wOiAycHg7Cn0KCi50YXJnZXQgewogIGJhY2tncm91bmQtY29sb3I6
-ICM0NDQ7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZpc2liaWxpdHk6IHZpc2libGU7CiAgZm9udC13
-ZWlnaHQ6IDYwMDsKfQoKLmluZm8tcGFuZWwgewogIGZsZXg6IDEgMjAwcHg7CiAgbWFyZ2luOiAwOwog
-IGhlaWdodDogMTAwJTsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47Cn0K
-Ci5pbmZvLXBhbmVsIC5lZGl0LXBhbmVsIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTIyMDJmOwogIG92
-ZXJmbG93OiBhdXRvOwp9CgouaW5mby1wYW5lbCAucGFuZWwtY29udGVudCB7CiAgcGFkZGluZzogN3B4
-Owp9CgouaW5mby1wYW5lbCAucGFuZWwtY29udGVudD4gOmZpcnN0LWNoaWxkIHsKICBtYXJnaW4tdG9w
-OiAwOwp9CgouaW5mby1wYW5lbCAubm93cmFwIHsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgouaW5m
-by1wYW5lbCB1bCwKLmluZm8tcGFuZWwgb2wgewogIHBhZGRpbmctbGVmdDogMjBweDsKfQoKLmluZm8t
-cGFuZWwgbGkgewogIG1hcmdpbjogMCAwIDVweCAwOwp9CgouaW5mby1wYW5lbCBhIHsKICBjb2xvcjog
-IzEzOWJiNTsKfQoKLmluZm8tcGFuZWwgYTpob3ZlciB7CiAgY29sb3I6ICMxZWM3ZTc7IC8qICMxMzli
-YjUgbGlnaHRlbmVkIDIwJSAqLwp9CgouaW5mby1wYW5lbCAuZWRpdC1saXN0IHsKICBiYWNrZ3JvdW5k
-LWNvbG9yOiAjMTIyMDJmOwogIG92ZXJmbG93OiBhdXRvOwp9CgouZWRpdC1wYW5lbCB7CiAgbWFyZ2lu
-LXRvcDogNnB4OwogIGZsZXg6IDEgMTAwcHg7Cn0KCi5lZGl0LWxpc3QgewogIGZsZXg6IDIgMTAwcHg7
-Cn0KCi5lZGl0LWxpc3QgLmVkaXQgewogIG1hcmdpbjogM3B4IDA7Cn0KCi5lZGl0LWxpc3QgLmVkaXQt
-bGluayB7CiAgY3Vyc29yOiBwb2ludGVyOwp9CgoucG9wdXAtcGFuZSB7CiAgZGlzcGxheTogbm9uZTsK
-ICBwb3NpdGlvbjogZml4ZWQ7CiAgdG9wOiAxNTBweDsKICBsZWZ0OiAxNTBweDsKICByaWdodDogMTUw
-cHg7CiAgYm90dG9tOiAxNTBweDsKICBib3JkZXI6IDFweCBzb2xpZCBibGFjazsKICBib3JkZXItdG9w
-OiAycHggc29saWQgYmxhY2s7CiAgYm9yZGVyLXJhZGl1czogN3B4OwogIGJveC1zaGFkb3c6IDBweCAw
-cHggMjBweCAycHggI2I0YmZjYjIyOwogIHotaW5kZXg6IDQwMDsKICBiYWNrZ3JvdW5kOiAjMmIzMDM2
-OwogIHBhZGRpbmc6IDIwcHg7Cn0KCi5wb3B1cC1wYW5lIC5jbG9zZSB7CiAgcG9zaXRpb246IGFic29s
-dXRlOwogIHJpZ2h0OiAxMHB4OwogIHRvcDogMTBweDsKICBjdXJzb3I6IHBvaW50ZXI7CiAgdGV4dC1z
-aGFkb3c6IDFweCAxcHggMnB4ICM4ODg7CiAgYm94LXNoYWRvdzogMXB4IDFweCAycHggIzExMTsKfQoK
-LnBvcHVwLXBhbmUgaDIgewogIHBhZGRpbmc6IDIxcHg7CiAgaGVpZ2h0OiAxMCU7CiAgbWFyZ2luOiAw
-cHg7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQoKLnBvcHVwLXBhbmUgcCB7CiAgaGVpZ2h0OiAx
-MCU7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICBwYWRkaW5nOiAwcHggMjBweDsKfQoKLnBvcHVw
-LXBhbmUgcHJlIHsKICBiYWNrZ3JvdW5kOiAjMTIyMDJmOwogIHBhZGRpbmc6IDIwcHg7CiAgYm90dG9t
-OiAwcHg7CiAgb3ZlcmZsb3c6IGF1dG8gc2Nyb2xsOwogIGhlaWdodDogNjUlOwogIG1hcmdpbjogMHB4
-OwogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5wb3B1cC1wYW5lIC5idXR0b24uYm90dG9tIHsK
-ICBtYXJnaW46IDIwcHggMHB4OwogIGRpc3BsYXk6IGJsb2NrOwogIHRleHQtYWxpZ246IGNlbnRlcjsK
-fQoKLnJlcnVubmluZy1wYW5lIHsKICBkaXNwbGF5OiBub25lOwp9Cgpib2R5LnJlcnVubmluZyAucmVy
-dW5uaW5nLXBhbmUgewogIGRpc3BsYXk6IGJsb2NrOwogIHBvc2l0aW9uOiBmaXhlZDsKICB0b3A6IDBw
-eDsKICBib3R0b206IDBweDsKICBsZWZ0OiAwcHg7CiAgcmlnaHQ6IDBweDsKICBiYWNrZ3JvdW5kLWNv
-bG9yOiAjMDAwMDAwQUE7IC8qIHRyYW5zbHVjZW50IGJsYWNrICovCiAgei1pbmRleDogNDAwOwp9Cgou
-cmVydW5uaW5nLXBhbmUgaDEgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDUwJTsKICBsZWZ0
-OiA1MCU7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7Cn0KCi5lZGl0LXBhbmVsIC50
-eXBlLWRlc2NyaXB0aW9uIHsKICAvKiBGcm9tIERhcnRQYWQgJGRhcmstb3JhbmdlICovCiAgY29sb3I6
-ICNmZjkxNmU7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKfQoKdWwudHJhY2UgewogIGZvbnQtc2l6
-ZTogMTNweDsKICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgcGFkZGluZy1sZWZ0OiAwcHg7Cn0KCnVs
-LnRyYWNlIGxpIHsKICBjb2xvcjogd2hpdGU7Cn0KCnVsLnRyYWNlIGxpIC5mdW5jdGlvbiB7CiAgLyog
-ZnJvbSAuaGxqcy12YXJpYWJsZSAqLwogIGNvbG9yOiAjMTZhZGNhOwogIGZvbnQtZmFtaWx5OiBtb25v
-c3BhY2U7CiAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKdWwudHJhY2UgbGkgcC5kcmF3ZXIgewogIG1hcmdp
-bjogM3B4IDBweDsKICBwYWRkaW5nOiAwcHggMHB4IDBweCAxNHB4Owp9Cgp1bC50cmFjZSBsaSBwLmRy
-YXdlciBidXR0b24gewogIG1hcmdpbi1yaWdodDogM3B4Owp9CgouZWxldmF0aW9uLXo0IHsKICBib3gt
-c2hhZG93OiAwcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwKICAgICAgMHB4IDRweCA1
-cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgIDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAw
-LCAwLCAuMTIpOwp9CgphIHsKICBjb2xvcjogI2NjYzsKICBmaWxsOiAjY2NjOwogIHRleHQtZGVjb3Jh
-dGlvbjogbm9uZTsKfQoKYTpob3ZlciB7CiAgY29sb3I6ICNkYmRiZGI7IC8qICNjY2MgbGlnaHRlbnRl
-ZCAzMCUqLwogIGZpbGw6ICNmZmY7Cn0KCi5hZGQtaGludC1saW5rIHsKICBkaXNwbGF5OiBpbmxpbmUt
-YmxvY2s7CiAgbWFyZ2luOiAzcHg7Cn0KCi5hZGQtaGludC1saW5rOmhvdmVyIHsKICBjb2xvcjogI2Zm
-ZjsKfQoKaGVhZGVyIGJ1dHRvbiB7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKaGVhZGVy
-IGEgewogIG1hcmdpbjogMDsKfQoKLyogQ2FyZWZ1bCBoZXJlLiBgYS5idXR0b25gIGlzIHJlcGV0aXRp
-dmUgYnV0IHJlcXVpcmVkIHRvIGdldCBjb3JyZWN0CiAqIHNwZWNpZmljaXR5ICovCmJ1dHRvbiwgLmJ1
-dHRvbiwgYS5idXR0b24gewogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjIsIDEzOCwgMjUzLCAwLjE1
-KTsKICBib3JkZXI6IG5vbmU7CiAgYm9yZGVyLXJhZGl1czogM3B4OwogIHBhZGRpbmc6IDNweCAxMHB4
-OwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgZm9udC1mb250OiBSb2JvdG8sIHNhbnMtc2VyaWY7CiAgY29s
-b3I6ICNmZmY7Cn0KCmJ1dHRvbjpob3ZlciwgLmJ1dHRvbjpob3ZlciB7CiAgYmFja2dyb3VuZC1jb2xv
-cjogcmdiYSgyMiwgMTM4LCAyNTMsIDAuMjkpOwogIGN1cnNvcjogcG9pbnRlcjsKfQoKYnV0dG9uW2Rp
-c2FibGVkXSB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwuMTIpOwogIGNvbG9y
-OiByZ2JhKDI1NSwyNTUsMjU1LC4zNyk7CiAgY3Vyc29yOiBub3QtYWxsb3dlZDsKfQoKLyogQ2hhbmdl
-IGVkaXQgcGFuZWwgYnV0dG9uIGNvbG9ycyAqLwouZWRpdC1wYW5lbCAuYnV0dG9uLCAuZWRpdC1wYW5l
-bCBidXR0b24gewogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNjMsIDEwNCwgMTQ4LCAwLjYpOwogIGNv
-bG9yOiB3aGl0ZTsKfQouZWRpdC1wYW5lbCAuYnV0dG9uOmhvdmVyLCAuZWRpdC1wYW5lbCBidXR0b246
-aG92ZXIgewogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTAxLCAxNTMsIDIwOCwgMC42KTsKICBjb2xv
-cjogd2hpdGU7Cn0KCi8qCiAqIEFkanVzdG1lbnRzIHRvIGFsaWduIG1hdGVyaWFsIGljb25zIGluIHRo
-ZSB0b29sYmFyIGJ1dHRvbnMuCiovCi5hY3Rpb24tYnV0dG9uID4gc3BhbiB7CiAgcG9zaXRpb246cmVs
-YXRpdmU7CiAgdG9wOiAtM3B4Owp9CgouYWN0aW9uLWJ1dHRvbiAubWF0ZXJpYWwtaWNvbnMgewogIHRv
-cDogNHB4Owp9CgovKiBEb24ndCBzaGlmdCB0aGUgaWNvbiB3aGVuIGl0J3MgYSBkaXJlY3QgY2hpbGQg
-b2YgdGhlIGJ1dHRvbiAqLwouYWN0aW9uLWJ1dHRvbiA+IC5tYXRlcmlhbC1pY29ucyB7CiAgdG9wOiAx
-cHg7Cn0KCi8qIFNoaWZ0IHRoZSB0ZXh0IHRvIGNlbnRlciB3aXRoIHRoZSBpY29uLiAqLwouYWN0aW9u
-LWJ1dHRvbiA+IHNwYW4ubGFiZWwgewogIHBvc2l0aW9uOnJlbGF0aXZlOwogIHRvcDogLTRweDsKfQoK
-LmFjdGlvbi1idXR0b24gLm1hdGVyaWFsLWljb25zIHsKICBmb250LXNpemU6IDIwcHg7CiAgcG9zaXRp
-b246IHJlbGF0aXZlOwp9CgoucGxhY2Vob2xkZXIgewogIGNvbG9yOiAjNzc3OwogIHRleHQtYWxpZ246
-IGNlbnRlcjsKICBtYXJnaW4tdG9wOiAzZW0gIWltcG9ydGFudDsKfQoKLyoqCiAqIEhMSlMgT3ZlcnJp
-ZGVzCiAqLwouaGxqcyB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzEyMjAyZjsgLyogJGRhcmstY29kZS1i
-YWNrZ3JvdW5kLWNvbG9yICovCiAgY29sb3I6ICNjMGMyYzU7IC8qICRkYXJrLWVkaXRvci10ZXh0ICov
-CiAgZGlzcGxheTogYmxvY2s7CiAgb3ZlcmZsb3cteDogYXV0bzsKICBwYWRkaW5nOiAwLjVlbTsKICAv
-KioKICAgKiBUaGlzIGFsbG93cyB0aGUgcGVyLWxpbmUgaGlnaGxpZ2h0cyB0byBzaG93LgogICAqLwog
-IGJhY2tncm91bmQ6IG5vbmU7Cn0KCi5obGpzLWtleXdvcmQsCi5obGpzLXNlbGVjdG9yLXRhZywKLmhs
-anMtZGVsZXRpb24gewogIGNvbG9yOiAjNTFjNjg2OyAvKiBjbS1rZXl3b3JkICovCn0KCi5obGpzLW51
-bWJlciB7CiAgY29sb3I6ICM2Mjc5Nzg7IC8qIGNtLW51bWJlciAqLwp9CgouaGxqcy1jb21tZW50IHsK
-ICBjb2xvcjogIzkxOThiNDsgLyogY20tY29tbWVudCAqLwp9CgouaGxqcy1saXRlcmFsIHsKICBjb2xv
-cjogI2VlODY2NjsgLyogY20tYXRvbSAqLwp9CgouaGxqcy1zdHJpbmcgewogIGNvbG9yOiAjZTU1MDc0
-OyAvKiBjbS1zdHJpbmcgKi8KfQoKLmhsanMtdmFyaWFibGUgewogIGNvbG9yOiAjMTZhZGNhOyAvKiBj
-bS12YXJpYWJsZSAqLwp9CgouaGxqcy1saW5rIHsKICBjb2xvcjogI2U1NTA3NDsgLyogY20tc3RyaW5n
-ICovCn0KLmhsanMtc2VjdGlvbiwKLmhsanMtdHlwZSwKLmhsanMtYnVpbHRfaW4sCi5obGpzLXRpdGxl
-IHsKICBjb2xvcjogI2VlODY2NjsgLyogY20tdmFyaWFibGUtMiAqLwp9CgouaGxqcy1hZGRpdGlvbiB7
-CiAgY29sb3I6ICMyNjM5NTI7IC8qICRkYXJrLXNlbGVjdGlvbi1jb2xvciAqLwp9CgouaGxqcy1tZXRh
-IHsKICBjb2xvcjogIzYyNzk3ODsKfQo=
+OiAwOwp9CgoubmF2LWlubmVyIGxpIHsKICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgd2hpdGUtc3Bh
+Y2U6IG5vd3JhcDsKfQoKLm5hdi1pbm5lciBsaTpub3QoLmRpcikgewogIG1hcmdpbi1sZWZ0OiAyMHB4
+OwogIG1hcmdpbi1ib3R0b206IDNweDsKfQoKLm5hdi1pbm5lciBsaS5kaXIgLmFycm93IHsKICBjdXJz
+b3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTBweDsKICBt
+YXJnaW4tcmlnaHQ6IDRweDsKICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC41cyBlYXNlLW91dDsKfQoK
+Lm5hdi1pbm5lciBsaS5kaXIgLmFycm93LmNvbGxhcHNlZCB7CiAgdHJhbnNmb3JtOiByb3RhdGUoLTkw
+ZGVnKTsKfQoKLm5hdi1pbm5lciB1bCB7CiAgbWF4LWhlaWdodDogMjAwMHB4OwogIHRyYW5zaXRpb246
+IG1heC1oZWlnaHQgMC41cyBlYXNlLW91dDsKfQoKLm5hdi1pbm5lciB1bC5jb2xsYXBzZWQgewogIG1h
+eC1oZWlnaHQ6IDAgIWltcG9ydGFudDsKICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubmF2LWlubmVyIC5z
+ZWxlY3RlZC1maWxlIHsKICBjb2xvcjogd2hpdGU7CiAgY3Vyc29yOiBpbmhlcml0OwogIGZvbnQtd2Vp
+Z2h0OiA2MDA7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9CgouZWRpdC1jb3VudCB7CiAgYmFja2dy
+b3VuZC1jb2xvcjogIzY3Njc2NzsKICBib3JkZXItcmFkaXVzOiAxMHB4OwogIGNvbG9yOiAjZmZmOwog
+IGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDExcHg7CiAgZm9udC13ZWlnaHQ6IDYw
+MDsKICBtYXJnaW4tbGVmdDogNXB4OwogIG1pbi13aWR0aDogMjVweDsKICBwYWRkaW5nOiA0cHggMCAy
+cHggMDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgbGluZS1oZWlnaHQ6IDFlbTsKfQoKLmNvbnRlbnQg
+ewogIGZsZXg6IDQgMzAwcHg7CiAgYmFja2dyb3VuZDogIzEyMjAyZjsKICBmb250LWZhbWlseTogIlJv
+Ym90byBNb25vIiwgbW9ub3NwYWNlOwogIG1hcmdpbjogMCA2cHg7CiAgcG9zaXRpb246IHJlbGF0aXZl
+OwogIHdoaXRlLXNwYWNlOiBwcmU7CiAgb3ZlcmZsb3c6IHNjcm9sbDsKfQoKLmNvZGUgewogIHBhZGRp
+bmc6IDAuNWVtOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBsZWZ0OiAwOwogIHRvcDogMDsKICBtYXJn
+aW4tbGVmdDogNTZweDsKfQoKLmNvZGUgLndlbGNvbWUgewogIGZvbnQtZmFtaWx5OiAiR29vZ2xlIFNh
+bnMiLCJSb2JvdG8iLHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxOHB4OwogIG1hcmdpbi1yaWdodDog
+NjJweDsKICBjb2xvcjogIzc3NzsKfQoKLmNvZGUgLm5hdi1saW5rIHsKICBjb2xvcjogIzE2YWRjYTsK
+ICB0ZXh0LWRlY29yYXRpb24tbGluZTogbm9uZTsKfQoKLmNvZGUgLm5hdi1saW5rOnZpc2l0ZWQgewog
+IGNvbG9yOiAjMTM5YmI1OyAvKiAjMTZhZGNhIGRhcmtlbmVkIDEwJSAqLwogIHRleHQtZGVjb3JhdGlv
+bi1saW5lOiBub25lOwp9CgouY29kZSAubmF2LWxpbms6aG92ZXIgewogIHRleHQtZGVjb3JhdGlvbi1s
+aW5lOiB1bmRlcmxpbmU7CiAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLnJlZ2lvbnMgewogIHBhZGRpbmc6
+IDAuNWVtOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBsZWZ0OiAwOwogIHRvcDogMDsKfQoKLnJlZ2lv
+bnMgdGFibGUgewogIGJvcmRlci1zcGFjaW5nOiAwOwogIGZvbnQtc2l6ZTogaW5oZXJpdDsKfQoKLnJl
+Z2lvbnMgdGQgewogIGJvcmRlcjogbm9uZTsKICAvKiBUaGUgY29udGVudCBvZiB0aGUgcmVnaW9ucyBp
+cyBub3QgdmlzaWJsZTsgdGhlIHVzZXIgaW5zdGVhZCB3aWxsIHNlZSB0aGUKICAgKiBoaWdobGlnaHRl
+ZCBjb3B5IG9mIHRoZSBjb250ZW50LiAqLwogIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDApOwog
+IHBhZGRpbmc6IDA7CiAgd2hpdGUtc3BhY2U6IHByZTsKfQoKLnJlZ2lvbnMgdGQ6ZW1wdHk6YWZ0ZXIg
+ewogIGNvbnRlbnQ6ICJcMDBhMCI7Cn0KCi5yZWdpb25zIHRyLmhpZ2hsaWdodCB0ZDpsYXN0LWNoaWxk
+IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDQ0NDQ0OwogIGNvbG9yOiB3aGl0ZTsKfQoKLnJlZ2lvbnMg
+dGQubGluZS1ubyB7CiAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAjMTIyMDJmIDJweDsKICBjb2xvcjogIzk5
+OTk5OTsKICBwYWRkaW5nLXJpZ2h0OiA0cHg7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgdmlzaWJpbGl0
+eTogdmlzaWJsZTsKICB3aWR0aDogNTBweDsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5yZWdp
+b25zIHRyLmhpZ2hsaWdodCB0ZC5saW5lLW5vIHsKICBib3JkZXItcmlnaHQ6IHNvbGlkICNjY2MgMnB4
+Owp9CgoucmVnaW9uIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgcG9zaXRpb246IHJlbGF0aXZl
+OwogIHZpc2liaWxpdHk6IHZpc2libGU7CiAgei1pbmRleDogMjAwOwp9CgoucmVnaW9uLmFkZGVkLXJl
+Z2lvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzE3OGFmZDsKICBjb2xvcjogI2ZmZjsKfQoKLnJlZ2lv
+bi5yZW1vdmVkLXJlZ2lvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogI0ZBNTU3ZDsgLyogJGRhcmstcGlu
+ayAqLwogIGNvbG9yOiAjZmZmOwp9CgoucmVnaW9uLmluZm9ybWF0aXZlLXJlZ2lvbiB7CiAgYmFja2dy
+b3VuZC1jb2xvcjogIzI2Mzk1MjsKICBjb2xvcjogI2ZmZjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7
+CiAgaGVpZ2h0OiAxNXB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB0b3A6IDJweDsKfQoKLnRhcmdl
+dCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzQ0NDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmlzaWJp
+bGl0eTogdmlzaWJsZTsKICBmb250LXdlaWdodDogNjAwOwp9CgouaW5mby1wYW5lbCB7CiAgZmxleDog
+MSAyMDBweDsKICBtYXJnaW46IDA7CiAgaGVpZ2h0OiAxMDAlOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxl
+eC1kaXJlY3Rpb246IGNvbHVtbjsKfQoKLmluZm8tcGFuZWwgLmVkaXQtcGFuZWwgewogIGJhY2tncm91
+bmQtY29sb3I6ICMxMjIwMmY7CiAgb3ZlcmZsb3c6IGF1dG87Cn0KCi5pbmZvLXBhbmVsIC5wYW5lbC1j
+b250ZW50IHsKICBwYWRkaW5nOiA3cHg7Cn0KCi5pbmZvLXBhbmVsIC5wYW5lbC1jb250ZW50PiA6Zmly
+c3QtY2hpbGQgewogIG1hcmdpbi10b3A6IDA7Cn0KCi5pbmZvLXBhbmVsIC5ub3dyYXAgewogIHdoaXRl
+LXNwYWNlOiBub3dyYXA7Cn0KCi5pbmZvLXBhbmVsIHVsLAouaW5mby1wYW5lbCBvbCB7CiAgcGFkZGlu
+Zy1sZWZ0OiAyMHB4Owp9CgouaW5mby1wYW5lbCBsaSB7CiAgbWFyZ2luOiAwIDAgNXB4IDA7Cn0KCi5p
+bmZvLXBhbmVsIGEgewogIGNvbG9yOiAjMTM5YmI1Owp9CgouaW5mby1wYW5lbCBhOmhvdmVyIHsKICBj
+b2xvcjogIzFlYzdlNzsgLyogIzEzOWJiNSBsaWdodGVuZWQgMjAlICovCn0KCi5pbmZvLXBhbmVsIC5l
+ZGl0LWxpc3QgewogIGJhY2tncm91bmQtY29sb3I6ICMxMjIwMmY7CiAgb3ZlcmZsb3c6IGF1dG87Cn0K
+Ci5lZGl0LXBhbmVsIHsKICBtYXJnaW4tdG9wOiA2cHg7CiAgZmxleDogMSAxMDBweDsKfQoKLmVkaXQt
+bGlzdCB7CiAgZmxleDogMiAxMDBweDsKfQoKLmVkaXQtbGlzdCAuZWRpdCB7CiAgbWFyZ2luOiAzcHgg
+MDsKfQoKLmVkaXQtbGlzdCAuZWRpdC1saW5rIHsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5wb3B1cC1w
+YW5lIHsKICBkaXNwbGF5OiBub25lOwogIHBvc2l0aW9uOiBmaXhlZDsKICB0b3A6IDE1MHB4OwogIGxl
+ZnQ6IDE1MHB4OwogIHJpZ2h0OiAxNTBweDsKICBib3R0b206IDE1MHB4OwogIGJvcmRlcjogMXB4IHNv
+bGlkIGJsYWNrOwogIGJvcmRlci10b3A6IDJweCBzb2xpZCBibGFjazsKICBib3JkZXItcmFkaXVzOiA3
+cHg7CiAgYm94LXNoYWRvdzogMHB4IDBweCAyMHB4IDJweCAjYjRiZmNiMjI7CiAgei1pbmRleDogNDAw
+OwogIGJhY2tncm91bmQ6ICMyYjMwMzY7CiAgcGFkZGluZzogMjBweDsKfQoKLnBvcHVwLXBhbmUgLmNs
+b3NlIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgcmlnaHQ6IDEwcHg7CiAgdG9wOiAxMHB4OwogIGN1
+cnNvcjogcG9pbnRlcjsKICB0ZXh0LXNoYWRvdzogMXB4IDFweCAycHggIzg4ODsKICBib3gtc2hhZG93
+OiAxcHggMXB4IDJweCAjMTExOwp9CgoucG9wdXAtcGFuZSBoMiB7CiAgcGFkZGluZzogMjFweDsKICBo
+ZWlnaHQ6IDEwJTsKICBtYXJnaW46IDBweDsKICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgoucG9w
+dXAtcGFuZSBwIHsKICBoZWlnaHQ6IDEwJTsKICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogIHBhZGRp
+bmc6IDBweCAyMHB4Owp9CgoucG9wdXAtcGFuZSBwcmUgewogIGJhY2tncm91bmQ6ICMxMjIwMmY7CiAg
+cGFkZGluZzogMjBweDsKICBib3R0b206IDBweDsKICBvdmVyZmxvdzogYXV0byBzY3JvbGw7CiAgaGVp
+Z2h0OiA2NSU7CiAgbWFyZ2luOiAwcHg7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQoKLnBvcHVw
+LXBhbmUgLmJ1dHRvbi5ib3R0b20gewogIG1hcmdpbjogMjBweCAwcHg7CiAgZGlzcGxheTogYmxvY2s7
+CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgoucmVydW5uaW5nLXBhbmUgewogIGRpc3BsYXk6IG5vbmU7
+Cn0KCmJvZHkucmVydW5uaW5nIC5yZXJ1bm5pbmctcGFuZSB7CiAgZGlzcGxheTogYmxvY2s7CiAgcG9z
+aXRpb246IGZpeGVkOwogIHRvcDogMHB4OwogIGJvdHRvbTogMHB4OwogIGxlZnQ6IDBweDsKICByaWdo
+dDogMHB4OwogIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDBBQTsgLyogdHJhbnNsdWNlbnQgYmxhY2sg
+Ki8KICB6LWluZGV4OiA0MDA7Cn0KCi5yZXJ1bm5pbmctcGFuZSBoMSB7CiAgcG9zaXRpb246IGFic29s
+dXRlOwogIHRvcDogNTAlOwogIGxlZnQ6IDUwJTsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAt
+NTAlKTsKfQoKLmVkaXQtcGFuZWwgLnR5cGUtZGVzY3JpcHRpb24gewogIC8qIEZyb20gRGFydFBhZCAk
+ZGFyay1vcmFuZ2UgKi8KICBjb2xvcjogI2ZmOTE2ZTsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwp9
+Cgp1bC50cmFjZSB7CiAgZm9udC1zaXplOiAxM3B4OwogIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKICBw
+YWRkaW5nLWxlZnQ6IDBweDsKfQoKdWwudHJhY2UgbGkgewogIGNvbG9yOiB3aGl0ZTsKfQoKdWwudHJh
+Y2UgbGkgLmZ1bmN0aW9uIHsKICAvKiBmcm9tIC5obGpzLXZhcmlhYmxlICovCiAgY29sb3I6ICMxNmFk
+Y2E7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXdlaWdodDogNjAwOwp9Cgp1bC50cmFj
+ZSBsaSBwLmRyYXdlciB7CiAgbWFyZ2luOiAzcHggMHB4OwogIHBhZGRpbmc6IDBweCAwcHggMHB4IDE0
+cHg7Cn0KCnVsLnRyYWNlIGxpIHAuZHJhd2VyIGJ1dHRvbiB7CiAgbWFyZ2luLXJpZ2h0OiAzcHg7Cn0K
+Ci5lbGV2YXRpb24tejQgewogIGJveC1zaGFkb3c6IDBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAw
+LCAwLjIpLAogICAgICAwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgMHB4
+IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIC4xMik7Cn0KCmEgewogIGNvbG9yOiAjY2NjOwogIGZp
+bGw6ICNjY2M7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9CgphOmhvdmVyIHsKICBjb2xvcjogI2Ri
+ZGJkYjsgLyogI2NjYyBsaWdodGVudGVkIDMwJSovCiAgZmlsbDogI2ZmZjsKfQoKLmFkZC1oaW50LWxp
+bmsgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBtYXJnaW46IDNweDsKfQoKLmFkZC1oaW50LWxp
+bms6aG92ZXIgewogIGNvbG9yOiAjZmZmOwp9CgpoZWFkZXIgYnV0dG9uIHsKICB0ZXh0LXRyYW5zZm9y
+bTogdXBwZXJjYXNlOwp9CgpoZWFkZXIgYSB7CiAgbWFyZ2luOiAwOwp9CgovKiBDYXJlZnVsIGhlcmUu
+IGBhLmJ1dHRvbmAgaXMgcmVwZXRpdGl2ZSBidXQgcmVxdWlyZWQgdG8gZ2V0IGNvcnJlY3QKICogc3Bl
+Y2lmaWNpdHkgKi8KYnV0dG9uLCAuYnV0dG9uLCBhLmJ1dHRvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjog
+cmdiYSgyMiwgMTM4LCAyNTMsIDAuMTUpOwogIGJvcmRlcjogbm9uZTsKICBib3JkZXItcmFkaXVzOiAz
+cHg7CiAgcGFkZGluZzogM3B4IDEwcHg7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBmb250LWZvbnQ6IFJv
+Ym90bywgc2Fucy1zZXJpZjsKICBjb2xvcjogI2ZmZjsKfQoKYnV0dG9uOmhvdmVyLCAuYnV0dG9uOmhv
+dmVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIyLCAxMzgsIDI1MywgMC4yOSk7CiAgY3Vyc29y
+OiBwb2ludGVyOwp9CgpidXR0b25bZGlzYWJsZWRdIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1
+NSwyNTUsMjU1LC4xMik7CiAgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsLjM3KTsKICBjdXJzb3I6IG5v
+dC1hbGxvd2VkOwp9CgovKiBDaGFuZ2UgZWRpdCBwYW5lbCBidXR0b24gY29sb3JzICovCi5lZGl0LXBh
+bmVsIC5idXR0b24sIC5lZGl0LXBhbmVsIGJ1dHRvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg2
+MywgMTA0LCAxNDgsIDAuNik7CiAgY29sb3I6IHdoaXRlOwp9Ci5lZGl0LXBhbmVsIC5idXR0b246aG92
+ZXIsIC5lZGl0LXBhbmVsIGJ1dHRvbjpob3ZlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgxMDEs
+IDE1MywgMjA4LCAwLjYpOwogIGNvbG9yOiB3aGl0ZTsKfQoKLyoKICogQWRqdXN0bWVudHMgdG8gYWxp
+Z24gbWF0ZXJpYWwgaWNvbnMgaW4gdGhlIHRvb2xiYXIgYnV0dG9ucy4KKi8KLmFjdGlvbi1idXR0b24g
+PiBzcGFuIHsKICBwb3NpdGlvbjpyZWxhdGl2ZTsKICB0b3A6IC0zcHg7Cn0KCi5hY3Rpb24tYnV0dG9u
+IC5tYXRlcmlhbC1pY29ucyB7CiAgdG9wOiA0cHg7Cn0KCi8qIERvbid0IHNoaWZ0IHRoZSBpY29uIHdo
+ZW4gaXQncyBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgYnV0dG9uICovCi5hY3Rpb24tYnV0dG9uID4gLm1h
+dGVyaWFsLWljb25zIHsKICB0b3A6IDFweDsKfQoKLyogU2hpZnQgdGhlIHRleHQgdG8gY2VudGVyIHdp
+dGggdGhlIGljb24uICovCi5hY3Rpb24tYnV0dG9uID4gc3Bhbi5sYWJlbCB7CiAgcG9zaXRpb246cmVs
+YXRpdmU7CiAgdG9wOiAtNHB4Owp9CgouYWN0aW9uLWJ1dHRvbiAubWF0ZXJpYWwtaWNvbnMgewogIGZv
+bnQtc2l6ZTogMjBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5wbGFjZWhvbGRlciB7CiAgY29s
+b3I6ICM3Nzc7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIG1hcmdpbi10b3A6IDNlbSAhaW1wb3J0YW50
+Owp9CgovKioKICogSExKUyBPdmVycmlkZXMKICovCi5obGpzIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAj
+MTIyMDJmOyAvKiAkZGFyay1jb2RlLWJhY2tncm91bmQtY29sb3IgKi8KICBjb2xvcjogI2MwYzJjNTsg
+LyogJGRhcmstZWRpdG9yLXRleHQgKi8KICBkaXNwbGF5OiBibG9jazsKICBvdmVyZmxvdy14OiBhdXRv
+OwogIHBhZGRpbmc6IDAuNWVtOwogIC8qKgogICAqIFRoaXMgYWxsb3dzIHRoZSBwZXItbGluZSBoaWdo
+bGlnaHRzIHRvIHNob3cuCiAgICovCiAgYmFja2dyb3VuZDogbm9uZTsKfQoKLmhsanMta2V5d29yZCwK
+LmhsanMtc2VsZWN0b3ItdGFnLAouaGxqcy1kZWxldGlvbiB7CiAgY29sb3I6ICM1MWM2ODY7IC8qIGNt
+LWtleXdvcmQgKi8KfQoKLmhsanMtbnVtYmVyIHsKICBjb2xvcjogIzYyNzk3ODsgLyogY20tbnVtYmVy
+ICovCn0KCi5obGpzLWNvbW1lbnQgewogIGNvbG9yOiAjOTE5OGI0OyAvKiBjbS1jb21tZW50ICovCn0K
+Ci5obGpzLWxpdGVyYWwgewogIGNvbG9yOiAjZWU4NjY2OyAvKiBjbS1hdG9tICovCn0KCi5obGpzLXN0
+cmluZyB7CiAgY29sb3I6ICNlNTUwNzQ7IC8qIGNtLXN0cmluZyAqLwp9CgouaGxqcy12YXJpYWJsZSB7
+CiAgY29sb3I6ICMxNmFkY2E7IC8qIGNtLXZhcmlhYmxlICovCn0KCi5obGpzLWxpbmsgewogIGNvbG9y
+OiAjZTU1MDc0OyAvKiBjbS1zdHJpbmcgKi8KfQouaGxqcy1zZWN0aW9uLAouaGxqcy10eXBlLAouaGxq
+cy1idWlsdF9pbiwKLmhsanMtdGl0bGUgewogIGNvbG9yOiAjZWU4NjY2OyAvKiBjbS12YXJpYWJsZS0y
+ICovCn0KCi5obGpzLWFkZGl0aW9uIHsKICBjb2xvcjogIzI2Mzk1MjsgLyogJGRhcmstc2VsZWN0aW9u
+LWNvbG9yICovCn0KCi5obGpzLW1ldGEgewogIGNvbG9yOiAjNjI3OTc4Owp9Cg==
 ''';
 
 String _migration_js;
diff --git a/runtime/observatory/tests/service/get_cpu_profile_timeline_rpc_test.dart b/runtime/observatory/tests/service/get_cpu_profile_timeline_rpc_test.dart
index 2bbf22f..414de09 100644
--- a/runtime/observatory/tests/service/get_cpu_profile_timeline_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_cpu_profile_timeline_rpc_test.dart
@@ -38,7 +38,7 @@
   }
 
   List events = result['traceEvents'];
-  expect(events.length, greaterThan(10), reason: "Should have many samples");
+  expect(events.length, greaterThan(0), reason: "Should have samples");
   for (Map event in events) {
     expect(event['ph'], equals('P'));
     expect(event['pid'], isInt);
diff --git a/runtime/observatory_2/tests/service_2/get_cpu_profile_timeline_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_cpu_profile_timeline_rpc_test.dart
index 40db79e..e5d578b 100644
--- a/runtime/observatory_2/tests/service_2/get_cpu_profile_timeline_rpc_test.dart
+++ b/runtime/observatory_2/tests/service_2/get_cpu_profile_timeline_rpc_test.dart
@@ -38,7 +38,7 @@
   }
 
   List events = result['traceEvents'];
-  expect(events.length, greaterThan(10), reason: "Should have many samples");
+  expect(events.length, greaterThan(0), reason: "Should have samples");
   for (Map event in events) {
     expect(event['ph'], equals('P'));
     expect(event['pid'], isInt);
diff --git a/runtime/tests/vm/dart/regress_43810_test.dart b/runtime/tests/vm/dart/regress_43810_test.dart
new file mode 100644
index 0000000..49691f1
--- /dev/null
+++ b/runtime/tests/vm/dart/regress_43810_test.dart
@@ -0,0 +1,22 @@
+// 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.
+
+// Verifies that intrinsic Float64List.[]= works even if parameters are
+// unboxed.
+// Regression test for https://github.com/dart-lang/sdk/issues/43810.
+
+import 'dart:typed_data';
+import 'package:expect/expect.dart';
+
+main() {
+  final list1 = <double>[
+    1, 2, 3, 4,
+  ];
+  var list = new Float64List(list1.length);
+  list.setRange(0, list1.length, list1);
+  Expect.equals(1.0, list[0]);
+  Expect.equals(2.0, list[1]);
+  Expect.equals(3.0, list[2]);
+  Expect.equals(4.0, list[3]);
+}
diff --git a/runtime/vm/compiler/graph_intrinsifier.cc b/runtime/vm/compiler/graph_intrinsifier.cc
index 3f77aa2..45595ce 100644
--- a/runtime/vm/compiler/graph_intrinsifier.cc
+++ b/runtime/vm/compiler/graph_intrinsifier.cc
@@ -180,6 +180,19 @@
   return safe_index;
 }
 
+static Definition* CreateBoxedParameterIfNeeded(BlockBuilder* builder,
+                                                Definition* value,
+                                                Representation representation,
+                                                intptr_t arg_index) {
+  const auto& function = builder->function();
+  if (function.is_unboxed_parameter_at(arg_index)) {
+    return builder->AddDefinition(
+        BoxInstr::Create(representation, new Value(value)));
+  } else {
+    return value;
+  }
+}
+
 static Definition* CreateBoxedResultIfNeeded(BlockBuilder* builder,
                                              Definition* value,
                                              Representation representation) {
@@ -212,6 +225,7 @@
   Definition* array = builder.AddParameter(0, /*with_frame=*/false);
   Definition* index = builder.AddParameter(1, /*with_frame=*/false);
 
+  index = CreateBoxedParameterIfNeeded(&builder, index, kUnboxedInt64, 1);
   index = PrepareIndexedOp(flow_graph, &builder, array, index,
                            Slot::GetLengthFieldForArrayCid(array_cid));
 
@@ -314,6 +328,7 @@
   Definition* index = builder.AddParameter(1, /*with_frame=*/false);
   Definition* value = builder.AddParameter(2, /*with_frame=*/false);
 
+  index = CreateBoxedParameterIfNeeded(&builder, index, kUnboxedInt64, 1);
   index = PrepareIndexedOp(flow_graph, &builder, array, index,
                            Slot::GetLengthFieldForArrayCid(array_cid));
 
diff --git a/tools/VERSION b/tools/VERSION
index 354a040..d349282 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 11
 PATCH 0
-PRERELEASE 229
+PRERELEASE 230
 PRERELEASE_PATCH 0
\ No newline at end of file