diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 22e203a..838334a 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -53,13 +53,13 @@
 
   /// A list containing all of the accessors (getters and setters) contained in
   /// this class.
-  List<PropertyAccessorElement>? _accessors;
+  List<PropertyAccessorElement> _accessors = _Sentinel.propertyAccessorElement;
 
   /// A list containing all of the fields contained in this class.
-  List<FieldElement>? _fields;
+  List<FieldElement> _fields = _Sentinel.fieldElement;
 
   /// A list containing all of the methods contained in this class.
-  List<MethodElement>? _methods;
+  List<MethodElement> _methods = _Sentinel.methodElement;
 
   /// Initialize a newly created class element to have the given [name] at the
   /// given [offset] in the file that contains the declaration of this element.
@@ -74,11 +74,6 @@
       CompilationUnitElementImpl enclosingUnit)
       : super.forSerialized(enclosingUnit);
 
-  @override
-  List<PropertyAccessorElement> get accessors {
-    return _accessors ?? const <PropertyAccessorElement>[];
-  }
-
   /// Set the accessors contained in this class to the given [accessors].
   set accessors(List<PropertyAccessorElement> accessors) {
     for (PropertyAccessorElement accessor in accessors) {
@@ -95,9 +90,6 @@
     return _enclosingElement as CompilationUnitElementImpl;
   }
 
-  @override
-  List<FieldElement> get fields => _fields ?? const <FieldElement>[];
-
   /// Set the fields contained in this class to the given [fields].
   set fields(List<FieldElement> fields) {
     for (FieldElement field in fields) {
@@ -430,11 +422,11 @@
 
   /// A list containing all of the mixins that are applied to the class being
   /// extended in order to derive the superclass of this class.
-  List<InterfaceType>? _mixins;
+  List<InterfaceType> _mixins = _Sentinel.interfaceType;
 
   /// A list containing all of the interfaces that are implemented by this
   /// class.
-  List<InterfaceType>? _interfaces;
+  List<InterfaceType> _interfaces = _Sentinel.interfaceType;
 
   /// For classes which are not mixin applications, a list containing all of the
   /// constructors contained in this class, or `null` if the list of
@@ -443,7 +435,7 @@
   /// For classes which are mixin applications, the list of constructors is
   /// computed on the fly by the [constructors] getter, and this field is
   /// `null`.
-  List<ConstructorElement>? _constructors;
+  List<ConstructorElement> _constructors = _Sentinel.constructorElement;
 
   /// A flag indicating whether the types associated with the instance members
   /// of this class have been inferred.
@@ -472,19 +464,20 @@
 
   @override
   List<PropertyAccessorElement> get accessors {
-    if (_accessors != null) return _accessors!;
+    if (!identical(_accessors, _Sentinel.propertyAccessorElement)) {
+      return _accessors;
+    }
 
     if (linkedNode != null) {
       if (linkedNode is ClassOrMixinDeclaration) {
         _createPropertiesAndAccessors();
-        assert(_accessors != null);
-        return _accessors!;
+        return _accessors;
       } else {
         return _accessors = const [];
       }
     }
 
-    return _accessors ??= const <PropertyAccessorElement>[];
+    return _accessors;
   }
 
   @override
@@ -511,8 +504,8 @@
 
   @override
   List<ConstructorElement> get constructors {
-    if (_constructors != null) {
-      return _constructors!;
+    if (!identical(_constructors, _Sentinel.constructorElement)) {
+      return _constructors;
     }
 
     if (isMixinApplication) {
@@ -531,7 +524,7 @@
         return element;
       }).toList();
 
-      if (_constructors!.isEmpty) {
+      if (_constructors.isEmpty) {
         return _constructors = [
           ConstructorElementImpl.forLinkedNode(
             this,
@@ -546,14 +539,14 @@
       }
     }
 
-    if (_constructors!.isEmpty) {
+    if (_constructors.isEmpty) {
       var constructor = ConstructorElementImpl('', -1);
       constructor.isSynthetic = true;
       constructor.enclosingElement = this;
       _constructors = <ConstructorElement>[constructor];
     }
 
-    return _constructors!;
+    return _constructors;
   }
 
   /// Set the constructors contained in this class to the given [constructors].
@@ -579,20 +572,21 @@
 
   @override
   List<FieldElement> get fields {
-    if (_fields != null) return _fields!;
+    if (!identical(_fields, _Sentinel.fieldElement)) {
+      return _fields;
+    }
 
     if (linkedNode != null) {
       if (linkedNode is ClassOrMixinDeclaration) {
         linkedContext!.applyResolution(linkedNode!);
         _createPropertiesAndAccessors();
-        assert(_fields != null);
-        return _fields!;
+        return _fields;
       } else {
         _fields = const [];
       }
     }
 
-    return _fields ?? const <FieldElement>[];
+    return _fields;
   }
 
   @override
@@ -662,8 +656,8 @@
   }
 
   List<InterfaceType> get interfacesInternal {
-    if (_interfaces != null) {
-      return _interfaces!;
+    if (!identical(_interfaces, _Sentinel.interfaceType)) {
+      return _interfaces;
     }
 
     if (linkedNode != null) {
@@ -680,7 +674,7 @@
         return _interfaces = const [];
       }
     }
-    return _interfaces = const <InterfaceType>[];
+    return _interfaces;
   }
 
   @override
@@ -745,8 +739,8 @@
 
   @override
   List<MethodElement> get methods {
-    if (_methods != null) {
-      return _methods!;
+    if (!identical(_methods, _Sentinel.methodElement)) {
+      return _methods;
     }
 
     if (linkedNode != null) {
@@ -765,7 +759,7 @@
       }).toList();
     }
 
-    return _methods = const <MethodElement>[];
+    return _methods;
   }
 
   /// Set the methods contained in this class to the given [methods].
@@ -779,11 +773,14 @@
   @override
   List<InterfaceType> get mixins {
     if (linkedMixinInferenceCallback != null) {
-      _mixins = linkedMixinInferenceCallback!(this);
+      var mixins = linkedMixinInferenceCallback!(this);
+      if (mixins != null) {
+        return _mixins = mixins;
+      }
     }
 
-    if (_mixins != null) {
-      return _mixins!;
+    if (!identical(_mixins, _Sentinel.interfaceType)) {
+      return _mixins;
     }
 
     if (linkedNode != null) {
@@ -800,7 +797,8 @@
         return _mixins = const [];
       }
     }
-    return _mixins = const <InterfaceType>[];
+
+    return _mixins;
   }
 
   set mixins(List<InterfaceType> mixins) {
@@ -1000,8 +998,8 @@
   }
 
   void _createPropertiesAndAccessors() {
-    assert(_accessors == null);
-    assert(_fields == null);
+    assert(identical(_accessors, _Sentinel.propertyAccessorElement));
+    assert(identical(_fields, _Sentinel.fieldElement));
 
     var context = enclosingUnit.linkedContext;
     var accessorList = <PropertyAccessorElement>[];
@@ -1135,36 +1133,37 @@
 
   /// A list containing all of the top-level accessors (getters and setters)
   /// contained in this compilation unit.
-  List<PropertyAccessorElement>? _accessors;
+  List<PropertyAccessorElement> _accessors = _Sentinel.propertyAccessorElement;
 
   /// A list containing all of the enums contained in this compilation unit.
-  List<ClassElement>? _enums;
+  List<ClassElement> _enums = _Sentinel.classElement;
 
   /// A list containing all of the extensions contained in this compilation
   /// unit.
-  List<ExtensionElement>? _extensions;
+  List<ExtensionElement> _extensions = _Sentinel.extensionElement;
 
   /// A list containing all of the top-level functions contained in this
   /// compilation unit.
-  List<FunctionElement>? _functions;
+  List<FunctionElement> _functions = _Sentinel.functionElement;
 
   /// A list containing all of the mixins contained in this compilation unit.
-  List<ClassElement>? _mixins;
+  List<ClassElement> _mixins = _Sentinel.classElement;
 
   /// A list containing all of the function type aliases contained in this
   /// compilation unit.
   @Deprecated('Use typeAliases instead')
-  List<FunctionTypeAliasElement>? _functionTypeAliases;
+  List<FunctionTypeAliasElement> _functionTypeAliases =
+      _Sentinel.functionTypeAliasElement;
 
   /// A list containing all of the type aliases contained in this compilation
   /// unit.
-  List<TypeAliasElement>? _typeAliases;
+  List<TypeAliasElement> _typeAliases = _Sentinel.typeAliasElement;
 
   /// A list containing all of the classes contained in this compilation unit.
-  List<ClassElement>? _types;
+  List<ClassElement> _types = _Sentinel.classElement;
 
   /// A list containing all of the variables contained in this compilation unit.
-  List<TopLevelVariableElement>? _variables;
+  List<TopLevelVariableElement> _variables = _Sentinel.topLevelVariables;
 
   /// Initialize a newly created compilation unit element to have the given
   /// [name].
@@ -1181,15 +1180,16 @@
 
   @override
   List<PropertyAccessorElement> get accessors {
-    if (_accessors != null) return _accessors!;
+    if (!identical(_accessors, _Sentinel.propertyAccessorElement)) {
+      return _accessors;
+    }
 
     if (linkedNode != null) {
       _createPropertiesAndAccessors(this);
-      assert(_accessors != null);
-      return _accessors!;
+      return _accessors;
     }
 
-    return _accessors ?? const <PropertyAccessorElement>[];
+    return _accessors;
   }
 
   /// Set the top-level accessors (getters and setters) contained in this
@@ -1228,7 +1228,9 @@
 
   @override
   List<ClassElement> get enums {
-    if (_enums != null) return _enums!;
+    if (!identical(_enums, _Sentinel.classElement)) {
+      return _enums;
+    }
 
     if (linkedNode != null) {
       var containerRef = reference!.getChild('@enum');
@@ -1242,7 +1244,7 @@
       }).toList();
     }
 
-    return _enums ??= const <ClassElement>[];
+    return _enums;
   }
 
   /// Set the enums contained in this compilation unit to the given [enums].
@@ -1255,9 +1257,8 @@
 
   @override
   List<ExtensionElement> get extensions {
-    if (_extensions != null) {
-      /// TODO(migration): use empty sentinel value instead of null
-      return _extensions!;
+    if (!identical(_extensions, _Sentinel.extensionElement)) {
+      return _extensions;
     }
 
     if (linkedNode != null) {
@@ -1274,12 +1275,13 @@
           var reference = containerRef.getChild(refName);
           var element = node.declaredElement;
           element ??= ExtensionElementImpl.forLinkedNode(this, reference, node);
-          _extensions!.add(element);
+          _extensions.add(element);
         }
       }
-      return _extensions!;
+      return _extensions;
     }
-    return _extensions ?? const <ExtensionElement>[];
+
+    return _extensions;
   }
 
   /// Set the extensions contained in this compilation unit to the given
@@ -1293,7 +1295,9 @@
 
   @override
   List<FunctionElement> get functions {
-    if (_functions != null) return _functions!;
+    if (!identical(_functions, _Sentinel.functionElement)) {
+      return _functions;
+    }
 
     if (linkedNode != null) {
       var containerRef = reference!.getChild('@function');
@@ -1308,7 +1312,8 @@
         return element;
       }).toList();
     }
-    return _functions ?? const <FunctionElement>[];
+
+    return _functions;
   }
 
   /// Set the top-level functions contained in this compilation unit to the
