Skip to content

Commit 2796749

Browse files
stereotype441commit-bot@chromium.org
authored andcommitted
Migration: add FixBuilder support for typed lists of expressions.
Change-Id: I30a36e9925fdd5a409b87a98962709de1ed3168b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/121263 Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
1 parent 14d4b93 commit 2796749

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

pkg/nnbd_migration/lib/src/fix_builder.dart

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,37 @@ abstract class FixBuilder extends GeneralizingAstVisitor<DartType> {
238238
return null;
239239
}
240240

241+
@override
242+
DartType visitListLiteral(ListLiteral node) {
243+
DartType contextType;
244+
var typeArguments = node.typeArguments;
245+
if (typeArguments != null) {
246+
var typeArgumentTypes = _visitTypeArgumentList(typeArguments);
247+
if (typeArgumentTypes.isNotEmpty) {
248+
contextType = typeArgumentTypes[0];
249+
} else {
250+
contextType = UnknownInferredType.instance;
251+
}
252+
} else {
253+
throw UnimplementedError(
254+
'TODO(paulberry): extract from surrounding context');
255+
}
256+
for (var listElement in node.elements) {
257+
if (listElement is Expression) {
258+
visitSubexpression(listElement, contextType);
259+
} else {
260+
throw UnimplementedError(
261+
'TODO(paulberry): handle spread and control flow');
262+
}
263+
}
264+
if (typeArguments != null) {
265+
return _typeProvider.listType2(contextType);
266+
} else {
267+
throw UnimplementedError(
268+
'TODO(paulberry): infer list type based on contents');
269+
}
270+
}
271+
241272
@override
242273
DartType visitLiteral(Literal node) {
243274
if (node is AdjacentStrings) {
@@ -424,6 +455,11 @@ abstract class FixBuilder extends GeneralizingAstVisitor<DartType> {
424455
return type;
425456
}
426457
}
458+
459+
/// Visits all the type arguments in a [TypeArgumentList] and returns the
460+
/// types they ger migrated to.
461+
List<DartType> _visitTypeArgumentList(TypeArgumentList arguments) =>
462+
[for (var argument in arguments.arguments) argument.accept(this)];
427463
}
428464

429465
/// Common supertype for problems reported by [FixBuilder.addProblem].

pkg/nnbd_migration/test/fix_builder_test.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,21 @@ f() => 1;
540540
visitSubexpression(findNode.integerLiteral('1'), 'int');
541541
}
542542

543+
test_listLiteral_typed() async {
544+
await analyze('''
545+
_f() => <int>[];
546+
''');
547+
visitSubexpression(findNode.listLiteral('['), 'List<int>');
548+
}
549+
550+
test_listLiteral_typed_visit_contents() async {
551+
await analyze('''
552+
_f(int/*?*/ x) => <int/*!*/>[x];
553+
''');
554+
visitSubexpression(findNode.listLiteral('['), 'List<int>',
555+
nullChecked: {findNode.simple('x]')});
556+
}
557+
543558
test_nullAssertion_promotes() async {
544559
await analyze('''
545560
_f(bool/*?*/ x) => x && x;

0 commit comments

Comments
 (0)