diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index ef388b7..7687b1d 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -236,7 +236,8 @@
             output_api.PresubmitError(
                 'File .dart_tool/package_config.json is out of date.\n'
                 'Fix these issues with:\n'
-                '%s tools/generate_package_config.dart' % (dart))
+                'gclient sync -D && %s tools/generate_package_config.dart' %
+                (dart))
         ]
     return []
 
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index 62fa573..458856b 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -987,7 +987,7 @@
     YamlMap optionMap;
     try {
       var provider = _createAnalysisOptionsProvider(disposition.packages);
-      optionsFile = provider.getOptionsFile(info.folder, crawlUp: true);
+      optionsFile = provider.getOptionsFile(info.folder);
       if (optionsFile != null) {
         optionMap = provider.getOptionsFromFile(optionsFile);
       }
diff --git a/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart b/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
index a9ad271..0609ec6 100644
--- a/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
+++ b/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
@@ -26,8 +26,8 @@
   /// Recursively merge options referenced by an include directive
   /// and remove the include directive from the resulting options map.
   /// Return an empty options map if the file does not exist.
-  YamlMap getOptions(Folder root, {bool crawlUp = false}) {
-    File? optionsFile = getOptionsFile(root, crawlUp: crawlUp);
+  YamlMap getOptions(Folder root) {
+    File? optionsFile = getOptionsFile(root);
     if (optionsFile == null) {
       return YamlMap();
     }
@@ -37,13 +37,13 @@
   /// Return the analysis options file from which options should be read, or
   /// `null` if there is no analysis options file for code in the given [root].
   ///
-  /// The given [root] directory will be searched first. If no file is found and
-  /// if [crawlUp] is `true`, then enclosing directories will be searched.
-  File? getOptionsFile(Folder root, {bool crawlUp = false}) {
+  /// The given [root] directory will be searched first. If no file is found ,
+  /// then enclosing directories will be searched.
+  File? getOptionsFile(Folder root) {
     Resource? resource;
     for (Folder? folder = root; folder != null; folder = folder.parent) {
       resource = folder.getChild(AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-      if (resource.exists || !crawlUp) {
+      if (resource.exists) {
         break;
       }
     }
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 656d53d..a773417 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 = 126;
+  static const int DATA_VERSION = 127;
 
   /// The length of the list returned by [_computeDeclaredVariablesSignature].
   static const int _declaredVariablesSignatureLength = 4;
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index 3b666ff..834a4e1 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -123,16 +123,17 @@
   }
 
   /// Accumulate non-[informative] data into [signature].
-  void collectApiSignature(api_sig.ApiSignature signature) {
-    signature.addString(this._path ?? '');
-    signature.addString(this._exception ?? '');
-    signature.addString(this._stackTrace ?? '');
-    if (this._files == null) {
-      signature.addInt(0);
+  void collectApiSignature(api_sig.ApiSignature signatureSink) {
+    signatureSink.addString(this._path ?? '');
+    signatureSink.addString(this._exception ?? '');
+    signatureSink.addString(this._stackTrace ?? '');
+    var files = this._files;
+    if (files == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._files!.length);
-      for (var x in this._files!) {
-        x.collectApiSignature(signature);
+      signatureSink.addInt(files.length);
+      for (var x in files) {
+        x.collectApiSignature(signatureSink);
       }
     }
   }
@@ -147,18 +148,22 @@
     fb.Offset? offset_files;
     fb.Offset? offset_path;
     fb.Offset? offset_stackTrace;
-    if (_exception != null) {
-      offset_exception = fbBuilder.writeString(_exception!);
+    var exception = _exception;
+    if (exception != null) {
+      offset_exception = fbBuilder.writeString(exception);
     }
-    if (!(_files == null || _files!.isEmpty)) {
+    var files = _files;
+    if (!(files == null || files.isEmpty)) {
       offset_files =
-          fbBuilder.writeList(_files!.map((b) => b.finish(fbBuilder)).toList());
+          fbBuilder.writeList(files.map((b) => b.finish(fbBuilder)).toList());
     }
-    if (_path != null) {
-      offset_path = fbBuilder.writeString(_path!);
+    var path = _path;
+    if (path != null) {
+      offset_path = fbBuilder.writeString(path);
     }
-    if (_stackTrace != null) {
-      offset_stackTrace = fbBuilder.writeString(_stackTrace!);
+    var stackTrace = _stackTrace;
+    if (stackTrace != null) {
+      offset_stackTrace = fbBuilder.writeString(stackTrace);
     }
     fbBuilder.startTable();
     if (offset_exception != null) {
@@ -298,19 +303,21 @@
   void flushInformative() {}
 
   /// Accumulate non-[informative] data into [signature].
-  void collectApiSignature(api_sig.ApiSignature signature) {
-    signature.addString(this._path ?? '');
-    signature.addString(this._content ?? '');
+  void collectApiSignature(api_sig.ApiSignature signatureSink) {
+    signatureSink.addString(this._path ?? '');
+    signatureSink.addString(this._content ?? '');
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
     fb.Offset? offset_content;
     fb.Offset? offset_path;
-    if (_content != null) {
-      offset_content = fbBuilder.writeString(_content!);
+    var content = _content;
+    if (content != null) {
+      offset_content = fbBuilder.writeString(content);
     }
-    if (_path != null) {
-      offset_path = fbBuilder.writeString(_path!);
+    var path = _path;
+    if (path != null) {
+      offset_path = fbBuilder.writeString(path);
     }
     fbBuilder.startTable();
     if (offset_content != null) {
@@ -418,17 +425,18 @@
   }
 
   /// Accumulate non-[informative] data into [signature].
-  void collectApiSignature(api_sig.ApiSignature signature) {
-    if (this._errors == null) {
-      signature.addInt(0);
+  void collectApiSignature(api_sig.ApiSignature signatureSink) {
+    var errors = this._errors;
+    if (errors == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._errors!.length);
-      for (var x in this._errors!) {
-        x.collectApiSignature(signature);
+      signatureSink.addInt(errors.length);
+      for (var x in errors) {
+        x.collectApiSignature(signatureSink);
       }
     }
-    signature.addBool(this._index != null);
-    this._index?.collectApiSignature(signature);
+    signatureSink.addBool(this._index != null);
+    this._index?.collectApiSignature(signatureSink);
   }
 
   List<int> toBuffer() {
@@ -439,12 +447,14 @@
   fb.Offset finish(fb.Builder fbBuilder) {
     fb.Offset? offset_errors;
     fb.Offset? offset_index;
-    if (!(_errors == null || _errors!.isEmpty)) {
-      offset_errors = fbBuilder
-          .writeList(_errors!.map((b) => b.finish(fbBuilder)).toList());
+    var errors = _errors;
+    if (!(errors == null || errors.isEmpty)) {
+      offset_errors =
+          fbBuilder.writeList(errors.map((b) => b.finish(fbBuilder)).toList());
     }
-    if (_index != null) {
-      offset_index = _index!.finish(fbBuilder);
+    var index = _index;
+    if (index != null) {
+      offset_index = index.finish(fbBuilder);
     }
     fbBuilder.startTable();
     if (offset_errors != null) {
@@ -560,30 +570,30 @@
   void flushInformative() {}
 
   /// Accumulate non-[informative] data into [signature].
-  void collectApiSignature(api_sig.ApiSignature signature) {
-    signature.addInt(this._name ?? 0);
-    if (this._members == null) {
-      signature.addInt(0);
+  void collectApiSignature(api_sig.ApiSignature signatureSink) {
+    signatureSink.addInt(this._name ?? 0);
+    var members = this._members;
+    if (members == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._members!.length);
-      for (var x in this._members!) {
-        signature.addInt(x);
+      signatureSink.addInt(members.length);
+      for (var x in members) {
+        signatureSink.addInt(x);
       }
     }
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
     fb.Offset? offset_members;
-    if (!(_members == null || _members!.isEmpty)) {
-      offset_members = fbBuilder.writeListUint32(_members!);
+    var members = _members;
+    if (!(members == null || members.isEmpty)) {
+      offset_members = fbBuilder.writeListUint32(members);
     }
     fbBuilder.startTable();
     if (offset_members != null) {
       fbBuilder.addOffset(1, offset_members);
     }
-    if (_name != null && _name != 0) {
-      fbBuilder.addUint32(0, _name);
-    }
+    fbBuilder.addUint32(0, _name, 0);
     return fbBuilder.endTable();
   }
 }
@@ -727,18 +737,19 @@
   }
 
   /// Accumulate non-[informative] data into [signature].
-  void collectApiSignature(api_sig.ApiSignature signature) {
-    signature.addInt(this._offset ?? 0);
-    signature.addInt(this._length ?? 0);
-    signature.addString(this._uniqueName ?? '');
-    signature.addString(this._message ?? '');
-    signature.addString(this._correction ?? '');
-    if (this._contextMessages == null) {
-      signature.addInt(0);
+  void collectApiSignature(api_sig.ApiSignature signatureSink) {
+    signatureSink.addInt(this._offset ?? 0);
+    signatureSink.addInt(this._length ?? 0);
+    signatureSink.addString(this._uniqueName ?? '');
+    signatureSink.addString(this._message ?? '');
+    signatureSink.addString(this._correction ?? '');
+    var contextMessages = this._contextMessages;
+    if (contextMessages == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._contextMessages!.length);
-      for (var x in this._contextMessages!) {
-        x.collectApiSignature(signature);
+      signatureSink.addInt(contextMessages.length);
+      for (var x in contextMessages) {
+        x.collectApiSignature(signatureSink);
       }
     }
   }
@@ -748,18 +759,22 @@
     fb.Offset? offset_correction;
     fb.Offset? offset_message;
     fb.Offset? offset_uniqueName;
-    if (!(_contextMessages == null || _contextMessages!.isEmpty)) {
-      offset_contextMessages = fbBuilder.writeList(
-          _contextMessages!.map((b) => b.finish(fbBuilder)).toList());
+    var contextMessages = _contextMessages;
+    if (!(contextMessages == null || contextMessages.isEmpty)) {
+      offset_contextMessages = fbBuilder
+          .writeList(contextMessages.map((b) => b.finish(fbBuilder)).toList());
     }
-    if (_correction != null) {
-      offset_correction = fbBuilder.writeString(_correction!);
+    var correction = _correction;
+    if (correction != null) {
+      offset_correction = fbBuilder.writeString(correction);
     }
-    if (_message != null) {
-      offset_message = fbBuilder.writeString(_message!);
+    var message = _message;
+    if (message != null) {
+      offset_message = fbBuilder.writeString(message);
     }
-    if (_uniqueName != null) {
-      offset_uniqueName = fbBuilder.writeString(_uniqueName!);
+    var uniqueName = _uniqueName;
+    if (uniqueName != null) {
+      offset_uniqueName = fbBuilder.writeString(uniqueName);
     }
     fbBuilder.startTable();
     if (offset_contextMessages != null) {
@@ -768,15 +783,11 @@
     if (offset_correction != null) {
       fbBuilder.addOffset(4, offset_correction);
     }
-    if (_length != null && _length != 0) {
-      fbBuilder.addUint32(1, _length);
-    }
+    fbBuilder.addUint32(1, _length, 0);
     if (offset_message != null) {
       fbBuilder.addOffset(3, offset_message);
     }
-    if (_offset != null && _offset != 0) {
-      fbBuilder.addUint32(0, _offset);
-    }
+    fbBuilder.addUint32(0, _offset, 0);
     if (offset_uniqueName != null) {
       fbBuilder.addOffset(2, offset_uniqueName);
     }
@@ -1175,158 +1186,177 @@
   }
 
   /// Accumulate non-[informative] data into [signature].
-  void collectApiSignature(api_sig.ApiSignature signature) {
-    if (this._strings == null) {
-      signature.addInt(0);
+  void collectApiSignature(api_sig.ApiSignature signatureSink) {
+    var strings = this._strings;
+    if (strings == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._strings!.length);
-      for (var x in this._strings!) {
-        signature.addString(x);
+      signatureSink.addInt(strings.length);
+      for (var x in strings) {
+        signatureSink.addString(x);
       }
     }
-    signature.addInt(this._nullStringId ?? 0);
-    if (this._unitLibraryUris == null) {
-      signature.addInt(0);
+    signatureSink.addInt(this._nullStringId ?? 0);
+    var unitLibraryUris = this._unitLibraryUris;
+    if (unitLibraryUris == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._unitLibraryUris!.length);
-      for (var x in this._unitLibraryUris!) {
-        signature.addInt(x);
+      signatureSink.addInt(unitLibraryUris.length);
+      for (var x in unitLibraryUris) {
+        signatureSink.addInt(x);
       }
     }
-    if (this._unitUnitUris == null) {
-      signature.addInt(0);
+    var unitUnitUris = this._unitUnitUris;
+    if (unitUnitUris == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._unitUnitUris!.length);
-      for (var x in this._unitUnitUris!) {
-        signature.addInt(x);
+      signatureSink.addInt(unitUnitUris.length);
+      for (var x in unitUnitUris) {
+        signatureSink.addInt(x);
       }
     }
-    if (this._elementKinds == null) {
-      signature.addInt(0);
+    var elementKinds = this._elementKinds;
+    if (elementKinds == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._elementKinds!.length);
-      for (var x in this._elementKinds!) {
-        signature.addInt(x.index);
+      signatureSink.addInt(elementKinds.length);
+      for (var x in elementKinds) {
+        signatureSink.addInt(x.index);
       }
     }
-    if (this._elementUnits == null) {
-      signature.addInt(0);
+    var elementUnits = this._elementUnits;
+    if (elementUnits == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._elementUnits!.length);
-      for (var x in this._elementUnits!) {
-        signature.addInt(x);
+      signatureSink.addInt(elementUnits.length);
+      for (var x in elementUnits) {
+        signatureSink.addInt(x);
       }
     }
-    if (this._elementNameUnitMemberIds == null) {
-      signature.addInt(0);
+    var elementNameUnitMemberIds = this._elementNameUnitMemberIds;
+    if (elementNameUnitMemberIds == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._elementNameUnitMemberIds!.length);
-      for (var x in this._elementNameUnitMemberIds!) {
-        signature.addInt(x);
+      signatureSink.addInt(elementNameUnitMemberIds.length);
+      for (var x in elementNameUnitMemberIds) {
+        signatureSink.addInt(x);
       }
     }
-    if (this._elementNameClassMemberIds == null) {
-      signature.addInt(0);
+    var elementNameClassMemberIds = this._elementNameClassMemberIds;
+    if (elementNameClassMemberIds == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._elementNameClassMemberIds!.length);
-      for (var x in this._elementNameClassMemberIds!) {
-        signature.addInt(x);
+      signatureSink.addInt(elementNameClassMemberIds.length);
+      for (var x in elementNameClassMemberIds) {
+        signatureSink.addInt(x);
       }
     }
-    if (this._elementNameParameterIds == null) {
-      signature.addInt(0);
+    var elementNameParameterIds = this._elementNameParameterIds;
+    if (elementNameParameterIds == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._elementNameParameterIds!.length);
-      for (var x in this._elementNameParameterIds!) {
-        signature.addInt(x);
+      signatureSink.addInt(elementNameParameterIds.length);
+      for (var x in elementNameParameterIds) {
+        signatureSink.addInt(x);
       }
     }
-    if (this._usedElements == null) {
-      signature.addInt(0);
+    var usedElements = this._usedElements;
+    if (usedElements == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._usedElements!.length);
-      for (var x in this._usedElements!) {
-        signature.addInt(x);
+      signatureSink.addInt(usedElements.length);
+      for (var x in usedElements) {
+        signatureSink.addInt(x);
       }
     }
-    if (this._usedElementKinds == null) {
-      signature.addInt(0);
+    var usedElementKinds = this._usedElementKinds;
+    if (usedElementKinds == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._usedElementKinds!.length);
-      for (var x in this._usedElementKinds!) {
-        signature.addInt(x.index);
+      signatureSink.addInt(usedElementKinds.length);
+      for (var x in usedElementKinds) {
+        signatureSink.addInt(x.index);
       }
     }
-    if (this._usedElementOffsets == null) {
-      signature.addInt(0);
+    var usedElementOffsets = this._usedElementOffsets;
+    if (usedElementOffsets == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._usedElementOffsets!.length);
-      for (var x in this._usedElementOffsets!) {
-        signature.addInt(x);
+      signatureSink.addInt(usedElementOffsets.length);
+      for (var x in usedElementOffsets) {
+        signatureSink.addInt(x);
       }
     }
-    if (this._usedElementLengths == null) {
-      signature.addInt(0);
+    var usedElementLengths = this._usedElementLengths;
+    if (usedElementLengths == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._usedElementLengths!.length);
-      for (var x in this._usedElementLengths!) {
-        signature.addInt(x);
+      signatureSink.addInt(usedElementLengths.length);
+      for (var x in usedElementLengths) {
+        signatureSink.addInt(x);
       }
     }
-    if (this._usedElementIsQualifiedFlags == null) {
-      signature.addInt(0);
+    var usedElementIsQualifiedFlags = this._usedElementIsQualifiedFlags;
+    if (usedElementIsQualifiedFlags == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._usedElementIsQualifiedFlags!.length);
-      for (var x in this._usedElementIsQualifiedFlags!) {
-        signature.addBool(x);
+      signatureSink.addInt(usedElementIsQualifiedFlags.length);
+      for (var x in usedElementIsQualifiedFlags) {
+        signatureSink.addBool(x);
       }
     }
-    if (this._usedNames == null) {
-      signature.addInt(0);
+    var usedNames = this._usedNames;
+    if (usedNames == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._usedNames!.length);
-      for (var x in this._usedNames!) {
-        signature.addInt(x);
+      signatureSink.addInt(usedNames.length);
+      for (var x in usedNames) {
+        signatureSink.addInt(x);
       }
     }
-    if (this._usedNameKinds == null) {
-      signature.addInt(0);
+    var usedNameKinds = this._usedNameKinds;
+    if (usedNameKinds == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._usedNameKinds!.length);
-      for (var x in this._usedNameKinds!) {
-        signature.addInt(x.index);
+      signatureSink.addInt(usedNameKinds.length);
+      for (var x in usedNameKinds) {
+        signatureSink.addInt(x.index);
       }
     }
-    if (this._usedNameOffsets == null) {
-      signature.addInt(0);
+    var usedNameOffsets = this._usedNameOffsets;
+    if (usedNameOffsets == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._usedNameOffsets!.length);
-      for (var x in this._usedNameOffsets!) {
-        signature.addInt(x);
+      signatureSink.addInt(usedNameOffsets.length);
+      for (var x in usedNameOffsets) {
+        signatureSink.addInt(x);
       }
     }
-    if (this._usedNameIsQualifiedFlags == null) {
-      signature.addInt(0);
+    var usedNameIsQualifiedFlags = this._usedNameIsQualifiedFlags;
+    if (usedNameIsQualifiedFlags == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._usedNameIsQualifiedFlags!.length);
-      for (var x in this._usedNameIsQualifiedFlags!) {
-        signature.addBool(x);
+      signatureSink.addInt(usedNameIsQualifiedFlags.length);
+      for (var x in usedNameIsQualifiedFlags) {
+        signatureSink.addBool(x);
       }
     }
-    if (this._supertypes == null) {
-      signature.addInt(0);
+    var supertypes = this._supertypes;
+    if (supertypes == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._supertypes!.length);
-      for (var x in this._supertypes!) {
-        signature.addInt(x);
+      signatureSink.addInt(supertypes.length);
+      for (var x in supertypes) {
+        signatureSink.addInt(x);
       }
     }
-    if (this._subtypes == null) {
-      signature.addInt(0);
+    var subtypes = this._subtypes;
+    if (subtypes == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._subtypes!.length);
-      for (var x in this._subtypes!) {
-        x.collectApiSignature(signature);
+      signatureSink.addInt(subtypes.length);
+      for (var x in subtypes) {
+        x.collectApiSignature(signatureSink);
       }
     }
   }
@@ -1356,79 +1386,95 @@
     fb.Offset? offset_usedNameKinds;
     fb.Offset? offset_usedNameOffsets;
     fb.Offset? offset_usedNames;
-    if (!(_elementKinds == null || _elementKinds!.isEmpty)) {
+    var elementKinds = _elementKinds;
+    if (!(elementKinds == null || elementKinds.isEmpty)) {
       offset_elementKinds =
-          fbBuilder.writeListUint8(_elementKinds!.map((b) => b.index).toList());
+          fbBuilder.writeListUint8(elementKinds.map((b) => b.index).toList());
     }
-    if (!(_elementNameClassMemberIds == null ||
-        _elementNameClassMemberIds!.isEmpty)) {
+    var elementNameClassMemberIds = _elementNameClassMemberIds;
+    if (!(elementNameClassMemberIds == null ||
+        elementNameClassMemberIds.isEmpty)) {
       offset_elementNameClassMemberIds =
-          fbBuilder.writeListUint32(_elementNameClassMemberIds!);
+          fbBuilder.writeListUint32(elementNameClassMemberIds);
     }
-    if (!(_elementNameParameterIds == null ||
-        _elementNameParameterIds!.isEmpty)) {
+    var elementNameParameterIds = _elementNameParameterIds;
+    if (!(elementNameParameterIds == null || elementNameParameterIds.isEmpty)) {
       offset_elementNameParameterIds =
-          fbBuilder.writeListUint32(_elementNameParameterIds!);
+          fbBuilder.writeListUint32(elementNameParameterIds);
     }
-    if (!(_elementNameUnitMemberIds == null ||
-        _elementNameUnitMemberIds!.isEmpty)) {
+    var elementNameUnitMemberIds = _elementNameUnitMemberIds;
+    if (!(elementNameUnitMemberIds == null ||
+        elementNameUnitMemberIds.isEmpty)) {
       offset_elementNameUnitMemberIds =
-          fbBuilder.writeListUint32(_elementNameUnitMemberIds!);
+          fbBuilder.writeListUint32(elementNameUnitMemberIds);
     }
-    if (!(_elementUnits == null || _elementUnits!.isEmpty)) {
-      offset_elementUnits = fbBuilder.writeListUint32(_elementUnits!);
+    var elementUnits = _elementUnits;
+    if (!(elementUnits == null || elementUnits.isEmpty)) {
+      offset_elementUnits = fbBuilder.writeListUint32(elementUnits);
     }
-    if (!(_strings == null || _strings!.isEmpty)) {
+    var strings = _strings;
+    if (!(strings == null || strings.isEmpty)) {
       offset_strings = fbBuilder
-          .writeList(_strings!.map((b) => fbBuilder.writeString(b)).toList());
+          .writeList(strings.map((b) => fbBuilder.writeString(b)).toList());
     }
-    if (!(_subtypes == null || _subtypes!.isEmpty)) {
+    var subtypes = _subtypes;
+    if (!(subtypes == null || subtypes.isEmpty)) {
       offset_subtypes = fbBuilder
-          .writeList(_subtypes!.map((b) => b.finish(fbBuilder)).toList());
+          .writeList(subtypes.map((b) => b.finish(fbBuilder)).toList());
     }
-    if (!(_supertypes == null || _supertypes!.isEmpty)) {
-      offset_supertypes = fbBuilder.writeListUint32(_supertypes!);
+    var supertypes = _supertypes;
+    if (!(supertypes == null || supertypes.isEmpty)) {
+      offset_supertypes = fbBuilder.writeListUint32(supertypes);
     }
-    if (!(_unitLibraryUris == null || _unitLibraryUris!.isEmpty)) {
-      offset_unitLibraryUris = fbBuilder.writeListUint32(_unitLibraryUris!);
+    var unitLibraryUris = _unitLibraryUris;
+    if (!(unitLibraryUris == null || unitLibraryUris.isEmpty)) {
+      offset_unitLibraryUris = fbBuilder.writeListUint32(unitLibraryUris);
     }
-    if (!(_unitUnitUris == null || _unitUnitUris!.isEmpty)) {
-      offset_unitUnitUris = fbBuilder.writeListUint32(_unitUnitUris!);
+    var unitUnitUris = _unitUnitUris;
+    if (!(unitUnitUris == null || unitUnitUris.isEmpty)) {
+      offset_unitUnitUris = fbBuilder.writeListUint32(unitUnitUris);
     }
-    if (!(_usedElementIsQualifiedFlags == null ||
-        _usedElementIsQualifiedFlags!.isEmpty)) {
+    var usedElementIsQualifiedFlags = _usedElementIsQualifiedFlags;
+    if (!(usedElementIsQualifiedFlags == null ||
+        usedElementIsQualifiedFlags.isEmpty)) {
       offset_usedElementIsQualifiedFlags =
-          fbBuilder.writeListBool(_usedElementIsQualifiedFlags!);
+          fbBuilder.writeListBool(usedElementIsQualifiedFlags);
     }
-    if (!(_usedElementKinds == null || _usedElementKinds!.isEmpty)) {
+    var usedElementKinds = _usedElementKinds;
+    if (!(usedElementKinds == null || usedElementKinds.isEmpty)) {
       offset_usedElementKinds = fbBuilder
-          .writeListUint8(_usedElementKinds!.map((b) => b.index).toList());
+          .writeListUint8(usedElementKinds.map((b) => b.index).toList());
     }
-    if (!(_usedElementLengths == null || _usedElementLengths!.isEmpty)) {
-      offset_usedElementLengths =
-          fbBuilder.writeListUint32(_usedElementLengths!);
+    var usedElementLengths = _usedElementLengths;
+    if (!(usedElementLengths == null || usedElementLengths.isEmpty)) {
+      offset_usedElementLengths = fbBuilder.writeListUint32(usedElementLengths);
     }
-    if (!(_usedElementOffsets == null || _usedElementOffsets!.isEmpty)) {
-      offset_usedElementOffsets =
-          fbBuilder.writeListUint32(_usedElementOffsets!);
+    var usedElementOffsets = _usedElementOffsets;
+    if (!(usedElementOffsets == null || usedElementOffsets.isEmpty)) {
+      offset_usedElementOffsets = fbBuilder.writeListUint32(usedElementOffsets);
     }
-    if (!(_usedElements == null || _usedElements!.isEmpty)) {
-      offset_usedElements = fbBuilder.writeListUint32(_usedElements!);
+    var usedElements = _usedElements;
+    if (!(usedElements == null || usedElements.isEmpty)) {
+      offset_usedElements = fbBuilder.writeListUint32(usedElements);
     }
-    if (!(_usedNameIsQualifiedFlags == null ||
-        _usedNameIsQualifiedFlags!.isEmpty)) {
+    var usedNameIsQualifiedFlags = _usedNameIsQualifiedFlags;
+    if (!(usedNameIsQualifiedFlags == null ||
+        usedNameIsQualifiedFlags.isEmpty)) {
       offset_usedNameIsQualifiedFlags =
-          fbBuilder.writeListBool(_usedNameIsQualifiedFlags!);
+          fbBuilder.writeListBool(usedNameIsQualifiedFlags);
     }
-    if (!(_usedNameKinds == null || _usedNameKinds!.isEmpty)) {
-      offset_usedNameKinds = fbBuilder
-          .writeListUint8(_usedNameKinds!.map((b) => b.index).toList());
+    var usedNameKinds = _usedNameKinds;
+    if (!(usedNameKinds == null || usedNameKinds.isEmpty)) {
+      offset_usedNameKinds =
+          fbBuilder.writeListUint8(usedNameKinds.map((b) => b.index).toList());
     }
-    if (!(_usedNameOffsets == null || _usedNameOffsets!.isEmpty)) {
-      offset_usedNameOffsets = fbBuilder.writeListUint32(_usedNameOffsets!);
+    var usedNameOffsets = _usedNameOffsets;
+    if (!(usedNameOffsets == null || usedNameOffsets.isEmpty)) {
+      offset_usedNameOffsets = fbBuilder.writeListUint32(usedNameOffsets);
     }
-    if (!(_usedNames == null || _usedNames!.isEmpty)) {
-      offset_usedNames = fbBuilder.writeListUint32(_usedNames!);
+    var usedNames = _usedNames;
+    if (!(usedNames == null || usedNames.isEmpty)) {
+      offset_usedNames = fbBuilder.writeListUint32(usedNames);
     }
     fbBuilder.startTable();
     if (offset_elementKinds != null) {
@@ -1446,9 +1492,7 @@
     if (offset_elementUnits != null) {
       fbBuilder.addOffset(5, offset_elementUnits);
     }
-    if (_nullStringId != null && _nullStringId != 0) {
-      fbBuilder.addUint32(1, _nullStringId);
-    }
+    fbBuilder.addUint32(1, _nullStringId, 0);
     if (offset_strings != null) {
       fbBuilder.addOffset(0, offset_strings);
     }
@@ -1856,41 +1900,45 @@
   }
 
   /// Accumulate non-[informative] data into [signature].
-  void collectApiSignature(api_sig.ApiSignature signature) {
-    if (this._referencedNames == null) {
-      signature.addInt(0);
+  void collectApiSignature(api_sig.ApiSignature signatureSink) {
+    var referencedNames = this._referencedNames;
+    if (referencedNames == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._referencedNames!.length);
-      for (var x in this._referencedNames!) {
-        signature.addString(x);
+      signatureSink.addInt(referencedNames.length);
+      for (var x in referencedNames) {
+        signatureSink.addString(x);
       }
     }
-    if (this._definedTopLevelNames == null) {
-      signature.addInt(0);
+    var definedTopLevelNames = this._definedTopLevelNames;
+    if (definedTopLevelNames == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._definedTopLevelNames!.length);
-      for (var x in this._definedTopLevelNames!) {
-        signature.addString(x);
+      signatureSink.addInt(definedTopLevelNames.length);
+      for (var x in definedTopLevelNames) {
+        signatureSink.addString(x);
       }
     }
-    if (this._definedClassMemberNames == null) {
-      signature.addInt(0);
+    var definedClassMemberNames = this._definedClassMemberNames;
+    if (definedClassMemberNames == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._definedClassMemberNames!.length);
-      for (var x in this._definedClassMemberNames!) {
-        signature.addString(x);
+      signatureSink.addInt(definedClassMemberNames.length);
+      for (var x in definedClassMemberNames) {
+        signatureSink.addString(x);
       }
     }
-    if (this._subtypedNames == null) {
-      signature.addInt(0);
+    var subtypedNames = this._subtypedNames;
+    if (subtypedNames == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._subtypedNames!.length);
-      for (var x in this._subtypedNames!) {
-        signature.addString(x);
+      signatureSink.addInt(subtypedNames.length);
+      for (var x in subtypedNames) {
+        signatureSink.addString(x);
       }
     }
-    signature.addBool(this._unit2 != null);
-    this._unit2?.collectApiSignature(signature);
+    signatureSink.addBool(this._unit2 != null);
+    this._unit2?.collectApiSignature(signatureSink);
   }
 
   List<int> toBuffer() {
@@ -1904,27 +1952,31 @@
     fb.Offset? offset_referencedNames;
     fb.Offset? offset_subtypedNames;
     fb.Offset? offset_unit2;
-    if (!(_definedClassMemberNames == null ||
-        _definedClassMemberNames!.isEmpty)) {
+    var definedClassMemberNames = _definedClassMemberNames;
+    if (!(definedClassMemberNames == null || definedClassMemberNames.isEmpty)) {
       offset_definedClassMemberNames = fbBuilder.writeList(
-          _definedClassMemberNames!
+          definedClassMemberNames
               .map((b) => fbBuilder.writeString(b))
               .toList());
     }
-    if (!(_definedTopLevelNames == null || _definedTopLevelNames!.isEmpty)) {
+    var definedTopLevelNames = _definedTopLevelNames;
+    if (!(definedTopLevelNames == null || definedTopLevelNames.isEmpty)) {
       offset_definedTopLevelNames = fbBuilder.writeList(
-          _definedTopLevelNames!.map((b) => fbBuilder.writeString(b)).toList());
+          definedTopLevelNames.map((b) => fbBuilder.writeString(b)).toList());
     }
-    if (!(_referencedNames == null || _referencedNames!.isEmpty)) {
+    var referencedNames = _referencedNames;
+    if (!(referencedNames == null || referencedNames.isEmpty)) {
       offset_referencedNames = fbBuilder.writeList(
-          _referencedNames!.map((b) => fbBuilder.writeString(b)).toList());
+          referencedNames.map((b) => fbBuilder.writeString(b)).toList());
     }
-    if (!(_subtypedNames == null || _subtypedNames!.isEmpty)) {
+    var subtypedNames = _subtypedNames;
+    if (!(subtypedNames == null || subtypedNames.isEmpty)) {
       offset_subtypedNames = fbBuilder.writeList(
-          _subtypedNames!.map((b) => fbBuilder.writeString(b)).toList());
+          subtypedNames.map((b) => fbBuilder.writeString(b)).toList());
     }
-    if (_unit2 != null) {
-      offset_unit2 = _unit2!.finish(fbBuilder);
+    var unit2 = _unit2;
+    if (unit2 != null) {
+      offset_unit2 = unit2.finish(fbBuilder);
     }
     fbBuilder.startTable();
     if (offset_definedClassMemberNames != null) {
@@ -2330,67 +2382,72 @@
   }
 
   /// Accumulate non-[informative] data into [signature].
-  void collectApiSignature(api_sig.ApiSignature signature) {
-    if (this._children == null) {
-      signature.addInt(0);
+  void collectApiSignature(api_sig.ApiSignature signatureSink) {
+    var children = this._children;
+    if (children == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._children!.length);
-      for (var x in this._children!) {
-        x.collectApiSignature(signature);
+      signatureSink.addInt(children.length);
+      for (var x in children) {
+        x.collectApiSignature(signatureSink);
       }
     }
-    signature.addInt(this._codeLength ?? 0);
-    signature.addInt(this._codeOffset ?? 0);
-    signature.addString(this._defaultArgumentListString ?? '');
-    if (this._defaultArgumentListTextRanges == null) {
-      signature.addInt(0);
+    signatureSink.addInt(this._codeLength ?? 0);
+    signatureSink.addInt(this._codeOffset ?? 0);
+    signatureSink.addString(this._defaultArgumentListString ?? '');
+    var defaultArgumentListTextRanges = this._defaultArgumentListTextRanges;
+    if (defaultArgumentListTextRanges == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._defaultArgumentListTextRanges!.length);
-      for (var x in this._defaultArgumentListTextRanges!) {
-        signature.addInt(x);
+      signatureSink.addInt(defaultArgumentListTextRanges.length);
+      for (var x in defaultArgumentListTextRanges) {
+        signatureSink.addInt(x);
       }
     }
-    signature.addString(this._docComplete ?? '');
-    signature.addString(this._docSummary ?? '');
-    signature.addInt(this._fieldMask ?? 0);
-    signature.addBool(this._isAbstract == true);
-    signature.addBool(this._isConst == true);
-    signature.addBool(this._isDeprecated == true);
-    signature.addBool(this._isFinal == true);
-    signature.addBool(this._isStatic == true);
-    signature.addInt(this._kind == null ? 0 : this._kind!.index);
-    signature.addInt(this._locationOffset ?? 0);
-    signature.addInt(this._locationStartColumn ?? 0);
-    signature.addInt(this._locationStartLine ?? 0);
-    signature.addString(this._name ?? '');
-    if (this._parameterNames == null) {
-      signature.addInt(0);
+    signatureSink.addString(this._docComplete ?? '');
+    signatureSink.addString(this._docSummary ?? '');
+    signatureSink.addInt(this._fieldMask ?? 0);
+    signatureSink.addBool(this._isAbstract == true);
+    signatureSink.addBool(this._isConst == true);
+    signatureSink.addBool(this._isDeprecated == true);
+    signatureSink.addBool(this._isFinal == true);
+    signatureSink.addBool(this._isStatic == true);
+    signatureSink.addInt(this._kind?.index ?? 0);
+    signatureSink.addInt(this._locationOffset ?? 0);
+    signatureSink.addInt(this._locationStartColumn ?? 0);
+    signatureSink.addInt(this._locationStartLine ?? 0);
+    signatureSink.addString(this._name ?? '');
+    var parameterNames = this._parameterNames;
+    if (parameterNames == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._parameterNames!.length);
-      for (var x in this._parameterNames!) {
-        signature.addString(x);
+      signatureSink.addInt(parameterNames.length);
+      for (var x in parameterNames) {
+        signatureSink.addString(x);
       }
     }
-    signature.addString(this._parameters ?? '');
-    if (this._parameterTypes == null) {
-      signature.addInt(0);
+    signatureSink.addString(this._parameters ?? '');
+    var parameterTypes = this._parameterTypes;
+    if (parameterTypes == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._parameterTypes!.length);
-      for (var x in this._parameterTypes!) {
-        signature.addString(x);
+      signatureSink.addInt(parameterTypes.length);
+      for (var x in parameterTypes) {
+        signatureSink.addString(x);
       }
     }
-    if (this._relevanceTags == null) {
-      signature.addInt(0);
+    var relevanceTags = this._relevanceTags;
+    if (relevanceTags == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._relevanceTags!.length);
-      for (var x in this._relevanceTags!) {
-        signature.addString(x);
+      signatureSink.addInt(relevanceTags.length);
+      for (var x in relevanceTags) {
+        signatureSink.addString(x);
       }
     }
-    signature.addInt(this._requiredParameterCount ?? 0);
-    signature.addString(this._returnType ?? '');
-    signature.addString(this._typeParameters ?? '');
+    signatureSink.addInt(this._requiredParameterCount ?? 0);
+    signatureSink.addString(this._returnType ?? '');
+    signatureSink.addString(this._typeParameters ?? '');
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
@@ -2406,59 +2463,67 @@
     fb.Offset? offset_relevanceTags;
     fb.Offset? offset_returnType;
     fb.Offset? offset_typeParameters;
-    if (!(_children == null || _children!.isEmpty)) {
+    var children = _children;
+    if (!(children == null || children.isEmpty)) {
       offset_children = fbBuilder
-          .writeList(_children!.map((b) => b.finish(fbBuilder)).toList());
+          .writeList(children.map((b) => b.finish(fbBuilder)).toList());
     }
-    if (_defaultArgumentListString != null) {
+    var defaultArgumentListString = _defaultArgumentListString;
+    if (defaultArgumentListString != null) {
       offset_defaultArgumentListString =
-          fbBuilder.writeString(_defaultArgumentListString!);
+          fbBuilder.writeString(defaultArgumentListString);
     }
-    if (!(_defaultArgumentListTextRanges == null ||
-        _defaultArgumentListTextRanges!.isEmpty)) {
+    var defaultArgumentListTextRanges = _defaultArgumentListTextRanges;
+    if (!(defaultArgumentListTextRanges == null ||
+        defaultArgumentListTextRanges.isEmpty)) {
       offset_defaultArgumentListTextRanges =
-          fbBuilder.writeListUint32(_defaultArgumentListTextRanges!);
+          fbBuilder.writeListUint32(defaultArgumentListTextRanges);
     }
-    if (_docComplete != null) {
-      offset_docComplete = fbBuilder.writeString(_docComplete!);
+    var docComplete = _docComplete;
+    if (docComplete != null) {
+      offset_docComplete = fbBuilder.writeString(docComplete);
     }
-    if (_docSummary != null) {
-      offset_docSummary = fbBuilder.writeString(_docSummary!);
+    var docSummary = _docSummary;
+    if (docSummary != null) {
+      offset_docSummary = fbBuilder.writeString(docSummary);
     }
-    if (_name != null) {
-      offset_name = fbBuilder.writeString(_name!);
+    var name = _name;
+    if (name != null) {
+      offset_name = fbBuilder.writeString(name);
     }
-    if (!(_parameterNames == null || _parameterNames!.isEmpty)) {
+    var parameterNames = _parameterNames;
+    if (!(parameterNames == null || parameterNames.isEmpty)) {
       offset_parameterNames = fbBuilder.writeList(
-          _parameterNames!.map((b) => fbBuilder.writeString(b)).toList());
+          parameterNames.map((b) => fbBuilder.writeString(b)).toList());
     }
-    if (_parameters != null) {
-      offset_parameters = fbBuilder.writeString(_parameters!);
+    var parameters = _parameters;
+    if (parameters != null) {
+      offset_parameters = fbBuilder.writeString(parameters);
     }
-    if (!(_parameterTypes == null || _parameterTypes!.isEmpty)) {
+    var parameterTypes = _parameterTypes;
+    if (!(parameterTypes == null || parameterTypes.isEmpty)) {
       offset_parameterTypes = fbBuilder.writeList(
-          _parameterTypes!.map((b) => fbBuilder.writeString(b)).toList());
+          parameterTypes.map((b) => fbBuilder.writeString(b)).toList());
     }
-    if (!(_relevanceTags == null || _relevanceTags!.isEmpty)) {
+    var relevanceTags = _relevanceTags;
+    if (!(relevanceTags == null || relevanceTags.isEmpty)) {
       offset_relevanceTags = fbBuilder.writeList(
-          _relevanceTags!.map((b) => fbBuilder.writeString(b)).toList());
+          relevanceTags.map((b) => fbBuilder.writeString(b)).toList());
     }
-    if (_returnType != null) {
-      offset_returnType = fbBuilder.writeString(_returnType!);
+    var returnType = _returnType;
+    if (returnType != null) {
+      offset_returnType = fbBuilder.writeString(returnType);
     }
-    if (_typeParameters != null) {
-      offset_typeParameters = fbBuilder.writeString(_typeParameters!);
+    var typeParameters = _typeParameters;
+    if (typeParameters != null) {
+      offset_typeParameters = fbBuilder.writeString(typeParameters);
     }
     fbBuilder.startTable();
     if (offset_children != null) {
       fbBuilder.addOffset(0, offset_children);
     }
-    if (_codeLength != null && _codeLength != 0) {
-      fbBuilder.addUint32(1, _codeLength);
-    }
-    if (_codeOffset != null && _codeOffset != 0) {
-      fbBuilder.addUint32(2, _codeOffset);
-    }
+    fbBuilder.addUint32(1, _codeLength, 0);
+    fbBuilder.addUint32(2, _codeOffset, 0);
     if (offset_defaultArgumentListString != null) {
       fbBuilder.addOffset(3, offset_defaultArgumentListString);
     }
@@ -2471,36 +2536,17 @@
     if (offset_docSummary != null) {
       fbBuilder.addOffset(6, offset_docSummary);
     }
-    if (_fieldMask != null && _fieldMask != 0) {
-      fbBuilder.addUint32(7, _fieldMask);
-    }
-    if (_isAbstract == true) {
-      fbBuilder.addBool(8, true);
-    }
-    if (_isConst == true) {
-      fbBuilder.addBool(9, true);
-    }
-    if (_isDeprecated == true) {
-      fbBuilder.addBool(10, true);
-    }
-    if (_isFinal == true) {
-      fbBuilder.addBool(11, true);
-    }
-    if (_isStatic == true) {
-      fbBuilder.addBool(12, true);
-    }
-    if (_kind != null && _kind != idl.AvailableDeclarationKind.CLASS) {
-      fbBuilder.addUint8(13, _kind!.index);
-    }
-    if (_locationOffset != null && _locationOffset != 0) {
-      fbBuilder.addUint32(14, _locationOffset);
-    }
-    if (_locationStartColumn != null && _locationStartColumn != 0) {
-      fbBuilder.addUint32(15, _locationStartColumn);
-    }
-    if (_locationStartLine != null && _locationStartLine != 0) {
-      fbBuilder.addUint32(16, _locationStartLine);
-    }
+    fbBuilder.addUint32(7, _fieldMask, 0);
+    fbBuilder.addBool(8, _isAbstract == true);
+    fbBuilder.addBool(9, _isConst == true);
+    fbBuilder.addBool(10, _isDeprecated == true);
+    fbBuilder.addBool(11, _isFinal == true);
+    fbBuilder.addBool(12, _isStatic == true);
+    fbBuilder.addUint8(
+        13, _kind?.index, idl.AvailableDeclarationKind.CLASS.index);
+    fbBuilder.addUint32(14, _locationOffset, 0);
+    fbBuilder.addUint32(15, _locationStartColumn, 0);
+    fbBuilder.addUint32(16, _locationStartLine, 0);
     if (offset_name != null) {
       fbBuilder.addOffset(17, offset_name);
     }
@@ -2516,9 +2562,7 @@
     if (offset_relevanceTags != null) {
       fbBuilder.addOffset(21, offset_relevanceTags);
     }
-    if (_requiredParameterCount != null && _requiredParameterCount != 0) {
-      fbBuilder.addUint32(22, _requiredParameterCount);
-    }
+    fbBuilder.addUint32(22, _requiredParameterCount, 0);
     if (offset_returnType != null) {
       fbBuilder.addOffset(23, offset_returnType);
     }
@@ -2960,33 +3004,36 @@
   }
 
   /// Accumulate non-[informative] data into [signature].
-  void collectApiSignature(api_sig.ApiSignature signature) {
-    if (this._declarations == null) {
-      signature.addInt(0);
+  void collectApiSignature(api_sig.ApiSignature signatureSink) {
+    var declarations = this._declarations;
+    if (declarations == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._declarations!.length);
-      for (var x in this._declarations!) {
-        x.collectApiSignature(signature);
+      signatureSink.addInt(declarations.length);
+      for (var x in declarations) {
+        x.collectApiSignature(signatureSink);
       }
     }
-    signature.addBool(this._directiveInfo != null);
-    this._directiveInfo?.collectApiSignature(signature);
-    if (this._exports == null) {
-      signature.addInt(0);
+    signatureSink.addBool(this._directiveInfo != null);
+    this._directiveInfo?.collectApiSignature(signatureSink);
+    var exports = this._exports;
+    if (exports == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._exports!.length);
-      for (var x in this._exports!) {
-        x.collectApiSignature(signature);
+      signatureSink.addInt(exports.length);
+      for (var x in exports) {
+        x.collectApiSignature(signatureSink);
       }
     }
-    signature.addBool(this._isLibrary == true);
-    signature.addBool(this._isLibraryDeprecated == true);
-    if (this._parts == null) {
-      signature.addInt(0);
+    signatureSink.addBool(this._isLibrary == true);
+    signatureSink.addBool(this._isLibraryDeprecated == true);
+    var parts = this._parts;
+    if (parts == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._parts!.length);
-      for (var x in this._parts!) {
-        signature.addString(x);
+      signatureSink.addInt(parts.length);
+      for (var x in parts) {
+        signatureSink.addString(x);
       }
     }
   }
@@ -3002,23 +3049,28 @@
     fb.Offset? offset_exports;
     fb.Offset? offset_lineStarts;
     fb.Offset? offset_parts;
-    if (!(_declarations == null || _declarations!.isEmpty)) {
+    var declarations = _declarations;
+    if (!(declarations == null || declarations.isEmpty)) {
       offset_declarations = fbBuilder
-          .writeList(_declarations!.map((b) => b.finish(fbBuilder)).toList());
+          .writeList(declarations.map((b) => b.finish(fbBuilder)).toList());
     }
-    if (_directiveInfo != null) {
-      offset_directiveInfo = _directiveInfo!.finish(fbBuilder);
+    var directiveInfo = _directiveInfo;
+    if (directiveInfo != null) {
+      offset_directiveInfo = directiveInfo.finish(fbBuilder);
     }
-    if (!(_exports == null || _exports!.isEmpty)) {
-      offset_exports = fbBuilder
-          .writeList(_exports!.map((b) => b.finish(fbBuilder)).toList());
+    var exports = _exports;
+    if (!(exports == null || exports.isEmpty)) {
+      offset_exports =
+          fbBuilder.writeList(exports.map((b) => b.finish(fbBuilder)).toList());
     }
-    if (!(_lineStarts == null || _lineStarts!.isEmpty)) {
-      offset_lineStarts = fbBuilder.writeListUint32(_lineStarts!);
+    var lineStarts = _lineStarts;
+    if (!(lineStarts == null || lineStarts.isEmpty)) {
+      offset_lineStarts = fbBuilder.writeListUint32(lineStarts);
     }
-    if (!(_parts == null || _parts!.isEmpty)) {
+    var parts = _parts;
+    if (!(parts == null || parts.isEmpty)) {
       offset_parts = fbBuilder
-          .writeList(_parts!.map((b) => fbBuilder.writeString(b)).toList());
+          .writeList(parts.map((b) => fbBuilder.writeString(b)).toList());
     }
     fbBuilder.startTable();
     if (offset_declarations != null) {
@@ -3030,12 +3082,8 @@
     if (offset_exports != null) {
       fbBuilder.addOffset(2, offset_exports);
     }
-    if (_isLibrary == true) {
-      fbBuilder.addBool(3, true);
-    }
-    if (_isLibraryDeprecated == true) {
-      fbBuilder.addBool(4, true);
-    }
+    fbBuilder.addBool(3, _isLibrary == true);
+    fbBuilder.addBool(4, _isLibraryDeprecated == true);
     if (offset_lineStarts != null) {
       fbBuilder.addOffset(5, offset_lineStarts);
     }
@@ -3206,14 +3254,15 @@
   }
 
   /// Accumulate non-[informative] data into [signature].
-  void collectApiSignature(api_sig.ApiSignature signature) {
-    signature.addString(this._uri ?? '');
-    if (this._combinators == null) {
-      signature.addInt(0);
+  void collectApiSignature(api_sig.ApiSignature signatureSink) {
+    signatureSink.addString(this._uri ?? '');
+    var combinators = this._combinators;
+    if (combinators == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._combinators!.length);
-      for (var x in this._combinators!) {
-        x.collectApiSignature(signature);
+      signatureSink.addInt(combinators.length);
+      for (var x in combinators) {
+        x.collectApiSignature(signatureSink);
       }
     }
   }
@@ -3221,12 +3270,14 @@
   fb.Offset finish(fb.Builder fbBuilder) {
     fb.Offset? offset_combinators;
     fb.Offset? offset_uri;
-    if (!(_combinators == null || _combinators!.isEmpty)) {
+    var combinators = _combinators;
+    if (!(combinators == null || combinators.isEmpty)) {
       offset_combinators = fbBuilder
-          .writeList(_combinators!.map((b) => b.finish(fbBuilder)).toList());
+          .writeList(combinators.map((b) => b.finish(fbBuilder)).toList());
     }
-    if (_uri != null) {
-      offset_uri = fbBuilder.writeString(_uri!);
+    var uri = _uri;
+    if (uri != null) {
+      offset_uri = fbBuilder.writeString(uri);
     }
     fbBuilder.startTable();
     if (offset_combinators != null) {
@@ -3331,21 +3382,23 @@
   void flushInformative() {}
 
   /// Accumulate non-[informative] data into [signature].
-  void collectApiSignature(api_sig.ApiSignature signature) {
-    if (this._shows == null) {
-      signature.addInt(0);
+  void collectApiSignature(api_sig.ApiSignature signatureSink) {
+    var shows = this._shows;
+    if (shows == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._shows!.length);
-      for (var x in this._shows!) {
-        signature.addString(x);
+      signatureSink.addInt(shows.length);
+      for (var x in shows) {
+        signatureSink.addString(x);
       }
     }
-    if (this._hides == null) {
-      signature.addInt(0);
+    var hides = this._hides;
+    if (hides == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._hides!.length);
-      for (var x in this._hides!) {
-        signature.addString(x);
+      signatureSink.addInt(hides.length);
+      for (var x in hides) {
+        signatureSink.addString(x);
       }
     }
   }
@@ -3353,13 +3406,15 @@
   fb.Offset finish(fb.Builder fbBuilder) {
     fb.Offset? offset_hides;
     fb.Offset? offset_shows;
-    if (!(_hides == null || _hides!.isEmpty)) {
+    var hides = _hides;
+    if (!(hides == null || hides.isEmpty)) {
       offset_hides = fbBuilder
-          .writeList(_hides!.map((b) => fbBuilder.writeString(b)).toList());
+          .writeList(hides.map((b) => fbBuilder.writeString(b)).toList());
     }
-    if (!(_shows == null || _shows!.isEmpty)) {
+    var shows = _shows;
+    if (!(shows == null || shows.isEmpty)) {
       offset_shows = fbBuilder
-          .writeList(_shows!.map((b) => fbBuilder.writeString(b)).toList());
+          .writeList(shows.map((b) => fbBuilder.writeString(b)).toList());
     }
     fbBuilder.startTable();
     if (offset_hides != null) {
@@ -3466,21 +3521,23 @@
   }
 
   /// Accumulate non-[informative] data into [signature].
-  void collectApiSignature(api_sig.ApiSignature signature) {
-    if (this._signature == null) {
-      signature.addInt(0);
+  void collectApiSignature(api_sig.ApiSignature signatureSink) {
+    var signature = this._signature;
+    if (signature == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._signature!.length);
-      for (var x in this._signature!) {
-        signature.addInt(x);
+      signatureSink.addInt(signature.length);
+      for (var x in signature) {
+        signatureSink.addInt(x);
       }
     }
-    if (this._errors == null) {
-      signature.addInt(0);
+    var errors = this._errors;
+    if (errors == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._errors!.length);
-      for (var x in this._errors!) {
-        x.collectApiSignature(signature);
+      signatureSink.addInt(errors.length);
+      for (var x in errors) {
+        x.collectApiSignature(signatureSink);
       }
     }
   }
@@ -3493,12 +3550,14 @@
   fb.Offset finish(fb.Builder fbBuilder) {
     fb.Offset? offset_errors;
     fb.Offset? offset_signature;
-    if (!(_errors == null || _errors!.isEmpty)) {
-      offset_errors = fbBuilder
-          .writeList(_errors!.map((b) => b.finish(fbBuilder)).toList());
+    var errors = _errors;
+    if (!(errors == null || errors.isEmpty)) {
+      offset_errors =
+          fbBuilder.writeList(errors.map((b) => b.finish(fbBuilder)).toList());
     }
-    if (!(_signature == null || _signature!.isEmpty)) {
-      offset_signature = fbBuilder.writeListUint32(_signature!);
+    var signature = _signature;
+    if (!(signature == null || signature.isEmpty)) {
+      offset_signature = fbBuilder.writeListUint32(signature);
     }
     fbBuilder.startTable();
     if (offset_errors != null) {
@@ -3609,17 +3668,18 @@
   }
 
   /// Accumulate non-[informative] data into [signature].
-  void collectApiSignature(api_sig.ApiSignature signature) {
-    if (this._contentDigest == null) {
-      signature.addInt(0);
+  void collectApiSignature(api_sig.ApiSignature signatureSink) {
+    var contentDigest = this._contentDigest;
+    if (contentDigest == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._contentDigest!.length);
-      for (var x in this._contentDigest!) {
-        signature.addInt(x);
+      signatureSink.addInt(contentDigest.length);
+      for (var x in contentDigest) {
+        signatureSink.addInt(x);
       }
     }
-    signature.addBool(this._unlinkedUnit != null);
-    this._unlinkedUnit?.collectApiSignature(signature);
+    signatureSink.addBool(this._unlinkedUnit != null);
+    this._unlinkedUnit?.collectApiSignature(signatureSink);
   }
 
   List<int> toBuffer() {
@@ -3630,11 +3690,13 @@
   fb.Offset finish(fb.Builder fbBuilder) {
     fb.Offset? offset_contentDigest;
     fb.Offset? offset_unlinkedUnit;
-    if (!(_contentDigest == null || _contentDigest!.isEmpty)) {
-      offset_contentDigest = fbBuilder.writeListUint32(_contentDigest!);
+    var contentDigest = _contentDigest;
+    if (!(contentDigest == null || contentDigest.isEmpty)) {
+      offset_contentDigest = fbBuilder.writeListUint32(contentDigest);
     }
-    if (_unlinkedUnit != null) {
-      offset_unlinkedUnit = _unlinkedUnit!.finish(fbBuilder);
+    var unlinkedUnit = _unlinkedUnit;
+    if (unlinkedUnit != null) {
+      offset_unlinkedUnit = unlinkedUnit.finish(fbBuilder);
     }
     fbBuilder.startTable();
     if (offset_contentDigest != null) {
@@ -3763,35 +3825,33 @@
   void flushInformative() {}
 
   /// Accumulate non-[informative] data into [signature].
-  void collectApiSignature(api_sig.ApiSignature signature) {
-    signature.addString(this._filePath ?? '');
-    signature.addInt(this._length ?? 0);
-    signature.addString(this._message ?? '');
-    signature.addInt(this._offset ?? 0);
+  void collectApiSignature(api_sig.ApiSignature signatureSink) {
+    signatureSink.addString(this._filePath ?? '');
+    signatureSink.addInt(this._length ?? 0);
+    signatureSink.addString(this._message ?? '');
+    signatureSink.addInt(this._offset ?? 0);
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
     fb.Offset? offset_filePath;
     fb.Offset? offset_message;
-    if (_filePath != null) {
-      offset_filePath = fbBuilder.writeString(_filePath!);
+    var filePath = _filePath;
+    if (filePath != null) {
+      offset_filePath = fbBuilder.writeString(filePath);
     }
-    if (_message != null) {
-      offset_message = fbBuilder.writeString(_message!);
+    var message = _message;
+    if (message != null) {
+      offset_message = fbBuilder.writeString(message);
     }
     fbBuilder.startTable();
     if (offset_filePath != null) {
       fbBuilder.addOffset(0, offset_filePath);
     }
-    if (_length != null && _length != 0) {
-      fbBuilder.addUint32(1, _length);
-    }
+    fbBuilder.addUint32(1, _length, 0);
     if (offset_message != null) {
       fbBuilder.addOffset(2, offset_message);
     }
-    if (_offset != null && _offset != 0) {
-      fbBuilder.addUint32(3, _offset);
-    }
+    fbBuilder.addUint32(3, _offset, 0);
     return fbBuilder.endTable();
   }
 }
@@ -3906,21 +3966,23 @@
   void flushInformative() {}
 
   /// Accumulate non-[informative] data into [signature].
-  void collectApiSignature(api_sig.ApiSignature signature) {
-    if (this._templateNames == null) {
-      signature.addInt(0);
+  void collectApiSignature(api_sig.ApiSignature signatureSink) {
+    var templateNames = this._templateNames;
+    if (templateNames == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._templateNames!.length);
-      for (var x in this._templateNames!) {
-        signature.addString(x);
+      signatureSink.addInt(templateNames.length);
+      for (var x in templateNames) {
+        signatureSink.addString(x);
       }
     }
-    if (this._templateValues == null) {
-      signature.addInt(0);
+    var templateValues = this._templateValues;
+    if (templateValues == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._templateValues!.length);
-      for (var x in this._templateValues!) {
-        signature.addString(x);
+      signatureSink.addInt(templateValues.length);
+      for (var x in templateValues) {
+        signatureSink.addString(x);
       }
     }
   }
@@ -3928,13 +3990,15 @@
   fb.Offset finish(fb.Builder fbBuilder) {
     fb.Offset? offset_templateNames;
     fb.Offset? offset_templateValues;
-    if (!(_templateNames == null || _templateNames!.isEmpty)) {
+    var templateNames = _templateNames;
+    if (!(templateNames == null || templateNames.isEmpty)) {
       offset_templateNames = fbBuilder.writeList(
-          _templateNames!.map((b) => fbBuilder.writeString(b)).toList());
+          templateNames.map((b) => fbBuilder.writeString(b)).toList());
     }
-    if (!(_templateValues == null || _templateValues!.isEmpty)) {
+    var templateValues = _templateValues;
+    if (!(templateValues == null || templateValues.isEmpty)) {
       offset_templateValues = fbBuilder.writeList(
-          _templateValues!.map((b) => fbBuilder.writeString(b)).toList());
+          templateValues.map((b) => fbBuilder.writeString(b)).toList());
     }
     fbBuilder.startTable();
     if (offset_templateNames != null) {
@@ -4024,8 +4088,8 @@
   void flushInformative() {}
 
   /// Accumulate non-[informative] data into [signature].
-  void collectApiSignature(api_sig.ApiSignature signature) {
-    signature.addInt(this._fake ?? 0);
+  void collectApiSignature(api_sig.ApiSignature signatureSink) {
+    signatureSink.addInt(this._fake ?? 0);
   }
 
   List<int> toBuffer() {
@@ -4035,9 +4099,7 @@
 
   fb.Offset finish(fb.Builder fbBuilder) {
     fbBuilder.startTable();
-    if (_fake != null && _fake != 0) {
-      fbBuilder.addUint32(0, _fake);
-    }
+    fbBuilder.addUint32(0, _fake, 0);
     return fbBuilder.endTable();
   }
 }
@@ -4128,27 +4190,30 @@
   }
 
   /// Accumulate non-[informative] data into [signature].
-  void collectApiSignature(api_sig.ApiSignature signature) {
-    if (this._configurations == null) {
-      signature.addInt(0);
+  void collectApiSignature(api_sig.ApiSignature signatureSink) {
+    var configurations = this._configurations;
+    if (configurations == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._configurations!.length);
-      for (var x in this._configurations!) {
-        x.collectApiSignature(signature);
+      signatureSink.addInt(configurations.length);
+      for (var x in configurations) {
+        x.collectApiSignature(signatureSink);
       }
     }
-    signature.addString(this._uri ?? '');
+    signatureSink.addString(this._uri ?? '');
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
     fb.Offset? offset_configurations;
     fb.Offset? offset_uri;
-    if (!(_configurations == null || _configurations!.isEmpty)) {
+    var configurations = _configurations;
+    if (!(configurations == null || configurations.isEmpty)) {
       offset_configurations = fbBuilder
-          .writeList(_configurations!.map((b) => b.finish(fbBuilder)).toList());
+          .writeList(configurations.map((b) => b.finish(fbBuilder)).toList());
     }
-    if (_uri != null) {
-      offset_uri = fbBuilder.writeString(_uri!);
+    var uri = _uri;
+    if (uri != null) {
+      offset_uri = fbBuilder.writeString(uri);
     }
     fbBuilder.startTable();
     if (offset_configurations != null) {
@@ -4266,24 +4331,27 @@
   void flushInformative() {}
 
   /// Accumulate non-[informative] data into [signature].
-  void collectApiSignature(api_sig.ApiSignature signature) {
-    signature.addString(this._name ?? '');
-    signature.addString(this._value ?? '');
-    signature.addString(this._uri ?? '');
+  void collectApiSignature(api_sig.ApiSignature signatureSink) {
+    signatureSink.addString(this._name ?? '');
+    signatureSink.addString(this._value ?? '');
+    signatureSink.addString(this._uri ?? '');
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
     fb.Offset? offset_name;
     fb.Offset? offset_uri;
     fb.Offset? offset_value;
-    if (_name != null) {
-      offset_name = fbBuilder.writeString(_name!);
+    var name = _name;
+    if (name != null) {
+      offset_name = fbBuilder.writeString(name);
     }
-    if (_uri != null) {
-      offset_uri = fbBuilder.writeString(_uri!);
+    var uri = _uri;
+    if (uri != null) {
+      offset_uri = fbBuilder.writeString(uri);
     }
-    if (_value != null) {
-      offset_value = fbBuilder.writeString(_value!);
+    var value = _value;
+    if (value != null) {
+      offset_value = fbBuilder.writeString(value);
     }
     fbBuilder.startTable();
     if (offset_name != null) {
@@ -4475,42 +4543,46 @@
   }
 
   /// Accumulate non-[informative] data into [signature].
-  void collectApiSignature(api_sig.ApiSignature signature) {
-    if (this._apiSignature == null) {
-      signature.addInt(0);
+  void collectApiSignature(api_sig.ApiSignature signatureSink) {
+    var apiSignature = this._apiSignature;
+    if (apiSignature == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._apiSignature!.length);
-      for (var x in this._apiSignature!) {
-        signature.addInt(x);
+      signatureSink.addInt(apiSignature.length);
+      for (var x in apiSignature) {
+        signatureSink.addInt(x);
       }
     }
-    if (this._exports == null) {
-      signature.addInt(0);
+    var exports = this._exports;
+    if (exports == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._exports!.length);
-      for (var x in this._exports!) {
-        x.collectApiSignature(signature);
+      signatureSink.addInt(exports.length);
+      for (var x in exports) {
+        x.collectApiSignature(signatureSink);
       }
     }
-    if (this._imports == null) {
-      signature.addInt(0);
+    var imports = this._imports;
+    if (imports == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._imports!.length);
-      for (var x in this._imports!) {
-        x.collectApiSignature(signature);
+      signatureSink.addInt(imports.length);
+      for (var x in imports) {
+        x.collectApiSignature(signatureSink);
       }
     }
-    signature.addBool(this._hasPartOfDirective == true);
-    if (this._parts == null) {
-      signature.addInt(0);
+    signatureSink.addBool(this._hasPartOfDirective == true);
+    var parts = this._parts;
+    if (parts == null) {
+      signatureSink.addInt(0);
     } else {
-      signature.addInt(this._parts!.length);
-      for (var x in this._parts!) {
-        signature.addString(x);
+      signatureSink.addInt(parts.length);
+      for (var x in parts) {
+        signatureSink.addString(x);
       }
     }
-    signature.addBool(this._hasLibraryDirective == true);
-    signature.addString(this._partOfUri ?? '');
+    signatureSink.addBool(this._hasLibraryDirective == true);
+    signatureSink.addString(this._partOfUri ?? '');
   }
 
   List<int> toBuffer() {
@@ -4525,26 +4597,32 @@
     fb.Offset? offset_lineStarts;
     fb.Offset? offset_partOfUri;
     fb.Offset? offset_parts;
-    if (!(_apiSignature == null || _apiSignature!.isEmpty)) {
-      offset_apiSignature = fbBuilder.writeListUint32(_apiSignature!);
+    var apiSignature = _apiSignature;
+    if (!(apiSignature == null || apiSignature.isEmpty)) {
+      offset_apiSignature = fbBuilder.writeListUint32(apiSignature);
     }
-    if (!(_exports == null || _exports!.isEmpty)) {
-      offset_exports = fbBuilder
-          .writeList(_exports!.map((b) => b.finish(fbBuilder)).toList());
+    var exports = _exports;
+    if (!(exports == null || exports.isEmpty)) {
+      offset_exports =
+          fbBuilder.writeList(exports.map((b) => b.finish(fbBuilder)).toList());
     }
-    if (!(_imports == null || _imports!.isEmpty)) {
-      offset_imports = fbBuilder
-          .writeList(_imports!.map((b) => b.finish(fbBuilder)).toList());
+    var imports = _imports;
+    if (!(imports == null || imports.isEmpty)) {
+      offset_imports =
+          fbBuilder.writeList(imports.map((b) => b.finish(fbBuilder)).toList());
     }
-    if (!(_lineStarts == null || _lineStarts!.isEmpty)) {
-      offset_lineStarts = fbBuilder.writeListUint32(_lineStarts!);
+    var lineStarts = _lineStarts;
+    if (!(lineStarts == null || lineStarts.isEmpty)) {
+      offset_lineStarts = fbBuilder.writeListUint32(lineStarts);
     }
-    if (_partOfUri != null) {
-      offset_partOfUri = fbBuilder.writeString(_partOfUri!);
+    var partOfUri = _partOfUri;
+    if (partOfUri != null) {
+      offset_partOfUri = fbBuilder.writeString(partOfUri);
     }
-    if (!(_parts == null || _parts!.isEmpty)) {
+    var parts = _parts;
+    if (!(parts == null || parts.isEmpty)) {
       offset_parts = fbBuilder
-          .writeList(_parts!.map((b) => fbBuilder.writeString(b)).toList());
+          .writeList(parts.map((b) => fbBuilder.writeString(b)).toList());
     }
     fbBuilder.startTable();
     if (offset_apiSignature != null) {
@@ -4553,12 +4631,8 @@
     if (offset_exports != null) {
       fbBuilder.addOffset(1, offset_exports);
     }
-    if (_hasLibraryDirective == true) {
-      fbBuilder.addBool(6, true);
-    }
-    if (_hasPartOfDirective == true) {
-      fbBuilder.addBool(3, true);
-    }
+    fbBuilder.addBool(6, _hasLibraryDirective == true);
+    fbBuilder.addBool(3, _hasPartOfDirective == true);
     if (offset_imports != null) {
       fbBuilder.addOffset(2, offset_imports);
     }
diff --git a/pkg/analyzer/test/source/analysis_options_provider_test.dart b/pkg/analyzer/test/source/analysis_options_provider_test.dart
index cd96e3e..f139239 100644
--- a/pkg/analyzer/test/source/analysis_options_provider_test.dart
+++ b/pkg/analyzer/test/source/analysis_options_provider_test.dart
@@ -128,7 +128,7 @@
   ignore:
     - bar
 ''');
-    YamlMap options = _getOptions('/foo/bar', crawlUp: true);
+    YamlMap options = _getOptions('/foo/bar');
     expect(options, hasLength(1));
     {
       var analyzer = getValue(options, 'analyzer') as YamlMap;
@@ -149,7 +149,7 @@
   ignore:
     - bar
 ''');
-    YamlMap options = _getOptions('/foo/bar/baz', crawlUp: true);
+    YamlMap options = _getOptions('/foo/bar/baz');
     expect(options, hasLength(1));
     {
       var analyzer = getValue(options, 'analyzer') as YamlMap;
@@ -230,8 +230,8 @@
     }
   }
 
-  YamlMap _getOptions(String posixPath, {bool crawlUp = false}) {
+  YamlMap _getOptions(String posixPath) {
     var resource = pathTranslator.getResource(posixPath) as Folder;
-    return provider.getOptions(resource, crawlUp: crawlUp);
+    return provider.getOptions(resource);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart
index 0584eb2..ff952a9 100644
--- a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart
@@ -18,10 +18,11 @@
   test_await_declaredVariableWrongType() async {
     await assertErrorsInCode('''
 f(Stream<String> stream) async {
-  await for (int i in stream) {}
+  await for (int i in stream) {
+    i;
+  }
 }
 ''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 50, 1),
       error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 55, 6),
     ]);
   }
@@ -30,10 +31,11 @@
     await assertErrorsInCode('''
 f(Stream<String> stream) async {
   int i;
-  await for (i in stream) {}
+  await for (i in stream) {
+    i;
+  }
 }
 ''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 39, 1),
       error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 60, 6),
     ]);
   }
@@ -42,22 +44,45 @@
     await assertErrorsInCode('''
 class Foo<T extends Iterable<int>> {
   void method(T iterable) {
-    for (String i in iterable) {}
+    for (String i in iterable) {
+      i;
+    }
   }
 }
 ''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 81, 1),
       error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 86, 8),
     ]);
   }
 
-  test_declaredVariableWrongType() async {
+  test_declaredVariable_interfaceTypeTypedef_ok() async {
+    await assertNoErrorsInCode('''
+typedef S = String;
+f() {
+  for (S i in <String>[]) {
+    i;
+  }
+}
+''');
+  }
+
+  test_declaredVariable_ok() async {
+    await assertNoErrorsInCode('''
+f() {
+  for (String i in <String>[]) {
+    i;
+  }
+}
+''');
+  }
+
+  test_declaredVariable_wrongType() async {
     await assertErrorsInCode('''
 f() {
-  for (int i in <String>[]) {}
+  for (int i in <String>[]) {
+    i;
+  }
 }
 ''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 17, 1),
       error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 22, 10),
     ]);
   }
@@ -66,10 +91,11 @@
     await assertErrorsInCode('''
 f() {
   int i;
-  for (i in <String>[]) {}
+  for (i in <String>[]) {
+    i;
+  }
 }
 ''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 12, 1),
       error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 27, 10),
     ]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
index f1ca1bd..9f5acb2 100644
--- a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
@@ -16,7 +16,9 @@
 
 @reflectiveTest
 class ForInOfInvalidTypeTest extends PubPackageResolutionTest
-    with WithoutNullSafetyMixin {
+    with ForInOfInvalidTypeTestCases, WithoutNullSafetyMixin {}
+
+mixin ForInOfInvalidTypeTestCases on PubPackageResolutionTest {
   test_awaitForIn_dynamic() async {
     await assertNoErrorsInCode('''
 f(dynamic e) async {
@@ -49,6 +51,16 @@
 ''');
   }
 
+  test_forIn_interfaceType_iterable() async {
+    await assertNoErrorsInCode('''
+f(Iterable e) {
+  for (var id in e) {
+    id;
+  }
+}
+''');
+  }
+
   test_forIn_interfaceType_notIterable() async {
     await assertErrorsInCode('''
 f(bool e) {
@@ -63,8 +75,8 @@
 }
 
 @reflectiveTest
-class ForInOfInvalidTypeWithNullSafetyTest extends ForInOfInvalidTypeTest
-    with WithNullSafetyMixin {
+class ForInOfInvalidTypeWithNullSafetyTest extends PubPackageResolutionTest
+    with ForInOfInvalidTypeTestCases {
   test_awaitForIn_never() async {
     await assertErrorsInCode('''
 f(Never e) async {
@@ -79,6 +91,17 @@
 //    assertType(findNode.simple('id;'), 'Never');
   }
 
+  test_forIn_interfaceTypeTypedef_iterable() async {
+    await assertNoErrorsInCode('''
+typedef L = List<String>;
+f(L e) {
+  for (var id in e) {
+    id;
+  }
+}
+''');
+  }
+
   test_forIn_never() async {
     await assertErrorsInCode('''
 f(Never e) {
diff --git a/pkg/analyzer/test/src/task/options_test.dart b/pkg/analyzer/test/src/task/options_test.dart
index 3dcdf8e..150398a 100644
--- a/pkg/analyzer/test/src/task/options_test.dart
+++ b/pkg/analyzer/test/src/task/options_test.dart
@@ -464,13 +464,13 @@
         ]));
   }
 
-  YamlMap _getOptions(String posixPath, {bool crawlUp = false}) {
+  YamlMap _getOptions(String posixPath) {
     var resource = pathTranslator.getResource(posixPath) as Folder;
-    return provider.getOptions(resource, crawlUp: crawlUp);
+    return provider.getOptions(resource);
   }
 
-  AnalysisOptions _getOptionsObject(String posixPath, {bool crawlUp = false}) {
-    final map = _getOptions(posixPath, crawlUp: crawlUp);
+  AnalysisOptions _getOptionsObject(String posixPath) {
+    final map = _getOptions(posixPath);
     final options = AnalysisOptionsImpl();
     applyToAnalysisOptions(options, map);
     return options;
diff --git a/pkg/analyzer/tool/summary/generate.dart b/pkg/analyzer/tool/summary/generate.dart
index a4b1c37..5e37425 100644
--- a/pkg/analyzer/tool/summary/generate.dart
+++ b/pkg/analyzer/tool/summary/generate.dart
@@ -209,22 +209,25 @@
   void _generateCollectApiSignature() {
     out();
     out('/// Accumulate non-[informative] data into [signature].');
-    out('void collectApiSignature(api_sig.ApiSignature signature) {');
+    out('void collectApiSignature(api_sig.ApiSignature signatureSink) {');
 
-    void writeField(String name, idl_model.FieldType type, bool isInformative) {
-      if (isInformative) {
+    void writeField(idl_model.FieldDeclaration field) {
+      if (field.isInformative) {
         return;
       }
-      String ref = 'this.$name';
+      var type = field.type;
+      var name = field.name;
       if (type.isList) {
-        out('if ($ref == null) {');
+        var localName = name;
+        out('var $name = this._$name;');
+        out('if ($localName == null) {');
         indent(() {
-          out('signature.addInt(0);');
+          out('signatureSink.addInt(0);');
         });
         out('} else {');
         indent(() {
-          out('signature.addInt($ref!.length);');
-          out('for (var x in $ref!) {');
+          out('signatureSink.addInt($localName.length);');
+          out('for (var x in $localName) {');
           indent(() {
             _generateSignatureCall(type.typeName, 'x', false);
           });
@@ -232,7 +235,7 @@
         });
         out('}');
       } else {
-        _generateSignatureCall(type.typeName, ref, true);
+        _generateSignatureCall(type.typeName, 'this._$name', true);
       }
     }
 
@@ -241,7 +244,7 @@
         ..sort((idl_model.FieldDeclaration a, idl_model.FieldDeclaration b) =>
             a.id.compareTo(b.id));
       for (idl_model.FieldDeclaration field in sortedFields) {
-        writeField('_${field.name}', field.type, field.isInformative);
+        writeField(field);
       }
     });
     out('}');
@@ -285,39 +288,39 @@
 
       for (idl_model.FieldDeclaration field in cls.fields) {
         idl_model.FieldType fieldType = field.type;
-        String valueName = '_' + field.name;
+        String valueName = field.name;
         String offsetName = 'offset_' + field.name;
         String? condition;
         String? writeCode;
         if (fieldType.isList) {
-          condition = ' || $valueName!.isEmpty';
+          condition = ' || $valueName.isEmpty';
           if (_idl.classes.containsKey(fieldType.typeName)) {
             String itemCode = 'b.finish(fbBuilder)';
-            String listCode = '$valueName!.map((b) => $itemCode).toList()';
+            String listCode = '$valueName.map((b) => $itemCode).toList()';
             writeCode = '$offsetName = fbBuilder.writeList($listCode);';
           } else if (_idl.enums.containsKey(fieldType.typeName)) {
             String itemCode = 'b.index';
-            String listCode = '$valueName!.map((b) => $itemCode).toList()';
+            String listCode = '$valueName.map((b) => $itemCode).toList()';
             writeCode = '$offsetName = fbBuilder.writeListUint8($listCode);';
           } else if (fieldType.typeName == 'bool') {
-            writeCode = '$offsetName = fbBuilder.writeListBool($valueName!);';
+            writeCode = '$offsetName = fbBuilder.writeListBool($valueName);';
           } else if (fieldType.typeName == 'int') {
-            writeCode = '$offsetName = fbBuilder.writeListUint32($valueName!);';
+            writeCode = '$offsetName = fbBuilder.writeListUint32($valueName);';
           } else if (fieldType.typeName == 'double') {
-            writeCode =
-                '$offsetName = fbBuilder.writeListFloat64($valueName!);';
+            writeCode = '$offsetName = fbBuilder.writeListFloat64($valueName);';
           } else {
             assert(fieldType.typeName == 'String');
             String itemCode = 'fbBuilder.writeString(b)';
-            String listCode = '$valueName!.map((b) => $itemCode).toList()';
+            String listCode = '$valueName.map((b) => $itemCode).toList()';
             writeCode = '$offsetName = fbBuilder.writeList($listCode);';
           }
         } else if (fieldType.typeName == 'String') {
-          writeCode = '$offsetName = fbBuilder.writeString($valueName!);';
+          writeCode = '$offsetName = fbBuilder.writeString($valueName);';
         } else if (_idl.classes.containsKey(fieldType.typeName)) {
-          writeCode = '$offsetName = $valueName!.finish(fbBuilder);';
+          writeCode = '$offsetName = $valueName.finish(fbBuilder);';
         }
         if (writeCode != null) {
+          out('var $valueName = _${field.name};');
           if (condition == null) {
             out('if ($valueName != null) {');
           } else {
@@ -334,33 +337,27 @@
         int index = field.id;
         idl_model.FieldType fieldType = field.type;
         String valueName = '_' + field.name;
-        String condition = '$valueName != null';
-        String? writeCode;
         if (fieldType.isList ||
             fieldType.typeName == 'String' ||
             _idl.classes.containsKey(fieldType.typeName)) {
           String offsetName = 'offset_' + field.name;
-          condition = '$offsetName != null';
-          writeCode = 'fbBuilder.addOffset($index, $offsetName);';
+          out('if ($offsetName != null) {');
+          outWithIndent('fbBuilder.addOffset($index, $offsetName);');
+          out('}');
         } else if (fieldType.typeName == 'bool') {
-          condition = '$valueName == true';
-          writeCode = 'fbBuilder.addBool($index, true);';
+          out('fbBuilder.addBool($index, $valueName == true);');
         } else if (fieldType.typeName == 'double') {
-          condition += ' && $valueName != ${defaultValue(fieldType, true)}';
-          writeCode = 'fbBuilder.addFloat64($index, $valueName);';
+          var defValue = defaultValue(fieldType, true);
+          out('fbBuilder.addFloat64($index, $valueName, $defValue);');
         } else if (fieldType.typeName == 'int') {
-          condition += ' && $valueName != ${defaultValue(fieldType, true)}';
-          writeCode = 'fbBuilder.addUint32($index, $valueName);';
+          var defValue = defaultValue(fieldType, true);
+          out('fbBuilder.addUint32($index, $valueName, $defValue);');
         } else if (_idl.enums.containsKey(fieldType.typeName)) {
-          condition += ' && $valueName != ${defaultValue(fieldType, true)}';
-          writeCode = 'fbBuilder.addUint8($index, $valueName!.index);';
-        }
-        if (writeCode == null) {
+          var defValue = '${defaultValue(fieldType, true)}.index';
+          out('fbBuilder.addUint8($index, $valueName?.index, $defValue);');
+        } else {
           throw UnimplementedError('Writing type ${fieldType.typeName}');
         }
-        out('if ($condition) {');
-        outWithIndent(writeCode);
-        out('}');
       }
       out('return fbBuilder.endTable();');
     });
@@ -441,16 +438,16 @@
   void _generateSignatureCall(String typeName, String ref, bool couldBeNull) {
     if (_idl.enums.containsKey(typeName)) {
       if (couldBeNull) {
-        out('signature.addInt($ref == null ? 0 : $ref!.index);');
+        out('signatureSink.addInt($ref?.index ?? 0);');
       } else {
-        out('signature.addInt($ref.index);');
+        out('signatureSink.addInt($ref.index);');
       }
     } else if (_idl.classes.containsKey(typeName)) {
       if (couldBeNull) {
-        out('signature.addBool($ref != null);');
-        out('$ref?.collectApiSignature(signature);');
+        out('signatureSink.addBool($ref != null);');
+        out('$ref?.collectApiSignature(signatureSink);');
       } else {
-        out('$ref.collectApiSignature(signature);');
+        out('$ref.collectApiSignature(signatureSink);');
       }
     } else {
       switch (typeName) {
@@ -458,25 +455,25 @@
           if (couldBeNull) {
             ref += " ?? ''";
           }
-          out("signature.addString($ref);");
+          out("signatureSink.addString($ref);");
           break;
         case 'int':
           if (couldBeNull) {
             ref += ' ?? 0';
           }
-          out('signature.addInt($ref);');
+          out('signatureSink.addInt($ref);');
           break;
         case 'bool':
           if (couldBeNull) {
             ref += ' == true';
           }
-          out('signature.addBool($ref);');
+          out('signatureSink.addBool($ref);');
           break;
         case 'double':
           if (couldBeNull) {
             ref += ' ?? 0.0';
           }
-          out('signature.addDouble($ref);');
+          out('signatureSink.addDouble($ref);');
           break;
         default:
           throw "Don't know how to generate signature call for $typeName";
diff --git a/pkg/front_end/lib/src/api_prototype/standard_file_system.dart b/pkg/front_end/lib/src/api_prototype/standard_file_system.dart
index bc1a4bc..be0584e 100644
--- a/pkg/front_end/lib/src/api_prototype/standard_file_system.dart
+++ b/pkg/front_end/lib/src/api_prototype/standard_file_system.dart
@@ -8,9 +8,8 @@
 
 import 'dart:io' as io;
 
-import 'file_system.dart';
-
 import '../fasta/compiler_context.dart' show CompilerContext;
+import 'file_system.dart';
 
 /// Concrete implementation of [FileSystem] handling standard URI schemes.
 ///
@@ -64,7 +63,7 @@
   Future<List<int>> readAsBytes() async {
     try {
       CompilerContext.recordDependency(uri);
-      return new io.File.fromUri(uri).readAsBytesSync();
+      return await new io.File.fromUri(uri).readAsBytes();
     } on io.FileSystemException catch (exception) {
       throw _toFileSystemException(exception);
     }
diff --git a/tools/VERSION b/tools/VERSION
index de4905b..4e84a35 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 27
+PRERELEASE 28
 PRERELEASE_PATCH 0
\ No newline at end of file