@@ -1323,7 +1328,10 @@
   @Deprecated('Use typeAliases instead')
   @override
   List<FunctionTypeAliasElement> get functionTypeAliases {
-    return _functionTypeAliases ??=
+    if (!identical(_functionTypeAliases, _Sentinel.functionTypeAliasElement)) {
+      return _functionTypeAliases;
+    }
+    return _functionTypeAliases =
         typeAliases.whereType<FunctionTypeAliasElement>().toList();
   }
 
@@ -1357,7 +1365,9 @@
 
   @override
   List<ClassElement> get mixins {
-    if (_mixins != null) return _mixins!;
+    if (!identical(_mixins, _Sentinel.classElement)) {
+      return _mixins;
+    }
 
     if (linkedNode != null) {
       var linkedNode = this.linkedNode as CompilationUnit;
@@ -1372,7 +1382,7 @@
       }).toList();
     }
 
-    return _mixins ?? const <ClassElement>[];
+    return _mixins;
   }
 
   /// Set the mixins contained in this compilation unit to the given [mixins].
@@ -1388,15 +1398,16 @@
 
   @override
   List<TopLevelVariableElement> get topLevelVariables {
-    if (_variables != null) return _variables!;
+    if (!identical(_variables, _Sentinel.topLevelVariables)) {
+      return _variables;
+    }
 
     if (linkedNode != null) {
       _createPropertiesAndAccessors(this);
-      assert(_variables != null);
-      return _variables!;
+      return _variables;
     }
 
-    return _variables ?? const <TopLevelVariableElement>[];
+    return _variables;
   }
 
   /// Set the top-level variables contained in this compilation unit to the
