Unverified Commit eadd30eb authored by Shi-Hao Hong's avatar Shi-Hao Hong Committed by GitHub

Improve arb FormatException error message (#56373)

parent 26dc70dc
......@@ -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$');
......
......@@ -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,
);
generator.loadResources();
generator.writeOutputFiles();
} on FormatException catch (e) {
expect(e.message, contains('Unexpected character'));
return;
}
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 a FormatException due to a trailing comma in the '
'arb file.'
);
});
fail(
'should fail with an L10nException due to a trailing comma in the '
'arb file.'
);
},
);
test('should throw when resource is missing resource attribute', () {
const String arbFileWithMissingResourceAttribute = '''
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment