mirror of
https://github.com/flutter/flutter
synced 2024-10-13 11:42:54 +00:00
[flutter_tools] forward flutter format to dart format and deprecate (#57829)
This commit is contained in:
parent
4f0c82b7a3
commit
7cdf26d0dc
|
@ -4,36 +4,18 @@
|
||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:args/args.dart';
|
||||||
|
|
||||||
|
import '../artifacts.dart';
|
||||||
import '../base/common.dart';
|
import '../base/common.dart';
|
||||||
import '../base/process.dart';
|
import '../base/process.dart';
|
||||||
import '../dart/sdk.dart';
|
import '../globals.dart' as globals;
|
||||||
import '../runner/flutter_command.dart';
|
import '../runner/flutter_command.dart';
|
||||||
|
|
||||||
class FormatCommand extends FlutterCommand {
|
class FormatCommand extends FlutterCommand {
|
||||||
FormatCommand() {
|
@override
|
||||||
argParser.addFlag('dry-run',
|
ArgParser get argParser => _argParser;
|
||||||
abbr: 'n',
|
final ArgParser _argParser = ArgParser.allowAnything();
|
||||||
help: 'Show which files would be modified but make no changes.',
|
|
||||||
defaultsTo: false,
|
|
||||||
negatable: false,
|
|
||||||
);
|
|
||||||
argParser.addFlag('set-exit-if-changed',
|
|
||||||
help: 'Return exit code 1 if there are any formatting changes.',
|
|
||||||
defaultsTo: false,
|
|
||||||
negatable: false,
|
|
||||||
);
|
|
||||||
argParser.addFlag('machine',
|
|
||||||
abbr: 'm',
|
|
||||||
help: 'Produce machine-readable JSON output.',
|
|
||||||
defaultsTo: false,
|
|
||||||
negatable: false,
|
|
||||||
);
|
|
||||||
argParser.addOption('line-length',
|
|
||||||
abbr: 'l',
|
|
||||||
help: 'Wrap lines longer than this length. Defaults to 80 characters.',
|
|
||||||
defaultsTo: '80',
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
final String name = 'format';
|
final String name = 'format';
|
||||||
|
@ -48,34 +30,25 @@ class FormatCommand extends FlutterCommand {
|
||||||
String get invocation => '${runner.executableName} $name <one or more paths>';
|
String get invocation => '${runner.executableName} $name <one or more paths>';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<FlutterCommandResult> runCommand() async {
|
bool get shouldUpdateCache => false;
|
||||||
if (argResults.rest.isEmpty) {
|
|
||||||
throwToolExit(
|
|
||||||
'No files specified to be formatted.\n'
|
|
||||||
'\n'
|
|
||||||
'To format all files in the current directory tree:\n'
|
|
||||||
'${runner.executableName} $name .\n'
|
|
||||||
'\n'
|
|
||||||
'$usage'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
final String dartfmt = sdkBinaryName('dartfmt');
|
@override
|
||||||
|
Future<FlutterCommandResult> runCommand() async {
|
||||||
|
final String dartBinary = globals.artifacts.getArtifactPath(Artifact.engineDartBinary);
|
||||||
|
globals.printError(
|
||||||
|
'"flutter format" is deprecated and will be removed in a'
|
||||||
|
' future release, use "dart format" instead.'
|
||||||
|
);
|
||||||
final List<String> command = <String>[
|
final List<String> command = <String>[
|
||||||
dartfmt,
|
dartBinary,
|
||||||
if (boolArg('dry-run')) '-n',
|
'format',
|
||||||
if (boolArg('machine')) '-m',
|
|
||||||
if (argResults['line-length'] != null) '-l ${argResults['line-length']}',
|
|
||||||
if (!boolArg('dry-run') && !boolArg('machine')) '-w',
|
|
||||||
if (boolArg('set-exit-if-changed')) '--set-exit-if-changed',
|
|
||||||
...argResults.rest,
|
...argResults.rest,
|
||||||
];
|
];
|
||||||
|
|
||||||
final int result = await processUtils.stream(command);
|
final int result = await processUtils.stream(command);
|
||||||
if (result != 0) {
|
if (result != 0) {
|
||||||
throwToolExit('Formatting failed: $result', exitCode: result);
|
throwToolExit('', exitCode: result);
|
||||||
}
|
}
|
||||||
|
|
||||||
return FlutterCommandResult.success();
|
return FlutterCommandResult.success();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,104 +0,0 @@
|
||||||
// Copyright 2014 The Flutter Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
import 'package:args/command_runner.dart';
|
|
||||||
import 'package:flutter_tools/src/base/file_system.dart';
|
|
||||||
import 'package:flutter_tools/src/cache.dart';
|
|
||||||
import 'package:flutter_tools/src/commands/format.dart';
|
|
||||||
import 'package:flutter_tools/src/globals.dart' as globals;
|
|
||||||
|
|
||||||
import '../../src/common.dart';
|
|
||||||
import '../../src/context.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
group('format', () {
|
|
||||||
Directory tempDir;
|
|
||||||
|
|
||||||
setUp(() {
|
|
||||||
Cache.disableLocking();
|
|
||||||
tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_format_test.');
|
|
||||||
});
|
|
||||||
|
|
||||||
tearDown(() {
|
|
||||||
tryToDelete(tempDir);
|
|
||||||
});
|
|
||||||
|
|
||||||
testUsingContext('a file', () async {
|
|
||||||
final String projectPath = await createProject(tempDir);
|
|
||||||
|
|
||||||
final File srcFile = globals.fs.file(globals.fs.path.join(projectPath, 'lib', 'main.dart'));
|
|
||||||
final String original = srcFile.readAsStringSync();
|
|
||||||
srcFile.writeAsStringSync(original.replaceFirst('main()', 'main( )'));
|
|
||||||
|
|
||||||
final FormatCommand command = FormatCommand();
|
|
||||||
final CommandRunner<void> runner = createTestCommandRunner(command);
|
|
||||||
await runner.run(<String>['format', srcFile.path]);
|
|
||||||
|
|
||||||
final String formatted = srcFile.readAsStringSync();
|
|
||||||
expect(formatted, original);
|
|
||||||
});
|
|
||||||
|
|
||||||
testUsingContext('dry-run', () async {
|
|
||||||
final String projectPath = await createProject(tempDir);
|
|
||||||
|
|
||||||
final File srcFile = globals.fs.file(
|
|
||||||
globals.fs.path.join(projectPath, 'lib', 'main.dart'));
|
|
||||||
final String nonFormatted = srcFile.readAsStringSync().replaceFirst(
|
|
||||||
'main()', 'main( )');
|
|
||||||
srcFile.writeAsStringSync(nonFormatted);
|
|
||||||
|
|
||||||
final FormatCommand command = FormatCommand();
|
|
||||||
final CommandRunner<void> runner = createTestCommandRunner(command);
|
|
||||||
await runner.run(<String>['format', '--dry-run', srcFile.path]);
|
|
||||||
|
|
||||||
final String shouldNotFormatted = srcFile.readAsStringSync();
|
|
||||||
expect(shouldNotFormatted, nonFormatted);
|
|
||||||
});
|
|
||||||
|
|
||||||
testUsingContext('dry-run with set-exit-if-changed', () async {
|
|
||||||
final String projectPath = await createProject(tempDir);
|
|
||||||
|
|
||||||
final File srcFile = globals.fs.file(
|
|
||||||
globals.fs.path.join(projectPath, 'lib', 'main.dart'));
|
|
||||||
final String nonFormatted = srcFile.readAsStringSync().replaceFirst(
|
|
||||||
'main()', 'main( )');
|
|
||||||
srcFile.writeAsStringSync(nonFormatted);
|
|
||||||
|
|
||||||
final FormatCommand command = FormatCommand();
|
|
||||||
final CommandRunner<void> runner = createTestCommandRunner(command);
|
|
||||||
|
|
||||||
expect(runner.run(<String>[
|
|
||||||
'format', '--dry-run', '--set-exit-if-changed', srcFile.path,
|
|
||||||
]), throwsException);
|
|
||||||
|
|
||||||
final String shouldNotFormatted = srcFile.readAsStringSync();
|
|
||||||
expect(shouldNotFormatted, nonFormatted);
|
|
||||||
});
|
|
||||||
|
|
||||||
testUsingContext('line-length', () async {
|
|
||||||
const int lineLengthShort = 50;
|
|
||||||
const int lineLengthLong = 120;
|
|
||||||
final String projectPath = await createProject(tempDir);
|
|
||||||
|
|
||||||
final File srcFile = globals.fs.file(
|
|
||||||
globals.fs.path.join(projectPath, 'lib', 'main.dart'));
|
|
||||||
final String nonFormatted = srcFile.readAsStringSync();
|
|
||||||
srcFile.writeAsStringSync(
|
|
||||||
nonFormatted.replaceFirst('main()',
|
|
||||||
'main(anArgument1, anArgument2, anArgument3, anArgument4, anArgument5)'));
|
|
||||||
|
|
||||||
final String nonFormattedWithLongLine = srcFile.readAsStringSync();
|
|
||||||
final FormatCommand command = FormatCommand();
|
|
||||||
final CommandRunner<void> runner = createTestCommandRunner(command);
|
|
||||||
|
|
||||||
await runner.run(<String>['format', '--line-length', '$lineLengthLong', srcFile.path]);
|
|
||||||
final String notFormatted = srcFile.readAsStringSync();
|
|
||||||
expect(nonFormattedWithLongLine, notFormatted);
|
|
||||||
|
|
||||||
await runner.run(<String>['format', '--line-length', '$lineLengthShort', srcFile.path]);
|
|
||||||
final String shouldFormatted = srcFile.readAsStringSync();
|
|
||||||
expect(nonFormattedWithLongLine, isNot(shouldFormatted));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
// Copyright 2014 The Flutter Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
import 'package:args/command_runner.dart';
|
||||||
|
import 'package:file/memory.dart';
|
||||||
|
import 'package:flutter_tools/src/artifacts.dart';
|
||||||
|
import 'package:flutter_tools/src/base/file_system.dart';
|
||||||
|
import 'package:flutter_tools/src/commands/format.dart';
|
||||||
|
import 'package:flutter_tools/src/globals.dart' as globals;
|
||||||
|
|
||||||
|
import '../../src/common.dart';
|
||||||
|
import '../../src/context.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
testUsingContext('flutter format forward all arguments to dart format and '
|
||||||
|
'prints deprecation warning', () async {
|
||||||
|
final CommandRunner<void> runner = CommandRunner<void>('flutter', 'test')
|
||||||
|
..addCommand(FormatCommand());
|
||||||
|
await runner.run(<String>['format', 'a', 'b', 'c']);
|
||||||
|
|
||||||
|
expect(testLogger.errorText, contains('"flutter format" is deprecated'));
|
||||||
|
expect((globals.processManager as FakeProcessManager).hasRemainingExpectations, false);
|
||||||
|
}, overrides: <Type, Generator>{
|
||||||
|
FileSystem: () => MemoryFileSystem.test(),
|
||||||
|
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[
|
||||||
|
FakeCommand(
|
||||||
|
command: <String>[
|
||||||
|
globals.artifacts.getArtifactPath(Artifact.engineDartBinary),
|
||||||
|
'format',
|
||||||
|
'a',
|
||||||
|
'b',
|
||||||
|
'c',
|
||||||
|
],
|
||||||
|
)
|
||||||
|
])
|
||||||
|
});
|
||||||
|
}
|
Loading…
Reference in a new issue