@@ -1410,7 +1421,9 @@
 
   @override
   List<TypeAliasElement> get typeAliases {
-    if (_typeAliases != null) return _typeAliases!;
+    if (!identical(_typeAliases, _Sentinel.typeAliasElement)) {
+      return _typeAliases;
+    }
 
     if (linkedNode != null) {
       var containerRef = reference!.getChild('@typeAlias');
@@ -1429,11 +1442,11 @@
         var element = node.declaredElement as TypeAliasElement?;
         element ??= TypeAliasElementImpl.forLinkedNodeFactory(
             this, reference, node as TypeAlias);
-        _typeAliases!.add(element);
+        _typeAliases.add(element);
       }
     }
 
-    return _typeAliases ?? const <TypeAliasElement>[];
+    return _typeAliases;
   }
 
   /// Set the type aliases contained in this compilation unit to [typeAliases].
@@ -1449,7 +1462,9 @@
 
   @override
   List<ClassElement> get types {
-    if (_types != null) return _types!;
+    if (!identical(_types, _Sentinel.classElement)) {
+      return _types;
+    }
 
     if (linkedNode != null) {
       var containerRef = reference!.getChild('@class');
@@ -1460,19 +1475,19 @@
           var reference = containerRef.getChild(name);
           var element = node.declaredElement;
           element ??= ClassElementImpl.forLinkedNode(this, reference, node);
-          _types!.add(element);
+          _types.add(element);
         } else if (node is ClassTypeAlias) {
           var name = node.name.name;
           var reference = containerRef.getChild(name);
           var element = node.declaredElement;
           element ??= ClassElementImpl.forLinkedNode(this, reference, node);
-          _types!.add(element);
+          _types.add(element);
         }
       }
