adjust declared types to work with dart 2 typing at runtime (#19007) * adjust declared types to work with dart 2 typing at runtime * review comments * update packages/flutter_tools/lib/src/ios/simulators.dart
diff --git a/packages/flutter_tools/lib/src/android/android_studio.dart b/packages/flutter_tools/lib/src/android/android_studio.dart index 46119f2..f224411 100644 --- a/packages/flutter_tools/lib/src/android/android_studio.dart +++ b/packages/flutter_tools/lib/src/android/android_studio.dart
@@ -150,7 +150,8 @@ final Iterable<Directory> directories = fs .directory(path) .listSync() - .where((FileSystemEntity e) => e is Directory); + .where((FileSystemEntity e) => e is Directory) + .cast<Directory>(); for (Directory directory in directories) { final String name = directory.basename; // An exact match, or something like 'Android Studio 3.0 Preview.app'.
diff --git a/packages/flutter_tools/lib/src/asset.dart b/packages/flutter_tools/lib/src/asset.dart index ba81d81..9ee330c 100644 --- a/packages/flutter_tools/lib/src/asset.dart +++ b/packages/flutter_tools/lib/src/asset.dart
@@ -10,6 +10,7 @@ import 'base/context.dart'; import 'base/file_system.dart'; import 'base/platform.dart'; +import 'base/utils.dart'; import 'build_info.dart'; import 'cache.dart'; import 'dart/package_map.dart'; @@ -268,20 +269,21 @@ final String fontsPath = fs.path.join(fs.path.absolute(Cache.flutterRoot), 'packages', 'flutter_tools', 'schema', 'material_fonts.yaml'); - return loadYaml(fs.file(fontsPath).readAsStringSync()); + return castStringKeyedMap(loadYaml(fs.file(fontsPath).readAsStringSync())); } final Map<String, dynamic> _materialFontsManifest = _readMaterialFontsManifest(); List<Map<String, dynamic>> _getMaterialFonts(String fontSet) { - return _materialFontsManifest[fontSet]; + final List<dynamic> fontsList = _materialFontsManifest[fontSet]; + return fontsList?.map<Map<String, dynamic>>(castStringKeyedMap)?.toList(); } List<_Asset> _getMaterialAssets(String fontSet) { final List<_Asset> result = <_Asset>[]; for (Map<String, dynamic> family in _getMaterialFonts(fontSet)) { - for (Map<String, dynamic> font in family['fonts']) { + for (Map<dynamic, dynamic> font in family['fonts']) { final Uri entryUri = fs.path.toUri(font['asset']); result.add(new _Asset( baseDir: fs.path.join(Cache.flutterRoot, 'bin', 'cache', 'artifacts', 'material_fonts'),
diff --git a/packages/flutter_tools/lib/src/base/utils.dart b/packages/flutter_tools/lib/src/base/utils.dart index a32eaff..f13c9c9 100644 --- a/packages/flutter_tools/lib/src/base/utils.dart +++ b/packages/flutter_tools/lib/src/base/utils.dart
@@ -231,6 +231,13 @@ value.toRadixString(16).padLeft(count, '0'); } +/// Given a data structure which is a Map of String to dynamic values, return +/// the same structure (`Map<String, dynamic>`) with the correct runtime types. +Map<String, dynamic> castStringKeyedMap(dynamic untyped) { + final Map<dynamic, dynamic> map = untyped; + return map.cast<String, dynamic>(); +} + Clock get clock => context[Clock]; typedef Future<Null> AsyncCallback();
diff --git a/packages/flutter_tools/lib/src/commands/daemon.dart b/packages/flutter_tools/lib/src/commands/daemon.dart index 9289943..a5451e3 100644 --- a/packages/flutter_tools/lib/src/commands/daemon.dart +++ b/packages/flutter_tools/lib/src/commands/daemon.dart
@@ -143,8 +143,12 @@ throw 'no domain for method: $method'; _domainMap[prefix].handleCommand(name, id, request['params'] ?? const <String, dynamic>{}); - } catch (error) { - _send(<String, dynamic>{'id': id, 'error': _toJsonable(error)}); + } catch (error, trace) { + _send(<String, dynamic>{ + 'id': id, + 'error': _toJsonable(error), + 'trace': '$trace', + }); } } @@ -184,14 +188,18 @@ if (_handlers.containsKey(command)) return _handlers[command](args); throw 'command not understood: $name.$command'; - }).then<Null>((dynamic result) { + }).then<dynamic>((dynamic result) { if (result == null) { _send(<String, dynamic>{'id': id}); } else { _send(<String, dynamic>{'id': id, 'result': _toJsonable(result)}); } }).catchError((dynamic error, dynamic trace) { - _send(<String, dynamic>{'id': id, 'error': _toJsonable(error)}); + _send(<String, dynamic>{ + 'id': id, + 'error': _toJsonable(error), + 'trace': '$trace', + }); }); } @@ -393,7 +401,7 @@ _sendAppEvent(app, 'started'); }); - await app._runInZone(this, () async { + await app._runInZone<Null>(this, () async { try { await runner.run( connectionInfoCompleter: connectionInfoCompleter, @@ -401,8 +409,11 @@ route: route, ); _sendAppEvent(app, 'stop'); - } catch (error) { - _sendAppEvent(app, 'stop', <String, dynamic>{'error': _toJsonable(error)}); + } catch (error, trace) { + _sendAppEvent(app, 'stop', <String, dynamic>{ + 'error': _toJsonable(error), + 'trace': '$trace', + }); } finally { fs.currentDirectory = cwd; _apps.remove(app); @@ -429,7 +440,7 @@ if (_inProgressHotReload != null) throw 'hot restart already in progress'; - _inProgressHotReload = app._runInZone(this, () { + _inProgressHotReload = app._runInZone<OperationResult>(this, () { return app.restart(fullRestart: fullRestart, pauseAfterRestart: pauseAfterRestart); }); return _inProgressHotReload.whenComplete(() { @@ -449,7 +460,7 @@ Future<Map<String, dynamic>> callServiceExtension(Map<String, dynamic> args) async { final String appId = _getStringArg(args, 'appId', required: true); final String methodName = _getStringArg(args, 'methodName'); - final Map<String, String> params = args['params'] ?? <String, String>{}; + final Map<String, dynamic> params = args['params'] == null ? <String, dynamic>{} : castStringKeyedMap(args['params']); final AppInstance app = _getApp(appId); if (app == null) @@ -741,10 +752,10 @@ _logger.close(); } - dynamic _runInZone(AppDomain domain, dynamic method()) { + Future<T> _runInZone<T>(AppDomain domain, dynamic method()) { _logger ??= new _AppRunLogger(domain, this, parent: logToStdout ? logger : null); - return context.run<dynamic>( + return context.run<T>( body: method, overrides: <Type, Generator>{ Logger: () => _logger,
diff --git a/packages/flutter_tools/lib/src/dart/analysis.dart b/packages/flutter_tools/lib/src/dart/analysis.dart index 65e6d10..104e2f9 100644 --- a/packages/flutter_tools/lib/src/dart/analysis.dart +++ b/packages/flutter_tools/lib/src/dart/analysis.dart
@@ -10,6 +10,7 @@ import '../base/io.dart'; import '../base/platform.dart'; import '../base/process_manager.dart'; +import '../base/utils.dart'; import '../globals.dart'; class AnalysisServer { @@ -136,8 +137,10 @@ void _handleAnalysisIssues(Map<String, dynamic> issueInfo) { // {"event":"analysis.errors","params":{"file":"/Users/.../lib/main.dart","errors":[]}} final String file = issueInfo['file']; - final List<AnalysisError> errors = issueInfo['errors'] - .map((Map<String, dynamic> json) => new AnalysisError(json)) + final List<dynamic> errorsList = issueInfo['errors']; + final List<AnalysisError> errors = errorsList + .map<Map<String, dynamic>>(castStringKeyedMap) + .map<AnalysisError>((Map<String, dynamic> json) => new AnalysisError(json)) .toList(); if (!_errorsController.isClosed) _errorsController.add(new FileAnalysisErrors(file, errors));
diff --git a/packages/flutter_tools/lib/src/flutter_manifest.dart b/packages/flutter_tools/lib/src/flutter_manifest.dart index 80fef7a..5a26f6d 100644 --- a/packages/flutter_tools/lib/src/flutter_manifest.dart +++ b/packages/flutter_tools/lib/src/flutter_manifest.dart
@@ -10,6 +10,7 @@ import 'package:yaml/yaml.dart'; import 'base/file_system.dart'; +import 'base/utils.dart'; import 'cache.dart'; import 'globals.dart'; @@ -33,13 +34,25 @@ return _createFromYaml(loadYaml(manifest)); } - static Future<FlutterManifest> _createFromYaml(Object yamlDocument) async { + static Future<FlutterManifest> _createFromYaml(dynamic yamlDocument) async { final FlutterManifest pubspec = new FlutterManifest._(); if (yamlDocument != null && !await _validate(yamlDocument)) return null; - pubspec._descriptor = yamlDocument ?? <String, dynamic>{}; - pubspec._flutterDescriptor = pubspec._descriptor['flutter'] ?? <String, dynamic>{}; + final Map<dynamic, dynamic> yamlMap = yamlDocument; + if (yamlMap != null) { + pubspec._descriptor = yamlMap.cast<String, dynamic>(); + } else { + pubspec._descriptor = <String, dynamic>{}; + } + + final Map<dynamic, dynamic> flutterMap = pubspec._descriptor['flutter']; + if (flutterMap != null) { + pubspec._flutterDescriptor = flutterMap.cast<String, dynamic>(); + } else { + pubspec._flutterDescriptor = <String, dynamic>{}; + } + return pubspec; } @@ -105,11 +118,22 @@ bool get isModule => moduleDescriptor != null; List<Map<String, dynamic>> get fontsDescriptor { - return _flutterDescriptor['fonts'] ?? const <Map<String, dynamic>>[]; + final List<dynamic> fontList = _flutterDescriptor['fonts']; + return fontList == null + ? const <Map<String, dynamic>>[] + : fontList.map<Map<String, dynamic>>(castStringKeyedMap).toList(); } List<Uri> get assets { - return _flutterDescriptor['assets']?.map(Uri.encodeFull)?.map(Uri.parse)?.toList() ?? const <Uri>[]; + final List<dynamic> assets = _flutterDescriptor['assets']; + if (assets == null) { + return const <Uri>[]; + } + return assets + .cast<String>() + .map<String>(Uri.encodeFull) + ?.map<Uri>(Uri.parse) + ?.toList(); } List<Font> _fonts; @@ -124,8 +148,8 @@ return <Font>[]; final List<Font> fonts = <Font>[]; - for (Map<String, dynamic> fontFamily in _flutterDescriptor['fonts']) { - final List<Map<String, dynamic>> fontFiles = fontFamily['fonts']; + for (Map<String, dynamic> fontFamily in fontsDescriptor) { + final List<dynamic> fontFiles = fontFamily['fonts']; final String familyName = fontFamily['family']; if (familyName == null) { printError('Warning: Missing family name for font.', emphasis: true); @@ -137,7 +161,7 @@ } final List<FontAsset> fontAssets = <FontAsset>[]; - for (Map<String, dynamic> fontFile in fontFiles) { + for (Map<dynamic, dynamic> fontFile in fontFiles) { final String asset = fontFile['asset']; if (asset == null) { printError('Warning: Missing asset in fonts for $familyName', emphasis: true); @@ -216,7 +240,7 @@ ); } -Future<bool> _validate(Object manifest) async { +Future<bool> _validate(dynamic manifest) async { final String schemaPath = buildSchemaPath(fs); final String schemaData = fs.file(schemaPath).readAsStringSync();
diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart index 2860303..a95f504 100644 --- a/packages/flutter_tools/lib/src/ios/mac.dart +++ b/packages/flutter_tools/lib/src/ios/mac.dart
@@ -395,7 +395,7 @@ '-allowProvisioningUpdates', '-allowProvisioningDeviceRegistration', ].contains(buildCommand); - }), + }).toList(), workingDirectory: app.appDirectory, ));
diff --git a/packages/flutter_tools/lib/src/ios/simulators.dart b/packages/flutter_tools/lib/src/ios/simulators.dart index d80fc2a..af9d646 100644 --- a/packages/flutter_tools/lib/src/ios/simulators.dart +++ b/packages/flutter_tools/lib/src/ios/simulators.dart
@@ -14,6 +14,7 @@ import '../base/platform.dart'; import '../base/process.dart'; import '../base/process_manager.dart'; +import '../base/utils.dart'; import '../build_info.dart'; import '../bundle.dart' as bundle; import '../device.dart'; @@ -95,7 +96,7 @@ for (String deviceCategory in devicesSection.keys) { final List<dynamic> devicesData = devicesSection[deviceCategory]; - for (Map<String, dynamic> data in devicesData.map(_castStringKeyedMap)) { + for (Map<String, dynamic> data in devicesData.map<Map<String, dynamic>>(castStringKeyedMap)) { devices.add(new SimDevice(deviceCategory, data)); } } @@ -103,11 +104,6 @@ return devices; } - Map<String, dynamic> _castStringKeyedMap(dynamic untyped) { - final Map<dynamic, dynamic> map = untyped; - return map.cast<String, dynamic>(); - } - /// Returns all the connected simulator devices. List<SimDevice> getConnectedDevices() { return getDevices().where((SimDevice device) => device.isBooted).toList(); @@ -123,23 +119,23 @@ ]); } - Future<Null> install(String deviceId, String appPath) { + Future<RunResult> install(String deviceId, String appPath) { return runCheckedAsync(<String>[_xcrunPath, 'simctl', 'install', deviceId, appPath]); } - Future<Null> uninstall(String deviceId, String appId) { + Future<RunResult> uninstall(String deviceId, String appId) { return runCheckedAsync(<String>[_xcrunPath, 'simctl', 'uninstall', deviceId, appId]); } - Future<Null> launch(String deviceId, String appIdentifier, [List<String> launchArgs]) { + Future<RunResult> launch(String deviceId, String appIdentifier, [List<String> launchArgs]) { final List<String> args = <String>[_xcrunPath, 'simctl', 'launch', deviceId, appIdentifier]; if (launchArgs != null) args.addAll(launchArgs); return runCheckedAsync(args); } - Future<void> takeScreenshot(String deviceId, String outputPath) { - return runCheckedAsync(<String>[_xcrunPath, 'simctl', 'io', deviceId, 'screenshot', outputPath]); + Future<void> takeScreenshot(String deviceId, String outputPath) async { + await runCheckedAsync(<String>[_xcrunPath, 'simctl', 'io', deviceId, 'screenshot', outputPath]); } } @@ -350,14 +346,14 @@ return criteria.reduce((bool a, bool b) => a && b); } - Future<Null> _setupUpdatedApplicationBundle(ApplicationPackage app, BuildInfo buildInfo, String mainPath, bool usesTerminalUi) async { + Future<void> _setupUpdatedApplicationBundle(ApplicationPackage app, BuildInfo buildInfo, String mainPath, bool usesTerminalUi) async { await _sideloadUpdatedAssetsForInstalledApplicationBundle(app, buildInfo, mainPath); if (!await _applicationIsInstalledAndRunning(app)) return _buildAndInstallApplicationBundle(app, buildInfo, mainPath, usesTerminalUi); } - Future<Null> _buildAndInstallApplicationBundle(ApplicationPackage app, BuildInfo buildInfo, String mainPath, bool usesTerminalUi) async { + Future<void> _buildAndInstallApplicationBundle(ApplicationPackage app, BuildInfo buildInfo, String mainPath, bool usesTerminalUi) async { // Step 1: Build the Xcode project. // The build mode for the simulator is always debug. @@ -389,7 +385,7 @@ await SimControl.instance.install(id, fs.path.absolute(bundle.path)); } - Future<Null> _sideloadUpdatedAssetsForInstalledApplicationBundle(ApplicationPackage app, BuildInfo buildInfo, String mainPath) { + Future<void> _sideloadUpdatedAssetsForInstalledApplicationBundle(ApplicationPackage app, BuildInfo buildInfo, String mainPath) { // When running in previewDart2 mode, we still need to run compiler to // produce kernel file for the application. return bundle.build(
diff --git a/packages/flutter_tools/lib/src/version.dart b/packages/flutter_tools/lib/src/version.dart index c08c444..6947a27 100644 --- a/packages/flutter_tools/lib/src/version.dart +++ b/packages/flutter_tools/lib/src/version.dart
@@ -388,7 +388,7 @@ return const VersionCheckStamp(); } - static VersionCheckStamp fromJson(Map<String, String> jsonObject) { + static VersionCheckStamp fromJson(Map<String, dynamic> jsonObject) { DateTime readDateTime(String property) { return jsonObject.containsKey(property) ? DateTime.parse(jsonObject[property])
diff --git a/packages/flutter_tools/lib/src/vmservice.dart b/packages/flutter_tools/lib/src/vmservice.dart index 1be0bd7..d2c05d8 100644 --- a/packages/flutter_tools/lib/src/vmservice.dart +++ b/packages/flutter_tools/lib/src/vmservice.dart
@@ -17,6 +17,7 @@ import 'base/common.dart'; import 'base/file_system.dart'; import 'base/io.dart' as io; +import 'base/utils.dart'; import 'globals.dart'; import 'vmservice_record_replay.dart'; @@ -256,7 +257,10 @@ /// Whether our connection to the VM service has been closed; bool get isClosed => _peer.isClosed; - Future<Null> get done => _peer.done; + + Future<Null> get done async { + await _peer.done; + } // Events Future<Stream<ServiceEvent>> get onDebugEvent => onEvent('Debug'); @@ -284,7 +288,7 @@ Map<String, dynamic> params, ) { return Future.any(<Future<Map<String, dynamic>>>[ - _peer.sendRequest(method, params), + _peer.sendRequest(method, params).then<Map<String, dynamic>>(castStringKeyedMap), _connectionError.future, ]); } @@ -334,8 +338,8 @@ } /// Reloads the VM. - Future<VM> getVM() { - return _vm.reload(); + Future<VM> getVM() async { + return await _vm.reload(); } Future<Null> waitForViews({int attempts = 5, int attemptSeconds = 1}) async { @@ -683,7 +687,7 @@ _embedder = map['_embedder']; // Remove any isolates which are now dead from the isolate cache. - _removeDeadIsolates(map['isolates']); + _removeDeadIsolates(map['isolates'].cast<Isolate>()); } final Map<String, ServiceObject> _cache = <String,ServiceObject>{}; @@ -851,7 +855,7 @@ } /// Invoke the RPC and return a [ServiceObject] response. - Future<ServiceObject> invokeRpc(String method, { + Future<T> invokeRpc<T extends ServiceObject>(String method, { Map<String, dynamic> params = const <String, dynamic>{}, Duration timeout, }) async { @@ -922,13 +926,13 @@ Uri packages, Uri assetsDirectory) { // TODO(goderbauer): Transfer Uri (instead of file path) when remote end supports it. - return invokeRpc('_flutter.runInView', - params: <String, dynamic> { - 'viewId': viewId, - 'mainScript': main.toFilePath(windows: false), - 'packagesFile': packages.toFilePath(windows: false), - 'assetDirectory': assetsDirectory.toFilePath(windows: false) - }); + return invokeRpc<ServiceMap>('_flutter.runInView', + params: <String, dynamic> { + 'viewId': viewId, + 'mainScript': main.toFilePath(windows: false), + 'packagesFile': packages.toFilePath(windows: false), + 'assetDirectory': assetsDirectory.toFilePath(windows: false) + }); } Future<Map<String, dynamic>> clearVMTimeline() { @@ -1324,7 +1328,7 @@ } Future<String> flutterPlatformOverride([String platform]) async { - final Map<String, String> result = await invokeFlutterExtensionRpcRaw( + final Map<String, dynamic> result = await invokeFlutterExtensionRpcRaw( 'ext.flutter.platformOverride', params: platform != null ? <String, dynamic>{ 'value': platform } : <String, String>{}, timeout: const Duration(seconds: 5),