Version 2.18.0-160.0.dev

Merge commit 'eab17a790cba9713703dd8010b255801fab3f67a' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2eab9df..2a5483d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -139,15 +139,19 @@
   It can still be created with the `--legacy-packages-file` flag.
 * `dart pub outdated` now shows which of your dependencies are discontinued.
 
-## 2.17.2 - 2022-06-01
+## 2.17.3 - 2022-06-01
 
 This is a patch release that fixes:
 
 - a Dart VM compiler crash (issue [#100375][]).
-- code completion when writing method overrides (issue [#49086][]).
+- code completion when writing method overrides (issue [#49027][]).
+- the `dart pub login` command (issue [#3424][]).
+- analysis of enhanced enums (issue [#49097][]).
 
 [#100375]: https://github.com/flutter/flutter/issues/100375
-[#49086]: https://github.com/dart-lang/sdk/issues/49086
+[#49027]: https://github.com/dart-lang/sdk/issues/49027
+[#3424]: https://github.com/dart-lang/pub/issues/3424
+[#49097]: https://github.com/dart-lang/sdk/issues/49097
 
 ## 2.17.1 - 2022-05-18
 
diff --git a/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart b/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
index 57e4d89..fe77f2d 100644
--- a/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
@@ -26,13 +26,14 @@
 import 'metadata_builder.dart';
 import 'modifier_builder.dart';
 import 'named_type_builder.dart';
+import 'omitted_type_builder.dart';
 import 'type_builder.dart';
 import 'variable_builder.dart';
 
 abstract class ParameterBuilder {
   /// List of metadata builders for the metadata declared on this parameter.
   List<MetadataBuilder>? get metadata;
-  TypeBuilder? get type;
+  TypeBuilder get type;
 
   /// The kind of this parameter, i.e. if it's required, positional optional,
   /// or named optional.
@@ -65,7 +66,7 @@
   final int modifiers;
 
   @override
-  final TypeBuilder? type;
+  final TypeBuilder type;
 
   @override
   final String name;
@@ -144,7 +145,11 @@
 
   VariableDeclaration build(SourceLibraryBuilder library) {
     if (variable == null) {
-      DartType? builtType = type?.build(library, TypeUse.parameterType);
+      DartType? builtType = type is OmittedTypeBuilder
+          // `null` is used in [VariableDeclarationImpl] to signal an omitted
+          // type.
+          ? null
+          : type.build(library, TypeUse.parameterType);
       variable = new VariableDeclarationImpl(
           name == noNameSentinel ? null : name,
           type: builtType,
@@ -168,7 +173,7 @@
     // TODO(cstefantsova):  It's not clear how [metadata] is used currently,
     // and how it should be cloned.  Consider cloning it instead of reusing it.
     return new FunctionTypeParameterBuilder(metadata, kind,
-        type?.clone(newTypes, contextLibrary, contextDeclaration), name);
+        type.clone(newTypes, contextLibrary, contextDeclaration), name);
   }
 
   FormalParameterBuilder forFormalParameterInitializerScope() {
@@ -271,7 +276,7 @@
   final FormalParameterKind kind;
 
   @override
-  final TypeBuilder? type;
+  final TypeBuilder type;
 
   @override
   final String? name;
@@ -286,7 +291,7 @@
     // TODO(cstefantsova):  It's not clear how [metadata] is used currently,
     // and how it should be cloned.  Consider cloning it instead of reusing it.
     return new FunctionTypeParameterBuilder(metadata, kind,
-        type?.clone(newTypes, contextLibrary, contextDeclaration), name);
+        type.clone(newTypes, contextLibrary, contextDeclaration), name);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
index 30493a8..3b20c82 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
@@ -22,11 +22,12 @@
 import 'library_builder.dart';
 import 'named_type_builder.dart';
 import 'nullability_builder.dart';
+import 'omitted_type_builder.dart';
 import 'type_builder.dart';
 import 'type_variable_builder.dart';
 
 class FunctionTypeBuilder extends TypeBuilder {
-  final TypeBuilder? returnType;
+  final TypeBuilder returnType;
   final List<TypeVariableBuilder>? typeVariables;
   final List<ParameterBuilder>? formals;
   @override
@@ -80,7 +81,7 @@
     buffer.write(") ->");
     nullabilityBuilder.writeNullabilityOn(buffer);
     buffer.write(" ");
-    buffer.write(returnType?.fullNameForErrors);
+    buffer.write(returnType.fullNameForErrors);
     return buffer;
   }
 
@@ -97,17 +98,17 @@
 
   @override
   DartType buildAliased(LibraryBuilder library, TypeUse typeUse) {
-    DartType builtReturnType =
-        returnType?.buildAliased(library, TypeUse.returnType) ??
-            const DynamicType();
+    DartType builtReturnType = returnType is OmittedTypeBuilder
+        ? const DynamicType()
+        : returnType.buildAliased(library, TypeUse.returnType);
     List<DartType> positionalParameters = <DartType>[];
     List<NamedType>? namedParameters;
     int requiredParameterCount = 0;
     if (formals != null) {
       for (ParameterBuilder formal in formals!) {
-        DartType type =
-            formal.type?.buildAliased(library, TypeUse.parameterType) ??
-                const DynamicType();
+        DartType type = formal.type is OmittedTypeBuilder
+            ? const DynamicType()
+            : formal.type.buildAliased(library, TypeUse.parameterType);
         if (formal.isPositional) {
           positionalParameters.add(type);
           if (formal.isRequiredPositional) requiredParameterCount++;
@@ -169,7 +170,7 @@
       }, growable: false);
     }
     return new FunctionTypeBuilder(
-        returnType?.clone(newTypes, contextLibrary, contextDeclaration),
+        returnType.clone(newTypes, contextLibrary, contextDeclaration),
         clonedTypeVariables,
         clonedFormals,
         nullabilityBuilder,
diff --git a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
index 036806f..2437686 100644
--- a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
@@ -447,7 +447,7 @@
         // length is 0) references a ClassBuilder of the Null class.  Otherwise,
         // it won't produce the NullType on the output.
         while (unaliasedDeclaration is TypeAliasBuilder) {
-          unaliasedDeclaration = unaliasedDeclaration.type?.declaration;
+          unaliasedDeclaration = unaliasedDeclaration.type.declaration;
           assert(unaliasedDeclaration != null);
         }
         assert(unaliasedDeclaration is ClassBuilder &&
@@ -468,7 +468,7 @@
         // length is 0) references a ClassBuilder of the FutureOr class.
         // Otherwise, it won't produce the FutureOrType on the output.
         while (unaliasedDeclaration is TypeAliasBuilder) {
-          unaliasedDeclaration = unaliasedDeclaration.type?.declaration;
+          unaliasedDeclaration = unaliasedDeclaration.type.declaration;
           assert(unaliasedDeclaration != null);
         }
         assert(unaliasedDeclaration is ClassBuilder &&
diff --git a/pkg/front_end/lib/src/fasta/builder/omitted_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/omitted_type_builder.dart
new file mode 100644
index 0000000..3cfc546
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/builder/omitted_type_builder.dart
@@ -0,0 +1,70 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:kernel/ast.dart';
+
+import '../source/source_library_builder.dart';
+import 'library_builder.dart';
+import 'named_type_builder.dart';
+import 'nullability_builder.dart';
+import 'type_builder.dart';
+
+class OmittedTypeBuilder extends TypeBuilder {
+  const OmittedTypeBuilder();
+
+  @override
+  DartType build(LibraryBuilder library, TypeUse typeUse) {
+    throw new UnsupportedError('$runtimeType.build');
+  }
+
+  @override
+  DartType buildAliased(LibraryBuilder library, TypeUse typeUse) {
+    throw new UnsupportedError('$runtimeType.buildAliased');
+  }
+
+  @override
+  Supertype? buildMixedInType(LibraryBuilder library) {
+    throw new UnsupportedError('$runtimeType.buildMixedInType');
+  }
+
+  @override
+  Supertype? buildSupertype(LibraryBuilder library) {
+    throw new UnsupportedError('$runtimeType.buildSupertype');
+  }
+
+  @override
+  int? get charOffset => null;
+
+  @override
+  TypeBuilder clone(
+      List<NamedTypeBuilder> newTypes,
+      SourceLibraryBuilder contextLibrary,
+      TypeParameterScopeBuilder contextDeclaration) {
+    return this;
+  }
+
+  @override
+  String get debugName => 'OmittedTypeBuilder';
+
+  @override
+  Uri? get fileUri => null;
+
+  @override
+  bool get isVoidType => false;
+
+  @override
+  Object? get name => null;
+
+  @override
+  NullabilityBuilder get nullabilityBuilder =>
+      const NullabilityBuilder.omitted();
+
+  @override
+  StringBuffer printOn(StringBuffer buffer) => buffer;
+
+  @override
+  TypeBuilder withNullabilityBuilder(NullabilityBuilder nullabilityBuilder) {
+    return this;
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
index 3b977bc..464674f 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
@@ -27,7 +27,7 @@
 import 'type_variable_builder.dart';
 
 abstract class TypeAliasBuilder implements TypeDeclarationBuilder {
-  TypeBuilder? get type;
+  TypeBuilder get type;
 
   /// The [Typedef] built by this builder.
   Typedef get typedef;
@@ -231,7 +231,7 @@
     TypeDeclarationBuilder current = this;
     while (current is TypeAliasBuilder) {
       TypeAliasBuilder currentAliasBuilder = current;
-      TypeDeclarationBuilder? next = currentAliasBuilder.type?.declaration;
+      TypeDeclarationBuilder? next = currentAliasBuilder.type.declaration;
       if (next != null) {
         current = next;
       } else {
@@ -325,7 +325,7 @@
     List<TypeBuilder>? currentTypeArguments = typeArguments;
     while (currentDeclarationBuilder is TypeAliasBuilder) {
       TypeAliasBuilder currentAliasBuilder = currentDeclarationBuilder;
-      TypeBuilder? nextTypeBuilder = currentAliasBuilder.type;
+      TypeBuilder nextTypeBuilder = currentAliasBuilder.type;
       if (nextTypeBuilder is NamedTypeBuilder) {
         Map<TypeVariableBuilder, TypeBuilder> substitution = {};
         int index = 0;
@@ -420,7 +420,7 @@
     List<TypeBuilder>? currentTypeArguments = typeArguments;
     while (currentDeclarationBuilder is TypeAliasBuilder) {
       TypeAliasBuilder currentAliasBuilder = currentDeclarationBuilder;
-      TypeBuilder? nextTypeBuilder = currentAliasBuilder.type;
+      TypeBuilder nextTypeBuilder = currentAliasBuilder.type;
       assert(nextTypeBuilder is NamedTypeBuilder,
           "Expected NamedTypeBuilder, got '${nextTypeBuilder.runtimeType}'.");
       NamedTypeBuilder namedNextTypeBuilder =
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart
index 92df2a0..47a9b85 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart
@@ -59,12 +59,8 @@
   int get typeVariablesCount => typedef.typeParameters.length;
 
   @override
-  TypeBuilder? get type {
-    if (_type == null && typedef.type is! InvalidType) {
-      _type = libraryBuilder.loader.computeTypeBuilder(typedef.type!);
-    }
-    // TODO(johnniwinther): Support TypeBuilder for InvalidType.
-    return _type;
+  TypeBuilder get type {
+    return _type ??= libraryBuilder.loader.computeTypeBuilder(typedef.type!);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 2946592..586fae6 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -58,6 +58,7 @@
 import '../builder/modifier_builder.dart';
 import '../builder/named_type_builder.dart';
 import '../builder/nullability_builder.dart';
+import '../builder/omitted_type_builder.dart';
 import '../builder/prefix_builder.dart';
 import '../builder/type_alias_builder.dart';
 import '../builder/type_builder.dart';
@@ -1182,8 +1183,9 @@
 
   DartType _computeReturnTypeContext(MemberBuilder member) {
     if (member is SourceProcedureBuilder) {
-      final bool isReturnTypeUndeclared = member.returnType == null &&
-          member.function.returnType is DynamicType;
+      final bool isReturnTypeUndeclared =
+          member.returnType is OmittedTypeBuilder &&
+              member.function.returnType is DynamicType;
       return isReturnTypeUndeclared && libraryBuilder.isNonNullableByDefault
           ? const UnknownType()
           : member.function.returnType;
@@ -1281,7 +1283,7 @@
           transformCollections, libraryBuilder.library);
     }
 
-    if (builder.returnType != null) {
+    if (builder.returnType is! OmittedTypeBuilder) {
       checkAsyncReturnType(asyncModifier, builder.function.returnType,
           builder.charOffset, builder.name.length);
     }
@@ -1718,7 +1720,7 @@
                     /* metadata = */ null,
                     FormalParameterKind.requiredPositional,
                     /* modifiers = */ 0,
-                    /* type = */ null,
+                    const OmittedTypeBuilder(),
                     formal.name!,
                     libraryBuilder,
                     formal.fileOffset,
@@ -4175,7 +4177,7 @@
       }
     }
     TypeBuilder type = formals.toFunctionType(
-        returnType,
+        returnType ?? const OmittedTypeBuilder(),
         libraryBuilder.nullableBuilderIfTrue(questionMark != null),
         typeVariables);
     exitLocalScope();
@@ -4378,8 +4380,14 @@
         return;
       }
     } else {
-      parameter = new FormalParameterBuilder(null, kind, modifiers, type,
-          name?.name ?? '', libraryBuilder, offsetForToken(nameToken),
+      parameter = new FormalParameterBuilder(
+          null,
+          kind,
+          modifiers,
+          type ?? const OmittedTypeBuilder(),
+          name?.name ?? '',
+          libraryBuilder,
+          offsetForToken(nameToken),
           fileUri: uri)
         ..hasDeclaredInitializer = (initializerStart != null);
     }
@@ -4452,8 +4460,10 @@
     if (!libraryBuilder.isNonNullableByDefault) {
       reportErrorIfNullableType(question);
     }
-    TypeBuilder type = formals.toFunctionType(returnType,
-        libraryBuilder.nullableBuilderIfTrue(question != null), typeVariables);
+    TypeBuilder type = formals.toFunctionType(
+        returnType ?? const OmittedTypeBuilder(),
+        libraryBuilder.nullableBuilderIfTrue(question != null),
+        typeVariables);
     exitLocalScope();
     push(type);
     functionNestingLevel--;
@@ -7075,7 +7085,7 @@
             ..fileOffset = assignmentOffset
         ];
       } else {
-        if (formal != null && formal.type != null) {
+        if (formal != null && formal.type is! OmittedTypeBuilder) {
           DartType formalType = formal.variable!.type;
           if (!typeEnvironment.isSubtypeOf(formalType, builder.fieldType,
               SubtypeCheckMode.withNullabilities)) {
@@ -7699,7 +7709,7 @@
   }
 
   TypeBuilder toFunctionType(
-      TypeBuilder? returnType, NullabilityBuilder nullabilityBuilder,
+      TypeBuilder returnType, NullabilityBuilder nullabilityBuilder,
       [List<TypeVariableBuilder>? typeParameters]) {
     return new FunctionTypeBuilder(returnType, typeParameters, parameters,
         nullabilityBuilder, uri, charOffset);
diff --git a/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart b/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart
index 49448b4..3b0f111 100644
--- a/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart
@@ -18,6 +18,7 @@
 import '../../builder/library_builder.dart';
 import '../../builder/member_builder.dart';
 import '../../builder/named_type_builder.dart';
+import '../../builder/omitted_type_builder.dart';
 import '../../builder/type_alias_builder.dart';
 import '../../builder/type_builder.dart';
 import '../../builder/type_declaration_builder.dart';
@@ -90,10 +91,10 @@
       Iterable<ClassMember> overriddenMembers) {
     assert(!declaredMember.isGetter && !declaredMember.isSetter);
     if (declaredMember.classBuilder == classBuilder &&
-        (declaredMember.returnType == null ||
+        (declaredMember.returnType is OmittedTypeBuilder ||
             declaredMember.formals != null &&
-                declaredMember.formals!
-                    .any((parameter) => parameter.type == null))) {
+                declaredMember.formals!.any(
+                    (parameter) => parameter.type is OmittedTypeBuilder))) {
       Procedure declaredProcedure = declaredMember.member as Procedure;
       FunctionNode declaredFunction = declaredProcedure.function;
       List<TypeParameter> declaredTypeParameters =
@@ -120,7 +121,7 @@
       bool cantInferReturnType = false;
       List<FormalParameterBuilder>? cantInferParameterTypes;
 
-      if (declaredMember.returnType == null) {
+      if (declaredMember.returnType is OmittedTypeBuilder) {
         if (combinedMemberSignatureType == null) {
           inferredReturnType = const InvalidType();
           cantInferReturnType = true;
@@ -131,7 +132,7 @@
       if (declaredMember.formals != null) {
         for (int i = 0; i < declaredPositional.length; i++) {
           FormalParameterBuilder declaredParameter = declaredMember.formals![i];
-          if (declaredParameter.type != null) {
+          if (declaredParameter.type is! OmittedTypeBuilder) {
             continue;
           }
 
@@ -153,7 +154,7 @@
             i < declaredMember.formals!.length;
             i++) {
           FormalParameterBuilder declaredParameter = declaredMember.formals![i];
-          if (declaredParameter.type != null) {
+          if (declaredParameter.type is! OmittedTypeBuilder) {
             continue;
           }
 
@@ -188,14 +189,14 @@
             classBuilder, cantInferParameterTypes.single, overriddenMembers);
       }
 
-      if (declaredMember.returnType == null) {
+      if (declaredMember.returnType is OmittedTypeBuilder) {
         inferredReturnType ??= const DynamicType();
         declaredFunction.returnType = inferredReturnType;
       }
       if (declaredMember.formals != null) {
         for (FormalParameterBuilder declaredParameter
             in declaredMember.formals!) {
-          if (declaredParameter.type == null) {
+          if (declaredParameter.type is OmittedTypeBuilder) {
             DartType inferredParameterType =
                 inferredParameterTypes[declaredParameter] ??
                     const DynamicType();
@@ -248,7 +249,7 @@
       Iterable<ClassMember> overriddenMembers) {
     assert(declaredMember.isGetter);
     if (declaredMember.classBuilder == classBuilder &&
-        declaredMember.returnType == null) {
+        declaredMember.returnType is OmittedTypeBuilder) {
       DartType? inferredType;
       overriddenMembers = toSet(classBuilder, overriddenMembers);
 
@@ -311,7 +312,8 @@
       Iterable<ClassMember> overriddenMembers) {
     assert(declaredMember.isSetter);
     FormalParameterBuilder parameter = declaredMember.formals!.first;
-    if (declaredMember.classBuilder == classBuilder && parameter.type == null) {
+    if (declaredMember.classBuilder == classBuilder &&
+        parameter.type is OmittedTypeBuilder) {
       DartType? inferredType;
 
       overriddenMembers = toSet(classBuilder, overriddenMembers);
@@ -412,7 +414,7 @@
       SourceFieldBuilder fieldBuilder,
       Iterable<ClassMember> overriddenMembers) {
     if (fieldBuilder.classBuilder == classBuilder &&
-        fieldBuilder.type == null) {
+        fieldBuilder.type is OmittedTypeBuilder) {
       DartType? inferredType;
 
       overriddenMembers = toSet(classBuilder, overriddenMembers);
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
index 66268af..13f1592 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
@@ -15,6 +15,7 @@
 import '../builder/library_builder.dart';
 import '../builder/named_type_builder.dart';
 import '../builder/nullability_builder.dart';
+import '../builder/omitted_type_builder.dart';
 import '../builder/type_alias_builder.dart';
 import '../builder/type_builder.dart';
 import '../builder/type_declaration_builder.dart';
@@ -116,11 +117,11 @@
     }
   } else if (type is FunctionTypeBuilder) {
     int result = Variance.unrelated;
-    if (type.returnType != null) {
+    if (type.returnType is! OmittedTypeBuilder) {
       result = Variance.meet(
           result,
           computeTypeVariableBuilderVariance(
-              variable, type.returnType!, libraryBuilder));
+              variable, type.returnType, libraryBuilder));
     }
     if (type.typeVariables != null) {
       for (TypeVariableBuilder typeVariable in type.typeVariables!) {
@@ -176,8 +177,8 @@
   return const NullabilityBuilder.omitted();
 }
 
-TypeBuilder? substituteRange(
-    TypeBuilder? type,
+TypeBuilder substituteRange(
+    TypeBuilder type,
     Map<TypeVariableBuilder, TypeBuilder> upperSubstitution,
     Map<TypeVariableBuilder, TypeBuilder> lowerSubstitution,
     List<TypeBuilder> unboundTypes,
@@ -227,7 +228,7 @@
             lowerSubstitution,
             unboundTypes,
             unboundTypeVariables,
-            variance: variance)!;
+            variance: variance);
         if (substitutedArgument != type.arguments![i]) {
           arguments ??= type.arguments!.toList();
           arguments[i] = substitutedArgument;
@@ -241,7 +242,7 @@
             lowerSubstitution,
             unboundTypes,
             unboundTypeVariables,
-            variance: variance)!;
+            variance: variance);
         if (substitutedArgument != type.arguments![i]) {
           arguments ??= type.arguments!.toList();
           arguments[i] = substitutedArgument;
@@ -256,7 +257,7 @@
             lowerSubstitution,
             unboundTypes,
             unboundTypeVariables,
-            variance: Variance.combine(variance, variable.variance))!;
+            variance: Variance.combine(variance, variable.variance));
         if (substitutedArgument != type.arguments![i]) {
           arguments ??= type.arguments!.toList();
           arguments[i] = substitutedArgument;
@@ -294,9 +295,12 @@
     if (type.typeVariables != null) {
       for (int i = 0; i < variables!.length; i++) {
         TypeVariableBuilder variable = type.typeVariables![i];
-        TypeBuilder? bound = substituteRange(variable.bound, upperSubstitution,
-            lowerSubstitution, unboundTypes, unboundTypeVariables,
-            variance: Variance.invariant);
+        TypeBuilder? bound;
+        if (variable.bound != null) {
+          bound = substituteRange(variable.bound!, upperSubstitution,
+              lowerSubstitution, unboundTypes, unboundTypeVariables,
+              variance: Variance.invariant);
+        }
         if (bound != variable.bound) {
           TypeVariableBuilder newTypeVariableBuilder = variables[i] =
               new TypeVariableBuilder(variable.name, variable.parent,
@@ -323,7 +327,7 @@
     if (type.formals != null) {
       for (int i = 0; i < formals!.length; i++) {
         ParameterBuilder formal = type.formals![i];
-        TypeBuilder? parameterType = substituteRange(
+        TypeBuilder parameterType = substituteRange(
             formal.type,
             functionTypeUpperSubstitution ?? upperSubstitution,
             functionTypeLowerSubstitution ?? lowerSubstitution,
@@ -357,8 +361,8 @@
   return type;
 }
 
-TypeBuilder? substitute(
-    TypeBuilder? type, Map<TypeVariableBuilder, TypeBuilder> substitution,
+TypeBuilder substitute(
+    TypeBuilder type, Map<TypeVariableBuilder, TypeBuilder> substitution,
     {required List<TypeBuilder> unboundTypes,
     required List<TypeVariableBuilder> unboundTypeVariables}) {
   return substituteRange(
@@ -404,7 +408,7 @@
           nullSubstitution,
           unboundTypes,
           unboundTypeVariables,
-          variance: variable.variance)!;
+          variance: variable.variance);
     }
   }
 
@@ -419,7 +423,7 @@
       TypeVariableBuilder variable = variables[j];
       bounds[j] = substituteRange(bounds[j], substitution, nullSubstitution,
           unboundTypes, unboundTypeVariables,
-          variance: variable.variance)!;
+          variance: variable.variance);
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/utils.dart b/pkg/front_end/lib/src/fasta/kernel/utils.dart
index 3443cf7..c1a644f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/utils.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/utils.dart
@@ -19,6 +19,7 @@
 import '../builder/fixed_type_builder.dart';
 import '../builder/formal_parameter_builder.dart';
 import '../builder/metadata_builder.dart';
+import '../builder/omitted_type_builder.dart';
 import '../builder/type_builder.dart';
 import '../builder/type_variable_builder.dart';
 import '../combinator.dart';
@@ -232,8 +233,8 @@
 final TypeBuilder dummyTypeBuilder =
     new FixedTypeBuilder(dummyDartType, dummyUri, -1);
 final FormalParameterBuilder dummyFormalParameterBuilder =
-    new FormalParameterBuilder(
-        null, FormalParameterKind.requiredPositional, 0, null, '', null, -1,
+    new FormalParameterBuilder(null, FormalParameterKind.requiredPositional, 0,
+        const OmittedTypeBuilder(), '', null, -1,
         fileUri: dummyUri);
 final TypeVariableBuilder dummyTypeVariableBuilder = new TypeVariableBuilder(
     TypeVariableBuilder.noNameSentinel, null, -1, null,
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 050fb51..81871e0 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -32,6 +32,7 @@
 import '../builder/mixin_application_builder.dart';
 import '../builder/named_type_builder.dart';
 import '../builder/nullability_builder.dart';
+import '../builder/omitted_type_builder.dart';
 import '../builder/type_builder.dart';
 import '../builder/type_variable_builder.dart';
 import '../combinator.dart' show CombinatorBuilder;
@@ -1884,7 +1885,7 @@
           List<TypeVariableBuilder> unboundTypeVariables = [];
           thisType = substitute(thisType, substitution,
               unboundTypes: unboundTypes,
-              unboundTypeVariables: unboundTypeVariables)!;
+              unboundTypeVariables: unboundTypeVariables);
           for (NamedTypeBuilder unboundType in unboundTypes) {
             extension.registerUnresolvedNamedType(unboundType);
           }
@@ -2260,7 +2261,7 @@
           metadata,
           kind,
           modifiers,
-          type,
+          type ?? const OmittedTypeBuilder(),
           name == null ? FormalParameterBuilder.noNameSentinel : name as String,
           thisKeyword != null,
           superKeyword != null,
@@ -2583,7 +2584,7 @@
     List<TypeVariableBuilder>? typeVariables =
         pop() as List<TypeVariableBuilder>?;
     push(libraryBuilder.addFunctionType(
-        returnType,
+        returnType ?? const OmittedTypeBuilder(),
         typeVariables,
         formals,
         libraryBuilder.nullableBuilderIfTrue(questionMark != null),
@@ -2604,7 +2605,7 @@
       reportErrorIfNullableType(question);
     }
     push(libraryBuilder.addFunctionType(
-        returnType,
+        returnType ?? const OmittedTypeBuilder(),
         typeVariables,
         formals,
         libraryBuilder.nullableBuilderIfTrue(question != null),
@@ -2642,8 +2643,13 @@
           TypeParameterScopeKind.functionType, "#function_type",
           hasMembers: false);
       // TODO(cstefantsova): Make sure that RHS of typedefs can't have '?'.
-      aliasedType = libraryBuilder.addFunctionType(returnType, null, formals,
-          const NullabilityBuilder.omitted(), uri, charOffset);
+      aliasedType = libraryBuilder.addFunctionType(
+          returnType ?? const OmittedTypeBuilder(),
+          null,
+          formals,
+          const NullabilityBuilder.omitted(),
+          uri,
+          charOffset);
     } else {
       Object? type = pop();
       typeVariables = pop() as List<TypeVariableBuilder>?;
diff --git a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
index c0dadf6..4b94f07 100644
--- a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
@@ -15,6 +15,7 @@
 import '../builder/member_builder.dart';
 import '../builder/metadata_builder.dart';
 import '../builder/named_type_builder.dart';
+import '../builder/omitted_type_builder.dart';
 import '../builder/type_alias_builder.dart';
 import '../builder/type_builder.dart';
 import '../builder/type_declaration_builder.dart';
@@ -106,7 +107,7 @@
   DeclaredSourceConstructorBuilder(
       List<MetadataBuilder>? metadata,
       int modifiers,
-      TypeBuilder? returnType,
+      TypeBuilder returnType,
       String name,
       List<TypeVariableBuilder>? typeVariables,
       this.formals,
@@ -219,7 +220,7 @@
     if (formals != null) {
       bool needsInference = false;
       for (FormalParameterBuilder formal in formals!) {
-        if (formal.type == null &&
+        if (formal.type is OmittedTypeBuilder &&
             (formal.isInitializingFormal || formal.isSuperInitializingFormal)) {
           formal.variable!.type = const UnknownType();
           needsInference = true;
@@ -241,7 +242,7 @@
     if (_hasFormalsInferred) return;
     if (formals != null) {
       for (FormalParameterBuilder formal in formals!) {
-        if (formal.type == null) {
+        if (formal.type is OmittedTypeBuilder) {
           if (formal.isInitializingFormal) {
             formal.finalizeInitializingFormal(classBuilder);
           }
@@ -421,7 +422,7 @@
           }
         }
 
-        if (formal.type == null) {
+        if (formal.type is OmittedTypeBuilder) {
           DartType? type = correspondingSuperFormalType;
           if (substitution.isNotEmpty && type != null) {
             type = substitute(type, substitution);
diff --git a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
index a8749da..4da1575 100644
--- a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
@@ -21,6 +21,7 @@
 import '../builder/metadata_builder.dart';
 import '../builder/named_type_builder.dart';
 import '../builder/nullability_builder.dart';
+import '../builder/omitted_type_builder.dart';
 import '../builder/procedure_builder.dart';
 import '../builder/type_builder.dart';
 import '../builder/type_declaration_builder.dart';
@@ -309,7 +310,7 @@
           new DeclaredSourceConstructorBuilder(
               /* metadata = */ null,
               constMask,
-              /* returnType = */ null,
+              /* returnType = */ const OmittedTypeBuilder(),
               "",
               /* typeParameters = */ null,
               <FormalParameterBuilder>[
@@ -466,7 +467,7 @@
         }
         SourceFieldBuilder fieldBuilder = new SourceFieldBuilder(
             metadata,
-            null,
+            const OmittedTypeBuilder(),
             name,
             constMask | staticMask | hasInitializerMask,
             /* isTopLevel = */ false,
diff --git a/pkg/front_end/lib/src/fasta/source/source_field_builder.dart b/pkg/front_end/lib/src/fasta/source/source_field_builder.dart
index cdf803a..f9ca277 100644
--- a/pkg/front_end/lib/src/fasta/source/source_field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_field_builder.dart
@@ -16,6 +16,7 @@
 import '../builder/field_builder.dart';
 import '../builder/member_builder.dart';
 import '../builder/metadata_builder.dart';
+import '../builder/omitted_type_builder.dart';
 import '../builder/type_builder.dart';
 import '../constant_context.dart' show ConstantContext;
 import '../fasta_codes.dart' show messageInternalProblemAlreadyInitialized;
@@ -51,7 +52,7 @@
 
   final List<MetadataBuilder>? metadata;
 
-  final TypeBuilder? type;
+  final TypeBuilder type;
 
   Token? _constInitializerToken;
 
@@ -326,7 +327,8 @@
   }
 
   bool get isEligibleForInference {
-    return type == null && (hasInitializer || isClassInstanceMember);
+    return type is OmittedTypeBuilder &&
+        (hasInitializer || isClassInstanceMember);
   }
 
   @override
@@ -366,8 +368,8 @@
 
   /// Builds the core AST structures for this field as needed for the outline.
   void build() {
-    if (type != null) {
-      fieldType = type!.build(libraryBuilder, TypeUse.fieldType);
+    if (type is! OmittedTypeBuilder) {
+      fieldType = type.build(libraryBuilder, TypeUse.fieldType);
     }
     _fieldEncoding.build(libraryBuilder, this);
   }
diff --git a/pkg/front_end/lib/src/fasta/source/source_function_builder.dart b/pkg/front_end/lib/src/fasta/source/source_function_builder.dart
index fa2a828..3b199e8 100644
--- a/pkg/front_end/lib/src/fasta/source/source_function_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_function_builder.dart
@@ -4,6 +4,7 @@
 
 library fasta.procedure_builder;
 
+import 'package:front_end/src/fasta/builder/omitted_type_builder.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart';
 
@@ -40,7 +41,7 @@
     implements FunctionBuilder, SourceMemberBuilder {
   List<MetadataBuilder>? get metadata;
 
-  TypeBuilder? get returnType;
+  TypeBuilder get returnType;
 
   List<TypeVariableBuilder>? get typeVariables;
 
@@ -134,7 +135,7 @@
   final int modifiers;
 
   @override
-  final TypeBuilder? returnType;
+  final TypeBuilder returnType;
 
   @override
   final String name;
@@ -385,9 +386,9 @@
       function.namedParameters.clear();
       function.requiredParameterCount = 1;
     }
-    if (returnType != null) {
+    if (returnType is! OmittedTypeBuilder) {
       function.returnType =
-          returnType!.build(libraryBuilder, TypeUse.returnType);
+          returnType.build(libraryBuilder, TypeUse.returnType);
     }
     if (isExtensionInstanceMember) {
       ExtensionBuilder extensionBuilder = parent as ExtensionBuilder;
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index ffad317..760a0cc 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -48,6 +48,7 @@
 import '../builder/named_type_builder.dart';
 import '../builder/never_type_declaration_builder.dart';
 import '../builder/nullability_builder.dart';
+import '../builder/omitted_type_builder.dart';
 import '../builder/prefix_builder.dart';
 import '../builder/procedure_builder.dart';
 import '../builder/type_alias_builder.dart';
@@ -786,8 +787,16 @@
         new Token.eof(startToken.previous!.offset).setNext(startToken);
       }
       bool hasInitializer = info.initializerToken != null;
-      addField(metadata, modifiers, isTopLevel, type, info.name,
-          info.charOffset, info.charEndOffset, startToken, hasInitializer,
+      addField(
+          metadata,
+          modifiers,
+          isTopLevel,
+          type ?? const OmittedTypeBuilder(),
+          info.name,
+          info.charOffset,
+          info.charEndOffset,
+          startToken,
+          hasInitializer,
           constInitializerToken:
               potentiallyNeedInitializerInOutline ? startToken : null);
     }
@@ -2382,7 +2391,7 @@
       List<MetadataBuilder>? metadata,
       int modifiers,
       bool isTopLevel,
-      TypeBuilder? type,
+      TypeBuilder type,
       String name,
       int charOffset,
       int charEndOffset,
@@ -2496,7 +2505,7 @@
     addBuilder(name, fieldBuilder, charOffset,
         getterReference: fieldGetterReference,
         setterReference: fieldSetterReference);
-    if (type == null && fieldBuilder.next == null) {
+    if (type is OmittedTypeBuilder && fieldBuilder.next == null) {
       // Only the first one (the last one in the linked list of next pointers)
       // are added to the tree, had parent pointers and can infer correctly.
       if (initializerToken == null && fieldBuilder.isStatic) {
@@ -2542,7 +2551,7 @@
         new DeclaredSourceConstructorBuilder(
             metadata,
             modifiers & ~abstractMask,
-            returnType,
+            returnType ?? const OmittedTypeBuilder(),
             constructorName,
             typeVariables,
             formals,
@@ -2649,7 +2658,7 @@
     SourceProcedureBuilder procedureBuilder = new SourceProcedureBuilder(
         metadata,
         modifiers,
-        returnType,
+        returnType ?? const OmittedTypeBuilder(),
         name,
         typeVariables,
         formals,
@@ -2898,7 +2907,7 @@
       List<MetadataBuilder>? metadata,
       String name,
       List<TypeVariableBuilder>? typeVariables,
-      TypeBuilder? type,
+      TypeBuilder type,
       int charOffset) {
     if (typeVariables != null) {
       for (TypeVariableBuilder typeVariable in typeVariables) {
@@ -2918,7 +2927,7 @@
   }
 
   FunctionTypeBuilder addFunctionType(
-      TypeBuilder? returnType,
+      TypeBuilder returnType,
       List<TypeVariableBuilder>? typeVariables,
       List<FormalParameterBuilder>? formals,
       NullabilityBuilder nullabilityBuilder,
@@ -2948,7 +2957,7 @@
       List<MetadataBuilder>? metadata,
       FormalParameterKind kind,
       int modifiers,
-      TypeBuilder? type,
+      TypeBuilder type,
       String name,
       bool hasThis,
       bool hasSuper,
@@ -3721,7 +3730,7 @@
                     formal.type);
               }
             }
-            if (member.returnType != null) {
+            if (member.returnType is! OmittedTypeBuilder) {
               issues.addAll(getInboundReferenceIssuesInType(member.returnType));
               _recursivelyReportGenericFunctionTypesAsBoundsForType(
                   member.returnType);
@@ -3733,7 +3742,7 @@
             assert(member is SourceFieldBuilder,
                 "Unexpected class member $member (${member.runtimeType}).");
             TypeBuilder? fieldType = (member as SourceFieldBuilder).type;
-            if (fieldType != null) {
+            if (fieldType is! OmittedTypeBuilder) {
               List<NonSimplicityIssue> issues =
                   getInboundReferenceIssuesInType(fieldType);
               reportIssues(issues);
@@ -3759,7 +3768,7 @@
             _recursivelyReportGenericFunctionTypesAsBoundsForType(formal.type);
           }
         }
-        if (declaration.returnType != null) {
+        if (declaration.returnType is! OmittedTypeBuilder) {
           issues
               .addAll(getInboundReferenceIssuesInType(declaration.returnType));
           _recursivelyReportGenericFunctionTypesAsBoundsForType(
@@ -3788,7 +3797,7 @@
                     formal.type);
               }
             }
-            if (member.returnType != null) {
+            if (member.returnType is! OmittedTypeBuilder) {
               issues.addAll(getInboundReferenceIssuesInType(member.returnType));
               _recursivelyReportGenericFunctionTypesAsBoundsForType(
                   member.returnType);
@@ -3797,7 +3806,7 @@
             count += computeDefaultTypesForVariables(member.typeVariables,
                 inErrorRecovery: issues.isNotEmpty);
           } else if (member is SourceFieldBuilder) {
-            if (member.type != null) {
+            if (member.type is! OmittedTypeBuilder) {
               _recursivelyReportGenericFunctionTypesAsBoundsForType(
                   member.type);
             }
@@ -3807,7 +3816,7 @@
           }
         });
       } else if (declaration is SourceFieldBuilder) {
-        if (declaration.type != null) {
+        if (declaration.type is! OmittedTypeBuilder) {
           List<NonSimplicityIssue> issues =
               getInboundReferenceIssuesInType(declaration.type);
           reportIssues(issues);
@@ -5321,7 +5330,7 @@
           declaration.typeVariables!.isNotEmpty) {
         typeVariables = declaration.typeVariables;
       }
-      internalDependents = <TypeBuilder>[declaration.type!];
+      internalDependents = <TypeBuilder>[declaration.type];
     } else if (declaration is TypeVariableBuilder) {
       typeVariables = <TypeVariableBuilder>[declaration];
     }
@@ -5332,11 +5341,11 @@
     if (root.formals != null && root.formals!.isNotEmpty) {
       internalDependents = <TypeBuilder>[];
       for (ParameterBuilder formal in root.formals!) {
-        internalDependents.add(formal.type!);
+        internalDependents.add(formal.type);
       }
     }
-    if (root.returnType != null) {
-      (internalDependents ??= <TypeBuilder>[]).add(root.returnType!);
+    if (root.returnType is! OmittedTypeBuilder) {
+      (internalDependents ??= <TypeBuilder>[]).add(root.returnType);
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index cf387f5..3748d5e3 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -52,6 +52,7 @@
 import '../builder/member_builder.dart';
 import '../builder/modifier_builder.dart';
 import '../builder/named_type_builder.dart';
+import '../builder/omitted_type_builder.dart';
 import '../builder/prefix_builder.dart';
 import '../builder/procedure_builder.dart';
 import '../builder/type_alias_builder.dart';
@@ -1205,20 +1206,20 @@
       }
     }
     ProcedureBuilder builder = new SourceProcedureBuilder(
-        null,
-        0,
-        null,
+        /* metadata = */ null,
+        /* modifier flags = */ 0,
+        const OmittedTypeBuilder(),
         "debugExpr",
-        null,
-        null,
+        /* type variables = */ null,
+        /* formals = */ null,
         ProcedureKind.Method,
         libraryBuilder,
-        0,
-        0,
-        -1,
-        -1,
-        null,
-        null,
+        /* start char offset = */ 0,
+        /* char offset = */ 0,
+        /* open paren offset = */ -1,
+        /* end offset = */ -1,
+        /* procedure reference = */ null,
+        /* tear off reference = */ null,
         AsyncMarker.Sync,
         new NameScheme(
             className: null,
diff --git a/pkg/front_end/lib/src/fasta/source/source_procedure_builder.dart b/pkg/front_end/lib/src/fasta/source/source_procedure_builder.dart
index 2c412dd..e24939d 100644
--- a/pkg/front_end/lib/src/fasta/source/source_procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_procedure_builder.dart
@@ -11,6 +11,7 @@
 import '../builder/formal_parameter_builder.dart';
 import '../builder/member_builder.dart';
 import '../builder/metadata_builder.dart';
+import '../builder/omitted_type_builder.dart';
 import '../builder/procedure_builder.dart';
 import '../builder/type_builder.dart';
 import '../builder/type_variable_builder.dart';
@@ -60,7 +61,7 @@
   SourceProcedureBuilder(
       List<MetadataBuilder>? metadata,
       int modifiers,
-      TypeBuilder? returnType,
+      TypeBuilder returnType,
       String name,
       List<TypeVariableBuilder>? typeVariables,
       List<FormalParameterBuilder>? formals,
@@ -132,10 +133,10 @@
 
   bool get isEligibleForTopLevelInference {
     if (isDeclarationInstanceMember) {
-      if (returnType == null) return true;
+      if (returnType is OmittedTypeBuilder) return true;
       if (formals != null) {
         for (FormalParameterBuilder formal in formals!) {
-          if (formal.type == null) return true;
+          if (formal.type is OmittedTypeBuilder) return true;
         }
       }
     }
diff --git a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
index 8cf8c31..56ee6cd 100644
--- a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
@@ -31,7 +31,7 @@
 
 class SourceTypeAliasBuilder extends TypeAliasBuilderImpl {
   @override
-  final TypeBuilder? type;
+  final TypeBuilder type;
 
   final List<TypeVariableBuilder>? _typeVariables;
 
@@ -81,7 +81,7 @@
 
   @override
   bool get isNullAlias {
-    TypeDeclarationBuilder? typeDeclarationBuilder = type?.declaration;
+    TypeDeclarationBuilder? typeDeclarationBuilder = type.declaration;
     return typeDeclarationBuilder is ClassBuilder &&
         typeDeclarationBuilder.isNullClass;
   }
@@ -89,7 +89,7 @@
   Typedef build() {
     buildThisType();
 
-    TypeBuilder? type = this.type;
+    TypeBuilder type = this.type;
     if (type is FunctionTypeBuilder ||
         type is NamedTypeBuilder ||
         type is FixedTypeBuilder) {
@@ -120,7 +120,7 @@
     // instance of InvalidType that isn't identical to `const InvalidType()`.
     thisType = pendingTypeAliasMarker;
     DartType builtType = const InvalidType();
-    TypeBuilder? type = this.type;
+    TypeBuilder type = this.type;
     // ignore: unnecessary_null_comparison
     if (type != null) {
       builtType = type.build(libraryBuilder, TypeUse.typedefAlias);
diff --git a/tools/VERSION b/tools/VERSION
index affbc14..50b2665 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 159
+PRERELEASE 160
 PRERELEASE_PATCH 0
\ No newline at end of file