-      return _types!;
+      return _types;
     }
 
-    return _types ?? const <ClassElement>[];
+    return _types;
   }
 
   /// Set the types contained in this compilation unit to the given [types].
@@ -1536,8 +1551,10 @@
   }
 
   static void _createPropertiesAndAccessors(CompilationUnitElementImpl unit) {
-    if (unit._variables != null) return;
-    assert(unit._accessors == null);
+    if (!identical(unit._variables, _Sentinel.topLevelVariables)) {
+      return;
+    }
+    assert(identical(unit._accessors, _Sentinel.propertyAccessorElement));
 
     var accessorMap =
         <CompilationUnitElementImpl, List<PropertyAccessorElement>>{};
@@ -1621,8 +1638,8 @@
 
     for (var unit in units) {
       var unitImpl = unit as CompilationUnitElementImpl;
-      unitImpl._accessors = accessorMap[unit];
-      unitImpl._variables = variableMap[unit];
+      unitImpl._accessors = accessorMap[unit]!;
+      unitImpl._variables = variableMap[unit]!;
     }
   }
 }
@@ -1835,7 +1852,8 @@
 
   /// The initializers for this constructor (used for evaluating constant
   /// instance creation expressions).
-  List<ConstructorInitializer>? _constantInitializers;
+  List<ConstructorInitializer> _constantInitializers =
+      _Sentinel.constructorInitializer;
 
   /// The offset of the `.` before this constructor name or `null` if not named.
   int? _periodOffset;
@@ -1865,7 +1883,9 @@
   /// Return the constant initializers for this element, which will be empty if
   /// there are no initializers, or `null` if there was an error in the source.
   List<ConstructorInitializer> get constantInitializers {
-    if (_constantInitializers != null) return _constantInitializers!;
+    if (!identical(_constantInitializers, _Sentinel.constructorInitializer)) {
+      return _constantInitializers;
+    }
 
     if (linkedNode != null) {
       linkedContext!.applyResolution(linkedNode!);
@@ -1874,7 +1894,7 @@
       );
     }
 
