Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

Commit 4ae2d3b

Browse files
authored
πŸ”₯ Do not format the messages file for gen-l10n (#119596)
* πŸ”₯ Do not format the messages file * βœ… Add test * βœ… Add the link to the test * βœ… Respect the path separator from the file system * βœ… Add the untranslated messages file existence test
1 parent cd118da commit 4ae2d3b

File tree

3 files changed

+76
-11
lines changed

3 files changed

+76
-11
lines changed

β€Žpackages/flutter_tools/lib/src/commands/generate_localizations.dart

+21-9
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,8 @@ class GenerateLocalizationsCommand extends FlutterCommand {
223223

224224
@override
225225
Future<FlutterCommandResult> runCommand() async {
226-
List<String> outputFileList;
226+
final List<String> outputFileList;
227+
File? untranslatedMessagesFile;
227228

228229
bool format = boolArg('format') ?? false;
229230

@@ -238,19 +239,21 @@ class GenerateLocalizationsCommand extends FlutterCommand {
238239
'To use the command line arguments, delete the l10n.yaml file in the '
239240
'Flutter project.\n\n'
240241
);
241-
outputFileList = generateLocalizations(
242+
final LocalizationsGenerator generator = generateLocalizations(
242243
logger: _logger,
243244
options: options,
244245
projectDir: _fileSystem.currentDirectory,
245246
fileSystem: _fileSystem,
246-
).outputFileList;
247+
);
248+
outputFileList = generator.outputFileList;
249+
untranslatedMessagesFile = generator.untranslatedMessagesFile;
247250
format = format || options.format;
248251
} else {
249252
final String inputPathString = stringArgDeprecated('arb-dir')!; // Has default value, cannot be null.
250253
final String? outputPathString = stringArgDeprecated('output-dir');
251254
final String outputFileString = stringArgDeprecated('output-localization-file')!; // Has default value, cannot be null.
252255
final String templateArbFileName = stringArgDeprecated('template-arb-file')!; // Has default value, cannot be null.
253-
final String? untranslatedMessagesFile = stringArgDeprecated('untranslated-messages-file');
256+
final String? untranslatedMessagesFilePath = stringArgDeprecated('untranslated-messages-file');
254257
final String classNameString = stringArgDeprecated('output-class')!; // Has default value, cannot be null.
255258
final List<String> preferredSupportedLocales = stringsArg('preferred-supported-locales');
256259
final String? headerString = stringArgDeprecated('header');
@@ -267,7 +270,7 @@ class GenerateLocalizationsCommand extends FlutterCommand {
267270
precacheLanguageAndRegionTags();
268271

269272
try {
270-
outputFileList = (LocalizationsGenerator(
273+
final LocalizationsGenerator generator = LocalizationsGenerator(
271274
fileSystem: _fileSystem,
272275
inputPathString: inputPathString,
273276
outputPathString: outputPathString,
@@ -282,15 +285,16 @@ class GenerateLocalizationsCommand extends FlutterCommand {
282285
useSyntheticPackage: useSyntheticPackage,
283286
projectPathString: projectPathString,
284287
areResourceAttributesRequired: areResourceAttributesRequired,
285-
untranslatedMessagesFile: untranslatedMessagesFile,
288+
untranslatedMessagesFile: untranslatedMessagesFilePath,
286289
usesNullableGetter: usesNullableGetter,
287290
useEscaping: useEscaping,
288291
logger: _logger,
289292
suppressWarnings: suppressWarnings,
290293
)
291294
..loadResources()
292-
..writeOutputFiles())
293-
.outputFileList;
295+
..writeOutputFiles();
296+
outputFileList = generator.outputFileList;
297+
untranslatedMessagesFile = generator.untranslatedMessagesFile;
294298
} on L10nException catch (e) {
295299
throwToolExit(e.message);
296300
}
@@ -301,8 +305,16 @@ class GenerateLocalizationsCommand extends FlutterCommand {
301305
if (outputFileList.isEmpty) {
302306
return FlutterCommandResult.success();
303307
}
308+
final List<String> formatFileList = outputFileList.toList();
309+
if (untranslatedMessagesFile != null) {
310+
// Don't format the messages file using `dart format`.
311+
formatFileList.remove(untranslatedMessagesFile.absolute.path);
312+
}
313+
if (formatFileList.isEmpty) {
314+
return FlutterCommandResult.success();
315+
}
304316
final String dartBinary = _artifacts.getArtifactPath(Artifact.engineDartBinary);
305-
final List<String> command = <String>[dartBinary, 'format', ...outputFileList];
317+
final List<String> command = <String>[dartBinary, 'format', ...formatFileList];
306318
final ProcessResult result = await _processManager.run(command);
307319
if (result.exitCode != 0) {
308320
throwToolExit('Formatting failed: $result', exitCode: result.exitCode);

β€Žpackages/flutter_tools/lib/src/localizations/gen_l10n.dart

+1-2
Original file line numberDiff line numberDiff line change
@@ -627,7 +627,6 @@ class LocalizationsGenerator {
627627

628628
/// A generated file that will contain the list of messages for each locale
629629
/// that do not have a translation yet.
630-
@visibleForTesting
631630
final File? untranslatedMessagesFile;
632631

633632
/// The file that contains the list of inputs and outputs for generating
@@ -824,7 +823,7 @@ class LocalizationsGenerator {
824823
if (untranslatedMessagesFileString == null || untranslatedMessagesFileString.isEmpty) {
825824
return null;
826825
}
827-
826+
untranslatedMessagesFileString = untranslatedMessagesFileString.replaceAll(r'\', fileSystem.path.separator);
828827
return fileSystem.file(untranslatedMessagesFileString);
829828
}
830829

β€Žpackages/flutter_tools/test/commands.shard/hermetic/generate_localizations_test.dart

+54
Original file line numberDiff line numberDiff line change
@@ -265,4 +265,58 @@ format: true
265265
FileSystem: () => fileSystem,
266266
ProcessManager: () => FakeProcessManager.any(),
267267
});
268+
269+
// Regression test for https://github.com/flutter/flutter/issues/119594
270+
testUsingContext('dart format is working when the untranslated messages file is produced', () async {
271+
final File arbFile = fileSystem.file(fileSystem.path.join('lib', 'l10n', 'app_en.arb'))
272+
..createSync(recursive: true);
273+
arbFile.writeAsStringSync('''
274+
{
275+
"helloWorld": "Hello, World!",
276+
"untranslated": "Test untranslated message."
277+
}''');
278+
fileSystem.file(fileSystem.path.join('lib', 'l10n', 'app_es.arb'))
279+
..createSync(recursive: true)
280+
..writeAsStringSync('''
281+
{
282+
"helloWorld": "Hello, World!"
283+
}''');
284+
final File configFile = fileSystem.file('l10n.yaml')..createSync();
285+
configFile.writeAsStringSync('''
286+
format: true
287+
untranslated-messages-file: lib/l10n/untranslated.json
288+
''');
289+
final File pubspecFile = fileSystem.file('pubspec.yaml')..createSync();
290+
pubspecFile.writeAsStringSync(BasicProjectWithFlutterGen().pubspec);
291+
processManager.addCommand(
292+
const FakeCommand(
293+
command: <String>[
294+
'Artifact.engineDartBinary',
295+
'format',
296+
'/.dart_tool/flutter_gen/gen_l10n/app_localizations_en.dart',
297+
'/.dart_tool/flutter_gen/gen_l10n/app_localizations_es.dart',
298+
'/.dart_tool/flutter_gen/gen_l10n/app_localizations.dart',
299+
]
300+
)
301+
);
302+
final GenerateLocalizationsCommand command = GenerateLocalizationsCommand(
303+
fileSystem: fileSystem,
304+
logger: logger,
305+
artifacts: artifacts,
306+
processManager: processManager,
307+
);
308+
await createTestCommandRunner(command).run(<String>['gen-l10n']);
309+
310+
final Directory outputDirectory = fileSystem.directory(fileSystem.path.join('.dart_tool', 'flutter_gen', 'gen_l10n'));
311+
expect(outputDirectory.existsSync(), true);
312+
expect(outputDirectory.childFile('app_localizations_en.dart').existsSync(), true);
313+
expect(outputDirectory.childFile('app_localizations_es.dart').existsSync(), true);
314+
expect(outputDirectory.childFile('app_localizations.dart').existsSync(), true);
315+
final File untranslatedMessagesFile = fileSystem.file(fileSystem.path.join('lib', 'l10n', 'untranslated.json'));
316+
expect(untranslatedMessagesFile.existsSync(), true);
317+
expect(processManager, hasNoRemainingExpectations);
318+
}, overrides: <Type, Generator>{
319+
FileSystem: () => fileSystem,
320+
ProcessManager: () => FakeProcessManager.any(),
321+
});
268322
}

0 commit comments

Comments
Β (0)