diff --git a/pkg/compiler/lib/src/ir/constants.dart b/pkg/compiler/lib/src/ir/constants.dart
index d1ddfd7..861711b 100644
--- a/pkg/compiler/lib/src/ir/constants.dart
+++ b/pkg/compiler/lib/src/ir/constants.dart
@@ -204,11 +204,21 @@
   }
 
   @override
+  R accept1<R, A>(ir.TreeVisitor1<R, A> v, A arg) {
+    throw new UnsupportedError("ConstantReference.accept");
+  }
+
+  @override
   transformChildren(ir.Transformer v) {
     throw new UnsupportedError("ConstantReference.transformChildren");
   }
 
   @override
+  transformOrRemoveChildren(ir.RemovingTransformer v) {
+    throw new UnsupportedError("ConstantReference.transformOrRemoveChildren");
+  }
+
+  @override
   int get hashCode => 13 * constant.hashCode;
 
   @override
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index 958d410..101244f 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -15,7 +15,8 @@
 import 'package:kernel/binary/ast_to_binary.dart' as kernel show BinaryPrinter;
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
-import 'package:kernel/kernel.dart' hide MapEntry;
+import 'package:kernel/kernel.dart';
+import 'package:kernel/ast.dart' show NonNullableByDefaultCompiledMode;
 import 'package:kernel/target/targets.dart';
 import 'package:kernel/text/ast_to_text.dart' as kernel show Printer;
 import 'package:path/path.dart' as p;
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 81fadbf..8318288 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -5,7 +5,6 @@
 // @dart = 2.9
 
 import 'dart:collection';
-import 'dart:core' hide MapEntry;
 
 import 'package:_fe_analyzer_shared/src/messages/codes.dart'
     show Message, LocatedMessage;
diff --git a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
index b98d56b..432df8c 100644
--- a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
@@ -4,8 +4,6 @@
 
 // @dart = 2.9
 
-import 'dart:core' hide MapEntry;
-
 import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
 
 import 'package:kernel/ast.dart';
diff --git a/pkg/front_end/lib/src/fasta/builder/declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/declaration_builder.dart
index 0ba64f4..ed02387 100644
--- a/pkg/front_end/lib/src/fasta/builder/declaration_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/declaration_builder.dart
@@ -4,8 +4,6 @@
 
 // @dart = 2.9
 
-import 'dart:core' hide MapEntry;
-
 import 'package:kernel/ast.dart';
 
 import '../messages.dart';
diff --git a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
index 84205dc..79c6bc6 100644
--- a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
@@ -4,8 +4,6 @@
 
 // @dart = 2.9
 
-import 'dart:core' hide MapEntry;
-
 import 'package:kernel/ast.dart';
 import 'package:kernel/core_types.dart';
 
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index 736be55..1fe24be 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -8,7 +8,7 @@
 
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token;
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/src/legacy_erasure.dart';
 
diff --git a/pkg/front_end/lib/src/fasta/builder/fixed_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/fixed_type_builder.dart
index 3f91098..b0ba617 100644
--- a/pkg/front_end/lib/src/fasta/builder/fixed_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/fixed_type_builder.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 
 import '../problems.dart';
 import 'library_builder.dart';
diff --git a/pkg/front_end/lib/src/fasta/builder/function_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_builder.dart
index 4bdfca5..b938323 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_builder.dart
@@ -6,8 +6,6 @@
 
 library fasta.procedure_builder;
 
-import 'dart:core' hide MapEntry;
-
 import 'package:front_end/src/fasta/kernel/kernel_api.dart';
 import 'package:kernel/ast.dart';
 
diff --git a/pkg/front_end/lib/src/fasta/builder/member_builder.dart b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
index f496386..51ee376 100644
--- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
@@ -6,8 +6,6 @@
 
 library fasta.member_builder;
 
-import 'dart:core' hide MapEntry;
-
 import 'package:kernel/ast.dart';
 import 'package:kernel/core_types.dart';
 
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 0678910..6004b66 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
@@ -8,7 +8,7 @@
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 
 import '../fasta_codes.dart'
     show
diff --git a/pkg/front_end/lib/src/fasta/builder/nullability_builder.dart b/pkg/front_end/lib/src/fasta/builder/nullability_builder.dart
index d14f2dc..4270ba8 100644
--- a/pkg/front_end/lib/src/fasta/builder/nullability_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/nullability_builder.dart
@@ -4,8 +4,6 @@
 
 // @dart = 2.9
 
-import 'dart:core' hide MapEntry;
-
 import 'package:kernel/ast.dart';
 
 import '../kernel/body_builder.dart';
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index cecc308..c7b250b 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -4,8 +4,6 @@
 
 // @dart = 2.9
 
-import 'dart:core' hide MapEntry;
-
 import 'package:front_end/src/fasta/dill/dill_member_builder.dart';
 import 'package:front_end/src/fasta/kernel/kernel_api.dart';
 import 'package:kernel/ast.dart';
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
index 93ee939..ea2e411 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
@@ -6,7 +6,7 @@
 
 library fasta.dill_class_builder;
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 
 import '../builder/class_builder.dart';
 import '../builder/library_builder.dart';
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart
index b460387..ea03898 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart
@@ -4,8 +4,6 @@
 
 // @dart = 2.9
 
-import 'dart:core' hide MapEntry;
-
 import 'package:kernel/ast.dart';
 
 import '../builder/extension_builder.dart';
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_extension_member_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_extension_member_builder.dart
index d946f72..d12400f 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_extension_member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_extension_member_builder.dart
@@ -4,8 +4,6 @@
 
 // @dart = 2.9
 
-import 'dart:core' hide MapEntry;
-
 import 'package:kernel/ast.dart';
 
 import '../builder/builder.dart';
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 bedea60..6809bc9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -6,10 +6,7 @@
 
 library fasta.body_builder;
 
-import 'dart:core' hide MapEntry;
-
-import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart'
-    hide Reference; // Work around https://github.com/dart-lang/sdk/issues/44667
+import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart';
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
 
@@ -43,8 +40,7 @@
 
 import 'package:_fe_analyzer_shared/src/util/link.dart';
 
-import 'package:kernel/ast.dart'
-    hide Reference; // Work around https://github.com/dart-lang/sdk/issues/44667
+import 'package:kernel/ast.dart';
 import 'package:kernel/type_environment.dart';
 
 import '../builder/builder.dart';
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
index b97967d..25e0a70 100644
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -6,7 +6,7 @@
 
 library fasta.class_hierarchy_builder;
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 
 import 'package:kernel/class_hierarchy.dart'
     show ClassHierarchy, ClassHierarchyBase;
diff --git a/pkg/front_end/lib/src/fasta/kernel/collections.dart b/pkg/front_end/lib/src/fasta/kernel/collections.dart
index 1e2f994..5a055f9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/collections.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/collections.dart
@@ -6,21 +6,7 @@
 
 library fasta.collections;
 
-import 'dart:core' hide MapEntry;
-
-import 'package:kernel/ast.dart'
-    show
-        DartType,
-        Expression,
-        ExpressionStatement,
-        MapEntry,
-        NullLiteral,
-        Statement,
-        TreeNode,
-        VariableDeclaration,
-        setParents,
-        transformList,
-        visitList;
+import 'package:kernel/ast.dart';
 
 import 'package:kernel/src/printer.dart';
 
@@ -92,14 +78,22 @@
   }
 
   @override
-  visitChildren(Visitor<Object> v) {
+  void visitChildren(Visitor<Object> v) {
     expression?.accept(v);
   }
 
   @override
-  transformChildren(Transformer v) {
+  void transformChildren(Transformer v) {
     if (expression != null) {
-      expression = expression.accept<TreeNode>(v);
+      expression = v.transform(expression);
+      expression?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (expression != null) {
+      expression = v.transformOrRemoveExpression(expression);
       expression?.parent = this;
     }
   }
@@ -138,24 +132,40 @@
   }
 
   @override
-  visitChildren(Visitor<Object> v) {
+  void visitChildren(Visitor<Object> v) {
     condition?.accept(v);
     then?.accept(v);
     otherwise?.accept(v);
   }
 
   @override
-  transformChildren(Transformer v) {
+  void transformChildren(Transformer v) {
     if (condition != null) {
-      condition = condition.accept<TreeNode>(v);
+      condition = v.transform(condition);
       condition?.parent = this;
     }
     if (then != null) {
-      then = then.accept<TreeNode>(v);
+      then = v.transform(then);
       then?.parent = this;
     }
     if (otherwise != null) {
-      otherwise = otherwise.accept<TreeNode>(v);
+      otherwise = v.transform(otherwise);
+      otherwise?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (condition != null) {
+      condition = v.transformOrRemoveExpression(condition);
+      condition?.parent = this;
+    }
+    if (then != null) {
+      then = v.transformOrRemoveExpression(then);
+      then?.parent = this;
+    }
+    if (otherwise != null) {
+      otherwise = v.transformOrRemoveExpression(otherwise);
       otherwise?.parent = this;
     }
   }
@@ -213,7 +223,7 @@
   }
 
   @override
-  visitChildren(Visitor<Object> v) {
+  void visitChildren(Visitor<Object> v) {
     visitList(variables, v);
     condition?.accept(v);
     visitList(updates, v);
@@ -221,15 +231,29 @@
   }
 
   @override
-  transformChildren(Transformer v) {
-    transformList(variables, v, this);
+  void transformChildren(Transformer v) {
+    v.transformList(variables, this);
     if (condition != null) {
-      condition = condition.accept<TreeNode>(v);
+      condition = v.transform(condition);
       condition?.parent = this;
     }
-    transformList(updates, v, this);
+    v.transformList(updates, this);
     if (body != null) {
-      body = body.accept<TreeNode>(v);
+      body = v.transform(body);
+      body?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    v.transformVariableDeclarationList(variables, this);
+    if (condition != null) {
+      condition = v.transformOrRemoveExpression(condition);
+      condition?.parent = this;
+    }
+    v.transformExpressionList(updates, this);
+    if (body != null) {
+      body = v.transformOrRemoveExpression(body);
       body?.parent = this;
     }
   }
@@ -286,7 +310,7 @@
         ..fileOffset = syntheticAssignment.fileOffset)
       : expressionEffects;
 
-  visitChildren(Visitor<Object> v) {
+  void visitChildren(Visitor<Object> v) {
     variable?.accept(v);
     iterable?.accept(v);
     syntheticAssignment?.accept(v);
@@ -295,29 +319,57 @@
     problem?.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  void transformChildren(Transformer v) {
     if (variable != null) {
-      variable = variable.accept<TreeNode>(v);
+      variable = v.transform(variable);
       variable?.parent = this;
     }
     if (iterable != null) {
-      iterable = iterable.accept<TreeNode>(v);
+      iterable = v.transform(iterable);
       iterable?.parent = this;
     }
     if (syntheticAssignment != null) {
-      syntheticAssignment = syntheticAssignment.accept<TreeNode>(v);
+      syntheticAssignment = v.transform(syntheticAssignment);
       syntheticAssignment?.parent = this;
     }
     if (expressionEffects != null) {
-      expressionEffects = expressionEffects.accept<TreeNode>(v);
+      expressionEffects = v.transform(expressionEffects);
       expressionEffects?.parent = this;
     }
     if (body != null) {
-      body = body.accept<TreeNode>(v);
+      body = v.transform(body);
       body?.parent = this;
     }
     if (problem != null) {
-      problem = problem.accept<TreeNode>(v);
+      problem = v.transform(problem);
+      problem?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (variable != null) {
+      variable = v.transformOrRemoveVariableDeclaration(variable);
+      variable?.parent = this;
+    }
+    if (iterable != null) {
+      iterable = v.transformOrRemoveExpression(iterable);
+      iterable?.parent = this;
+    }
+    if (syntheticAssignment != null) {
+      syntheticAssignment = v.transformOrRemoveExpression(syntheticAssignment);
+      syntheticAssignment?.parent = this;
+    }
+    if (expressionEffects != null) {
+      expressionEffects = v.transformOrRemoveStatement(expressionEffects);
+      expressionEffects?.parent = this;
+    }
+    if (body != null) {
+      body = v.transformOrRemoveExpression(body);
+      body?.parent = this;
+    }
+    if (problem != null) {
+      problem = v.transformOrRemoveExpression(problem);
       problem?.parent = this;
     }
   }
@@ -374,6 +426,9 @@
   R accept<R>(TreeVisitor<R> v) => v.defaultTreeNode(this);
 
   @override
+  R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.defaultTreeNode(this, arg);
+
+  @override
   String toStringInternal() => toText(defaultAstTextStrategy);
 
   @override
@@ -400,14 +455,22 @@
   }
 
   @override
-  visitChildren(Visitor<Object> v) {
+  void visitChildren(Visitor<Object> v) {
     expression?.accept(v);
   }
 
   @override
-  transformChildren(Transformer v) {
+  void transformChildren(Transformer v) {
     if (expression != null) {
-      expression = expression.accept<TreeNode>(v);
+      expression = v.transform(expression);
+      expression?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (expression != null) {
+      expression = v.transformOrRemoveExpression(expression);
       expression?.parent = this;
     }
   }
@@ -436,24 +499,40 @@
   }
 
   @override
-  visitChildren(Visitor<Object> v) {
+  void visitChildren(Visitor<Object> v) {
     condition?.accept(v);
     then?.accept(v);
     otherwise?.accept(v);
   }
 
   @override
-  transformChildren(Transformer v) {
+  void transformChildren(Transformer v) {
     if (condition != null) {
-      condition = condition.accept<TreeNode>(v);
+      condition = v.transform(condition);
       condition?.parent = this;
     }
     if (then != null) {
-      then = then.accept<TreeNode>(v);
+      then = v.transform(then);
       then?.parent = this;
     }
     if (otherwise != null) {
-      otherwise = otherwise.accept<TreeNode>(v);
+      otherwise = v.transform(otherwise);
+      otherwise?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (condition != null) {
+      condition = v.transformOrRemoveExpression(condition);
+      condition?.parent = this;
+    }
+    if (then != null) {
+      then = v.transformOrRemove(then, dummyMapEntry);
+      then?.parent = this;
+    }
+    if (otherwise != null) {
+      otherwise = v.transformOrRemove(otherwise, dummyMapEntry);
       otherwise?.parent = this;
     }
   }
@@ -484,7 +563,7 @@
   }
 
   @override
-  visitChildren(Visitor<Object> v) {
+  void visitChildren(Visitor<Object> v) {
     visitList(variables, v);
     condition?.accept(v);
     visitList(updates, v);
@@ -492,15 +571,29 @@
   }
 
   @override
-  transformChildren(Transformer v) {
-    transformList(variables, v, this);
+  void transformChildren(Transformer v) {
+    v.transformList(variables, this);
     if (condition != null) {
-      condition = condition.accept<TreeNode>(v);
+      condition = v.transform(condition);
       condition?.parent = this;
     }
-    transformList(updates, v, this);
+    v.transformList(updates, this);
     if (body != null) {
-      body = body.accept<TreeNode>(v);
+      body = v.transform(body);
+      body?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    v.transformVariableDeclarationList(variables, this);
+    if (condition != null) {
+      condition = v.transformOrRemoveExpression(condition);
+      condition?.parent = this;
+    }
+    v.transformExpressionList(updates, this);
+    if (body != null) {
+      body = v.transformOrRemove(body, dummyMapEntry);
       body?.parent = this;
     }
   }
@@ -543,7 +636,7 @@
         ..fileOffset = syntheticAssignment.fileOffset)
       : expressionEffects;
 
-  visitChildren(Visitor<Object> v) {
+  void visitChildren(Visitor<Object> v) {
     variable?.accept(v);
     iterable?.accept(v);
     syntheticAssignment?.accept(v);
@@ -552,29 +645,57 @@
     problem?.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  void transformChildren(Transformer v) {
     if (variable != null) {
-      variable = variable.accept<TreeNode>(v);
+      variable = v.transform(variable);
       variable?.parent = this;
     }
     if (iterable != null) {
-      iterable = iterable.accept<TreeNode>(v);
+      iterable = v.transform(iterable);
       iterable?.parent = this;
     }
     if (syntheticAssignment != null) {
-      syntheticAssignment = syntheticAssignment.accept<TreeNode>(v);
+      syntheticAssignment = v.transform(syntheticAssignment);
       syntheticAssignment?.parent = this;
     }
     if (expressionEffects != null) {
-      expressionEffects = expressionEffects.accept<TreeNode>(v);
+      expressionEffects = v.transform(expressionEffects);
       expressionEffects?.parent = this;
     }
     if (body != null) {
-      body = body.accept<TreeNode>(v);
+      body = v.transform(body);
       body?.parent = this;
     }
     if (problem != null) {
-      problem = problem.accept<TreeNode>(v);
+      problem = v.transform(problem);
+      problem?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (variable != null) {
+      variable = v.transformOrRemoveVariableDeclaration(variable);
+      variable?.parent = this;
+    }
+    if (iterable != null) {
+      iterable = v.transformOrRemoveExpression(iterable);
+      iterable?.parent = this;
+    }
+    if (syntheticAssignment != null) {
+      syntheticAssignment = v.transformOrRemoveExpression(syntheticAssignment);
+      syntheticAssignment?.parent = this;
+    }
+    if (expressionEffects != null) {
+      expressionEffects = v.transformOrRemoveStatement(expressionEffects);
+      expressionEffects?.parent = this;
+    }
+    if (body != null) {
+      body = v.transformOrRemove(body, dummyMapEntry);
+      body?.parent = this;
+    }
+    if (problem != null) {
+      problem = v.transformOrRemoveExpression(problem);
       problem?.parent = this;
     }
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
index 641352a..86496d4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchyBase;
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index 2f96cfa..9709c98 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -20,8 +20,6 @@
 /// language.  Issue(http://dartbug.com/31799)
 library fasta.constant_evaluator;
 
-import 'dart:core' hide MapEntry;
-
 import 'dart:io' as io;
 
 import 'package:kernel/ast.dart';
@@ -157,7 +155,7 @@
       typeEnvironment,
       errorReporter,
       evaluationMode);
-  constantsTransformer.visitProcedure(procedure);
+  constantsTransformer.visitProcedure(procedure, null);
 }
 
 enum EvaluationMode {
@@ -329,7 +327,7 @@
   Constant visitUnevaluatedConstant(UnevaluatedConstant node) => null;
 }
 
-class ConstantsTransformer extends Transformer {
+class ConstantsTransformer extends RemovingTransformer {
   final ConstantsBackend backend;
   final ConstantEvaluator constantEvaluator;
   final TypeEnvironment typeEnvironment;
@@ -369,12 +367,12 @@
 
     transformAnnotations(library.annotations, library);
 
-    transformList(library.dependencies, this, library);
-    transformList(library.parts, this, library);
-    transformList(library.typedefs, this, library);
-    transformList(library.classes, this, library);
-    transformList(library.procedures, this, library);
-    transformList(library.fields, this, library);
+    transformLibraryDependencyList(library.dependencies, library);
+    transformLibraryPartList(library.parts, library);
+    transformTypedefList(library.typedefs, library);
+    transformClassList(library.classes, library);
+    transformProcedureList(library.procedures, library);
+    transformFieldList(library.fields, library);
 
     if (!keepFields) {
       // The transformer API does not iterate over `Library.additionalExports`,
@@ -387,7 +385,7 @@
   }
 
   @override
-  LibraryPart visitLibraryPart(LibraryPart node) {
+  LibraryPart visitLibraryPart(LibraryPart node, TreeNode removalSentinel) {
     constantEvaluator.withNewEnvironment(() {
       transformAnnotations(node.annotations, node);
     });
@@ -395,7 +393,8 @@
   }
 
   @override
-  LibraryDependency visitLibraryDependency(LibraryDependency node) {
+  LibraryDependency visitLibraryDependency(
+      LibraryDependency node, TreeNode removalSentinel) {
     constantEvaluator.withNewEnvironment(() {
       transformAnnotations(node.annotations, node);
     });
@@ -403,78 +402,80 @@
   }
 
   @override
-  Class visitClass(Class node) {
+  Class visitClass(Class node, TreeNode removalSentinel) {
     StaticTypeContext oldStaticTypeContext = _staticTypeContext;
     _staticTypeContext = new StaticTypeContext.forAnnotations(
         node.enclosingLibrary, typeEnvironment);
     constantEvaluator.withNewEnvironment(() {
       transformAnnotations(node.annotations, node);
-      transformList(node.fields, this, node);
-      transformList(node.typeParameters, this, node);
-      transformList(node.constructors, this, node);
-      transformList(node.procedures, this, node);
-      transformList(node.redirectingFactoryConstructors, this, node);
+      transformFieldList(node.fields, node);
+      transformTypeParameterList(node.typeParameters, node);
+      transformConstructorList(node.constructors, node);
+      transformProcedureList(node.procedures, node);
+      transformRedirectingFactoryConstructorList(
+          node.redirectingFactoryConstructors, node);
     });
     _staticTypeContext = oldStaticTypeContext;
     return node;
   }
 
   @override
-  Procedure visitProcedure(Procedure node) {
+  Procedure visitProcedure(Procedure node, TreeNode removalSentinel) {
     StaticTypeContext oldStaticTypeContext = _staticTypeContext;
     _staticTypeContext = new StaticTypeContext(node, typeEnvironment);
     constantEvaluator.withNewEnvironment(() {
       transformAnnotations(node.annotations, node);
-      node.function = node.function.accept<TreeNode>(this)..parent = node;
+      node.function = transform(node.function)..parent = node;
     });
     _staticTypeContext = oldStaticTypeContext;
     return node;
   }
 
   @override
-  Constructor visitConstructor(Constructor node) {
+  Constructor visitConstructor(Constructor node, TreeNode removalSentinel) {
     StaticTypeContext oldStaticTypeContext = _staticTypeContext;
     _staticTypeContext = new StaticTypeContext(node, typeEnvironment);
     constantEvaluator.withNewEnvironment(() {
       transformAnnotations(node.annotations, node);
-      transformList(node.initializers, this, node);
-      node.function = node.function.accept<TreeNode>(this)..parent = node;
+      transformInitializerList(node.initializers, node);
+      node.function = transform(node.function)..parent = node;
     });
     _staticTypeContext = oldStaticTypeContext;
     return node;
   }
 
   @override
-  Typedef visitTypedef(Typedef node) {
+  Typedef visitTypedef(Typedef node, TreeNode removalSentinel) {
     constantEvaluator.withNewEnvironment(() {
       transformAnnotations(node.annotations, node);
-      transformList(node.typeParameters, this, node);
-      transformList(node.typeParametersOfFunctionType, this, node);
-      transformList(node.positionalParameters, this, node);
-      transformList(node.namedParameters, this, node);
+      transformTypeParameterList(node.typeParameters, node);
+      transformTypeParameterList(node.typeParametersOfFunctionType, node);
+      transformVariableDeclarationList(node.positionalParameters, node);
+      transformVariableDeclarationList(node.namedParameters, node);
     });
     return node;
   }
 
   @override
   RedirectingFactoryConstructor visitRedirectingFactoryConstructor(
-      RedirectingFactoryConstructor node) {
+      RedirectingFactoryConstructor node, TreeNode removalSentinel) {
     // Currently unreachable as the compiler doesn't produce
     // RedirectingFactoryConstructor.
     StaticTypeContext oldStaticTypeContext = _staticTypeContext;
     _staticTypeContext = new StaticTypeContext(node, typeEnvironment);
     constantEvaluator.withNewEnvironment(() {
       transformAnnotations(node.annotations, node);
-      transformList(node.typeParameters, this, node);
-      transformList(node.positionalParameters, this, node);
-      transformList(node.namedParameters, this, node);
+      transformTypeParameterList(node.typeParameters, node);
+      transformVariableDeclarationList(node.positionalParameters, node);
+      transformVariableDeclarationList(node.namedParameters, node);
     });
     _staticTypeContext = oldStaticTypeContext;
     return node;
   }
 
   @override
-  TypeParameter visitTypeParameter(TypeParameter node) {
+  TypeParameter visitTypeParameter(
+      TypeParameter node, TreeNode removalSentinel) {
     transformAnnotations(node.annotations, node);
     return node;
   }
@@ -497,8 +498,8 @@
   // Handle definition of constants:
 
   @override
-  FunctionNode visitFunctionNode(FunctionNode node) {
-    transformList(node.typeParameters, this, node);
+  FunctionNode visitFunctionNode(FunctionNode node, TreeNode removalSentinel) {
+    transformTypeParameterList(node.typeParameters, node);
     final int positionalParameterCount = node.positionalParameters.length;
     for (int i = 0; i < positionalParameterCount; ++i) {
       final VariableDeclaration variable = node.positionalParameters[i];
@@ -518,13 +519,14 @@
       }
     }
     if (node.body != null) {
-      node.body = node.body.accept<TreeNode>(this)..parent = node;
+      node.body = transform(node.body)..parent = node;
     }
     return node;
   }
 
   @override
-  VariableDeclaration visitVariableDeclaration(VariableDeclaration node) {
+  Statement visitVariableDeclaration(
+      VariableDeclaration node, TreeNode removalSentinel) {
     transformAnnotations(node.annotations, node);
 
     if (node.initializer != null) {
@@ -540,19 +542,18 @@
             // If the constant is unevaluated we need to keep the expression,
             // so that, in the case the constant contains error but the local
             // is unused, the error will still be reported.
-            return null;
+            return removalSentinel /*!*/ ?? node;
           }
         }
       } else {
-        node.initializer = node.initializer.accept<TreeNode>(this)
-          ..parent = node;
+        node.initializer = transform(node.initializer)..parent = node;
       }
     }
     return node;
   }
 
   @override
-  Field visitField(Field node) {
+  Field visitField(Field node, TreeNode removalSentinel) {
     StaticTypeContext oldStaticTypeContext = _staticTypeContext;
     _staticTypeContext = new StaticTypeContext(node, typeEnvironment);
     Field field = constantEvaluator.withNewEnvironment(() {
@@ -564,13 +565,12 @@
 
         // If this constant is inlined, remove it.
         if (!keepFields && shouldInline(node.initializer)) {
-          return null;
+          return removalSentinel;
         }
       } else {
         transformAnnotations(node.annotations, node);
         if (node.initializer != null) {
-          node.initializer = node.initializer.accept<TreeNode>(this)
-            ..parent = node;
+          node.initializer = transform(node.initializer)..parent = node;
         }
       }
       return node;
@@ -582,7 +582,7 @@
   // Handle use-sites of constants (and "inline" constant expressions):
 
   @override
-  Expression visitSymbolLiteral(SymbolLiteral node) {
+  Expression visitSymbolLiteral(SymbolLiteral node, TreeNode removalSentinel) {
     return makeConstantExpression(
         constantEvaluator.evaluate(_staticTypeContext, node), node);
   }
@@ -593,9 +593,9 @@
   }
 
   @override
-  Expression visitEqualsCall(EqualsCall node) {
-    Expression left = node.left.accept<TreeNode>(this);
-    Expression right = node.right.accept<TreeNode>(this);
+  Expression visitEqualsCall(EqualsCall node, TreeNode removalSentinel) {
+    Expression left = transform(node.left);
+    Expression right = transform(node.right);
     if (_isNull(left)) {
       return new EqualsNull(right, isNot: node.isNot)
         ..fileOffset = node.fileOffset;
@@ -609,7 +609,7 @@
   }
 
   @override
-  Expression visitStaticGet(StaticGet node) {
+  Expression visitStaticGet(StaticGet node, TreeNode removalSentinel) {
     final Member target = node.target;
     if (target is Field && target.isConst) {
       // Make sure the initializer is evaluated first.
@@ -625,27 +625,28 @@
     } else if (target is Procedure && target.kind == ProcedureKind.Method) {
       return evaluateAndTransformWithContext(node, node);
     }
-    return super.visitStaticGet(node);
+    return super.visitStaticGet(node, removalSentinel);
   }
 
   @override
-  Expression visitStaticTearOff(StaticTearOff node) {
+  Expression visitStaticTearOff(StaticTearOff node, TreeNode removalSentinel) {
     final Member target = node.target;
     if (target is Procedure && target.kind == ProcedureKind.Method) {
       return evaluateAndTransformWithContext(node, node);
     }
-    return super.visitStaticTearOff(node);
+    return super.visitStaticTearOff(node, removalSentinel);
   }
 
   @override
-  SwitchCase visitSwitchCase(SwitchCase node) {
+  SwitchCase visitSwitchCase(SwitchCase node, TreeNode removalSentinel) {
     transformExpressions(node.expressions, node);
-    return super.visitSwitchCase(node);
+    return super.visitSwitchCase(node, removalSentinel);
   }
 
   @override
-  SwitchStatement visitSwitchStatement(SwitchStatement node) {
-    SwitchStatement result = super.visitSwitchStatement(node);
+  SwitchStatement visitSwitchStatement(
+      SwitchStatement node, TreeNode removalSentinel) {
+    SwitchStatement result = super.visitSwitchStatement(node, removalSentinel);
     Library library = constantEvaluator.libraryOf(node);
     if (library != null && library.isNonNullableByDefault) {
       for (SwitchCase switchCase in node.cases) {
@@ -672,7 +673,7 @@
   }
 
   @override
-  Expression visitVariableGet(VariableGet node) {
+  Expression visitVariableGet(VariableGet node, TreeNode removalSentinel) {
     final VariableDeclaration variable = node.variable;
     if (variable.isConst) {
       variable.initializer =
@@ -682,74 +683,80 @@
         return evaluateAndTransformWithContext(node, node);
       }
     }
-    return super.visitVariableGet(node);
+    return super.visitVariableGet(node, removalSentinel);
   }
 
   @override
-  Expression visitListLiteral(ListLiteral node) {
+  Expression visitListLiteral(ListLiteral node, TreeNode removalSentinel) {
     if (node.isConst) {
       return evaluateAndTransformWithContext(node, node);
     }
-    return super.visitListLiteral(node);
+    return super.visitListLiteral(node, removalSentinel);
   }
 
   @override
-  Expression visitListConcatenation(ListConcatenation node) {
+  Expression visitListConcatenation(
+      ListConcatenation node, TreeNode removalSentinel) {
     return evaluateAndTransformWithContext(node, node);
   }
 
   @override
-  Expression visitSetLiteral(SetLiteral node) {
+  Expression visitSetLiteral(SetLiteral node, TreeNode removalSentinel) {
     if (node.isConst) {
       return evaluateAndTransformWithContext(node, node);
     }
-    return super.visitSetLiteral(node);
+    return super.visitSetLiteral(node, removalSentinel);
   }
 
   @override
-  Expression visitSetConcatenation(SetConcatenation node) {
+  Expression visitSetConcatenation(
+      SetConcatenation node, TreeNode removalSentinel) {
     return evaluateAndTransformWithContext(node, node);
   }
 
   @override
-  Expression visitMapLiteral(MapLiteral node) {
+  Expression visitMapLiteral(MapLiteral node, TreeNode removalSentinel) {
     if (node.isConst) {
       return evaluateAndTransformWithContext(node, node);
     }
-    return super.visitMapLiteral(node);
+    return super.visitMapLiteral(node, removalSentinel);
   }
 
   @override
-  Expression visitTypeLiteral(TypeLiteral node) {
+  Expression visitTypeLiteral(TypeLiteral node, TreeNode removalSentinel) {
     if (!containsFreeTypeVariables(node.type)) {
       return evaluateAndTransformWithContext(node, node);
     }
-    return super.visitTypeLiteral(node);
+    return super.visitTypeLiteral(node, removalSentinel);
   }
 
   @override
-  Expression visitMapConcatenation(MapConcatenation node) {
+  Expression visitMapConcatenation(
+      MapConcatenation node, TreeNode removalSentinel) {
     return evaluateAndTransformWithContext(node, node);
   }
 
   @override
-  Expression visitConstructorInvocation(ConstructorInvocation node) {
+  Expression visitConstructorInvocation(
+      ConstructorInvocation node, TreeNode removalSentinel) {
     if (node.isConst) {
       return evaluateAndTransformWithContext(node, node);
     }
-    return super.visitConstructorInvocation(node);
+    return super.visitConstructorInvocation(node, removalSentinel);
   }
 
   @override
-  Expression visitStaticInvocation(StaticInvocation node) {
+  Expression visitStaticInvocation(
+      StaticInvocation node, TreeNode removalSentinel) {
     if (node.isConst) {
       return evaluateAndTransformWithContext(node, node);
     }
-    return super.visitStaticInvocation(node);
+    return super.visitStaticInvocation(node, removalSentinel);
   }
 
   @override
-  Expression visitConstantExpression(ConstantExpression node) {
+  Expression visitConstantExpression(
+      ConstantExpression node, TreeNode removalSentinel) {
     Constant constant = node.constant;
     if (constant is UnevaluatedConstant) {
       Expression expression = constant.expression;
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_int_folder.dart b/pkg/front_end/lib/src/fasta/kernel/constant_int_folder.dart
index 8d0c5b0..fbbd0ca 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_int_folder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_int_folder.dart
@@ -4,8 +4,6 @@
 
 // @dart = 2.9
 
-import 'dart:core' hide MapEntry;
-
 import 'package:kernel/ast.dart';
 import 'package:kernel/target/targets.dart';
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index c407429..d179e00 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -7,8 +7,6 @@
 /// A library to help generate expression.
 library fasta.expression_generator;
 
-import 'dart:core' hide MapEntry;
-
 import 'package:_fe_analyzer_shared/src/parser/parser.dart'
     show lengthForToken, lengthOfSpan;
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index 30344fd..9be6294 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -6,8 +6,6 @@
 
 library fasta.fangorn;
 
-import 'dart:core' hide MapEntry;
-
 import 'package:kernel/ast.dart';
 import 'package:kernel/src/printer.dart';
 
@@ -777,6 +775,10 @@
     throw unsupported("transformChildren", fileOffset, uri);
   }
 
+  transformOrRemoveChildren(v) {
+    throw unsupported("transformOrRemoveChildren", fileOffset, uri);
+  }
+
   @override
   String toString() {
     return "_VariablesDeclaration(${toStringInternal()})";
diff --git a/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart b/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
index f37b35c..b45a75c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
@@ -8,7 +8,7 @@
 
 import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 
 import 'package:kernel/src/assumptions.dart';
 import 'package:kernel/src/legacy_erasure.dart';
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index be8f723..13d0970 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -4,12 +4,9 @@
 
 // @dart = 2.9
 
-import 'dart:core' hide MapEntry;
-
 import 'package:_fe_analyzer_shared/src/util/link.dart';
 import 'package:front_end/src/api_prototype/lowering_predicates.dart';
-import 'package:kernel/ast.dart'
-    hide Reference; // Work around https://github.com/dart-lang/sdk/issues/44667
+import 'package:kernel/ast.dart';
 import 'package:kernel/src/legacy_erasure.dart';
 import 'package:kernel/type_algebra.dart' show Substitution;
 import 'package:kernel/type_environment.dart';
diff --git a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
index 89039e8..faf4716 100644
--- a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
@@ -20,8 +20,6 @@
 /// kernel class, because multiple constructs in Dart may desugar to a tree
 /// with the same kind of root node.
 
-import 'dart:core' hide MapEntry;
-
 import 'package:kernel/ast.dart';
 import 'package:kernel/text/ast_to_text.dart' show Precedence, Printer;
 import 'package:kernel/src/printer.dart';
@@ -262,23 +260,47 @@
   @override
   void transformChildren(Transformer v) {
     if (variable != null) {
-      variable = variable.accept<TreeNode>(v);
+      variable = v.transform(variable);
       variable?.parent = this;
     }
     if (iterable != null) {
-      iterable = iterable.accept<TreeNode>(v);
+      iterable = v.transform(iterable);
       iterable?.parent = this;
     }
     if (syntheticAssignment != null) {
-      syntheticAssignment = syntheticAssignment.accept<TreeNode>(v);
+      syntheticAssignment = v.transform(syntheticAssignment);
       syntheticAssignment?.parent = this;
     }
     if (expressionEffects != null) {
-      expressionEffects = expressionEffects.accept<TreeNode>(v);
+      expressionEffects = v.transform(expressionEffects);
       expressionEffects?.parent = this;
     }
     if (body != null) {
-      body = body.accept<TreeNode>(v);
+      body = v.transform(body);
+      body?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (variable != null) {
+      variable = v.transform(variable);
+      variable?.parent = this;
+    }
+    if (iterable != null) {
+      iterable = v.transform(iterable);
+      iterable?.parent = this;
+    }
+    if (syntheticAssignment != null) {
+      syntheticAssignment = v.transform(syntheticAssignment);
+      syntheticAssignment?.parent = this;
+    }
+    if (expressionEffects != null) {
+      expressionEffects = v.transform(expressionEffects);
+      expressionEffects?.parent = this;
+    }
+    if (body != null) {
+      body = v.transform(body);
       body?.parent = this;
     }
   }
@@ -320,12 +342,25 @@
   @override
   void transformChildren(Transformer v) {
     if (tryBlock != null) {
-      tryBlock = tryBlock.accept<TreeNode>(v);
+      tryBlock = v.transform(tryBlock);
       tryBlock?.parent = this;
     }
-    transformList(catchBlocks, v, this);
+    v.transformList(catchBlocks, this);
     if (finallyBlock != null) {
-      finallyBlock = finallyBlock.accept<TreeNode>(v);
+      finallyBlock = v.transform(finallyBlock);
+      finallyBlock?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (tryBlock != null) {
+      tryBlock = v.transformOrRemoveStatement(tryBlock);
+      tryBlock?.parent = this;
+    }
+    v.transformCatchList(catchBlocks, this);
+    if (finallyBlock != null) {
+      finallyBlock = v.transformOrRemoveStatement(finallyBlock);
       finallyBlock?.parent = this;
     }
   }
@@ -586,10 +621,19 @@
   @override
   void transformChildren(Transformer v) {
     if (variable != null) {
-      variable = variable.accept<TreeNode>(v);
+      variable = v.transform(variable);
       variable?.parent = this;
     }
-    transformList(expressions, v, this);
+    v.transformList(expressions, this);
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (variable != null) {
+      variable = v.transformOrRemoveVariableDeclaration(variable);
+      variable?.parent = this;
+    }
+    v.transformExpressionList(expressions, this);
   }
 
   @override
@@ -646,11 +690,23 @@
   @override
   void transformChildren(Transformer v) {
     if (variable != null) {
-      variable = variable.accept<TreeNode>(v);
+      variable = v.transform(variable);
       variable?.parent = this;
     }
     if (expression != null) {
-      expression = expression.accept<TreeNode>(v);
+      expression = v.transform(expression);
+      expression?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (variable != null) {
+      variable = v.transformOrRemoveVariableDeclaration(variable);
+      variable?.parent = this;
+    }
+    if (expression != null) {
+      expression = v.transformOrRemoveExpression(expression);
       expression?.parent = this;
     }
   }
@@ -849,11 +905,23 @@
   @override
   void transformChildren(Transformer v) {
     if (left != null) {
-      left = left.accept<TreeNode>(v);
+      left = v.transform(left);
       left?.parent = this;
     }
     if (right != null) {
-      right = right.accept<TreeNode>(v);
+      right = v.transform(right);
+      right?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (left != null) {
+      left = v.transformOrRemoveExpression(left);
+      left?.parent = this;
+    }
+    if (right != null) {
+      right = v.transformOrRemoveExpression(right);
       right?.parent = this;
     }
   }
@@ -1040,11 +1108,23 @@
   @override
   void transformChildren(Transformer v) {
     if (expression != null) {
-      expression = expression.accept<TreeNode>(v);
+      expression = v.transform(expression);
       expression?.parent = this;
     }
     if (arguments != null) {
-      arguments = arguments.accept<TreeNode>(v);
+      arguments = v.transform(arguments);
+      arguments?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (expression != null) {
+      expression = v.transformOrRemoveExpression(expression);
+      expression?.parent = this;
+    }
+    if (arguments != null) {
+      arguments = v.transformOrRemove(arguments, dummyArguments);
       arguments?.parent = this;
     }
   }
@@ -1122,13 +1202,25 @@
   }
 
   @override
-  transformChildren(Transformer v) {
+  void transformChildren(Transformer v) {
     if (variable != null) {
-      variable = variable.accept<TreeNode>(v);
+      variable = v.transform(variable);
       variable?.parent = this;
     }
     if (invocation != null) {
-      invocation = invocation.accept<TreeNode>(v);
+      invocation = v.transform(invocation);
+      invocation?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (variable != null) {
+      variable = v.transformOrRemoveVariableDeclaration(variable);
+      variable?.parent = this;
+    }
+    if (invocation != null) {
+      invocation = v.transformOrRemoveExpression(invocation);
       invocation?.parent = this;
     }
   }
@@ -1195,13 +1287,25 @@
   }
 
   @override
-  transformChildren(Transformer v) {
+  void transformChildren(Transformer v) {
     if (variable != null) {
-      variable = variable.accept<TreeNode>(v);
+      variable = v.transform(variable);
       variable?.parent = this;
     }
     if (read != null) {
-      read = read.accept<TreeNode>(v);
+      read = v.transform(read);
+      read?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (variable != null) {
+      variable = v.transform(variable);
+      variable?.parent = this;
+    }
+    if (read != null) {
+      read = v.transform(read);
       read?.parent = this;
     }
   }
@@ -1267,13 +1371,25 @@
   }
 
   @override
-  transformChildren(Transformer v) {
+  void transformChildren(Transformer v) {
     if (variable != null) {
-      variable = variable.accept<TreeNode>(v);
+      variable = v.transform(variable);
       variable?.parent = this;
     }
     if (write != null) {
-      write = write.accept<TreeNode>(v);
+      write = v.transform(write);
+      write?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (variable != null) {
+      variable = v.transformOrRemoveVariableDeclaration(variable);
+      variable?.parent = this;
+    }
+    if (write != null) {
+      write = v.transformOrRemoveExpression(write);
       write?.parent = this;
     }
   }
@@ -1510,6 +1626,11 @@
         isLate: isLate || lateGetter != null, type: lateType ?? type);
     printer.write(';');
   }
+
+  @override
+  String toString() {
+    return "VariableDeclarationImpl(${toStringInternal()})";
+  }
 }
 
 /// Front end specific implementation of [VariableGet].
@@ -1570,19 +1691,14 @@
 
   @override
   void visitChildren(Visitor<dynamic> v) {
-    import?.accept(v);
-    target?.accept(v);
+    v.visitProcedureReference(target);
   }
 
   @override
-  void transformChildren(Transformer v) {
-    if (import != null) {
-      import = import.accept<TreeNode>(v);
-    }
-    if (target != null) {
-      target = target.accept<TreeNode>(v);
-    }
-  }
+  void transformChildren(Transformer v) {}
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {}
 
   @override
   String toString() {
@@ -1651,11 +1767,23 @@
   @override
   void transformChildren(Transformer v) {
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
+      receiver = v.transform(receiver);
       receiver?.parent = this;
     }
     if (rhs != null) {
-      rhs = rhs.accept<TreeNode>(v);
+      rhs = v.transform(rhs);
+      rhs?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (receiver != null) {
+      receiver = v.transformOrRemoveExpression(receiver);
+      receiver?.parent = this;
+    }
+    if (rhs != null) {
+      rhs = v.transformOrRemoveExpression(rhs);
       rhs?.parent = this;
     }
   }
@@ -1720,11 +1848,23 @@
   @override
   void transformChildren(Transformer v) {
     if (read != null) {
-      read = read.accept<TreeNode>(v);
+      read = v.transform(read);
       read?.parent = this;
     }
     if (write != null) {
-      write = write.accept<TreeNode>(v);
+      write = v.transform(write);
+      write?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (read != null) {
+      read = v.transformOrRemoveExpression(read);
+      read?.parent = this;
+    }
+    if (write != null) {
+      write = v.transformOrRemoveExpression(write);
       write?.parent = this;
     }
   }
@@ -1843,11 +1983,23 @@
   @override
   void transformChildren(Transformer v) {
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
+      receiver = v.transform(receiver);
       receiver?.parent = this;
     }
     if (rhs != null) {
-      rhs = rhs.accept<TreeNode>(v);
+      rhs = v.transform(rhs);
+      rhs?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (receiver != null) {
+      receiver = v.transformOrRemoveExpression(receiver);
+      receiver?.parent = this;
+    }
+    if (rhs != null) {
+      rhs = v.transformOrRemoveExpression(rhs);
       rhs?.parent = this;
     }
   }
@@ -1923,11 +2075,23 @@
   @override
   void transformChildren(Transformer v) {
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
+      receiver = v.transform(receiver);
       receiver?.parent = this;
     }
     if (rhs != null) {
-      rhs = rhs.accept<TreeNode>(v);
+      rhs = v.transform(rhs);
+      rhs?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (receiver != null) {
+      receiver = v.transformOrRemoveExpression(receiver);
+      receiver?.parent = this;
+    }
+    if (rhs != null) {
+      rhs = v.transformOrRemoveExpression(rhs);
       rhs?.parent = this;
     }
   }
@@ -1999,11 +2163,23 @@
   @override
   void transformChildren(Transformer v) {
     if (variable != null) {
-      variable = variable.accept<TreeNode>(v);
+      variable = v.transform(variable);
       variable?.parent = this;
     }
     if (write != null) {
-      write = write.accept<TreeNode>(v);
+      write = v.transform(write);
+      write?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (variable != null) {
+      variable = v.transformOrRemoveVariableDeclaration(variable);
+      variable?.parent = this;
+    }
+    if (write != null) {
+      write = v.transformOrRemoveVariableDeclaration(write);
       write?.parent = this;
     }
   }
@@ -2052,11 +2228,23 @@
   @override
   void transformChildren(Transformer v) {
     if (read != null) {
-      read = read.accept<TreeNode>(v);
+      read = v.transform(read);
       read?.parent = this;
     }
     if (write != null) {
-      write = write.accept<TreeNode>(v);
+      write = v.transform(write);
+      write?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (read != null) {
+      read = v.transformOrRemoveVariableDeclaration(read);
+      read?.parent = this;
+    }
+    if (write != null) {
+      write = v.transformOrRemoveVariableDeclaration(write);
       write?.parent = this;
     }
   }
@@ -2105,11 +2293,23 @@
   @override
   void transformChildren(Transformer v) {
     if (read != null) {
-      read = read.accept<TreeNode>(v);
+      read = v.transform(read);
       read?.parent = this;
     }
     if (write != null) {
-      write = write.accept<TreeNode>(v);
+      write = v.transform(write);
+      write?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (read != null) {
+      read = v.transform(read);
+      read?.parent = this;
+    }
+    if (write != null) {
+      write = v.transform(write);
       write?.parent = this;
     }
   }
@@ -2158,11 +2358,23 @@
   @override
   void transformChildren(Transformer v) {
     if (read != null) {
-      read = read.accept<TreeNode>(v);
+      read = v.transform(read);
       read?.parent = this;
     }
     if (write != null) {
-      write = write.accept<TreeNode>(v);
+      write = v.transform(write);
+      write?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (read != null) {
+      read = v.transformOrRemoveVariableDeclaration(read);
+      read?.parent = this;
+    }
+    if (write != null) {
+      write = v.transformOrRemoveVariableDeclaration(write);
       write?.parent = this;
     }
   }
@@ -2204,11 +2416,23 @@
   @override
   void transformChildren(Transformer v) {
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
+      receiver = v.transform(receiver);
       receiver?.parent = this;
     }
     if (index != null) {
-      index = index.accept<TreeNode>(v);
+      index = v.transform(index);
+      index?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (receiver != null) {
+      receiver = v.transformOrRemoveExpression(receiver);
+      receiver?.parent = this;
+    }
+    if (index != null) {
+      index = v.transformOrRemoveExpression(index);
       index?.parent = this;
     }
   }
@@ -2270,15 +2494,31 @@
   @override
   void transformChildren(Transformer v) {
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
+      receiver = v.transform(receiver);
       receiver?.parent = this;
     }
     if (index != null) {
-      index = index.accept<TreeNode>(v);
+      index = v.transform(index);
       index?.parent = this;
     }
     if (value != null) {
-      value = value.accept<TreeNode>(v);
+      value = v.transform(value);
+      value?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (receiver != null) {
+      receiver = v.transformOrRemoveExpression(receiver);
+      receiver?.parent = this;
+    }
+    if (index != null) {
+      index = v.transformOrRemoveExpression(index);
+      index?.parent = this;
+    }
+    if (value != null) {
+      value = v.transformOrRemoveExpression(value);
       value?.parent = this;
     }
   }
@@ -2335,11 +2575,23 @@
   @override
   void transformChildren(Transformer v) {
     if (index != null) {
-      index = index.accept<TreeNode>(v);
+      index = v.transform(index);
       index?.parent = this;
     }
     if (value != null) {
-      value = value.accept<TreeNode>(v);
+      value = v.transform(value);
+      value?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (index != null) {
+      index = v.transformOrRemoveExpression(index);
+      index?.parent = this;
+    }
+    if (value != null) {
+      value = v.transformOrRemoveExpression(value);
       value?.parent = this;
     }
   }
@@ -2416,15 +2668,31 @@
   @override
   void transformChildren(Transformer v) {
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
+      receiver = v.transform(receiver);
       receiver?.parent = this;
     }
     if (index != null) {
-      index = index.accept<TreeNode>(v);
+      index = v.transform(index);
       index?.parent = this;
     }
     if (value != null) {
-      value = value.accept<TreeNode>(v);
+      value = v.transform(value);
+      value?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (receiver != null) {
+      receiver = v.transformOrRemoveExpression(receiver);
+      receiver?.parent = this;
+    }
+    if (index != null) {
+      index = v.transformOrRemoveExpression(index);
+      index?.parent = this;
+    }
+    if (value != null) {
+      value = v.transformOrRemoveExpression(value);
       value?.parent = this;
     }
   }
@@ -2524,15 +2792,31 @@
   @override
   void transformChildren(Transformer v) {
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
+      receiver = v.transform(receiver);
       receiver?.parent = this;
     }
     if (index != null) {
-      index = index.accept<TreeNode>(v);
+      index = v.transform(index);
       index?.parent = this;
     }
     if (value != null) {
-      value = value.accept<TreeNode>(v);
+      value = v.transform(value);
+      value?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (receiver != null) {
+      receiver = v.transformOrRemoveExpression(receiver);
+      receiver?.parent = this;
+    }
+    if (index != null) {
+      index = v.transformOrRemoveExpression(index);
+      index?.parent = this;
+    }
+    if (value != null) {
+      value = v.transformOrRemoveExpression(value);
       value?.parent = this;
     }
   }
@@ -2615,11 +2899,23 @@
   @override
   void transformChildren(Transformer v) {
     if (index != null) {
-      index = index.accept<TreeNode>(v);
+      index = v.transform(index);
       index?.parent = this;
     }
     if (value != null) {
-      value = value.accept<TreeNode>(v);
+      value = v.transform(value);
+      value?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (index != null) {
+      index = v.transformOrRemoveExpression(index);
+      index?.parent = this;
+    }
+    if (value != null) {
+      value = v.transformOrRemoveExpression(value);
       value?.parent = this;
     }
   }
@@ -2715,15 +3011,31 @@
   @override
   void transformChildren(Transformer v) {
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
+      receiver = v.transform(receiver);
       receiver?.parent = this;
     }
     if (index != null) {
-      index = index.accept<TreeNode>(v);
+      index = v.transform(index);
       index?.parent = this;
     }
     if (value != null) {
-      value = value.accept<TreeNode>(v);
+      value = v.transform(value);
+      value?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (receiver != null) {
+      receiver = v.transformOrRemoveExpression(receiver);
+      receiver?.parent = this;
+    }
+    if (index != null) {
+      index = v.transformOrRemoveExpression(index);
+      index?.parent = this;
+    }
+    if (value != null) {
+      value = v.transformOrRemoveExpression(value);
       value?.parent = this;
     }
   }
@@ -2808,15 +3120,31 @@
   @override
   void transformChildren(Transformer v) {
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
+      receiver = v.transform(receiver);
       receiver?.parent = this;
     }
     if (index != null) {
-      index = index.accept<TreeNode>(v);
+      index = v.transform(index);
       index?.parent = this;
     }
     if (rhs != null) {
-      rhs = rhs.accept<TreeNode>(v);
+      rhs = v.transform(rhs);
+      rhs?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (receiver != null) {
+      receiver = v.transformOrRemoveExpression(receiver);
+      receiver?.parent = this;
+    }
+    if (index != null) {
+      index = v.transformOrRemoveExpression(index);
+      index?.parent = this;
+    }
+    if (rhs != null) {
+      rhs = v.transformOrRemoveExpression(rhs);
       rhs?.parent = this;
     }
   }
@@ -2947,11 +3275,23 @@
   @override
   void transformChildren(Transformer v) {
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
+      receiver = v.transform(receiver);
       receiver?.parent = this;
     }
     if (rhs != null) {
-      rhs = rhs.accept<TreeNode>(v);
+      rhs = v.transform(rhs);
+      rhs?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (receiver != null) {
+      receiver = v.transformOrRemoveExpression(receiver);
+      receiver?.parent = this;
+    }
+    if (rhs != null) {
+      rhs = v.transformOrRemoveExpression(rhs);
       rhs?.parent = this;
     }
   }
@@ -3056,11 +3396,23 @@
   @override
   void transformChildren(Transformer v) {
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
+      receiver = v.transform(receiver);
       receiver?.parent = this;
     }
     if (value != null) {
-      value = value.accept<TreeNode>(v);
+      value = v.transform(value);
+      value?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (receiver != null) {
+      receiver = v.transformOrRemoveExpression(receiver);
+      receiver?.parent = this;
+    }
+    if (value != null) {
+      value = v.transformOrRemoveExpression(value);
       value?.parent = this;
     }
   }
@@ -3156,11 +3508,23 @@
   @override
   void transformChildren(Transformer v) {
     if (index != null) {
-      index = index.accept<TreeNode>(v);
+      index = v.transform(index);
       index?.parent = this;
     }
     if (rhs != null) {
-      rhs = rhs.accept<TreeNode>(v);
+      rhs = v.transform(rhs);
+      rhs?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (index != null) {
+      index = v.transformOrRemoveExpression(index);
+      index?.parent = this;
+    }
+    if (rhs != null) {
+      rhs = v.transformOrRemoveExpression(rhs);
       rhs?.parent = this;
     }
   }
@@ -3274,15 +3638,31 @@
   @override
   void transformChildren(Transformer v) {
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
+      receiver = v.transform(receiver);
       receiver?.parent = this;
     }
     if (index != null) {
-      index = index.accept<TreeNode>(v);
+      index = v.transform(index);
       index?.parent = this;
     }
     if (rhs != null) {
-      rhs = rhs.accept<TreeNode>(v);
+      rhs = v.transform(rhs);
+      rhs?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (receiver != null) {
+      receiver = v.transformOrRemoveExpression(receiver);
+      receiver?.parent = this;
+    }
+    if (index != null) {
+      index = v.transformOrRemoveExpression(index);
+      index?.parent = this;
+    }
+    if (rhs != null) {
+      rhs = v.transformOrRemoveExpression(rhs);
       rhs?.parent = this;
     }
   }
@@ -3360,11 +3740,23 @@
   @override
   void transformChildren(Transformer v) {
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
+      receiver = v.transform(receiver);
       receiver?.parent = this;
     }
     if (value != null) {
-      value = value.accept<TreeNode>(v);
+      value = v.transform(value);
+      value?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (receiver != null) {
+      receiver = v.transform(receiver);
+      receiver?.parent = this;
+    }
+    if (value != null) {
+      value = v.transform(value);
       value?.parent = this;
     }
   }
@@ -3411,11 +3803,23 @@
   @override
   void transformChildren(Transformer v) {
     if (variable != null) {
-      variable = variable.accept<TreeNode>(v);
+      variable = v.transform(variable);
       variable?.parent = this;
     }
     if (expression != null) {
-      expression = expression.accept<TreeNode>(v);
+      expression = v.transform(expression);
+      expression?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (variable != null) {
+      variable = v.transformOrRemoveVariableDeclaration(variable);
+      variable?.parent = this;
+    }
+    if (expression != null) {
+      expression = v.transformOrRemoveExpression(expression);
       expression?.parent = this;
     }
   }
@@ -3486,7 +3890,15 @@
   @override
   void transformChildren(Transformer v) {
     if (arguments != null) {
-      arguments = arguments.accept<TreeNode>(v);
+      arguments = v.transform(arguments);
+      arguments?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (arguments != null) {
+      arguments = v.transformOrRemove(arguments, dummyArguments);
       arguments?.parent = this;
     }
   }
@@ -3527,11 +3939,23 @@
   @override
   void transformChildren(Transformer v) {
     if (left != null) {
-      left = left.accept<TreeNode>(v);
+      left = v.transform(left);
       left?.parent = this;
     }
     if (right != null) {
-      right = right.accept<TreeNode>(v);
+      right = v.transform(right);
+      right?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (left != null) {
+      left = v.transformOrRemoveExpression(left);
+      left?.parent = this;
+    }
+    if (right != null) {
+      right = v.transformOrRemoveExpression(right);
       right?.parent = this;
     }
   }
@@ -3582,11 +4006,23 @@
   @override
   void transformChildren(Transformer v) {
     if (left != null) {
-      left = left.accept<TreeNode>(v);
+      left = v.transform(left);
       left?.parent = this;
     }
     if (right != null) {
-      right = right.accept<TreeNode>(v);
+      right = v.transform(right);
+      right?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (left != null) {
+      left = v.transformOrRemoveExpression(left);
+      left?.parent = this;
+    }
+    if (right != null) {
+      right = v.transformOrRemoveExpression(right);
       right?.parent = this;
     }
   }
@@ -3633,7 +4069,15 @@
   @override
   void transformChildren(Transformer v) {
     if (expression != null) {
-      expression = expression.accept<TreeNode>(v);
+      expression = v.transform(expression);
+      expression?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (expression != null) {
+      expression = v.transformOrRemoveExpression(expression);
       expression?.parent = this;
     }
   }
@@ -3682,7 +4126,15 @@
   @override
   void transformChildren(Transformer v) {
     if (expression != null) {
-      expression = expression.accept<TreeNode>(v);
+      expression = v.transform(expression);
+      expression?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (expression != null) {
+      expression = v.transformOrRemoveExpression(expression);
       expression?.parent = this;
     }
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart b/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart
index c361101..93b6350 100644
--- a/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 import 'package:kernel/visitor.dart';
 
 import '../type_inference/type_schema.dart';
diff --git a/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart b/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart
index 577359b..1f87bde 100644
--- a/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 import 'package:kernel/core_types.dart';
 
 import '../../base/nnbd_mode.dart';
diff --git a/pkg/front_end/lib/src/fasta/kernel/member_covariance.dart b/pkg/front_end/lib/src/fasta/kernel/member_covariance.dart
index 6d4a9f1..c4901b9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/member_covariance.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/member_covariance.dart
@@ -6,7 +6,7 @@
 
 import 'dart:math';
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 
 /// Class that holds the covariant and generic-covariant-impl information for
 /// a member.
diff --git a/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart b/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
index 220157ef..0866c33 100644
--- a/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
@@ -6,8 +6,6 @@
 
 library fasta.transform_collections;
 
-import 'dart:core' hide MapEntry;
-
 import 'package:kernel/ast.dart';
 
 import 'package:kernel/core_types.dart' show CoreTypes;
@@ -281,8 +279,8 @@
         element.condition?.accept<TreeNode>(this),
         element.updates,
         loopBody);
-    transformList(loop.variables, this, loop);
-    transformList(loop.updates, this, loop);
+    transformList(loop.variables, loop);
+    transformList(loop.updates, loop);
     _dataForTesting?.registerAlias(element, loop);
     body.add(loop);
   }
@@ -533,8 +531,8 @@
     ForStatement loop = _createForStatement(entry.fileOffset, entry.variables,
         entry.condition?.accept<TreeNode>(this), entry.updates, loopBody);
     _dataForTesting?.registerAlias(entry, loop);
-    transformList(loop.variables, this, loop);
-    transformList(loop.updates, this, loop);
+    transformList(loop.variables, loop);
+    transformList(loop.updates, loop);
     body.add(loop);
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart b/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart
index 250493f..7195f01 100644
--- a/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart
@@ -6,8 +6,6 @@
 
 library fasta.transform_set_literals;
 
-import 'dart:core' hide MapEntry;
-
 import 'package:kernel/ast.dart';
 
 import 'package:kernel/core_types.dart' show CoreTypes;
diff --git a/pkg/front_end/lib/src/fasta/kernel/verifier.dart b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
index ddfef29..468697e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/verifier.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
@@ -6,8 +6,6 @@
 
 library fasta.verifier;
 
-import 'dart:core' hide MapEntry;
-
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
 
 import 'package:kernel/ast.dart';
diff --git a/pkg/front_end/lib/src/fasta/scope.dart b/pkg/front_end/lib/src/fasta/scope.dart
index 4f8e52b..004901a 100644
--- a/pkg/front_end/lib/src/fasta/scope.dart
+++ b/pkg/front_end/lib/src/fasta/scope.dart
@@ -6,7 +6,7 @@
 
 library fasta.scope;
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 import 'package:kernel/core_types.dart';
 
 import 'builder/builder.dart';
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 6d6dca8..92ac343 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -7,7 +7,7 @@
 library fasta.source_class_builder;
 
 import 'package:front_end/src/fasta/kernel/combined_member_signature.dart';
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 import 'package:kernel/reference_from_index.dart' show IndexedClass;
 import 'package:kernel/src/bounds_checks.dart';
diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
index 1538023..a1f535a 100644
--- a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
@@ -4,8 +4,6 @@
 
 // @dart = 2.9
 
-import 'dart:core' hide MapEntry;
-
 import 'package:kernel/ast.dart';
 import 'package:kernel/type_environment.dart';
 
diff --git a/pkg/front_end/lib/src/fasta/type_inference/factor_type.dart b/pkg/front_end/lib/src/fasta/type_inference/factor_type.dart
index a72c547..7e90983 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/factor_type.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/factor_type.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 import 'package:kernel/type_environment.dart';
 
 /// Computes the "remainder" of [T] when [S] has been removed from consideration
diff --git a/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart b/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
index 4039519..24f2850 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
@@ -4,8 +4,6 @@
 
 // @dart = 2.9
 
-import 'dart:core' hide MapEntry;
-
 import 'package:kernel/ast.dart';
 
 import 'package:kernel/core_types.dart' show CoreTypes;
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
index 705469d..569d058 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 
 import 'package:kernel/core_types.dart';
 
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_demotion.dart b/pkg/front_end/lib/src/fasta/type_inference/type_demotion.dart
index c75bd34..f391d17 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_demotion.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_demotion.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 import 'package:kernel/src/replacement_visitor.dart';
 
 /// Returns `true` if type contains a promoted type variable.
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 58ad7fc..a61e28f 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -7,8 +7,7 @@
 import 'dart:core' hide MapEntry;
 import 'dart:core' as core;
 
-import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart'
-    hide Reference; // Work around https://github.com/dart-lang/sdk/issues/44667
+import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart';
 
 import 'package:_fe_analyzer_shared/src/testing/id.dart';
 import 'package:_fe_analyzer_shared/src/util/link.dart';
@@ -17,8 +16,7 @@
 import 'package:front_end/src/fasta/type_inference/type_demotion.dart';
 import 'package:front_end/src/testing/id_extractor.dart';
 
-import 'package:kernel/ast.dart'
-    hide Reference; // Work around https://github.com/dart-lang/sdk/issues/44667
+import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 import 'package:kernel/core_types.dart' show CoreTypes;
 import 'package:kernel/type_algebra.dart';
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart
index f6598b6..9e7c2ea 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 import 'package:kernel/src/replacement_visitor.dart';
 
 import 'type_schema.dart' show UnknownType;
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
index 5e32e19..7b37c14 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 3858ee0..30beca7e 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -375,6 +375,7 @@
 enforce
 enforced
 enforces
+enforcing
 enumerates
 env
 eof
diff --git a/pkg/front_end/test/text_representation/empty_reference_test.dart b/pkg/front_end/test/text_representation/empty_reference_test.dart
index 22643b3..a33bd6b 100644
--- a/pkg/front_end/test/text_representation/empty_reference_test.dart
+++ b/pkg/front_end/test/text_representation/empty_reference_test.dart
@@ -85,7 +85,7 @@
 void testMembers() {
   testExpression(new PropertyGet(new IntLiteral(0), new Name('foo')), '''
 0.foo''');
-  testExpression(new StaticGet(null), '''
+  testExpression(new StaticGet.byReference(null), '''
 <missing-member-reference>''');
 
   Reference unlinkedMemberName = new Reference();
diff --git a/pkg/front_end/tool/_fasta/bench_maker.dart b/pkg/front_end/tool/_fasta/bench_maker.dart
index dbfbb79..32e478f 100644
--- a/pkg/front_end/tool/_fasta/bench_maker.dart
+++ b/pkg/front_end/tool/_fasta/bench_maker.dart
@@ -10,7 +10,7 @@
 
 import "dart:io" show File;
 
-import "package:kernel/ast.dart" hide MapEntry;
+import "package:kernel/ast.dart";
 
 import "package:front_end/src/fasta/type_inference/type_schema.dart"
     show UnknownType;
diff --git a/pkg/front_end/tool/_fasta/generate_experimental_flags.dart b/pkg/front_end/tool/_fasta/generate_experimental_flags.dart
index 5911b3a..c3ec736 100644
--- a/pkg/front_end/tool/_fasta/generate_experimental_flags.dart
+++ b/pkg/front_end/tool/_fasta/generate_experimental_flags.dart
@@ -63,8 +63,6 @@
 // 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.
 
-// @dart = 2.9
-
 // NOTE: THIS FILE IS GENERATED. DO NOT EDIT.
 //
 // Instead modify 'tools/experimental_features.yaml' and run
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index fa63366..fd0b0bc 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -2,8 +2,6 @@
 // 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.
 
-// @dart = 2.9
-
 /// -----------------------------------------------------------------------
 ///                          WHEN CHANGING THIS FILE:
 /// -----------------------------------------------------------------------
@@ -142,7 +140,7 @@
   final int hashCode = _hashCounter = (_hashCounter + 1) & 0x3fffffff;
   static const int noOffset = -1;
 
-  TreeNode parent;
+  TreeNode? parent;
 
   /// Offset in the source file it comes from.
   ///
@@ -151,8 +149,10 @@
   int fileOffset = noOffset;
 
   R accept<R>(TreeVisitor<R> v);
+  R accept1<R, A>(TreeVisitor1<R, A> v, A arg);
   void visitChildren(Visitor v);
   void transformChildren(Transformer v);
+  void transformOrRemoveChildren(RemovingTransformer v);
 
   /// Replaces [child] with [replacement].
   ///
@@ -164,6 +164,7 @@
   ///
   /// [replacement] must be non-null.
   void replaceChild(TreeNode child, TreeNode replacement) {
+    // ignore: unnecessary_null_comparison
     assert(replacement != null);
     transformChildren(new _ChildReplacer(child, replacement));
   }
@@ -176,24 +177,26 @@
   ///
   /// [replacement] must be non-null.
   void replaceWith(TreeNode replacement) {
+    // ignore: unnecessary_null_comparison
     assert(replacement != null);
-    parent.replaceChild(this, replacement);
+    parent!.replaceChild(this, replacement);
     parent = null;
   }
 
-  Component get enclosingComponent => parent?.enclosingComponent;
+  // TODO(johnniwinther): Make this non-nullable.
+  Component? get enclosingComponent => parent?.enclosingComponent;
 
   /// Returns the best known source location of the given AST node, or `null` if
   /// the node is orphaned.
   ///
   /// This getter is intended for diagnostics and debugging, and should be
   /// avoided in production code.
-  Location get location {
+  Location? get location {
     if (fileOffset == noOffset) return parent?.location;
     return _getLocationInEnclosingFile(fileOffset);
   }
 
-  Location _getLocationInEnclosingFile(int offset) {
+  Location? _getLocationInEnclosingFile(int offset) {
     return parent?._getLocationInEnclosingFile(offset);
   }
 }
@@ -205,17 +208,16 @@
 abstract class NamedNode extends TreeNode {
   final Reference reference;
 
-  NamedNode(Reference reference)
+  NamedNode(Reference? reference)
       : this.reference = reference ?? new Reference() {
     if (this is Field) {
-      Field me = this;
-      me.getterReference.node = this;
+      (this as Field).getterReference.node = this;
     } else {
       this.reference.node = this;
     }
   }
 
-  CanonicalName get canonicalName => reference?.canonicalName;
+  CanonicalName? get canonicalName => reference.canonicalName;
 
   /// This is an advanced feature.
   ///
@@ -229,7 +231,8 @@
 
 abstract class FileUriNode extends TreeNode {
   /// The URI of the source file this node was loaded from.
-  Uri get fileUri;
+  // TODO(johnniwinther): Make this non-nullable.
+  Uri? get fileUri;
 }
 
 abstract class Annotatable extends TreeNode {
@@ -241,17 +244,17 @@
 ///
 /// There is only one reference object per [NamedNode].
 class Reference {
-  CanonicalName canonicalName;
+  CanonicalName? canonicalName;
 
-  NamedNode _node;
+  NamedNode? _node;
 
-  NamedNode get node {
+  NamedNode? get node {
     if (_node == null) {
       // Either this is an unbound reference or it belongs to a lazy-loaded
       // (and not yet loaded) class. If it belongs to a lazy-loaded class,
       // load the class.
 
-      CanonicalName canonicalNameParent = canonicalName?.parent;
+      CanonicalName? canonicalNameParent = canonicalName?.parent;
       while (canonicalNameParent != null) {
         if (canonicalNameParent.name.startsWith("@")) {
           break;
@@ -259,8 +262,8 @@
         canonicalNameParent = canonicalNameParent.parent;
       }
       if (canonicalNameParent != null) {
-        NamedNode parentNamedNode =
-            canonicalNameParent?.parent?.reference?._node;
+        NamedNode? parentNamedNode =
+            canonicalNameParent.parent?.reference?._node;
         if (parentNamedNode is Class) {
           Class parentClass = parentNamedNode;
           if (parentClass.lazyBuilder != null) {
@@ -272,7 +275,7 @@
     return _node;
   }
 
-  void set node(NamedNode node) {
+  void set node(NamedNode? node) {
     _node = node;
   }
 
@@ -282,10 +285,10 @@
 
   String toStringInternal() {
     if (canonicalName != null) {
-      return '${canonicalName.toStringInternal()}';
+      return '${canonicalName!.toStringInternal()}';
     }
     if (node != null) {
-      return node.toStringInternal();
+      return node!.toStringInternal();
     }
     return 'Unbound reference';
   }
@@ -356,12 +359,14 @@
   Uri importUri;
 
   /// The URI of the source file this library was loaded from.
-  Uri fileUri;
+  @override
+  Uri? fileUri;
 
-  Version _languageVersion;
+  Version? _languageVersion;
   Version get languageVersion => _languageVersion ?? defaultLanguageVersion;
 
   void setLanguageVersion(Version languageVersion) {
+    // ignore: unnecessary_null_comparison
     if (languageVersion == null) {
       throw new StateError("Trying to set language version 'null'");
     }
@@ -421,14 +426,15 @@
     }
   }
 
-  String name;
+  String? name;
 
   /// Problems in this [Library] encoded as json objects.
   ///
   /// Note that this field can be null, and by convention should be null if the
   /// list is empty.
-  List<String> problemsAsJson;
+  List<String>? problemsAsJson;
 
+  @override
   final List<Expression> annotations;
 
   final List<LibraryDependency> dependencies;
@@ -449,16 +455,16 @@
 
   Library(this.importUri,
       {this.name,
-      List<Expression> annotations,
-      List<LibraryDependency> dependencies,
-      List<LibraryPart> parts,
-      List<Typedef> typedefs,
-      List<Class> classes,
-      List<Extension> extensions,
-      List<Procedure> procedures,
-      List<Field> fields,
+      List<Expression>? annotations,
+      List<LibraryDependency>? dependencies,
+      List<LibraryPart>? parts,
+      List<Typedef>? typedefs,
+      List<Class>? classes,
+      List<Extension>? extensions,
+      List<Procedure>? procedures,
+      List<Field>? fields,
       this.fileUri,
-      Reference reference})
+      Reference? reference})
       : this.annotations = annotations ?? <Expression>[],
         this.dependencies = dependencies ?? <LibraryDependency>[],
         this.parts = parts ?? <LibraryPart>[],
@@ -501,6 +507,7 @@
   Iterable<Member> get members =>
       <Iterable<Member>>[fields, procedures].expand((x) => x);
 
+  @override
   void addAnnotation(Expression node) {
     node.parent = this;
     annotations.add(node);
@@ -532,7 +539,7 @@
   }
 
   void computeCanonicalNames() {
-    assert(canonicalName != null);
+    CanonicalName canonicalName = this.canonicalName!;
     for (int i = 0; i < typedefs.length; ++i) {
       Typedef typedef_ = typedefs[i];
       canonicalName.getChildFromTypedef(typedef_).bindTo(typedef_.reference);
@@ -543,7 +550,7 @@
       if (field.hasSetter) {
         canonicalName
             .getChildFromFieldSetter(field)
-            .bindTo(field.setterReference);
+            .bindTo(field.setterReference!);
       }
     }
     for (int i = 0; i < procedures.length; ++i) {
@@ -552,12 +559,12 @@
     }
     for (int i = 0; i < classes.length; ++i) {
       Class class_ = classes[i];
-      canonicalName.getChild(class_.name).bindTo(class_.reference);
+      canonicalName.getChild(class_.name!).bindTo(class_.reference);
       class_.computeCanonicalNames();
     }
     for (int i = 0; i < extensions.length; ++i) {
       Extension extension = extensions[i];
-      canonicalName.getChild(extension.name).bindTo(extension.reference);
+      canonicalName.getChild(extension.name!).bindTo(extension.reference);
     }
   }
 
@@ -600,9 +607,14 @@
     parts.add(node..parent = this);
   }
 
+  @override
   R accept<R>(TreeVisitor<R> v) => v.visitLibrary(this);
 
-  visitChildren(Visitor v) {
+  @override
+  R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitLibrary(this, arg);
+
+  @override
+  void visitChildren(Visitor v) {
     visitList(annotations, v);
     visitList(dependencies, v);
     visitList(parts, v);
@@ -613,20 +625,34 @@
     visitList(fields, v);
   }
 
-  transformChildren(Transformer v) {
-    transformList(annotations, v, this);
-    transformList(dependencies, v, this);
-    transformList(parts, v, this);
-    transformList(typedefs, v, this);
-    transformList(classes, v, this);
-    transformList(extensions, v, this);
-    transformList(procedures, v, this);
-    transformList(fields, v, this);
+  @override
+  void transformChildren(Transformer v) {
+    v.transformList(annotations, this);
+    v.transformList(dependencies, this);
+    v.transformList(parts, this);
+    v.transformList(typedefs, this);
+    v.transformList(classes, this);
+    v.transformList(extensions, this);
+    v.transformList(procedures, this);
+    v.transformList(fields, this);
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    v.transformExpressionList(annotations, this);
+    v.transformLibraryDependencyList(dependencies, this);
+    v.transformLibraryPartList(parts, this);
+    v.transformTypedefList(typedefs, this);
+    v.transformClassList(classes, this);
+    v.transformExtensionList(extensions, this);
+    v.transformProcedureList(procedures, this);
+    v.transformFieldList(fields, this);
   }
 
   static int _libraryIdCounter = 0;
   int _libraryId = ++_libraryIdCounter;
 
+  @override
   int compareTo(Library other) => _libraryId - other._libraryId;
 
   /// Returns a possibly synthesized name for this library, consistent with
@@ -639,7 +665,7 @@
     printer.write(libraryNameToString(this));
   }
 
-  Location _getLocationInEnclosingFile(int offset) {
+  Location? _getLocationInEnclosingFile(int offset) {
     return _getLocationInComponent(enclosingComponent, fileUri, offset);
   }
 
@@ -667,7 +693,7 @@
   /// with a prefix.
   ///
   /// Must be non-null for deferred imports, and must be null for exports.
-  String name;
+  String? name;
 
   final List<Combinator> combinators;
 
@@ -677,17 +703,19 @@
             flags, annotations, importedLibrary.reference, name, combinators);
 
   LibraryDependency.deferredImport(Library importedLibrary, String name,
-      {List<Combinator> combinators, List<Expression> annotations})
+      {List<Combinator>? combinators, List<Expression>? annotations})
       : this.byReference(DeferredFlag, annotations ?? <Expression>[],
             importedLibrary.reference, name, combinators ?? <Combinator>[]);
 
   LibraryDependency.import(Library importedLibrary,
-      {String name, List<Combinator> combinators, List<Expression> annotations})
+      {String? name,
+      List<Combinator>? combinators,
+      List<Expression>? annotations})
       : this.byReference(0, annotations ?? <Expression>[],
             importedLibrary.reference, name, combinators ?? <Combinator>[]);
 
   LibraryDependency.export(Library importedLibrary,
-      {List<Combinator> combinators, List<Expression> annotations})
+      {List<Combinator>? combinators, List<Expression>? annotations})
       : this.byReference(ExportFlag, annotations ?? <Expression>[],
             importedLibrary.reference, null, combinators ?? <Combinator>[]);
 
@@ -697,7 +725,7 @@
     setParents(combinators, this);
   }
 
-  Library get enclosingLibrary => parent;
+  Library get enclosingLibrary => parent as Library;
   Library get targetLibrary => importedLibraryReference.asLibrary;
 
   static const int ExportFlag = 1 << 0;
@@ -711,16 +739,29 @@
     annotations.add(annotation..parent = this);
   }
 
+  @override
   R accept<R>(TreeVisitor<R> v) => v.visitLibraryDependency(this);
 
-  visitChildren(Visitor v) {
+  @override
+  R accept1<R, A>(TreeVisitor1<R, A> v, A arg) =>
+      v.visitLibraryDependency(this, arg);
+
+  @override
+  void visitChildren(Visitor v) {
     visitList(annotations, v);
     visitList(combinators, v);
   }
 
-  transformChildren(Transformer v) {
-    transformList(annotations, v, this);
-    transformList(combinators, v, this);
+  @override
+  void transformChildren(Transformer v) {
+    v.transformList(annotations, this);
+    v.transformList(combinators, this);
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    v.transformExpressionList(annotations, this);
+    v.transformCombinatorList(combinators, this);
   }
 
   @override
@@ -751,14 +792,25 @@
     annotations.add(annotation..parent = this);
   }
 
+  @override
   R accept<R>(TreeVisitor<R> v) => v.visitLibraryPart(this);
 
-  visitChildren(Visitor v) {
+  @override
+  R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitLibraryPart(this, arg);
+
+  @override
+  void visitChildren(Visitor v) {
     visitList(annotations, v);
   }
 
-  transformChildren(Transformer v) {
-    transformList(annotations, v, this);
+  @override
+  void transformChildren(Transformer v) {
+    v.transformList(annotations, this);
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    v.transformExpressionList(annotations, this);
   }
 
   @override
@@ -778,7 +830,7 @@
 
   final List<String> names;
 
-  LibraryDependency get dependency => parent;
+  LibraryDependency get dependency => parent as LibraryDependency;
 
   Combinator(this.isShow, this.names);
   Combinator.show(this.names) : isShow = true;
@@ -790,10 +842,16 @@
   R accept<R>(TreeVisitor<R> v) => v.visitCombinator(this);
 
   @override
-  visitChildren(Visitor v) {}
+  R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitCombinator(this, arg);
 
   @override
-  transformChildren(Transformer v) {}
+  void visitChildren(Visitor v) {}
+
+  @override
+  void transformChildren(Transformer v) {}
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {}
 
   @override
   String toString() {
@@ -809,11 +867,13 @@
 /// Declaration of a type alias.
 class Typedef extends NamedNode implements FileUriNode {
   /// The URI of the source file that contains the declaration of this typedef.
-  Uri fileUri;
+  @override
+  Uri? fileUri;
+
   List<Expression> annotations = const <Expression>[];
   String name;
   final List<TypeParameter> typeParameters;
-  DartType type;
+  DartType? type;
 
   // The following two fields describe parameters of the underlying type when
   // that is a function type.  They are needed to keep such attributes as names
@@ -824,12 +884,12 @@
   final List<VariableDeclaration> namedParameters;
 
   Typedef(this.name, this.type,
-      {Reference reference,
+      {Reference? reference,
       this.fileUri,
-      List<TypeParameter> typeParameters,
-      List<TypeParameter> typeParametersOfFunctionType,
-      List<VariableDeclaration> positionalParameters,
-      List<VariableDeclaration> namedParameters})
+      List<TypeParameter>? typeParameters,
+      List<TypeParameter>? typeParametersOfFunctionType,
+      List<VariableDeclaration>? positionalParameters,
+      List<VariableDeclaration>? namedParameters})
       : this.typeParameters = typeParameters ?? <TypeParameter>[],
         this.typeParametersOfFunctionType =
             typeParametersOfFunctionType ?? <TypeParameter>[],
@@ -840,26 +900,44 @@
     setParents(this.typeParameters, this);
   }
 
-  Library get enclosingLibrary => parent;
+  Library get enclosingLibrary => parent as Library;
 
-  R accept<R>(TreeVisitor<R> v) {
-    return v.visitTypedef(this);
-  }
+  @override
+  R accept<R>(TreeVisitor<R> v) => v.visitTypedef(this);
 
-  transformChildren(Transformer v) {
-    transformList(annotations, v, this);
-    transformList(typeParameters, v, this);
-    if (type != null) {
-      type = v.visitDartType(type);
-    }
-  }
+  @override
+  R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitTypedef(this, arg);
 
-  visitChildren(Visitor v) {
+  @override
+  void visitChildren(Visitor v) {
     visitList(annotations, v);
     visitList(typeParameters, v);
     type?.accept(v);
   }
 
+  @override
+  void transformChildren(Transformer v) {
+    v.transformList(annotations, this);
+    v.transformList(typeParameters, this);
+    if (type != null) {
+      type = v.visitDartType(type!);
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    v.transformExpressionList(annotations, this);
+    v.transformTypeParameterList(typeParameters, this);
+    if (type != null) {
+      DartType newType = v.visitDartType(type!, dummyDartType);
+      if (identical(newType, dummyDartType)) {
+        type = null;
+      } else {
+        type = newType;
+      }
+    }
+  }
+
   void addAnnotation(Expression node) {
     if (annotations.isEmpty) {
       annotations = <Expression>[];
@@ -868,8 +946,9 @@
     node.parent = this;
   }
 
-  Location _getLocationInEnclosingFile(int offset) {
-    return _getLocationInComponent(enclosingComponent, fileUri, offset);
+  @override
+  Location? _getLocationInEnclosingFile(int offset) {
+    return _getLocationInComponent(enclosingComponent, fileUri!, offset);
   }
 
   @override
@@ -943,6 +1022,7 @@
   ///
   /// This defaults to an immutable empty list. Use [addAnnotation] to add
   /// annotations if needed.
+  @override
   List<Expression> annotations = const <Expression>[];
 
   /// Name of the class.
@@ -952,7 +1032,8 @@
   /// The name may contain characters that are not valid in a Dart identifier,
   /// in particular, the symbol '&' is used in class names generated for mixin
   /// applications.
-  String name;
+  // TODO(johnniwinther): Make this non-nullable.
+  String? name;
 
   // Must match serialized bit positions.
   static const int FlagAbstract = 1 << 0;
@@ -1037,7 +1118,7 @@
     // Otherwise we have a left-linear binary tree (subtrees are supertype and
     // mixedInType) of constraints, where all the interior nodes are anonymous
     // mixin applications.
-    Supertype current = supertype;
+    Supertype? current = supertype;
     while (current != null && current.classNode.isAnonymousMixin) {
       Class currentClass = current.classNode;
       assert(currentClass.implementedTypes.length == 2);
@@ -1047,19 +1128,20 @@
       current =
           substitution.substituteSupertype(currentClass.implementedTypes[0]);
     }
-    return constraints..add(current);
+    return constraints..add(current!);
   }
 
   /// The URI of the source file this class was loaded from.
-  Uri fileUri;
+  @override
+  Uri? fileUri;
 
   final List<TypeParameter> typeParameters;
 
   /// The immediate super type, or `null` if this is the root class.
-  Supertype supertype;
+  Supertype? supertype;
 
   /// The mixed-in type if this is a mixin application, otherwise `null`.
-  Supertype mixedInType;
+  Supertype? mixedInType;
 
   /// The types from the `implements` clause.
   final List<Supertype> implementedTypes;
@@ -1069,14 +1151,14 @@
   /// If non-null, the function that will have to be called to fill-out the
   /// content of this class. Note that this should not be called directly
   /// though.
-  void Function() lazyBuilder;
+  void Function()? lazyBuilder;
 
   /// Makes sure the class is loaded, i.e. the fields, procedures etc have been
   /// loaded from the dill. Generally, one should not need to call this as it is
   /// done automatically when accessing the lists.
   void ensureLoaded() {
-    if (lazyBuilder != null) {
-      void Function() lazyBuilderLocal = lazyBuilder;
+    void Function()? lazyBuilderLocal = lazyBuilder;
+    if (lazyBuilderLocal != null) {
       lazyBuilder = null;
       lazyBuilderLocal();
     }
@@ -1086,7 +1168,7 @@
   ///
   /// Used for adding fields when reading the dill file.
   final List<Field> fieldsInternal;
-  DirtifyingList<Field> _fieldsView;
+  DirtifyingList<Field>? _fieldsView;
 
   /// Fields declared in the class.
   ///
@@ -1095,30 +1177,28 @@
     ensureLoaded();
     // If already dirty the caller just might as well add stuff directly too.
     if (dirty) return fieldsInternal;
-    _fieldsView ??= new DirtifyingList(this, fieldsInternal);
-    return _fieldsView;
+    return _fieldsView ??= new DirtifyingList(this, fieldsInternal);
   }
 
   /// Internal. Should *ONLY* be used from within kernel.
   ///
   /// Used for adding constructors when reading the dill file.
   final List<Constructor> constructorsInternal;
-  DirtifyingList<Constructor> _constructorsView;
+  DirtifyingList<Constructor>? _constructorsView;
 
   /// Constructors declared in the class.
   List<Constructor> get constructors {
     ensureLoaded();
     // If already dirty the caller just might as well add stuff directly too.
     if (dirty) return constructorsInternal;
-    _constructorsView ??= new DirtifyingList(this, constructorsInternal);
-    return _constructorsView;
+    return _constructorsView ??= new DirtifyingList(this, constructorsInternal);
   }
 
   /// Internal. Should *ONLY* be used from within kernel.
   ///
   /// Used for adding procedures when reading the dill file.
   final List<Procedure> proceduresInternal;
-  DirtifyingList<Procedure> _proceduresView;
+  DirtifyingList<Procedure>? _proceduresView;
 
   /// Procedures declared in the class.
   ///
@@ -1127,8 +1207,7 @@
     ensureLoaded();
     // If already dirty the caller just might as well add stuff directly too.
     if (dirty) return proceduresInternal;
-    _proceduresView ??= new DirtifyingList(this, proceduresInternal);
-    return _proceduresView;
+    return _proceduresView ??= new DirtifyingList(this, proceduresInternal);
   }
 
   /// Internal. Should *ONLY* be used from within kernel.
@@ -1137,7 +1216,7 @@
   /// file.
   final List<RedirectingFactoryConstructor>
       redirectingFactoryConstructorsInternal;
-  DirtifyingList<RedirectingFactoryConstructor>
+  DirtifyingList<RedirectingFactoryConstructor>?
       _redirectingFactoryConstructorsView;
 
   /// Redirecting factory constructors declared in the class.
@@ -1147,9 +1226,8 @@
     ensureLoaded();
     // If already dirty the caller just might as well add stuff directly too.
     if (dirty) return redirectingFactoryConstructorsInternal;
-    _redirectingFactoryConstructorsView ??=
+    return _redirectingFactoryConstructorsView ??=
         new DirtifyingList(this, redirectingFactoryConstructorsInternal);
-    return _redirectingFactoryConstructorsView;
   }
 
   Class(
@@ -1158,14 +1236,14 @@
       bool isAnonymousMixin: false,
       this.supertype,
       this.mixedInType,
-      List<TypeParameter> typeParameters,
-      List<Supertype> implementedTypes,
-      List<Constructor> constructors,
-      List<Procedure> procedures,
-      List<Field> fields,
-      List<RedirectingFactoryConstructor> redirectingFactoryConstructors,
+      List<TypeParameter>? typeParameters,
+      List<Supertype>? implementedTypes,
+      List<Constructor>? constructors,
+      List<Procedure>? procedures,
+      List<Field>? fields,
+      List<RedirectingFactoryConstructor>? redirectingFactoryConstructors,
       this.fileUri,
-      Reference reference})
+      Reference? reference})
       : this.typeParameters = typeParameters ?? <TypeParameter>[],
         this.implementedTypes = implementedTypes ?? <Supertype>[],
         this.fieldsInternal = fields ?? <Field>[],
@@ -1184,7 +1262,7 @@
   }
 
   void computeCanonicalNames() {
-    assert(canonicalName != null);
+    CanonicalName canonicalName = this.canonicalName!;
     if (!dirty) return;
     for (int i = 0; i < fields.length; ++i) {
       Field member = fields[i];
@@ -1192,7 +1270,7 @@
       if (member.hasSetter) {
         canonicalName
             .getChildFromFieldSetter(member)
-            .bindTo(member.setterReference);
+            .bindTo(member.setterReference!);
       }
     }
     for (int i = 0; i < procedures.length; ++i) {
@@ -1241,13 +1319,13 @@
   }
 
   /// The immediate super class, or `null` if this is the root class.
-  Class get superclass => supertype?.classNode;
+  Class? get superclass => supertype?.classNode;
 
   /// The mixed-in class if this is a mixin application, otherwise `null`.
   ///
   /// Note that this may itself be a mixin application.  Use [mixin] to get the
   /// class that has the fields and procedures.
-  Class get mixedInClass => mixedInType?.classNode;
+  Class? get mixedInClass => mixedInType?.classNode;
 
   /// The class that declares the field and procedures of this class.
   Class get mixin => mixedInClass?.mixin ?? this;
@@ -1256,18 +1334,18 @@
 
   String get demangledName {
     if (isAnonymousMixin) return nameAsMixinApplication;
-    assert(!name.contains('&'));
-    return name;
+    assert(!name!.contains('&'));
+    return name!;
   }
 
   String get nameAsMixinApplication {
     assert(isAnonymousMixin);
-    return demangleMixinApplicationName(name);
+    return demangleMixinApplicationName(name!);
   }
 
   String get nameAsMixinApplicationSubclass {
     assert(isAnonymousMixin);
-    return demangleMixinApplicationSubclassName(name);
+    return demangleMixinApplicationSubclassName(name!);
   }
 
   /// Members declared in this class.
@@ -1286,13 +1364,13 @@
   /// This getter is for convenience, not efficiency.  Consider manually
   /// iterating the super types to speed up code in production.
   Iterable<Supertype> get supers => <Iterable<Supertype>>[
-        supertype == null ? const [] : [supertype],
-        mixedInType == null ? const [] : [mixedInType],
+        supertype == null ? const [] : [supertype!],
+        mixedInType == null ? const [] : [mixedInType!],
         implementedTypes
       ].expand((x) => x);
 
   /// The library containing this class.
-  Library get enclosingLibrary => parent;
+  Library get enclosingLibrary => parent as Library;
 
   /// Internal. Should *ONLY* be used from within kernel.
   ///
@@ -1329,6 +1407,7 @@
     redirectingFactoryConstructorsInternal.add(redirectingFactoryConstructor);
   }
 
+  @override
   void addAnnotation(Expression node) {
     if (annotations.isEmpty) {
       annotations = <Expression>[];
@@ -1337,7 +1416,12 @@
     node.parent = this;
   }
 
+  @override
   R accept<R>(TreeVisitor<R> v) => v.visitClass(this);
+
+  @override
+  R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitClass(this, arg);
+
   R acceptReference<R>(Visitor<R> v) => v.visitClassReference(this);
 
   Supertype get asRawSupertype {
@@ -1363,7 +1447,8 @@
     printer.writeClassName(reference);
   }
 
-  visitChildren(Visitor v) {
+  @override
+  void visitChildren(Visitor v) {
     visitList(annotations, v);
     visitList(typeParameters, v);
     supertype?.accept(v);
@@ -1375,24 +1460,54 @@
     visitList(redirectingFactoryConstructors, v);
   }
 
-  transformChildren(Transformer v) {
-    transformList(annotations, v, this);
-    transformList(typeParameters, v, this);
+  @override
+  void transformChildren(Transformer v) {
+    v.transformList(annotations, this);
+    v.transformList(typeParameters, this);
     if (supertype != null) {
-      supertype = v.visitSupertype(supertype);
+      supertype = v.visitSupertype(supertype!);
     }
     if (mixedInType != null) {
-      mixedInType = v.visitSupertype(mixedInType);
+      mixedInType = v.visitSupertype(mixedInType!);
     }
-    transformSupertypeList(implementedTypes, v);
-    transformList(constructors, v, this);
-    transformList(procedures, v, this);
-    transformList(fields, v, this);
-    transformList(redirectingFactoryConstructors, v, this);
+    v.transformSupertypeList(implementedTypes);
+    v.transformList(constructors, this);
+    v.transformList(procedures, this);
+    v.transformList(fields, this);
+    v.transformList(redirectingFactoryConstructors, this);
   }
 
-  Location _getLocationInEnclosingFile(int offset) {
-    return _getLocationInComponent(enclosingComponent, fileUri, offset);
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    v.transformExpressionList(annotations, this);
+    v.transformTypeParameterList(typeParameters, this);
+    if (supertype != null) {
+      Supertype newSupertype = v.visitSupertype(supertype!, dummySupertype);
+      if (identical(newSupertype, dummySupertype)) {
+        supertype = null;
+      } else {
+        supertype = newSupertype;
+      }
+    }
+    if (mixedInType != null) {
+      Supertype newMixedInType = v.visitSupertype(mixedInType!, dummySupertype);
+      if (identical(newMixedInType, dummySupertype)) {
+        mixedInType = null;
+      } else {
+        mixedInType = newMixedInType;
+      }
+    }
+    v.transformSupertypeList(implementedTypes);
+    v.transformConstructorList(constructors, this);
+    v.transformProcedureList(procedures, this);
+    v.transformFieldList(fields, this);
+    v.transformRedirectingFactoryConstructorList(
+        redirectingFactoryConstructors, this);
+  }
+
+  @override
+  Location? _getLocationInEnclosingFile(int offset) {
+    return _getLocationInComponent(enclosingComponent, fileUri!, offset);
   }
 }
 
@@ -1405,10 +1520,11 @@
   ///
   /// If unnamed, the extension will be given a synthesized name by the
   /// front end.
-  String name;
+  // TODO(johnniwinther): Make this non-nullable.
+  String? name;
 
   /// The URI of the source file this class was loaded from.
-  Uri fileUri;
+  Uri? fileUri;
 
   /// Type parameters declared on the extension.
   final List<TypeParameter> typeParameters;
@@ -1420,7 +1536,8 @@
   ///   class A {}
   ///   extension B on A {}
   ///
-  DartType onType;
+  // TODO(johnniwinther): Should this be late non-nullable?
+  DartType? onType;
 
   /// The members declared by the extension.
   ///
@@ -1430,39 +1547,55 @@
 
   Extension(
       {this.name,
-      List<TypeParameter> typeParameters,
+      List<TypeParameter>? typeParameters,
       this.onType,
-      List<ExtensionMemberDescriptor> members,
+      List<ExtensionMemberDescriptor>? members,
       this.fileUri,
-      Reference reference})
+      Reference? reference})
       : this.typeParameters = typeParameters ?? <TypeParameter>[],
         this.members = members ?? <ExtensionMemberDescriptor>[],
         super(reference) {
     setParents(this.typeParameters, this);
   }
 
-  Library get enclosingLibrary => parent;
+  Library get enclosingLibrary => parent as Library;
 
   @override
   R accept<R>(TreeVisitor<R> v) => v.visitExtension(this);
 
   @override
-  visitChildren(Visitor v) {
+  R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitExtension(this, arg);
+
+  @override
+  void visitChildren(Visitor v) {
     visitList(typeParameters, v);
     onType?.accept(v);
   }
 
   @override
-  transformChildren(Transformer v) {
-    transformList(typeParameters, v, this);
+  void transformChildren(Transformer v) {
+    v.transformList(typeParameters, this);
     if (onType != null) {
-      onType = v.visitDartType(onType);
+      onType = v.visitDartType(onType!);
     }
   }
 
   @override
-  Location _getLocationInEnclosingFile(int offset) {
-    return _getLocationInComponent(enclosingComponent, fileUri, offset);
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    v.transformTypeParameterList(typeParameters, this);
+    if (onType != null) {
+      DartType newOnType = v.visitDartType(onType!, dummyDartType);
+      if (identical(newOnType, dummyDartType)) {
+        onType = null;
+      } else {
+        onType = newOnType;
+      }
+    }
+  }
+
+  @override
+  Location? _getLocationInEnclosingFile(int offset) {
+    return _getLocationInComponent(enclosingComponent, fileUri!, offset);
   }
 
   @override
@@ -1521,10 +1654,13 @@
   int flags = 0;
 
   /// Reference to the top-level member created for the extension method.
-  Reference member;
+  final Reference member;
 
   ExtensionMemberDescriptor(
-      {this.name, this.kind, bool isStatic: false, this.member}) {
+      {required this.name,
+      required this.kind,
+      bool isStatic: false,
+      required this.member}) {
     this.isStatic = isStatic;
   }
 
@@ -1558,12 +1694,15 @@
   ///
   /// This defaults to an immutable empty list. Use [addAnnotation] to add
   /// annotations if needed.
+  @override
   List<Expression> annotations = const <Expression>[];
 
-  Name name;
+  // TODO(johnniwinther): Make this non-nullable.
+  Name? name;
 
   /// The URI of the source file this member was loaded from.
-  Uri fileUri;
+  @override
+  Uri? fileUri;
 
   /// Flags summarizing the kinds of AST nodes contained in this member, for
   /// speeding up transformations that only affect certain types of nodes.
@@ -1582,13 +1721,19 @@
   // TODO(asgerf): It might be worthwhile to put this on classes as well.
   int transformerFlags = 0;
 
-  Member(this.name, this.fileUri, Reference reference) : super(reference);
+  Member(this.name, this.fileUri, Reference? reference) : super(reference);
 
-  Class get enclosingClass => parent is Class ? parent : null;
-  Library get enclosingLibrary => parent is Class ? parent.parent : parent;
+  Class? get enclosingClass => parent is Class ? parent as Class : null;
+  Library get enclosingLibrary =>
+      (parent is Class ? parent!.parent : parent) as Library;
 
+  @override
   R accept<R>(MemberVisitor<R> v);
-  acceptReference(MemberReferenceVisitor v);
+
+  @override
+  R accept1<R, A>(MemberVisitor1<R, A> v, A arg);
+
+  R acceptReference<R>(MemberReferenceVisitor<R> v);
 
   /// Returns true if this is an abstract procedure.
   bool get isAbstract => false;
@@ -1635,8 +1780,9 @@
   bool get isNonNullableByDefault;
   void set isNonNullableByDefault(bool value);
 
-  /// The body of the procedure or constructor, or `null` if this is a field.
-  FunctionNode get function => null;
+  /// The function signature and body of the procedure or constructor, or `null`
+  /// if this is a field.
+  FunctionNode? get function => null;
 
   /// Returns a possibly synthesized name for this member, consistent with
   /// the names used across all [toString] calls.
@@ -1648,6 +1794,7 @@
     printer.writeMemberName(reference);
   }
 
+  @override
   void addAnnotation(Expression node) {
     if (annotations.isEmpty) {
       annotations = <Expression>[];
@@ -1665,7 +1812,7 @@
 
   /// If this member is a member signature, [memberSignatureOrigin] is one of
   /// the non-member signature members from which it was created.
-  Member get memberSignatureOrigin => null;
+  Member? get memberSignatureOrigin => null;
 }
 
 /// A field declaration.
@@ -1675,17 +1822,22 @@
 class Field extends Member {
   DartType type; // Not null. Defaults to DynamicType.
   int flags = 0;
-  Expression initializer; // May be null.
-  final Reference setterReference;
+  Expression? initializer; // May be null.
+  final Reference? setterReference;
+
+  @override
   @Deprecated("Use the specific getterReference/setterReference instead")
   Reference get reference => super.reference;
 
   Reference get getterReference => super.reference;
+
+  @override
   @Deprecated(
       "Use the specific getterCanonicalName/setterCanonicalName instead")
-  CanonicalName get canonicalName => reference?.canonicalName;
-  CanonicalName get getterCanonicalName => getterReference?.canonicalName;
-  CanonicalName get setterCanonicalName => setterReference?.canonicalName;
+  CanonicalName? get canonicalName => reference.canonicalName;
+
+  CanonicalName? get getterCanonicalName => getterReference.canonicalName;
+  CanonicalName? get setterCanonicalName => setterReference?.canonicalName;
 
   Field.mutable(Name name,
       {this.type: const DynamicType(),
@@ -1695,12 +1847,13 @@
       bool isStatic: false,
       bool isLate: false,
       int transformerFlags: 0,
-      Uri fileUri,
-      Reference getterReference,
-      Reference setterReference})
+      Uri? fileUri,
+      Reference? getterReference,
+      Reference? setterReference})
       : this.setterReference = setterReference ?? new Reference(),
         super(name, fileUri, getterReference) {
-    this.setterReference.node = this;
+    this.setterReference!.node = this;
+    // ignore: unnecessary_null_comparison
     assert(type != null);
     initializer?.parent = this;
     this.isCovariant = isCovariant;
@@ -1719,10 +1872,11 @@
       bool isStatic: false,
       bool isLate: false,
       int transformerFlags: 0,
-      Uri fileUri,
-      Reference getterReference})
+      Uri? fileUri,
+      Reference? getterReference})
       : this.setterReference = null,
         super(name, fileUri, getterReference) {
+    // ignore: unnecessary_null_comparison
     assert(type != null);
     initializer?.parent = this;
     this.isCovariant = isCovariant;
@@ -1737,7 +1891,7 @@
   void _relinkNode() {
     super._relinkNode();
     if (hasSetter) {
-      this.setterReference.node = this;
+      this.setterReference!.node = this;
     }
   }
 
@@ -1755,7 +1909,10 @@
   bool get isCovariant => flags & FlagCovariant != 0;
 
   bool get isFinal => flags & FlagFinal != 0;
+
+  @override
   bool get isConst => flags & FlagConst != 0;
+
   bool get isStatic => flags & FlagStatic != 0;
 
   @override
@@ -1815,11 +1972,19 @@
         : (flags & ~FlagInternalImplementation);
   }
 
+  @override
   bool get isInstanceMember => !isStatic;
+
+  @override
   bool get hasGetter => true;
+
+  @override
   bool get hasSetter => setterReference != null;
 
+  @override
   bool get isExternal => false;
+
+  @override
   void set isExternal(bool value) {
     if (value) throw 'Fields cannot be external';
   }
@@ -1834,31 +1999,53 @@
         : (flags & ~FlagNonNullableByDefault);
   }
 
+  @override
   R accept<R>(MemberVisitor<R> v) => v.visitField(this);
 
-  acceptReference(MemberReferenceVisitor v) => v.visitFieldReference(this);
+  @override
+  R accept1<R, A>(MemberVisitor1<R, A> v, A arg) => v.visitField(this, arg);
 
-  visitChildren(Visitor v) {
+  @override
+  R acceptReference<R>(MemberReferenceVisitor<R> v) =>
+      v.visitFieldReference(this);
+
+  @override
+  void visitChildren(Visitor v) {
     visitList(annotations, v);
-    type?.accept(v);
+    type.accept(v);
     name?.accept(v);
     initializer?.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
     type = v.visitDartType(type);
-    transformList(annotations, v, this);
+    v.transformList(annotations, this);
     if (initializer != null) {
-      initializer = initializer.accept<TreeNode>(v);
+      initializer = v.transform(initializer!);
       initializer?.parent = this;
     }
   }
 
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    type = v.visitDartType(type, null);
+    v.transformExpressionList(annotations, this);
+    if (initializer != null) {
+      initializer = v.transformOrRemoveExpression(initializer!);
+      initializer?.parent = this;
+    }
+  }
+
+  @override
   DartType get getterType => type;
+
+  @override
   DartType get setterType => hasSetter ? type : const BottomType();
 
-  Location _getLocationInEnclosingFile(int offset) {
-    return _getLocationInComponent(enclosingComponent, fileUri, offset);
+  @override
+  Location? _getLocationInEnclosingFile(int offset) {
+    return _getLocationInComponent(enclosingComponent, fileUri!, offset);
   }
 
   @override
@@ -1886,18 +2073,22 @@
   int startFileOffset = TreeNode.noOffset;
 
   int flags = 0;
-  FunctionNode function;
+
+  // TODO(johnniwinther): Make this non-nullable.
+  @override
+  FunctionNode? function;
+
   List<Initializer> initializers;
 
   Constructor(this.function,
-      {Name name,
+      {Name? name,
       bool isConst: false,
       bool isExternal: false,
       bool isSynthetic: false,
-      List<Initializer> initializers,
+      List<Initializer>? initializers,
       int transformerFlags: 0,
-      Uri fileUri,
-      Reference reference})
+      Uri? fileUri,
+      Reference? reference})
       : this.initializers = initializers ?? <Initializer>[],
         super(name, fileUri, reference) {
     function?.parent = this;
@@ -1913,7 +2104,10 @@
   static const int FlagSynthetic = 1 << 2;
   static const int FlagNonNullableByDefault = 1 << 3;
 
+  @override
   bool get isConst => flags & FlagConst != 0;
+
+  @override
   bool get isExternal => flags & FlagExternal != 0;
 
   /// True if this is a synthetic constructor inserted in a class that
@@ -1924,6 +2118,7 @@
     flags = value ? (flags | FlagConst) : (flags & ~FlagConst);
   }
 
+  @override
   void set isExternal(bool value) {
     flags = value ? (flags | FlagExternal) : (flags & ~FlagExternal);
   }
@@ -1932,8 +2127,13 @@
     flags = value ? (flags | FlagSynthetic) : (flags & ~FlagSynthetic);
   }
 
+  @override
   bool get isInstanceMember => false;
+
+  @override
   bool get hasGetter => false;
+
+  @override
   bool get hasSetter => false;
 
   @override
@@ -1949,32 +2149,54 @@
         : (flags & ~FlagNonNullableByDefault);
   }
 
+  @override
   R accept<R>(MemberVisitor<R> v) => v.visitConstructor(this);
 
-  acceptReference(MemberReferenceVisitor v) =>
+  @override
+  R accept1<R, A>(MemberVisitor1<R, A> v, A arg) =>
+      v.visitConstructor(this, arg);
+
+  @override
+  R acceptReference<R>(MemberReferenceVisitor<R> v) =>
       v.visitConstructorReference(this);
 
-  visitChildren(Visitor v) {
+  @override
+  void visitChildren(Visitor v) {
     visitList(annotations, v);
     name?.accept(v);
     visitList(initializers, v);
     function?.accept(v);
   }
 
-  transformChildren(Transformer v) {
-    transformList(annotations, v, this);
-    transformList(initializers, v, this);
+  @override
+  void transformChildren(Transformer v) {
+    v.transformList(annotations, this);
+    v.transformList(initializers, this);
     if (function != null) {
-      function = function.accept<TreeNode>(v);
+      function = v.transform(function!);
       function?.parent = this;
     }
   }
 
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    v.transformExpressionList(annotations, this);
+    v.transformInitializerList(initializers, this);
+    if (function != null) {
+      function = v.transformOrRemove(function!, dummyFunctionNode);
+      function?.parent = this;
+    }
+  }
+
+  @override
   DartType get getterType => const BottomType();
+
+  @override
   DartType get setterType => const BottomType();
 
-  Location _getLocationInEnclosingFile(int offset) {
-    return _getLocationInComponent(enclosingComponent, fileUri, offset);
+  @override
+  Location? _getLocationInEnclosingFile(int offset) {
+    return _getLocationInComponent(enclosingComponent, fileUri!, offset);
   }
 }
 
@@ -2009,7 +2231,7 @@
 
   /// Reference to the constructor or the factory that this
   /// [RedirectingFactoryConstructor] redirects to.
-  Reference targetReference;
+  Reference? targetReference;
 
   /// [typeParameters] are duplicates of the type parameters of the enclosing
   /// class.  Because [RedirectingFactoryConstructor]s aren't instance members,
@@ -2028,17 +2250,17 @@
   List<VariableDeclaration> namedParameters;
 
   RedirectingFactoryConstructor(this.targetReference,
-      {Name name,
+      {Name? name,
       bool isConst: false,
       bool isExternal: false,
       int transformerFlags: 0,
-      List<DartType> typeArguments,
-      List<TypeParameter> typeParameters,
-      List<VariableDeclaration> positionalParameters,
-      List<VariableDeclaration> namedParameters,
-      int requiredParameterCount,
-      Uri fileUri,
-      Reference reference})
+      List<DartType>? typeArguments,
+      List<TypeParameter>? typeParameters,
+      List<VariableDeclaration>? positionalParameters,
+      List<VariableDeclaration>? namedParameters,
+      int? requiredParameterCount,
+      Uri? fileUri,
+      Reference? reference})
       : this.typeArguments = typeArguments ?? <DartType>[],
         this.typeParameters = typeParameters ?? <TypeParameter>[],
         this.positionalParameters =
@@ -2059,19 +2281,28 @@
   static const int FlagExternal = 1 << 1;
   static const int FlagNonNullableByDefault = 1 << 2;
 
+  @override
   bool get isConst => flags & FlagConst != 0;
+
+  @override
   bool get isExternal => flags & FlagExternal != 0;
 
   void set isConst(bool value) {
     flags = value ? (flags | FlagConst) : (flags & ~FlagConst);
   }
 
+  @override
   void set isExternal(bool value) {
     flags = value ? (flags | FlagExternal) : (flags & ~FlagExternal);
   }
 
+  @override
   bool get isInstanceMember => false;
+
+  @override
   bool get hasGetter => false;
+
+  @override
   bool get hasSetter => false;
 
   @override
@@ -2089,36 +2320,54 @@
         : (flags & ~FlagNonNullableByDefault);
   }
 
-  Member get target => targetReference?.asMember;
+  Member? get target => targetReference?.asMember;
 
-  void set target(Member member) {
+  void set target(Member? member) {
     assert(member is Constructor ||
         (member is Procedure && member.kind == ProcedureKind.Factory));
     targetReference = getMemberReferenceGetter(member);
   }
 
+  @override
   R accept<R>(MemberVisitor<R> v) => v.visitRedirectingFactoryConstructor(this);
 
-  acceptReference(MemberReferenceVisitor v) =>
+  @override
+  R accept1<R, A>(MemberVisitor1<R, A> v, A arg) =>
+      v.visitRedirectingFactoryConstructor(this, arg);
+
+  @override
+  R acceptReference<R>(MemberReferenceVisitor<R> v) =>
       v.visitRedirectingFactoryConstructorReference(this);
 
-  visitChildren(Visitor v) {
+  @override
+  void visitChildren(Visitor v) {
     visitList(annotations, v);
     target?.acceptReference(v);
     visitList(typeArguments, v);
     name?.accept(v);
   }
 
-  transformChildren(Transformer v) {
-    transformList(annotations, v, this);
-    transformTypeList(typeArguments, v);
+  @override
+  void transformChildren(Transformer v) {
+    v.transformList(annotations, this);
+    v.transformDartTypeList(typeArguments);
   }
 
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    v.transformExpressionList(annotations, this);
+    v.transformDartTypeList(typeArguments);
+  }
+
+  @override
   DartType get getterType => const BottomType();
+
+  @override
   DartType get setterType => const BottomType();
 
-  Location _getLocationInEnclosingFile(int offset) {
-    return _getLocationInComponent(enclosingComponent, fileUri, offset);
+  @override
+  Location? _getLocationInEnclosingFile(int offset) {
+    return _getLocationInComponent(enclosingComponent, fileUri!, offset);
   }
 }
 
@@ -2333,12 +2582,15 @@
 
   final ProcedureKind kind;
   int flags = 0;
-  // function is null if and only if abstract, external.
-  FunctionNode function;
+
+  // TODO(johnniwinther): Make this non-nullable.
+  @override
+  FunctionNode? function;
 
   // The function node's body might be lazily loaded, meaning that this value
   // might not be set correctly yet. Make sure the body is loaded before
   // returning anything.
+  @override
   int get transformerFlags {
     function?.body;
     return super.transformerFlags;
@@ -2347,6 +2599,7 @@
   // The function node's body might be lazily loaded, meaning that this value
   // might get overwritten later (when the body is read). To avoid that read the
   // body now and only set the value afterwards.
+  @override
   void set transformerFlags(int newValue) {
     function?.body;
     super.transformerFlags = newValue;
@@ -2360,7 +2613,7 @@
   }
 
   ProcedureStubKind stubKind;
-  Reference stubTargetReference;
+  Reference? stubTargetReference;
 
   Procedure(Name name, ProcedureKind kind, FunctionNode function,
       {bool isAbstract: false,
@@ -2370,10 +2623,10 @@
       bool isExtensionMember: false,
       bool isSynthetic: false,
       int transformerFlags: 0,
-      Uri fileUri,
-      Reference reference,
+      Uri? fileUri,
+      Reference? reference,
       ProcedureStubKind stubKind: ProcedureStubKind.Regular,
-      Member stubTarget})
+      Member? stubTarget})
       : this._byReferenceRenamed(name, kind, function,
             isAbstract: isAbstract,
             isStatic: isStatic,
@@ -2396,10 +2649,11 @@
       bool isExtensionMember: false,
       bool isSynthetic: false,
       int transformerFlags: 0,
-      Uri fileUri,
-      Reference reference,
+      Uri? fileUri,
+      Reference? reference,
       this.stubKind: ProcedureStubKind.Regular,
       this.stubTargetReference})
+      // ignore: unnecessary_null_comparison
       : assert(kind != null),
         super(name, fileUri, reference) {
     function?.parent = this;
@@ -2430,11 +2684,16 @@
   static const int FlagSynthetic = 1 << 7;
 
   bool get isStatic => flags & FlagStatic != 0;
+
+  @override
   bool get isAbstract => flags & FlagAbstract != 0;
+
+  @override
   bool get isExternal => flags & FlagExternal != 0;
 
   /// True if this has the `const` modifier.  This is only possible for external
   /// constant factories, such as `String.fromEnvironment`.
+  @override
   bool get isConst => flags & FlagConst != 0;
 
   /// If set, this flag indicates that this function's implementation exists
@@ -2488,6 +2747,7 @@
     flags = value ? (flags | FlagAbstract) : (flags & ~FlagAbstract);
   }
 
+  @override
   void set isExternal(bool value) {
     flags = value ? (flags | FlagExternal) : (flags & ~FlagExternal);
   }
@@ -2511,12 +2771,19 @@
     flags = value ? (flags | FlagSynthetic) : (flags & ~FlagSynthetic);
   }
 
+  @override
   bool get isInstanceMember => !isStatic;
+
   bool get isGetter => kind == ProcedureKind.Getter;
   bool get isSetter => kind == ProcedureKind.Setter;
   bool get isAccessor => isGetter || isSetter;
+
+  @override
   bool get hasGetter => kind != ProcedureKind.Setter;
+
+  @override
   bool get hasSetter => kind == ProcedureKind.Setter;
+
   bool get isFactory => kind == ProcedureKind.Factory;
 
   @override
@@ -2529,59 +2796,80 @@
         : (flags & ~FlagNonNullableByDefault);
   }
 
-  Member get concreteForwardingStubTarget =>
+  Member? get concreteForwardingStubTarget =>
       stubKind == ProcedureStubKind.ConcreteForwardingStub
           ? stubTargetReference?.asMember
           : null;
 
-  Member get abstractForwardingStubTarget =>
+  Member? get abstractForwardingStubTarget =>
       stubKind == ProcedureStubKind.AbstractForwardingStub
           ? stubTargetReference?.asMember
           : null;
 
-  Member get stubTarget => stubTargetReference?.asMember;
+  Member? get stubTarget => stubTargetReference?.asMember;
 
-  void set stubTarget(Member target) {
+  void set stubTarget(Member? target) {
     stubTargetReference = getMemberReferenceBasedOnProcedureKind(target, kind);
   }
 
-  Member get memberSignatureOrigin =>
+  @override
+  Member? get memberSignatureOrigin =>
       stubKind == ProcedureStubKind.MemberSignature
           ? stubTargetReference?.asMember
           : null;
 
+  @override
   R accept<R>(MemberVisitor<R> v) => v.visitProcedure(this);
 
-  acceptReference(MemberReferenceVisitor v) => v.visitProcedureReference(this);
+  @override
+  R accept1<R, A>(MemberVisitor1<R, A> v, A arg) => v.visitProcedure(this, arg);
 
-  visitChildren(Visitor v) {
+  @override
+  R acceptReference<R>(MemberReferenceVisitor<R> v) =>
+      v.visitProcedureReference(this);
+
+  @override
+  void visitChildren(Visitor v) {
     visitList(annotations, v);
     name?.accept(v);
     function?.accept(v);
   }
 
-  transformChildren(Transformer v) {
-    transformList(annotations, v, this);
+  @override
+  void transformChildren(Transformer v) {
+    v.transformList(annotations, this);
     if (function != null) {
-      function = function.accept<TreeNode>(v);
+      function = v.transform(function!);
       function?.parent = this;
     }
   }
 
-  DartType get getterType {
-    return isGetter
-        ? function.returnType
-        : function.computeFunctionType(enclosingLibrary.nonNullable);
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    v.transformExpressionList(annotations, this);
+    if (function != null) {
+      function = v.transformOrRemove(function!, dummyFunctionNode);
+      function?.parent = this;
+    }
   }
 
+  @override
+  DartType get getterType {
+    return isGetter
+        ? function!.returnType
+        : function!.computeFunctionType(enclosingLibrary.nonNullable);
+  }
+
+  @override
   DartType get setterType {
     return isSetter
-        ? function.positionalParameters[0].type
+        ? function!.positionalParameters[0].type
         : const BottomType();
   }
 
-  Location _getLocationInEnclosingFile(int offset) {
-    return _getLocationInComponent(enclosingComponent, fileUri, offset);
+  @override
+  Location? _getLocationInEnclosingFile(int offset) {
+    return _getLocationInComponent(enclosingComponent, fileUri!, offset);
   }
 }
 
@@ -2603,7 +2891,11 @@
   @informative
   bool isSynthetic = false;
 
+  @override
   R accept<R>(InitializerVisitor<R> v);
+
+  @override
+  R accept1<R, A>(InitializerVisitor1<R, A> v, A arg);
 }
 
 /// An initializer with a compile-time error.
@@ -2613,10 +2905,21 @@
 // DESIGN TODO: The frontend should use this in a lot more cases to catch
 // invalid cases.
 class InvalidInitializer extends Initializer {
+  @override
   R accept<R>(InitializerVisitor<R> v) => v.visitInvalidInitializer(this);
 
-  visitChildren(Visitor v) {}
-  transformChildren(Transformer v) {}
+  @override
+  R accept1<R, A>(InitializerVisitor1<R, A> v, A arg) =>
+      v.visitInvalidInitializer(this, arg);
+
+  @override
+  void visitChildren(Visitor v) {}
+
+  @override
+  void transformChildren(Transformer v) {}
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {}
 
   @override
   String toString() {
@@ -2645,30 +2948,47 @@
   FieldInitializer(Field field, Expression value)
       : this.byReference(
             // getterReference is used since this refers to the field itself
-            field?.getterReference,
+            field.getterReference,
             value);
 
   FieldInitializer.byReference(this.fieldReference, this.value) {
-    value?.parent = this;
+    value.parent = this;
   }
 
-  Field get field => fieldReference?.node;
+  Field get field => fieldReference.asField;
 
   void set field(Field field) {
-    fieldReference = field?.getterReference;
+    fieldReference = field.getterReference;
   }
 
+  @override
   R accept<R>(InitializerVisitor<R> v) => v.visitFieldInitializer(this);
 
-  visitChildren(Visitor v) {
-    field?.acceptReference(v);
-    value?.accept(v);
+  @override
+  R accept1<R, A>(InitializerVisitor1<R, A> v, A arg) =>
+      v.visitFieldInitializer(this, arg);
+
+  @override
+  void visitChildren(Visitor v) {
+    field.acceptReference(v);
+    value.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (value != null) {
-      value = value.accept<TreeNode>(v);
-      value?.parent = this;
+      value = v.transform(value);
+      value.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (value != null) {
+      value = v.transform(value);
+      value.parent = this;
     }
   }
 
@@ -2700,31 +3020,48 @@
   SuperInitializer(Constructor target, Arguments arguments)
       : this.byReference(
             // Getter vs setter doesn't matter for constructors.
-            getMemberReferenceGetter(target),
+            getNonNullableMemberReferenceGetter(target),
             arguments);
 
   SuperInitializer.byReference(this.targetReference, this.arguments) {
-    arguments?.parent = this;
+    arguments.parent = this;
   }
 
-  Constructor get target => targetReference?.asConstructor;
+  Constructor get target => targetReference.asConstructor;
 
   void set target(Constructor target) {
     // Getter vs setter doesn't matter for constructors.
-    targetReference = getMemberReferenceGetter(target);
+    targetReference = getNonNullableMemberReferenceGetter(target);
   }
 
+  @override
   R accept<R>(InitializerVisitor<R> v) => v.visitSuperInitializer(this);
 
-  visitChildren(Visitor v) {
-    target?.acceptReference(v);
-    arguments?.accept(v);
+  @override
+  R accept1<R, A>(InitializerVisitor1<R, A> v, A arg) =>
+      v.visitSuperInitializer(this, arg);
+
+  @override
+  void visitChildren(Visitor v) {
+    target.acceptReference(v);
+    arguments.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (arguments != null) {
-      arguments = arguments.accept<TreeNode>(v);
-      arguments?.parent = this;
+      arguments = v.transform(arguments);
+      arguments.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (arguments != null) {
+      arguments = v.transform(arguments);
+      arguments.parent = this;
     }
   }
 
@@ -2752,31 +3089,48 @@
   RedirectingInitializer(Constructor target, Arguments arguments)
       : this.byReference(
             // Getter vs setter doesn't matter for constructors.
-            getMemberReferenceGetter(target),
+            getNonNullableMemberReferenceGetter(target),
             arguments);
 
   RedirectingInitializer.byReference(this.targetReference, this.arguments) {
-    arguments?.parent = this;
+    arguments.parent = this;
   }
 
-  Constructor get target => targetReference?.asConstructor;
+  Constructor get target => targetReference.asConstructor;
 
   void set target(Constructor target) {
     // Getter vs setter doesn't matter for constructors.
-    targetReference = getMemberReferenceGetter(target);
+    targetReference = getNonNullableMemberReferenceGetter(target);
   }
 
+  @override
   R accept<R>(InitializerVisitor<R> v) => v.visitRedirectingInitializer(this);
 
-  visitChildren(Visitor v) {
-    target?.acceptReference(v);
-    arguments?.accept(v);
+  @override
+  R accept1<R, A>(InitializerVisitor1<R, A> v, A arg) =>
+      v.visitRedirectingInitializer(this, arg);
+
+  @override
+  void visitChildren(Visitor v) {
+    target.acceptReference(v);
+    arguments.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (arguments != null) {
-      arguments = arguments.accept<TreeNode>(v);
-      arguments?.parent = this;
+      arguments = v.transform(arguments);
+      arguments.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (arguments != null) {
+      arguments = v.transform(arguments);
+      arguments.parent = this;
     }
   }
 
@@ -2799,19 +3153,36 @@
   VariableDeclaration variable;
 
   LocalInitializer(this.variable) {
-    variable?.parent = this;
+    variable.parent = this;
   }
 
+  @override
   R accept<R>(InitializerVisitor<R> v) => v.visitLocalInitializer(this);
 
-  visitChildren(Visitor v) {
-    variable?.accept(v);
+  @override
+  R accept1<R, A>(InitializerVisitor1<R, A> v, A arg) =>
+      v.visitLocalInitializer(this, arg);
+
+  @override
+  void visitChildren(Visitor v) {
+    variable.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (variable != null) {
-      variable = variable.accept<TreeNode>(v);
-      variable?.parent = this;
+      variable = v.transform(variable);
+      variable.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (variable != null) {
+      variable = v.transform(variable);
+      variable.parent = this;
     }
   }
 
@@ -2833,14 +3204,27 @@
     statement.parent = this;
   }
 
+  @override
   R accept<R>(InitializerVisitor<R> v) => v.visitAssertInitializer(this);
 
-  visitChildren(Visitor v) {
+  @override
+  R accept1<R, A>(InitializerVisitor1<R, A> v, A arg) =>
+      v.visitAssertInitializer(this, arg);
+
+  @override
+  void visitChildren(Visitor v) {
     statement.accept(v);
   }
 
-  transformChildren(Transformer v) {
-    statement = statement.accept<TreeNode>(v);
+  @override
+  void transformChildren(Transformer v) {
+    statement = v.transform(statement);
+    statement.parent = this;
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    statement = v.transform(statement);
     statement.parent = this;
   }
 
@@ -2890,7 +3274,7 @@
   List<VariableDeclaration> positionalParameters;
   List<VariableDeclaration> namedParameters;
   DartType returnType; // Not null.
-  Statement _body;
+  Statement? _body;
 
   /// The future value type of this is an async function, otherwise `null`.
   ///
@@ -2903,55 +3287,56 @@
   /// here the return types are `Future<Foo>` and `FutureOr<Foo>` for `method1`
   /// and `method2`, respectively, but the future value type is in both cases
   /// `Foo`.
-  DartType futureValueType;
+  DartType? futureValueType;
 
-  void Function() lazyBuilder;
+  void Function()? lazyBuilder;
 
   void _buildLazy() {
-    if (lazyBuilder != null) {
-      void Function() lazyBuilderLocal = lazyBuilder;
+    void Function()? lazyBuilderLocal = lazyBuilder;
+    if (lazyBuilderLocal != null) {
       lazyBuilder = null;
       lazyBuilderLocal();
     }
   }
 
-  Statement get body {
+  Statement? get body {
     _buildLazy();
     return _body;
   }
 
-  void set body(Statement body) {
+  void set body(Statement? body) {
     _buildLazy();
     _body = body;
   }
 
   FunctionNode(this._body,
-      {List<TypeParameter> typeParameters,
-      List<VariableDeclaration> positionalParameters,
-      List<VariableDeclaration> namedParameters,
-      int requiredParameterCount,
+      {List<TypeParameter>? typeParameters,
+      List<VariableDeclaration>? positionalParameters,
+      List<VariableDeclaration>? namedParameters,
+      int? requiredParameterCount,
       this.returnType: const DynamicType(),
       this.asyncMarker: AsyncMarker.Sync,
-      this.dartAsyncMarker,
+      AsyncMarker? dartAsyncMarker,
       this.futureValueType})
       : this.positionalParameters =
             positionalParameters ?? <VariableDeclaration>[],
         this.requiredParameterCount =
             requiredParameterCount ?? positionalParameters?.length ?? 0,
         this.namedParameters = namedParameters ?? <VariableDeclaration>[],
-        this.typeParameters = typeParameters ?? <TypeParameter>[] {
+        this.typeParameters = typeParameters ?? <TypeParameter>[],
+        this.dartAsyncMarker = dartAsyncMarker ?? asyncMarker {
+    // ignore: unnecessary_null_comparison
     assert(returnType != null);
     setParents(this.typeParameters, this);
     setParents(this.positionalParameters, this);
     setParents(this.namedParameters, this);
     _body?.parent = this;
-    dartAsyncMarker ??= asyncMarker;
   }
 
   static DartType _getTypeOfVariable(VariableDeclaration node) => node.type;
 
   static NamedType _getNamedTypeOfVariable(VariableDeclaration node) {
-    return new NamedType(node.name, node.type, isRequired: node.isRequired);
+    return new NamedType(node.name!, node.type, isRequired: node.isRequired);
   }
 
   /// Returns the function type of the node reusing its type parameters.
@@ -2963,7 +3348,7 @@
   /// type of the enclosing generic function and in combination with
   /// [FunctionType.withoutTypeParameters].
   FunctionType computeThisFunctionType(Nullability nullability) {
-    TreeNode parent = this.parent;
+    TreeNode? parent = this.parent;
     List<NamedType> named =
         namedParameters.map(_getNamedTypeOfVariable).toList(growable: false);
     named.sort();
@@ -2971,7 +3356,7 @@
     // transformations like erasure don't work.
     List<TypeParameter> typeParametersCopy = new List<TypeParameter>.from(
         parent is Constructor
-            ? parent.enclosingClass.typeParameters
+            ? parent.enclosingClass!.typeParameters
             : typeParameters);
     return new FunctionType(
         positionalParameters.map(_getTypeOfVariable).toList(growable: false),
@@ -3006,13 +3391,12 @@
   /// constructor invocations.
   FunctionType computeAliasedConstructorFunctionType(
       Typedef typedef, Library library) {
-    TreeNode parent = this.parent;
     assert(parent is Constructor, "Only run this method on constructors");
-    Constructor parentConstructor = parent;
+    Constructor parentConstructor = parent as Constructor;
     // We need create a copy of the list of type parameters, otherwise
     // transformations like erasure don't work.
     List<TypeParameter> classTypeParametersCopy =
-        List.from(parentConstructor.enclosingClass.typeParameters);
+        List.from(parentConstructor.enclosingClass!.typeParameters);
     List<TypeParameter> typedefTypeParametersCopy =
         List.from(typedef.typeParameters);
     List<DartType> asTypeArguments =
@@ -3022,7 +3406,7 @@
     DartType unaliasedTypedef = typedefType.unalias;
     assert(unaliasedTypedef is InterfaceType,
         "[typedef] is assumed to resolve to an interface type");
-    InterfaceType targetType = unaliasedTypedef;
+    InterfaceType targetType = unaliasedTypedef as InterfaceType;
     Substitution substitution = Substitution.fromPairs(
         classTypeParametersCopy, targetType.typeArguments);
     List<DartType> positional = positionalParameters
@@ -3031,7 +3415,7 @@
         .toList(growable: false);
     List<NamedType> named = namedParameters
         .map((VariableDeclaration decl) => NamedType(
-            decl.name, substitution.substituteType(decl.type),
+            decl.name!, substitution.substituteType(decl.type),
             isRequired: decl.isRequired))
         .toList(growable: false);
     named.sort();
@@ -3066,7 +3450,7 @@
     DartType unaliasedTypedef = typedefType.unalias;
     assert(unaliasedTypedef is InterfaceType,
         "[typedef] is assumed to resolve to an interface type");
-    InterfaceType targetType = unaliasedTypedef;
+    InterfaceType targetType = unaliasedTypedef as InterfaceType;
     Substitution substitution = Substitution.fromPairs(
         classTypeParametersCopy, targetType.typeArguments);
     List<DartType> positional = positionalParameters
@@ -3075,7 +3459,7 @@
         .toList(growable: false);
     List<NamedType> named = namedParameters
         .map((VariableDeclaration decl) => NamedType(
-            decl.name, substitution.substituteType(decl.type),
+            decl.name!, substitution.substituteType(decl.type),
             isRequired: decl.isRequired))
         .toList(growable: false);
     named.sort();
@@ -3085,23 +3469,42 @@
         requiredParameterCount: requiredParameterCount);
   }
 
+  @override
   R accept<R>(TreeVisitor<R> v) => v.visitFunctionNode(this);
 
-  visitChildren(Visitor v) {
+  @override
+  R accept1<R, A>(TreeVisitor1<R, A> v, A arg) =>
+      v.visitFunctionNode(this, arg);
+
+  @override
+  void visitChildren(Visitor v) {
     visitList(typeParameters, v);
     visitList(positionalParameters, v);
     visitList(namedParameters, v);
-    returnType?.accept(v);
+    returnType.accept(v);
     body?.accept(v);
   }
 
-  transformChildren(Transformer v) {
-    transformList(typeParameters, v, this);
-    transformList(positionalParameters, v, this);
-    transformList(namedParameters, v, this);
+  @override
+  void transformChildren(Transformer v) {
+    v.transformList(typeParameters, this);
+    v.transformList(positionalParameters, this);
+    v.transformList(namedParameters, this);
     returnType = v.visitDartType(returnType);
     if (body != null) {
-      body = body.accept<TreeNode>(v);
+      body = v.transform(body!);
+      body?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    v.transformTypeParameterList(typeParameters, this);
+    v.transformVariableDeclarationList(positionalParameters, this);
+    v.transformVariableDeclarationList(namedParameters, this);
+    returnType = v.visitDartType(returnType, cannotRemoveSentinel);
+    if (body != null) {
+      body = v.transformOrRemoveStatement(body!);
       body?.parent = this;
     }
   }
@@ -3206,8 +3609,7 @@
     DartType type = getStaticType(context);
     while (type is TypeParameterType) {
       TypeParameterType typeParameterType = type;
-      type =
-          typeParameterType.promotedBound ?? typeParameterType.parameter.bound;
+      type = typeParameterType.bound;
     }
     if (type is NullType) {
       return context.typeEnvironment.coreTypes
@@ -3217,7 +3619,7 @@
           .bottomInterfaceType(superclass, type.nullability);
     }
     if (type is InterfaceType) {
-      List<DartType> upcastTypeArguments = context.typeEnvironment
+      List<DartType>? upcastTypeArguments = context.typeEnvironment
           .getTypeArgumentsAsInstanceOf(type, superclass);
       if (upcastTypeArguments != null) {
         return new InterfaceType(
@@ -3257,18 +3659,20 @@
         .rawType(superclass, context.nonNullable);
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg);
 
   int get precedence => astToText.Precedence.of(this);
 
+  @override
   String toText(AstTextStrategy strategy) {
     AstPrinter printer = new AstPrinter(strategy);
     printer.writeExpression(this);
     return printer.getText();
   }
-
-  void toTextInternal(AstPrinter printer);
 }
 
 /// An expression containing compile-time errors.
@@ -3304,6 +3708,9 @@
   void transformChildren(Transformer v) {}
 
   @override
+  void transformOrRemoveChildren(RemovingTransformer v) {}
+
+  @override
   String toString() {
     return "InvalidExpression(${toStringInternal()})";
   }
@@ -3319,10 +3726,13 @@
 /// Read a local variable, a local function, or a function parameter.
 class VariableGet extends Expression {
   VariableDeclaration variable;
-  DartType promotedType; // Null if not promoted.
+  DartType? promotedType; // Null if not promoted.
 
-  VariableGet(this.variable, [this.promotedType]) : assert(variable != null);
+  VariableGet(this.variable, [this.promotedType])
+      // ignore: unnecessary_null_comparison
+      : assert(variable != null);
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -3331,17 +3741,34 @@
     return promotedType ?? variable.type;
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitVariableGet(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitVariableGet(this, arg);
 
-  visitChildren(Visitor v) {
+  @override
+  void visitChildren(Visitor v) {
     promotedType?.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
     if (promotedType != null) {
-      promotedType = v.visitDartType(promotedType);
+      promotedType = v.visitDartType(promotedType!);
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (promotedType != null) {
+      DartType newPromotedType = v.visitDartType(promotedType!, dummyDartType);
+      if (identical(newPromotedType, dummyDartType)) {
+        promotedType = null;
+      } else {
+        promotedType = newPromotedType;
+      }
     }
   }
 
@@ -3355,7 +3782,7 @@
     printer.write(printer.getVariableName(variable));
     if (promotedType != null) {
       printer.write('{');
-      printer.writeType(promotedType);
+      printer.writeType(promotedType!);
       printer.write('}');
     }
   }
@@ -3368,10 +3795,13 @@
   VariableDeclaration variable;
   Expression value;
 
-  VariableSet(this.variable, this.value) : assert(variable != null) {
-    value?.parent = this;
+  VariableSet(this.variable, this.value)
+      // ignore: unnecessary_null_comparison
+      : assert(variable != null) {
+    value.parent = this;
   }
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -3379,18 +3809,33 @@
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       value.getStaticType(context);
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitVariableSet(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitVariableSet(this, arg);
 
-  visitChildren(Visitor v) {
-    value?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    value.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (value != null) {
-      value = value.accept<TreeNode>(v);
-      value?.parent = this;
+      value = v.transform(value);
+      value.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (value != null) {
+      value = v.transform(value);
+      value.parent = this;
     }
   }
 
@@ -3440,10 +3885,13 @@
   Name name;
 
   DynamicGet(this.kind, this.receiver, this.name) {
-    receiver?.parent = this;
+    receiver.parent = this;
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitDynamicGet(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitDynamicGet(this, arg);
 
@@ -3458,20 +3906,29 @@
       case DynamicAccessKind.Unresolved:
         return const InvalidType();
     }
-    return const DynamicType();
   }
 
   @override
   void visitChildren(Visitor v) {
-    receiver?.accept(v);
-    name?.accept(v);
+    receiver.accept(v);
+    name.accept(v);
   }
 
   @override
   void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
-      receiver?.parent = this;
+      receiver = v.transform(receiver);
+      receiver.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (receiver != null) {
+      receiver = v.transform(receiver);
+      receiver.parent = this;
     }
   }
 
@@ -3514,41 +3971,59 @@
   Reference interfaceTargetReference;
 
   InstanceGet(InstanceAccessKind kind, Expression receiver, Name name,
-      {Member interfaceTarget, DartType resultType})
+      {required Member interfaceTarget, required DartType resultType})
       : this.byReference(kind, receiver, name,
-            interfaceTargetReference: getMemberReferenceGetter(interfaceTarget),
+            interfaceTargetReference:
+                getNonNullableMemberReferenceGetter(interfaceTarget),
             resultType: resultType);
 
   InstanceGet.byReference(this.kind, this.receiver, this.name,
-      {this.interfaceTargetReference, this.resultType})
+      {required this.interfaceTargetReference, required this.resultType})
+      // ignore: unnecessary_null_comparison
       : assert(interfaceTargetReference != null),
+        // ignore: unnecessary_null_comparison
         assert(resultType != null) {
-    receiver?.parent = this;
+    receiver.parent = this;
   }
 
-  Member get interfaceTarget => interfaceTargetReference?.asMember;
+  Member get interfaceTarget => interfaceTargetReference.asMember;
 
   void set interfaceTarget(Member member) {
-    interfaceTargetReference = getMemberReferenceSetter(member);
+    interfaceTargetReference = getNonNullableMemberReferenceSetter(member);
   }
 
   @override
   DartType getStaticTypeInternal(StaticTypeContext context) => resultType;
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitInstanceGet(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitInstanceGet(this, arg);
 
-  visitChildren(Visitor v) {
-    receiver?.accept(v);
-    interfaceTarget?.acceptReference(v);
-    name?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    receiver.accept(v);
+    interfaceTarget.acceptReference(v);
+    name.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
-      receiver?.parent = this;
+      receiver = v.transform(receiver);
+      receiver.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (receiver != null) {
+      receiver = v.transform(receiver);
+      receiver.parent = this;
     }
   }
 
@@ -3572,24 +4047,40 @@
   Expression receiver;
 
   FunctionTearOff(this.receiver) {
-    receiver?.parent = this;
+    receiver.parent = this;
   }
 
+  @override
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       receiver.getStaticType(context);
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitFunctionTearOff(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitFunctionTearOff(this, arg);
 
-  visitChildren(Visitor v) {
-    receiver?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    receiver.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
-      receiver?.parent = this;
+      receiver = v.transform(receiver);
+      receiver.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (receiver != null) {
+      receiver = v.transform(receiver);
+      receiver.parent = this;
     }
   }
 
@@ -3631,39 +4122,55 @@
   Reference interfaceTargetReference;
 
   InstanceTearOff(InstanceAccessKind kind, Expression receiver, Name name,
-      {Procedure interfaceTarget, DartType resultType})
+      {required Procedure interfaceTarget, required DartType resultType})
       : this.byReference(kind, receiver, name,
-            interfaceTargetReference: getMemberReferenceGetter(interfaceTarget),
+            interfaceTargetReference:
+                getNonNullableMemberReferenceGetter(interfaceTarget),
             resultType: resultType);
 
   InstanceTearOff.byReference(this.kind, this.receiver, this.name,
-      {this.interfaceTargetReference, this.resultType}) {
-    receiver?.parent = this;
+      {required this.interfaceTargetReference, required this.resultType}) {
+    receiver.parent = this;
   }
 
-  Procedure get interfaceTarget => interfaceTargetReference?.asMember;
+  Procedure get interfaceTarget => interfaceTargetReference.asProcedure;
 
-  void set interfaceTarget(Member member) {
-    interfaceTargetReference = getMemberReferenceSetter(member);
+  void set interfaceTarget(Procedure procedure) {
+    interfaceTargetReference = getNonNullableMemberReferenceSetter(procedure);
   }
 
   @override
   DartType getStaticTypeInternal(StaticTypeContext context) => resultType;
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitInstanceTearOff(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitInstanceTearOff(this, arg);
 
-  visitChildren(Visitor v) {
-    receiver?.accept(v);
-    interfaceTarget?.acceptReference(v);
-    name?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    receiver.accept(v);
+    interfaceTarget.acceptReference(v);
+    name.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
-      receiver?.parent = this;
+      receiver = v.transform(receiver);
+      receiver.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (receiver != null) {
+      receiver = v.transform(receiver);
+      receiver.parent = this;
     }
   }
 
@@ -3688,27 +4195,28 @@
   Expression receiver;
   Name name;
 
-  Reference interfaceTargetReference;
+  Reference? interfaceTargetReference;
 
-  PropertyGet(Expression receiver, Name name, [Member interfaceTarget])
+  PropertyGet(Expression receiver, Name name, [Member? interfaceTarget])
       : this.byReference(
             receiver, name, getMemberReferenceGetter(interfaceTarget));
 
   PropertyGet.byReference(
       this.receiver, this.name, this.interfaceTargetReference) {
-    receiver?.parent = this;
+    receiver.parent = this;
   }
 
-  Member get interfaceTarget => interfaceTargetReference?.asMember;
+  Member? get interfaceTarget => interfaceTargetReference?.asMember;
 
-  void set interfaceTarget(Member member) {
+  void set interfaceTarget(Member? member) {
     interfaceTargetReference = getMemberReferenceGetter(member);
   }
 
+  @override
   DartType getStaticTypeInternal(StaticTypeContext context) {
-    Member interfaceTarget = this.interfaceTarget;
+    Member? interfaceTarget = this.interfaceTarget;
     if (interfaceTarget != null) {
-      Class superclass = interfaceTarget.enclosingClass;
+      Class superclass = interfaceTarget.enclosingClass!;
       InterfaceType receiverType =
           receiver.getStaticTypeAsInstanceOf(superclass, context);
       return Substitution.fromInterfaceType(receiverType)
@@ -3724,20 +4232,35 @@
     return const DynamicType();
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitPropertyGet(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitPropertyGet(this, arg);
 
-  visitChildren(Visitor v) {
-    receiver?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    receiver.accept(v);
     interfaceTarget?.acceptReference(v);
-    name?.accept(v);
+    name.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
-      receiver?.parent = this;
+      receiver = v.transform(receiver);
+      receiver.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (receiver != null) {
+      receiver = v.transform(receiver);
+      receiver.parent = this;
     }
   }
 
@@ -3762,31 +4285,53 @@
   Expression value;
 
   DynamicSet(this.kind, this.receiver, this.name, this.value) {
-    receiver?.parent = this;
-    value?.parent = this;
+    receiver.parent = this;
+    value.parent = this;
   }
 
+  @override
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       value.getStaticType(context);
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitDynamicSet(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitDynamicSet(this, arg);
 
-  visitChildren(Visitor v) {
-    receiver?.accept(v);
-    name?.accept(v);
-    value?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    receiver.accept(v);
+    name.accept(v);
+    value.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
-      receiver?.parent = this;
+      receiver = v.transform(receiver);
+      receiver.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (value != null) {
-      value = value.accept<TreeNode>(v);
-      value?.parent = this;
+      value = v.transform(value);
+      value.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (receiver != null) {
+      receiver = v.transform(receiver);
+      receiver.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (value != null) {
+      value = v.transform(value);
+      value.parent = this;
     }
   }
 
@@ -3818,46 +4363,69 @@
 
   InstanceSet(
       InstanceAccessKind kind, Expression receiver, Name name, Expression value,
-      {Member interfaceTarget})
+      {required Member interfaceTarget})
       : this.byReference(kind, receiver, name, value,
             interfaceTargetReference:
-                getMemberReferenceSetter(interfaceTarget));
+                getNonNullableMemberReferenceSetter(interfaceTarget));
 
   InstanceSet.byReference(this.kind, this.receiver, this.name, this.value,
-      {this.interfaceTargetReference})
+      {required this.interfaceTargetReference})
+      // ignore: unnecessary_null_comparison
       : assert(interfaceTargetReference != null) {
-    receiver?.parent = this;
-    value?.parent = this;
+    receiver.parent = this;
+    value.parent = this;
   }
 
-  Member get interfaceTarget => interfaceTargetReference?.asMember;
+  Member get interfaceTarget => interfaceTargetReference.asMember;
 
   void set interfaceTarget(Member member) {
-    interfaceTargetReference = getMemberReferenceSetter(member);
+    interfaceTargetReference = getNonNullableMemberReferenceSetter(member);
   }
 
+  @override
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       value.getStaticType(context);
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitInstanceSet(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitInstanceSet(this, arg);
 
-  visitChildren(Visitor v) {
-    receiver?.accept(v);
-    interfaceTarget?.acceptReference(v);
-    name?.accept(v);
-    value?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    receiver.accept(v);
+    interfaceTarget.acceptReference(v);
+    name.accept(v);
+    value.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
-      receiver?.parent = this;
+      receiver = v.transform(receiver);
+      receiver.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (value != null) {
-      value = value.accept<TreeNode>(v);
-      value?.parent = this;
+      value = v.transform(value);
+      value.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (receiver != null) {
+      receiver = v.transform(receiver);
+      receiver.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (value != null) {
+      value = v.transform(value);
+      value.parent = this;
     }
   }
 
@@ -3887,47 +4455,69 @@
   Name name;
   Expression value;
 
-  Reference interfaceTargetReference;
+  Reference? interfaceTargetReference;
 
   PropertySet(Expression receiver, Name name, Expression value,
-      [Member interfaceTarget])
+      [Member? interfaceTarget])
       : this.byReference(
             receiver, name, value, getMemberReferenceSetter(interfaceTarget));
 
   PropertySet.byReference(
       this.receiver, this.name, this.value, this.interfaceTargetReference) {
-    receiver?.parent = this;
-    value?.parent = this;
+    receiver.parent = this;
+    value.parent = this;
   }
 
-  Member get interfaceTarget => interfaceTargetReference?.asMember;
+  Member? get interfaceTarget => interfaceTargetReference?.asMember;
 
-  void set interfaceTarget(Member member) {
+  void set interfaceTarget(Member? member) {
     interfaceTargetReference = getMemberReferenceSetter(member);
   }
 
+  @override
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       value.getStaticType(context);
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitPropertySet(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitPropertySet(this, arg);
 
-  visitChildren(Visitor v) {
-    receiver?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    receiver.accept(v);
     interfaceTarget?.acceptReference(v);
-    name?.accept(v);
-    value?.accept(v);
+    name.accept(v);
+    value.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
-      receiver?.parent = this;
+      receiver = v.transform(receiver);
+      receiver.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (value != null) {
-      value = value.accept<TreeNode>(v);
-      value?.parent = this;
+      value = v.transform(value);
+      value.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (receiver != null) {
+      receiver = v.transform(receiver);
+      receiver.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (value != null) {
+      value = v.transform(value);
+      value.parent = this;
     }
   }
 
@@ -3953,46 +4543,56 @@
 class SuperPropertyGet extends Expression {
   Name name;
 
-  Reference interfaceTargetReference;
+  Reference? interfaceTargetReference;
 
-  SuperPropertyGet(Name name, [Member interfaceTarget])
+  SuperPropertyGet(Name name, [Member? interfaceTarget])
       : this.byReference(name, getMemberReferenceGetter(interfaceTarget));
 
   SuperPropertyGet.byReference(this.name, this.interfaceTargetReference);
 
-  Member get interfaceTarget => interfaceTargetReference?.asMember;
+  Member? get interfaceTarget => interfaceTargetReference?.asMember;
 
-  void set interfaceTarget(Member member) {
+  void set interfaceTarget(Member? member) {
     interfaceTargetReference = getMemberReferenceGetter(member);
   }
 
+  @override
   DartType getStaticTypeInternal(StaticTypeContext context) {
+    Member? interfaceTarget = this.interfaceTarget;
     if (interfaceTarget == null) {
       // TODO(johnniwinther): SuperPropertyGet without a target should be
       // replaced by invalid expressions.
       return const DynamicType();
     }
-    Class declaringClass = interfaceTarget.enclosingClass;
+    Class declaringClass = interfaceTarget.enclosingClass!;
     if (declaringClass.typeParameters.isEmpty) {
       return interfaceTarget.getterType;
     }
-    List<DartType> receiverArguments = context.typeEnvironment
-        .getTypeArgumentsAsInstanceOf(context.thisType, declaringClass);
+    List<DartType>? receiverArguments = context.typeEnvironment
+        .getTypeArgumentsAsInstanceOf(context.thisType!, declaringClass);
     return Substitution.fromPairs(
-            declaringClass.typeParameters, receiverArguments)
+            declaringClass.typeParameters, receiverArguments!)
         .substituteType(interfaceTarget.getterType);
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitSuperPropertyGet(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitSuperPropertyGet(this, arg);
 
-  visitChildren(Visitor v) {
+  @override
+  void visitChildren(Visitor v) {
     interfaceTarget?.acceptReference(v);
-    name?.accept(v);
+    name.accept(v);
   }
 
-  transformChildren(Transformer v) {}
+  @override
+  void transformChildren(Transformer v) {}
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {}
 
   @override
   String toString() {
@@ -4015,7 +4615,7 @@
   Name name;
   Expression value;
 
-  Reference interfaceTargetReference;
+  Reference? interfaceTargetReference;
 
   SuperPropertySet(Name name, Expression value, Member interfaceTarget)
       : this.byReference(
@@ -4023,32 +4623,48 @@
 
   SuperPropertySet.byReference(
       this.name, this.value, this.interfaceTargetReference) {
-    value?.parent = this;
+    value.parent = this;
   }
 
-  Member get interfaceTarget => interfaceTargetReference?.asMember;
+  Member? get interfaceTarget => interfaceTargetReference?.asMember;
 
-  void set interfaceTarget(Member member) {
+  void set interfaceTarget(Member? member) {
     interfaceTargetReference = getMemberReferenceSetter(member);
   }
 
+  @override
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       value.getStaticType(context);
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitSuperPropertySet(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitSuperPropertySet(this, arg);
 
-  visitChildren(Visitor v) {
+  @override
+  void visitChildren(Visitor v) {
     interfaceTarget?.acceptReference(v);
-    name?.accept(v);
-    value?.accept(v);
+    name.accept(v);
+    value.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (value != null) {
-      value = value.accept<TreeNode>(v);
-      value?.parent = this;
+      value = v.transform(value);
+      value.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (value != null) {
+      value = v.transform(value);
+      value.parent = this;
     }
   }
 
@@ -4071,28 +4687,38 @@
   /// A static field, getter, or method (for tear-off).
   Reference targetReference;
 
-  StaticGet(Member target) : this.byReference(getMemberReferenceGetter(target));
+  StaticGet(Member target)
+      : this.byReference(getNonNullableMemberReferenceGetter(target));
 
   StaticGet.byReference(this.targetReference);
 
-  Member get target => targetReference?.asMember;
+  Member get target => targetReference.asMember;
 
   void set target(Member target) {
-    targetReference = getMemberReferenceGetter(target);
+    targetReference = getNonNullableMemberReferenceGetter(target);
   }
 
+  @override
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       target.getterType;
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitStaticGet(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitStaticGet(this, arg);
 
-  visitChildren(Visitor v) {
-    target?.acceptReference(v);
+  @override
+  void visitChildren(Visitor v) {
+    target.acceptReference(v);
   }
 
-  transformChildren(Transformer v) {}
+  @override
+  void transformChildren(Transformer v) {}
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {}
 
   @override
   String toString() {
@@ -4110,28 +4736,37 @@
   Reference targetReference;
 
   StaticTearOff(Procedure target)
-      : this.byReference(getMemberReferenceGetter(target));
+      : this.byReference(getNonNullableMemberReferenceGetter(target));
 
   StaticTearOff.byReference(this.targetReference);
 
-  Procedure get target => targetReference?.asProcedure;
+  Procedure get target => targetReference.asProcedure;
 
   void set target(Procedure target) {
-    targetReference = getMemberReferenceGetter(target);
+    targetReference = getNonNullableMemberReferenceGetter(target);
   }
 
+  @override
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       target.getterType;
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitStaticTearOff(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitStaticTearOff(this, arg);
 
-  visitChildren(Visitor v) {
-    target?.acceptReference(v);
+  @override
+  void visitChildren(Visitor v) {
+    target.acceptReference(v);
   }
 
-  transformChildren(Transformer v) {}
+  @override
+  void transformChildren(Transformer v) {}
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {}
 
   @override
   String toString() {
@@ -4153,34 +4788,50 @@
   Expression value;
 
   StaticSet(Member target, Expression value)
-      : this.byReference(getMemberReferenceSetter(target), value);
+      : this.byReference(getNonNullableMemberReferenceSetter(target), value);
 
   StaticSet.byReference(this.targetReference, this.value) {
-    value?.parent = this;
+    value.parent = this;
   }
 
-  Member get target => targetReference?.asMember;
+  Member get target => targetReference.asMember;
 
   void set target(Member target) {
-    targetReference = getMemberReferenceSetter(target);
+    targetReference = getNonNullableMemberReferenceSetter(target);
   }
 
+  @override
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       value.getStaticType(context);
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitStaticSet(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitStaticSet(this, arg);
 
-  visitChildren(Visitor v) {
-    target?.acceptReference(v);
-    value?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    target.acceptReference(v);
+    value.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (value != null) {
-      value = value.accept<TreeNode>(v);
-      value?.parent = this;
+      value = v.transform(value);
+      value.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (value != null) {
+      value = v.transform(value);
+      value.parent = this;
     }
   }
 
@@ -4205,7 +4856,7 @@
   List<NamedExpression> named;
 
   Arguments(this.positional,
-      {List<DartType> types, List<NamedExpression> named})
+      {List<DartType>? types, List<NamedExpression>? named})
       : this.types = types ?? <DartType>[],
         this.named = named ?? <NamedExpression>[] {
     setParents(this.positional, this);
@@ -4223,7 +4874,7 @@
             .map<Expression>((p) => new VariableGet(p))
             .toList(),
         named: function.namedParameters
-            .map((p) => new NamedExpression(p.name, new VariableGet(p)))
+            .map((p) => new NamedExpression(p.name!, new VariableGet(p)))
             .toList(),
         types: function.typeParameters
             .map<DartType>((p) =>
@@ -4232,18 +4883,31 @@
             .toList());
   }
 
+  @override
   R accept<R>(TreeVisitor<R> v) => v.visitArguments(this);
 
-  visitChildren(Visitor v) {
+  @override
+  R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitArguments(this, arg);
+
+  @override
+  void visitChildren(Visitor v) {
     visitList(types, v);
     visitList(positional, v);
     visitList(named, v);
   }
 
-  transformChildren(Transformer v) {
-    transformTypeList(types, v);
-    transformList(positional, v, this);
-    transformList(named, v, this);
+  @override
+  void transformChildren(Transformer v) {
+    v.transformDartTypeList(types);
+    v.transformList(positional, this);
+    v.transformList(named, this);
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    v.transformDartTypeList(types);
+    v.transformExpressionList(positional, this);
+    v.transformNamedExpressionList(named, this);
   }
 
   @override
@@ -4251,12 +4915,14 @@
     return "Arguments(${toStringInternal()})";
   }
 
+  @override
   String toText(AstTextStrategy strategy) {
     AstPrinter printer = new AstPrinter(strategy);
     printer.writeArguments(this);
     return printer.getText();
   }
 
+  @override
   void toTextInternal(AstPrinter printer, {bool includeTypeArguments: true}) {
     if (includeTypeArguments) {
       printer.writeTypeArguments(types);
@@ -4289,19 +4955,36 @@
   Expression value;
 
   NamedExpression(this.name, this.value) {
-    value?.parent = this;
+    value.parent = this;
   }
 
+  @override
   R accept<R>(TreeVisitor<R> v) => v.visitNamedExpression(this);
 
-  visitChildren(Visitor v) {
-    value?.accept(v);
+  @override
+  R accept1<R, A>(TreeVisitor1<R, A> v, A arg) =>
+      v.visitNamedExpression(this, arg);
+
+  @override
+  void visitChildren(Visitor v) {
+    value.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (value != null) {
-      value = value.accept<TreeNode>(v);
-      value?.parent = this;
+      value = v.transform(value);
+      value.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (value != null) {
+      value = v.transform(value);
+      value.parent = this;
     }
   }
 
@@ -4310,12 +4993,14 @@
     return "NamedExpression(${toStringInternal()})";
   }
 
+  @override
   String toText(AstTextStrategy strategy) {
     AstPrinter printer = new AstPrinter(strategy);
     toTextInternal(printer);
     return printer.getText();
   }
 
+  @override
   void toTextInternal(AstPrinter printer) {
     printer.write(name);
     printer.write(': ');
@@ -4330,20 +5015,22 @@
   void set arguments(Arguments value);
 
   /// Name of the invoked method.
-  ///
-  /// May be `null` if the target is a synthetic static member without a name.
   Name get name;
 }
 
 class DynamicInvocation extends InvocationExpression {
   final DynamicAccessKind kind;
   Expression receiver;
+
+  @override
   Name name;
+
+  @override
   Arguments arguments;
 
   DynamicInvocation(this.kind, this.receiver, this.name, this.arguments) {
-    receiver?.parent = this;
-    arguments?.parent = this;
+    receiver.parent = this;
+    arguments.parent = this;
   }
 
   @override
@@ -4357,27 +5044,47 @@
       case DynamicAccessKind.Unresolved:
         return const InvalidType();
     }
-    return const DynamicType();
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitDynamicInvocation(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitDynamicInvocation(this, arg);
 
-  visitChildren(Visitor v) {
-    receiver?.accept(v);
-    name?.accept(v);
-    arguments?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    receiver.accept(v);
+    name.accept(v);
+    arguments.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
-      receiver?.parent = this;
+      receiver = v.transform(receiver);
+      receiver.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (arguments != null) {
-      arguments = arguments.accept<TreeNode>(v);
-      arguments?.parent = this;
+      arguments = v.transform(arguments);
+      arguments.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (receiver != null) {
+      receiver = v.transform(receiver);
+      receiver.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (arguments != null) {
+      arguments = v.transform(arguments);
+      arguments.parent = this;
     }
   }
 
@@ -4458,8 +5165,13 @@
 
   final InstanceAccessKind kind;
   Expression receiver;
+
+  @override
   Name name;
+
+  @override
   Arguments arguments;
+
   int flags = 0;
 
   /// The static type of the invocation.
@@ -4481,25 +5193,29 @@
   Reference interfaceTargetReference;
 
   InstanceInvocation(InstanceAccessKind kind, Expression receiver, Name name,
-      Arguments arguments, {Member interfaceTarget, FunctionType functionType})
+      Arguments arguments,
+      {required Member interfaceTarget, required FunctionType functionType})
       : this.byReference(kind, receiver, name, arguments,
-            interfaceTargetReference: getMemberReferenceGetter(interfaceTarget),
+            interfaceTargetReference:
+                getNonNullableMemberReferenceGetter(interfaceTarget),
             functionType: functionType);
 
   InstanceInvocation.byReference(
       this.kind, this.receiver, this.name, this.arguments,
-      {this.interfaceTargetReference, this.functionType})
+      {required this.interfaceTargetReference, required this.functionType})
+      // ignore: unnecessary_null_comparison
       : assert(interfaceTargetReference != null),
+        // ignore: unnecessary_null_comparison
         assert(functionType != null),
         assert(functionType.typeParameters.isEmpty) {
-    receiver?.parent = this;
-    arguments?.parent = this;
+    receiver.parent = this;
+    arguments.parent = this;
   }
 
-  Member get interfaceTarget => interfaceTargetReference?.asMember;
+  Member get interfaceTarget => interfaceTargetReference.asMember;
 
   void set interfaceTarget(Member target) {
-    interfaceTargetReference = getMemberReferenceGetter(target);
+    interfaceTargetReference = getNonNullableMemberReferenceGetter(target);
   }
 
   /// If `true`, this call is known to be safe wrt. parameter covariance checks.
@@ -4537,28 +5253,50 @@
     flags = value ? (flags | FlagBoundsSafe) : (flags & ~FlagBoundsSafe);
   }
 
+  @override
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       functionType.returnType;
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitInstanceInvocation(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitInstanceInvocation(this, arg);
 
-  visitChildren(Visitor v) {
-    receiver?.accept(v);
-    interfaceTarget?.acceptReference(v);
-    name?.accept(v);
-    arguments?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    receiver.accept(v);
+    interfaceTarget.acceptReference(v);
+    name.accept(v);
+    arguments.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
-      receiver?.parent = this;
+      receiver = v.transform(receiver);
+      receiver.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (arguments != null) {
-      arguments = arguments.accept<TreeNode>(v);
-      arguments?.parent = this;
+      arguments = v.transform(arguments);
+      arguments.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (receiver != null) {
+      receiver = v.transform(receiver);
+      receiver.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (arguments != null) {
+      arguments = v.transform(arguments);
+      arguments.parent = this;
     }
   }
 
@@ -4629,6 +5367,7 @@
 
   Expression receiver;
 
+  @override
   Arguments arguments;
 
   /// The static type of the invocation.
@@ -4646,37 +5385,60 @@
   ///      local(0); // The function type is `int Function(int)`.
   ///    }
   ///
-  FunctionType functionType;
+  FunctionType? functionType;
 
   FunctionInvocation(this.kind, this.receiver, this.arguments,
-      {this.functionType}) {
-    receiver?.parent = this;
-    arguments?.parent = this;
+      {required this.functionType}) {
+    receiver.parent = this;
+    arguments.parent = this;
   }
 
+  @override
   Name get name => Name.callName;
 
+  @override
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       functionType?.returnType ?? const DynamicType();
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitFunctionInvocation(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitFunctionInvocation(this, arg);
 
-  visitChildren(Visitor v) {
-    receiver?.accept(v);
-    name?.accept(v);
-    arguments?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    receiver.accept(v);
+    name.accept(v);
+    arguments.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
-      receiver?.parent = this;
+      receiver = v.transform(receiver);
+      receiver.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (arguments != null) {
-      arguments = arguments.accept<TreeNode>(v);
-      arguments?.parent = this;
+      arguments = v.transform(arguments);
+      arguments.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (receiver != null) {
+      receiver = v.transform(receiver);
+      receiver.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (arguments != null) {
+      arguments = v.transform(arguments);
+      arguments.parent = this;
     }
   }
 
@@ -4697,6 +5459,8 @@
 class LocalFunctionInvocation extends InvocationExpression {
   /// The variable declaration for the function declaration.
   VariableDeclaration variable;
+
+  @override
   Arguments arguments;
 
   /// The static type of the invocation.
@@ -4713,29 +5477,47 @@
   ///
   FunctionType functionType;
 
-  LocalFunctionInvocation(this.variable, this.arguments, {this.functionType})
+  LocalFunctionInvocation(this.variable, this.arguments,
+      {required this.functionType})
+      // ignore: unnecessary_null_comparison
       : assert(functionType != null) {
-    arguments?.parent = this;
+    arguments.parent = this;
   }
 
+  @override
   Name get name => Name.callName;
 
   @override
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       functionType.returnType;
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitLocalFunctionInvocation(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitLocalFunctionInvocation(this, arg);
 
-  visitChildren(Visitor v) {
-    arguments?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    arguments.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (arguments != null) {
-      arguments = arguments.accept<TreeNode>(v);
-      arguments?.parent = this;
+      arguments = v.transform(arguments);
+      arguments.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (arguments != null) {
+      arguments = v.transform(arguments);
+      arguments.parent = this;
     }
   }
 
@@ -4763,26 +5545,43 @@
   /// test.
   final bool isNot;
 
-  EqualsNull(this.expression, {this.isNot}) : assert(isNot != null) {
-    expression?.parent = this;
+  EqualsNull(this.expression, {required this.isNot})
+      // ignore: unnecessary_null_comparison
+      : assert(isNot != null) {
+    expression.parent = this;
   }
 
   @override
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.boolRawType(context.nonNullable);
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitEqualsNull(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitEqualsNull(this, arg);
 
-  visitChildren(Visitor v) {
-    expression?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    expression.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (expression != null) {
-      expression = expression.accept<TreeNode>(v);
-      expression?.parent = this;
+      expression = v.transform(expression);
+      expression.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (expression != null) {
+      expression = v.transform(expression);
+      expression.parent = this;
     }
   }
 
@@ -4831,49 +5630,75 @@
   Reference interfaceTargetReference;
 
   EqualsCall(Expression left, Expression right,
-      {bool isNot, FunctionType functionType, Procedure interfaceTarget})
+      {required bool isNot,
+      required FunctionType functionType,
+      required Procedure interfaceTarget})
       : this.byReference(left, right,
             isNot: isNot,
             functionType: functionType,
             interfaceTargetReference:
-                getMemberReferenceGetter(interfaceTarget));
+                getNonNullableMemberReferenceGetter(interfaceTarget));
 
   EqualsCall.byReference(this.left, this.right,
-      {this.isNot, this.functionType, this.interfaceTargetReference})
+      {required this.isNot,
+      required this.functionType,
+      required this.interfaceTargetReference})
+      // ignore: unnecessary_null_comparison
       : assert(isNot != null) {
-    left?.parent = this;
-    right?.parent = this;
+    left.parent = this;
+    right.parent = this;
   }
 
-  Procedure get interfaceTarget => interfaceTargetReference?.asProcedure;
+  Procedure get interfaceTarget => interfaceTargetReference.asProcedure;
 
   void set interfaceTarget(Procedure target) {
-    interfaceTargetReference = getMemberReferenceGetter(target);
+    interfaceTargetReference = getNonNullableMemberReferenceGetter(target);
   }
 
+  @override
   DartType getStaticTypeInternal(StaticTypeContext context) {
-    return functionType?.returnType ??
-        context.typeEnvironment.coreTypes.boolRawType(context.nonNullable);
+    return functionType.returnType;
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitEqualsCall(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitEqualsCall(this, arg);
 
-  visitChildren(Visitor v) {
-    left?.accept(v);
-    interfaceTarget?.acceptReference(v);
-    right?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    left.accept(v);
+    interfaceTarget.acceptReference(v);
+    right.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (left != null) {
-      left = left.accept<TreeNode>(v);
-      left?.parent = this;
+      left = v.transform(left);
+      left.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (right != null) {
-      right = right.accept<TreeNode>(v);
-      right?.parent = this;
+      right = v.transform(right);
+      right.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (left != null) {
+      left = v.transform(left);
+      left.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (right != null) {
+      right = v.transform(right);
+      right.parent = this;
     }
   }
 
@@ -4902,14 +5727,19 @@
   static const int FlagBoundsSafe = 1 << 1;
 
   Expression receiver;
+
+  @override
   Name name;
+
+  @override
   Arguments arguments;
+
   int flags = 0;
 
-  Reference interfaceTargetReference;
+  Reference? interfaceTargetReference;
 
   MethodInvocation(Expression receiver, Name name, Arguments arguments,
-      [Member interfaceTarget])
+      [Member? interfaceTarget])
       : this.byReference(
             receiver,
             name,
@@ -4919,13 +5749,13 @@
 
   MethodInvocation.byReference(
       this.receiver, this.name, this.arguments, this.interfaceTargetReference) {
-    receiver?.parent = this;
-    arguments?.parent = this;
+    receiver.parent = this;
+    arguments.parent = this;
   }
 
-  Member get interfaceTarget => interfaceTargetReference?.asMember;
+  Member? get interfaceTarget => interfaceTargetReference?.asMember;
 
-  void set interfaceTarget(Member target) {
+  void set interfaceTarget(Member? target) {
     // An invocation doesn't refer to the setter.
     interfaceTargetReference = getMemberReferenceGetter(target);
   }
@@ -4965,8 +5795,9 @@
     flags = value ? (flags | FlagBoundsSafe) : (flags & ~FlagBoundsSafe);
   }
 
+  @override
   DartType getStaticTypeInternal(StaticTypeContext context) {
-    Member interfaceTarget = this.interfaceTarget;
+    Member? interfaceTarget = this.interfaceTarget;
     if (interfaceTarget != null) {
       if (interfaceTarget is Procedure &&
           context.typeEnvironment
@@ -4975,8 +5806,8 @@
             receiver.getStaticType(context),
             arguments.positional[0].getStaticType(context));
       }
-      Class superclass = interfaceTarget.enclosingClass;
-      DartType receiverType =
+      Class superclass = interfaceTarget.enclosingClass!;
+      InterfaceType receiverType =
           receiver.getStaticTypeAsInstanceOf(superclass, context);
       DartType getterType = Substitution.fromInterfaceType(receiverType)
           .substituteType(interfaceTarget.getterType);
@@ -4993,7 +5824,7 @@
               getterType.typeParameters,
               getterType.typeParameters
                   .map((TypeParameter typeParameter) =>
-                      typeParameter.defaultType)
+                      typeParameter.defaultType!)
                   .toList());
         }
         return substitution.substituteType(getterType.returnType);
@@ -5004,7 +5835,7 @@
       // TODO(johnniwinther): Remove this when the front end performs the
       // correct replacement.
       if (getterType is InterfaceType) {
-        Member member = context.typeEnvironment
+        Member? member = context.typeEnvironment
             .getInterfaceMember(getterType.classNode, new Name('call'));
         if (member != null) {
           DartType callType = member.getterType;
@@ -5034,25 +5865,46 @@
     return const DynamicType();
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitMethodInvocation(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitMethodInvocation(this, arg);
 
-  visitChildren(Visitor v) {
-    receiver?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    receiver.accept(v);
     interfaceTarget?.acceptReference(v);
-    name?.accept(v);
-    arguments?.accept(v);
+    name.accept(v);
+    arguments.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (receiver != null) {
-      receiver = receiver.accept<TreeNode>(v);
-      receiver?.parent = this;
+      receiver = v.transform(receiver);
+      receiver.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (arguments != null) {
-      arguments = arguments.accept<TreeNode>(v);
-      arguments?.parent = this;
+      arguments = v.transform(arguments);
+      arguments.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (receiver != null) {
+      receiver = v.transform(receiver);
+      receiver.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (arguments != null) {
+      arguments = v.transform(arguments);
+      arguments.parent = this;
     }
   }
 
@@ -5075,13 +5927,16 @@
 ///
 /// The provided arguments might not match the parameters of the target.
 class SuperMethodInvocation extends InvocationExpression {
+  @override
   Name name;
+
+  @override
   Arguments arguments;
 
-  Reference interfaceTargetReference;
+  Reference? interfaceTargetReference;
 
   SuperMethodInvocation(Name name, Arguments arguments,
-      [Procedure interfaceTarget])
+      [Procedure? interfaceTarget])
       : this.byReference(
             name,
             arguments,
@@ -5090,43 +5945,60 @@
 
   SuperMethodInvocation.byReference(
       this.name, this.arguments, this.interfaceTargetReference) {
-    arguments?.parent = this;
+    arguments.parent = this;
   }
 
-  Procedure get interfaceTarget => interfaceTargetReference?.asProcedure;
+  Procedure? get interfaceTarget => interfaceTargetReference?.asProcedure;
 
-  void set interfaceTarget(Procedure target) {
+  void set interfaceTarget(Procedure? target) {
     // An invocation doesn't refer to the setter.
     interfaceTargetReference = getMemberReferenceGetter(target);
   }
 
+  @override
   DartType getStaticTypeInternal(StaticTypeContext context) {
+    Procedure? interfaceTarget = this.interfaceTarget;
     if (interfaceTarget == null) return const DynamicType();
-    Class superclass = interfaceTarget.enclosingClass;
-    List<DartType> receiverTypeArguments = context.typeEnvironment
-        .getTypeArgumentsAsInstanceOf(context.thisType, superclass);
-    DartType returnType =
-        Substitution.fromPairs(superclass.typeParameters, receiverTypeArguments)
-            .substituteType(interfaceTarget.function.returnType);
+    Class superclass = interfaceTarget.enclosingClass!;
+    List<DartType>? receiverTypeArguments = context.typeEnvironment
+        .getTypeArgumentsAsInstanceOf(context.thisType!, superclass);
+    DartType returnType = Substitution.fromPairs(
+            superclass.typeParameters, receiverTypeArguments!)
+        .substituteType(interfaceTarget.function!.returnType);
     return Substitution.fromPairs(
-            interfaceTarget.function.typeParameters, arguments.types)
+            interfaceTarget.function!.typeParameters, arguments.types)
         .substituteType(returnType);
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitSuperMethodInvocation(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitSuperMethodInvocation(this, arg);
 
-  visitChildren(Visitor v) {
+  @override
+  void visitChildren(Visitor v) {
     interfaceTarget?.acceptReference(v);
-    name?.accept(v);
-    arguments?.accept(v);
+    name.accept(v);
+    arguments.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (arguments != null) {
-      arguments = arguments.accept<TreeNode>(v);
-      arguments?.parent = this;
+      arguments = v.transform(arguments);
+      arguments.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (arguments != null) {
+      arguments = v.transform(arguments);
+      arguments.parent = this;
     }
   }
 
@@ -5149,51 +6021,70 @@
 /// The provided arguments might not match the parameters of the target.
 class StaticInvocation extends InvocationExpression {
   Reference targetReference;
+
+  @override
   Arguments arguments;
 
   /// True if this is a constant call to an external constant factory.
   bool isConst;
 
-  Name get name => target?.name;
+  @override
+  Name get name => target.name!;
 
   StaticInvocation(Procedure target, Arguments arguments, {bool isConst: false})
       : this.byReference(
             // An invocation doesn't refer to the setter.
-            getMemberReferenceGetter(target),
+            getNonNullableMemberReferenceGetter(target),
             arguments,
             isConst: isConst);
 
   StaticInvocation.byReference(this.targetReference, this.arguments,
       {this.isConst: false}) {
-    arguments?.parent = this;
+    arguments.parent = this;
   }
 
-  Procedure get target => targetReference?.asProcedure;
+  Procedure get target => targetReference.asProcedure;
 
   void set target(Procedure target) {
     // An invocation doesn't refer to the setter.
-    targetReference = getMemberReferenceGetter(target);
+    targetReference = getNonNullableMemberReferenceGetter(target);
   }
 
+  @override
   DartType getStaticTypeInternal(StaticTypeContext context) {
     return Substitution.fromPairs(
-            target.function.typeParameters, arguments.types)
-        .substituteType(target.function.returnType);
+            target.function!.typeParameters, arguments.types)
+        .substituteType(target.function!.returnType);
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitStaticInvocation(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitStaticInvocation(this, arg);
 
-  visitChildren(Visitor v) {
-    target?.acceptReference(v);
-    arguments?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    target.acceptReference(v);
+    arguments.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (arguments != null) {
-      arguments = arguments.accept<TreeNode>(v);
-      arguments?.parent = this;
+      arguments = v.transform(arguments);
+      arguments.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (arguments != null) {
+      arguments = v.transform(arguments);
+      arguments.parent = this;
     }
   }
 
@@ -5218,58 +6109,78 @@
 // generic functions.
 class ConstructorInvocation extends InvocationExpression {
   Reference targetReference;
+
+  @override
   Arguments arguments;
+
   bool isConst;
 
-  Name get name => target?.name;
+  @override
+  Name get name => target.name!;
 
   ConstructorInvocation(Constructor target, Arguments arguments,
       {bool isConst: false})
       : this.byReference(
             // A constructor doesn't refer to the setter.
-            getMemberReferenceGetter(target),
+            getNonNullableMemberReferenceGetter(target),
             arguments,
             isConst: isConst);
 
   ConstructorInvocation.byReference(this.targetReference, this.arguments,
       {this.isConst: false}) {
-    arguments?.parent = this;
+    arguments.parent = this;
   }
 
-  Constructor get target => targetReference?.asConstructor;
+  Constructor get target => targetReference.asConstructor;
 
   void set target(Constructor target) {
     // A constructor doesn't refer to the setter.
-    targetReference = getMemberReferenceGetter(target);
+    targetReference = getNonNullableMemberReferenceGetter(target);
   }
 
+  @override
   DartType getStaticTypeInternal(StaticTypeContext context) {
     return arguments.types.isEmpty
         ? context.typeEnvironment.coreTypes
-            .rawType(target.enclosingClass, context.nonNullable)
+            .rawType(target.enclosingClass!, context.nonNullable)
         : new InterfaceType(
-            target.enclosingClass, context.nonNullable, arguments.types);
+            target.enclosingClass!, context.nonNullable, arguments.types);
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitConstructorInvocation(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitConstructorInvocation(this, arg);
 
-  visitChildren(Visitor v) {
-    target?.acceptReference(v);
-    arguments?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    target.acceptReference(v);
+    arguments.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (arguments != null) {
-      arguments = arguments.accept<TreeNode>(v);
-      arguments?.parent = this;
+      arguments = v.transform(arguments);
+      arguments.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (arguments != null) {
+      arguments = v.transform(arguments);
+      arguments.parent = this;
     }
   }
 
   // TODO(dmitryas): Change the getter into a method that accepts a CoreTypes.
   InterfaceType get constructedType {
-    Class enclosingClass = target.enclosingClass;
+    Class enclosingClass = target.enclosingClass!;
     // TODO(dmitryas): Get raw type from a CoreTypes object if arguments is
     // empty.
     return arguments.types.isEmpty
@@ -5291,11 +6202,11 @@
     } else {
       printer.write('new ');
     }
-    printer.writeClassName(target.enclosingClass.reference);
+    printer.writeClassName(target.enclosingClass!.reference);
     printer.writeTypeArguments(arguments.types);
-    if (target.name.text.isNotEmpty) {
+    if (target.name!.text.isNotEmpty) {
       printer.write('.');
-      printer.write(target.name.text);
+      printer.write(target.name!.text);
     }
     printer.writeArguments(arguments, includeTypeArguments: false);
   }
@@ -5307,30 +6218,47 @@
   final List<DartType> typeArguments;
 
   Instantiation(this.expression, this.typeArguments) {
-    expression?.parent = this;
+    expression.parent = this;
   }
 
+  @override
   DartType getStaticTypeInternal(StaticTypeContext context) {
-    FunctionType type = expression.getStaticType(context);
+    FunctionType type = expression.getStaticType(context) as FunctionType;
     return Substitution.fromPairs(type.typeParameters, typeArguments)
         .substituteType(type.withoutTypeParameters);
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitInstantiation(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitInstantiation(this, arg);
 
-  visitChildren(Visitor v) {
-    expression?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    expression.accept(v);
     visitList(typeArguments, v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (expression != null) {
-      expression = expression.accept<TreeNode>(v);
-      expression?.parent = this;
+      expression = v.transform(expression);
+      expression.parent = this;
     }
-    transformTypeList(typeArguments, v);
+    v.transformDartTypeList(typeArguments);
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (expression != null) {
+      expression = v.transform(expression);
+      expression.parent = this;
+    }
+    v.transformDartTypeList(typeArguments);
   }
 
   @override
@@ -5353,9 +6281,10 @@
   Expression operand;
 
   Not(this.operand) {
-    operand?.parent = this;
+    operand.parent = this;
   }
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -5363,17 +6292,32 @@
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.boolRawType(context.nonNullable);
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitNot(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) => v.visitNot(this, arg);
 
-  visitChildren(Visitor v) {
-    operand?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    operand.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (operand != null) {
-      operand = operand.accept<TreeNode>(v);
-      operand?.parent = this;
+      operand = v.transform(operand);
+      operand.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (operand != null) {
+      operand = v.transform(operand);
+      operand.parent = this;
     }
   }
 
@@ -5399,7 +6343,6 @@
     case LogicalExpressionOperator.OR:
       return "||";
   }
-  throw "Unhandled LogicalExpressionOperator: ${operator}";
 }
 
 /// Expression of form `x && y` or `x || y`
@@ -5409,10 +6352,11 @@
   Expression right;
 
   LogicalExpression(this.left, this.operatorEnum, this.right) {
-    left?.parent = this;
-    right?.parent = this;
+    left.parent = this;
+    right.parent = this;
   }
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -5420,23 +6364,44 @@
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.boolRawType(context.nonNullable);
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitLogicalExpression(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitLogicalExpression(this, arg);
 
-  visitChildren(Visitor v) {
-    left?.accept(v);
-    right?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    left.accept(v);
+    right.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (left != null) {
-      left = left.accept<TreeNode>(v);
-      left?.parent = this;
+      left = v.transform(left);
+      left.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (right != null) {
-      right = right.accept<TreeNode>(v);
-      right?.parent = this;
+      right = v.transform(right);
+      right.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (left != null) {
+      left = v.transform(left);
+      left.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (right != null) {
+      right = v.transform(right);
+      right.parent = this;
     }
   }
 
@@ -5460,52 +6425,85 @@
   Expression then;
   Expression otherwise;
 
-  /// The static type of the expression. Should not be `null`.
+  /// The static type of the expression.
   DartType staticType;
 
   ConditionalExpression(
       this.condition, this.then, this.otherwise, this.staticType) {
-    condition?.parent = this;
-    then?.parent = this;
-    otherwise?.parent = this;
+    condition.parent = this;
+    then.parent = this;
+    otherwise.parent = this;
   }
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
   @override
   DartType getStaticTypeInternal(StaticTypeContext context) => staticType;
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitConditionalExpression(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitConditionalExpression(this, arg);
 
-  visitChildren(Visitor v) {
-    condition?.accept(v);
-    then?.accept(v);
-    otherwise?.accept(v);
-    staticType?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    condition.accept(v);
+    then.accept(v);
+    otherwise.accept(v);
+    staticType.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (condition != null) {
-      condition = condition.accept<TreeNode>(v);
-      condition?.parent = this;
+      condition = v.transform(condition);
+      condition.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (then != null) {
-      then = then.accept<TreeNode>(v);
-      then?.parent = this;
+      then = v.transform(then);
+      then.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (otherwise != null) {
-      otherwise = otherwise.accept<TreeNode>(v);
-      otherwise?.parent = this;
+      otherwise = v.transform(otherwise);
+      otherwise.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (staticType != null) {
       staticType = v.visitDartType(staticType);
     }
   }
 
   @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (condition != null) {
+      condition = v.transform(condition);
+      condition.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (then != null) {
+      then = v.transform(then);
+      then.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (otherwise != null) {
+      otherwise = v.transform(otherwise);
+      otherwise.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (staticType != null) {
+      staticType = v.visitDartType(staticType, cannotRemoveSentinel);
+    }
+  }
+
+  @override
   String toString() {
     return "ConditionalExpression(${toStringInternal()})";
   }
@@ -5515,6 +6513,7 @@
     printer.writeExpression(condition,
         minimumPrecedence: astToText.Precedence.LOGICAL_OR);
     printer.write(' ?');
+    // ignore: unnecessary_null_comparison
     if (staticType != null) {
       printer.write('{');
       printer.writeType(staticType);
@@ -5541,6 +6540,7 @@
     setParents(expressions, this);
   }
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -5548,16 +6548,26 @@
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.stringRawType(context.nonNullable);
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitStringConcatenation(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitStringConcatenation(this, arg);
 
-  visitChildren(Visitor v) {
+  @override
+  void visitChildren(Visitor v) {
     visitList(expressions, v);
   }
 
-  transformChildren(Transformer v) {
-    transformList(expressions, v, this);
+  @override
+  void transformChildren(Transformer v) {
+    v.transformList(expressions, this);
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    v.transformExpressionList(expressions, this);
   }
 
   @override
@@ -5596,6 +6606,7 @@
     setParents(lists, this);
   }
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -5604,18 +6615,29 @@
     return context.typeEnvironment.listType(typeArgument, context.nonNullable);
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitListConcatenation(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitListConcatenation(this, arg);
 
-  visitChildren(Visitor v) {
-    typeArgument?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    typeArgument.accept(v);
     visitList(lists, v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
     typeArgument = v.visitDartType(typeArgument);
-    transformList(lists, v, this);
+    v.transformList(lists, this);
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    typeArgument = v.visitDartType(typeArgument, cannotRemoveSentinel);
+    v.transformExpressionList(lists, this);
   }
 
   @override
@@ -5654,6 +6676,7 @@
     setParents(sets, this);
   }
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -5662,18 +6685,29 @@
     return context.typeEnvironment.setType(typeArgument, context.nonNullable);
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitSetConcatenation(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitSetConcatenation(this, arg);
 
-  visitChildren(Visitor v) {
-    typeArgument?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    typeArgument.accept(v);
     visitList(sets, v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
     typeArgument = v.visitDartType(typeArgument);
-    transformList(sets, v, this);
+    v.transformList(sets, this);
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    typeArgument = v.visitDartType(typeArgument, cannotRemoveSentinel);
+    v.transformExpressionList(sets, this);
   }
 
   @override
@@ -5715,6 +6749,7 @@
     setParents(maps, this);
   }
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -5724,20 +6759,32 @@
         .mapType(keyType, valueType, context.nonNullable);
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitMapConcatenation(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitMapConcatenation(this, arg);
 
-  visitChildren(Visitor v) {
-    keyType?.accept(v);
-    valueType?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    keyType.accept(v);
+    valueType.accept(v);
     visitList(maps, v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
     keyType = v.visitDartType(keyType);
     valueType = v.visitDartType(valueType);
-    transformList(maps, v, this);
+    v.transformList(maps, this);
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    keyType = v.visitDartType(keyType, cannotRemoveSentinel);
+    valueType = v.visitDartType(valueType, cannotRemoveSentinel);
+    v.transformExpressionList(maps, this);
   }
 
   @override
@@ -5780,6 +6827,7 @@
 
   Class get classNode => classReference.asClass;
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -5791,11 +6839,15 @@
         : new InterfaceType(classNode, context.nonNullable, typeArguments);
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitInstanceCreation(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitInstanceCreation(this, arg);
 
-  visitChildren(Visitor v) {
+  @override
+  void visitChildren(Visitor v) {
     classReference.asClass.acceptReference(v);
     visitList(typeArguments, v);
     for (final Reference reference in fieldValues.keys) {
@@ -5808,16 +6860,31 @@
     visitList(unusedArguments, v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
     fieldValues.forEach((Reference fieldRef, Expression value) {
-      Expression transformed = value.accept<TreeNode>(v);
+      Expression transformed = v.transform(value);
+      // ignore: unnecessary_null_comparison
       if (transformed != null && !identical(value, transformed)) {
         fieldValues[fieldRef] = transformed;
         transformed.parent = this;
       }
     });
-    transformList(asserts, v, this);
-    transformList(unusedArguments, v, this);
+    v.transformList(asserts, this);
+    v.transformList(unusedArguments, this);
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    fieldValues.forEach((Reference fieldRef, Expression value) {
+      Expression transformed = v.transform(value);
+      if (!identical(value, transformed)) {
+        fieldValues[fieldRef] = transformed;
+        transformed.parent = this;
+      }
+    });
+    v.transformList(asserts, this, dummyAssertStatement);
+    v.transformExpressionList(unusedArguments, this);
   }
 
   @override
@@ -5848,7 +6915,7 @@
       printer.writeExpression(assert_.condition);
       if (assert_.message != null) {
         printer.write(', ');
-        printer.writeExpression(assert_.message);
+        printer.writeExpression(assert_.message!);
       }
       printer.write(')');
       first = false;
@@ -5881,6 +6948,7 @@
     expression.parent = this;
   }
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -5888,19 +6956,30 @@
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       expression.getStaticType(context);
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitFileUriExpression(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitFileUriExpression(this, arg);
 
-  visitChildren(Visitor v) {
+  @override
+  void visitChildren(Visitor v) {
     expression.accept(v);
   }
 
-  transformChildren(Transformer v) {
-    expression = expression.accept<TreeNode>(v)..parent = this;
+  @override
+  void transformChildren(Transformer v) {
+    expression = v.transform(expression)..parent = this;
   }
 
-  Location _getLocationInEnclosingFile(int offset) {
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    expression = v.transform(expression)..parent = this;
+  }
+
+  @override
+  Location? _getLocationInEnclosingFile(int offset) {
     return _getLocationInComponent(enclosingComponent, fileUri, offset);
   }
 
@@ -5927,7 +7006,7 @@
   DartType type;
 
   IsExpression(this.operand, this.type) {
-    operand?.parent = this;
+    operand.parent = this;
   }
 
   // Must match serialized bit positions.
@@ -5953,24 +7032,40 @@
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.boolRawType(context.nonNullable);
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitIsExpression(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitIsExpression(this, arg);
 
-  visitChildren(Visitor v) {
-    operand?.accept(v);
-    type?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    operand.accept(v);
+    type.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (operand != null) {
-      operand = operand.accept<TreeNode>(v);
-      operand?.parent = this;
+      operand = v.transform(operand);
+      operand.parent = this;
     }
     type = v.visitDartType(type);
   }
 
   @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (operand != null) {
+      operand = v.transform(operand);
+      operand.parent = this;
+    }
+    type = v.visitDartType(type, cannotRemoveSentinel);
+  }
+
+  @override
   String toString() {
     return "IsExpression(${toStringInternal()})";
   }
@@ -5995,7 +7090,7 @@
   DartType type;
 
   AsExpression(this.operand, this.type) {
-    operand?.parent = this;
+    operand.parent = this;
   }
 
   // Must match serialized bit positions.
@@ -6060,30 +7155,47 @@
         : (flags & ~FlagForNonNullableByDefault);
   }
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
   @override
   DartType getStaticTypeInternal(StaticTypeContext context) => type;
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitAsExpression(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitAsExpression(this, arg);
 
-  visitChildren(Visitor v) {
-    operand?.accept(v);
-    type?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    operand.accept(v);
+    type.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (operand != null) {
-      operand = operand.accept<TreeNode>(v);
-      operand?.parent = this;
+      operand = v.transform(operand);
+      operand.parent = this;
     }
     type = v.visitDartType(type);
   }
 
   @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (operand != null) {
+      operand = v.transform(operand);
+      operand.parent = this;
+    }
+    type = v.visitDartType(type, cannotRemoveSentinel);
+  }
+
+  @override
   String toString() {
     return "AsExpression(${toStringInternal()})";
   }
@@ -6124,9 +7236,10 @@
   Expression operand;
 
   NullCheck(this.operand) {
-    operand?.parent = this;
+    operand.parent = this;
   }
 
+  @override
   DartType getStaticTypeInternal(StaticTypeContext context) {
     DartType operandType = operand.getStaticType(context);
     return operandType is NullType
@@ -6134,18 +7247,33 @@
         : operandType.withDeclaredNullability(Nullability.nonNullable);
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitNullCheck(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitNullCheck(this, arg);
 
-  visitChildren(Visitor v) {
-    operand?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    operand.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (operand != null) {
-      operand = operand.accept<TreeNode>(v);
-      operand?.parent = this;
+      operand = v.transform(operand);
+      operand.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (operand != null) {
+      operand = v.transform(operand);
+      operand.parent = this;
     }
   }
 
@@ -6164,17 +7292,25 @@
 
 /// An integer, double, boolean, string, or null constant.
 abstract class BasicLiteral extends Expression {
-  Object get value;
+  Object? get value;
 
-  visitChildren(Visitor v) {}
-  transformChildren(Transformer v) {}
+  @override
+  void visitChildren(Visitor v) {}
+
+  @override
+  void transformChildren(Transformer v) {}
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {}
 }
 
 class StringLiteral extends BasicLiteral {
+  @override
   String value;
 
   StringLiteral(this.value);
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -6182,7 +7318,10 @@
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.stringRawType(context.nonNullable);
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitStringLiteral(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitStringLiteral(this, arg);
 
@@ -6204,10 +7343,12 @@
   /// E.g. "0x8000000000000000" will be saved as "-9223372036854775808" despite
   /// technically (on some platforms, particularly Javascript) being positive.
   /// If the number is meant to be negative it will be wrapped in a "unary-".
+  @override
   int value;
 
   IntLiteral(this.value);
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -6215,7 +7356,10 @@
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.intRawType(context.nonNullable);
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitIntLiteral(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitIntLiteral(this, arg);
 
@@ -6231,10 +7375,12 @@
 }
 
 class DoubleLiteral extends BasicLiteral {
+  @override
   double value;
 
   DoubleLiteral(this.value);
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -6242,7 +7388,10 @@
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.doubleRawType(context.nonNullable);
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitDoubleLiteral(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitDoubleLiteral(this, arg);
 
@@ -6258,10 +7407,12 @@
 }
 
 class BoolLiteral extends BasicLiteral {
+  @override
   bool value;
 
   BoolLiteral(this.value);
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -6269,7 +7420,10 @@
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.boolRawType(context.nonNullable);
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitBoolLiteral(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitBoolLiteral(this, arg);
 
@@ -6285,7 +7439,8 @@
 }
 
 class NullLiteral extends BasicLiteral {
-  Object get value => null;
+  @override
+  Object? get value => null;
 
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
@@ -6293,7 +7448,10 @@
   @override
   DartType getStaticTypeInternal(StaticTypeContext context) => const NullType();
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitNullLiteral(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitNullLiteral(this, arg);
 
@@ -6313,6 +7471,7 @@
 
   SymbolLiteral(this.value);
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -6320,12 +7479,21 @@
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.symbolRawType(context.nonNullable);
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitSymbolLiteral(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitSymbolLiteral(this, arg);
 
-  visitChildren(Visitor v) {}
-  transformChildren(Transformer v) {}
+  @override
+  void visitChildren(Visitor v) {}
+
+  @override
+  void transformChildren(Transformer v) {}
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {}
 
   @override
   String toString() {
@@ -6344,6 +7512,7 @@
 
   TypeLiteral(this.type);
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -6351,19 +7520,29 @@
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.typeRawType(context.nonNullable);
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitTypeLiteral(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitTypeLiteral(this, arg);
 
-  visitChildren(Visitor v) {
-    type?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    type.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
     type = v.visitDartType(type);
   }
 
   @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    type = v.visitDartType(type, cannotRemoveSentinel);
+  }
+
+  @override
   String toString() {
     return "TypeLiteral(${toStringInternal()})";
   }
@@ -6379,14 +7558,24 @@
       getStaticTypeInternal(context);
 
   @override
-  DartType getStaticTypeInternal(StaticTypeContext context) => context.thisType;
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
+      context.thisType!;
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitThisExpression(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitThisExpression(this, arg);
 
-  visitChildren(Visitor v) {}
-  transformChildren(Transformer v) {}
+  @override
+  void visitChildren(Visitor v) {}
+
+  @override
+  void transformChildren(Transformer v) {}
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {}
 
   @override
   String toString() {
@@ -6400,6 +7589,7 @@
 }
 
 class Rethrow extends Expression {
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -6409,12 +7599,21 @@
           ? const NeverType.nonNullable()
           : const BottomType();
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitRethrow(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitRethrow(this, arg);
 
-  visitChildren(Visitor v) {}
-  transformChildren(Transformer v) {}
+  @override
+  void visitChildren(Visitor v) {}
+
+  @override
+  void transformChildren(Transformer v) {}
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {}
 
   @override
   String toString() {
@@ -6431,9 +7630,10 @@
   Expression expression;
 
   Throw(this.expression) {
-    expression?.parent = this;
+    expression.parent = this;
   }
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -6443,17 +7643,32 @@
           ? const NeverType.nonNullable()
           : const BottomType();
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitThrow(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) => v.visitThrow(this, arg);
 
-  visitChildren(Visitor v) {
-    expression?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    expression.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (expression != null) {
-      expression = expression.accept<TreeNode>(v);
-      expression?.parent = this;
+      expression = v.transform(expression);
+      expression.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (expression != null) {
+      expression = v.transform(expression);
+      expression.parent = this;
     }
   }
 
@@ -6476,10 +7691,12 @@
 
   ListLiteral(this.expressions,
       {this.typeArgument: const DynamicType(), this.isConst: false}) {
+    // ignore: unnecessary_null_comparison
     assert(typeArgument != null);
     setParents(expressions, this);
   }
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -6488,18 +7705,29 @@
     return context.typeEnvironment.listType(typeArgument, context.nonNullable);
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitListLiteral(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitListLiteral(this, arg);
 
-  visitChildren(Visitor v) {
-    typeArgument?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    typeArgument.accept(v);
     visitList(expressions, v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
     typeArgument = v.visitDartType(typeArgument);
-    transformList(expressions, v, this);
+    v.transformList(expressions, this);
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    typeArgument = v.visitDartType(typeArgument, cannotRemoveSentinel);
+    v.transformExpressionList(expressions, this);
   }
 
   @override
@@ -6527,10 +7755,12 @@
 
   SetLiteral(this.expressions,
       {this.typeArgument: const DynamicType(), this.isConst: false}) {
+    // ignore: unnecessary_null_comparison
     assert(typeArgument != null);
     setParents(expressions, this);
   }
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -6539,18 +7769,29 @@
     return context.typeEnvironment.setType(typeArgument, context.nonNullable);
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitSetLiteral(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitSetLiteral(this, arg);
 
-  visitChildren(Visitor v) {
-    typeArgument?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    typeArgument.accept(v);
     visitList(expressions, v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
     typeArgument = v.visitDartType(typeArgument);
-    transformList(expressions, v, this);
+    v.transformList(expressions, this);
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    typeArgument = v.visitDartType(typeArgument, cannotRemoveSentinel);
+    v.transformExpressionList(expressions, this);
   }
 
   @override
@@ -6581,11 +7822,14 @@
       {this.keyType: const DynamicType(),
       this.valueType: const DynamicType(),
       this.isConst: false}) {
+    // ignore: unnecessary_null_comparison
     assert(keyType != null);
+    // ignore: unnecessary_null_comparison
     assert(valueType != null);
     setParents(entries, this);
   }
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -6595,20 +7839,32 @@
         .mapType(keyType, valueType, context.nonNullable);
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitMapLiteral(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitMapLiteral(this, arg);
 
-  visitChildren(Visitor v) {
-    keyType?.accept(v);
-    valueType?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    keyType.accept(v);
+    valueType.accept(v);
     visitList(entries, v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
     keyType = v.visitDartType(keyType);
     valueType = v.visitDartType(valueType);
-    transformList(entries, v, this);
+    v.transformList(entries, this);
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    keyType = v.visitDartType(keyType, cannotRemoveSentinel);
+    valueType = v.visitDartType(valueType, cannotRemoveSentinel);
+    v.transformMapEntryList(entries, this);
   }
 
   @override
@@ -6641,25 +7897,47 @@
   Expression value;
 
   MapEntry(this.key, this.value) {
-    key?.parent = this;
-    value?.parent = this;
+    key.parent = this;
+    value.parent = this;
   }
 
+  @override
   R accept<R>(TreeVisitor<R> v) => v.visitMapEntry(this);
 
-  visitChildren(Visitor v) {
-    key?.accept(v);
-    value?.accept(v);
+  @override
+  R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitMapEntry(this, arg);
+
+  @override
+  void visitChildren(Visitor v) {
+    key.accept(v);
+    value.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (key != null) {
-      key = key.accept<TreeNode>(v);
-      key?.parent = this;
+      key = v.transform(key);
+      key.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (value != null) {
-      value = value.accept<TreeNode>(v);
-      value?.parent = this;
+      value = v.transform(value);
+      value.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (key != null) {
+      key = v.transform(key);
+      key.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (value != null) {
+      value = v.transform(value);
+      value.parent = this;
     }
   }
 
@@ -6686,25 +7964,41 @@
   Expression operand;
 
   AwaitExpression(this.operand) {
-    operand?.parent = this;
+    operand.parent = this;
   }
 
+  @override
   DartType getStaticTypeInternal(StaticTypeContext context) {
     return context.typeEnvironment.flatten(operand.getStaticType(context));
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitAwaitExpression(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitAwaitExpression(this, arg);
 
-  visitChildren(Visitor v) {
-    operand?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    operand.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (operand != null) {
-      operand = operand.accept<TreeNode>(v);
-      operand?.parent = this;
+      operand = v.transform(operand);
+      operand.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (operand != null) {
+      operand = v.transform(operand);
+      operand.parent = this;
     }
   }
 
@@ -6722,35 +8016,53 @@
 
 /// Common super-interface for [FunctionExpression] and [FunctionDeclaration].
 abstract class LocalFunction implements TreeNode {
-  FunctionNode get function;
+  // TODO(johnniwinther): Make this non-nullable.
+  FunctionNode? get function;
 }
 
 /// Expression of form `(x,y) => ...` or `(x,y) { ... }`
 ///
 /// The arrow-body form `=> e` is desugared into `return e;`.
 class FunctionExpression extends Expression implements LocalFunction {
+  @override
   FunctionNode function;
 
   FunctionExpression(this.function) {
-    function?.parent = this;
+    function.parent = this;
   }
 
+  @override
   DartType getStaticTypeInternal(StaticTypeContext context) {
     return function.computeFunctionType(context.nonNullable);
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitFunctionExpression(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitFunctionExpression(this, arg);
 
-  visitChildren(Visitor v) {
-    function?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    function.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (function != null) {
-      function = function.accept<TreeNode>(v);
-      function?.parent = this;
+      function = v.transform(function);
+      function.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (function != null) {
+      function = v.transform(function);
+      function.parent = this;
     }
   }
 
@@ -6770,30 +8082,43 @@
   DartType type;
 
   ConstantExpression(this.constant, [this.type = const DynamicType()]) {
+    // ignore: unnecessary_null_comparison
     assert(constant != null);
   }
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
   @override
   DartType getStaticTypeInternal(StaticTypeContext context) => type;
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitConstantExpression(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitConstantExpression(this, arg);
 
-  visitChildren(Visitor v) {
-    constant?.acceptReference(v);
-    type?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    constant.acceptReference(v);
+    type.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
     constant = v.visitConstant(constant);
     type = v.visitDartType(type);
   }
 
   @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    constant = v.visitConstant(constant, cannotRemoveSentinel);
+    type = v.visitDartType(type, cannotRemoveSentinel);
+  }
+
+  @override
   String toString() {
     return "ConstantExpression(${toStringInternal()})";
   }
@@ -6810,10 +8135,11 @@
   Expression body;
 
   Let(this.variable, this.body) {
-    variable?.parent = this;
-    body?.parent = this;
+    variable.parent = this;
+    body.parent = this;
   }
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -6821,22 +8147,43 @@
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       body.getStaticType(context);
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitLet(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) => v.visitLet(this, arg);
 
-  visitChildren(Visitor v) {
-    variable?.accept(v);
-    body?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    variable.accept(v);
+    body.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (variable != null) {
-      variable = variable.accept<TreeNode>(v);
-      variable?.parent = this;
+      variable = v.transform(variable);
+      variable.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (body != null) {
-      body = body.accept<TreeNode>(v);
-      body?.parent = this;
+      body = v.transform(body);
+      body.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (variable != null) {
+      variable = v.transform(variable);
+      variable.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (body != null) {
+      body = v.transform(body);
+      body.parent = this;
     }
   }
 
@@ -6859,10 +8206,11 @@
   Expression value;
 
   BlockExpression(this.body, this.value) {
-    body?.parent = this;
-    value?.parent = this;
+    body.parent = this;
+    value.parent = this;
   }
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -6870,23 +8218,44 @@
   DartType getStaticTypeInternal(StaticTypeContext context) =>
       value.getStaticType(context);
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitBlockExpression(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitBlockExpression(this, arg);
 
-  visitChildren(Visitor v) {
-    body?.accept(v);
-    value?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    body.accept(v);
+    value.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (body != null) {
-      body = body.accept<TreeNode>(v);
-      body?.parent = this;
+      body = v.transform(body);
+      body.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (value != null) {
-      value = value.accept<TreeNode>(v);
-      value?.parent = this;
+      value = v.transform(value);
+      value.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (body != null) {
+      body = v.transform(body);
+      body.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (value != null) {
+      value = v.transform(value);
+      value.parent = this;
     }
   }
 
@@ -6922,6 +8291,7 @@
 
   LoadLibrary(this.import);
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -6931,12 +8301,21 @@
         .futureType(const DynamicType(), context.nonNullable);
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitLoadLibrary(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitLoadLibrary(this, arg);
 
-  visitChildren(Visitor v) {}
-  transformChildren(Transformer v) {}
+  @override
+  void visitChildren(Visitor v) {}
+
+  @override
+  void transformChildren(Transformer v) {}
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {}
 
   @override
   String toString() {
@@ -6945,7 +8324,7 @@
 
   @override
   void toTextInternal(AstPrinter printer) {
-    printer.write(import.name);
+    printer.write(import.name!);
     printer.write('.loadLibrary()');
   }
 }
@@ -6957,6 +8336,7 @@
 
   CheckLibraryIsLoaded(this.import);
 
+  @override
   DartType getStaticType(StaticTypeContext context) =>
       getStaticTypeInternal(context);
 
@@ -6965,12 +8345,21 @@
     return context.typeEnvironment.coreTypes.objectRawType(context.nonNullable);
   }
 
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitCheckLibraryIsLoaded(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitCheckLibraryIsLoaded(this, arg);
 
-  visitChildren(Visitor v) {}
-  transformChildren(Transformer v) {}
+  @override
+  void visitChildren(Visitor v) {}
+
+  @override
+  void transformChildren(Transformer v) {}
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {}
 
   @override
   String toString() {
@@ -6979,7 +8368,7 @@
 
   @override
   void toTextInternal(AstPrinter printer) {
-    printer.write(import.name);
+    printer.write(import.name!);
     printer.write('.checkLibraryIsLoaded()');
   }
 }
@@ -6989,11 +8378,13 @@
 // ------------------------------------------------------------------------
 
 abstract class Statement extends TreeNode {
+  @override
   R accept<R>(StatementVisitor<R> v);
+
+  @override
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg);
 
-  void toTextInternal(AstPrinter printer);
-
+  @override
   String toText(AstTextStrategy strategy) {
     AstPrinter printer = new AstPrinter(strategy);
     printer.writeStatement(this);
@@ -7005,21 +8396,36 @@
   Expression expression;
 
   ExpressionStatement(this.expression) {
-    expression?.parent = this;
+    expression.parent = this;
   }
 
+  @override
   R accept<R>(StatementVisitor<R> v) => v.visitExpressionStatement(this);
+
+  @override
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
       v.visitExpressionStatement(this, arg);
 
-  visitChildren(Visitor v) {
-    expression?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    expression.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (expression != null) {
-      expression = expression.accept<TreeNode>(v);
-      expression?.parent = this;
+      expression = v.transform(expression);
+      expression.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (expression != null) {
+      expression = v.transform(expression);
+      expression.parent = this;
     }
   }
 
@@ -7045,22 +8451,29 @@
 
   Block(this.statements) {
     // Ensure statements is mutable.
-    assert((statements
-          ..add(null)
-          ..removeLast()) !=
-        null);
+    assert(checkListIsMutable(statements, dummyStatement));
     setParents(statements, this);
   }
 
+  @override
   R accept<R>(StatementVisitor<R> v) => v.visitBlock(this);
+
+  @override
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg) => v.visitBlock(this, arg);
 
-  visitChildren(Visitor v) {
+  @override
+  void visitChildren(Visitor v) {
     visitList(statements, v);
   }
 
-  transformChildren(Transformer v) {
-    transformList(statements, v, this);
+  @override
+  void transformChildren(Transformer v) {
+    v.transformList(statements, this);
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    v.transformStatementList(statements, this);
   }
 
   void addStatement(Statement node) {
@@ -7089,22 +8502,29 @@
 
   AssertBlock(this.statements) {
     // Ensure statements is mutable.
-    assert((statements
-          ..add(null)
-          ..removeLast()) !=
-        null);
+    assert(checkListIsMutable(statements, dummyStatement));
     setParents(statements, this);
   }
 
+  @override
   R accept<R>(StatementVisitor<R> v) => v.visitAssertBlock(this);
+
+  @override
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
       v.visitAssertBlock(this, arg);
 
-  transformChildren(Transformer v) {
-    transformList(statements, v, this);
+  @override
+  void transformChildren(Transformer v) {
+    v.transformList(statements, this);
   }
 
-  visitChildren(Visitor v) {
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    v.transformStatementList(statements, this);
+  }
+
+  @override
+  void visitChildren(Visitor v) {
     visitList(statements, v);
   }
 
@@ -7126,12 +8546,21 @@
 }
 
 class EmptyStatement extends Statement {
+  @override
   R accept<R>(StatementVisitor<R> v) => v.visitEmptyStatement(this);
+
+  @override
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
       v.visitEmptyStatement(this, arg);
 
-  visitChildren(Visitor v) {}
-  transformChildren(Transformer v) {}
+  @override
+  void visitChildren(Visitor v) {}
+
+  @override
+  void transformChildren(Transformer v) {}
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {}
 
   @override
   String toString() {
@@ -7146,7 +8575,7 @@
 
 class AssertStatement extends Statement {
   Expression condition;
-  Expression message; // May be null.
+  Expression? message; // May be null.
 
   /// Character offset in the source where the assertion condition begins.
   ///
@@ -7159,27 +8588,48 @@
   int conditionEndOffset;
 
   AssertStatement(this.condition,
-      {this.message, this.conditionStartOffset, this.conditionEndOffset}) {
-    condition?.parent = this;
+      {this.message,
+      required this.conditionStartOffset,
+      required this.conditionEndOffset}) {
+    condition.parent = this;
     message?.parent = this;
   }
 
+  @override
   R accept<R>(StatementVisitor<R> v) => v.visitAssertStatement(this);
+
+  @override
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
       v.visitAssertStatement(this, arg);
 
-  visitChildren(Visitor v) {
-    condition?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    condition.accept(v);
     message?.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (condition != null) {
-      condition = condition.accept<TreeNode>(v);
-      condition?.parent = this;
+      condition = v.transform(condition);
+      condition.parent = this;
     }
     if (message != null) {
-      message = message.accept<TreeNode>(v);
+      message = v.transform(message!);
+      message?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (condition != null) {
+      condition = v.transform(condition);
+      condition.parent = this;
+    }
+    if (message != null) {
+      message = v.transformOrRemoveExpression(message!);
       message?.parent = this;
     }
   }
@@ -7195,7 +8645,7 @@
     printer.writeExpression(condition);
     if (message != null) {
       printer.write(', ');
-      printer.writeExpression(message);
+      printer.writeExpression(message!);
     }
     printer.write(');');
   }
@@ -7207,23 +8657,37 @@
 ///
 /// The frontend does not generate labeled statements without uses.
 class LabeledStatement extends Statement {
-  Statement body;
+  // TODO(johnniwinther): Make this non-nullable.
+  Statement? body;
 
   LabeledStatement(this.body) {
     body?.parent = this;
   }
 
+  @override
   R accept<R>(StatementVisitor<R> v) => v.visitLabeledStatement(this);
+
+  @override
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
       v.visitLabeledStatement(this, arg);
 
-  visitChildren(Visitor v) {
+  @override
+  void visitChildren(Visitor v) {
     body?.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
     if (body != null) {
-      body = body.accept<TreeNode>(v);
+      body = v.transform(body!);
+      body?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (body != null) {
+      body = v.transformOrRemoveStatement(body!);
       body?.parent = this;
     }
   }
@@ -7238,7 +8702,7 @@
     printer.write(printer.getLabelName(this));
     printer.write(':');
     printer.newLine();
-    printer.writeStatement(body);
+    printer.writeStatement(body!);
   }
 }
 
@@ -7267,12 +8731,21 @@
 
   BreakStatement(this.target);
 
+  @override
   R accept<R>(StatementVisitor<R> v) => v.visitBreakStatement(this);
+
+  @override
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
       v.visitBreakStatement(this, arg);
 
-  visitChildren(Visitor v) {}
-  transformChildren(Transformer v) {}
+  @override
+  void visitChildren(Visitor v) {}
+
+  @override
+  void transformChildren(Transformer v) {}
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {}
 
   @override
   String toString() {
@@ -7292,27 +8765,48 @@
   Statement body;
 
   WhileStatement(this.condition, this.body) {
-    condition?.parent = this;
-    body?.parent = this;
+    condition.parent = this;
+    body.parent = this;
   }
 
+  @override
   R accept<R>(StatementVisitor<R> v) => v.visitWhileStatement(this);
+
+  @override
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
       v.visitWhileStatement(this, arg);
 
-  visitChildren(Visitor v) {
-    condition?.accept(v);
-    body?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    condition.accept(v);
+    body.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (condition != null) {
-      condition = condition.accept<TreeNode>(v);
-      condition?.parent = this;
+      condition = v.transform(condition);
+      condition.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (body != null) {
-      body = body.accept<TreeNode>(v);
-      body?.parent = this;
+      body = v.transform(body);
+      body.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (condition != null) {
+      condition = v.transform(condition);
+      condition.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (body != null) {
+      body = v.transform(body);
+      body.parent = this;
     }
   }
 
@@ -7335,27 +8829,48 @@
   Expression condition;
 
   DoStatement(this.body, this.condition) {
-    body?.parent = this;
-    condition?.parent = this;
+    body.parent = this;
+    condition.parent = this;
   }
 
+  @override
   R accept<R>(StatementVisitor<R> v) => v.visitDoStatement(this);
+
+  @override
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
       v.visitDoStatement(this, arg);
 
-  visitChildren(Visitor v) {
-    body?.accept(v);
-    condition?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    body.accept(v);
+    condition.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (body != null) {
-      body = body.accept<TreeNode>(v);
-      body?.parent = this;
+      body = v.transform(body);
+      body.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (condition != null) {
-      condition = condition.accept<TreeNode>(v);
-      condition?.parent = this;
+      condition = v.transform(condition);
+      condition.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (body != null) {
+      body = v.transform(body);
+      body.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (condition != null) {
+      condition = v.transform(condition);
+      condition.parent = this;
     }
   }
 
@@ -7376,7 +8891,7 @@
 
 class ForStatement extends Statement {
   final List<VariableDeclaration> variables; // May be empty, but not null.
-  Expression condition; // May be null.
+  Expression? condition; // May be null.
   final List<Expression> updates; // May be empty, but not null.
   Statement body;
 
@@ -7384,30 +8899,51 @@
     setParents(variables, this);
     condition?.parent = this;
     setParents(updates, this);
-    body?.parent = this;
+    body.parent = this;
   }
 
+  @override
   R accept<R>(StatementVisitor<R> v) => v.visitForStatement(this);
+
+  @override
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
       v.visitForStatement(this, arg);
 
-  visitChildren(Visitor v) {
+  @override
+  void visitChildren(Visitor v) {
     visitList(variables, v);
     condition?.accept(v);
     visitList(updates, v);
-    body?.accept(v);
+    body.accept(v);
   }
 
-  transformChildren(Transformer v) {
-    transformList(variables, v, this);
+  @override
+  void transformChildren(Transformer v) {
+    v.transformList(variables, this);
     if (condition != null) {
-      condition = condition.accept<TreeNode>(v);
+      condition = v.transform(condition!);
       condition?.parent = this;
     }
-    transformList(updates, v, this);
+    v.transformList(updates, this);
+    // ignore: unnecessary_null_comparison
     if (body != null) {
-      body = body.accept<TreeNode>(v);
-      body?.parent = this;
+      body = v.transform(body);
+      body.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    v.transformVariableDeclarationList(variables, this);
+    if (condition != null) {
+      condition = v.transformOrRemoveExpression(condition!);
+      condition?.parent = this;
+    }
+    v.transformExpressionList(updates, this);
+    // ignore: unnecessary_null_comparison
+    if (body != null) {
+      body = v.transform(body);
+      body.parent = this;
     }
   }
 
@@ -7428,7 +8964,7 @@
     }
     printer.write('; ');
     if (condition != null) {
-      printer.writeExpression(condition);
+      printer.writeExpression(condition!);
     }
     printer.write('; ');
     printer.writeExpressions(updates);
@@ -7451,33 +8987,60 @@
 
   ForInStatement(this.variable, this.iterable, this.body,
       {this.isAsync: false}) {
-    variable?.parent = this;
-    iterable?.parent = this;
-    body?.parent = this;
+    variable.parent = this;
+    iterable.parent = this;
+    body.parent = this;
   }
 
+  @override
   R accept<R>(StatementVisitor<R> v) => v.visitForInStatement(this);
+
+  @override
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
       v.visitForInStatement(this, arg);
 
+  @override
   void visitChildren(Visitor v) {
-    variable?.accept(v);
-    iterable?.accept(v);
-    body?.accept(v);
+    variable.accept(v);
+    iterable.accept(v);
+    body.accept(v);
   }
 
+  @override
   void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (variable != null) {
-      variable = variable.accept<TreeNode>(v);
-      variable?.parent = this;
+      variable = v.transform(variable);
+      variable.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (iterable != null) {
-      iterable = iterable.accept<TreeNode>(v);
-      iterable?.parent = this;
+      iterable = v.transform(iterable);
+      iterable.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (body != null) {
-      body = body.accept<TreeNode>(v);
-      body?.parent = this;
+      body = v.transform(body);
+      body.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (variable != null) {
+      variable = v.transform(variable);
+      variable.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (iterable != null) {
+      iterable = v.transform(iterable);
+      iterable.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (body != null) {
+      body = v.transform(body);
+      body.parent = this;
     }
   }
 
@@ -7494,10 +9057,11 @@
   /// This is called by `StaticTypeContext.getForInIteratorType` if the iterator
   /// type of this for-in statement is not already cached in [context].
   DartType getIteratorTypeInternal(StaticTypeContext context) {
-    DartType iteratorType;
+    DartType? iteratorType;
     if (isAsync) {
-      InterfaceType streamType = iterable.getStaticTypeAsInstanceOf(
+      InterfaceType? streamType = iterable.getStaticTypeAsInstanceOf(
           context.typeEnvironment.coreTypes.streamClass, context);
+      // ignore: unnecessary_null_comparison
       if (streamType != null) {
         iteratorType = new InterfaceType(
             context.typeEnvironment.coreTypes.streamIteratorClass,
@@ -7507,14 +9071,14 @@
     } else {
       InterfaceType iterableType = iterable.getStaticTypeAsInstanceOf(
           context.typeEnvironment.coreTypes.iterableClass, context);
-      Member member = context.typeEnvironment.hierarchy
+      Member? member = context.typeEnvironment.hierarchy
           .getInterfaceMember(iterableType.classNode, new Name('iterator'));
       if (member != null) {
         iteratorType = Substitution.fromInterfaceType(iterableType)
             .substituteType(member.getterType);
       }
     }
-    return iteratorType ??= const DynamicType();
+    return iteratorType ?? const DynamicType();
   }
 
   /// Returns the type of the element in this for-in statement.
@@ -7535,18 +9099,17 @@
     //  `iterable.iterator.current` if inference is updated accordingly.
     while (iterableType is TypeParameterType) {
       TypeParameterType typeParameterType = iterableType;
-      iterableType =
-          typeParameterType.promotedBound ?? typeParameterType.parameter.bound;
+      iterableType = typeParameterType.bound;
     }
     if (isAsync) {
       List<DartType> typeArguments = context.typeEnvironment
-          .getTypeArgumentsAsInstanceOf(
-              iterableType, context.typeEnvironment.coreTypes.streamClass);
+          .getTypeArgumentsAsInstanceOf(iterableType as InterfaceType,
+              context.typeEnvironment.coreTypes.streamClass)!;
       return typeArguments.single;
     } else {
       List<DartType> typeArguments = context.typeEnvironment
-          .getTypeArgumentsAsInstanceOf(
-              iterableType, context.typeEnvironment.coreTypes.iterableClass);
+          .getTypeArgumentsAsInstanceOf(iterableType as InterfaceType,
+              context.typeEnvironment.coreTypes.iterableClass)!;
       return typeArguments.single;
     }
   }
@@ -7577,25 +9140,41 @@
   final List<SwitchCase> cases;
 
   SwitchStatement(this.expression, this.cases) {
-    expression?.parent = this;
+    expression.parent = this;
     setParents(cases, this);
   }
 
+  @override
   R accept<R>(StatementVisitor<R> v) => v.visitSwitchStatement(this);
+
+  @override
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
       v.visitSwitchStatement(this, arg);
 
-  visitChildren(Visitor v) {
-    expression?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    expression.accept(v);
     visitList(cases, v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (expression != null) {
-      expression = expression.accept<TreeNode>(v);
-      expression?.parent = this;
+      expression = v.transform(expression);
+      expression.parent = this;
     }
-    transformList(cases, v, this);
+    v.transformList(cases, this);
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (expression != null) {
+      expression = v.transform(expression);
+      expression.parent = this;
+    }
+    v.transformSwitchCaseList(cases, this);
   }
 
   @override
@@ -7625,7 +9204,8 @@
 class SwitchCase extends TreeNode {
   final List<Expression> expressions;
   final List<int> expressionOffsets;
-  Statement body;
+  // TODO(johnniwinther): Make this non-nullable.
+  Statement? body;
   bool isDefault;
 
   SwitchCase(this.expressions, this.expressionOffsets, this.body,
@@ -7647,17 +9227,32 @@
         body = null,
         isDefault = false;
 
+  @override
   R accept<R>(TreeVisitor<R> v) => v.visitSwitchCase(this);
 
-  visitChildren(Visitor v) {
+  @override
+  R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitSwitchCase(this, arg);
+
+  @override
+  void visitChildren(Visitor v) {
     visitList(expressions, v);
     body?.accept(v);
   }
 
-  transformChildren(Transformer v) {
-    transformList(expressions, v, this);
+  @override
+  void transformChildren(Transformer v) {
+    v.transformList(expressions, this);
     if (body != null) {
-      body = body.accept<TreeNode>(v);
+      body = v.transform(body!);
+      body?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    v.transformExpressionList(expressions, this);
+    if (body != null) {
+      body = v.transformOrRemoveStatement(body!);
       body?.parent = this;
     }
   }
@@ -7667,12 +9262,14 @@
     return "SwitchCase(${toStringInternal()})";
   }
 
+  @override
   String toText(AstTextStrategy strategy) {
     AstPrinter printer = new AstPrinter(strategy);
     toTextInternal(printer);
     return printer.getText();
   }
 
+  @override
   void toTextInternal(AstPrinter printer) {
     for (int index = 0; index < expressions.length; index++) {
       if (index > 0) {
@@ -7689,7 +9286,7 @@
       printer.write('default:');
     }
     printer.incIndentation();
-    Statement block = body;
+    Statement? block = body;
     if (block is Block) {
       for (Statement statement in block.statements) {
         printer.newLine();
@@ -7697,7 +9294,7 @@
       }
     } else {
       printer.write(' ');
-      printer.writeStatement(body);
+      printer.writeStatement(body!);
     }
     printer.decIndentation();
   }
@@ -7709,12 +9306,21 @@
 
   ContinueSwitchStatement(this.target);
 
+  @override
   R accept<R>(StatementVisitor<R> v) => v.visitContinueSwitchStatement(this);
+
+  @override
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
       v.visitContinueSwitchStatement(this, arg);
 
-  visitChildren(Visitor v) {}
-  transformChildren(Transformer v) {}
+  @override
+  void visitChildren(Visitor v) {}
+
+  @override
+  void transformChildren(Transformer v) {}
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {}
 
   @override
   String toString() {
@@ -7732,35 +9338,60 @@
 class IfStatement extends Statement {
   Expression condition;
   Statement then;
-  Statement otherwise;
+  Statement? otherwise;
 
   IfStatement(this.condition, this.then, this.otherwise) {
-    condition?.parent = this;
-    then?.parent = this;
+    condition.parent = this;
+    then.parent = this;
     otherwise?.parent = this;
   }
 
+  @override
   R accept<R>(StatementVisitor<R> v) => v.visitIfStatement(this);
+
+  @override
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
       v.visitIfStatement(this, arg);
 
-  visitChildren(Visitor v) {
-    condition?.accept(v);
-    then?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    condition.accept(v);
+    then.accept(v);
     otherwise?.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (condition != null) {
-      condition = condition.accept<TreeNode>(v);
-      condition?.parent = this;
+      condition = v.transform(condition);
+      condition.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (then != null) {
-      then = then.accept<TreeNode>(v);
-      then?.parent = this;
+      then = v.transform(then);
+      then.parent = this;
     }
     if (otherwise != null) {
-      otherwise = otherwise.accept<TreeNode>(v);
+      otherwise = v.transform(otherwise!);
+      otherwise?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (condition != null) {
+      condition = v.transform(condition);
+      condition.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (then != null) {
+      then = v.transform(then);
+      then.parent = this;
+    }
+    if (otherwise != null) {
+      otherwise = v.transformOrRemoveStatement(otherwise!);
       otherwise?.parent = this;
     }
   }
@@ -7778,29 +9409,42 @@
     printer.writeStatement(then);
     if (otherwise != null) {
       printer.write(' else ');
-      printer.writeStatement(otherwise);
+      printer.writeStatement(otherwise!);
     }
   }
 }
 
 class ReturnStatement extends Statement {
-  Expression expression; // May be null.
+  Expression? expression; // May be null.
 
   ReturnStatement([this.expression]) {
     expression?.parent = this;
   }
 
+  @override
   R accept<R>(StatementVisitor<R> v) => v.visitReturnStatement(this);
+
+  @override
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
       v.visitReturnStatement(this, arg);
 
-  visitChildren(Visitor v) {
+  @override
+  void visitChildren(Visitor v) {
     expression?.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
     if (expression != null) {
-      expression = expression.accept<TreeNode>(v);
+      expression = v.transform(expression!);
+      expression?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    if (expression != null) {
+      expression = v.transformOrRemoveExpression(expression!);
       expression?.parent = this;
     }
   }
@@ -7815,7 +9459,7 @@
     printer.write('return');
     if (expression != null) {
       printer.write(' ');
-      printer.writeExpression(expression);
+      printer.writeExpression(expression!);
     }
     printer.write(';');
   }
@@ -7827,25 +9471,41 @@
   bool isSynthetic;
 
   TryCatch(this.body, this.catches, {this.isSynthetic: false}) {
-    body?.parent = this;
+    body.parent = this;
     setParents(catches, this);
   }
 
+  @override
   R accept<R>(StatementVisitor<R> v) => v.visitTryCatch(this);
+
+  @override
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
       v.visitTryCatch(this, arg);
 
-  visitChildren(Visitor v) {
-    body?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    body.accept(v);
     visitList(catches, v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (body != null) {
-      body = body.accept<TreeNode>(v);
-      body?.parent = this;
+      body = v.transform(body);
+      body.parent = this;
     }
-    transformList(catches, v, this);
+    v.transformList(catches, this);
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (body != null) {
+      body = v.transform(body);
+      body.parent = this;
+    }
+    v.transformCatchList(catches, this);
   }
 
   @override
@@ -7866,40 +9526,66 @@
 
 class Catch extends TreeNode {
   DartType guard; // Not null, defaults to dynamic.
-  VariableDeclaration exception; // May be null.
-  VariableDeclaration stackTrace; // May be null.
+  VariableDeclaration? exception;
+  VariableDeclaration? stackTrace;
   Statement body;
 
   Catch(this.exception, this.body,
       {this.guard: const DynamicType(), this.stackTrace}) {
+    // ignore: unnecessary_null_comparison
     assert(guard != null);
     exception?.parent = this;
     stackTrace?.parent = this;
-    body?.parent = this;
+    body.parent = this;
   }
 
+  @override
   R accept<R>(TreeVisitor<R> v) => v.visitCatch(this);
 
-  visitChildren(Visitor v) {
-    guard?.accept(v);
+  @override
+  R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitCatch(this, arg);
+
+  @override
+  void visitChildren(Visitor v) {
+    guard.accept(v);
     exception?.accept(v);
     stackTrace?.accept(v);
-    body?.accept(v);
+    body.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
     guard = v.visitDartType(guard);
     if (exception != null) {
-      exception = exception.accept<TreeNode>(v);
+      exception = v.transform(exception!);
       exception?.parent = this;
     }
     if (stackTrace != null) {
-      stackTrace = stackTrace.accept<TreeNode>(v);
+      stackTrace = v.transform(stackTrace!);
       stackTrace?.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (body != null) {
-      body = body.accept<TreeNode>(v);
-      body?.parent = this;
+      body = v.transform(body);
+      body.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    guard = v.visitDartType(guard, cannotRemoveSentinel);
+    if (exception != null) {
+      exception = v.transformOrRemoveVariableDeclaration(exception!);
+      exception?.parent = this;
+    }
+    if (stackTrace != null) {
+      stackTrace = v.transformOrRemoveVariableDeclaration(stackTrace!);
+      stackTrace?.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (body != null) {
+      body = v.transform(body);
+      body.parent = this;
     }
   }
 
@@ -7908,12 +9594,14 @@
     return "Catch(${toStringInternal()})";
   }
 
+  @override
   String toText(AstTextStrategy strategy) {
     AstPrinter printer = new AstPrinter(strategy);
     toTextInternal(printer);
     return printer.getText();
   }
 
+  @override
   void toTextInternal(AstPrinter printer) {
     bool isImplicitType(DartType type) {
       if (type is DynamicType) {
@@ -7922,9 +9610,9 @@
       if (type is InterfaceType &&
           type.className.node != null &&
           type.classNode.name == 'Object') {
-        Uri uri = type.classNode.enclosingLibrary?.importUri;
-        return uri?.scheme == 'dart' &&
-            uri?.path == 'core' &&
+        Uri uri = type.classNode.enclosingLibrary.importUri;
+        return uri.scheme == 'dart' &&
+            uri.path == 'core' &&
             type.nullability == Nullability.nonNullable;
       }
       return false;
@@ -7937,11 +9625,11 @@
         printer.write(' ');
       }
       printer.write('catch (');
-      printer.writeVariableDeclaration(exception,
+      printer.writeVariableDeclaration(exception!,
           includeModifiersAndType: false);
       if (stackTrace != null) {
         printer.write(', ');
-        printer.writeVariableDeclaration(stackTrace,
+        printer.writeVariableDeclaration(stackTrace!,
             includeModifiersAndType: false);
       }
       printer.write(') ');
@@ -7959,27 +9647,48 @@
   Statement finalizer;
 
   TryFinally(this.body, this.finalizer) {
-    body?.parent = this;
-    finalizer?.parent = this;
+    body.parent = this;
+    finalizer.parent = this;
   }
 
+  @override
   R accept<R>(StatementVisitor<R> v) => v.visitTryFinally(this);
+
+  @override
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
       v.visitTryFinally(this, arg);
 
-  visitChildren(Visitor v) {
-    body?.accept(v);
-    finalizer?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    body.accept(v);
+    finalizer.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (body != null) {
-      body = body.accept<TreeNode>(v);
-      body?.parent = this;
+      body = v.transform(body);
+      body.parent = this;
     }
+    // ignore: unnecessary_null_comparison
     if (finalizer != null) {
-      finalizer = finalizer.accept<TreeNode>(v);
-      finalizer?.parent = this;
+      finalizer = v.transform(finalizer);
+      finalizer.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (body != null) {
+      body = v.transform(body);
+      body.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (finalizer != null) {
+      finalizer = v.transform(finalizer);
+      finalizer.parent = this;
     }
   }
 
@@ -8009,7 +9718,7 @@
 
   YieldStatement(this.expression,
       {bool isYieldStar: false, bool isNative: false}) {
-    expression?.parent = this;
+    expression.parent = this;
     this.isYieldStar = isYieldStar;
     this.isNative = isNative;
   }
@@ -8028,18 +9737,33 @@
     flags = value ? (flags | FlagNative) : (flags & ~FlagNative);
   }
 
+  @override
   R accept<R>(StatementVisitor<R> v) => v.visitYieldStatement(this);
+
+  @override
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
       v.visitYieldStatement(this, arg);
 
-  visitChildren(Visitor v) {
-    expression?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    expression.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (expression != null) {
-      expression = expression.accept<TreeNode>(v);
-      expression?.parent = this;
+      expression = v.transform(expression);
+      expression.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (expression != null) {
+      expression = v.transform(expression);
+      expression.parent = this;
     }
   }
 
@@ -8087,7 +9811,7 @@
   ///
   /// In all other cases, the name is cosmetic, may be empty or null,
   /// and is not necessarily unique.
-  String name;
+  String? name;
   int flags = 0;
   DartType type; // Not null, defaults to dynamic.
 
@@ -8098,7 +9822,7 @@
   /// For parameters, this is the default value.
   ///
   /// Should be null in other cases.
-  Expression initializer; // May be null.
+  Expression? initializer; // May be null.
 
   VariableDeclaration(this.name,
       {this.initializer,
@@ -8111,6 +9835,7 @@
       bool isLate: false,
       bool isRequired: false,
       bool isLowered: false}) {
+    // ignore: unnecessary_null_comparison
     assert(type != null);
     initializer?.parent = this;
     if (flags != -1) {
@@ -8135,6 +9860,7 @@
       bool isRequired: false,
       bool isLowered: false,
       this.type: const DynamicType()}) {
+    // ignore: unnecessary_null_comparison
     assert(type != null);
     initializer?.parent = this;
     this.isFinal = isFinal;
@@ -8254,27 +9980,43 @@
     annotations.add(annotation..parent = this);
   }
 
+  @override
   R accept<R>(StatementVisitor<R> v) => v.visitVariableDeclaration(this);
+
+  @override
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
       v.visitVariableDeclaration(this, arg);
 
-  visitChildren(Visitor v) {
+  @override
+  void visitChildren(Visitor v) {
     visitList(annotations, v);
-    type?.accept(v);
+    type.accept(v);
     initializer?.accept(v);
   }
 
-  transformChildren(Transformer v) {
-    transformList(annotations, v, this);
+  @override
+  void transformChildren(Transformer v) {
+    v.transformList(annotations, this);
     type = v.visitDartType(type);
     if (initializer != null) {
-      initializer = initializer.accept<TreeNode>(v);
+      initializer = v.transform(initializer!);
+      initializer?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    v.transformExpressionList(annotations, this);
+    type = v.visitDartType(type, cannotRemoveSentinel);
+    if (initializer != null) {
+      initializer = v.transformOrRemoveExpression(initializer!);
       initializer?.parent = this;
     }
   }
 
   /// Returns a possibly synthesized name for this variable, consistent with
   /// the names used across all [toString] calls.
+  @override
   String toString() {
     return "VariableDeclaration(${toStringInternal()})";
   }
@@ -8298,29 +10040,50 @@
 /// The body of the function may use [variable] as its self-reference.
 class FunctionDeclaration extends Statement implements LocalFunction {
   VariableDeclaration variable; // Is final and has no initializer.
-  FunctionNode function;
+
+  @override
+  FunctionNode? function;
 
   FunctionDeclaration(this.variable, this.function) {
-    variable?.parent = this;
+    variable.parent = this;
     function?.parent = this;
   }
 
+  @override
   R accept<R>(StatementVisitor<R> v) => v.visitFunctionDeclaration(this);
+
+  @override
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
       v.visitFunctionDeclaration(this, arg);
 
-  visitChildren(Visitor v) {
-    variable?.accept(v);
+  @override
+  void visitChildren(Visitor v) {
+    variable.accept(v);
     function?.accept(v);
   }
 
-  transformChildren(Transformer v) {
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
     if (variable != null) {
-      variable = variable.accept<TreeNode>(v);
-      variable?.parent = this;
+      variable = v.transform(variable);
+      variable.parent = this;
     }
     if (function != null) {
-      function = function.accept<TreeNode>(v);
+      function = v.transform(function!);
+      function?.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (variable != null) {
+      variable = v.transform(variable);
+      variable.parent = this;
+    }
+    if (function != null) {
+      function = v.transformOrRemove(function!, dummyFunctionNode);
       function?.parent = this;
     }
   }
@@ -8332,9 +10095,11 @@
 
   @override
   void toTextInternal(AstPrinter printer) {
-    printer.writeFunctionNode(function, printer.getVariableName(variable));
-    if (function.body is ReturnStatement) {
-      printer.write(';');
+    if (function != null) {
+      printer.writeFunctionNode(function!, printer.getVariableName(variable));
+      if (function!.body is ReturnStatement) {
+        printer.write(';');
+      }
     }
   }
 }
@@ -8354,23 +10119,25 @@
 /// The [toString] method returns a human-readable string that includes the
 /// library name for private names; uniqueness is not guaranteed.
 abstract class Name extends Node {
+  @override
   final int hashCode;
+
   final String text;
-  Reference get libraryName;
-  Library get library;
+  Reference? get libraryName;
+  Library? get library;
   bool get isPrivate;
 
   Name._internal(this.hashCode, this.text);
 
-  factory Name(String text, [Library library]) =>
+  factory Name(String text, [Library? library]) =>
       new Name.byReference(text, library?.reference);
 
-  factory Name.byReference(String text, Reference libraryName) {
+  factory Name.byReference(String text, Reference? libraryName) {
     /// Use separate subclasses for the public and private case to save memory
     /// for public names.
     if (text.startsWith('_')) {
       assert(libraryName != null);
-      return new _PrivateName(text, libraryName);
+      return new _PrivateName(text, libraryName!);
     } else {
       return new _PublicName(text);
     }
@@ -8380,13 +10147,16 @@
   // use [text].
   String get name => text;
 
+  @override
   bool operator ==(other) {
     return other is Name && text == other.text && library == other.library;
   }
 
+  @override
   R accept<R>(Visitor<R> v) => v.visitName(this);
 
-  visitChildren(Visitor v) {
+  @override
+  void visitChildren(Visitor v) {
     // DESIGN TODO: Should we visit the library as a library reference?
   }
 
@@ -8394,6 +10164,7 @@
   ///
   /// Note that this adds some nodes to a static map to ensure consistent
   /// naming, but that it thus also leaks memory.
+  @override
   String leakingDebugToString() => astToText.debugNodeToString(this);
 
   @override
@@ -8409,17 +10180,25 @@
 }
 
 class _PrivateName extends Name {
+  @override
   final Reference libraryName;
+
+  @override
   bool get isPrivate => true;
 
   _PrivateName(String text, Reference libraryName)
       : this.libraryName = libraryName,
         super._internal(_computeHashCode(text, libraryName), text);
 
+  @override
   String toString() => toStringInternal();
 
-  String toStringInternal() => library != null ? '$library::$text' : text;
+  @override
+  String toStringInternal() =>
+      // ignore: unnecessary_null_comparison
+      library != null ? '$library::$text' : text;
 
+  @override
   Library get library => libraryName.asLibrary;
 
   static int _computeHashCode(String name, Reference libraryName) {
@@ -8431,12 +10210,18 @@
 }
 
 class _PublicName extends Name {
-  Reference get libraryName => null;
-  Library get library => null;
+  @override
+  Reference? get libraryName => null;
+
+  @override
+  Library? get library => null;
+
+  @override
   bool get isPrivate => false;
 
   _PublicName(String text) : super._internal(text.hashCode, text);
 
+  @override
   String toString() => toStringInternal();
 }
 
@@ -8554,17 +10339,19 @@
         nullability == Nullability.undetermined;
   }
 
-  bool equals(Object other, Assumptions assumptions);
+  bool equals(Object other, Assumptions? assumptions);
 
   /// Returns a textual representation of the this type.
   ///
   /// If [verbose] is `true`, qualified names will include the library name/uri.
+  @override
   String toText(AstTextStrategy strategy) {
     AstPrinter printer = new AstPrinter(strategy);
     printer.writeType(this);
     return printer.getText();
   }
 
+  @override
   void toTextInternal(AstPrinter printer);
 }
 
@@ -8592,7 +10379,7 @@
   bool operator ==(Object other) => equals(other, null);
 
   @override
-  bool equals(Object other, Assumptions assumptions) => other is InvalidType;
+  bool equals(Object other, Assumptions? assumptions) => other is InvalidType;
 
   @override
   Nullability get declaredNullability {
@@ -8640,7 +10427,7 @@
   bool operator ==(Object other) => equals(other, null);
 
   @override
-  bool equals(Object other, Assumptions assumptions) => other is DynamicType;
+  bool equals(Object other, Assumptions? assumptions) => other is DynamicType;
 
   @override
   Nullability get declaredNullability => Nullability.nullable;
@@ -8682,7 +10469,7 @@
   bool operator ==(Object other) => equals(other, null);
 
   @override
-  bool equals(Object other, Assumptions assumptions) => other is VoidType;
+  bool equals(Object other, Assumptions? assumptions) => other is VoidType;
 
   @override
   Nullability get declaredNullability => Nullability.nullable;
@@ -8729,7 +10516,6 @@
       case Nullability.undetermined:
         return const NeverType.undetermined();
     }
-    throw new StateError("Unhandled nullability value '${nullability}'.");
   }
 
   @override
@@ -8754,7 +10540,7 @@
   bool operator ==(Object other) => equals(other, null);
 
   @override
-  bool equals(Object other, Assumptions assumptions) =>
+  bool equals(Object other, Assumptions? assumptions) =>
       other is NeverType && nullability == other.nullability;
 
   @override
@@ -8796,7 +10582,7 @@
   bool operator ==(Object other) => equals(other, null);
 
   @override
-  bool equals(Object other, Assumptions assumptions) => other is BottomType;
+  bool equals(Object other, Assumptions? assumptions) => other is BottomType;
 
   @override
   Nullability get declaredNullability => Nullability.nonNullable;
@@ -8839,7 +10625,7 @@
   bool operator ==(Object other) => equals(other, null);
 
   @override
-  bool equals(Object other, Assumptions assumptions) => other is NullType;
+  bool equals(Object other, Assumptions? assumptions) => other is NullType;
 
   @override
   Nullability get declaredNullability => Nullability.nullable;
@@ -8872,12 +10658,15 @@
   /// The [typeArguments] list must not be modified after this call. If the
   /// list is omitted, 'dynamic' type arguments are filled in.
   InterfaceType(Class classNode, Nullability declaredNullability,
-      [List<DartType> typeArguments])
-      : this.byReference(getClassReference(classNode), declaredNullability,
+      [List<DartType>? typeArguments])
+      : this.byReference(
+            getNonNullableClassReference(classNode),
+            declaredNullability,
             typeArguments ?? _defaultTypeArguments(classNode));
 
   InterfaceType.byReference(
       this.className, this.declaredNullability, this.typeArguments)
+      // ignore: unnecessary_null_comparison
       : assert(declaredNullability != null);
 
   Class get classNode => className.asClass;
@@ -8912,7 +10701,7 @@
   bool operator ==(Object other) => equals(other, null);
 
   @override
-  bool equals(Object other, Assumptions assumptions) {
+  bool equals(Object other, Assumptions? assumptions) {
     if (identical(this, other)) return true;
     if (other is InterfaceType) {
       if (nullability != other.nullability) return false;
@@ -8972,24 +10761,26 @@
   final Nullability declaredNullability;
 
   /// The [Typedef] this function type is created for.
-  final TypedefType typedefType;
+  final TypedefType? typedefType;
 
   final DartType returnType;
-  int _hashCode;
+
+  @override
+  late final int hashCode = _computeHashCode();
 
   FunctionType(List<DartType> positionalParameters, this.returnType,
       this.declaredNullability,
       {this.namedParameters: const <NamedType>[],
       this.typeParameters: const <TypeParameter>[],
-      int requiredParameterCount,
+      int? requiredParameterCount,
       this.typedefType})
       : this.positionalParameters = positionalParameters,
         this.requiredParameterCount =
             requiredParameterCount ?? positionalParameters.length;
 
-  Reference get typedefReference => typedefType?.typedefReference;
+  Reference? get typedefReference => typedefType?.typedefReference;
 
-  Typedef get typedef => typedefReference?.asTypedef;
+  Typedef? get typedef => typedefReference?.asTypedef;
 
   @override
   Nullability get nullability => declaredNullability;
@@ -9014,7 +10805,7 @@
   bool operator ==(Object other) => equals(other, null);
 
   @override
-  bool equals(Object other, Assumptions assumptions) {
+  bool equals(Object other, Assumptions? assumptions) {
     if (identical(this, other)) {
       return true;
     } else if (other is FunctionType) {
@@ -9033,8 +10824,8 @@
         }
         for (int index = 0; index < typeParameters.length; index++) {
           if (!typeParameters[index]
-              .bound
-              .equals(other.typeParameters[index].bound, assumptions)) {
+              .bound!
+              .equals(other.typeParameters[index].bound!, assumptions)) {
             return false;
           }
         }
@@ -9057,8 +10848,8 @@
       }
       if (typeParameters.isNotEmpty) {
         for (int index = 0; index < typeParameters.length; index++) {
-          assumptions.forget(
-              typeParameters[index], other.typeParameters[index]);
+          assumptions!
+              .forget(typeParameters[index], other.typeParameters[index]);
         }
       }
       return true;
@@ -9083,7 +10874,7 @@
   /// Looks up the type of the named parameter with the given name.
   ///
   /// Returns `null` if there is no named parameter with the given name.
-  DartType getNamedParameter(String name) {
+  DartType? getNamedParameter(String name) {
     int lower = 0;
     int upper = namedParameters.length - 1;
     while (lower <= upper) {
@@ -9101,9 +10892,6 @@
     return null;
   }
 
-  @override
-  int get hashCode => _hashCode ??= _computeHashCode();
-
   int _computeHashCode() {
     int hash = 1237;
     hash = 0x3fffffff & (hash * 31 + requiredParameterCount);
@@ -9186,7 +10974,7 @@
   final List<DartType> typeArguments;
 
   TypedefType(Typedef typedefNode, Nullability nullability,
-      [List<DartType> typeArguments])
+      [List<DartType>? typeArguments])
       : this.byReference(typedefNode.reference, nullability,
             typeArguments ?? const <DartType>[]);
 
@@ -9216,7 +11004,7 @@
   @override
   DartType get unaliasOnce {
     DartType result =
-        Substitution.fromTypedefType(this).substituteType(typedefNode.type);
+        Substitution.fromTypedefType(this).substituteType(typedefNode.type!);
     return result.withDeclaredNullability(
         combineNullabilitiesForSubstitution(result.nullability, nullability));
   }
@@ -9230,7 +11018,7 @@
   bool operator ==(Object other) => equals(other, null);
 
   @override
-  bool equals(Object other, Assumptions assumptions) {
+  bool equals(Object other, Assumptions? assumptions) {
     if (identical(this, other)) {
       return true;
     } else if (other is TypedefType) {
@@ -9311,7 +11099,7 @@
   bool operator ==(Object other) => equals(other, null);
 
   @override
-  bool equals(Object other, Assumptions assumptions) {
+  bool equals(Object other, Assumptions? assumptions) {
     if (identical(this, other)) return true;
     if (other is FutureOrType) {
       if (declaredNullability != other.declaredNullability) return false;
@@ -9369,7 +11157,7 @@
   @override
   bool operator ==(Object other) => equals(other, null);
 
-  bool equals(Object other, Assumptions assumptions) {
+  bool equals(Object other, Assumptions? assumptions) {
     return other is NamedType &&
         name == other.name &&
         isRequired == other.isRequired &&
@@ -9435,10 +11223,11 @@
   ///
   /// 'null' indicates that the type parameter's bound has not been promoted and
   /// is therefore the same as the bound of [parameter].
-  DartType promotedBound;
+  DartType? promotedBound;
 
   TypeParameterType.internal(
-      this.parameter, this.declaredNullability, this.promotedBound) {
+      this.parameter, this.declaredNullability, DartType? promotedBound)
+      : this.promotedBound = promotedBound {
     assert(
         promotedBound == null ||
             (declaredNullability == Nullability.nonNullable &&
@@ -9512,7 +11301,7 @@
   }
 
   TypeParameterType(TypeParameter parameter, Nullability declaredNullability,
-      [DartType promotedBound])
+      [DartType? promotedBound])
       : this.internal(parameter, declaredNullability, promotedBound);
 
   /// Creates an intersection type between a type parameter and [promotedBound].
@@ -9539,11 +11328,10 @@
   /// `Nullability.undetermined` will be used, depending on the nullability of
   /// the bound of [parameter].
   TypeParameterType.withDefaultNullabilityForLibrary(
-      this.parameter, Library library) {
-    declaredNullability = library.isNonNullableByDefault
-        ? computeNullabilityFromBound(parameter)
-        : Nullability.legacy;
-  }
+      this.parameter, Library library)
+      : declaredNullability = library.isNonNullableByDefault
+            ? computeNullabilityFromBound(parameter)
+            : Nullability.legacy;
 
   @override
   R accept<R>(DartTypeVisitor<R> v) => v.visitTypeParameterType(this);
@@ -9559,7 +11347,7 @@
   bool operator ==(Object other) => equals(other, null);
 
   @override
-  bool equals(Object other, Assumptions assumptions) {
+  bool equals(Object other, Assumptions? assumptions) {
     if (identical(this, other)) {
       return true;
     } else if (other is TypeParameterType) {
@@ -9579,7 +11367,7 @@
       }
       if (promotedBound != null) {
         if (other.promotedBound == null) return false;
-        if (!promotedBound.equals(other.promotedBound, assumptions)) {
+        if (!promotedBound!.equals(other.promotedBound!, assumptions)) {
           return false;
         }
       } else if (other.promotedBound != null) {
@@ -9604,7 +11392,7 @@
   }
 
   /// Returns the bound of the type parameter, accounting for promotions.
-  DartType get bound => promotedBound ?? parameter.bound;
+  DartType get bound => (promotedBound ?? parameter.bound)!;
 
   /// Nullability of the type, calculated from its parts.
   ///
@@ -9627,9 +11415,7 @@
   ///     }
   @override
   Nullability get nullability {
-    return getNullability(
-        declaredNullability ?? computeNullabilityFromBound(parameter),
-        promotedBound);
+    return getNullability(declaredNullability, promotedBound);
   }
 
   /// Gets a new [TypeParameterType] with given [typeParameterTypeNullability].
@@ -9659,7 +11445,7 @@
     // non-nullable types can be passed in for the type parameter, making the
     // corresponding type parameter types 'undetermined.'  Otherwise, the
     // nullability matches that of the bound.
-    DartType bound = typeParameter.bound;
+    DartType? bound = typeParameter.bound;
     if (bound == null) {
       throw new StateError("Can't compute nullability from an absent bound.");
     }
@@ -9670,9 +11456,9 @@
     // other ways for such a dependency to exist, they should be checked here.
     bool nullabilityDependsOnItself = false;
     {
-      DartType type = typeParameter.bound;
+      DartType? type = typeParameter.bound;
       while (type is FutureOrType) {
-        type = (type as FutureOrType).typeArgument;
+        type = type.typeArgument;
       }
       if (type is TypeParameterType && type.parameter == typeParameter) {
         // Intersection types can't appear in the bound.
@@ -9701,7 +11487,7 @@
   /// is null), the nullability of the intersection type is simply
   /// [typeParameterTypeNullability].
   static Nullability getNullability(
-      Nullability typeParameterTypeNullability, DartType promotedBound) {
+      Nullability typeParameterTypeNullability, DartType? promotedBound) {
     // If promotedBound is null, getNullability simply returns the nullability
     // of the type parameter type.
     Nullability lhsNullability = typeParameterTypeNullability;
@@ -9872,7 +11658,7 @@
       printer.writeTypeParameterName(parameter);
       printer.write(nullabilityToString(declaredNullability));
       printer.write(" & ");
-      printer.writeType(promotedBound);
+      printer.writeType(promotedBound!);
       printer.write(')');
       printer.write(nullabilityToString(nullability));
     } else {
@@ -10006,20 +11792,22 @@
   /// annotations if needed.
   List<Expression> annotations = const <Expression>[];
 
-  String name; // Cosmetic name.
+  String? name; // Cosmetic name.
 
   /// The bound on the type variable.
   ///
   /// Should not be null except temporarily during IR construction.  Should
   /// be set to the root class for type parameters without an explicit bound.
-  DartType bound;
+  // TODO(johnniwinther): Can we make this late non-nullable?
+  DartType? bound;
 
   /// The default value of the type variable. It is used to provide the
   /// corresponding missing type argument in type annotations and as the
   /// fall-back type value in type inference at compile time. At run time,
   /// [defaultType] is used by the backends in place of the missing type
   /// argument of a dynamic invocation of a generic function.
-  DartType defaultType;
+  // TODO(johnniwinther): Can we make this late non-nullable?
+  DartType? defaultType;
 
   /// Describes variance of the type parameter w.r.t. declaration on which it is
   /// defined. For classes, if variance is not explicitly set, the type
@@ -10027,11 +11815,11 @@
   /// on the lattice is equivalent to [Variance.covariant]. For typedefs, it's
   /// the variance of the type parameters in the type term on the r.h.s. of the
   /// typedef.
-  int _variance;
+  int? _variance;
 
   int get variance => _variance ?? Variance.covariant;
 
-  void set variance(int newVariance) => _variance = newVariance;
+  void set variance(int? newVariance) => _variance = newVariance;
 
   bool get isLegacyCovariant => _variance == null;
 
@@ -10063,24 +11851,55 @@
     annotations.add(annotation..parent = this);
   }
 
+  @override
   R accept<R>(TreeVisitor<R> v) => v.visitTypeParameter(this);
 
-  visitChildren(Visitor v) {
+  @override
+  R accept1<R, A>(TreeVisitor1<R, A> v, A arg) =>
+      v.visitTypeParameter(this, arg);
+
+  @override
+  void visitChildren(Visitor v) {
     visitList(annotations, v);
-    bound.accept(v);
+    bound?.accept(v);
     defaultType?.accept(v);
   }
 
-  transformChildren(Transformer v) {
-    transformList(annotations, v, this);
-    bound = v.visitDartType(bound);
+  @override
+  void transformChildren(Transformer v) {
+    v.transformList(annotations, this);
+    if (bound != null) {
+      bound = v.visitDartType(bound!);
+    }
     if (defaultType != null) {
-      defaultType = v.visitDartType(defaultType);
+      defaultType = v.visitDartType(defaultType!);
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    v.transformExpressionList(annotations, this);
+    if (bound != null) {
+      DartType newBound = v.visitDartType(bound!, dummyDartType);
+      if (identical(newBound, dummyDartType)) {
+        bound = null;
+      } else {
+        bound = newBound;
+      }
+    }
+    if (defaultType != null) {
+      DartType newDefaultType = v.visitDartType(defaultType!, dummyDartType);
+      if (identical(newDefaultType, dummyDartType)) {
+        defaultType = null;
+      } else {
+        defaultType = newDefaultType;
+      }
     }
   }
 
   /// Returns a possibly synthesized name for this type parameter, consistent
   /// with the names used across all [toString] calls.
+  @override
   String toString() {
     return "TypeParameter(${toStringInternal()})";
   }
@@ -10098,7 +11917,8 @@
   final List<DartType> typeArguments;
 
   Supertype(Class classNode, List<DartType> typeArguments)
-      : this.byReference(getClassReference(classNode), typeArguments);
+      : this.byReference(
+            getNonNullableClassReference(classNode), typeArguments);
 
   Supertype.byReference(this.className, this.typeArguments);
 
@@ -10273,6 +12093,7 @@
 
 class StringConstant extends PrimitiveConstant<String> {
   StringConstant(String value) : super(value) {
+    // ignore: unnecessary_null_comparison
     assert(value != null);
   }
 
@@ -10322,6 +12143,7 @@
   @override
   void toTextInternal(AstPrinter printer) {
     printer.write('#');
+    // ignore: unnecessary_null_comparison
     if (printer.includeAuxiliaryProperties && libraryReference != null) {
       printer.write(libraryNameToString(libraryReference.asLibrary));
       printer.write('::');
@@ -10368,11 +12190,9 @@
   @override
   String toString() => 'MapConstant(${toStringInternal()})';
 
-  int _cachedHashCode;
-  int get hashCode {
-    return _cachedHashCode ??= _Hash.combine2Finish(
-        keyType.hashCode, valueType.hashCode, _Hash.combineListHash(entries));
-  }
+  @override
+  late final int hashCode = _Hash.combine2Finish(
+      keyType.hashCode, valueType.hashCode, _Hash.combineListHash(entries));
 
   bool operator ==(Object other) =>
       identical(this, other) ||
@@ -10448,11 +12268,9 @@
   @override
   String toString() => 'ListConstant(${toStringInternal()})';
 
-  int _cachedHashCode;
-  int get hashCode {
-    return _cachedHashCode ??= _Hash.combineFinish(
-        typeArgument.hashCode, _Hash.combineListHash(entries));
-  }
+  @override
+  late final int hashCode = _Hash.combineFinish(
+      typeArgument.hashCode, _Hash.combineListHash(entries));
 
   bool operator ==(Object other) =>
       identical(this, other) ||
@@ -10497,11 +12315,9 @@
   @override
   String toString() => 'SetConstant(${toStringInternal()})';
 
-  int _cachedHashCode;
-  int get hashCode {
-    return _cachedHashCode ??= _Hash.combineFinish(
-        typeArgument.hashCode, _Hash.combineListHash(entries));
-  }
+  @override
+  late final int hashCode = _Hash.combineFinish(
+      typeArgument.hashCode, _Hash.combineListHash(entries));
 
   bool operator ==(Object other) =>
       identical(this, other) ||
@@ -10556,13 +12372,9 @@
   @override
   String toString() => 'InstanceConstant(${toStringInternal()})';
 
-  int _cachedHashCode;
-  int get hashCode {
-    return _cachedHashCode ??= _Hash.combine2Finish(
-        classReference.hashCode,
-        listHashCode(typeArguments),
-        _Hash.combineMapHashUnordered(fieldValues));
-  }
+  @override
+  late final int hashCode = _Hash.combine2Finish(classReference.hashCode,
+      listHashCode(typeArguments), _Hash.combineMapHashUnordered(fieldValues));
 
   bool operator ==(Object other) {
     return identical(this, other) ||
@@ -10630,7 +12442,7 @@
 
   TearOffConstant.byReference(this.procedureReference);
 
-  Procedure get procedure => procedureReference?.asProcedure;
+  Procedure get procedure => procedureReference.asProcedure;
 
   visitChildren(Visitor v) {
     procedureReference.asProcedure.acceptReference(v);
@@ -10655,7 +12467,7 @@
   }
 
   FunctionType getType(StaticTypeContext context) {
-    return procedure.function.computeFunctionType(context.nonNullable);
+    return procedure.function!.computeFunctionType(context.nonNullable);
   }
 }
 
@@ -10694,7 +12506,7 @@
   final Expression expression;
 
   UnevaluatedConstant(this.expression) {
-    expression?.parent = null;
+    expression.parent = null;
   }
 
   visitChildren(Visitor v) {
@@ -10744,7 +12556,7 @@
   ///
   /// Note that this field can be null, and by convention should be null if the
   /// list is empty.
-  List<String> problemsAsJson;
+  List<String>? problemsAsJson;
 
   final List<Library> libraries;
 
@@ -10759,19 +12571,19 @@
       <String, MetadataRepository<dynamic>>{};
 
   /// Reference to the main method in one of the libraries.
-  Reference _mainMethodName;
-  Reference get mainMethodName => _mainMethodName;
-  NonNullableByDefaultCompiledMode _mode;
+  Reference? _mainMethodName;
+  Reference? get mainMethodName => _mainMethodName;
+  NonNullableByDefaultCompiledMode? _mode;
   NonNullableByDefaultCompiledMode get mode {
     return _mode ?? NonNullableByDefaultCompiledMode.Weak;
   }
 
-  NonNullableByDefaultCompiledMode get modeRaw => _mode;
+  NonNullableByDefaultCompiledMode? get modeRaw => _mode;
 
   Component(
-      {CanonicalName nameRoot,
-      List<Library> libraries,
-      Map<Uri, Source> uriToSource})
+      {CanonicalName? nameRoot,
+      List<Library>? libraries,
+      Map<Uri, Source>? uriToSource})
       : root = nameRoot ?? new CanonicalName.root(),
         libraries = libraries ?? <Library>[],
         uriToSource = uriToSource ?? <Uri, Source>{} {
@@ -10779,13 +12591,14 @@
   }
 
   void adoptChildren() {
+    // ignore: unnecessary_null_comparison
     if (libraries != null) {
       for (int i = 0; i < libraries.length; ++i) {
         // The libraries are owned by this component, and so are their canonical
         // names if they exist.
         Library library = libraries[i];
         library.parent = this;
-        CanonicalName name = library.reference.canonicalName;
+        CanonicalName? name = library.reference.canonicalName;
         if (name != null && name.parent != root) {
           root.adoptChild(name);
         }
@@ -10848,7 +12661,7 @@
     root.unbindAll();
   }
 
-  Procedure get mainMethod => mainMethodName?.asProcedure;
+  Procedure? get mainMethod => mainMethodName?.asProcedure;
 
   void setMainMethodAndMode(Reference main, bool overwriteMainIfSet,
       NonNullableByDefaultCompiledMode mode) {
@@ -10858,21 +12671,33 @@
     _mode = mode;
   }
 
+  @override
   R accept<R>(TreeVisitor<R> v) => v.visitComponent(this);
 
-  visitChildren(Visitor v) {
+  @override
+  R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitComponent(this, arg);
+
+  @override
+  void visitChildren(Visitor v) {
     visitList(libraries, v);
     mainMethod?.acceptReference(v);
   }
 
-  transformChildren(Transformer v) {
-    transformList(libraries, v, this);
+  @override
+  void transformChildren(Transformer v) {
+    v.transformList(libraries, this);
   }
 
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    v.transformLibraryList(libraries, this);
+  }
+
+  @override
   Component get enclosingComponent => this;
 
   /// Translates an offset to line and column numbers in the given file.
-  Location getLocation(Uri file, int offset) {
+  Location? getLocation(Uri? file, int offset) {
     return uriToSource[file]?.getLocation(file, offset);
   }
 
@@ -10905,7 +12730,8 @@
 /// A tuple with file, line, and column number, for displaying human-readable
 /// locations.
 class Location {
-  final Uri file;
+  // TODO(johnniwinther): Make this non-nullable.
+  final Uri? file;
   final int line; // 1-based.
   final int column; // 1-based.
 
@@ -11030,49 +12856,6 @@
   }
 }
 
-void transformTypeList(List<DartType> nodes, Transformer visitor) {
-  int storeIndex = 0;
-  for (int i = 0; i < nodes.length; ++i) {
-    DartType result = visitor.visitDartType(nodes[i]);
-    if (result != null) {
-      nodes[storeIndex] = result;
-      ++storeIndex;
-    }
-  }
-  if (storeIndex < nodes.length) {
-    nodes.length = storeIndex;
-  }
-}
-
-void transformSupertypeList(List<Supertype> nodes, Transformer visitor) {
-  int storeIndex = 0;
-  for (int i = 0; i < nodes.length; ++i) {
-    Supertype result = visitor.visitSupertype(nodes[i]);
-    if (result != null) {
-      nodes[storeIndex] = result;
-      ++storeIndex;
-    }
-  }
-  if (storeIndex < nodes.length) {
-    nodes.length = storeIndex;
-  }
-}
-
-void transformList(List<TreeNode> nodes, Transformer visitor, TreeNode parent) {
-  int storeIndex = 0;
-  for (int i = 0; i < nodes.length; ++i) {
-    TreeNode result = nodes[i].accept(visitor);
-    if (result != null) {
-      nodes[storeIndex] = result;
-      result.parent = parent;
-      ++storeIndex;
-    }
-  }
-  if (storeIndex < nodes.length) {
-    nodes.length = storeIndex;
-  }
-}
-
 class _ChildReplacer extends Transformer {
   final TreeNode child;
   final TreeNode replacement;
@@ -11080,7 +12863,7 @@
   _ChildReplacer(this.child, this.replacement);
 
   @override
-  defaultTreeNode(TreeNode node) {
+  TreeNode defaultTreeNode(TreeNode node) {
     if (node == child) {
       return replacement;
     } else {
@@ -11090,31 +12873,35 @@
 }
 
 class Source {
-  final List<int> lineStarts;
+  final List<int>? lineStarts;
 
   /// A UTF8 encoding of the original source file.
-  final List<int> source;
+  final List<int>? source;
 
   final Uri importUri;
 
   final Uri fileUri;
 
-  Set<Reference> constantCoverageConstructors;
+  Set<Reference>? constantCoverageConstructors;
 
-  String cachedText;
+  String? cachedText;
 
   Source(this.lineStarts, this.source, this.importUri, this.fileUri);
 
   /// Return the text corresponding to [line] which is a 1-based line
   /// number. The returned line contains no line separators.
-  String getTextLine(int line) {
+  String? getTextLine(int line) {
+    List<int>? lineStarts = this.lineStarts;
     if (source == null ||
-        source.isEmpty ||
+        source!.isEmpty ||
         lineStarts == null ||
-        lineStarts.isEmpty) return null;
+        lineStarts.isEmpty) {
+      return null;
+    }
     RangeError.checkValueInInterval(line, 1, lineStarts.length, 'line');
 
-    cachedText ??= utf8.decode(source, allowMalformed: true);
+    String cachedText =
+        this.cachedText ??= utf8.decode(source!, allowMalformed: true);
     // -1 as line numbers start at 1.
     int index = line - 1;
     if (index + 1 == lineStarts.length) {
@@ -11135,7 +12922,8 @@
   }
 
   /// Translates an offset to 1-based line and column numbers in the given file.
-  Location getLocation(Uri file, int offset) {
+  Location getLocation(Uri? file, int offset) {
+    List<int>? lineStarts = this.lineStarts;
     if (lineStarts == null || lineStarts.isEmpty) {
       return new Location(file, TreeNode.noOffset, TreeNode.noOffset);
     }
@@ -11163,6 +12951,7 @@
   /// has no lines.
   /// Throws [RangeError] if line or calculated offset are out of range.
   int getOffset(int line, int column) {
+    List<int>? lineStarts = this.lineStarts;
     if (lineStarts == null || lineStarts.isEmpty) {
       return -1;
     }
@@ -11177,11 +12966,11 @@
 /// ProcedureKind.
 ///
 /// Returns `null` if the member is `null`.
-Reference getMemberReferenceBasedOnProcedureKind(
-    Member member, ProcedureKind kind) {
+Reference? getMemberReferenceBasedOnProcedureKind(
+    Member? member, ProcedureKind kind) {
   if (member == null) return null;
   if (member is Field) {
-    if (kind == ProcedureKind.Setter) return member.setterReference;
+    if (kind == ProcedureKind.Setter) return member.setterReference!;
     return member.getterReference;
   }
   return member.reference;
@@ -11191,8 +12980,12 @@
 ///
 /// Returns `null` if the member is `null`.
 /// TODO(jensj): Should it be called NotSetter instead of Getter?
-Reference getMemberReferenceGetter(Member member) {
+Reference? getMemberReferenceGetter(Member? member) {
   if (member == null) return null;
+  return getNonNullableMemberReferenceGetter(member);
+}
+
+Reference getNonNullableMemberReferenceGetter(Member member) {
   if (member is Field) return member.getterReference;
   return member.reference;
 }
@@ -11200,26 +12993,35 @@
 /// Returns the setter [Reference] object for the given member.
 ///
 /// Returns `null` if the member is `null`.
-Reference getMemberReferenceSetter(Member member) {
+Reference? getMemberReferenceSetter(Member? member) {
   if (member == null) return null;
-  if (member is Field) return member.setterReference;
+  return getNonNullableMemberReferenceSetter(member);
+}
+
+Reference getNonNullableMemberReferenceSetter(Member member) {
+  if (member is Field) return member.setterReference!;
   return member.reference;
 }
 
 /// Returns the [Reference] object for the given class.
 ///
 /// Returns `null` if the class is `null`.
-Reference getClassReference(Class class_) {
+Reference? getClassReference(Class? class_) {
   return class_?.reference;
 }
 
+/// Returns the [Reference] object for the given class.
+Reference getNonNullableClassReference(Class class_) {
+  return class_.reference;
+}
+
 /// Returns the canonical name of [member], or throws an exception if the
 /// member has not been assigned a canonical name yet.
 ///
 /// Returns `null` if the member is `null`.
-CanonicalName getCanonicalNameOfMemberGetter(Member member) {
+CanonicalName? getCanonicalNameOfMemberGetter(Member? member) {
   if (member == null) return null;
-  CanonicalName canonicalName;
+  CanonicalName? canonicalName;
   if (member is Field) {
     canonicalName = member.getterCanonicalName;
   } else {
@@ -11235,9 +13037,9 @@
 /// member has not been assigned a canonical name yet.
 ///
 /// Returns `null` if the member is `null`.
-CanonicalName getCanonicalNameOfMemberSetter(Member member) {
+CanonicalName? getCanonicalNameOfMemberSetter(Member? member) {
   if (member == null) return null;
-  CanonicalName canonicalName;
+  CanonicalName? canonicalName;
   if (member is Field) {
     canonicalName = member.setterCanonicalName;
   } else {
@@ -11253,7 +13055,7 @@
 /// class has not been assigned a canonical name yet.
 ///
 /// Returns `null` if the class is `null`.
-CanonicalName getCanonicalNameOfClass(Class class_) {
+CanonicalName? getCanonicalNameOfClass(Class? class_) {
   if (class_ == null) return null;
   if (class_.canonicalName == null) {
     throw '$class_ has no canonical name';
@@ -11265,7 +13067,7 @@
 /// class has not been assigned a canonical name yet.
 ///
 /// Returns `null` if the extension is `null`.
-CanonicalName getCanonicalNameOfExtension(Extension extension) {
+CanonicalName? getCanonicalNameOfExtension(Extension? extension) {
   if (extension == null) return null;
   if (extension.canonicalName == null) {
     throw '$extension has no canonical name';
@@ -11277,7 +13079,7 @@
 /// library has not been assigned a canonical name yet.
 ///
 /// Returns `null` if the library is `null`.
-CanonicalName getCanonicalNameOfLibrary(Library library) {
+CanonicalName? getCanonicalNameOfLibrary(Library? library) {
   if (library == null) return null;
   if (library.canonicalName == null) {
     throw '$library has no canonical name';
@@ -11356,9 +13158,12 @@
     return hash;
   }
 
-  static int combineMapHashUnordered(Map map, [int hash = 2]) {
+  static int combineMapHashUnordered(Map? map, [int hash = 2]) {
     if (map == null || map.isEmpty) return hash;
-    List<int> entryHashes = List.filled(map.length, null);
+    List<int> entryHashes = List.filled(
+        map.length,
+        // `-1` is used as a dummy default value.
+        -1);
     int i = 0;
     for (core.MapEntry entry in map.entries) {
       entryHashes[i++] = combine(entry.key.hashCode, entry.value.hashCode);
@@ -11375,7 +13180,7 @@
   }
 }
 
-int listHashCode(List list) {
+int listHashCode(List<Object> list) {
   return _Hash.finish(_Hash.combineListHash(list));
 }
 
@@ -11417,7 +13222,7 @@
 /// typedef has not been assigned a canonical name yet.
 ///
 /// Returns `null` if the typedef is `null`.
-CanonicalName getCanonicalNameOfTypedef(Typedef typedef_) {
+CanonicalName? getCanonicalNameOfTypedef(Typedef? typedef_) {
   if (typedef_ == null) return null;
   if (typedef_.canonicalName == null) {
     throw '$typedef_ has no canonical name';
@@ -11430,7 +13235,8 @@
 /// static analysis and runtime behavior of the library are unaffected.
 const Null informative = null;
 
-Location _getLocationInComponent(Component component, Uri fileUri, int offset) {
+Location? _getLocationInComponent(
+    Component? component, Uri? fileUri, int offset) {
   if (component != null) {
     return component.getLocation(fileUri, offset);
   } else {
@@ -11471,13 +13277,11 @@
 List<DartType> getAsTypeArguments(
     List<TypeParameter> typeParameters, Library library) {
   if (typeParameters.isEmpty) return const <DartType>[];
-  List<DartType> result =
-      new List<DartType>.filled(typeParameters.length, null, growable: false);
-  for (int i = 0; i < result.length; ++i) {
-    result[i] = new TypeParameterType.withDefaultNullabilityForLibrary(
-        typeParameters[i], library);
-  }
-  return result;
+  return new List<DartType>.generate(
+      typeParameters.length,
+      (int i) => new TypeParameterType.withDefaultNullabilityForLibrary(
+          typeParameters[i], library),
+      growable: false);
 }
 
 class Version extends Object {
@@ -11485,7 +13289,9 @@
   final int minor;
 
   const Version(this.major, this.minor)
+      // ignore: unnecessary_null_comparison
       : assert(major != null),
+        // ignore: unnecessary_null_comparison
         assert(minor != null);
 
   bool operator <(Version other) {
@@ -11544,15 +13350,218 @@
   }
 }
 
-/// Non-nullable `DartType` value to be used as a dummy initial value for the
-/// `List.filled` constructor.
-const DartType dartTypeDummy = const DynamicType();
+/// Non-nullable [DartType] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final DartType dummyDartType = new DynamicType();
 
-/// Non-nullable `NamedType` value to be used as a dummy initial value for the
-/// `List.filled` constructor.
-const NamedType namedTypeDummy =
-    const NamedType('', dartTypeDummy, isRequired: false);
+/// Non-nullable [Supertype] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Supertype dummySupertype = new Supertype(dummyClass, const []);
 
-/// Non-nullable `Member` value to be used as a dummy initial value for the
+/// Non-nullable [NamedType] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final NamedType dummyNamedType =
+    new NamedType('', dummyDartType, isRequired: false);
+
+/// Non-nullable [Uri] dummy value.
+final Uri dummyUri = new Uri(scheme: 'dummy');
+
+/// Non-nullable [Name] dummy value.
+final Name dummyName = new _PublicName('');
+
+/// Non-nullable [Library] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Library dummyLibrary = new Library(dummyUri);
+
+/// Non-nullable [LibraryDependency] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final LibraryDependency dummyLibraryDependency =
+    new LibraryDependency.import(dummyLibrary);
+
+/// Non-nullable [Combinator] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Combinator dummyCombinator = new Combinator(false, const []);
+
+/// Non-nullable [LibraryPart] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final LibraryPart dummyLibraryPart = new LibraryPart(const [], '');
+
+/// Non-nullable [Class] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Class dummyClass = new Class();
+
+/// Non-nullable [Constructor] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Constructor dummyConstructor = new Constructor(dummyFunctionNode);
+
+/// Non-nullable [Extension] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Extension dummyExtension = new Extension();
+
+/// Non-nullable [Member] dummy value.
+///
+/// This can be used for instance as a dummy initial value for the
 /// `List.filled` constructor.
 final Member dummyMember = new Field.mutable(new _PublicName(''));
+
+/// Non-nullable [Procedure] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Procedure dummyProcedure =
+    new Procedure(dummyName, ProcedureKind.Method, dummyFunctionNode);
+
+/// Non-nullable [Field] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Field dummyField = new Field.mutable(dummyName);
+
+/// Non-nullable [RedirectingFactoryConstructor] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final RedirectingFactoryConstructor dummyRedirectingFactoryConstructor =
+    new RedirectingFactoryConstructor(null);
+
+/// Non-nullable [Typedef] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Typedef dummyTypedef = new Typedef('', null);
+
+/// Non-nullable [Initializer] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Initializer dummyInitializer = new InvalidInitializer();
+
+/// Non-nullable [FunctionNode] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final FunctionNode dummyFunctionNode = new FunctionNode(null);
+
+/// Non-nullable [Statement] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Statement dummyStatement = new EmptyStatement();
+
+/// Non-nullable [Expression] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Expression dummyExpression = new NullLiteral();
+
+/// Non-nullable [NamedExpression] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final NamedExpression dummyNamedExpression =
+    new NamedExpression('', dummyExpression);
+
+/// Non-nullable [VariableDeclaration] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final VariableDeclaration dummyVariableDeclaration =
+    new VariableDeclaration(null);
+
+/// Non-nullable [TypeParameter] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final TypeParameter dummyTypeParameter = new TypeParameter();
+
+/// Non-nullable [MapEntry] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final MapEntry dummyMapEntry = new MapEntry(dummyExpression, dummyExpression);
+
+/// Non-nullable [Arguments] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Arguments dummyArguments = new Arguments(const []);
+
+/// Non-nullable [AssertStatement] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final AssertStatement dummyAssertStatement = new AssertStatement(
+    dummyExpression,
+    conditionStartOffset: TreeNode.noOffset,
+    conditionEndOffset: TreeNode.noOffset);
+
+/// Non-nullable [SwitchCase] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final SwitchCase dummySwitchCase = new SwitchCase.empty();
+
+/// Non-nullable [Catch] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Catch dummyCatch = new Catch(null, dummyStatement);
+
+/// Sentinel value used to signal that a node cannot be removed through the
+/// [RemovingTransformer].
+const Null cannotRemoveSentinel = null;
+
+/// Helper that can be used in asserts to check that [list] is mutable by
+/// adding and removing [dummyElement].
+bool checkListIsMutable<E>(List<E> list, E dummyElement) {
+  list
+    ..add(dummyElement)
+    ..removeLast();
+  return true;
+}
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 7eb93df..f6ae627 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -6,7 +6,6 @@
 
 library kernel.ast_from_binary;
 
-import 'dart:core' hide MapEntry;
 import 'dart:developer';
 import 'dart:convert';
 import 'dart:typed_data';
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 821b2f9..bed4058 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -6,7 +6,6 @@
 
 library kernel.ast_to_binary;
 
-import 'dart:core' hide MapEntry;
 import 'dart:convert';
 import 'dart:developer';
 import 'dart:io' show BytesBuilder;
diff --git a/pkg/kernel/lib/canonical_name.dart b/pkg/kernel/lib/canonical_name.dart
index 70f3004..af7344e 100644
--- a/pkg/kernel/lib/canonical_name.dart
+++ b/pkg/kernel/lib/canonical_name.dart
@@ -2,8 +2,6 @@
 // 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.
 
-// @dart = 2.9
-
 library kernel.canonical_name;
 
 import 'ast.dart';
@@ -69,25 +67,27 @@
 /// The "qualified name" allows a member to have a name that is private to
 /// a library other than the one containing that member.
 class CanonicalName {
-  CanonicalName _parent;
+  CanonicalName? _parent;
 
-  CanonicalName get parent => _parent;
+  CanonicalName? get parent => _parent;
 
   final String name;
-  CanonicalName _nonRootTop;
+  CanonicalName? _nonRootTop;
 
-  Map<String, CanonicalName> _children;
+  Map<String, CanonicalName>? _children;
 
   /// The library, class, or member bound to this name.
-  Reference reference;
+  Reference? reference;
 
   /// Temporary index used during serialization.
   int index = -1;
 
-  CanonicalName._(this._parent, this.name) {
+  CanonicalName._(CanonicalName parent, this.name) : _parent = parent {
+    // ignore: unnecessary_null_comparison
     assert(name != null);
+    // ignore: unnecessary_null_comparison
     assert(parent != null);
-    _nonRootTop = _parent.isRoot ? this : _parent._nonRootTop;
+    _nonRootTop = parent.isRoot ? this : parent._nonRootTop;
   }
 
   CanonicalName.root()
@@ -96,15 +96,16 @@
         name = '';
 
   bool get isRoot => _parent == null;
-  CanonicalName get nonRootTop => _nonRootTop;
+
+  CanonicalName? get nonRootTop => _nonRootTop;
 
   Iterable<CanonicalName> get children =>
       _children?.values ?? const <CanonicalName>[];
 
-  Iterable<CanonicalName> get childrenOrNull => _children?.values;
+  Iterable<CanonicalName>? get childrenOrNull => _children?.values;
 
   bool hasChild(String name) {
-    return _children != null && _children.containsKey(name);
+    return _children != null && _children!.containsKey(name);
   }
 
   CanonicalName getChild(String name) {
@@ -121,32 +122,32 @@
 
   CanonicalName getChildFromQualifiedName(Name name) {
     return name.isPrivate
-        ? getChildFromUri(name.library.importUri).getChild(name.text)
+        ? getChildFromUri(name.library!.importUri).getChild(name.text)
         : getChild(name.text);
   }
 
   CanonicalName getChildFromProcedure(Procedure procedure) {
     return getChild(getProcedureQualifier(procedure))
-        .getChildFromQualifiedName(procedure.name);
+        .getChildFromQualifiedName(procedure.name!);
   }
 
   CanonicalName getChildFromField(Field field) {
-    return getChild('@fields').getChildFromQualifiedName(field.name);
+    return getChild('@fields').getChildFromQualifiedName(field.name!);
   }
 
   CanonicalName getChildFromFieldSetter(Field field) {
-    return getChild('@=fields').getChildFromQualifiedName(field.name);
+    return getChild('@=fields').getChildFromQualifiedName(field.name!);
   }
 
   CanonicalName getChildFromConstructor(Constructor constructor) {
     return getChild('@constructors')
-        .getChildFromQualifiedName(constructor.name);
+        .getChildFromQualifiedName(constructor.name!);
   }
 
   CanonicalName getChildFromRedirectingFactoryConstructor(
       RedirectingFactoryConstructor redirectingFactoryConstructor) {
     return getChild('@factories')
-        .getChildFromQualifiedName(redirectingFactoryConstructor.name);
+        .getChildFromQualifiedName(redirectingFactoryConstructor.name!);
   }
 
   CanonicalName getChildFromFieldWithName(Name name) {
@@ -175,26 +176,27 @@
   /// the same name.
   void adoptChild(CanonicalName child) {
     if (child._parent == this) return;
-    if (_children != null && _children.containsKey(child.name)) {
+    if (_children != null && _children!.containsKey(child.name)) {
       throw 'Cannot add a child to $this because this name already has a '
           'child named ${child.name}';
     }
-    child._parent.removeChild(child.name);
+    child._parent?.removeChild(child.name);
     child._parent = this;
-    if (_children == null) _children = <String, CanonicalName>{};
-    _children[child.name] = child;
+    _children ??= <String, CanonicalName>{};
+    _children![child.name] = child;
   }
 
   void removeChild(String name) {
     if (_children != null) {
-      _children.remove(name);
-      if (_children.isEmpty) {
+      _children!.remove(name);
+      if (_children!.isEmpty) {
         _children = null;
       }
     }
   }
 
   void bindTo(Reference target) {
+    // ignore: unnecessary_null_comparison
     if (target == null) {
       throw '$this cannot be bound to null';
     }
@@ -217,25 +219,25 @@
     // canonical name tree. We need to establish better invariants about the
     // state of the canonical name tree, since for instance [unbindAll] doesn't
     // remove unneeded leaf nodes.
-    _parent.removeChild(name);
+    _parent?.removeChild(name);
   }
 
   void _unbindInternal() {
     if (reference == null) return;
-    assert(reference.canonicalName == this);
-    if (reference.node is Class) {
+    assert(reference!.canonicalName == this);
+    if (reference!.node is Class) {
       // TODO(jensj): Get rid of this. This is only needed because pkg:vm does
       // weird stuff in transformations. `unbind` should probably be private.
-      Class c = reference.node;
+      Class c = reference!.asClass;
       c.ensureLoaded();
     }
-    reference.canonicalName = null;
+    reference!.canonicalName = null;
     reference = null;
   }
 
   void unbindAll() {
     _unbindInternal();
-    Iterable<CanonicalName> children_ = childrenOrNull;
+    Iterable<CanonicalName>? children_ = childrenOrNull;
     if (children_ != null) {
       for (CanonicalName child in children_) {
         child.unbindAll();
@@ -246,8 +248,8 @@
   String toString() => _parent == null ? 'root' : '$parent::$name';
   String toStringInternal() {
     if (isRoot) return "";
-    if (parent.isRoot) return "$name";
-    return "${parent.toStringInternal()}::$name";
+    if (parent!.isRoot) return "$name";
+    return "${parent!.toStringInternal()}::$name";
   }
 
   Reference getReference() {
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index 08ed371..0c6e3f3 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -8,7 +8,6 @@
 import 'dart:math';
 import 'dart:typed_data';
 
-// ignore: import_of_legacy_library_into_null_safe
 import 'ast.dart' hide MapEntry;
 import 'core_types.dart';
 import 'type_algebra.dart';
@@ -283,7 +282,7 @@
   /// [getDeclaredMembers] and [getInterfaceMembers].
   static int compareMembers(Member first, Member second) {
     if (first == second) return 0;
-    return compareNames(first.name, second.name);
+    return compareNames(first.name!, second.name!);
   }
 
   /// Compares names, using the same sort order as [getDeclaredMembers] and
@@ -329,7 +328,7 @@
     while (low <= high) {
       int mid = low + ((high - low) >> 1);
       Member pivot = members[mid];
-      int comparison = compareNames(name, pivot.name);
+      int comparison = compareNames(name, pivot.name!);
       if (comparison < 0) {
         high = mid - 1;
       } else if (comparison > 0) {
@@ -418,9 +417,9 @@
   Member? getSingleTargetForInterfaceInvocation(Member interfaceTarget,
       {bool setter: false}) {
     if (invalidated) throw "This data structure has been invalidated";
-    Name name = interfaceTarget.name;
+    Name name = interfaceTarget.name!;
     Member? target = null;
-    ClassSet subtypes = getSubtypesOf(interfaceTarget.enclosingClass);
+    ClassSet subtypes = getSubtypesOf(interfaceTarget.enclosingClass!);
     for (Class c in subtypes) {
       if (!c.isAbstract) {
         Member? candidate =
@@ -591,8 +590,14 @@
         heap.add(infoFor(supertype.classNode));
       }
 
-      if (classNode.supertype != null) addToHeap(classNode.supertype);
-      if (classNode.mixedInType != null) addToHeap(classNode.mixedInType);
+      Supertype? supertype = classNode.supertype;
+      if (supertype != null) {
+        addToHeap(supertype);
+      }
+      Supertype? mixedInType = classNode.mixedInType;
+      if (mixedInType != null) {
+        addToHeap(mixedInType);
+      }
       classNode.implementedTypes.forEach(addToHeap);
     }
     return chain;
@@ -861,11 +866,13 @@
     void removeClass(Class cls) {
       _ClassInfo? info = _infoMap[cls];
       if (info == null) return;
-      if (cls.supertype != null) {
-        _infoMap[cls.supertype.classNode]?.directExtenders.remove(info);
+      Supertype? supertype = cls.supertype;
+      if (supertype != null) {
+        _infoMap[supertype.classNode]?.directExtenders.remove(info);
       }
-      if (cls.mixedInType != null) {
-        _infoMap[cls.mixedInType.classNode]?.directMixers.remove(info);
+      Supertype? mixedInType = cls.mixedInType;
+      if (mixedInType != null) {
+        _infoMap[mixedInType.classNode]?.directMixers.remove(info);
       }
       for (Supertype supertype in cls.implementedTypes) {
         _infoMap[supertype.classNode]?.directImplementers.remove(info);
@@ -1095,12 +1102,14 @@
       }
       _collectSupersForClass(class_);
 
-      if (class_.supertype != null) {
-        _recordSuperTypes(info, class_.supertype);
+      Supertype? supertype = class_.supertype;
+      if (supertype != null) {
+        _recordSuperTypes(info, supertype);
       }
-      if (class_.mixedInType != null) {
+      Supertype? mixedInType = class_.mixedInType;
+      if (mixedInType != null) {
         mixinInferrer?.infer(this, class_);
-        _recordSuperTypes(info, class_.mixedInType);
+        _recordSuperTypes(info, mixedInType);
       }
       for (Supertype supertype in class_.implementedTypes) {
         _recordSuperTypes(info, supertype);
@@ -1169,10 +1178,11 @@
     if (members != null) return members;
 
     List<Member> inherited;
-    if (classNode.supertype == null) {
+    Supertype? supertype = classNode.supertype;
+    if (supertype == null) {
       inherited = const <Member>[];
     } else {
-      Class superClassNode = classNode.supertype.classNode;
+      Class superClassNode = supertype.classNode;
       _ClassInfo superInfo = _infoMap[superClassNode]!;
       inherited =
           _buildImplementedMembers(superClassNode, superInfo, setters: setters);
@@ -1208,7 +1218,7 @@
           setters: setters)) {
         if (mixinMember is! Procedure ||
             (mixinMember is Procedure && !mixinMember.isSynthetic)) {
-          memberMap[mixinMember.name] = mixinMember;
+          memberMap[mixinMember.name!] = mixinMember;
         }
       }
     }
@@ -1217,21 +1227,21 @@
       if (procedure.isStatic) continue;
       if (procedure.kind == ProcedureKind.Setter) {
         if (setters) {
-          memberMap[procedure.name] = procedure;
+          memberMap[procedure.name!] = procedure;
         }
       } else {
         if (!setters) {
-          memberMap[procedure.name] = procedure;
+          memberMap[procedure.name!] = procedure;
         }
       }
     }
     for (Field field in classNode.fields) {
       if (field.isStatic) continue;
       if (!setters) {
-        memberMap[field.name] = field;
+        memberMap[field.name!] = field;
       }
       if (setters && field.hasSetter) {
-        memberMap[field.name] = field;
+        memberMap[field.name!] = field;
       }
     }
 
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index 83a94a1..979d08f 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -6,8 +6,6 @@
 
 library kernel.clone;
 
-import 'dart:core' hide MapEntry;
-
 import 'ast.dart';
 import 'type_algebra.dart';
 
diff --git a/pkg/kernel/lib/core_types.dart b/pkg/kernel/lib/core_types.dart
index 2fa52ac..edac20b 100644
--- a/pkg/kernel/lib/core_types.dart
+++ b/pkg/kernel/lib/core_types.dart
@@ -4,7 +4,6 @@
 
 library kernel.core_types;
 
-// ignore: import_of_legacy_library_into_null_safe
 import 'ast.dart';
 import 'library_index.dart';
 import 'type_algebra.dart';
@@ -1137,13 +1136,13 @@
     if (type is TypeParameterType &&
         type.promotedBound != null &&
         type.isPotentiallyNonNullable) {
-      return isBottom(type.promotedBound);
+      return isBottom(type.promotedBound!);
     }
 
     // BOTTOM(X extends T) is true iff BOTTOM(T).
     if (type is TypeParameterType && type.isPotentiallyNonNullable) {
       assert(type.promotedBound == null);
-      return isBottom(type.parameter.bound);
+      return isBottom(type.parameter.bound!);
     }
 
     if (type is BottomType) return true;
diff --git a/pkg/kernel/lib/default_language_version.dart b/pkg/kernel/lib/default_language_version.dart
index 5b39ec4..6de3073 100644
--- a/pkg/kernel/lib/default_language_version.dart
+++ b/pkg/kernel/lib/default_language_version.dart
@@ -2,8 +2,6 @@
 // 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.
 
-// @dart = 2.9
-
 // NOTE: THIS FILE IS GENERATED. DO NOT EDIT.
 //
 // Instead modify 'tools/experimental_features.yaml' and run
diff --git a/pkg/kernel/lib/import_table.dart b/pkg/kernel/lib/import_table.dart
index 1cc27c2..d6bf7ee 100644
--- a/pkg/kernel/lib/import_table.dart
+++ b/pkg/kernel/lib/import_table.dart
@@ -4,7 +4,6 @@
 
 library kernel.import_table;
 
-// ignore: import_of_legacy_library_into_null_safe
 import 'ast.dart';
 
 abstract class ImportTable {
@@ -111,7 +110,7 @@
   visitLibrary(Library node) {
     super.visitLibrary(node);
     for (Reference exportedReference in node.additionalExports) {
-      addLibraryImport(exportedReference.node.parent as Library);
+      addLibraryImport(exportedReference.node!.parent as Library);
     }
   }
 
diff --git a/pkg/kernel/lib/library_index.dart b/pkg/kernel/lib/library_index.dart
index 630763d..2619b62 100644
--- a/pkg/kernel/lib/library_index.dart
+++ b/pkg/kernel/lib/library_index.dart
@@ -4,7 +4,6 @@
 
 library kernel.library_index;
 
-// ignore: import_of_legacy_library_into_null_safe
 import 'ast.dart';
 
 /// Provides name-based access to library, class, and member AST nodes.
@@ -142,18 +141,18 @@
       _classes = <String, _MemberTable>{};
       _classes![LibraryIndex.topLevel] = new _MemberTable.topLevel(this);
       for (Class class_ in library.classes) {
-        _classes![class_.name] = new _MemberTable.fromClass(this, class_);
+        _classes![class_.name!] = new _MemberTable.fromClass(this, class_);
       }
       for (Extension extension_ in library.extensions) {
-        _classes![extension_.name] =
+        _classes![extension_.name!] =
             new _MemberTable.fromExtension(this, extension_);
       }
       for (Reference reference in library.additionalExports) {
-        NamedNode node = reference.node;
+        NamedNode? node = reference.node;
         if (node is Class) {
-          _classes![node.name] = new _MemberTable.fromClass(this, node);
+          _classes![node.name!] = new _MemberTable.fromClass(this, node);
         } else if (node is Extension) {
-          _classes![node.name] = new _MemberTable.fromExtension(this, node);
+          _classes![node.name!] = new _MemberTable.fromExtension(this, node);
         }
       }
     }
@@ -222,14 +221,14 @@
 
   String getDisambiguatedName(Member member) {
     if (member is Procedure) {
-      if (member.isGetter) return LibraryIndex.getterPrefix + member.name.text;
-      if (member.isSetter) return LibraryIndex.setterPrefix + member.name.text;
+      if (member.isGetter) return LibraryIndex.getterPrefix + member.name!.text;
+      if (member.isSetter) return LibraryIndex.setterPrefix + member.name!.text;
     }
-    return member.name.text;
+    return member.name!.text;
   }
 
   void _addMember(Member member) {
-    if (member.name.isPrivate && member.name.library != library) {
+    if (member.name!.isPrivate && member.name!.library != library) {
       // Members whose name is private to other libraries cannot currently
       // be found with the LibraryIndex class.
       return;
@@ -252,10 +251,10 @@
   }
 
   void _addExtensionMember(ExtensionMemberDescriptor extensionMember) {
-    final NamedNode replacement = extensionMember.member.node;
+    final NamedNode? replacement = extensionMember.member.node;
     if (replacement is! Member) return;
     Member member = replacement;
-    if (member.name.isPrivate && member.name.library != library) {
+    if (member.name!.isPrivate && member.name!.library != library) {
       // Members whose name is private to other libraries cannot currently
       // be found with the LibraryIndex class.
       return;
diff --git a/pkg/kernel/lib/src/assumptions.dart b/pkg/kernel/lib/src/assumptions.dart
index 00b07a9..1d96904 100644
--- a/pkg/kernel/lib/src/assumptions.dart
+++ b/pkg/kernel/lib/src/assumptions.dart
@@ -2,7 +2,6 @@
 // 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.
 
-// ignore: import_of_legacy_library_into_null_safe
 import '../ast.dart';
 
 /// Pairs of [TypeParameter]s that are currently assumed to be
diff --git a/pkg/kernel/lib/src/const_canonical_type.dart b/pkg/kernel/lib/src/const_canonical_type.dart
index 186c980..8e0567e 100644
--- a/pkg/kernel/lib/src/const_canonical_type.dart
+++ b/pkg/kernel/lib/src/const_canonical_type.dart
@@ -6,7 +6,7 @@
 
 import 'package:kernel/src/bounds_checks.dart';
 
-import '../ast.dart' hide MapEntry;
+import '../ast.dart';
 import '../core_types.dart';
 import '../type_algebra.dart';
 
diff --git a/pkg/kernel/lib/src/hierarchy_based_type_environment.dart b/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
index 4a02f4e..58186dd 100644
--- a/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
+++ b/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
@@ -4,7 +4,6 @@
 
 library kernel.hierarchy_based_type_environment;
 
-// ignore: import_of_legacy_library_into_null_safe
 import '../ast.dart' show Class, DartType, InterfaceType, Library, Member, Name;
 
 import '../class_hierarchy.dart' show ClassHierarchyBase;
diff --git a/pkg/kernel/lib/src/legacy_erasure.dart b/pkg/kernel/lib/src/legacy_erasure.dart
index fee2dc4..316a701 100644
--- a/pkg/kernel/lib/src/legacy_erasure.dart
+++ b/pkg/kernel/lib/src/legacy_erasure.dart
@@ -2,9 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE.md file.
 
-// ignore: import_of_legacy_library_into_null_safe
-import '../ast.dart' hide MapEntry;
-
+import '../ast.dart';
 import 'replacement_visitor.dart';
 
 /// Returns legacy erasure of [type], that is, the type in which all nnbd
diff --git a/pkg/kernel/lib/src/merge_visitor.dart b/pkg/kernel/lib/src/merge_visitor.dart
index f089d75..392c59a 100644
--- a/pkg/kernel/lib/src/merge_visitor.dart
+++ b/pkg/kernel/lib/src/merge_visitor.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE.md file.
 
-// ignore: import_of_legacy_library_into_null_safe
-import '../ast.dart' hide MapEntry;
+import '../ast.dart';
 import '../type_algebra.dart';
 
 /// Helper visitor that merges two types, and return the merged type or `null`
@@ -73,13 +72,13 @@
 
       for (int i = 0; i < newTypeParameters.length; i++) {
         DartType? newBound =
-            mergeTypes(a.typeParameters[i].bound, b.typeParameters[i].bound);
+            mergeTypes(a.typeParameters[i].bound!, b.typeParameters[i].bound!);
         if (newBound == null) {
           return null;
         }
         newTypeParameters[i].bound = newBound;
         DartType? newDefaultType = mergeTypes(
-            a.typeParameters[i].defaultType, b.typeParameters[i].defaultType);
+            a.typeParameters[i].defaultType!, b.typeParameters[i].defaultType!);
         if (newDefaultType == null) {
           return null;
         }
@@ -90,7 +89,7 @@
     DartType? newReturnType = mergeTypes(a.returnType, b.returnType);
     if (newReturnType == null) return null;
     List<DartType> newPositionalParameters =
-        new List<DartType>.filled(a.positionalParameters.length, dartTypeDummy);
+        new List<DartType>.filled(a.positionalParameters.length, dummyDartType);
     for (int i = 0; i < a.positionalParameters.length; i++) {
       DartType? newType =
           mergeTypes(a.positionalParameters[i], b.positionalParameters[i]);
@@ -100,7 +99,7 @@
       newPositionalParameters[i] = newType;
     }
     List<NamedType> newNamedParameters =
-        new List<NamedType>.filled(a.namedParameters.length, namedTypeDummy);
+        new List<NamedType>.filled(a.namedParameters.length, dummyNamedType);
     for (int i = 0; i < a.namedParameters.length; i++) {
       DartType? newType =
           mergeTypes(a.namedParameters[i].type, b.namedParameters[i].type);
@@ -116,7 +115,8 @@
     }
     TypedefType? newTypedefType;
     if (a.typedefType != null && b.typedefType != null) {
-      newTypedefType = mergeTypes(a.typedefType, b.typedefType) as TypedefType?;
+      newTypedefType =
+          mergeTypes(a.typedefType!, b.typedefType!) as TypedefType?;
       // If the typedef couldn't be merged we just omit it from the resulting
       // function type since the typedef type is only informational.
     }
@@ -157,7 +157,7 @@
       return new InterfaceType(a.classNode, nullability);
     }
     List<DartType> newTypeArguments =
-        new List<DartType>.filled(a.typeArguments.length, dartTypeDummy);
+        new List<DartType>.filled(a.typeArguments.length, dummyDartType);
     for (int i = 0; i < a.typeArguments.length; i++) {
       DartType? newType = a.typeArguments[i].accept1(this, b.typeArguments[i]);
       if (newType == null) {
@@ -259,7 +259,8 @@
     assert(a.parameter == b.parameter);
     assert(a.promotedBound != null);
     assert(b.promotedBound != null);
-    DartType? newPromotedBound = a.promotedBound.accept1(this, b.promotedBound);
+    DartType? newPromotedBound =
+        a.promotedBound!.accept1(this, b.promotedBound);
     if (newPromotedBound == null) {
       return null;
     }
@@ -287,7 +288,7 @@
       return new TypedefType(a.typedefNode, nullability);
     }
     List<DartType> newTypeArguments =
-        new List<DartType>.filled(a.typeArguments.length, dartTypeDummy);
+        new List<DartType>.filled(a.typeArguments.length, dummyDartType);
     for (int i = 0; i < a.typeArguments.length; i++) {
       DartType? newType = a.typeArguments[i].accept1(this, b.typeArguments[i]);
       if (newType == null) return null;
diff --git a/pkg/kernel/lib/src/nnbd_top_merge.dart b/pkg/kernel/lib/src/nnbd_top_merge.dart
index 7a81f62..632ccc3 100644
--- a/pkg/kernel/lib/src/nnbd_top_merge.dart
+++ b/pkg/kernel/lib/src/nnbd_top_merge.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE.md file.
 
-// ignore: import_of_legacy_library_into_null_safe
-import '../ast.dart' hide MapEntry;
+import '../ast.dart';
 import '../core_types.dart';
 
 import 'merge_visitor.dart';
@@ -17,7 +16,7 @@
     return a;
   }
   List<DartType> newTypeArguments =
-      new List<DartType>.filled(a.typeArguments.length, dartTypeDummy);
+      new List<DartType>.filled(a.typeArguments.length, dummyDartType);
   for (int i = 0; i < a.typeArguments.length; i++) {
     DartType? newTypeArgument =
         nnbdTopMerge(coreTypes, a.typeArguments[i], b.typeArguments[i]);
diff --git a/pkg/kernel/lib/src/non_null.dart b/pkg/kernel/lib/src/non_null.dart
index c3df22a..2223d74 100644
--- a/pkg/kernel/lib/src/non_null.dart
+++ b/pkg/kernel/lib/src/non_null.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE.md file.
 
-// ignore: import_of_legacy_library_into_null_safe
 import '../ast.dart';
 
 /// Returns the type defines as `NonNull(type)` in the nnbd specification.
@@ -78,12 +77,12 @@
       return null;
     }
     if (node.promotedBound != null) {
-      if (node.promotedBound.nullability == Nullability.nonNullable) {
+      if (node.promotedBound!.nullability == Nullability.nonNullable) {
         // The promoted bound is already non-nullable so we set the declared
         // nullability to non-nullable.
         return node.withDeclaredNullability(Nullability.nonNullable);
       }
-      DartType? promotedBound = node.promotedBound.accept(this);
+      DartType? promotedBound = node.promotedBound!.accept(this);
       if (promotedBound == null) {
         // The promoted bound could not be made non-nullable so we set the
         // declared nullability to undetermined.
@@ -91,7 +90,7 @@
           return null;
         }
         return new TypeParameterType.intersection(
-            node.parameter, Nullability.undetermined, node.promotedBound);
+            node.parameter, Nullability.undetermined, node.promotedBound!);
       } else if (promotedBound.nullability == Nullability.nonNullable) {
         // The bound could be made non-nullable so we use it as the promoted
         // bound.
diff --git a/pkg/kernel/lib/src/norm.dart b/pkg/kernel/lib/src/norm.dart
index f828120..78ab826 100644
--- a/pkg/kernel/lib/src/norm.dart
+++ b/pkg/kernel/lib/src/norm.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE.md file.
 
-// ignore: import_of_legacy_library_into_null_safe
-import '../ast.dart' hide MapEntry;
+import '../ast.dart';
 import '../core_types.dart';
 import '../type_algebra.dart';
 
@@ -94,7 +93,7 @@
   @override
   DartType? visitTypeParameterType(TypeParameterType node, int variance) {
     if (node.promotedBound == null) {
-      DartType bound = node.parameter.bound;
+      DartType bound = node.parameter.bound!;
       if (normalizesToNever(bound)) {
         DartType result = NeverType.fromNullability(node.nullability);
         return result.accept1(this, variance) ?? result;
@@ -103,7 +102,7 @@
       // If the bound isn't Never, the type is already normalized.
       return null;
     } else {
-      DartType bound = node.promotedBound;
+      DartType bound = node.promotedBound!;
       bound = bound.accept1(this, variance) ?? bound;
       if (bound is NeverType && bound.nullability == Nullability.nonNullable) {
         return bound;
@@ -119,7 +118,7 @@
         assert(!coreTypes.isTop(bound));
         return new TypeParameterType(node.parameter, node.declaredNullability);
       } else if (bound == coreTypes.objectNonNullableRawType &&
-          norm(coreTypes, node.parameter.bound) ==
+          norm(coreTypes, node.parameter.bound!) ==
               coreTypes.objectNonNullableRawType) {
         return new TypeParameterType(node.parameter, node.declaredNullability);
       } else if (identical(bound, node.promotedBound)) {
@@ -144,9 +143,9 @@
       return true;
     } else if (type is TypeParameterType) {
       if (type.promotedBound == null) {
-        return normalizesToNever(type.parameter.bound);
+        return normalizesToNever(type.parameter.bound!);
       } else {
-        return normalizesToNever(type.promotedBound);
+        return normalizesToNever(type.promotedBound!);
       }
     }
     return false;
diff --git a/pkg/kernel/lib/src/printer.dart b/pkg/kernel/lib/src/printer.dart
index d14c8cd..5874ca7 100644
--- a/pkg/kernel/lib/src/printer.dart
+++ b/pkg/kernel/lib/src/printer.dart
@@ -2,7 +2,6 @@
 // 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.
 
-// ignore: import_of_legacy_library_into_null_safe
 import '../ast.dart';
 import 'text_util.dart';
 
@@ -157,8 +156,9 @@
   }
 
   String getVariableName(VariableDeclaration node) {
-    if (node.name != null) {
-      return node.name;
+    String? name = node.name;
+    if (name != null) {
+      return name;
     }
     return _variableNames[node] ??= '#${_variableNames.length}';
   }
@@ -259,22 +259,22 @@
       for (TypeParameter typeParameter in typeParameters) {
         _sb.write(comma);
         _sb.write(typeParameter.name);
-        DartType bound = typeParameter.bound;
+        DartType bound = typeParameter.bound!;
 
         bool isTopObject(DartType type) {
           if (type is InterfaceType &&
               type.className.node != null &&
               type.classNode.name == 'Object') {
-            Uri? uri = type.classNode.enclosingLibrary?.importUri;
-            return uri?.scheme == 'dart' &&
-                uri?.path == 'core' &&
+            Uri uri = type.classNode.enclosingLibrary.importUri;
+            return uri.scheme == 'dart' &&
+                uri.path == 'core' &&
                 (type.nullability == Nullability.legacy ||
                     type.nullability == Nullability.nullable);
           }
           return false;
         }
 
-        if (!isTopObject(bound) || isTopObject(typeParameter.defaultType)) {
+        if (!isTopObject(bound) || isTopObject(typeParameter.defaultType!)) {
           // Include explicit bounds only.
           _sb.write(' extends ');
           writeType(bound);
@@ -385,7 +385,7 @@
     _sb.write(getVariableName(node));
     if (includeInitializer && node.initializer != null && !node.isRequired) {
       _sb.write(' = ');
-      writeExpression(node.initializer);
+      writeExpression(node.initializer!);
     }
   }
 
@@ -401,7 +401,7 @@
         }
         _sb.write(node.typeParameters[index].name);
         _sb.write(' extends ');
-        writeType(node.typeParameters[index].bound);
+        writeType(node.typeParameters[index].bound!);
       }
       _sb.write('>');
     }
@@ -437,7 +437,7 @@
     if (body != null) {
       if (body is ReturnStatement) {
         _sb.write(' => ');
-        writeExpression(body.expression);
+        writeExpression(body.expression!);
       } else {
         _sb.write(' ');
         writeStatement(body);
diff --git a/pkg/kernel/lib/src/replacement_visitor.dart b/pkg/kernel/lib/src/replacement_visitor.dart
index 45e823e..8fbce4aad 100644
--- a/pkg/kernel/lib/src/replacement_visitor.dart
+++ b/pkg/kernel/lib/src/replacement_visitor.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE.md file.
 
-// ignore: import_of_legacy_library_into_null_safe
-import '../ast.dart' hide MapEntry;
+import '../ast.dart';
 import '../type_algebra.dart';
 
 /// Helper visitor that clones a type if a nested type is replaced, and
@@ -49,7 +48,7 @@
           Substitution.fromPairs(node.typeParameters, typeParameterTypes);
       for (int i = 0; i < newTypeParameters.length; i++) {
         newTypeParameters[i].bound =
-            substitution.substituteType(newTypeParameters[i].bound);
+            substitution.substituteType(newTypeParameters[i].bound!);
       }
     }
 
@@ -211,7 +210,7 @@
   DartType? visitTypeParameterType(TypeParameterType node, int variance) {
     Nullability? newNullability = visitNullability(node);
     if (node.promotedBound != null) {
-      DartType newPromotedBound = node.promotedBound.accept1(this, variance);
+      DartType? newPromotedBound = node.promotedBound!.accept1(this, variance);
       return createPromotedTypeParameterType(
           node, newNullability, newPromotedBound);
     }
diff --git a/pkg/kernel/lib/src/standard_bounds.dart b/pkg/kernel/lib/src/standard_bounds.dart
index efab942..dba4d98 100644
--- a/pkg/kernel/lib/src/standard_bounds.dart
+++ b/pkg/kernel/lib/src/standard_bounds.dart
@@ -4,8 +4,7 @@
 
 import 'dart:math' as math;
 
-// ignore: import_of_legacy_library_into_null_safe
-import '../ast.dart' hide MapEntry;
+import '../ast.dart';
 import '../class_hierarchy.dart';
 import '../core_types.dart';
 import '../type_algebra.dart';
@@ -216,7 +215,7 @@
         s.promotedBound != null &&
         t is TypeParameterType &&
         t.promotedBound != null) {
-      return morebottom(s.promotedBound, t.promotedBound);
+      return morebottom(s.promotedBound!, t.promotedBound!);
     }
 
     // MOREBOTTOM(X&S, T) = true.
@@ -233,7 +232,7 @@
     if (s is TypeParameterType && t is TypeParameterType) {
       assert(s.promotedBound == null);
       assert(t.promotedBound == null);
-      return morebottom(s.parameter.bound, t.parameter.bound);
+      return morebottom(s.parameter.bound!, t.parameter.bound!);
     }
 
     throw new UnsupportedError("morebottom($s, $t)");
@@ -950,8 +949,8 @@
           // TODO(dmitryas): Figure out if a procedure for syntactic equality
           // should be used instead.
           if (!areMutualSubtypes(
-              f.typeParameters[i].bound,
-              substitution.substituteType(g.typeParameters[i].bound),
+              f.typeParameters[i].bound!,
+              substitution.substituteType(g.typeParameters[i].bound!),
               SubtypeCheckMode.withNullabilities)) {
             boundsMatch = false;
           }
@@ -967,7 +966,7 @@
     List<TypeParameter> typeParameters = f.typeParameters;
 
     List<DartType> positionalParameters =
-        new List<DartType>.filled(maxPos, dartTypeDummy);
+        new List<DartType>.filled(maxPos, dummyDartType);
     for (int i = 0; i < minPos; ++i) {
       positionalParameters[i] = _getNullabilityAwareStandardUpperBound(
           f.positionalParameters[i],
@@ -1149,8 +1148,8 @@
           // TODO(dmitryas): Figure out if a procedure for syntactic
           // equality should be used instead.
           if (!areMutualSubtypes(
-              f.typeParameters[i].bound,
-              substitution.substituteType(g.typeParameters[i].bound),
+              f.typeParameters[i].bound!,
+              substitution.substituteType(g.typeParameters[i].bound!),
               SubtypeCheckMode.withNullabilities)) {
             boundsMatch = false;
           }
@@ -1164,7 +1163,7 @@
     List<TypeParameter> typeParameters = f.typeParameters;
 
     List<DartType> positionalParameters =
-        new List<DartType>.filled(minPos, dartTypeDummy);
+        new List<DartType>.filled(minPos, dummyDartType);
     for (int i = 0; i < minPos; ++i) {
       positionalParameters[i] = _getNullabilityAwareStandardLowerBound(
           f.positionalParameters[i],
@@ -1233,12 +1232,12 @@
               topFunctionType: coreTypes.functionNonNullableRawType,
               unhandledTypeHandler: (type, recursor) => false);
       return _getNullabilityAwareStandardUpperBound(
-              eliminator.eliminateToGreatest(type1.parameter.bound),
+              eliminator.eliminateToGreatest(type1.parameter.bound!),
               type2,
               clientLibrary)
           .withDeclaredNullability(uniteNullabilities(
               type1.declaredNullability,
-              uniteNullabilities(type1.parameter.bound.declaredNullability,
+              uniteNullabilities(type1.parameter.bound!.declaredNullability,
                   type2.declaredNullability)));
     } else {
       // UP(X1 & B1, T2) =
@@ -1265,11 +1264,11 @@
               topFunctionType: coreTypes.functionNonNullableRawType,
               unhandledTypeHandler: (type, recursor) => false);
       return _getNullabilityAwareStandardUpperBound(
-              eliminator.eliminateToGreatest(type1.promotedBound),
+              eliminator.eliminateToGreatest(type1.promotedBound!),
               type2,
               clientLibrary)
           .withDeclaredNullability(uniteNullabilities(
-              type1.promotedBound.declaredNullability,
+              type1.promotedBound!.declaredNullability,
               type2.declaredNullability));
     }
   }
@@ -1419,7 +1418,7 @@
     int totalPositional =
         math.max(f.positionalParameters.length, g.positionalParameters.length);
     List<DartType> positionalParameters =
-        new List<DartType>.filled(totalPositional, dartTypeDummy);
+        new List<DartType>.filled(totalPositional, dummyDartType);
     for (int i = 0; i < totalPositional; i++) {
       if (i < f.positionalParameters.length) {
         DartType fType = f.positionalParameters[i];
@@ -1523,7 +1522,7 @@
     int totalPositional =
         math.min(f.positionalParameters.length, g.positionalParameters.length);
     List<DartType> positionalParameters =
-        new List<DartType>.filled(totalPositional, dartTypeDummy);
+        new List<DartType>.filled(totalPositional, dummyDartType);
     for (int i = 0; i < totalPositional; i++) {
       positionalParameters[i] = getStandardLowerBound(
           f.positionalParameters[i], g.positionalParameters[i], clientLibrary);
@@ -1602,7 +1601,7 @@
 
       assert(tArgs1.length == tArgs2.length);
       assert(tArgs1.length == tParams.length);
-      List<DartType> tArgs = new List.filled(tArgs1.length, dartTypeDummy);
+      List<DartType> tArgs = new List.filled(tArgs1.length, dummyDartType);
       for (int i = 0; i < tArgs1.length; i++) {
         if (tParams[i].variance == Variance.contravariant) {
           tArgs[i] = getStandardLowerBound(tArgs1[i], tArgs2[i], clientLibrary);
@@ -1675,14 +1674,14 @@
       // we need to replicate that behavior?
       return getStandardUpperBound(
           Substitution.fromMap({type1.parameter: coreTypes.objectLegacyRawType})
-              .substituteType(type1.parameter.bound),
+              .substituteType(type1.parameter.bound!),
           type2,
           clientLibrary);
     } else if (type2 is TypeParameterType) {
       return getStandardUpperBound(
           type1,
           Substitution.fromMap({type2.parameter: coreTypes.objectLegacyRawType})
-              .substituteType(type2.parameter.bound),
+              .substituteType(type2.parameter.bound!),
           clientLibrary);
     } else {
       // We should only be called when at least one of the types is a
diff --git a/pkg/kernel/lib/src/text_util.dart b/pkg/kernel/lib/src/text_util.dart
index 0e9e0cc..873fafb 100644
--- a/pkg/kernel/lib/src/text_util.dart
+++ b/pkg/kernel/lib/src/text_util.dart
@@ -2,7 +2,6 @@
 // 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.
 
-// ignore: import_of_legacy_library_into_null_safe
 import '../ast.dart';
 
 String nullabilityToString(Nullability nullability) {
@@ -47,17 +46,17 @@
     {bool includeLibraryName: false}) {
   if (canonicalName.isRoot) {
     return '<root>';
-  } else if (canonicalName.parent.isRoot) {
+  } else if (canonicalName.parent!.isRoot) {
     return canonicalName.name;
-  } else if (canonicalName.parent.parent.isRoot) {
+  } else if (canonicalName.parent!.parent!.isRoot) {
     if (!includeLibraryName) {
       return canonicalName.name;
     }
-    String parentName = qualifiedCanonicalNameToString(canonicalName.parent,
+    String parentName = qualifiedCanonicalNameToString(canonicalName.parent!,
         includeLibraryName: includeLibraryName);
     return '$parentName::${canonicalName.name}';
   } else {
-    String parentName = qualifiedCanonicalNameToString(canonicalName.parent,
+    String parentName = qualifiedCanonicalNameToString(canonicalName.parent!,
         includeLibraryName: includeLibraryName);
     return '$parentName.${canonicalName.name}';
   }
@@ -165,15 +164,13 @@
 }
 
 String typedefNameToString(Typedef? node) {
-  return node == null
-      ? 'null'
-      : node.name ?? 'null-named typedef ${node.runtimeType} ${node.hashCode}';
+  return node == null ? 'null' : node.name;
 }
 
 String qualifiedMemberNameToString(Member node,
     {bool includeLibraryName: false}) {
   if (node.enclosingClass != null) {
-    return qualifiedClassNameToString(node.enclosingClass,
+    return qualifiedClassNameToString(node.enclosingClass!,
             includeLibraryName: includeLibraryName) +
         '.' +
         memberNameToString(node);
@@ -215,7 +212,7 @@
 
 String qualifiedTypeParameterNameToString(TypeParameter node,
     {bool includeLibraryName: false}) {
-  TreeNode parent = node.parent;
+  TreeNode? parent = node.parent;
   if (parent is Class) {
     return qualifiedClassNameToString(parent,
             includeLibraryName: includeLibraryName) +
diff --git a/pkg/kernel/lib/src/types.dart b/pkg/kernel/lib/src/types.dart
index b54c79d..119100c 100644
--- a/pkg/kernel/lib/src/types.dart
+++ b/pkg/kernel/lib/src/types.dart
@@ -2,7 +2,6 @@
 // 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.
 
-// ignore: import_of_legacy_library_into_null_safe
 import '../ast.dart'
     show
         BottomType,
@@ -381,7 +380,7 @@
   IsSubtypeOf isTypeParameterRelated(
       TypeParameterType s, InterfaceType t, Types types) {
     return types
-        .performNullabilityAwareSubtypeCheck(s.parameter.bound, t)
+        .performNullabilityAwareSubtypeCheck(s.parameter.bound!, t)
         .and(new IsSubtypeOf.basedSolelyOnNullabilities(s, t));
   }
 
@@ -402,7 +401,7 @@
   IsSubtypeOf isIntersectionRelated(
       TypeParameterType intersection, InterfaceType t, Types types) {
     return types.performNullabilityAwareSubtypeCheck(
-        intersection.promotedBound, t); // Rule 12.
+        intersection.promotedBound!, t); // Rule 12.
   }
 
   @override
@@ -454,7 +453,7 @@
         TypeParameter sTypeVariable = sTypeVariables[i];
         TypeParameter tTypeVariable = tTypeVariables[i];
         result = result.and(types.performNullabilityAwareMutualSubtypesCheck(
-            sTypeVariable.bound, tTypeVariable.bound));
+            sTypeVariable.bound!, tTypeVariable.bound!));
         typeVariableSubstitution.add(new TypeParameterType.forAlphaRenaming(
             sTypeVariable, tTypeVariable));
       }
@@ -468,8 +467,8 @@
           TypeParameter sTypeVariable = sTypeVariables[i];
           TypeParameter tTypeVariable = tTypeVariables[i];
           result = result.and(types.performNullabilityAwareMutualSubtypesCheck(
-              substitution.substituteType(sTypeVariable.bound),
-              tTypeVariable.bound));
+              substitution.substituteType(sTypeVariable.bound!),
+              tTypeVariable.bound!));
           if (!result.isSubtypeWhenIgnoringNullabilities()) {
             return const IsSubtypeOf.never();
           }
@@ -582,7 +581,7 @@
       TypeParameterType intersection, FunctionType t, Types types) {
     // Rule 12.
     return types.performNullabilityAwareSubtypeCheck(
-        intersection.promotedBound, t);
+        intersection.promotedBound!, t);
   }
 
   @override
@@ -590,7 +589,7 @@
       TypeParameterType s, FunctionType t, Types types) {
     // Rule 13.
     return types
-        .performNullabilityAwareSubtypeCheck(s.parameter.bound, t)
+        .performNullabilityAwareSubtypeCheck(s.parameter.bound!, t)
         .and(new IsSubtypeOf.basedSolelyOnNullabilities(s, t));
   }
 
@@ -645,7 +644,7 @@
 
     // Rule 12.
     return types.performNullabilityAwareSubtypeCheck(
-        intersection.promotedBound
+        intersection.promotedBound!
             .withDeclaredNullability(intersection.nullability),
         t);
   }
@@ -826,9 +825,9 @@
             s, t.typeArgument.withDeclaredNullability(t.nullability))
         // Rule 13.
         .orSubtypeCheckFor(
-            s.parameter.bound.withDeclaredNullability(
+            s.parameter.bound!.withDeclaredNullability(
                 combineNullabilitiesForSubstitution(
-                    s.parameter.bound.nullability, s.nullability)),
+                    s.parameter.bound!.nullability, s.nullability)),
             t,
             types)
         // Rule 10.
@@ -850,7 +849,7 @@
   IsSubtypeOf isIntersectionRelated(
       TypeParameterType intersection, FutureOrType t, Types types) {
     return isTypeParameterRelated(intersection, t, types) // Rule 8.
-        .orSubtypeCheckFor(intersection.promotedBound, t, types); // Rule 12.
+        .orSubtypeCheckFor(intersection.promotedBound!, t, types); // Rule 12.
   }
 
   @override
@@ -868,7 +867,7 @@
     // Rule 9.
     return const IsTypeParameterSubtypeOf()
         .isIntersectionRelated(sIntersection, tIntersection, types)
-        .andSubtypeCheckFor(sIntersection, tIntersection.promotedBound, types);
+        .andSubtypeCheckFor(sIntersection, tIntersection.promotedBound!, types);
   }
 
   @override
@@ -877,7 +876,7 @@
     // Rule 9.
     return const IsTypeParameterSubtypeOf()
         .isTypeParameterRelated(s, intersection, types)
-        .andSubtypeCheckFor(s, intersection.promotedBound, types);
+        .andSubtypeCheckFor(s, intersection.promotedBound!, types);
   }
 
   @override
@@ -936,7 +935,7 @@
   IsSubtypeOf isIntersectionRelated(
       TypeParameterType intersection, NullType t, Types types) {
     return types.performNullabilityAwareMutualSubtypesCheck(
-        intersection.promotedBound, t);
+        intersection.promotedBound!, t);
   }
 
   IsSubtypeOf isFunctionRelated(FunctionType s, NullType t, Types types) {
@@ -978,7 +977,7 @@
   IsSubtypeOf isIntersectionRelated(
       TypeParameterType intersection, NeverType t, Types types) {
     return types.performNullabilityAwareSubtypeCheck(
-        intersection.promotedBound, t);
+        intersection.promotedBound!, t);
   }
 
   IsSubtypeOf isFunctionRelated(FunctionType s, NeverType t, Types types) {
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 26699f0..871f92b 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -2,8 +2,6 @@
 // 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.
 
-// @dart = 2.9
-
 library kernel.ast_to_text;
 
 import 'dart:core' hide MapEntry;
@@ -26,11 +24,13 @@
 
 class NormalNamer<T> extends Namer<T> {
   final String prefix;
+
   NormalNamer(this.prefix);
 }
 
 class ConstantNamer extends RecursiveResultVisitor<Null> with Namer<Constant> {
   final String prefix;
+
   ConstantNamer(this.prefix);
 
   String getName(Constant constant) {
@@ -78,7 +78,7 @@
   final Map<U, String> namesU = <U, String>{};
   final Set<String> usedNames = new Set<String>();
 
-  String disambiguate(T key1, U key2, String proposeName()) {
+  String disambiguate(T? key1, U? key2, String proposeName()) {
     String getNewName() {
       String proposedName = proposeName();
       if (usedNames.add(proposedName)) return proposedName;
@@ -90,12 +90,12 @@
     }
 
     if (key1 != null) {
-      String result = namesT[key1];
+      String? result = namesT[key1];
       if (result != null) return result;
       return namesT[key1] = getNewName();
     }
     if (key2 != null) {
-      String result = namesU[key2];
+      String? result = namesU[key2];
       if (result != null) return result;
       return namesU[key2] = getNewName();
     }
@@ -105,13 +105,13 @@
 
 NameSystem globalDebuggingNames = new NameSystem();
 
-String debugLibraryName(Library node) {
+String debugLibraryName(Library? node) {
   return node == null
       ? 'null'
       : node.name ?? globalDebuggingNames.nameLibrary(node);
 }
 
-String debugClassName(Class node) {
+String debugClassName(Class? node) {
   return node == null
       ? 'null'
       : node.name ?? globalDebuggingNames.nameClass(node);
@@ -127,7 +127,7 @@
 
 String debugQualifiedMemberName(Member node) {
   if (node.enclosingClass != null) {
-    return debugQualifiedClassName(node.enclosingClass) +
+    return debugQualifiedClassName(node.enclosingClass!) +
         '::' +
         debugMemberName(node);
   } else {
@@ -142,13 +142,14 @@
 }
 
 String debugQualifiedTypeParameterName(TypeParameter node) {
-  if (node.parent is Class) {
-    return debugQualifiedClassName(node.parent) +
+  TreeNode? parent = node.parent;
+  if (parent is Class) {
+    return debugQualifiedClassName(parent) +
         '::' +
         debugTypeParameterName(node);
   }
-  if (node.parent is Member) {
-    return debugQualifiedMemberName(node.parent) +
+  if (parent is Member) {
+    return debugQualifiedMemberName(parent) +
         '::' +
         debugTypeParameterName(node);
   }
@@ -212,11 +213,17 @@
 
   final RegExp pathSeparator = new RegExp('[\\/]');
 
-  String nameLibraryPrefix(Library node, {String proposedName}) {
+  String nameLibraryPrefix(Library node, {String? proposedName}) {
     return prefixes.disambiguate(node.reference, node.reference.canonicalName,
         () {
-      if (proposedName != null) return proposedName;
-      if (node.name != null) return abbreviateName(node.name);
+      if (proposedName != null) {
+        return proposedName;
+      }
+      String? name = node.name;
+      if (name != null) {
+        return abbreviateName(name);
+      }
+      // ignore: unnecessary_null_comparison
       if (node.importUri != null) {
         String path = node.importUri.hasEmptyPath
             ? '${node.importUri}'
@@ -230,13 +237,13 @@
     });
   }
 
-  nameCanonicalNameAsLibraryPrefix(Reference node, CanonicalName name,
-      {String proposedName}) {
+  nameCanonicalNameAsLibraryPrefix(Reference? node, CanonicalName? name,
+      {String? proposedName}) {
     return prefixes.disambiguate(node, name, () {
       if (proposedName != null) return proposedName;
-      CanonicalName canonicalName = name ?? node.canonicalName;
+      CanonicalName? canonicalName = name ?? node?.canonicalName;
       if (canonicalName?.name != null) {
-        String path = canonicalName.name;
+        String path = canonicalName!.name;
         int slash = path.lastIndexOf(pathSeparator);
         if (slash >= 0) {
           path = path.substring(slash + 1);
@@ -274,9 +281,9 @@
 class Printer extends Visitor<void> with VisitorVoidMixin {
   final NameSystem syntheticNames;
   final StringSink sink;
-  final Annotator annotator;
-  final Map<String, MetadataRepository<Object>> metadata;
-  ImportTable importTable;
+  final Annotator? annotator;
+  final Map<String, MetadataRepository<dynamic>>? metadata;
+  ImportTable? importTable;
   int indentation = 0;
   int column = 0;
   bool showOffsets;
@@ -288,7 +295,7 @@
   int state = SPACE;
 
   Printer(this.sink,
-      {NameSystem syntheticNames,
+      {NameSystem? syntheticNames,
       this.showOffsets: false,
       this.showMetadata: false,
       this.importTable,
@@ -297,7 +304,7 @@
       : this.syntheticNames = syntheticNames ?? new NameSystem();
 
   Printer createInner(ImportTable importTable,
-      Map<String, MetadataRepository<Object>> metadata) {
+      Map<String, MetadataRepository<dynamic>>? metadata) {
     return new Printer(sink,
         importTable: importTable,
         metadata: metadata,
@@ -319,8 +326,9 @@
   }
 
   String getLibraryReference(Library node) {
+    // ignore: unnecessary_null_comparison
     if (node == null) return '<No Library>';
-    if (importTable != null && importTable.getImportIndex(node) != -1) {
+    if (importTable != null && importTable?.getImportIndex(node) != -1) {
       return syntheticNames.nameLibraryPrefix(node);
     }
     return getLibraryName(node);
@@ -335,6 +343,7 @@
   }
 
   String getClassReference(Class node) {
+    // ignore: unnecessary_null_comparison
     if (node == null) return '<No Class>';
     String name = getClassName(node);
     String library = getLibraryReference(node.enclosingLibrary);
@@ -342,6 +351,7 @@
   }
 
   String getTypedefReference(Typedef node) {
+    // ignore: unnecessary_null_comparison
     if (node == null) return '<No Typedef>';
     String library = getLibraryReference(node.enclosingLibrary);
     return '$library::${node.name}';
@@ -352,15 +362,17 @@
 
   Name getMemberName(Member node) {
     if (node.name?.text == '') return emptyName;
-    if (node.name != null) return node.name;
+    if (node.name != null) return node.name!;
     return new Name(syntheticNames.nameMember(node));
   }
 
   String getMemberReference(Member node) {
+    // ignore: unnecessary_null_comparison
     if (node == null) return '<No Member>';
     String name = getMemberName(node).text;
-    if (node.parent is Class) {
-      String className = getClassReference(node.parent);
+    Class? enclosingClass = node.enclosingClass;
+    if (enclosingClass != null) {
+      String className = getClassReference(enclosingClass);
       return '$className::$name';
     } else {
       String library = getLibraryReference(node.enclosingLibrary);
@@ -373,6 +385,7 @@
   }
 
   String getVariableReference(VariableDeclaration node) {
+    // ignore: unnecessary_null_comparison
     if (node == null) return '<No VariableDeclaration>';
     return getVariableName(node);
   }
@@ -382,13 +395,15 @@
   }
 
   String getTypeParameterReference(TypeParameter node) {
+    // ignore: unnecessary_null_comparison
     if (node == null) return '<No TypeParameter>';
     String name = getTypeParameterName(node);
-    if (node.parent is FunctionNode && node.parent.parent is Member) {
-      String member = getMemberReference(node.parent.parent);
+    TreeNode? parent = node.parent;
+    if (parent is FunctionNode && parent.parent is Member) {
+      String member = getMemberReference(parent.parent as Member);
       return '$member::$name';
-    } else if (node.parent is Class) {
-      String className = getClassReference(node.parent);
+    } else if (parent is Class) {
+      String className = getClassReference(parent);
       return '$className::$name';
     } else {
       return name; // Bound inside a function type.
@@ -399,8 +414,8 @@
     writeProblemsAsJson("Problems in component", component.problemsAsJson);
   }
 
-  void writeProblemsAsJson(String header, List<String> problemsAsJson) {
-    if (problemsAsJson?.isEmpty == false) {
+  void writeProblemsAsJson(String header, List<String>? problemsAsJson) {
+    if (problemsAsJson != null && problemsAsJson.isNotEmpty) {
       endLine("//");
       write("// ");
       write(header);
@@ -408,7 +423,8 @@
       endLine("//");
       for (String s in problemsAsJson) {
         Map<String, Object> decoded = json.decode(s);
-        List<Object> plainTextFormatted = decoded["plainTextFormatted"];
+        List<Object> plainTextFormatted =
+            decoded["plainTextFormatted"] as List<Object>;
         List<String> lines = plainTextFormatted.join("\n").split("\n");
         for (int i = 0; i < lines.length; i++) {
           write("//");
@@ -424,8 +440,9 @@
   void writeLibraryFile(Library library) {
     writeAnnotationList(library.annotations);
     writeWord('library');
-    if (library.name != null) {
-      writeWord(library.name);
+    String? name = library.name;
+    if (name != null) {
+      writeWord(name);
     }
     if (library.isNonNullableByDefault) {
       writeWord("/*isNonNullableByDefault*/");
@@ -453,7 +470,7 @@
   }
 
   void writeStandardLibraryContent(Library library,
-      {Printer outerPrinter, LibraryImportTable importsToPrint}) {
+      {Printer? outerPrinter, LibraryImportTable? importsToPrint}) {
     outerPrinter ??= this;
     outerPrinter.writeProblemsAsJson(
         "Problems in library", library.problemsAsJson);
@@ -479,23 +496,23 @@
     write('additionalExports = (');
     for (int i = 0; i < additionalExports.length; i++) {
       Reference reference = additionalExports[i];
-      NamedNode node = reference.node;
+      NamedNode? node = reference.node;
       if (node is Class) {
         Library nodeLibrary = node.enclosingLibrary;
         String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
-        write(prefix + '::' + node.name);
+        write(prefix + '::' + node.name!);
       } else if (node is Extension) {
         Library nodeLibrary = node.enclosingLibrary;
         String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
-        write(prefix + '::' + node.name);
+        write(prefix + '::' + node.name!);
       } else if (node is Field) {
         Library nodeLibrary = node.enclosingLibrary;
         String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
-        write(prefix + '::' + node.name.text);
+        write(prefix + '::' + node.name!.text);
       } else if (node is Procedure) {
         Library nodeLibrary = node.enclosingLibrary;
         String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
-        write(prefix + '::' + node.name.text);
+        write(prefix + '::' + node.name!.text);
       } else if (node is Typedef) {
         Library nodeLibrary = node.enclosingLibrary;
         String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
@@ -532,9 +549,11 @@
       }
       writeAnnotationList(library.annotations);
       writeWord('library');
-      if (library.name != null) {
-        writeWord(library.name);
+      String? name = library.name;
+      if (name != null) {
+        writeWord(name);
       }
+      // ignore: unnecessary_null_comparison
       if (library.importUri != null) {
         writeSpaced('from');
         writeWord('"${library.importUri}"');
@@ -567,7 +586,7 @@
     endLine('}');
   }
 
-  int getPrecedence(TreeNode node) {
+  int getPrecedence(Expression node) {
     return Precedence.of(node);
   }
 
@@ -618,7 +637,7 @@
     writeSpace('  ' * indentation);
   }
 
-  void writeNode(Node node) {
+  void writeNode(Node? node) {
     if (node == null) {
       writeSymbol("<Null>");
     } else {
@@ -642,16 +661,10 @@
     }
   }
 
-  void writeOptionalNode(Node node) {
-    if (node != null) {
-      node.accept(this);
-    }
-  }
-
   void writeMetadata(TreeNode node) {
     if (metadata != null) {
-      for (MetadataRepository<Object> md in metadata.values) {
-        final Object nodeMetadata = md.mapping[node];
+      for (MetadataRepository<dynamic> md in metadata!.values) {
+        final dynamic nodeMetadata = md.mapping[node];
         if (nodeMetadata != null) {
           writeWord("[@${md.tag}=${nodeMetadata}]");
         }
@@ -659,7 +672,7 @@
     }
   }
 
-  void writeAnnotatedType(DartType type, String annotation) {
+  void writeAnnotatedType(DartType type, String? annotation) {
     writeType(type);
     if (annotation != null) {
       write('/');
@@ -669,6 +682,7 @@
   }
 
   void writeType(DartType type) {
+    // ignore: unnecessary_null_comparison
     if (type == null) {
       write('<No DartType>');
     } else {
@@ -677,12 +691,14 @@
   }
 
   void writeOptionalType(DartType type) {
+    // ignore: unnecessary_null_comparison
     if (type != null) {
       type.accept(this);
     }
   }
 
   visitSupertype(Supertype type) {
+    // ignore: unnecessary_null_comparison
     if (type == null) {
       write('<No Supertype>');
     } else {
@@ -711,14 +727,14 @@
   }
 
   void writeName(Name name) {
-    if (name?.text == '') {
+    if (name.text == '') {
       writeWord(emptyNameString);
     } else {
-      writeWord(name?.text ?? '<anonymous>'); // TODO: write library name
+      writeWord(name.text); // TODO: write library name
     }
   }
 
-  void endLine([String string]) {
+  void endLine([String? string]) {
     if (string != null) {
       write(string);
     }
@@ -728,7 +744,7 @@
   }
 
   void writeFunction(FunctionNode function,
-      {name, List<Initializer> initializers, bool terminateLine: true}) {
+      {name, List<Initializer>? initializers, bool terminateLine: true}) {
     if (name is String) {
       writeWord(name);
     } else if (name is Name) {
@@ -758,8 +774,9 @@
       writeSpaced(getAsyncMarkerKeyword(function.dartAsyncMarker));
       writeSpaced("*/");
     }
-    if (function.body != null) {
-      writeFunctionBody(function.body, terminateLine: terminateLine);
+    Statement? body = function.body;
+    if (body != null) {
+      writeFunctionBody(body, terminateLine: terminateLine);
     } else if (terminateLine) {
       endLine(';');
     } else {
@@ -806,15 +823,15 @@
       }
     } else if (body is ReturnStatement && !terminateLine) {
       writeSpaced('=>');
-      writeExpression(body.expression);
+      writeExpression(body.expression!);
     } else {
       writeBody(body);
     }
   }
 
   writeFunctionType(FunctionType node,
-      {List<VariableDeclaration> typedefPositional,
-      List<VariableDeclaration> typedefNamed}) {
+      {List<VariableDeclaration>? typedefPositional,
+      List<VariableDeclaration>? typedefNamed}) {
     if (state == WORD) {
       ensureSpace();
     }
@@ -892,7 +909,8 @@
     }
   }
 
-  void writeReturnType(DartType type, String annotation) {
+  void writeReturnType(DartType type, String? annotation) {
+    // ignore: unnecessary_null_comparison
     if (type == null) return;
     writeSpaced('→');
     writeAnnotatedType(type, annotation);
@@ -949,23 +967,24 @@
   }
 
   String getClassReferenceFromReference(Reference reference) {
+    // ignore: unnecessary_null_comparison
     if (reference == null) return '<No Class>';
     if (reference.node != null) return getClassReference(reference.asClass);
     if (reference.canonicalName != null) {
-      return getCanonicalNameString(reference.canonicalName);
+      return getCanonicalNameString(reference.canonicalName!);
     }
     throw "Neither node nor canonical name found";
   }
 
-  void writeMemberReferenceFromReference(Reference reference) {
+  void writeMemberReferenceFromReference(Reference? reference) {
     writeWord(getMemberReferenceFromReference(reference));
   }
 
-  String getMemberReferenceFromReference(Reference reference) {
+  String getMemberReferenceFromReference(Reference? reference) {
     if (reference == null) return '<No Member>';
     if (reference.node != null) return getMemberReference(reference.asMember);
     if (reference.canonicalName != null) {
-      return getCanonicalNameString(reference.canonicalName);
+      return getCanonicalNameString(reference.canonicalName!);
     }
     throw "Neither node nor canonical name found";
   }
@@ -976,28 +995,28 @@
 
     String libraryString(CanonicalName lib) {
       if (lib.reference?.node != null) {
-        return getLibraryReference(lib.reference.asLibrary);
+        return getLibraryReference(lib.reference!.asLibrary);
       }
       return syntheticNames.nameCanonicalNameAsLibraryPrefix(
           lib.reference, lib);
     }
 
     String classString(CanonicalName cls) =>
-        libraryString(cls.parent) + '::' + cls.name;
+        libraryString(cls.parent!) + '::' + cls.name;
 
-    if (name.parent.isRoot) return libraryString(name);
-    if (name.parent.parent.isRoot) return classString(name);
+    if (name.parent!.isRoot) return libraryString(name);
+    if (name.parent!.parent!.isRoot) return classString(name);
 
-    CanonicalName atNode = name.parent;
+    CanonicalName atNode = name.parent!;
     while (!atNode.name.startsWith('@')) {
-      atNode = atNode.parent;
+      atNode = atNode.parent!;
     }
 
     String parent = "";
-    if (atNode.parent.parent.isRoot) {
-      parent = libraryString(atNode.parent);
+    if (atNode.parent!.parent!.isRoot) {
+      parent = libraryString(atNode.parent!);
     } else {
-      parent = classString(atNode.parent);
+      parent = classString(atNode.parent!);
     }
 
     if (name.name == '') return "$parent::$emptyNameString";
@@ -1023,7 +1042,7 @@
     writeWord(getTypeParameterReference(node));
   }
 
-  void writeExpression(Expression node, [int minimumPrecedence]) {
+  void writeExpression(Expression node, [int? minimumPrecedence]) {
     final bool highlight = shouldHighlight(node);
     if (highlight) {
       startHighlight(node);
@@ -1087,9 +1106,10 @@
     writeSpace();
     writeAnnotatedType(node.type, annotator?.annotateField(this, node));
     writeName(getMemberName(node));
-    if (node.initializer != null) {
+    Expression? initializer = node.initializer;
+    if (initializer != null) {
       writeSpaced('=');
-      writeExpression(node.initializer);
+      writeExpression(initializer);
     }
     List<String> features = <String>[];
     if (node.enclosingLibrary.isNonNullableByDefault !=
@@ -1100,10 +1120,10 @@
         features.add("isLegacy");
       }
     }
-    if ((node.enclosingClass == null &&
+    Class? enclosingClass = node.enclosingClass;
+    if ((enclosingClass == null &&
             node.enclosingLibrary.fileUri != node.fileUri) ||
-        (node.enclosingClass != null &&
-            node.enclosingClass.fileUri != node.fileUri)) {
+        (enclosingClass != null && enclosingClass.fileUri != node.fileUri)) {
       features.add(" from ${node.fileUri} ");
     }
     if (features.isNotEmpty) {
@@ -1148,10 +1168,10 @@
         features.add("isLegacy");
       }
     }
-    if ((node.enclosingClass == null &&
+    Class? enclosingClass = node.enclosingClass;
+    if ((enclosingClass == null &&
             node.enclosingLibrary.fileUri != node.fileUri) ||
-        (node.enclosingClass != null &&
-            node.enclosingClass.fileUri != node.fileUri)) {
+        (enclosingClass != null && enclosingClass.fileUri != node.fileUri)) {
       features.add(" from ${node.fileUri} ");
     }
     if (features.isNotEmpty) {
@@ -1163,17 +1183,17 @@
       case ProcedureStubKind.ConcreteForwardingStub:
       case ProcedureStubKind.NoSuchMethodForwarder:
       case ProcedureStubKind.ConcreteMixinStub:
-        writeFunction(node.function, name: getMemberName(node));
+        writeFunction(node.function!, name: getMemberName(node));
         break;
       case ProcedureStubKind.MemberSignature:
       case ProcedureStubKind.AbstractMixinStub:
-        writeFunction(node.function,
+        writeFunction(node.function!,
             name: getMemberName(node), terminateLine: false);
-        if (node.function.body is ReturnStatement) {
+        if (node.function!.body is ReturnStatement) {
           writeSymbol(';');
         }
         writeSymbol(' -> ');
-        writeMemberReferenceFromReference(node.stubTargetReference);
+        writeMemberReferenceFromReference(node.stubTargetReference!);
         endLine();
         break;
     }
@@ -1198,7 +1218,7 @@
     if (features.isNotEmpty) {
       writeWord("/*${features.join(',')}*/");
     }
-    writeFunction(node.function,
+    writeFunction(node.function!,
         name: node.name, initializers: node.initializers);
   }
 
@@ -1210,13 +1230,13 @@
     writeWord('redirecting_factory');
 
     if (node.name != null) {
-      writeName(node.name);
+      writeName(node.name!);
     }
     writeTypeParameterList(node.typeParameters);
     writeParameterList(node.positionalParameters, node.namedParameters,
         node.requiredParameterCount);
     writeSpaced('=');
-    writeMemberReferenceFromReference(node.targetReference);
+    writeMemberReferenceFromReference(node.targetReference!);
     if (node.typeArguments.isNotEmpty) {
       writeSymbol('<');
       writeList(node.typeArguments, writeType);
@@ -1246,12 +1266,12 @@
     writeTypeParameterList(node.typeParameters);
     if (node.isMixinApplication) {
       writeSpaced('=');
-      visitSupertype(node.supertype);
+      visitSupertype(node.supertype!);
       writeSpaced('with');
-      visitSupertype(node.mixedInType);
+      visitSupertype(node.mixedInType!);
     } else if (node.supertype != null) {
       writeSpaced('extends');
-      visitSupertype(node.supertype);
+      visitSupertype(node.supertype!);
     }
     if (node.implementedTypes.isNotEmpty) {
       writeSpaced('implements');
@@ -1297,7 +1317,7 @@
     writeWord(getExtensionName(node));
     writeTypeParameterList(node.typeParameters);
     writeSpaced('on');
-    writeType(node.onType);
+    writeType(node.onType!);
     String endLineString = ' {';
     if (node.enclosingLibrary.fileUri != node.fileUri) {
       endLineString += ' // from ${node.fileUri}';
@@ -1352,18 +1372,20 @@
     writeWord(node.name);
     writeTypeParameterList(node.typeParameters);
     writeSpaced('=');
-    if (node.type is FunctionType) {
-      writeFunctionType(node.type,
+    DartType? type = node.type;
+    if (type is FunctionType) {
+      writeFunctionType(type,
           typedefPositional: node.positionalParameters,
           typedefNamed: node.namedParameters);
     } else {
-      writeNode(node.type);
+      writeNode(type);
     }
     endLine(';');
   }
 
   visitInvalidExpression(InvalidExpression node) {
     writeWord('invalid-expression');
+    // ignore: unnecessary_null_comparison
     if (node.message != null) {
       writeWord('"${escapeString(node.message)}"');
     }
@@ -1415,7 +1437,7 @@
     writeNode(node.arguments);
     if (node.functionType != null) {
       writeSymbol('{');
-      writeType(node.functionType);
+      writeType(node.functionType!);
       writeSymbol('}');
     }
   }
@@ -1530,8 +1552,8 @@
   }
 
   visitLogicalExpression(LogicalExpression node) {
-    int precedence = Precedence
-        .binaryPrecedence[logicalExpressionOperatorToString(node.operatorEnum)];
+    int precedence = Precedence.binaryPrecedence[
+        logicalExpressionOperatorToString(node.operatorEnum)]!;
     writeExpression(node.left, precedence);
     writeSpaced(logicalExpressionOperatorToString(node.operatorEnum));
     writeExpression(node.right, precedence + 1);
@@ -1606,7 +1628,7 @@
       if (!first) {
         writeComma();
       }
-      writeWord('${fieldRef.asField.name.text}');
+      writeWord('${fieldRef.asField.name!.text}');
       writeSymbol(':');
       writeExpression(value);
       first = false;
@@ -1617,9 +1639,10 @@
       }
       write('assert(');
       writeExpression(assert_.condition);
-      if (assert_.message != null) {
+      Expression? message = assert_.message;
+      if (message != null) {
         writeComma();
-        writeExpression(assert_.message);
+        writeExpression(message);
       }
       write(')');
       first = false;
@@ -1692,6 +1715,7 @@
       writeWord('const');
       writeSpace();
     }
+    // ignore: unnecessary_null_comparison
     if (node.typeArgument != null) {
       writeSymbol('<');
       writeType(node.typeArgument);
@@ -1707,6 +1731,7 @@
       writeWord('const');
       writeSpace();
     }
+    // ignore: unnecessary_null_comparison
     if (node.typeArgument != null) {
       writeSymbol('<');
       writeType(node.typeArgument);
@@ -1722,6 +1747,7 @@
       writeWord('const');
       writeSpace();
     }
+    // ignore: unnecessary_null_comparison
     if (node.keyType != null) {
       writeSymbol('<');
       writeList([node.keyType, node.valueType], writeType);
@@ -1791,7 +1817,7 @@
   visitLoadLibrary(LoadLibrary node) {
     writeWord('LoadLibrary');
     writeSymbol('(');
-    writeWord(node.import.name);
+    writeWord(node.import.name!);
     writeSymbol(')');
     state = WORD;
   }
@@ -1799,7 +1825,7 @@
   visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) {
     writeWord('CheckLibraryIsLoaded');
     writeSymbol('(');
-    writeWord(node.import.name);
+    writeWord(node.import.name!);
     writeSymbol(')');
     state = WORD;
   }
@@ -1816,20 +1842,21 @@
     writeIndentation();
     writeWord(node.isImport ? 'import' : 'export');
     String uriString;
-    if (node.importedLibraryReference?.node != null) {
+    if (node.importedLibraryReference.node != null) {
       uriString = '${node.targetLibrary.importUri}';
     } else {
-      uriString = '${node.importedLibraryReference?.canonicalName?.name}';
+      uriString = '${node.importedLibraryReference.canonicalName?.name}';
     }
     writeWord('"$uriString"');
     if (node.isDeferred) {
       writeWord('deferred');
     }
-    if (node.name != null) {
+    String? name = node.name;
+    if (name != null) {
       writeWord('as');
-      writeWord(node.name);
+      writeWord(name);
     }
-    String last;
+    String? last;
     final String show = 'show';
     final String hide = 'hide';
     if (node.combinators.isNotEmpty) {
@@ -1859,9 +1886,10 @@
 
   visitVariableGet(VariableGet node) {
     writeVariableReference(node.variable);
-    if (node.promotedType != null) {
+    DartType? promotedType = node.promotedType;
+    if (promotedType != null) {
       writeSymbol('{');
-      writeNode(node.promotedType);
+      writeNode(promotedType);
       writeSymbol('}');
       state = WORD;
     }
@@ -1873,7 +1901,7 @@
     writeExpression(node.value);
   }
 
-  void writeInterfaceTarget(Name name, Reference target) {
+  void writeInterfaceTarget(Name name, Reference? target) {
     if (target != null) {
       writeSymbol('{');
       writeMemberReferenceFromReference(target);
@@ -1884,6 +1912,7 @@
   }
 
   void writeStaticType(DartType type) {
+    // ignore: unnecessary_null_comparison
     if (type != null) {
       writeSymbol('{');
       writeType(type);
@@ -2024,9 +2053,10 @@
     writeWord('assert');
     writeSymbol('(');
     writeExpression(node.condition);
-    if (node.message != null) {
+    Expression? message = node.message;
+    if (message != null) {
       writeComma();
-      writeExpression(node.message);
+      writeExpression(message);
     }
     if (!asExpression) {
       endLine(');');
@@ -2075,8 +2105,9 @@
     writeSymbol('(');
     writeList(node.variables, writeVariableDeclaration);
     writeComma(';');
-    if (node.condition != null) {
-      writeExpression(node.condition);
+    Expression? condition = node.condition;
+    if (condition != null) {
+      writeExpression(condition);
     }
     writeComma(';');
     writeList(node.updates, writeExpression);
@@ -2146,19 +2177,21 @@
     writeExpression(node.condition);
     writeSymbol(')');
     writeBody(node.then);
-    if (node.otherwise != null) {
+    Statement? otherwise = node.otherwise;
+    if (otherwise != null) {
       writeIndentation();
       writeWord('else');
-      writeBody(node.otherwise);
+      writeBody(otherwise);
     }
   }
 
   visitReturnStatement(ReturnStatement node) {
     writeIndentation();
     writeWord('return');
-    if (node.expression != null) {
+    Expression? expression = node.expression;
+    if (expression != null) {
       writeSpace();
-      writeExpression(node.expression);
+      writeExpression(expression);
     }
     endLine(';');
   }
@@ -2172,6 +2205,7 @@
 
   visitCatch(Catch node) {
     writeIndentation();
+    // ignore: unnecessary_null_comparison
     if (node.guard != null) {
       writeWord('on');
       writeType(node.guard);
@@ -2179,14 +2213,16 @@
     }
     writeWord('catch');
     writeSymbol('(');
-    if (node.exception != null) {
-      writeVariableDeclaration(node.exception);
+    VariableDeclaration? exception = node.exception;
+    if (exception != null) {
+      writeVariableDeclaration(exception);
     } else {
       writeWord('no-exception-var');
     }
-    if (node.stackTrace != null) {
+    VariableDeclaration? stackTrace = node.stackTrace;
+    if (stackTrace != null) {
       writeComma();
-      writeVariableDeclaration(node.stackTrace);
+      writeVariableDeclaration(stackTrace);
     }
     writeSymbol(')');
     writeBody(node.body);
@@ -2225,7 +2261,7 @@
     writeIndentation();
     writeWord('function');
     if (node.function != null) {
-      writeFunction(node.function, name: getVariableName(node.variable));
+      writeFunction(node.function!, name: getVariableName(node.variable));
     } else {
       writeWord(getVariableName(node.variable));
       endLine('...;');
@@ -2244,16 +2280,19 @@
     writeModifier(node.isGenericCovariantImpl, 'generic-covariant-impl');
     writeModifier(node.isFinal, 'final');
     writeModifier(node.isConst, 'const');
+    // ignore: unnecessary_null_comparison
     if (node.type != null) {
       writeAnnotatedType(node.type, annotator?.annotateVariable(this, node));
     }
+    // ignore: unnecessary_null_comparison
     if (useVarKeyword && !node.isFinal && !node.isConst && node.type == null) {
       writeWord('var');
     }
     writeWord(getVariableName(node));
-    if (node.initializer != null) {
+    Expression? initializer = node.initializer;
+    if (initializer != null) {
       writeSpaced('=');
-      writeExpression(node.initializer);
+      writeExpression(initializer);
     }
   }
 
@@ -2407,14 +2446,15 @@
   visitTypeParameterType(TypeParameterType node) {
     writeTypeParameterReference(node.parameter);
     writeNullability(node.declaredNullability);
-    if (node.promotedBound != null) {
+    DartType? promotedBound = node.promotedBound;
+    if (promotedBound != null) {
       writeSpaced('&');
-      writeType(node.promotedBound);
+      writeType(promotedBound);
 
       writeWord("/* '");
       writeNullability(node.declaredNullability, inComment: true);
       writeWord("' & '");
-      writeDartTypeNullability(node.promotedBound, inComment: true);
+      writeDartTypeNullability(promotedBound, inComment: true);
       writeWord("' = '");
       writeNullability(node.nullability, inComment: true);
       writeWord("' */");
@@ -2434,10 +2474,10 @@
     }
     writeWord(getTypeParameterName(node));
     writeSpaced('extends');
-    writeType(node.bound);
+    writeType(node.bound!);
     if (node.defaultType != null) {
       writeSpaced('=');
-      writeType(node.defaultType);
+      writeType(node.defaultType!);
     }
   }
 
@@ -2488,6 +2528,7 @@
     writeIndentation();
     writeConstantReference(node);
     writeSpaced('=');
+    // ignore: unnecessary_null_comparison
     String text = node.libraryReference != null
         ? '#${node.libraryReference.asLibrary.importUri}::${node.name}'
         : '#${node.name}';
@@ -2556,9 +2597,9 @@
     writeList(node.fieldValues.entries,
         (core.MapEntry<Reference, Constant> entry) {
       if (entry.key.node != null) {
-        writeWord('${entry.key.asField.name.text}');
+        writeWord('${entry.key.asField.name!.text}');
       } else {
-        writeWord('${entry.key.canonicalName.name}');
+        writeWord('${entry.key.canonicalName!.name}');
       }
       writeSymbol(':');
       writeConstantReference(entry.value);
@@ -2636,7 +2677,7 @@
   static const int PRIMARY = 20;
   static const int CALLEE = 21;
 
-  static const Map<String, int> binaryPrecedence = const {
+  static const Map<String?, int> binaryPrecedence = const {
     '&&': LOGICAL_AND,
     '||': LOGICAL_OR,
     '??': LOGICAL_NULL_AWARE,
@@ -2708,7 +2749,7 @@
 
   @override
   int visitLogicalExpression(LogicalExpression node) =>
-      binaryPrecedence[logicalExpressionOperatorToString(node.operatorEnum)];
+      binaryPrecedence[logicalExpressionOperatorToString(node.operatorEnum)]!;
 
   @override
   int visitConditionalExpression(ConditionalExpression node) => CONDITIONAL;
@@ -2862,5 +2903,4 @@
     case ProcedureKind.Factory:
       return 'factory';
   }
-  throw 'illegal ProcedureKind: $kind';
 }
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index 3ababf6..38582df 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -1089,10 +1089,15 @@
 }
 
 TextSerializer<AssertStatement> assertStatementSerializer =
-    Wrapped<Tuple2<Expression, Expression>, AssertStatement>(
-        (a) => Tuple2(a.condition, a.message),
-        (t) => AssertStatement(t.first, message: t.second),
-        Tuple2Serializer(expressionSerializer, Optional(expressionSerializer)));
+    Wrapped<Tuple4<Expression, Expression, int, int>, AssertStatement>(
+        (a) => Tuple4(a.condition, a.message, a.conditionStartOffset,
+            a.conditionEndOffset),
+        (t) => AssertStatement(t.first,
+            message: t.second,
+            conditionStartOffset: t.third,
+            conditionEndOffset: t.fourth),
+        Tuple4Serializer(expressionSerializer, Optional(expressionSerializer),
+            const DartInt(), const DartInt()));
 
 TextSerializer<Block> blockSerializer =
     Wrapped<Tuple2<List<Statement>, Expression>, Block>(
@@ -2102,11 +2107,9 @@
     Wrapped<Tuple4<Name, ExtensionMemberKind, int, CanonicalName>,
             ExtensionMemberDescriptor>(
         (w) => Tuple4(w.name, w.kind, w.flags, w.member.canonicalName),
-        (u) => ExtensionMemberDescriptor()
-          ..name = u.first
-          ..kind = u.second
-          ..flags = u.third
-          ..member = u.fourth.getReference(),
+        (u) => ExtensionMemberDescriptor(
+            name: u.first, kind: u.second, member: u.fourth.getReference())
+          ..flags = u.third,
         Tuple4Serializer(
             nameSerializer,
             extensionMemberKindSerializer,
diff --git a/pkg/kernel/lib/transformations/async.dart b/pkg/kernel/lib/transformations/async.dart
index e8ac7ba..736c9cf 100644
--- a/pkg/kernel/lib/transformations/async.dart
+++ b/pkg/kernel/lib/transformations/async.dart
@@ -177,7 +177,7 @@
   // Transform an expression given an action to transform the children.  For
   // this purposes of the await transformer the children should generally be
   // translated from right to left, in the reverse of evaluation order.
-  Expression transform(Expression expr, void action()) {
+  Expression transformTreeNode(Expression expr, void action()) {
     var shouldName = seenAwait;
 
     // 1. If there is an await in a sibling to the right, emit an assignment to
@@ -208,7 +208,7 @@
 
   // Unary expressions.
   Expression unary(Expression expr) {
-    return transform(expr, () {
+    return transformTreeNode(expr, () {
       expr.transformChildren(this);
     });
   }
@@ -223,7 +223,7 @@
   TreeNode visitThrow(Throw expr) => unary(expr);
 
   TreeNode visitPropertySet(PropertySet expr) {
-    return transform(expr, () {
+    return transformTreeNode(expr, () {
       expr.value = expr.value.accept<TreeNode>(this)..parent = expr;
       expr.receiver = expr.receiver.accept<TreeNode>(this)..parent = expr;
     });
@@ -243,32 +243,32 @@
   }
 
   TreeNode visitMethodInvocation(MethodInvocation expr) {
-    return transform(expr, () {
+    return transformTreeNode(expr, () {
       visitArguments(expr.arguments);
       expr.receiver = expr.receiver.accept<TreeNode>(this)..parent = expr;
     });
   }
 
   TreeNode visitSuperMethodInvocation(SuperMethodInvocation expr) {
-    return transform(expr, () {
+    return transformTreeNode(expr, () {
       visitArguments(expr.arguments);
     });
   }
 
   TreeNode visitStaticInvocation(StaticInvocation expr) {
-    return transform(expr, () {
+    return transformTreeNode(expr, () {
       visitArguments(expr.arguments);
     });
   }
 
   TreeNode visitConstructorInvocation(ConstructorInvocation expr) {
-    return transform(expr, () {
+    return transformTreeNode(expr, () {
       visitArguments(expr.arguments);
     });
   }
 
   TreeNode visitStringConcatenation(StringConcatenation expr) {
-    return transform(expr, () {
+    return transformTreeNode(expr, () {
       var expressions = expr.expressions;
       for (var i = expressions.length - 1; i >= 0; --i) {
         expressions[i] = expressions[i].accept<TreeNode>(this)..parent = expr;
@@ -277,7 +277,7 @@
   }
 
   TreeNode visitListLiteral(ListLiteral expr) {
-    return transform(expr, () {
+    return transformTreeNode(expr, () {
       var expressions = expr.expressions;
       for (var i = expressions.length - 1; i >= 0; --i) {
         expressions[i] = expr.expressions[i].accept<TreeNode>(this)
@@ -287,7 +287,7 @@
   }
 
   TreeNode visitMapLiteral(MapLiteral expr) {
-    return transform(expr, () {
+    return transformTreeNode(expr, () {
       for (var entry in expr.entries.reversed) {
         entry.value = entry.value.accept<TreeNode>(this)..parent = entry;
         entry.key = entry.key.accept<TreeNode>(this)..parent = entry;
@@ -310,7 +310,7 @@
     if (rightStatements.isEmpty) {
       // Easy case: right did not emit any statements.
       seenAwait = shouldName;
-      return transform(expr, () {
+      return transformTreeNode(expr, () {
         expr.left = expr.left.accept<TreeNode>(this)..parent = expr;
         seenAwait = seenAwait || rightAwait;
       });
@@ -391,7 +391,7 @@
     if (thenStatements.isEmpty && otherwiseStatements.isEmpty) {
       // Easy case: neither then nor otherwise emitted any statements.
       seenAwait = shouldName;
-      return transform(expr, () {
+      return transformTreeNode(expr, () {
         expr.condition = expr.condition.accept<TreeNode>(this)..parent = expr;
         seenAwait = seenAwait || thenAwait || otherwiseAwait;
       });
@@ -518,7 +518,7 @@
     } else {
       // The body in `let x = initializer in body` did not contain an await.  We
       // can leave a let expression.
-      return transform(expr, () {
+      return transformTreeNode(expr, () {
         // The body has already been translated.
         expr.body = body..parent = expr;
         variable.initializer = variable.initializer.accept<TreeNode>(this)
@@ -534,7 +534,7 @@
   }
 
   TreeNode visitBlockExpression(BlockExpression expr) {
-    return transform(expr, () {
+    return transformTreeNode(expr, () {
       expr.value = expr.value.accept<TreeNode>(this)..parent = expr;
       List<Statement> body = <Statement>[];
       for (Statement stmt in expr.body.statements.reversed) {
diff --git a/pkg/kernel/lib/transformations/continuation.dart b/pkg/kernel/lib/transformations/continuation.dart
index 0df3e84..24ed26c 100644
--- a/pkg/kernel/lib/transformations/continuation.dart
+++ b/pkg/kernel/lib/transformations/continuation.dart
@@ -296,7 +296,7 @@
     }
 
     ++currentCatchDepth;
-    transformList(node.catches, this, node);
+    transformList(node.catches, node);
     --currentCatchDepth;
     return node;
   }
diff --git a/pkg/kernel/lib/transformations/flags.dart b/pkg/kernel/lib/transformations/flags.dart
index 398afeb..f6d2775 100644
--- a/pkg/kernel/lib/transformations/flags.dart
+++ b/pkg/kernel/lib/transformations/flags.dart
@@ -4,7 +4,6 @@
 
 library kernel.transformations.flags;
 
-// ignore: import_of_legacy_library_into_null_safe
 import '../ast.dart';
 
 /// Flags summarizing the kinds of AST nodes contained in a given member or
diff --git a/pkg/kernel/lib/type_algebra.dart b/pkg/kernel/lib/type_algebra.dart
index 18c4924..0fb8863 100644
--- a/pkg/kernel/lib/type_algebra.dart
+++ b/pkg/kernel/lib/type_algebra.dart
@@ -4,7 +4,6 @@
 
 library kernel.type_algebra;
 
-// ignore: import_of_legacy_library_into_null_safe
 import 'ast.dart';
 import 'core_types.dart';
 import 'src/replacement_visitor.dart';
@@ -41,7 +40,7 @@
     result[parameter] = const DynamicType();
   }
   for (TypeParameter parameter in host.typeParameters) {
-    result[parameter] = substitute(parameter.bound, result);
+    result[parameter] = substitute(parameter.bound!, result);
   }
   return result;
 }
@@ -121,9 +120,9 @@
     TypeParameter typeParameter = typeParameters[i];
     TypeParameter freshTypeParameter = freshParameters[i];
 
-    freshTypeParameter.bound = substitute(typeParameter.bound, map);
+    freshTypeParameter.bound = substitute(typeParameter.bound!, map);
     freshTypeParameter.defaultType = typeParameter.defaultType != null
-        ? substitute(typeParameter.defaultType, map)
+        ? substitute(typeParameter.defaultType!, map)
         : null;
     freshTypeParameter.variance =
         typeParameter.isLegacyCovariant ? null : typeParameter.variance;
@@ -148,7 +147,7 @@
         requiredParameterCount: type.requiredParameterCount,
         typedefType: type.typedefType == null
             ? null
-            : substitute(type.typedefType) as TypedefType);
+            : substitute(type.typedefType!) as TypedefType);
   }
 
   DartType substitute(DartType type) => substitution.substituteType(type);
@@ -250,7 +249,7 @@
       upper[parameter] = const DynamicType();
     }
     for (TypeParameter parameter in class_.typeParameters) {
-      upper[parameter] = substitute(parameter.bound, upper);
+      upper[parameter] = substitute(parameter.bound!, upper);
     }
     return fromUpperAndLowerBounds(upper, {});
   }
@@ -384,9 +383,9 @@
     TypeParameter fresh = new TypeParameter(node.name);
     TypeParameterType typeParameterType = substitution[node] =
         new TypeParameterType.forAlphaRenaming(node, fresh);
-    fresh.bound = visit(node.bound);
+    fresh.bound = visit(node.bound!);
     if (node.defaultType != null) {
-      fresh.defaultType = visit(node.defaultType);
+      fresh.defaultType = visit(node.defaultType!);
     }
     // If the bound was changed from substituting the bound we need to update
     // implicit nullability to be based on the new bound. If the bound wasn't
@@ -561,7 +560,7 @@
     DartType returnType = inner.visit(node.returnType);
     TypedefType? typedefType = node.typedefType == null
         ? null
-        : inner.visit(node.typedefType) as TypedefType;
+        : inner.visit(node.typedefType!) as TypedefType;
     if (this.useCounter == before) return node;
     return new FunctionType(positionalParameters, returnType, node.nullability,
         namedParameters: namedParameters,
@@ -699,9 +698,9 @@
 
   bool handleTypeParameter(TypeParameter node) {
     assert(!variables.contains(node));
-    if (node.bound.accept(this)) return true;
+    if (node.bound!.accept(this)) return true;
     if (node.defaultType == null) return false;
-    return node.defaultType.accept(this);
+    return node.defaultType!.accept(this);
   }
 }
 
@@ -755,9 +754,9 @@
 
   bool handleTypeParameter(TypeParameter node) {
     assert(variables.contains(node));
-    if (node.bound.accept(this)) return true;
+    if (node.bound!.accept(this)) return true;
     if (node.defaultType == null) return false;
-    return node.defaultType.accept(this);
+    return node.defaultType!.accept(this);
   }
 }
 
@@ -811,9 +810,9 @@
 
   bool handleTypeParameter(TypeParameter node) {
     assert(variables.contains(node));
-    if (node.bound.accept(this)) return true;
+    if (node.bound!.accept(this)) return true;
     if (node.defaultType == null) return false;
-    return node.defaultType.accept(this);
+    return node.defaultType!.accept(this);
   }
 }
 
@@ -1057,7 +1056,7 @@
     //  - The greatest closure of `S` with respect to `L` is `Function`
     if (node.typeParameters.isNotEmpty) {
       for (TypeParameter typeParameter in node.typeParameters) {
-        if (containsTypeVariable(typeParameter.bound, eliminationTargets,
+        if (containsTypeVariable(typeParameter.bound!, eliminationTargets,
             unhandledTypeHandler: unhandledTypeHandler)) {
           return getFunctionReplacement(variance);
         }
diff --git a/pkg/kernel/lib/type_environment.dart b/pkg/kernel/lib/type_environment.dart
index da45c08..c8789ae 100644
--- a/pkg/kernel/lib/type_environment.dart
+++ b/pkg/kernel/lib/type_environment.dart
@@ -4,7 +4,6 @@
 
 library kernel.type_environment;
 
-// ignore: import_of_legacy_library_into_null_safe
 import 'ast.dart';
 import 'class_hierarchy.dart';
 import 'core_types.dart';
@@ -115,8 +114,7 @@
   DartType _resolveTypeParameterType(DartType type) {
     while (type is TypeParameterType) {
       TypeParameterType typeParameterType = type;
-      type =
-          typeParameterType.promotedBound ?? typeParameterType.parameter.bound;
+      type = typeParameterType.bound;
     }
     return type;
   }
@@ -148,13 +146,13 @@
   bool isSpecialCasedBinaryOperator(Procedure member,
       {bool isNonNullableByDefault: false}) {
     if (isNonNullableByDefault) {
-      Class class_ = member.enclosingClass;
+      Class? class_ = member.enclosingClass;
       // TODO(johnniwinther): Do we need to recognize backend implementation
       //  methods?
       if (class_ == coreTypes.intClass ||
           class_ == coreTypes.numClass ||
           class_ == coreTypes.doubleClass) {
-        String name = member.name.text;
+        String name = member.name!.text;
         return name == '+' ||
             name == '-' ||
             name == '*' ||
@@ -162,9 +160,9 @@
             name == '%';
       }
     } else {
-      Class class_ = member.enclosingClass;
+      Class? class_ = member.enclosingClass;
       if (class_ == coreTypes.intClass || class_ == coreTypes.numClass) {
-        String name = member.name.text;
+        String name = member.name!.text;
         return name == '+' ||
             name == '-' ||
             name == '*' ||
@@ -180,9 +178,9 @@
   bool isSpecialCasedTernaryOperator(Procedure member,
       {bool isNonNullableByDefault: false}) {
     if (isNonNullableByDefault) {
-      Class class_ = member.enclosingClass;
+      Class? class_ = member.enclosingClass;
       if (class_ == coreTypes.intClass || class_ == coreTypes.numClass) {
-        String name = member.name.text;
+        String name = member.name!.text;
         return name == 'clamp';
       }
     }
@@ -751,7 +749,7 @@
         "No member currently associated with StaticTypeContext.");
     return _currentMember?.enclosingClass?.getThisType(
         typeEnvironment.coreTypes,
-        _currentMember?.enclosingLibrary.nonNullable);
+        _currentMember!.enclosingLibrary.nonNullable);
   }
 
   @override
diff --git a/pkg/kernel/lib/visitor.dart b/pkg/kernel/lib/visitor.dart
index 93a7b3a..13e7f14 100644
--- a/pkg/kernel/lib/visitor.dart
+++ b/pkg/kernel/lib/visitor.dart
@@ -4,10 +4,8 @@
 
 library kernel.ast.visitor;
 
-import 'dart:core' hide MapEntry;
 import 'dart:collection';
 
-// ignore: import_of_legacy_library_into_null_safe
 import 'ast.dart';
 
 abstract class ExpressionVisitor<R> {
@@ -127,6 +125,20 @@
   }
 }
 
+abstract class MemberVisitor1<R, A> {
+  const MemberVisitor1();
+
+  R defaultMember(Member node, A arg);
+
+  R visitConstructor(Constructor node, A arg) => defaultMember(node, arg);
+  R visitProcedure(Procedure node, A arg) => defaultMember(node, arg);
+  R visitField(Field node, A arg) => defaultMember(node, arg);
+  R visitRedirectingFactoryConstructor(
+      RedirectingFactoryConstructor node, A arg) {
+    return defaultMember(node, arg);
+  }
+}
+
 abstract class InitializerVisitor<R> {
   const InitializerVisitor();
 
@@ -142,6 +154,25 @@
   R visitAssertInitializer(AssertInitializer node) => defaultInitializer(node);
 }
 
+abstract class InitializerVisitor1<R, A> {
+  const InitializerVisitor1();
+
+  R defaultInitializer(Initializer node, A arg);
+
+  R visitInvalidInitializer(InvalidInitializer node, A arg) =>
+      defaultInitializer(node, arg);
+  R visitFieldInitializer(FieldInitializer node, A arg) =>
+      defaultInitializer(node, arg);
+  R visitSuperInitializer(SuperInitializer node, A arg) =>
+      defaultInitializer(node, arg);
+  R visitRedirectingInitializer(RedirectingInitializer node, A arg) =>
+      defaultInitializer(node, arg);
+  R visitLocalInitializer(LocalInitializer node, A arg) =>
+      defaultInitializer(node, arg);
+  R visitAssertInitializer(AssertInitializer node, A arg) =>
+      defaultInitializer(node, arg);
+}
+
 abstract class TreeVisitor<R>
     implements
         ExpressionVisitor<R>,
@@ -288,6 +319,195 @@
   R visitComponent(Component node) => defaultTreeNode(node);
 }
 
+abstract class TreeVisitor1<R, A>
+    implements
+        ExpressionVisitor1<R, A>,
+        StatementVisitor1<R, A>,
+        MemberVisitor1<R, A>,
+        InitializerVisitor1<R, A> {
+  const TreeVisitor1();
+
+  R defaultTreeNode(TreeNode node, A arg);
+
+  // Expressions
+  R defaultExpression(Expression node, A arg) => defaultTreeNode(node, arg);
+  R defaultBasicLiteral(BasicLiteral node, A arg) =>
+      defaultExpression(node, arg);
+  R visitInvalidExpression(InvalidExpression node, A arg) =>
+      defaultExpression(node, arg);
+  R visitVariableGet(VariableGet node, A arg) => defaultExpression(node, arg);
+  R visitVariableSet(VariableSet node, A arg) => defaultExpression(node, arg);
+  R visitDynamicGet(DynamicGet node, A arg) => defaultExpression(node, arg);
+  R visitDynamicSet(DynamicSet node, A arg) => defaultExpression(node, arg);
+  R visitFunctionTearOff(FunctionTearOff node, A arg) =>
+      defaultExpression(node, arg);
+  R visitInstanceGet(InstanceGet node, A arg) => defaultExpression(node, arg);
+  R visitInstanceSet(InstanceSet node, A arg) => defaultExpression(node, arg);
+  R visitInstanceTearOff(InstanceTearOff node, A arg) =>
+      defaultExpression(node, arg);
+  R visitPropertyGet(PropertyGet node, A arg) => defaultExpression(node, arg);
+  R visitPropertySet(PropertySet node, A arg) => defaultExpression(node, arg);
+  R visitSuperPropertyGet(SuperPropertyGet node, A arg) =>
+      defaultExpression(node, arg);
+  R visitSuperPropertySet(SuperPropertySet node, A arg) =>
+      defaultExpression(node, arg);
+  R visitStaticGet(StaticGet node, A arg) => defaultExpression(node, arg);
+  R visitStaticSet(StaticSet node, A arg) => defaultExpression(node, arg);
+  R visitStaticTearOff(StaticTearOff node, A arg) =>
+      defaultExpression(node, arg);
+  R visitLocalFunctionInvocation(LocalFunctionInvocation node, A arg) =>
+      defaultExpression(node, arg);
+  R visitDynamicInvocation(DynamicInvocation node, A arg) =>
+      defaultExpression(node, arg);
+  R visitFunctionInvocation(FunctionInvocation node, A arg) =>
+      defaultExpression(node, arg);
+  R visitInstanceInvocation(InstanceInvocation node, A arg) =>
+      defaultExpression(node, arg);
+  R visitEqualsNull(EqualsNull node, A arg) => defaultExpression(node, arg);
+  R visitEqualsCall(EqualsCall node, A arg) => defaultExpression(node, arg);
+  R visitMethodInvocation(MethodInvocation node, A arg) =>
+      defaultExpression(node, arg);
+  R visitSuperMethodInvocation(SuperMethodInvocation node, A arg) =>
+      defaultExpression(node, arg);
+  R visitStaticInvocation(StaticInvocation node, A arg) =>
+      defaultExpression(node, arg);
+  R visitConstructorInvocation(ConstructorInvocation node, A arg) =>
+      defaultExpression(node, arg);
+  R visitNot(Not node, A arg) => defaultExpression(node, arg);
+  R visitNullCheck(NullCheck node, A arg) => defaultExpression(node, arg);
+  R visitLogicalExpression(LogicalExpression node, A arg) =>
+      defaultExpression(node, arg);
+  R visitConditionalExpression(ConditionalExpression node, A arg) =>
+      defaultExpression(node, arg);
+  R visitStringConcatenation(StringConcatenation node, A arg) =>
+      defaultExpression(node, arg);
+  R visitListConcatenation(ListConcatenation node, A arg) =>
+      defaultExpression(node, arg);
+  R visitSetConcatenation(SetConcatenation node, A arg) =>
+      defaultExpression(node, arg);
+  R visitMapConcatenation(MapConcatenation node, A arg) =>
+      defaultExpression(node, arg);
+  R visitInstanceCreation(InstanceCreation node, A arg) =>
+      defaultExpression(node, arg);
+  R visitFileUriExpression(FileUriExpression node, A arg) =>
+      defaultExpression(node, arg);
+  R visitIsExpression(IsExpression node, A arg) => defaultExpression(node, arg);
+  R visitAsExpression(AsExpression node, A arg) => defaultExpression(node, arg);
+  R visitSymbolLiteral(SymbolLiteral node, A arg) =>
+      defaultExpression(node, arg);
+  R visitTypeLiteral(TypeLiteral node, A arg) => defaultExpression(node, arg);
+  R visitThisExpression(ThisExpression node, A arg) =>
+      defaultExpression(node, arg);
+  R visitRethrow(Rethrow node, A arg) => defaultExpression(node, arg);
+  R visitThrow(Throw node, A arg) => defaultExpression(node, arg);
+  R visitListLiteral(ListLiteral node, A arg) => defaultExpression(node, arg);
+  R visitSetLiteral(SetLiteral node, A arg) => defaultExpression(node, arg);
+  R visitMapLiteral(MapLiteral node, A arg) => defaultExpression(node, arg);
+  R visitAwaitExpression(AwaitExpression node, A arg) =>
+      defaultExpression(node, arg);
+  R visitFunctionExpression(FunctionExpression node, A arg) =>
+      defaultExpression(node, arg);
+  R visitConstantExpression(ConstantExpression node, A arg) =>
+      defaultExpression(node, arg);
+  R visitStringLiteral(StringLiteral node, A arg) =>
+      defaultBasicLiteral(node, arg);
+  R visitIntLiteral(IntLiteral node, A arg) => defaultBasicLiteral(node, arg);
+  R visitDoubleLiteral(DoubleLiteral node, A arg) =>
+      defaultBasicLiteral(node, arg);
+  R visitBoolLiteral(BoolLiteral node, A arg) => defaultBasicLiteral(node, arg);
+  R visitNullLiteral(NullLiteral node, A arg) => defaultBasicLiteral(node, arg);
+  R visitLet(Let node, A arg) => defaultExpression(node, arg);
+  R visitBlockExpression(BlockExpression node, A arg) =>
+      defaultExpression(node, arg);
+  R visitInstantiation(Instantiation node, A arg) =>
+      defaultExpression(node, arg);
+  R visitLoadLibrary(LoadLibrary node, A arg) => defaultExpression(node, arg);
+  R visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node, A arg) =>
+      defaultExpression(node, arg);
+
+  // Statements
+  R defaultStatement(Statement node, A arg) => defaultTreeNode(node, arg);
+  R visitExpressionStatement(ExpressionStatement node, A arg) =>
+      defaultStatement(node, arg);
+  R visitBlock(Block node, A arg) => defaultStatement(node, arg);
+  R visitAssertBlock(AssertBlock node, A arg) => defaultStatement(node, arg);
+  R visitEmptyStatement(EmptyStatement node, A arg) =>
+      defaultStatement(node, arg);
+  R visitAssertStatement(AssertStatement node, A arg) =>
+      defaultStatement(node, arg);
+  R visitLabeledStatement(LabeledStatement node, A arg) =>
+      defaultStatement(node, arg);
+  R visitBreakStatement(BreakStatement node, A arg) =>
+      defaultStatement(node, arg);
+  R visitWhileStatement(WhileStatement node, A arg) =>
+      defaultStatement(node, arg);
+  R visitDoStatement(DoStatement node, A arg) => defaultStatement(node, arg);
+  R visitForStatement(ForStatement node, A arg) => defaultStatement(node, arg);
+  R visitForInStatement(ForInStatement node, A arg) =>
+      defaultStatement(node, arg);
+  R visitSwitchStatement(SwitchStatement node, A arg) =>
+      defaultStatement(node, arg);
+  R visitContinueSwitchStatement(ContinueSwitchStatement node, A arg) =>
+      defaultStatement(node, arg);
+  R visitIfStatement(IfStatement node, A arg) => defaultStatement(node, arg);
+  R visitReturnStatement(ReturnStatement node, A arg) =>
+      defaultStatement(node, arg);
+  R visitTryCatch(TryCatch node, A arg) => defaultStatement(node, arg);
+  R visitTryFinally(TryFinally node, A arg) => defaultStatement(node, arg);
+  R visitYieldStatement(YieldStatement node, A arg) =>
+      defaultStatement(node, arg);
+  R visitVariableDeclaration(VariableDeclaration node, A arg) =>
+      defaultStatement(node, arg);
+  R visitFunctionDeclaration(FunctionDeclaration node, A arg) =>
+      defaultStatement(node, arg);
+
+  // Members
+  R defaultMember(Member node, A arg) => defaultTreeNode(node, arg);
+  R visitConstructor(Constructor node, A arg) => defaultMember(node, arg);
+  R visitProcedure(Procedure node, A arg) => defaultMember(node, arg);
+  R visitField(Field node, A arg) => defaultMember(node, arg);
+  R visitRedirectingFactoryConstructor(
+      RedirectingFactoryConstructor node, A arg) {
+    return defaultMember(node, arg);
+  }
+
+  // Classes
+  R visitClass(Class node, A arg) => defaultTreeNode(node, arg);
+  R visitExtension(Extension node, A arg) => defaultTreeNode(node, arg);
+
+  // Initializers
+  R defaultInitializer(Initializer node, A arg) => defaultTreeNode(node, arg);
+  R visitInvalidInitializer(InvalidInitializer node, A arg) =>
+      defaultInitializer(node, arg);
+  R visitFieldInitializer(FieldInitializer node, A arg) =>
+      defaultInitializer(node, arg);
+  R visitSuperInitializer(SuperInitializer node, A arg) =>
+      defaultInitializer(node, arg);
+  R visitRedirectingInitializer(RedirectingInitializer node, A arg) =>
+      defaultInitializer(node, arg);
+  R visitLocalInitializer(LocalInitializer node, A arg) =>
+      defaultInitializer(node, arg);
+  R visitAssertInitializer(AssertInitializer node, A arg) =>
+      defaultInitializer(node, arg);
+
+  // Other tree nodes
+  R visitLibrary(Library node, A arg) => defaultTreeNode(node, arg);
+  R visitLibraryDependency(LibraryDependency node, A arg) =>
+      defaultTreeNode(node, arg);
+  R visitCombinator(Combinator node, A arg) => defaultTreeNode(node, arg);
+  R visitLibraryPart(LibraryPart node, A arg) => defaultTreeNode(node, arg);
+  R visitTypedef(Typedef node, A arg) => defaultTreeNode(node, arg);
+  R visitTypeParameter(TypeParameter node, A arg) => defaultTreeNode(node, arg);
+  R visitFunctionNode(FunctionNode node, A arg) => defaultTreeNode(node, arg);
+  R visitArguments(Arguments node, A arg) => defaultTreeNode(node, arg);
+  R visitNamedExpression(NamedExpression node, A arg) =>
+      defaultTreeNode(node, arg);
+  R visitSwitchCase(SwitchCase node, A arg) => defaultTreeNode(node, arg);
+  R visitCatch(Catch node, A arg) => defaultTreeNode(node, arg);
+  R visitMapEntry(MapEntry node, A arg) => defaultTreeNode(node, arg);
+  R visitComponent(Component node, A arg) => defaultTreeNode(node, arg);
+}
+
 abstract class DartTypeVisitor<R> {
   const DartTypeVisitor();
 
@@ -776,6 +996,54 @@
 class Transformer extends TreeVisitor<TreeNode> {
   const Transformer();
 
+  T transform<T extends TreeNode>(T node) {
+    T result = node.accept<TreeNode>(this) as T;
+    assert(
+        // ignore: unnecessary_null_comparison
+        result != null,
+        'Attempting to remove ${node} (${node.runtimeType}) '
+        'in transformer.');
+    return result;
+  }
+
+  void transformDartTypeList(List<DartType> nodes) {
+    for (int i = 0; i < nodes.length; ++i) {
+      DartType result = visitDartType(nodes[i]);
+      assert(
+          // ignore: unnecessary_null_comparison
+          result != null,
+          'Attempting to remove ${nodes[i]} (${nodes[i].runtimeType}) '
+          'in transformer.');
+      nodes[i] = result;
+    }
+  }
+
+  void transformSupertypeList(List<Supertype> nodes) {
+    for (int i = 0; i < nodes.length; ++i) {
+      Supertype result = visitSupertype(nodes[i]);
+      assert(
+          // ignore: unnecessary_null_comparison
+          result != null,
+          'Attempting to remove ${nodes[i]} (${nodes[i].runtimeType}) '
+          'in transformer.');
+      nodes[i] = result;
+    }
+  }
+
+  void transformList<T extends TreeNode>(List<T> nodes, TreeNode parent) {
+    for (int i = 0; i < nodes.length; ++i) {
+      T result = transform(nodes[i]);
+      assert(
+          // ignore: unnecessary_null_comparison
+          result != null,
+          'Attempting to remove ${nodes[i]} (${nodes[i].runtimeType}) '
+          'in transformer.');
+      // ignore: invalid_null_aware_operator
+      result.parent = parent;
+      nodes[i] = result;
+    }
+  }
+
   /// Replaces a use of a type.
   ///
   /// By default, recursion stops at this point.
@@ -791,6 +1059,362 @@
   }
 }
 
+/// Transformer that recursively rewrites each node in tree and supports removal
+/// of nodes.
+///
+/// Visit methods should return a new node, the visited node (possibly
+/// mutated), any node from the visited node's subtree, or the provided
+/// removal sentinel, if non-null.
+///
+/// To support removal of nodes during traversal, while enforcing nullability
+/// invariants, this visitor takes an argument, the removal sentinel. If a
+/// node is visited in a context where it can be removed, for instance in a
+/// list or as an optional child of its parent, a non-null sentinel value is
+/// provided, and this value can be returned to signal to the caller that the
+/// visited node should be removed. If the sentinel value is `null`, the node
+/// cannot be removed from its context, in which case the node itself or a new
+/// non-null node must be returned, possibly a sentinel value specific to the
+/// particular visitor.
+///
+/// For instance
+///
+///     class AssertRemover extends RemovingTransformer {
+///        @override
+///        TreeNode visitAssertStatement(
+///            AssertStatement node,
+///            TreeNode? removalSentinel) {
+///          return removalSentinel ?? new EmptyStatement();
+///        }
+///
+///        @override
+///        TreeNode visitIfStatement(
+///            IfStatement node,
+///            TreeNode? removalSentinel) {
+///          node.transformOrRemoveChildren(this);
+///          if (node.then is EmptyStatement) {
+///            if (node.otherwise != null) {
+///              return new IfStatement(
+///                  new Not(node.condition), node.otherwise);
+///            } else {
+///              return removalSentinel ?? new EmptyStatement();
+///            }
+///          }
+///          return node;
+///        }
+///     }
+///
+/// Each subclass is responsible for ensuring that the AST remains a tree.
+///
+/// For example, the following transformer replaces every occurrence of
+/// `!(x && y)` with `(!x || !y)`:
+///
+///     class NegationSinker extends RemovingTransformer {
+///       @override
+///       Node visitNot(Not node) {
+///         var operand = node.operand.accept(this); // Remember to visit.
+///         if (operand is LogicalExpression && operand.operator == '&&') {
+///           return new LogicalExpression(
+///             new Not(operand.left),
+///             '||',
+///             new Not(operand.right));
+///         }
+///         return node;
+///       }
+///     }
+///
+class RemovingTransformer extends TreeVisitor1<TreeNode, TreeNode?> {
+  const RemovingTransformer();
+
+  /// Visits [node], returning the transformation result.
+  ///
+  /// The transformation cannot result in `null`.
+  T transform<T extends TreeNode>(T node) {
+    return node.accept1<TreeNode, TreeNode?>(this, cannotRemoveSentinel) as T;
+  }
+
+  /// Visits [node], returning the transformation result. Removal of [node] is
+  /// supported with `null` as the result.
+  ///
+  /// This is convenience method for calling [transformOrRemove] with removal
+  /// sentinel for [Expression] nodes.
+  Expression? transformOrRemoveExpression(Expression node) {
+    return transformOrRemove(node, dummyExpression);
+  }
+
+  /// Visits [node], returning the transformation result. Removal of [node] is
+  /// supported with `null` as the result.
+  ///
+  /// This is convenience method for calling [transformOrRemove] with removal
+  /// sentinel for [Statement] nodes.
+  Statement? transformOrRemoveStatement(Statement node) {
+    return transformOrRemove(node, dummyStatement);
+  }
+
+  /// Visits [node], returning the transformation result. Removal of [node] is
+  /// supported with `null` as the result.
+  ///
+  /// This is convenience method for calling [transformOrRemove] with removal
+  /// sentinel for [VariableDeclaration] nodes.
+  VariableDeclaration? transformOrRemoveVariableDeclaration(
+      VariableDeclaration node) {
+    return transformOrRemove(node, dummyVariableDeclaration);
+  }
+
+  /// Visits [node] using [removalSentinel] as the removal sentinel.
+  ///
+  /// If [removalSentinel] is the result of visiting [node], `null` is returned.
+  /// Otherwise the result is returned.
+  T? transformOrRemove<T extends TreeNode>(T node, T? removalSentinel) {
+    T result = node.accept1<TreeNode, TreeNode?>(this, removalSentinel) as T;
+    if (identical(result, removalSentinel)) {
+      return null;
+    } else {
+      return result;
+    }
+  }
+
+  /// Transforms or removes [DartType] nodes in [nodes].
+  void transformDartTypeList(List<DartType> nodes) {
+    int storeIndex = 0;
+    for (int i = 0; i < nodes.length; ++i) {
+      DartType result = visitDartType(nodes[i], dummyDartType);
+      if (!identical(result, dummyDartType)) {
+        nodes[storeIndex] = result;
+        ++storeIndex;
+      }
+    }
+    if (storeIndex < nodes.length) {
+      nodes.length = storeIndex;
+    }
+  }
+
+  /// Transforms or removes [Supertype] nodes in [nodes].
+  void transformSupertypeList(List<Supertype> nodes) {
+    int storeIndex = 0;
+    for (int i = 0; i < nodes.length; ++i) {
+      Supertype result = visitSupertype(nodes[i], dummySupertype);
+      if (!identical(result, dummySupertype)) {
+        nodes[storeIndex] = result;
+        ++storeIndex;
+      }
+    }
+    if (storeIndex < nodes.length) {
+      nodes.length = storeIndex;
+    }
+  }
+
+  /// Transforms or removes [Library] nodes in [nodes] as children of [parent].
+  ///
+  /// This is convenience method for calling [transformList] with removal
+  /// sentinel for [Library] nodes.
+  void transformLibraryList(List<Library> nodes, TreeNode parent) {
+    transformList(nodes, parent, dummyLibrary);
+  }
+
+  /// Transforms or removes [LibraryDependency] nodes in [nodes] as children of
+  /// [parent].
+  ///
+  /// This is convenience method for calling [transformList] with removal
+  /// sentinel for [LibraryDependency] nodes.
+  void transformLibraryDependencyList(
+      List<LibraryDependency> nodes, TreeNode parent) {
+    transformList(nodes, parent, dummyLibraryDependency);
+  }
+
+  /// Transforms or removes [Combinator] nodes in [nodes] as children of
+  /// [parent].
+  ///
+  /// This is convenience method for calling [transformList] with removal
+  /// sentinel for [Combinator] nodes.
+  void transformCombinatorList(List<Combinator> nodes, TreeNode parent) {
+    transformList(nodes, parent, dummyCombinator);
+  }
+
+  /// Transforms or removes [LibraryPart] nodes in [nodes] as children of
+  /// [parent].
+  ///
+  /// This is convenience method for calling [transformList] with removal
+  /// sentinel for [LibraryPart] nodes.
+  void transformLibraryPartList(List<LibraryPart> nodes, TreeNode parent) {
+    transformList(nodes, parent, dummyLibraryPart);
+  }
+
+  /// Transforms or removes [Class] nodes in [nodes] as children of [parent].
+  ///
+  /// This is convenience method for calling [transformList] with removal
+  /// sentinel for [Class] nodes.
+  void transformClassList(List<Class> nodes, TreeNode parent) {
+    transformList(nodes, parent, dummyClass);
+  }
+
+  /// Transforms or removes [Extension] nodes in [nodes] as children of
+  /// [parent].
+  ///
+  /// This is convenience method for calling [transformList] with removal
+  /// sentinel for [Extension] nodes.
+  void transformExtensionList(List<Extension> nodes, TreeNode parent) {
+    transformList(nodes, parent, dummyExtension);
+  }
+
+  /// Transforms or removes [Constructor] nodes in [nodes] as children of
+  /// [parent].
+  ///
+  /// This is convenience method for calling [transformList] with removal
+  /// sentinel for [Constructor] nodes.
+  void transformConstructorList(List<Constructor> nodes, TreeNode parent) {
+    transformList(nodes, parent, dummyConstructor);
+  }
+
+  /// Transforms or removes [Procedure] nodes in [nodes] as children of
+  /// [parent].
+  ///
+  /// This is convenience method for calling [transformList] with removal
+  /// sentinel for [Procedure] nodes.
+  void transformProcedureList(List<Procedure> nodes, TreeNode parent) {
+    transformList(nodes, parent, dummyProcedure);
+  }
+
+  /// Transforms or removes [Field] nodes in [nodes] as children of [parent].
+  ///
+  /// This is convenience method for calling [transformList] with removal
+  /// sentinel for [Field] nodes.
+  void transformFieldList(List<Field> nodes, TreeNode parent) {
+    transformList(nodes, parent, dummyField);
+  }
+
+  /// Transforms or removes [RedirectingFactoryConstructor] nodes in [nodes] as
+  /// children of [parent].
+  ///
+  /// This is convenience method for calling [transformList] with removal
+  /// sentinel for [RedirectingFactoryConstructor] nodes.
+  void transformRedirectingFactoryConstructorList(
+      List<RedirectingFactoryConstructor> nodes, TreeNode parent) {
+    transformList(nodes, parent, dummyRedirectingFactoryConstructor);
+  }
+
+  /// Transforms or removes [Typedef] nodes in [nodes] as children of [parent].
+  ///
+  /// This is convenience method for calling [transformList] with removal
+  /// sentinel for [Typedef] nodes.
+  void transformTypedefList(List<Typedef> nodes, TreeNode parent) {
+    transformList(nodes, parent, dummyTypedef);
+  }
+
+  /// Transforms or removes [Initializer] nodes in [nodes] as children of
+  /// [parent].
+  ///
+  /// This is convenience method for calling [transformList] with removal
+  /// sentinel for [Initializer] nodes.
+  void transformInitializerList(List<Initializer> nodes, TreeNode parent) {
+    transformList(nodes, parent, dummyInitializer);
+  }
+
+  /// Transforms or removes [Expression] nodes in [nodes] as children of
+  /// [parent].
+  ///
+  /// This is convenience method for calling [transformList] with removal
+  /// sentinel for [Expression] nodes.
+  void transformExpressionList(List<Expression> nodes, TreeNode parent) {
+    transformList(nodes, parent, dummyExpression);
+  }
+
+  /// Transforms or removes [NamedExpression] nodes in [nodes] as children of
+  /// [parent].
+  ///
+  /// This is convenience method for calling [transformList] with removal
+  /// sentinel for [NamedExpression] nodes.
+  void transformNamedExpressionList(
+      List<NamedExpression> nodes, TreeNode parent) {
+    transformList(nodes, parent, dummyNamedExpression);
+  }
+
+  /// Transforms or removes [MapEntry] nodes in [nodes] as children of [parent].
+  ///
+  /// This is convenience method for calling [transformList] with removal
+  /// sentinel for [MapEntry] nodes.
+  void transformMapEntryList(List<MapEntry> nodes, TreeNode parent) {
+    transformList(nodes, parent, dummyMapEntry);
+  }
+
+  /// Transforms or removes [Statement] nodes in [nodes] as children of
+  /// [parent].
+  ///
+  /// This is convenience method for calling [transformList] with removal
+  /// sentinel for [Statement] nodes.
+  void transformStatementList(List<Statement> nodes, TreeNode parent) {
+    transformList(nodes, parent, dummyStatement);
+  }
+
+  /// Transforms or removes [SwitchCase] nodes in [nodes] as children of
+  /// [parent].
+  ///
+  /// This is convenience method for calling [transformList] with removal
+  /// sentinel for [SwitchCase] nodes.
+  void transformSwitchCaseList(List<SwitchCase> nodes, TreeNode parent) {
+    transformList(nodes, parent, dummySwitchCase);
+  }
+
+  /// Transforms or removes [Catch] nodes in [nodes] as children of [parent].
+  ///
+  /// This is convenience method for calling [transformList] with removal
+  /// sentinel for [Catch] nodes.
+  void transformCatchList(List<Catch> nodes, TreeNode parent) {
+    transformList(nodes, parent, dummyCatch);
+  }
+
+  /// Transforms or removes [TypeParameter] nodes in [nodes] as children of
+  /// [parent].
+  ///
+  /// This is convenience method for calling [transformList] with removal
+  /// sentinel for [TypeParameter] nodes.
+  void transformTypeParameterList(List<TypeParameter> nodes, TreeNode parent) {
+    transformList(nodes, parent, dummyTypeParameter);
+  }
+
+  /// Transforms or removes [VariableDeclaration] nodes in [nodes] as children
+  /// of [parent].
+  ///
+  /// This is convenience method for calling [transformList] with removal
+  /// sentinel for [VariableDeclaration] nodes.
+  void transformVariableDeclarationList(
+      List<VariableDeclaration> nodes, TreeNode parent) {
+    transformList(nodes, parent, dummyVariableDeclaration);
+  }
+
+  /// Transforms or removes [T] nodes in [nodes] as children of [parent] by
+  /// calling [transformOrRemove] using [removalSentinel] as the removal
+  /// sentinel.
+  void transformList<T extends TreeNode>(
+      List<T> nodes, TreeNode parent, T removalSentinel) {
+    int storeIndex = 0;
+    for (int i = 0; i < nodes.length; ++i) {
+      T? result = transformOrRemove(nodes[i], removalSentinel);
+      if (result != null) {
+        nodes[storeIndex] = result;
+        result.parent = parent;
+        ++storeIndex;
+      }
+    }
+    if (storeIndex < nodes.length) {
+      nodes.length = storeIndex;
+    }
+  }
+
+  /// Replaces a use of a type.
+  ///
+  /// By default, recursion stops at this point.
+  DartType visitDartType(DartType node, DartType? removalSentinel) => node;
+
+  Constant visitConstant(Constant node, Constant? removalSentinel) => node;
+
+  Supertype visitSupertype(Supertype node, Supertype? removalSentinel) => node;
+
+  TreeNode defaultTreeNode(TreeNode node, TreeNode? removalSentinel) {
+    node.transformOrRemoveChildren(this);
+    return node;
+  }
+}
+
 abstract class ExpressionVisitor1<R, T> {
   const ExpressionVisitor1();
 
diff --git a/pkg/kernel/test/dart_type_equivalence_test.dart b/pkg/kernel/test/dart_type_equivalence_test.dart
index aeb980e..acf4b96 100644
--- a/pkg/kernel/test/dart_type_equivalence_test.dart
+++ b/pkg/kernel/test/dart_type_equivalence_test.dart
@@ -6,7 +6,7 @@
 
 import "package:expect/expect.dart" show Expect;
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 import 'package:kernel/src/dart_type_equivalence.dart';
 import 'package:kernel/testing/type_parser_environment.dart';
 
diff --git a/pkg/kernel/test/flatten_test.dart b/pkg/kernel/test/flatten_test.dart
index 00c707a..2dd50b8 100644
--- a/pkg/kernel/test/flatten_test.dart
+++ b/pkg/kernel/test/flatten_test.dart
@@ -6,7 +6,7 @@
 
 import "package:expect/expect.dart" show Expect;
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/testing/type_parser_environment.dart';
 import 'package:kernel/type_environment.dart';
diff --git a/pkg/kernel/test/future_value_type_test.dart b/pkg/kernel/test/future_value_type_test.dart
index 5eed73f..f256cfe 100644
--- a/pkg/kernel/test/future_value_type_test.dart
+++ b/pkg/kernel/test/future_value_type_test.dart
@@ -6,7 +6,7 @@
 
 import "package:expect/expect.dart" show Expect;
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 import 'package:kernel/src/future_value_type.dart';
 import 'package:kernel/testing/type_parser_environment.dart';
 
diff --git a/pkg/kernel/test/legacy_erasure_test.dart b/pkg/kernel/test/legacy_erasure_test.dart
index f62eba0..4e14b3b 100644
--- a/pkg/kernel/test/legacy_erasure_test.dart
+++ b/pkg/kernel/test/legacy_erasure_test.dart
@@ -6,7 +6,7 @@
 
 import "package:expect/expect.dart" show Expect;
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 import 'package:kernel/src/legacy_erasure.dart';
 import 'package:kernel/testing/type_parser_environment.dart';
 
diff --git a/pkg/kernel/test/nnbd_top_merge_test.dart b/pkg/kernel/test/nnbd_top_merge_test.dart
index 1296889..73d07d2 100644
--- a/pkg/kernel/test/nnbd_top_merge_test.dart
+++ b/pkg/kernel/test/nnbd_top_merge_test.dart
@@ -6,7 +6,7 @@
 
 import "package:expect/expect.dart" show Expect;
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 import 'package:kernel/src/nnbd_top_merge.dart';
 import 'package:kernel/testing/type_parser_environment.dart';
 
diff --git a/pkg/kernel/test/non_null_test.dart b/pkg/kernel/test/non_null_test.dart
index c4f2570..ef3b433 100644
--- a/pkg/kernel/test/non_null_test.dart
+++ b/pkg/kernel/test/non_null_test.dart
@@ -6,7 +6,7 @@
 
 import "package:expect/expect.dart" show Expect;
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 import 'package:kernel/src/non_null.dart';
 import 'package:kernel/testing/type_parser_environment.dart';
 
diff --git a/pkg/kernel/test/norm_test.dart b/pkg/kernel/test/norm_test.dart
index 5fe8429..0f2cd38 100644
--- a/pkg/kernel/test/norm_test.dart
+++ b/pkg/kernel/test/norm_test.dart
@@ -6,7 +6,7 @@
 
 import "package:expect/expect.dart" show Expect;
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 import 'package:kernel/src/norm.dart';
 import 'package:kernel/testing/type_parser_environment.dart';
 
diff --git a/pkg/kernel/test/verify_test.dart b/pkg/kernel/test/verify_test.dart
index 7b6a238..097200d 100644
--- a/pkg/kernel/test/verify_test.dart
+++ b/pkg/kernel/test/verify_test.dart
@@ -227,7 +227,7 @@
   negative1Test(
     'Dangling interface type',
     (TestHarness test) {
-      Class orphan = new Class();
+      Class orphan = new Class(name: 'Class');
       test.addNode(
           new TypeLiteral(new InterfaceType(orphan, Nullability.legacy)));
       return orphan;
@@ -264,27 +264,6 @@
       test.addNode(procedure);
     },
   );
-  simpleNegativeTest(
-    'StaticGet without target',
-    "StaticGet without target.",
-    (TestHarness test) {
-      test.addNode(StaticGet(null));
-    },
-  );
-  simpleNegativeTest(
-    'StaticSet without target',
-    "StaticSet without target.",
-    (TestHarness test) {
-      test.addNode(StaticSet(null, new NullLiteral()));
-    },
-  );
-  simpleNegativeTest(
-    'StaticInvocation without target',
-    "StaticInvocation without target.",
-    (TestHarness test) {
-      test.addNode(StaticInvocation(null, new Arguments.empty()));
-    },
-  );
   positiveTest(
     'Correct StaticInvocation',
     (TestHarness test) {
diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart
index e08f278..d91154e 100644
--- a/pkg/vm/lib/target/vm.dart
+++ b/pkg/vm/lib/target/vm.dart
@@ -3,8 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 library vm.target.vm;
 
-import 'dart:core' hide MapEntry;
-
 import 'package:kernel/ast.dart';
 import 'package:kernel/clone.dart';
 import 'package:kernel/class_hierarchy.dart';
diff --git a/pkg/vm/lib/transformations/mixin_deduplication.dart b/pkg/vm/lib/transformations/mixin_deduplication.dart
index 31481a8..dce3d1b 100644
--- a/pkg/vm/lib/transformations/mixin_deduplication.dart
+++ b/pkg/vm/lib/transformations/mixin_deduplication.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.12
+
 library vm.transformations.mixin_deduplication;
 
 import 'package:kernel/ast.dart';
@@ -13,7 +15,8 @@
 
   // Deduplicate mixins and re-resolve super initializers.
   // (this is a shallow transformation)
-  component.libraries.forEach(deduplicateMixins.visitLibrary);
+  component.libraries
+      .forEach((library) => deduplicateMixins.visitLibrary(library, null));
 
   // Do a deep transformation to update references to the removed mixin
   // application classes in the interface targets and types.
@@ -83,29 +86,30 @@
   }
 }
 
-class DeduplicateMixinsTransformer extends Transformer {
+class DeduplicateMixinsTransformer extends RemovingTransformer {
   final _canonicalMixins = new Map<_DeduplicateMixinKey, Class>();
   final _duplicatedMixins = new Map<Class, Class>();
 
   @override
-  TreeNode visitLibrary(Library node) {
-    transformList(node.classes, this, node);
+  TreeNode visitLibrary(Library node, TreeNode? removalSentinel) {
+    transformClassList(node.classes, node);
     return node;
   }
 
   @override
-  TreeNode visitClass(Class c) {
+  TreeNode visitClass(Class c, TreeNode? removalSentinel) {
     if (_duplicatedMixins.containsKey(c)) {
-      return null; // Class was de-duplicated already, just remove it.
+      // Class was de-duplicated already, just remove it.
+      return removalSentinel!;
     }
 
     if (c.supertype != null) {
-      c.supertype = _transformSupertype(c.supertype, c, true);
+      c.supertype = _transformSupertype(c.supertype!, c, true);
     }
     if (c.mixedInType != null) {
       throw 'All mixins should be transformed already.';
     }
-    transformSupertypeList(c.implementedTypes, this);
+    transformSupertypeList(c.implementedTypes);
 
     if (!c.isAnonymousMixin) {
       return c;
@@ -113,6 +117,7 @@
 
     Class canonical =
         _canonicalMixins.putIfAbsent(new _DeduplicateMixinKey(c), () => c);
+    // ignore: unnecessary_null_comparison
     assert(canonical != null);
 
     if (canonical != c) {
@@ -120,34 +125,34 @@
       // write a dangling reference to the deleted class.
       c.reference.canonicalName = null;
       _duplicatedMixins[c] = canonical;
-      return null; // Remove class.
+      // Remove class.
+      return removalSentinel!;
     }
 
     return c;
   }
 
   @override
-  Supertype visitSupertype(Supertype node) {
+  Supertype visitSupertype(Supertype node, Supertype? removalSentinel) {
     return _transformSupertype(node, null, false);
   }
 
   Supertype _transformSupertype(
-      Supertype supertype, Class cls, bool isSuperclass) {
+      Supertype supertype, Class? cls, bool isSuperclass) {
     Class oldSuper = supertype.classNode;
-    Class newSuper = visitClass(oldSuper);
-    if (newSuper == null) {
-      Class canonicalSuper = _duplicatedMixins[oldSuper];
-      assert(canonicalSuper != null);
+    Class newSuper = visitClass(oldSuper, dummyClass) as Class;
+    if (identical(newSuper, dummyClass)) {
+      Class canonicalSuper = _duplicatedMixins[oldSuper]!;
       supertype = new Supertype(canonicalSuper, supertype.typeArguments);
       if (isSuperclass) {
-        _correctForwardingConstructors(cls, oldSuper, canonicalSuper);
+        _correctForwardingConstructors(cls!, oldSuper, canonicalSuper);
       }
     }
     return supertype;
   }
 
   @override
-  TreeNode defaultTreeNode(TreeNode node) =>
+  TreeNode defaultTreeNode(TreeNode node, TreeNode? removalSentinel) =>
       throw 'Unexpected node ${node.runtimeType}: $node';
 }
 
@@ -204,17 +209,18 @@
 
   @override
   visitSuperMethodInvocation(SuperMethodInvocation node) {
-    node.interfaceTarget = _resolveNewInterfaceTarget(node.interfaceTarget);
+    node.interfaceTarget =
+        _resolveNewInterfaceTarget(node.interfaceTarget) as Procedure?;
     super.visitSuperMethodInvocation(node);
   }
 
-  Member _resolveNewInterfaceTarget(Member m) {
-    final Class c = m?.enclosingClass;
+  Member? _resolveNewInterfaceTarget(Member? m) {
+    final Class? c = m?.enclosingClass;
     if (c != null && c.isAnonymousMixin) {
-      final Class replacement = transformer._duplicatedMixins[c];
+      final Class? replacement = transformer._duplicatedMixins[c];
       if (replacement != null) {
         // The class got removed, so we need to re-resolve the interface target.
-        return _findMember(replacement, m);
+        return _findMember(replacement, m!);
       }
     }
     return m;
@@ -240,8 +246,8 @@
 
   Reference _updateClassReference(Reference classRef) {
     final Class c = classRef.asClass;
-    if (c != null && c.isAnonymousMixin) {
-      final Class replacement = transformer._duplicatedMixins[c];
+    if (c.isAnonymousMixin) {
+      final Class? replacement = transformer._duplicatedMixins[c];
       if (replacement != null) {
         return replacement.reference;
       }
@@ -279,7 +285,7 @@
     for (var initializer in constructor.initializers) {
       if ((initializer is SuperInitializer) &&
           initializer.target.enclosingClass == oldSuper) {
-        Constructor replacement = null;
+        Constructor? replacement = null;
         for (var c in newSuper.constructors) {
           if (c.name == initializer.target.name) {
             replacement = c;
diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart
index ba36509..ac88a41 100644
--- a/pkg/vm/lib/transformations/type_flow/transformer.dart
+++ b/pkg/vm/lib/transformations/type_flow/transformer.dart
@@ -523,8 +523,8 @@
   }
 
   transformComponent(Component component) {
-    _pass1.transform(component);
-    _pass2.transform(component);
+    _pass1.transformComponent(component);
+    _pass2.transformComponent(component);
   }
 
   bool isClassReferencedFromNativeCode(Class c) =>
@@ -563,8 +563,8 @@
       }
       _usedClasses.add(c);
       visitIterable(c.supers, typeVisitor);
-      transformList(c.typeParameters, _pass1, c);
-      transformList(c.annotations, _pass1, c);
+      _pass1.transformTypeParameterList(c.typeParameters, c);
+      _pass1.transformExpressionList(c.annotations, c);
       // Preserve NSM forwarders. They are overlooked by TFA / tree shaker
       // as they are abstract and don't have a body.
       for (Procedure p in c.procedures) {
@@ -615,13 +615,14 @@
       }
 
       if (func != null) {
-        transformList(func.typeParameters, _pass1, func);
-        transformList(func.positionalParameters, _pass1, func);
-        transformList(func.namedParameters, _pass1, func);
+        _pass1.transformTypeParameterList(func.typeParameters, func);
+        _pass1.transformVariableDeclarationList(
+            func.positionalParameters, func);
+        _pass1.transformVariableDeclarationList(func.namedParameters, func);
         func.returnType.accept(typeVisitor);
       }
 
-      transformList(m.annotations, _pass1, m);
+      _pass1.transformExpressionList(m.annotations, m);
 
       // If the member is kept alive we need to keep the extension alive.
       if (m.isExtensionMember) {
@@ -641,18 +642,20 @@
 
   void addUsedExtension(Extension node) {
     if (_usedExtensions.add(node)) {
-      transformList(node.typeParameters, _pass1, node);
+      _pass1.transformTypeParameterList(node.typeParameters, node);
       node.onType?.accept(typeVisitor);
     }
   }
 
   void addUsedTypedef(Typedef typedef) {
     if (_usedTypedefs.add(typedef)) {
-      transformList(typedef.annotations, _pass1, typedef);
-      transformList(typedef.typeParameters, _pass1, typedef);
-      transformList(typedef.typeParametersOfFunctionType, _pass1, typedef);
-      transformList(typedef.positionalParameters, _pass1, typedef);
-      transformList(typedef.namedParameters, _pass1, typedef);
+      _pass1.transformExpressionList(typedef.annotations, typedef);
+      _pass1.transformTypeParameterList(typedef.typeParameters, typedef);
+      _pass1.transformTypeParameterList(
+          typedef.typeParametersOfFunctionType, typedef);
+      _pass1.transformVariableDeclarationList(
+          typedef.positionalParameters, typedef);
+      _pass1.transformVariableDeclarationList(typedef.namedParameters, typedef);
       typedef.type?.accept(typeVisitor);
     }
   }
@@ -786,7 +789,7 @@
 /// Visits all classes, members and bodies of reachable members.
 /// Collects all used classes, members and types, and
 /// transforms unreachable calls into 'throw' expressions.
-class _TreeShakerPass1 extends Transformer {
+class _TreeShakerPass1 extends RemovingTransformer {
   final TreeShaker shaker;
   final FieldMorpher fieldMorpher;
   final TypeEnvironment environment;
@@ -808,8 +811,8 @@
       : fieldMorpher = shaker.fieldMorpher,
         environment = shaker.typeFlowAnalysis.environment;
 
-  void transform(Component component) {
-    component.transformChildren(this);
+  void transformComponent(Component component) {
+    component.transformOrRemoveChildren(this);
   }
 
   bool _isUnreachable(TreeNode node) {
@@ -870,61 +873,62 @@
   NarrowNotNull _getNullTest(TreeNode node) =>
       shaker.typeFlowAnalysis.nullTest(node);
 
-  TreeNode _visitAssertNode(TreeNode node) {
+  TreeNode _visitAssertNode(TreeNode node, TreeNode removalSentinel) {
     if (kRemoveAsserts) {
-      return null;
+      return removalSentinel;
     } else {
-      node.transformChildren(this);
+      node.transformOrRemoveChildren(this);
       return node;
     }
   }
 
   @override
-  DartType visitDartType(DartType node) {
+  DartType visitDartType(DartType node, DartType removalSentinel) {
     node.accept(shaker.typeVisitor);
     return node;
   }
 
   @override
-  Supertype visitSupertype(Supertype node) {
+  Supertype visitSupertype(Supertype node, Supertype removalSentinel) {
     node.accept(shaker.typeVisitor);
     return node;
   }
 
   @override
-  TreeNode visitTypedef(Typedef node) {
+  TreeNode visitTypedef(Typedef node, TreeNode removalSentinel) {
     return node; // Do not go deeper.
   }
 
   @override
-  Extension visitExtension(Extension node) {
+  Extension visitExtension(Extension node, TreeNode removalSentinel) {
     // The extension can be considered a weak node, we'll only retain it if
     // normal code references any of it's members.
     return node;
   }
 
   @override
-  TreeNode visitClass(Class node) {
+  TreeNode visitClass(Class node, TreeNode removalSentinel) {
     if (shaker.isClassAllocated(node) ||
         shaker.isClassReferencedFromNativeCode(node)) {
       shaker.addClassUsedInType(node);
     }
-    transformList(node.constructors, this, node);
-    transformList(node.procedures, this, node);
-    transformList(node.fields, this, node);
-    transformList(node.redirectingFactoryConstructors, this, node);
+    transformConstructorList(node.constructors, node);
+    transformProcedureList(node.procedures, node);
+    transformFieldList(node.fields, node);
+    transformRedirectingFactoryConstructorList(
+        node.redirectingFactoryConstructors, node);
     return node;
   }
 
   @override
-  TreeNode defaultMember(Member node) {
+  TreeNode defaultMember(Member node, TreeNode removalSentinel) {
     currentMember = node;
     if (shaker.isMemberBodyReachable(node)) {
       if (kPrintTrace) {
         tracePrint("Visiting $node");
       }
       shaker.addUsedMember(node);
-      node.transformChildren(this);
+      node.transformOrRemoveChildren(this);
     } else if (shaker.isMemberReferencedFromNativeCode(node)) {
       // Preserve members referenced from native code to satisfy lookups, even
       // if they are not reachable. An instance member could be added via
@@ -937,7 +941,7 @@
   }
 
   @override
-  TreeNode visitField(Field node) {
+  TreeNode visitField(Field node, TreeNode removalSentinel) {
     currentMember = node;
     if (shaker.retainField(node)) {
       if (kPrintTrace) {
@@ -946,7 +950,7 @@
       shaker.addUsedMember(node);
       if (node.initializer != null) {
         if (shaker.isFieldInitializerReachable(node)) {
-          node.transformChildren(this);
+          node.transformOrRemoveChildren(this);
         } else {
           node.initializer = _makeUnreachableCall([])..parent = node;
         }
@@ -961,8 +965,9 @@
   }
 
   @override
-  TreeNode visitMethodInvocation(MethodInvocation node) {
-    node.transformChildren(this);
+  TreeNode visitMethodInvocation(
+      MethodInvocation node, TreeNode removalSentinel) {
+    node.transformOrRemoveChildren(this);
     if (_isUnreachable(node)) {
       return _makeUnreachableCall(
           _flattenArguments(node.arguments, receiver: node.receiver));
@@ -984,8 +989,8 @@
   }
 
   @override
-  TreeNode visitPropertyGet(PropertyGet node) {
-    node.transformChildren(this);
+  TreeNode visitPropertyGet(PropertyGet node, TreeNode removalSentinel) {
+    node.transformOrRemoveChildren(this);
     if (_isUnreachable(node)) {
       return _makeUnreachableCall([node.receiver]);
     } else {
@@ -999,8 +1004,8 @@
   }
 
   @override
-  TreeNode visitPropertySet(PropertySet node) {
-    node.transformChildren(this);
+  TreeNode visitPropertySet(PropertySet node, TreeNode removalSentinel) {
+    node.transformOrRemoveChildren(this);
     if (_isUnreachable(node)) {
       return _makeUnreachableCall([node.receiver, node.value]);
     } else {
@@ -1014,8 +1019,9 @@
   }
 
   @override
-  TreeNode visitSuperMethodInvocation(SuperMethodInvocation node) {
-    node.transformChildren(this);
+  TreeNode visitSuperMethodInvocation(
+      SuperMethodInvocation node, TreeNode removalSentinel) {
+    node.transformOrRemoveChildren(this);
     if (_isUnreachable(node)) {
       return _makeUnreachableCall(_flattenArguments(node.arguments));
     } else {
@@ -1029,8 +1035,9 @@
   }
 
   @override
-  TreeNode visitSuperPropertyGet(SuperPropertyGet node) {
-    node.transformChildren(this);
+  TreeNode visitSuperPropertyGet(
+      SuperPropertyGet node, TreeNode removalSentinel) {
+    node.transformOrRemoveChildren(this);
     if (_isUnreachable(node)) {
       return _makeUnreachableCall([]);
     } else {
@@ -1044,8 +1051,9 @@
   }
 
   @override
-  TreeNode visitSuperPropertySet(SuperPropertySet node) {
-    node.transformChildren(this);
+  TreeNode visitSuperPropertySet(
+      SuperPropertySet node, TreeNode removalSentinel) {
+    node.transformOrRemoveChildren(this);
     if (_isUnreachable(node)) {
       return _makeUnreachableCall([node.value]);
     } else {
@@ -1059,8 +1067,9 @@
   }
 
   @override
-  TreeNode visitStaticInvocation(StaticInvocation node) {
-    node.transformChildren(this);
+  TreeNode visitStaticInvocation(
+      StaticInvocation node, TreeNode removalSentinel) {
+    node.transformOrRemoveChildren(this);
     if (_isUnreachable(node)) {
       return _makeUnreachableCall(_flattenArguments(node.arguments));
     }
@@ -1073,8 +1082,8 @@
   }
 
   @override
-  TreeNode visitStaticGet(StaticGet node) {
-    node.transformChildren(this);
+  TreeNode visitStaticGet(StaticGet node, TreeNode removalSentinel) {
+    node.transformOrRemoveChildren(this);
     if (_isUnreachable(node)) {
       return _makeUnreachableCall([]);
     } else {
@@ -1088,14 +1097,14 @@
   }
 
   @override
-  Constant visitConstant(Constant node) {
+  Constant visitConstant(Constant node, Constant removalSentinel) {
     shaker.constantVisitor.analyzeConstant(node);
     return node;
   }
 
   @override
-  TreeNode visitStaticSet(StaticSet node) {
-    node.transformChildren(this);
+  TreeNode visitStaticSet(StaticSet node, TreeNode removalSentinel) {
+    node.transformOrRemoveChildren(this);
     if (_isUnreachable(node)) {
       return _makeUnreachableCall([node.value]);
     } else {
@@ -1110,8 +1119,9 @@
   }
 
   @override
-  TreeNode visitConstructorInvocation(ConstructorInvocation node) {
-    node.transformChildren(this);
+  TreeNode visitConstructorInvocation(
+      ConstructorInvocation node, TreeNode removalSentinel) {
+    node.transformOrRemoveChildren(this);
     if (_isUnreachable(node)) {
       return _makeUnreachableCall(_flattenArguments(node.arguments));
     } else {
@@ -1125,8 +1135,9 @@
   }
 
   @override
-  TreeNode visitRedirectingInitializer(RedirectingInitializer node) {
-    node.transformChildren(this);
+  TreeNode visitRedirectingInitializer(
+      RedirectingInitializer node, TreeNode removalSentinel) {
+    node.transformOrRemoveChildren(this);
     if (_isUnreachable(node)) {
       return _makeUnreachableInitializer(_flattenArguments(node.arguments));
     } else {
@@ -1137,8 +1148,9 @@
   }
 
   @override
-  TreeNode visitSuperInitializer(SuperInitializer node) {
-    node.transformChildren(this);
+  TreeNode visitSuperInitializer(
+      SuperInitializer node, TreeNode removalSentinel) {
+    node.transformOrRemoveChildren(this);
     if (_isUnreachable(node)) {
       return _makeUnreachableInitializer(_flattenArguments(node.arguments));
     } else {
@@ -1148,8 +1160,9 @@
   }
 
   @override
-  TreeNode visitFieldInitializer(FieldInitializer node) {
-    node.transformChildren(this);
+  TreeNode visitFieldInitializer(
+      FieldInitializer node, TreeNode removalSentinel) {
+    node.transformOrRemoveChildren(this);
     if (_isUnreachable(node)) {
       return _makeUnreachableInitializer([node.value]);
     } else {
@@ -1160,7 +1173,7 @@
           return LocalInitializer(
               VariableDeclaration(null, initializer: node.value));
         } else {
-          return null;
+          return removalSentinel;
         }
       }
       return node;
@@ -1168,23 +1181,25 @@
   }
 
   @override
-  TreeNode visitAssertStatement(AssertStatement node) {
-    return _visitAssertNode(node);
+  TreeNode visitAssertStatement(
+      AssertStatement node, TreeNode removalSentinel) {
+    return _visitAssertNode(node, removalSentinel);
   }
 
   @override
-  TreeNode visitAssertBlock(AssertBlock node) {
-    return _visitAssertNode(node);
+  TreeNode visitAssertBlock(AssertBlock node, TreeNode removalSentinel) {
+    return _visitAssertNode(node, removalSentinel);
   }
 
   @override
-  TreeNode visitAssertInitializer(AssertInitializer node) {
-    return _visitAssertNode(node);
+  TreeNode visitAssertInitializer(
+      AssertInitializer node, TreeNode removalSentinel) {
+    return _visitAssertNode(node, removalSentinel);
   }
 
   @override
-  TreeNode visitAsExpression(AsExpression node) {
-    node.transformChildren(this);
+  TreeNode visitAsExpression(AsExpression node, TreeNode removalSentinel) {
+    node.transformOrRemoveChildren(this);
     TypeCheck check = shaker.typeFlowAnalysis.explicitCast(node);
     if (check != null && check.canAlwaysSkip) {
       return StaticInvocation(
@@ -1195,8 +1210,8 @@
   }
 
   @override
-  TreeNode visitNullCheck(NullCheck node) {
-    node.transformChildren(this);
+  TreeNode visitNullCheck(NullCheck node, TreeNode removalSentinel) {
+    node.transformOrRemoveChildren(this);
     final nullTest = _getNullTest(node);
     if (nullTest.isAlwaysNotNull) {
       return StaticInvocation(
@@ -1221,13 +1236,13 @@
 /// This pass visits classes and members and removes unused classes and members.
 /// Bodies of unreachable but used members are replaced with 'throw'
 /// expressions. This pass does not dive deeper than member level.
-class _TreeShakerPass2 extends Transformer {
+class _TreeShakerPass2 extends RemovingTransformer {
   final TreeShaker shaker;
 
   _TreeShakerPass2(this.shaker);
 
-  void transform(Component component) {
-    component.transformChildren(this);
+  void transformComponent(Component component) {
+    component.transformOrRemoveChildren(this);
     for (Source source in component.uriToSource.values) {
       source?.constantCoverageConstructors?.removeWhere((Reference reference) {
         Member node = reference.asMember;
@@ -1237,8 +1252,8 @@
   }
 
   @override
-  TreeNode visitLibrary(Library node) {
-    node.transformChildren(this);
+  TreeNode visitLibrary(Library node, TreeNode removalSentinel) {
+    node.transformOrRemoveChildren(this);
     // The transformer API does not iterate over `Library.additionalExports`,
     // so we manually delete the references to shaken nodes.
     node.additionalExports.removeWhere((Reference reference) {
@@ -1257,19 +1272,19 @@
   }
 
   @override
-  Typedef visitTypedef(Typedef node) {
-    return shaker.isTypedefUsed(node) ? node : null;
+  Typedef visitTypedef(Typedef node, TreeNode removalSentinel) {
+    return shaker.isTypedefUsed(node) ? node : removalSentinel;
   }
 
   @override
-  Class visitClass(Class node) {
+  Class visitClass(Class node, TreeNode removalSentinel) {
     if (!shaker.isClassUsed(node)) {
       debugPrint('Dropped class ${node.name}');
       // Ensure that kernel file writer will not be able to
       // write a dangling reference to the deleted class.
       node.reference.canonicalName = null;
       Statistics.classesDropped++;
-      return null; // Remove the class.
+      return removalSentinel; // Remove the class.
     }
 
     if (!shaker.isClassUsedInType(node)) {
@@ -1292,7 +1307,7 @@
       node.isAbstract = true;
     }
 
-    node.transformChildren(this);
+    node.transformOrRemoveChildren(this);
 
     return node;
   }
@@ -1305,13 +1320,13 @@
       node.enclosingClass.isEnum;
 
   @override
-  Member defaultMember(Member node) {
+  Member defaultMember(Member node, TreeNode removalSentinel) {
     if (!shaker.isMemberUsed(node) && !_preserveSpecialMember(node)) {
       // Ensure that kernel file writer will not be able to
       // write a dangling reference to the deleted member.
       node.reference.canonicalName = null;
       Statistics.membersDropped++;
-      return null;
+      return removalSentinel;
     }
 
     if (!shaker.isMemberBodyReachable(node)) {
@@ -1358,7 +1373,7 @@
   }
 
   @override
-  Extension visitExtension(Extension node) {
+  Extension visitExtension(Extension node, TreeNode removalSentinel) {
     if (shaker.isExtensionUsed(node)) {
       int writeIndex = 0;
       for (int i = 0; i < node.members.length; ++i) {
@@ -1379,7 +1394,7 @@
       assert(node.members.length > 0);
       return node;
     }
-    return null;
+    return removalSentinel;
   }
 
   void _makeUnreachableBody(FunctionNode function) {
@@ -1391,7 +1406,7 @@
   }
 
   @override
-  TreeNode defaultTreeNode(TreeNode node) {
+  TreeNode defaultTreeNode(TreeNode node, TreeNode removalSentinel) {
     return node; // Do not traverse into other nodes.
   }
 }
diff --git a/pkg/vm/lib/transformations/unreachable_code_elimination.dart b/pkg/vm/lib/transformations/unreachable_code_elimination.dart
index 8444ce7..10bd958 100644
--- a/pkg/vm/lib/transformations/unreachable_code_elimination.dart
+++ b/pkg/vm/lib/transformations/unreachable_code_elimination.dart
@@ -2,17 +2,20 @@
 // 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.
 
+// @dart=2.12
+
 import 'package:kernel/ast.dart';
 
 /// Simple unreachable code elimination: removes asserts and if statements
 /// with constant conditions. Does a very limited constant folding of
 /// logical expressions.
 Component transformComponent(Component component, bool enableAsserts) {
-  new SimpleUnreachableCodeElimination(enableAsserts).visitComponent(component);
+  new SimpleUnreachableCodeElimination(enableAsserts)
+      .visitComponent(component, null);
   return component;
 }
 
-class SimpleUnreachableCodeElimination extends Transformer {
+class SimpleUnreachableCodeElimination extends RemovingTransformer {
   final bool enableAsserts;
 
   SimpleUnreachableCodeElimination(this.enableAsserts);
@@ -37,24 +40,27 @@
   Expression _createBoolLiteral(bool value, int fileOffset) =>
       new BoolLiteral(value)..fileOffset = fileOffset;
 
-  Statement _makeEmptyBlockIfNull(Statement node, TreeNode parent) =>
-      node == null ? (Block(<Statement>[])..parent = parent) : node;
+  Statement _makeEmptyBlockIfEmptyStatement(Statement node, TreeNode parent) =>
+      node is EmptyStatement ? (Block(<Statement>[])..parent = parent) : node;
 
   @override
-  TreeNode visitIfStatement(IfStatement node) {
-    node.transformChildren(this);
+  TreeNode visitIfStatement(IfStatement node, TreeNode? removalSentinel) {
+    node.transformOrRemoveChildren(this);
     final condition = node.condition;
     if (_isBoolConstant(condition)) {
       final value = _getBoolConstantValue(condition);
-      return value ? node.then : node.otherwise;
+      return value
+          ? node.then
+          : (node.otherwise ?? removalSentinel ?? new EmptyStatement());
     }
-    node.then = _makeEmptyBlockIfNull(node.then, node);
+    node.then = _makeEmptyBlockIfEmptyStatement(node.then, node);
     return node;
   }
 
   @override
-  visitConditionalExpression(ConditionalExpression node) {
-    node.transformChildren(this);
+  visitConditionalExpression(
+      ConditionalExpression node, TreeNode? removalSentinel) {
+    node.transformOrRemoveChildren(this);
     final condition = node.condition;
     if (_isBoolConstant(condition)) {
       final value = _getBoolConstantValue(condition);
@@ -64,8 +70,8 @@
   }
 
   @override
-  TreeNode visitNot(Not node) {
-    node.transformChildren(this);
+  TreeNode visitNot(Not node, TreeNode? removalSentinel) {
+    node.transformOrRemoveChildren(this);
     final operand = node.operand;
     if (_isBoolConstant(operand)) {
       return _createBoolLiteral(
@@ -75,8 +81,9 @@
   }
 
   @override
-  TreeNode visitLogicalExpression(LogicalExpression node) {
-    node.transformChildren(this);
+  TreeNode visitLogicalExpression(
+      LogicalExpression node, TreeNode? removalSentinel) {
+    node.transformOrRemoveChildren(this);
     final left = node.left;
     final right = node.right;
     final operatorEnum = node.operatorEnum;
@@ -104,8 +111,8 @@
   }
 
   @override
-  visitStaticGet(StaticGet node) {
-    node.transformChildren(this);
+  visitStaticGet(StaticGet node, TreeNode? removalSentinel) {
+    node.transformOrRemoveChildren(this);
     final target = node.target;
     if (target is Field && target.isConst) {
       throw 'StaticGet from const field $target should be evaluated by front-end: $node';
@@ -114,34 +121,38 @@
   }
 
   @override
-  TreeNode visitAssertStatement(AssertStatement node) {
+  TreeNode visitAssertStatement(
+      AssertStatement node, TreeNode? removalSentinel) {
     if (!enableAsserts) {
-      return null;
+      return removalSentinel ?? new EmptyStatement();
     }
-    return super.visitAssertStatement(node);
+    return super.visitAssertStatement(node, removalSentinel);
   }
 
   @override
-  TreeNode visitAssertBlock(AssertBlock node) {
+  TreeNode visitAssertBlock(AssertBlock node, TreeNode? removalSentinel) {
     if (!enableAsserts) {
-      return null;
+      return removalSentinel ?? new EmptyStatement();
     }
-    return super.visitAssertBlock(node);
+    return super.visitAssertBlock(node, removalSentinel);
   }
 
   @override
-  TreeNode visitAssertInitializer(AssertInitializer node) {
+  TreeNode visitAssertInitializer(
+      AssertInitializer node, TreeNode? removalSentinel) {
     if (!enableAsserts) {
-      return null;
+      // Initializers only occur in the initializer list where they are always
+      // removable.
+      return removalSentinel!;
     }
-    return super.visitAssertInitializer(node);
+    return super.visitAssertInitializer(node, removalSentinel);
   }
 
   @override
-  TreeNode visitTryFinally(TryFinally node) {
-    node.transformChildren(this);
+  TreeNode visitTryFinally(TryFinally node, TreeNode? removalSentinel) {
+    node.transformOrRemoveChildren(this);
     final fin = node.finalizer;
-    if (fin == null || (fin is Block && fin.statements.isEmpty)) {
+    if (fin is EmptyStatement || (fin is Block && fin.statements.isEmpty)) {
       return node.body;
     }
     return node;
@@ -157,8 +168,8 @@
   }
 
   @override
-  TreeNode visitTryCatch(TryCatch node) {
-    node.transformChildren(this);
+  TreeNode visitTryCatch(TryCatch node, TreeNode? removalSentinel) {
+    node.transformOrRemoveChildren(this);
     // Can replace try/catch with its body if all catches are just rethow.
     for (Catch catchClause in node.catches) {
       if (!_isRethrow(catchClause.body)) {
@@ -174,30 +185,30 @@
   // need to guard against null.
 
   @override
-  TreeNode visitWhileStatement(WhileStatement node) {
-    node.transformChildren(this);
-    node.body = _makeEmptyBlockIfNull(node.body, node);
+  TreeNode visitWhileStatement(WhileStatement node, TreeNode? removalSentinel) {
+    node.transformOrRemoveChildren(this);
+    node.body = _makeEmptyBlockIfEmptyStatement(node.body, node);
     return node;
   }
 
   @override
-  TreeNode visitDoStatement(DoStatement node) {
-    node.transformChildren(this);
-    node.body = _makeEmptyBlockIfNull(node.body, node);
+  TreeNode visitDoStatement(DoStatement node, TreeNode? removalSentinel) {
+    node.transformOrRemoveChildren(this);
+    node.body = _makeEmptyBlockIfEmptyStatement(node.body, node);
     return node;
   }
 
   @override
-  TreeNode visitForStatement(ForStatement node) {
-    node.transformChildren(this);
-    node.body = _makeEmptyBlockIfNull(node.body, node);
+  TreeNode visitForStatement(ForStatement node, TreeNode? removalSentinel) {
+    node.transformOrRemoveChildren(this);
+    node.body = _makeEmptyBlockIfEmptyStatement(node.body, node);
     return node;
   }
 
   @override
-  TreeNode visitForInStatement(ForInStatement node) {
-    node.transformChildren(this);
-    node.body = _makeEmptyBlockIfNull(node.body, node);
+  TreeNode visitForInStatement(ForInStatement node, TreeNode? removalSentinel) {
+    node.transformOrRemoveChildren(this);
+    node.body = _makeEmptyBlockIfEmptyStatement(node.body, node);
     return node;
   }
 }
diff --git a/tools/VERSION b/tools/VERSION
index ad78b64..f0413ea 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 50
+PRERELEASE 51
 PRERELEASE_PATCH 0
\ No newline at end of file