-    return _constantInitializers!;
+    return _constantInitializers;
   }
 
   set constantInitializers(List<ConstructorInitializer> constantInitializers) {
@@ -2502,7 +2522,7 @@
   int _modifiers = 0;
 
   /// A list containing all of the metadata associated with this element.
-  List<ElementAnnotation>? _metadata;
+  List<ElementAnnotation> _metadata = _Sentinel.elementAnnotation;
 
   /// A cached copy of the calculated hashCode for this element.
   int? _cachedHashCode;
@@ -2855,7 +2875,9 @@
 
   @override
   List<ElementAnnotation> get metadata {
-    if (_metadata != null) return _metadata!;
+    if (!identical(_metadata, _Sentinel.elementAnnotation)) {
+      return _metadata;
+    }
 
     if (linkedNode != null) {
       linkedContext!.applyResolution(linkedNode!);
@@ -2863,7 +2885,7 @@
       return _metadata = _buildAnnotations2(enclosingUnit, metadata);
     }
 
-    return _metadata ?? const <ElementAnnotation>[];
+    return _metadata;
   }
 
   set metadata(List<ElementAnnotation> metadata) {
@@ -3205,12 +3227,15 @@
 
   @override
   List<PropertyAccessorElement> get accessors {
-    if (_accessors == null) {
-      if (linkedNode != null) {
-        _resynthesizeMembers2();
-      }
+    if (!identical(_accessors, _Sentinel.propertyAccessorElement)) {
+      return _accessors;
     }
-    return _accessors ?? const <PropertyAccessorElement>[];
+
+    if (linkedNode != null) {
+      _resynthesizeMembers2();
+    }
+
+    return _accessors;
   }
 
   @override
@@ -3257,12 +3282,15 @@
 
   @override
   List<FieldElement> get fields {
-    if (_fields == null) {
-      if (linkedNode != null) {
-        _resynthesizeMembers2();
-      }
+    if (!identical(_fields, _Sentinel.fieldElement)) {
+      return _fields;
     }
-    return _fields ?? const <FieldElement>[];
+
+    if (linkedNode != null) {
+      _resynthesizeMembers2();
+    }
+
+    return _fields;
   }
 
   @override
@@ -3294,12 +3322,15 @@
 
   @override
   List<MethodElement> get methods {
-    if (_methods == null) {
-      if (linkedNode != null) {
-        _resynthesizeMembers2();
-      }
+    if (!identical(_methods, _Sentinel.methodElement)) {
+      return _methods;
     }
-    return _methods ?? const <MethodElement>[];
+
+    if (linkedNode != null) {
+      _resynthesizeMembers2();
+    }
+
+    return _methods;
   }
 
   @override
@@ -3403,7 +3434,7 @@
     implements ExecutableElement, ElementImplWithFunctionType {
   /// A list containing all of the parameters defined by this executable
   /// element.
-  List<ParameterElement>? _parameters;
+  List<ParameterElement> _parameters = _Sentinel.parameterElement;
 
   /// The inferred return type of this executable element.
   DartType? _returnType;
@@ -3566,7 +3597,9 @@
   ///
   /// In most cases, the [parameters] getter should be used instead.
   List<ParameterElement> get parametersInternal {
-    if (_parameters != null) return _parameters!;
+    if (!identical(_parameters, _Sentinel.parameterElement)) {
+      return _parameters;
+    }
 
     if (linkedNode != null) {
       linkedContext!.applyResolution(linkedNode!);
@@ -3581,7 +3614,7 @@
       );
     }
 
-    return _parameters ??= const <ParameterElement>[];
+    return _parameters;
   }
 
   @override
@@ -3662,7 +3695,7 @@
 
   /// The combinators that were specified as part of the export directive in the
   /// order in which they were specified.
-  List<NamespaceCombinator>? _combinators;
+  List<NamespaceCombinator> _combinators = _Sentinel.namespaceCombinator;
 
   /// Initialize a newly created export element at the given [offset].
   ExportElementImpl(int offset) : super(null, offset);
@@ -3675,7 +3708,9 @@
 
   @override
   List<NamespaceCombinator> get combinators {
-    if (_combinators != null) return _combinators!;
+    if (!identical(_combinators, _Sentinel.namespaceCombinator)) {
+      return _combinators;
+    }
 
     if (linkedNode != null) {
       var node = linkedNode as ExportDirective;
@@ -3685,7 +3720,7 @@
       );
     }
 
-    return _combinators ?? const <NamespaceCombinator>[];
+    return _combinators;
   }
 
   set combinators(List<NamespaceCombinator> combinators) {
@@ -3756,13 +3791,13 @@
 
   /// A list containing all of the accessors (getters and setters) contained in
   /// this extension.
-  List<PropertyAccessorElement>? _accessors;
+  List<PropertyAccessorElement> _accessors = _Sentinel.propertyAccessorElement;
 
   /// A list containing all of the fields contained in this extension.
-  List<FieldElement>? _fields;
+  List<FieldElement> _fields = _Sentinel.fieldElement;
 
   /// A list containing all of the methods contained in this extension.
-  List<MethodElement>? _methods;
+  List<MethodElement> _methods = _Sentinel.methodElement;
 
   /// Initialize a newly created extension element to have the given [name] at
   /// the given [offset] in the file that contains the declaration of this
@@ -3778,21 +3813,18 @@
 
   @override
   List<PropertyAccessorElement> get accessors {
-    if (_accessors != null) {
-      return _accessors!;
+    if (!identical(_accessors, _Sentinel.propertyAccessorElement)) {
+      return _accessors;
     }
 
     if (linkedNode != null) {
       if (linkedNode is ExtensionDeclaration) {
         _createPropertiesAndAccessors();
-        assert(_accessors != null);
-        return _accessors!;
-      } else {
-        return _accessors = const [];
+        return _accessors;
       }
     }
 
-    return _accessors ??= const <PropertyAccessorElement>[];
+    return _accessors;
   }
 
   set accessors(List<PropertyAccessorElement> accessors) {
@@ -3858,21 +3890,20 @@
 
   @override
   List<FieldElement> get fields {
-    if (_fields != null) {
-      return _fields!;
+    if (!identical(_fields, _Sentinel.fieldElement)) {
+      return _fields;
     }
 
     if (linkedNode != null) {
       if (linkedNode is ExtensionDeclaration) {
         _createPropertiesAndAccessors();
-        assert(_fields != null);
-        return _fields!;
+        return _fields;
       } else {
-        return _fields = const [];
+        return _fields;
       }
     }
 
-    return _fields ?? const <FieldElement>[];
+    return _fields;
   }
 
   set fields(List<FieldElement> fields) {
@@ -3898,8 +3929,8 @@
 
   @override
   List<MethodElement> get methods {
-    if (_methods != null) {
-      return _methods!;
+    if (!identical(_methods, _Sentinel.methodElement)) {
+      return _methods;
     }
 
     if (linkedNode != null) {
@@ -3916,7 +3947,8 @@
         return element;
       }).toList();
     }
-    return _methods = const <MethodElement>[];
+
+    return _methods;
   }
 
   /// Set the methods contained in this extension to the given [methods].
@@ -4004,8 +4036,8 @@
 
   /// Create the accessors and fields when [linkedNode] is not `null`.
   void _createPropertiesAndAccessors() {
-    assert(_accessors == null);
-    assert(_fields == null);
+    assert(identical(_accessors, _Sentinel.propertyAccessorElement));
+    assert(identical(_fields, _Sentinel.fieldElement));
 
     var context = enclosingUnit.linkedContext!;
     var accessorList = <PropertyAccessorElement>[];
@@ -4352,7 +4384,7 @@
   DartType? _returnType;
 
   /// The elements representing the parameters of the function.
-  List<ParameterElement>? _parameters;
+  List<ParameterElement> _parameters = _Sentinel.parameterElement;
 
   /// Is `true` if the type has the question mark, so is nullable.
   bool _isNullable = false;
@@ -4397,18 +4429,21 @@
 
   @override
   List<ParameterElement> get parameters {
-    if (_parameters == null) {
-      if (linkedNode != null) {
-        var context = enclosingUnit.linkedContext!;
-        return _parameters = ParameterElementImpl.forLinkedNodeList(
-          this,
-          context,
-          null,
-          context.getFormalParameters(linkedNode!),
-        );
-      }
+    if (!identical(_parameters, _Sentinel.parameterElement)) {
+      return _parameters;
     }
-    return _parameters ?? const <ParameterElement>[];
+
+    if (linkedNode != null) {
+      var context = enclosingUnit.linkedContext!;
+      return _parameters = ParameterElementImpl.forLinkedNodeList(
+        this,
+        context,
+        null,
+        context.getFormalParameters(linkedNode!),
+      );
+    }
+
+    return _parameters;
   }
 
   /// Set the parameters defined by this function type element to the given
@@ -4510,7 +4545,7 @@
 
   /// The names that are not to be made visible in the importing library even if
   /// they are defined in the imported library.
-  List<String>? _hiddenNames;
+  List<String> _hiddenNames = _Sentinel.string;
 
   HideElementCombinatorImpl()
       : linkedContext = null,
@@ -4520,13 +4555,15 @@
 
   @override
   List<String> get hiddenNames {
-    if (_hiddenNames != null) return _hiddenNames!;
+    if (!identical(_hiddenNames, _Sentinel.string)) {
+      return _hiddenNames;
+    }
 
     if (linkedNode != null) {
       return _hiddenNames = linkedNode!.hiddenNames.map((i) => i.name).toList();
     }
 
-    return _hiddenNames ?? const <String>[];
+    return _hiddenNames;
   }
 
   set hiddenNames(List<String> hiddenNames) {
@@ -4560,7 +4597,7 @@
 
   /// The combinators that were specified as part of the import directive in the
   /// order in which they were specified.
-  List<NamespaceCombinator>? _combinators;
+  List<NamespaceCombinator> _combinators = _Sentinel.namespaceCombinator;
 
   /// The prefix that was specified as part of the import directive, or `null
   ///` if there was no prefix specified.
@@ -4581,7 +4618,9 @@
 
   @override
   List<NamespaceCombinator> get combinators {
-    if (_combinators != null) return _combinators!;
+    if (!identical(_combinators, _Sentinel.namespaceCombinator)) {
+      return _combinators;
+    }
 
     if (linkedNode != null) {
       var node = linkedNode as ImportDirective;
@@ -4591,7 +4630,7 @@
       );
     }
 
-    return _combinators ?? const <NamespaceCombinator>[];
+    return _combinators;
   }
 
   set combinators(List<NamespaceCombinator> combinators) {
@@ -4808,11 +4847,11 @@
 
   /// A list containing specifications of all of the imports defined in this
   /// library.
-  List<ImportElement>? _imports;
+  List<ImportElement> _imports = _Sentinel.importElement;
 
   /// A list containing specifications of all of the exports defined in this
   /// library.
-  List<ExportElement>? _exports;
+  List<ExportElement> _exports = _Sentinel.exportElement;
 
   /// A list containing all of the compilation units that are included in this
   /// library using a `part` directive.
@@ -4948,7 +4987,9 @@
 
   @override
   List<ExportElement> get exports {
-    if (_exports != null) return _exports!;
+    if (!identical(_exports, _Sentinel.exportElement)) {
+      return _exports;
+    }
 
     if (linkedNode != null) {
       var unit = linkedContext!.unit_withDirectives;
@@ -4958,7 +4999,7 @@
           .toList();
     }
 
-    return _exports ??= const <ExportElement>[];
+    return _exports;
   }
 
   /// Set the specifications of all of the exports defined in this library to
@@ -5023,7 +5064,9 @@
 
   @override
   List<ImportElement> get imports {
-    if (_imports != null) return _imports!;
+    if (!identical(_imports, _Sentinel.importElement)) {
+      return _imports;
+    }
 
     if (linkedNode != null) {
       var unit = linkedContext!.unit_withDirectives;
@@ -5031,22 +5074,22 @@
           .whereType<ImportDirective>()
           .map((node) => node.element!)
           .toList();
-      var hasCore = _imports!.any((import) {
+      var hasCore = _imports.any((import) {
         return import.importedLibrary?.isDartCore ?? false;
       });
       if (!hasCore) {
         var elements = linkedContext!.elementFactory;
-        _imports!.add(
+        _imports.add(
           ImportElementImpl(-1)
             ..importedLibrary = elements.libraryOfUri2('dart:core')
             ..isSynthetic = true
             ..uri = 'dart:core',
         );
       }
-      return _imports!;
+      return _imports;
     }
 
-    return _imports ??= const <ImportElement>[];
+    return _imports;
   }
 
   /// Set the specifications of all of the imports defined in this library to
@@ -5151,7 +5194,9 @@
 
   @override
   List<ElementAnnotation> get metadata {
-    if (_metadata != null) return _metadata!;
+    if (!identical(_metadata, _Sentinel.elementAnnotation)) {
+      return _metadata;
+    }
 
     if (linkedNode != null) {
       var metadata = linkedContext!.getLibraryMetadata();
@@ -5448,7 +5493,7 @@
 
   /// A list containing all of the superclass constraints that are defined for
   /// the mixin.
-  List<InterfaceType>? _superclassConstraints;
+  List<InterfaceType> _superclassConstraints = _Sentinel.interfaceType;
 
   @override
   late List<String> superInvokedNames;
@@ -5474,7 +5519,9 @@
 
   @override
   List<InterfaceType> get superclassConstraints {
-    if (_superclassConstraints != null) return _superclassConstraints!;
+    if (!identical(_superclassConstraints, _Sentinel.interfaceType)) {
+      return _superclassConstraints;
+    }
 
     var linkedNode = this.linkedNode;
     if (linkedNode is MixinDeclaration) {
@@ -5494,7 +5541,7 @@
       return _superclassConstraints = constraints;
     }
 
-    return _superclassConstraints ?? const <InterfaceType>[];
+    return _superclassConstraints;
   }
 
   set superclassConstraints(List<InterfaceType> superclassConstraints) {
@@ -5942,12 +5989,12 @@
   /// A list containing all of the parameters defined by this parameter element.
   /// There will only be parameters if this parameter is a function typed
   /// parameter.
-  List<ParameterElement>? _parameters;
+  List<ParameterElement> _parameters = _Sentinel.parameterElement;
 
   /// A list containing all of the type parameters defined for this parameter
   /// element. There will only be parameters if this parameter is a function
   /// typed parameter.
-  List<TypeParameterElement>? _typeParameters;
+  List<TypeParameterElement> _typeParameters = _Sentinel.typeParameterElement;
 
   /// The kind of this parameter.
   ParameterKind? _parameterKind;
@@ -6107,7 +6154,9 @@
 
   @override
   List<ParameterElement> get parameters {
-    if (_parameters != null) return _parameters!;
+    if (!identical(_parameters, _Sentinel.parameterElement)) {
+      return _parameters;
+    }
 
     if (linkedNode != null) {
       var context = enclosingUnit.linkedContext!;
@@ -6120,11 +6169,11 @@
           formalParameters,
         );
       } else {
-        return _parameters ??= const <ParameterElement>[];
+        return _parameters;
       }
     }
 
-    return _parameters ??= const <ParameterElement>[];
+    return _parameters;
   }
 
   /// Set the parameters defined by this executable element to the given
@@ -6138,7 +6187,9 @@
 
   @override
   List<TypeParameterElement> get typeParameters {
-    if (_typeParameters != null) return _typeParameters!;
+    if (!identical(_typeParameters, _Sentinel.typeParameterElement)) {
+      return _typeParameters;
+    }
 
     if (linkedNode != null) {
       var typeParameters = linkedContext!.getTypeParameters2(linkedNode!);
@@ -6153,7 +6204,7 @@
       }).toList();
     }
 
-    return _typeParameters ??= const <TypeParameterElement>[];
+    return _typeParameters;
   }
 
   /// Set the type parameters defined by this parameter element to the given
@@ -6603,7 +6654,11 @@
 
   @override
   List<ParameterElement> get parametersInternal {
-    return _parameters ??= <ParameterElement>[
+    if (!identical(_parameters, _Sentinel.parameterElement)) {
+      return _parameters;
+    }
+
+    return _parameters = <ParameterElement>[
       ParameterElementImpl_ofImplicitSetter(this)
     ];
   }
@@ -6755,7 +6810,7 @@
 
   /// The names that are to be made visible in the importing library if they are
   /// defined in the imported library.
-  List<String>? _shownNames;
+  List<String> _shownNames = _Sentinel.string;
 
   /// The offset of the character immediately following the last character of
   /// this node.
@@ -6796,13 +6851,15 @@
 
   @override
   List<String> get shownNames {
-    if (_shownNames != null) return _shownNames!;
+    if (!identical(_shownNames, _Sentinel.string)) {
+      return _shownNames;
+    }
 
     if (linkedNode != null) {
       return _shownNames = linkedNode!.shownNames.map((i) => i.name).toList();
     }
 
-    return _shownNames ?? const <String>[];
+    return _shownNames;
   }
 
   set shownNames(List<String> shownNames) {
@@ -7293,14 +7350,17 @@
   /// A cached list containing the type parameters declared by this element
   /// directly, or `null` if the elements have not been created yet. This does
   /// not include type parameters that are declared by any enclosing elements.
-  List<TypeParameterElement>? _typeParameterElements;
+  List<TypeParameterElement> _typeParameterElements =
+      _Sentinel.typeParameterElement;
 
   @override
   bool get isSimplyBounded => true;
 
   @override
   List<TypeParameterElement> get typeParameters {
-    if (_typeParameterElements != null) return _typeParameterElements!;
+    if (!identical(_typeParameterElements, _Sentinel.typeParameterElement)) {
+      return _typeParameterElements;
+    }
 
     if (linkedNode != null) {
       linkedContext!.applyResolution(linkedNode!);
@@ -7316,7 +7376,7 @@
       }).toList();
     }
 
-    return _typeParameterElements ?? const <TypeParameterElement>[];
+    return _typeParameterElements;
   }
 }
 
@@ -7511,3 +7571,35 @@
   @override
   Source get source => enclosingElement!.source!;
 }
+
+/// Instances of [List]s that are used as "not yet computed" values, they
+/// must be not `null`, and not identical to `const <T>[]`.
+class _Sentinel {
+  static final List<ClassElement> classElement = List.unmodifiable([]);
+  static final List<ConstructorElement> constructorElement =
+      List.unmodifiable([]);
+  static final List<ConstructorInitializer> constructorInitializer =
+      List.unmodifiable([]);
+  static final List<ElementAnnotation> elementAnnotation =
+      List.unmodifiable([]);
+  static final List<ExportElement> exportElement = List.unmodifiable([]);
+  static final List<ExtensionElement> extensionElement = List.unmodifiable([]);
+  static final List<FieldElement> fieldElement = List.unmodifiable([]);
+  static final List<FunctionElement> functionElement = List.unmodifiable([]);
+  static final List<FunctionTypeAliasElement> functionTypeAliasElement =
+      List.unmodifiable([]);
+  static final List<ImportElement> importElement = List.unmodifiable([]);
+  static final List<InterfaceType> interfaceType = List.unmodifiable([]);
+  static final List<MethodElement> methodElement = List.unmodifiable([]);
+  static final List<NamespaceCombinator> namespaceCombinator =
+      List.unmodifiable([]);
+  static final List<ParameterElement> parameterElement = List.unmodifiable([]);
+  static final List<PropertyAccessorElement> propertyAccessorElement =
+      List.unmodifiable([]);
+  static final List<String> string = List.unmodifiable([]);
+  static final List<TopLevelVariableElement> topLevelVariables =
+      List.unmodifiable([]);
+  static final List<TypeAliasElement> typeAliasElement = List.unmodifiable([]);
+  static final List<TypeParameterElement> typeParameterElement =
+      List.unmodifiable([]);
+}
diff --git a/tools/VERSION b/tools/VERSION
index 4d69655..f4b0d11 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 14
+PRERELEASE 15
 PRERELEASE_PATCH 0
\ No newline at end of file
