Improve arb FormatException error message (#56373)

This commit is contained in:
Shi-Hao Hong 2020-05-07 18:09:03 -07:00 committed by GitHub
parent 26dc70dc18
commit eadd30eb6c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 41 additions and 27 deletions

View File

@ -363,8 +363,16 @@ class AppResourceBundle {
factory AppResourceBundle(File file) {
assert(file != null);
// Assuming that the caller has verified that the file exists and is readable.
Map<String, dynamic> resources;
try {
resources = json.decode(file.readAsStringSync()) as Map<String, dynamic>;
} on FormatException catch (e) {
throw L10nException(
'The arb file ${file.path} has the following formatting issue: \n'
'${e.toString()}',
);
}
final Map<String, dynamic> resources = json.decode(file.readAsStringSync()) as Map<String, dynamic>;
String localeString = resources['@@locale'] as String;
if (localeString == null) {
final RegExp filenameRE = RegExp(r'^[^_]*_(\w+)\.arb$');

View File

@ -1284,40 +1284,46 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
});
});
test('should throw when failing to parse the arb file', () {
const String arbFileWithTrailingComma = '''
test(
'should throw with descriptive error message when failing to parse the '
'arb file',
() {
const String arbFileWithTrailingComma = '''
{
"title": "Stocks",
"@title": {
"description": "Title for the Stocks application"
},
}''';
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n')
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(arbFileWithTrailingComma);
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n')
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(arbFileWithTrailingComma);
final LocalizationsGenerator generator = LocalizationsGenerator(fs);
try {
generator.initialize(
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
final LocalizationsGenerator generator = LocalizationsGenerator(fs);
try {
generator.initialize(
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
);
generator.loadResources();
generator.writeOutputFiles();
} on L10nException catch (e) {
expect(e.message, contains('app_en.arb'));
expect(e.message, contains('FormatException'));
expect(e.message, contains('Unexpected character'));
return;
}
fail(
'should fail with an L10nException due to a trailing comma in the '
'arb file.'
);
generator.loadResources();
generator.writeOutputFiles();
} on FormatException catch (e) {
expect(e.message, contains('Unexpected character'));
return;
}
fail(
'should fail with a FormatException due to a trailing comma in the '
'arb file.'
);
});
},
);
test('should throw when resource is missing resource attribute', () {
const String arbFileWithMissingResourceAttribute = '''