Support type parameters in ReplaceTopBottomVisitor.

See https://github.com/dart-lang/language/pull/1133

Change-Id: I3800b88496a8bf214b4bc366f4cb7ef3e9968f17
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/162784
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/element/replace_top_bottom_visitor.dart b/pkg/analyzer/lib/src/dart/element/replace_top_bottom_visitor.dart
index 7e5e457..5dd6961 100644
--- a/pkg/analyzer/lib/src/dart/element/replace_top_bottom_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/element/replace_top_bottom_visitor.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/replacement_visitor.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:meta/meta.dart';
 
@@ -54,6 +55,16 @@
   }
 
   @override
+  DartType visitTypeParameterType(TypeParameterType type) {
+    if (!_isCovariant && _typeSystem.isNonNullableByDefault) {
+      if (_typeSystem.isSubtypeOf2(type, NeverTypeImpl.instance)) {
+        return _typeSystem.objectQuestion;
+      }
+    }
+    return null;
+  }
+
+  @override
   DartType visitVoidType(VoidType type) {
     return _isCovariant ? _bottomType : null;
   }
diff --git a/pkg/analyzer/test/src/dart/element/replace_top_bottom_test.dart b/pkg/analyzer/test/src/dart/element/replace_top_bottom_test.dart
index e3a64cf..4851abd 100644
--- a/pkg/analyzer/test/src/dart/element/replace_top_bottom_test.dart
+++ b/pkg/analyzer/test/src/dart/element/replace_top_bottom_test.dart
@@ -79,11 +79,22 @@
     // Not contravariant.
     _check(neverNone, 'Never');
 
-    _check(
-      functionTypeNone(returnType: intNone, parameters: [
-        requiredParameter(type: neverNone),
-      ]),
-      'int Function(Object?)',
+    void checkContravariant(DartType type, String expectedStr) {
+      _check(
+        functionTypeNone(returnType: intNone, parameters: [
+          requiredParameter(type: type),
+        ]),
+        'int Function($expectedStr)',
+      );
+    }
+
+    checkContravariant(neverNone, 'Object?');
+
+    checkContravariant(
+      typeParameterTypeNone(
+        typeParameter('T', bound: neverNone),
+      ),
+      'Object?',
     );
   }