Skip to content

Commit 744e34a

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Support type parameters in ReplaceTopBottomVisitor.
See dart-lang/language#1133 Change-Id: I3800b88496a8bf214b4bc366f4cb7ef3e9968f17 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/162784 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent c20d17b commit 744e34a

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

pkg/analyzer/lib/src/dart/element/replace_top_bottom_visitor.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import 'package:analyzer/dart/element/type.dart';
66
import 'package:analyzer/src/dart/element/replacement_visitor.dart';
7+
import 'package:analyzer/src/dart/element/type.dart';
78
import 'package:analyzer/src/dart/element/type_system.dart';
89
import 'package:meta/meta.dart';
910

@@ -53,6 +54,16 @@ class ReplaceTopBottomVisitor extends ReplacementVisitor {
5354
return _isCovariant ? null : _topType;
5455
}
5556

57+
@override
58+
DartType visitTypeParameterType(TypeParameterType type) {
59+
if (!_isCovariant && _typeSystem.isNonNullableByDefault) {
60+
if (_typeSystem.isSubtypeOf2(type, NeverTypeImpl.instance)) {
61+
return _typeSystem.objectQuestion;
62+
}
63+
}
64+
return null;
65+
}
66+
5667
@override
5768
DartType visitVoidType(VoidType type) {
5869
return _isCovariant ? _bottomType : null;

pkg/analyzer/test/src/dart/element/replace_top_bottom_test.dart

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,22 @@ class ReplaceTopBottomNullSafetyTest extends AbstractTypeSystemNullSafetyTest {
7979
// Not contravariant.
8080
_check(neverNone, 'Never');
8181

82-
_check(
83-
functionTypeNone(returnType: intNone, parameters: [
84-
requiredParameter(type: neverNone),
85-
]),
86-
'int Function(Object?)',
82+
void checkContravariant(DartType type, String expectedStr) {
83+
_check(
84+
functionTypeNone(returnType: intNone, parameters: [
85+
requiredParameter(type: type),
86+
]),
87+
'int Function($expectedStr)',
88+
);
89+
}
90+
91+
checkContravariant(neverNone, 'Object?');
92+
93+
checkContravariant(
94+
typeParameterTypeNone(
95+
typeParameter('T', bound: neverNone),
96+
),
97+
'Object?',
8798
);
8899
}
89100

0 commit comments

Comments
 (0)