Control flow collections: flutter_tools/ (#147450)

This pull request aims for improved readability, based on issue #146600.

```dart
// before
List<SupportedPlatform> getSupportedPlatforms({bool includeRoot = false}) {
  final List<SupportedPlatform> platforms = includeRoot
      ? <SupportedPlatform>[SupportedPlatform.root]
      : <SupportedPlatform>[];
  if (android.existsSync()) {
    platforms.add(SupportedPlatform.android);
  }
  if (ios.exists) {
    platforms.add(SupportedPlatform.ios);
  }
  if (web.existsSync()) {
    platforms.add(SupportedPlatform.web);
  }
  if (macos.existsSync()) {
    platforms.add(SupportedPlatform.macos);
  }
  if (linux.existsSync()) {
    platforms.add(SupportedPlatform.linux);
  }
  if (windows.existsSync()) {
    platforms.add(SupportedPlatform.windows);
  }
  if (fuchsia.existsSync()) {
    platforms.add(SupportedPlatform.fuchsia);
  }
  return platforms;
}

// after
List<SupportedPlatform> getSupportedPlatforms({bool includeRoot = false}) {
  return <SupportedPlatform>[
    if (includeRoot)          SupportedPlatform.root,
    if (android.existsSync()) SupportedPlatform.android,
    if (ios.exists)           SupportedPlatform.ios,
    if (web.existsSync())     SupportedPlatform.web,
    if (macos.existsSync())   SupportedPlatform.macos,
    if (linux.existsSync())   SupportedPlatform.linux,
    if (windows.existsSync()) SupportedPlatform.windows,
    if (fuchsia.existsSync()) SupportedPlatform.fuchsia,
  ];
}
```
This commit is contained in:
Nate 2024-05-02 16:19:18 -06:00 committed by GitHub
parent 7436cc25eb
commit 5d1bfdcb87
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
26 changed files with 219 additions and 457 deletions

View File

@ -384,17 +384,12 @@ class AndroidStudio {
final String? homeDirPath = globals.fsUtils.homeDirPath;
if (homeDirPath != null && globals.fs.directory(homeDirPath).existsSync()) {
final Directory homeDir = globals.fs.directory(homeDirPath);
final List<Directory> directoriesToSearch = <Directory>[homeDir];
// >=4.1 has new install location at $HOME/.cache/Google
final String cacheDirPath =
globals.fs.path.join(homeDirPath, '.cache', 'Google');
if (globals.fs.isDirectorySync(cacheDirPath)) {
directoriesToSearch.add(globals.fs.directory(cacheDirPath));
}
final String cacheDirPath = globals.fs.path.join(homeDirPath, '.cache', 'Google');
final List<Directory> directoriesToSearch = <Directory>[
globals.fs.directory(homeDirPath),
if (globals.fs.isDirectorySync(cacheDirPath)) globals.fs.directory(cacheDirPath),
];
final List<Directory> entities = <Directory>[];

View File

@ -811,14 +811,11 @@ class AndroidGradleBuilder implements AndroidBuilder {
_logger.printError(result.stderr, wrap: false);
return const <String>[];
}
final List<String> options = <String>[];
for (final String line in LineSplitter.split(result.stdout)) {
final RegExpMatch? match = _kBuildVariantRegex.firstMatch(line);
if (match != null) {
options.add(match.namedGroup(_kBuildVariantRegexGroupName)!);
}
}
return options;
return <String>[
for (final String line in LineSplitter.split(result.stdout))
if (_kBuildVariantRegex.firstMatch(line) case final RegExpMatch match)
match.namedGroup(_kBuildVariantRegexGroupName)!,
];
}
@override

View File

@ -469,18 +469,15 @@ class _SymbolNode {
}
Map<String, Object?> toJson() {
final Map<String, Object?> json = <String, Object?>{
final List<Map<String, Object?>> childrenAsJson = <Map<String, Object?>>[
for (final _SymbolNode child in children) child.toJson(),
];
return <String, Object?>{
'n': name,
'value': byteSize,
if (childrenAsJson.isNotEmpty) 'children': childrenAsJson,
};
final List<Map<String, Object?>> childrenAsJson = <Map<String, Object?>>[];
for (final _SymbolNode child in children) {
childrenAsJson.add(child.toJson());
}
if (childrenAsJson.isNotEmpty) {
json['children'] = childrenAsJson;
}
return json;
}
}

View File

@ -71,14 +71,11 @@ class DeferredComponent {
/// status, but will result in [loadingUnits] returning an empty set.
void assignLoadingUnits(List<LoadingUnit> allLoadingUnits) {
_assigned = true;
_loadingUnits = <LoadingUnit>{};
for (final String lib in libraries) {
for (final LoadingUnit loadingUnit in allLoadingUnits) {
if (loadingUnit.libraries.contains(lib)) {
_loadingUnits!.add(loadingUnit);
}
}
}
_loadingUnits = <LoadingUnit>{
for (final String lib in libraries)
for (final LoadingUnit loadingUnit in allLoadingUnits)
if (loadingUnit.libraries.contains(lib)) loadingUnit,
};
}
/// Provides a human readable string representation of the
@ -193,21 +190,16 @@ class LoadingUnit {
} on FormatException catch (e) {
logger.printError('Loading unit manifest at `${manifestFile.path}` was invalid JSON:\n$e');
}
final List<LoadingUnit> loadingUnits = <LoadingUnit>[];
// Setup android source directory
if (manifest != null) {
for (final dynamic loadingUnitMetadata in manifest['loadingUnits'] as List<dynamic>) {
final Map<String, dynamic> loadingUnitMap = loadingUnitMetadata as Map<String, dynamic>;
if (loadingUnitMap['id'] == 1) {
continue; // Skip base unit
}
loadingUnits.add(LoadingUnit(
// Set up android source directory
return <LoadingUnit>[
if (manifest?['loadingUnits'] case final List<dynamic> loadingUnits)
for (final Map<String, dynamic> loadingUnitMap in loadingUnits.cast<Map<String, dynamic>>())
if (loadingUnitMap['id'] != 1) // skip base unit
LoadingUnit(
id: loadingUnitMap['id'] as int,
path: loadingUnitMap['path'] as String,
libraries: List<String>.from(loadingUnitMap['libraries'] as List<dynamic>)),
);
}
}
return loadingUnits;
libraries: List<String>.from(loadingUnitMap['libraries'] as List<dynamic>),
),
];
}
}

View File

@ -69,13 +69,10 @@ class _DefaultShutdownHooks implements ShutdownHooks {
);
_shutdownHooksRunning = true;
try {
final List<Future<dynamic>> futures = <Future<dynamic>>[];
for (final ShutdownHook shutdownHook in registeredHooks) {
final FutureOr<dynamic> result = shutdownHook();
if (result is Future<dynamic>) {
futures.add(result);
}
}
final List<Future<dynamic>> futures = <Future<dynamic>>[
for (final ShutdownHook shutdownHook in registeredHooks)
if (shutdownHook() case final Future<dynamic> result) result,
];
await Future.wait<dynamic>(futures);
} finally {
_shutdownHooksRunning = false;

View File

@ -182,21 +182,13 @@ abstract class Target {
List<File> outputs,
Environment environment,
) {
final File stamp = _findStampFile(environment);
final List<String> inputPaths = <String>[];
for (final File input in inputs) {
inputPaths.add(input.path);
}
final List<String> outputPaths = <String>[];
for (final File output in outputs) {
outputPaths.add(output.path);
}
final String? key = buildKey;
String getPath(File file) => file.path;
final Map<String, Object> result = <String, Object>{
'inputs': inputPaths,
'outputs': outputPaths,
if (key != null) 'buildKey': key,
'inputs': inputs.map(getPath).toList(),
'outputs': outputs.map(getPath).toList(),
if (buildKey case final String key) 'buildKey': key,
};
final File stamp = _findStampFile(environment);
if (!stamp.existsSync()) {
stamp.createSync();
}

View File

@ -58,20 +58,12 @@ class DepfileService {
/// The [file] contains a list of newline separated file URIs. The output
/// file must be manually specified.
Depfile parseDart2js(File file, File output) {
final List<File> inputs = <File>[];
for (final String rawUri in file.readAsLinesSync()) {
if (rawUri.trim().isEmpty) {
continue;
}
final Uri? fileUri = Uri.tryParse(rawUri);
if (fileUri == null) {
continue;
}
if (fileUri.scheme != 'file') {
continue;
}
inputs.add(_fileSystem.file(fileUri));
}
final List<File> inputs = <File>[
for (final String rawUri in file.readAsLinesSync())
if (rawUri.trim().isNotEmpty)
if (Uri.tryParse(rawUri) case final Uri fileUri when fileUri.scheme == 'file')
_fileSystem.file(fileUri),
];
return Depfile(inputs, <File>[output]);
}

View File

@ -37,15 +37,11 @@ class DeferredComponentsGenSnapshotValidatorTarget extends Target {
/// The abis to validate.
List<String> get _abis {
final List<String> abis = <String>[];
for (final AndroidAotDeferredComponentsBundle target in deferredComponentsDependencies) {
if (deferredComponentsTargets.contains(target.name)) {
abis.add(
getAndroidArchForName(getNameForTargetPlatform(target.dependency.targetPlatform)).archName
);
}
}
return abis;
return <String>[
for (final AndroidAotDeferredComponentsBundle target in deferredComponentsDependencies)
if (deferredComponentsTargets.contains(target.name))
getAndroidArchForName(getNameForTargetPlatform(target.dependency.targetPlatform)).archName,
];
}
@override

View File

@ -112,19 +112,11 @@ abstract class BuildFrameworkCommand extends BuildSubCommand {
late final FlutterProject project = FlutterProject.current();
Future<List<BuildInfo>> getBuildInfos() async {
final List<BuildInfo> buildInfos = <BuildInfo>[];
if (boolArg('debug')) {
buildInfos.add(await getBuildInfo(forcedBuildMode: BuildMode.debug));
}
if (boolArg('profile')) {
buildInfos.add(await getBuildInfo(forcedBuildMode: BuildMode.profile));
}
if (boolArg('release')) {
buildInfos.add(await getBuildInfo(forcedBuildMode: BuildMode.release));
}
return buildInfos;
return <BuildInfo>[
if (boolArg('debug')) await getBuildInfo(forcedBuildMode: BuildMode.debug),
if (boolArg('profile')) await getBuildInfo(forcedBuildMode: BuildMode.profile),
if (boolArg('release')) await getBuildInfo(forcedBuildMode: BuildMode.release),
];
}
@override

View File

@ -101,14 +101,11 @@ class CustomDeviceLogReader extends DeviceLogReader {
/// [logLines] as done.
@override
Future<void> dispose() async {
final List<Future<void>> futures = <Future<void>>[];
for (final StreamSubscription<String> subscription in subscriptions) {
futures.add(subscription.cancel());
}
futures.add(logLinesController.close());
final List<Future<void>> futures = <Future<void>>[
for (final StreamSubscription<String> subscription in subscriptions)
subscription.cancel(),
logLinesController.close(),
];
await Future.wait(futures);
}

View File

@ -196,42 +196,16 @@ class _DefaultDoctorValidatorsProvider implements DoctorValidatorsProvider {
@override
List<Workflow> get workflows {
if (_workflows == null) {
_workflows = <Workflow>[];
if (globals.iosWorkflow!.appliesToHostPlatform) {
_workflows!.add(globals.iosWorkflow!);
}
if (androidWorkflow?.appliesToHostPlatform ?? false) {
_workflows!.add(androidWorkflow!);
}
if (fuchsiaWorkflow?.appliesToHostPlatform ?? false) {
_workflows!.add(fuchsiaWorkflow!);
}
if (linuxWorkflow.appliesToHostPlatform) {
_workflows!.add(linuxWorkflow);
}
if (macOSWorkflow.appliesToHostPlatform) {
_workflows!.add(macOSWorkflow);
}
if (windowsWorkflow?.appliesToHostPlatform ?? false) {
_workflows!.add(windowsWorkflow!);
}
if (webWorkflow.appliesToHostPlatform) {
_workflows!.add(webWorkflow);
}
if (customDeviceWorkflow.appliesToHostPlatform) {
_workflows!.add(customDeviceWorkflow);
}
}
return _workflows!;
return _workflows ??= <Workflow>[
if (globals.iosWorkflow!.appliesToHostPlatform) globals.iosWorkflow!,
if (androidWorkflow?.appliesToHostPlatform ?? false) androidWorkflow!,
if (fuchsiaWorkflow?.appliesToHostPlatform ?? false) fuchsiaWorkflow!,
if (linuxWorkflow.appliesToHostPlatform) linuxWorkflow,
if (macOSWorkflow.appliesToHostPlatform) macOSWorkflow,
if (windowsWorkflow?.appliesToHostPlatform ?? false) windowsWorkflow!,
if (webWorkflow.appliesToHostPlatform) webWorkflow,
if (customDeviceWorkflow.appliesToHostPlatform) customDeviceWorkflow,
];
}
}

View File

@ -316,14 +316,11 @@ public final class GeneratedPluginRegistrant {
''';
List<Map<String, Object?>> _extractPlatformMaps(List<Plugin> plugins, String type) {
final List<Map<String, Object?>> pluginConfigs = <Map<String, Object?>>[];
for (final Plugin p in plugins) {
final PluginPlatform? platformPlugin = p.platforms[type];
if (platformPlugin != null) {
pluginConfigs.add(platformPlugin.toMap());
}
}
return pluginConfigs;
return <Map<String, Object?>>[
for (final Plugin plugin in plugins)
if (plugin.platforms[type] case final PluginPlatform platformPlugin)
platformPlugin.toMap(),
];
}
Future<void> _writeAndroidPluginRegistrant(FlutterProject project, List<Plugin> plugins) async {

View File

@ -188,15 +188,10 @@ class FuchsiaDevices extends PollingDeviceDiscovery {
if (text == null || text.isEmpty) {
return <Device>[];
}
final List<FuchsiaDevice> devices = <FuchsiaDevice>[];
for (final String line in text) {
final FuchsiaDevice? device = await _parseDevice(line);
if (device == null) {
continue;
}
devices.add(device);
}
return devices;
return <FuchsiaDevice>[
for (final String line in text)
if (await _parseDevice(line) case final FuchsiaDevice device) device,
];
}
@override

View File

@ -117,15 +117,12 @@ class IOSCoreDeviceControl {
Future<List<IOSCoreDevice>> getCoreDevices({
Duration timeout = const Duration(seconds: _minimumTimeoutInSeconds),
}) async {
final List<IOSCoreDevice> devices = <IOSCoreDevice>[];
final List<Object?> devicesSection = await _listCoreDevices(timeout: timeout);
for (final Object? deviceObject in devicesSection) {
if (deviceObject is Map<String, Object?>) {
devices.add(IOSCoreDevice.fromBetaJson(deviceObject, logger: _logger));
}
}
return devices;
return <IOSCoreDevice>[
for (final Object? deviceObject in devicesSection)
if (deviceObject is Map<String, Object?>)
IOSCoreDevice.fromBetaJson(deviceObject, logger: _logger),
];
}
/// Executes `devicectl` command to get list of apps installed on the device.
@ -192,15 +189,12 @@ class IOSCoreDeviceControl {
required String deviceId,
String? bundleId,
}) async {
final List<IOSCoreDeviceInstalledApp> apps = <IOSCoreDeviceInstalledApp>[];
final List<Object?> appsData = await _listInstalledApps(deviceId: deviceId, bundleId: bundleId);
for (final Object? appObject in appsData) {
if (appObject is Map<String, Object?>) {
apps.add(IOSCoreDeviceInstalledApp.fromBetaJson(appObject));
}
}
return apps;
return <IOSCoreDeviceInstalledApp>[
for (final Object? appObject in appsData)
if (appObject is Map<String, Object?>)
IOSCoreDeviceInstalledApp.fromBetaJson(appObject),
];
}
Future<bool> isAppInstalled({
@ -401,15 +395,12 @@ class IOSCoreDevice {
Map<String, Object?> data, {
required Logger logger,
}) {
final List<_IOSCoreDeviceCapability> capabilitiesList = <_IOSCoreDeviceCapability>[];
if (data['capabilities'] is List<Object?>) {
final List<Object?> capabilitiesData = data['capabilities']! as List<Object?>;
for (final Object? capabilityData in capabilitiesData) {
if (capabilityData != null && capabilityData is Map<String, Object?>) {
capabilitiesList.add(_IOSCoreDeviceCapability.fromBetaJson(capabilityData));
}
}
}
final List<_IOSCoreDeviceCapability> capabilitiesList = <_IOSCoreDeviceCapability>[
if (data['capabilities'] case final List<Object?> capabilitiesData)
for (final Object? capabilityData in capabilitiesData)
if (capabilityData != null && capabilityData is Map<String, Object?>)
_IOSCoreDeviceCapability.fromBetaJson(capabilityData),
];
_IOSCoreDeviceConnectionProperties? connectionProperties;
if (data['connectionProperties'] is Map<String, Object?>) {
@ -713,20 +704,17 @@ class _IOSCoreDeviceHardwareProperties {
required Logger logger,
}) {
_IOSCoreDeviceCPUType? cpuType;
if (data['cpuType'] is Map<String, Object?>) {
cpuType = _IOSCoreDeviceCPUType.fromBetaJson(data['cpuType']! as Map<String, Object?>);
if (data['cpuType'] case final Map<String, Object?> betaJson) {
cpuType = _IOSCoreDeviceCPUType.fromBetaJson(betaJson);
}
List<_IOSCoreDeviceCPUType>? supportedCPUTypes;
if (data['supportedCPUTypes'] is List<Object?>) {
final List<Object?> values = data['supportedCPUTypes']! as List<Object?>;
final List<_IOSCoreDeviceCPUType> cpuTypes = <_IOSCoreDeviceCPUType>[];
for (final Object? cpuTypeData in values) {
if (cpuTypeData is Map<String, Object?>) {
cpuTypes.add(_IOSCoreDeviceCPUType.fromBetaJson(cpuTypeData));
}
}
supportedCPUTypes = cpuTypes;
if (data['supportedCPUTypes'] case final List<Object?> values) {
supportedCPUTypes = <_IOSCoreDeviceCPUType>[
for (final Object? cpuTypeData in values)
if (cpuTypeData is Map<String, Object?>)
_IOSCoreDeviceCPUType.fromBetaJson(cpuTypeData),
];
}
List<int>? supportedDeviceFamilies;

View File

@ -782,14 +782,11 @@ class IOSDevice extends Device {
final List<Future<Uri?>> discoveryOptions = <Future<Uri?>>[
vmUrlFromMDns,
];
// vmServiceDiscovery uses device logs (`idevicesyslog`), which doesn't work
// on wireless devices.
if (vmServiceDiscovery != null && !isWirelesslyConnected) {
final Future<Uri?> vmUrlFromLogs = vmServiceDiscovery.uri;
discoveryOptions.add(vmUrlFromLogs);
}
if (vmServiceDiscovery != null && !isWirelesslyConnected)
vmServiceDiscovery.uri,
];
Uri? localUri = await Future.any(
<Future<Uri?>>[...discoveryOptions, cancelCompleter.future],

View File

@ -183,20 +183,14 @@ class SimControl {
/// Returns all the connected simulator devices.
Future<List<BootedSimDevice>> getConnectedDevices() async {
final List<BootedSimDevice> devices = <BootedSimDevice>[];
final Map<String, Object?> devicesSection = await _listBootedDevices();
for (final String deviceCategory in devicesSection.keys) {
final Object? devicesData = devicesSection[deviceCategory];
if (devicesData != null && devicesData is List<Object?>) {
for (final Map<String, Object?> data in devicesData.map<Map<String, Object?>?>(castStringKeyedMap).whereType<Map<String, Object?>>()) {
devices.add(BootedSimDevice(deviceCategory, data));
}
}
}
return devices;
return <BootedSimDevice>[
for (final String deviceCategory in devicesSection.keys)
if (devicesSection[deviceCategory] case final List<Object?> devicesData)
for (final Object? data in devicesData.map<Map<String, Object?>?>(castStringKeyedMap))
if (data is Map<String, Object?>) BootedSimDevice(deviceCategory, data),
];
}
Future<bool> isInstalled(String deviceId, String appId) {

View File

@ -298,38 +298,29 @@ class Plugin {
if (yaml == null) {
return <String>['Invalid "platforms" specification.'];
}
final List<String> errors = <String>[];
if (isInvalid(AndroidPlugin.kConfigKey, AndroidPlugin.validate)) {
errors.add('Invalid "android" plugin specification.');
}
if (isInvalid(IOSPlugin.kConfigKey, IOSPlugin.validate)) {
errors.add('Invalid "ios" plugin specification.');
}
if (isInvalid(LinuxPlugin.kConfigKey, LinuxPlugin.validate)) {
errors.add('Invalid "linux" plugin specification.');
}
if (isInvalid(MacOSPlugin.kConfigKey, MacOSPlugin.validate)) {
errors.add('Invalid "macos" plugin specification.');
}
if (isInvalid(WindowsPlugin.kConfigKey, WindowsPlugin.validate)) {
errors.add('Invalid "windows" plugin specification.');
}
return errors;
return <String>[
if (isInvalid(AndroidPlugin.kConfigKey, AndroidPlugin.validate))
'Invalid "android" plugin specification.',
if (isInvalid(IOSPlugin.kConfigKey, IOSPlugin.validate))
'Invalid "ios" plugin specification.',
if (isInvalid(LinuxPlugin.kConfigKey, LinuxPlugin.validate))
'Invalid "linux" plugin specification.',
if (isInvalid(MacOSPlugin.kConfigKey, MacOSPlugin.validate))
'Invalid "macos" plugin specification.',
if (isInvalid(WindowsPlugin.kConfigKey, WindowsPlugin.validate))
'Invalid "windows" plugin specification.',
];
}
static List<String> _validateLegacyYaml(YamlMap yaml) {
final List<String> errors = <String>[];
if (yaml['androidPackage'] != null && yaml['androidPackage'] is! String) {
errors.add('The "androidPackage" must either be null or a string.');
}
if (yaml['iosPrefix'] != null && yaml['iosPrefix'] is! String) {
errors.add('The "iosPrefix" must either be null or a string.');
}
if (yaml['pluginClass'] != null && yaml['pluginClass'] is! String) {
errors.add('The "pluginClass" must either be null or a string..');
}
return errors;
return <String>[
if (yaml['androidPackage'] is! String?)
'The "androidPackage" must either be null or a string.',
if (yaml['iosPrefix'] is! String?)
'The "iosPrefix" must either be null or a string.',
if (yaml['pluginClass'] is! String?)
'The "pluginClass" must either be null or a string.',
];
}
static bool _supportsPlatform(YamlMap platformsYaml, String platformKey) {

View File

@ -288,29 +288,16 @@ class FlutterProject {
/// Returns a list of platform names that are supported by the project.
List<SupportedPlatform> getSupportedPlatforms({bool includeRoot = false}) {
final List<SupportedPlatform> platforms = includeRoot ? <SupportedPlatform>[SupportedPlatform.root] : <SupportedPlatform>[];
if (android.existsSync()) {
platforms.add(SupportedPlatform.android);
}
if (ios.exists) {
platforms.add(SupportedPlatform.ios);
}
if (web.existsSync()) {
platforms.add(SupportedPlatform.web);
}
if (macos.existsSync()) {
platforms.add(SupportedPlatform.macos);
}
if (linux.existsSync()) {
platforms.add(SupportedPlatform.linux);
}
if (windows.existsSync()) {
platforms.add(SupportedPlatform.windows);
}
if (fuchsia.existsSync()) {
platforms.add(SupportedPlatform.fuchsia);
}
return platforms;
return <SupportedPlatform>[
if (includeRoot) SupportedPlatform.root,
if (android.existsSync()) SupportedPlatform.android,
if (ios.exists) SupportedPlatform.ios,
if (web.existsSync()) SupportedPlatform.web,
if (macos.existsSync()) SupportedPlatform.macos,
if (linux.existsSync()) SupportedPlatform.linux,
if (windows.existsSync()) SupportedPlatform.windows,
if (fuchsia.existsSync()) SupportedPlatform.fuchsia,
];
}
/// The directory that will contain the example if an example exists.

View File

@ -59,137 +59,53 @@ class VariableDumpMachineProjectValidator extends MachineProjectValidator {
@override
Future<List<ProjectValidatorResult>> start(FlutterProject project) async {
final List<ProjectValidatorResult> result = <ProjectValidatorResult>[];
result.add(ProjectValidatorResult(
name: 'FlutterProject.directory',
value: _toJsonValue(project.directory.absolute.path),
status: StatusProjectValidator.info,
));
result.add(ProjectValidatorResult(
name: 'FlutterProject.metadataFile',
value: _toJsonValue(project.metadataFile.absolute.path),
status: StatusProjectValidator.info,
));
result.add(ProjectValidatorResult(
name: 'FlutterProject.android.exists',
value: _toJsonValue(project.android.existsSync()),
status: StatusProjectValidator.info,
));
result.add(ProjectValidatorResult(
name: 'FlutterProject.ios.exists',
value: _toJsonValue(project.ios.exists),
status: StatusProjectValidator.info,
));
result.add(ProjectValidatorResult(
name: 'FlutterProject.web.exists',
value: _toJsonValue(project.web.existsSync()),
status: StatusProjectValidator.info,
));
result.add(ProjectValidatorResult(
name: 'FlutterProject.macos.exists',
value: _toJsonValue(project.macos.existsSync()),
status: StatusProjectValidator.info,
));
result.add(ProjectValidatorResult(
name: 'FlutterProject.linux.exists',
value: _toJsonValue(project.linux.existsSync()),
status: StatusProjectValidator.info,
));
result.add(ProjectValidatorResult(
name: 'FlutterProject.windows.exists',
value: _toJsonValue(project.windows.existsSync()),
status: StatusProjectValidator.info,
));
result.add(ProjectValidatorResult(
name: 'FlutterProject.fuchsia.exists',
value: _toJsonValue(project.fuchsia.existsSync()),
status: StatusProjectValidator.info,
));
result.add(ProjectValidatorResult(
name: 'FlutterProject.android.isKotlin',
value: _toJsonValue(project.android.isKotlin),
status: StatusProjectValidator.info,
));
result.add(ProjectValidatorResult(
name: 'FlutterProject.ios.isSwift',
value: _toJsonValue(project.ios.isSwift),
status: StatusProjectValidator.info,
));
result.add(ProjectValidatorResult(
name: 'FlutterProject.isModule',
value: _toJsonValue(project.isModule),
status: StatusProjectValidator.info,
));
result.add(ProjectValidatorResult(
name: 'FlutterProject.isPlugin',
value: _toJsonValue(project.isPlugin),
status: StatusProjectValidator.info,
));
result.add(ProjectValidatorResult(
name: 'FlutterProject.manifest.appname',
value: _toJsonValue(project.manifest.appName),
status: StatusProjectValidator.info,
));
// FlutterVersion
final FlutterVersion version = FlutterVersion(
flutterRoot: Cache.flutterRoot!,
fs: fileSystem,
);
result.add(ProjectValidatorResult(
name: 'FlutterVersion.frameworkRevision',
value: _toJsonValue(version.frameworkRevision),
status: StatusProjectValidator.info,
));
final Map<String, Object?> result = <String, Object?>{
'FlutterProject.directory': project.directory.absolute.path,
'FlutterProject.metadataFile': project.metadataFile.absolute.path,
'FlutterProject.android.exists': project.android.existsSync(),
'FlutterProject.ios.exists': project.ios.exists,
'FlutterProject.web.exists': project.web.existsSync(),
'FlutterProject.macos.exists': project.macos.existsSync(),
'FlutterProject.linux.exists': project.linux.existsSync(),
'FlutterProject.windows.exists': project.windows.existsSync(),
'FlutterProject.fuchsia.exists': project.fuchsia.existsSync(),
'FlutterProject.android.isKotlin': project.android.isKotlin,
'FlutterProject.ios.isSwift': project.ios.isSwift,
'FlutterProject.isModule': project.isModule,
'FlutterProject.isPlugin': project.isPlugin,
'FlutterProject.manifest.appname': project.manifest.appName,
// FlutterVersion
'FlutterVersion.frameworkRevision': version.frameworkRevision,
// Platform
result.add(ProjectValidatorResult(
name: 'Platform.operatingSystem',
value: _toJsonValue(platform.operatingSystem),
status: StatusProjectValidator.info,
));
result.add(ProjectValidatorResult(
name: 'Platform.isAndroid',
value: _toJsonValue(platform.isAndroid),
status: StatusProjectValidator.info,
));
result.add(ProjectValidatorResult(
name: 'Platform.isIOS',
value: _toJsonValue(platform.isIOS),
status: StatusProjectValidator.info,
));
result.add(ProjectValidatorResult(
name: 'Platform.isWindows',
value: _toJsonValue(platform.isWindows),
status: StatusProjectValidator.info,
));
result.add(ProjectValidatorResult(
name: 'Platform.isMacOS',
value: _toJsonValue(platform.isMacOS),
status: StatusProjectValidator.info,
));
result.add(ProjectValidatorResult(
name: 'Platform.isFuchsia',
value: _toJsonValue(platform.isFuchsia),
status: StatusProjectValidator.info,
));
result.add(ProjectValidatorResult(
name: 'Platform.pathSeparator',
value: _toJsonValue(platform.pathSeparator),
status: StatusProjectValidator.info,
));
'Platform.operatingSystem': platform.operatingSystem,
'Platform.isAndroid': platform.isAndroid,
'Platform.isIOS': platform.isIOS,
'Platform.isWindows': platform.isWindows,
'Platform.isMacOS': platform.isMacOS,
'Platform.isFuchsia': platform.isFuchsia,
'Platform.pathSeparator': platform.pathSeparator,
// Cache
result.add(ProjectValidatorResult(
name: 'Cache.flutterRoot',
value: _toJsonValue(Cache.flutterRoot),
'Cache.flutterRoot': Cache.flutterRoot,
};
return <ProjectValidatorResult>[
for (final String key in result.keys)
ProjectValidatorResult(
name: key,
value: _toJsonValue(result[key]),
status: StatusProjectValidator.info,
));
return result;
),
];
}
@override

View File

@ -62,19 +62,14 @@ class ProxyValidator extends DoctorValidator {
}
Future<List<String>> _getLoopbackAddresses() async {
final List<String> loopBackAddresses = <String>['localhost'];
final List<NetworkInterface> networkInterfaces =
await listNetworkInterfaces(includeLinkLocal: true, includeLoopback: true);
for (final NetworkInterface networkInterface in networkInterfaces) {
for (final InternetAddress internetAddress in networkInterface.addresses) {
if (internetAddress.isLoopback) {
loopBackAddresses.add(internetAddress.address);
}
}
}
return loopBackAddresses;
return <String>[
'localhost',
for (final NetworkInterface networkInterface in networkInterfaces)
for (final InternetAddress internetAddress in networkInterface.addresses)
if (internetAddress.isLoopback) internetAddress.address,
];
}
}

View File

@ -1452,17 +1452,12 @@ abstract class ResidentRunner extends ResidentHandlers {
Future<void> enableObservatory() async {
assert(debuggingOptions.serveObservatory);
final List<Future<vm_service.Response?>> serveObservatoryRequests = <Future<vm_service.Response?>>[];
for (final FlutterDevice? device in flutterDevices) {
if (device == null) {
continue;
}
final List<Future<vm_service.Response?>> serveObservatoryRequests = <Future<vm_service.Response?>>[
for (final FlutterDevice? device in flutterDevices)
if (device != null)
// Notify the VM service if the user wants Observatory to be served.
serveObservatoryRequests.add(
device.vmService?.callMethodWrapper('_serveObservatory') ??
Future<vm_service.Response?>.value(),
);
}
device.vmService?.callMethodWrapper('_serveObservatory') ?? Future<vm_service.Response?>.value(),
];
try {
await Future.wait(serveObservatoryRequests);
} on vm_service.RPCError catch (e) {

View File

@ -35,11 +35,7 @@ class TestTimeRecorder {
@visibleForTesting
List<String> getPrintAsListForTesting() {
final List<String> result = <String>[];
for (final TestTimePhases phase in TestTimePhases.values) {
result.add(_getPrintStringForPhase(phase));
}
return result;
return TestTimePhases.values.map(_getPrintStringForPhase).toList();
}
@visibleForTesting

View File

@ -993,14 +993,11 @@ class FlutterVmService {
throw VmServiceDisappearedException();
}
final List<vm_service.IsolateRef> refs = <vm_service.IsolateRef>[];
for (final FlutterView flutterView in flutterViews) {
final vm_service.IsolateRef? uiIsolate = flutterView.uiIsolate;
if (uiIsolate != null) {
refs.add(uiIsolate);
}
}
return refs;
return <vm_service.IsolateRef>[
for (final FlutterView flutterView in flutterViews)
if (flutterView.uiIsolate case final vm_service.IsolateRef uiIsolate)
uiIsolate,
];
}
/// Attempt to retrieve the isolate with id [isolateId], or `null` if it has

View File

@ -52,12 +52,10 @@ abstract class WindowsApp extends ApplicationPackage {
globals.printError('Invalid prebuilt Windows app. Unable to extract from archive.');
return null;
}
final List<FileSystemEntity> exeFilesFound = <FileSystemEntity>[];
for (final FileSystemEntity file in tempDir.listSync()) {
if (file.basename.endsWith('.exe')) {
exeFilesFound.add(file);
}
}
final List<FileSystemEntity> exeFilesFound = <FileSystemEntity>[
for (final FileSystemEntity file in tempDir.listSync())
if (file.basename.endsWith('.exe')) file,
];
if (exeFilesFound.isEmpty) {
globals.printError('Cannot find .exe files in the zip archive.');

View File

@ -385,14 +385,11 @@ class IosProject extends XcodeBasedProject {
)?.cast<String>();
if (domains != null) {
final List<String> result = <String>[];
for (final String domain in domains) {
final RegExpMatch? match = _associatedDomainPattern.firstMatch(domain);
if (match != null) {
result.add(match.group(1)!);
}
}
return result;
return <String>[
for (final String domain in domains)
if (_associatedDomainPattern.firstMatch(domain) case final RegExpMatch match)
match.group(1)!,
];
}
}
}

View File

@ -836,14 +836,12 @@ class _FakeDeviceManager extends DeviceManager {
@override
Future<List<Device>> getAllDevices({DeviceDiscoveryFilter? filter}) async {
final List<Device> devices = <Device>[];
for (final FakeDeviceJsonData deviceJson in fakeDevices) {
if (filter?.deviceConnectionInterface == null ||
deviceJson.dev.connectionInterface == filter?.deviceConnectionInterface) {
devices.add(deviceJson.dev);
}
}
return devices;
final DeviceConnectionInterface? interface = filter?.deviceConnectionInterface;
return <Device>[
for (final FakeDeviceJsonData deviceJson in fakeDevices)
if (interface == null || deviceJson.dev.connectionInterface == interface)
deviceJson.dev,
];
}
@override