Skip to content

Commit 1375e26

Browse files
stereotype441commit-bot@chromium.org
authored andcommitted
Minor NNBD fixes for type algebra and DartType.toString.
Change-Id: Iafb43852d5fad65a37a58b132a066b6aa3492da1 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/119062 Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Paul Berry <[email protected]>
1 parent 403c4af commit 1375e26

File tree

3 files changed

+63
-12
lines changed

3 files changed

+63
-12
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -765,8 +765,9 @@ abstract class FunctionTypeImpl extends TypeImpl implements FunctionType {
765765
name = e.name + subscript;
766766
counter++;
767767
}
768-
TypeParameterTypeImpl t =
769-
new TypeParameterTypeImpl(new TypeParameterElementImpl(name, -1));
768+
TypeParameterTypeImpl t = new TypeParameterTypeImpl(
769+
new TypeParameterElementImpl(name, -1),
770+
nullabilitySuffix: NullabilitySuffix.none);
770771
t.appendTo(typeParametersBuffer, visitedTypes,
771772
withNullability: withNullability);
772773
instantiateTypeArgs.add(t);

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,8 @@ abstract class _TypeSubstitutor extends DartTypeVisitor<DartType> {
434434
return type;
435435
}
436436

437-
return new InterfaceTypeImpl.explicit(type.element, typeArguments);
437+
return new InterfaceTypeImpl.explicit(type.element, typeArguments,
438+
nullabilitySuffix: (type as TypeImpl).nullabilitySuffix);
438439
}
439440

440441
@override

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

Lines changed: 58 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:analyzer/dart/element/element.dart';
6+
import 'package:analyzer/dart/element/nullability_suffix.dart';
67
import 'package:analyzer/dart/element/type.dart';
78
import 'package:analyzer/src/dart/element/type.dart';
89
import 'package:analyzer/src/dart/element/type_algebra.dart';
@@ -20,6 +21,7 @@ main() {
2021
defineReflectiveTests(SubstituteFromPairsTest);
2122
defineReflectiveTests(SubstituteFromUpperAndLowerBoundsTest);
2223
defineReflectiveTests(SubstituteTest);
24+
defineReflectiveTests(SubstituteWithNullabilityTest);
2325
});
2426
}
2527

@@ -276,19 +278,57 @@ class SubstituteTest extends _Base {
276278
var result = substitute(type, substitution);
277279
expect(result, same(type));
278280
}
281+
}
279282

280-
void _assertSubstitution(
281-
DartType type,
282-
Map<TypeParameterElement, DartType> substitution,
283-
String expected,
284-
) {
285-
var result = substitute(type, substitution);
286-
assertElementTypeString(result, expected);
283+
@reflectiveTest
284+
class SubstituteWithNullabilityTest extends _Base {
285+
SubstituteWithNullabilityTest() : super(useNnbd: true);
286+
287+
test_interface_none() async {
288+
// class A<T> {}
289+
var T = typeParameter('T');
290+
var A = class_(name: 'A', typeParameters: [T]);
291+
292+
var U = typeParameter('U');
293+
var type = interfaceType(A,
294+
typeArguments: [typeParameterType(U)],
295+
nullabilitySuffix: NullabilitySuffix.none);
296+
_assertSubstitution(type, {U: intType}, 'A<int>');
297+
}
298+
299+
test_interface_question() async {
300+
// class A<T> {}
301+
var T = typeParameter('T');
302+
var A = class_(name: 'A', typeParameters: [T]);
303+
304+
var U = typeParameter('U');
305+
var type = interfaceType(A,
306+
typeArguments: [typeParameterType(U)],
307+
nullabilitySuffix: NullabilitySuffix.question);
308+
_assertSubstitution(type, {U: intType}, 'A<int>?');
309+
}
310+
311+
test_interface_star() async {
312+
// class A<T> {}
313+
var T = typeParameter('T');
314+
var A = class_(name: 'A', typeParameters: [T]);
315+
316+
var U = typeParameter('U');
317+
var type = interfaceType(A,
318+
typeArguments: [typeParameterType(U)],
319+
nullabilitySuffix: NullabilitySuffix.star);
320+
_assertSubstitution(type, {U: intType}, 'A<int>*');
287321
}
288322
}
289323

290324
class _Base with ElementsTypesMixin {
291-
final typeProvider = TestTypeProvider();
325+
final TestTypeProvider typeProvider;
326+
327+
final bool useNnbd;
328+
329+
_Base({this.useNnbd = false})
330+
: typeProvider = TestTypeProvider(null, null,
331+
useNnbd ? NullabilitySuffix.none : NullabilitySuffix.question);
292332

293333
InterfaceType get boolType => typeProvider.boolType;
294334

@@ -297,11 +337,20 @@ class _Base with ElementsTypesMixin {
297337
InterfaceType get intType => typeProvider.intType;
298338

299339
/// Whether `DartType.toString()` with nullability should be asked.
300-
bool get typeToStringWithNullability => false;
340+
bool get typeToStringWithNullability => useNnbd;
301341

302342
void assertElementTypeString(DartType type, String expected) {
303343
TypeImpl typeImpl = type;
304344
expect(typeImpl.toString(withNullability: typeToStringWithNullability),
305345
expected);
306346
}
347+
348+
void _assertSubstitution(
349+
DartType type,
350+
Map<TypeParameterElement, DartType> substitution,
351+
String expected,
352+
) {
353+
var result = substitute(type, substitution);
354+
assertElementTypeString(result, expected);
355+
}
307356
}

0 commit comments

Comments
 (0)