[dart2js] Narrow scope of static type visitor.

The static type visitor only needs to be a TreeVisitor.

Change-Id: I5501a7e71719e711895c0ac18b49c9323665c9d1
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/249460
Reviewed-by: Stephen Adams <sra@google.com>
Reviewed-by: Nate Biggs <natebiggs@google.com>
diff --git a/pkg/compiler/lib/src/ir/cached_static_type.dart b/pkg/compiler/lib/src/ir/cached_static_type.dart
index fa192c5..d25cf28 100644
--- a/pkg/compiler/lib/src/ir/cached_static_type.dart
+++ b/pkg/compiler/lib/src/ir/cached_static_type.dart
@@ -23,7 +23,7 @@
       : super(staticTypeContext.typeEnvironment);
 
   @override
-  ir.DartType getStaticType(ir.Expression node) => node.accept(this)!;
+  ir.DartType getStaticType(ir.Expression node) => node.accept(this);
 
   @override
   ir.DartType getForInIteratorType(ir.ForInStatement node) =>
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index 061804e..94e403b 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -166,10 +166,6 @@
   }
 
   @override
-  ir.DartType defaultNode(ir.Node node) =>
-      throw UnsupportedError('Unhandled node $node (${node.runtimeType})');
-
-  @override
   Null visitComponent(ir.Component node) {
     visitNodes(node.libraries);
   }
@@ -461,7 +457,7 @@
     for (ir.Member member in cls.members) {
       if (member.name.text == name) return member;
     }
-    throw fail("Member '$name' not found in $cls");
+    throw StateError("Member '$name' not found in $cls");
   }
 
   ir.Procedure _objectEquals;
@@ -1217,7 +1213,7 @@
     ir.DartType thenType = visitNode(then);
     TypeMap afterThen = typeMap;
     typeMap = afterConditionWhenFalse;
-    ir.DartType otherwiseType = visitNode(otherwise);
+    ir.DartType otherwiseType = visitNodeOrNull(otherwise);
     TypeMap afterOtherwise = typeMap;
     if (completes(thenType) && completes(otherwiseType)) {
       typeMap = afterThen.join(afterOtherwise);
@@ -1438,7 +1434,7 @@
     Set<ir.VariableDeclaration> _oldVariables = _currentVariables;
     _currentVariables = {};
     visitSignature(node.function);
-    visitNode(node.function.body);
+    visitNodeOrNull(node.function.body);
     handleFunctionExpression(node);
     _invalidatedVariables.removeAll(_currentVariables);
     _currentVariables = _oldVariables;
@@ -1529,7 +1525,7 @@
     visitNodes(node.variables);
     TypeMap beforeLoop = typeMap =
         typeMap.remove(variableScopeModel.getScopeFor(node).assignedVariables);
-    visitNode(node.condition);
+    visitNodeOrNull(node.condition);
     typeMap = typeMapWhenTrue;
     visitNode(node.body);
     visitNodes(node.updates);
@@ -1621,7 +1617,7 @@
 
   @override
   ir.DartType visitReturnStatement(ir.ReturnStatement node) {
-    visitNode(node.expression);
+    visitNodeOrNull(node.expression);
     return const DoesNotCompleteType();
   }
 
@@ -1675,7 +1671,7 @@
     TypeMap afterConditionWhenTrue = typeMapWhenTrue;
     TypeMap afterConditionWhenFalse = typeMapWhenFalse;
     typeMap = afterConditionWhenFalse;
-    visitNode(node.message);
+    visitNodeOrNull(node.message);
     handleAssertStatement(node);
     typeMap = useAsserts ? afterConditionWhenTrue : beforeCondition;
   }
@@ -1690,7 +1686,7 @@
     Set<ir.VariableDeclaration> _oldVariables = _currentVariables;
     _currentVariables = {};
     visitSignature(node.function);
-    visitNode(node.function.body);
+    visitNodeOrNull(node.function.body);
     handleFunctionDeclaration(node);
     _invalidatedVariables.removeAll(_currentVariables);
     _currentVariables = _oldVariables;
@@ -1701,7 +1697,7 @@
 
   void visitParameter(ir.VariableDeclaration node) {
     _currentVariables.add(node);
-    visitNode(node.initializer);
+    visitNodeOrNull(node.initializer);
     handleParameter(node);
   }
 
@@ -1722,7 +1718,7 @@
     _currentVariables = {};
     currentLibrary = node.enclosingLibrary;
     visitSignature(node.function);
-    visitNode(node.function.body);
+    visitNodeOrNull(node.function.body);
     handleProcedure(node);
     _invalidatedVariables.removeAll(_currentVariables);
     _currentVariables = null;
@@ -1740,7 +1736,7 @@
     currentLibrary = node.enclosingLibrary;
     visitSignature(node.function);
     visitNodes(node.initializers);
-    visitNode(node.function.body);
+    visitNodeOrNull(node.function.body);
     handleConstructor(node);
     _invalidatedVariables.removeAll(_currentVariables);
     _currentVariables = null;
