Skip to content

Commit b1248de

Browse files
authored
Strong mode fix for datePatterns in material localizations (flutter#14117)
Code that uses dataPatterns[loc] expects it to contain Map<String, String>, not Map<String, dynamic>. Change gen_date_localizations.dart to generate datePatterns with a more precise type and regenerate date_localizations.dart.
1 parent 4488f58 commit b1248de

File tree

2 files changed

+1398
-41
lines changed

2 files changed

+1398
-41
lines changed

dev/tools/gen_date_localizations.dart

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ Future<Null> main(List<String> rawArgs) async {
7777
7878
// This file has been automatically generated. Please do not edit it manually.
7979
// To regenerate run (omit -w to print to console instead of the file):
80-
// dart dev/tools/gen_date_localizations.dart -w
80+
// dart --enable-asserts dev/tools/gen_date_localizations.dart -w
8181
8282
'''
8383
);
@@ -88,10 +88,19 @@ Future<Null> main(List<String> rawArgs) async {
8888
});
8989
buffer.writeln('};');
9090

91-
buffer.writeln('const Map<String, dynamic> datePatterns = const <String, dynamic> {');
91+
// Note: code that uses datePatterns expects it to contain values of type
92+
// Map<String, String> not Map<String, dynamic>.
93+
buffer.writeln('const Map<String, Map<String, String>> datePatterns = const <String, Map<String, String>> {');
9294
patternFiles.forEach((String locale, File data) {
93-
if (materialLocales.contains(locale))
94-
buffer.writeln(_jsonToMapEntry(locale, JSON.decode(data.readAsStringSync())));
95+
if (materialLocales.contains(locale)) {
96+
final Map<String, dynamic> patterns = JSON.decode(data.readAsStringSync());
97+
buffer.writeln("'$locale': const <String, String>{");
98+
patterns.forEach((String key, dynamic value) {
99+
assert(value is String);
100+
buffer.writeln(_jsonToMapEntry(key, value));
101+
});
102+
buffer.writeln('},');
103+
}
95104
});
96105
buffer.writeln('};');
97106

@@ -148,13 +157,16 @@ Iterable<String> _materialLocales() sync* {
148157
}
149158

150159
Map<String, File> _listIntlData(Directory directory) {
151-
final Map<String, File> result = <String, File>{};
160+
final Map<String, File> localeFiles = <String, File>{};
152161
for (FileSystemEntity entity in directory.listSync()) {
153162
final String filePath = entity.path;
154163
if (FileSystemEntity.isFileSync(filePath) && filePath.endsWith('.json')) {
155164
final String locale = path.basenameWithoutExtension(filePath);
156-
result[locale] = entity;
165+
localeFiles[locale] = entity;
157166
}
158167
}
159-
return result;
168+
169+
final List<String> locales = localeFiles.keys.toList(growable: false);
170+
locales.sort();
171+
return new Map<String, File>.fromIterable(locales, value: (dynamic locale) => localeFiles[locale]);
160172
}

0 commit comments

Comments
 (0)