@@ -1756,7 +1752,7 @@
         typeEnvironment.coreTypes, node.enclosingLibrary.nonNullable));
     _currentVariables = {};
     currentLibrary = node.enclosingLibrary;
-    visitNode(node.initializer);
+    visitNodeOrNull(node.initializer);
     handleField(node);
     _invalidatedVariables.removeAll(_currentVariables);
     _currentVariables = null;
@@ -1768,7 +1764,7 @@
 
   void _processLocalVariable(ir.VariableDeclaration node) {
     _currentVariables.add(node);
-    ir.DartType type = visitNode(node.initializer);
+    ir.DartType type = visitNodeOrNull(node.initializer);
     if (node.initializer != null &&
         variableScopeModel.isEffectivelyFinal(node) &&
         inferEffectivelyFinalVariableTypes) {
diff --git a/pkg/compiler/lib/src/ir/static_type_base.dart b/pkg/compiler/lib/src/ir/static_type_base.dart
index 79ed5f4..9357bb0 100644
--- a/pkg/compiler/lib/src/ir/static_type_base.dart
+++ b/pkg/compiler/lib/src/ir/static_type_base.dart
@@ -55,14 +55,11 @@
 /// expression kind. For instance method invocations whose static type depend
 /// on the static types of the receiver and type arguments and the signature
 /// of the targeted procedure.
-abstract class StaticTypeBase extends ir.Visitor<ir.DartType?>
-    with ir.VisitorNullMixin<ir.DartType> {
+abstract class StaticTypeBase extends ir.TreeVisitor<ir.DartType> {
   final ir.TypeEnvironment _typeEnvironment;
 
   StaticTypeBase(this._typeEnvironment);
 
-  fail(String message) => message;
-
   ir.TypeEnvironment get typeEnvironment => _typeEnvironment;
 
   ir.StaticTypeContext get staticTypeContext;
@@ -70,33 +67,28 @@
   ThisInterfaceType get thisType;
 
   @override
-  ir.DartType? defaultNode(ir.Node node) {
-    return null;
+  ir.DartType defaultTreeNode(ir.TreeNode node) {
+    throw UnsupportedError('Unhandled node $node (${node.runtimeType})');
   }
 
-  ir.DartType? visitNode(ir.Node? node) {
-    return node?.accept(this);
-  }
+  ir.DartType visitNode(ir.TreeNode node) => node.accept(this);
 
-  Null visitNodes(List<ir.Node> nodes) {
-    for (ir.Node node in nodes) {
+  ir.DartType? visitNodeOrNull(ir.TreeNode? node) => node?.accept(this);
+
+  void visitNodes(Iterable<ir.TreeNode> nodes) {
+    for (ir.TreeNode node in nodes) {
       visitNode(node);
     }
   }
 
   @override
-  ir.DartType defaultExpression(ir.Expression node) {
-    throw fail('Unhandled node $node (${node.runtimeType})');
-  }
-
-  @override
   ir.DartType visitAsExpression(ir.AsExpression node) {
     return node.type;
   }
 
   @override
   ir.DartType visitAwaitExpression(ir.AwaitExpression node) {
-    return typeEnvironment.flatten(visitNode(node.operand)!);
+    return typeEnvironment.flatten(visitNode(node.operand));
   }
 
   @override
@@ -150,7 +142,7 @@
   }
 
   @override
-  ir.DartType? visitVariableSet(ir.VariableSet node) {
+  ir.DartType visitVariableSet(ir.VariableSet node) {
     return visitNode(node.value);
   }
 
@@ -161,12 +153,12 @@
   ir.DartType visitStaticGet(ir.StaticGet node) => node.target.getterType;
 
   @override
-  ir.DartType? visitStaticSet(ir.StaticSet node) {
+  ir.DartType visitStaticSet(ir.StaticSet node) {
     return visitNode(node.value);
   }
 
   @override
-  ir.DartType? visitSuperPropertySet(ir.SuperPropertySet node) {
+  ir.DartType visitSuperPropertySet(ir.SuperPropertySet node) {
     return visitNode(node.value);
   }
 
@@ -205,12 +197,12 @@
   }
 
   @override
-  ir.DartType? visitLet(ir.Let node) {
+  ir.DartType visitLet(ir.Let node) {
     return visitNode(node.body);
   }
 
   @override
-  ir.DartType? visitBlockExpression(ir.BlockExpression node) {
+  ir.DartType visitBlockExpression(ir.BlockExpression node) {
     return visitNode(node.value);
   }
 
diff --git a/pkg/compiler/test/analyses/analysis_helper.dart b/pkg/compiler/test/analyses/analysis_helper.dart
index f7a975c..251ed4d 100644
--- a/pkg/compiler/test/analyses/analysis_helper.dart
+++ b/pkg/compiler/test/analyses/analysis_helper.dart
@@ -312,8 +312,8 @@
   }
 
   @override
-  ir.DartType visitNode(ir.Node node) {
-    ir.DartType staticType = node?.accept(this);
+  ir.DartType visitNode(ir.TreeNode node) {
+    ir.DartType staticType = node.accept(this);
     assert(
         node is! ir.Expression ||
             staticType is ir.NullType ||