remove some duplicated code (#656)

diff --git a/analysis_options.yaml b/analysis_options.yaml
index a747c44..1a9208e 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -14,6 +14,7 @@
 
 linter:
   rules:
+    - await_only_futures
     - directives_ordering
     - prefer_final_fields
     - prefer_final_in_for_each
diff --git a/lib/src/sdk_manager.dart b/lib/src/sdk_manager.dart
index af9a071..1e38eae 100644
--- a/lib/src/sdk_manager.dart
+++ b/lib/src/sdk_manager.dart
@@ -15,7 +15,7 @@
   static Sdk get sdk => _sdk ?? (_sdk = PlatformSdk());
 
   static FlutterSdk get flutterSdk =>
-      _flutterSdk ?? (_flutterSdk = FlutterSdk());
+      _flutterSdk ?? (_flutterSdk = FlutterSdk(flutterSdkPath));
 
   static void setSdk(Sdk value) {
     _sdk = sdk;
@@ -64,29 +64,30 @@
   String get sdkPath => path.dirname(path.dirname(Platform.resolvedExecutable));
 }
 
-/// The Flutter SDK is asuumed to be available at `./flutter-sdk/`.
-final flutterSdkPath =
-    Directory(path.join(Directory.current.path, 'flutter-sdk'));
+String get flutterSdkPath => path.join(Directory.current.path, 'flutter-sdk');
 
 /// Represents a Flutter SDK installation (which includes its own version of the
 /// Dart SDK) present on the server.
 class FlutterSdk extends Sdk {
+  final String flutterSdkPath;
+
   String _versionFull = '';
   String _flutterVersion = '';
 
+  FlutterSdk(this.flutterSdkPath);
+
   @override
   Future<void> init() async {
     _versionFull =
-        (await File(path.join(sdkPath, 'version')).readAsString()).trim();
+        (File(path.join(sdkPath, 'version')).readAsStringSync()).trim();
     _flutterVersion =
-        (await File(path.join(flutterSdkPath.path, 'version')).readAsString())
-            .trim();
+        (File(path.join(flutterSdkPath, 'version')).readAsStringSync()).trim();
   }
 
   @override
   String get sdkPath => path.join(flutterBinPath, 'cache', 'dart-sdk');
 
-  String get flutterBinPath => path.join(flutterSdkPath.path, 'bin');
+  String get flutterBinPath => path.join(flutterSdkPath, 'bin');
 
   @override
   String get versionFull => _versionFull;
@@ -94,8 +95,6 @@
   String get flutterVersion => _flutterVersion;
 }
 
-// TODO: Have an option to skip git calls (for testing)?
-// TODO(devoncarew): Collapse this with the other SDK managers.
 class DownloadingSdkManager {
   DownloadingSdkManager();
 
@@ -111,7 +110,7 @@
   /// `flutter-sdk-version.yaml` file.
   ///
   /// Note that this is an expensive operation.
-  Future<DownloadedFlutterSdk> createFromConfigFile() async {
+  Future<FlutterSdk> createFromConfigFile() async {
     final Map<String, Object> sdkConfig = getSdkConfigInfo();
 
     // flutter_sdk:
@@ -134,7 +133,7 @@
       return createUsingFlutterVersion(version: config['version'] as String);
     } else {
       // Clone the repo if necessary but don't do any other setup.
-      return _cloneSdkIfNecessary();
+      return (await _cloneSdkIfNecessary()).asFlutterSdk();
     }
   }
 
@@ -142,10 +141,10 @@
   /// channel.
   ///
   /// Note that this is an expensive operation.
-  Future<DownloadedFlutterSdk> createUsingFlutterChannel({
+  Future<FlutterSdk> createUsingFlutterChannel({
     @required String channel,
   }) async {
-    final DownloadedFlutterSdk sdk = await _cloneSdkIfNecessary();
+    final _DownloadedFlutterSdk sdk = await _cloneSdkIfNecessary();
 
     // git checkout master
     await sdk.checkout('master');
@@ -160,17 +159,17 @@
     // git pull
     await sdk.pull();
 
-    return sdk;
+    return sdk.asFlutterSdk();
   }
 
   /// Create a Flutter SDK in `flutter-sdk/` that tracks a specific Flutter
   /// version.
   ///
   /// Note that this is an expensive operation.
-  Future<DownloadedFlutterSdk> createUsingFlutterVersion({
+  Future<FlutterSdk> createUsingFlutterVersion({
     @required String version,
   }) async {
-    final DownloadedFlutterSdk sdk = await _cloneSdkIfNecessary();
+    final _DownloadedFlutterSdk sdk = await _cloneSdkIfNecessary();
 
     // git checkout master
     await sdk.checkout('master');
@@ -179,11 +178,11 @@
     // git checkout 1.25.0-8.1.pre
     await sdk.checkout(version);
 
-    return sdk;
+    return sdk.asFlutterSdk();
   }
 
-  Future<DownloadedFlutterSdk> _cloneSdkIfNecessary() async {
-    final DownloadedFlutterSdk sdk = DownloadedFlutterSdk();
+  Future<_DownloadedFlutterSdk> _cloneSdkIfNecessary() async {
+    final _DownloadedFlutterSdk sdk = _DownloadedFlutterSdk(flutterSdkPath);
 
     if (!Directory(sdk.flutterSdkPath).existsSync()) {
       // This takes perhaps ~20 seconds.
@@ -203,22 +202,23 @@
   }
 }
 
-class DownloadedFlutterSdk extends Sdk {
-  @override
+class _DownloadedFlutterSdk {
+  final String flutterSdkPath;
+
+  _DownloadedFlutterSdk(this.flutterSdkPath);
+
   Future<void> init() async {
     // flutter --version takes ~28s
     await _execLog('bin/flutter', ['--version'], flutterSdkPath);
   }
 
-  @override
+  FlutterSdk asFlutterSdk() => FlutterSdk(flutterSdkPath);
+
   String get sdkPath => path.join(flutterSdkPath, 'bin/cache/dart-sdk');
 
-  @override
   String get versionFull =>
       File(path.join(sdkPath, 'version')).readAsStringSync().trim();
 
-  String get flutterSdkPath => path.join(Directory.current.path, 'flutter-sdk');
-
   String get flutterVersion =>
       File(path.join(flutterSdkPath, 'version')).readAsStringSync().trim();
 
diff --git a/tool/grind.dart b/tool/grind.dart
index f51df71..7c0c66f 100644
--- a/tool/grind.dart
+++ b/tool/grind.dart
@@ -161,7 +161,7 @@
 
   // run flutter pub get
   await runWithLogging(
-    path.join(flutterSdkPath.path, 'bin', 'flutter'),
+    path.join(flutterSdkPath, 'bin', 'flutter'),
     arguments: ['pub', 'get'],
     workingDirectory: dir.path,
   );
@@ -197,7 +197,7 @@
   // Make sure flutter-sdk/bin/cache/flutter_web_sdk/flutter_web_sdk/kernel/flutter_ddc_sdk.dill
   // is installed.
   await runWithLogging(
-    path.join(flutterSdkPath.path, 'bin', 'flutter'),
+    path.join(flutterSdkPath, 'bin', 'flutter'),
     arguments: ['precache', '--web'],
     workingDirectory: dir.path,
   );
@@ -205,10 +205,10 @@
   // Build the artifacts using DDC:
   // dart-sdk/bin/dartdevc -s kernel/flutter_ddc_sdk.dill
   //     --modules=amd package:flutter/animation.dart ...
-  final compilerPath = path.join(
-      flutterSdkPath.path, 'bin', 'cache', 'dart-sdk', 'bin', 'dartdevc');
-  final dillPath = path.join(flutterSdkPath.path, 'bin', 'cache',
-      'flutter_web_sdk', 'flutter_web_sdk', 'kernel', 'flutter_ddc_sdk.dill');
+  final compilerPath =
+      path.join(flutterSdkPath, 'bin', 'cache', 'dart-sdk', 'bin', 'dartdevc');
+  final dillPath = path.join(flutterSdkPath, 'bin', 'cache', 'flutter_web_sdk',
+      'flutter_web_sdk', 'kernel', 'flutter_ddc_sdk.dill');
 
   final args = <String>[
     '-s',
@@ -229,7 +229,7 @@
   final artifactsDir = getDir('artifacts');
   await artifactsDir.create();
 
-  final sdkJsPath = path.join(flutterSdkPath.path,
+  final sdkJsPath = path.join(flutterSdkPath,
       'bin/cache/flutter_web_sdk/flutter_web_sdk/kernel/amd/dart_sdk.js');
 
   copy(getFile(sdkJsPath), artifactsDir);
@@ -245,7 +245,7 @@
 
 @Task('Delete, re-download, and reinitialize the Flutter submodule.')
 void setupFlutterSdk() async {
-  await flutterSdkPath.delete(recursive: true);
+  await Directory(flutterSdkPath).delete(recursive: true);
 
   final info = DownloadingSdkManager.getSdkConfigInfo();
   print('Flutter SDK configuration: $info\n');
@@ -255,7 +255,7 @@
 
   // Set up the  Flutter SDK the way dart-services needs it.
 
-  final flutterBinFlutter = path.join(flutterSdkPath.path, 'bin', 'flutter');
+  final flutterBinFlutter = path.join(flutterSdkPath, 'bin', 'flutter');
   await runWithLogging(
     flutterBinFlutter,
     arguments: ['doctor'],
diff --git a/tool/update_sdk.dart b/tool/update_sdk.dart
index 583f98d..c375be6 100644
--- a/tool/update_sdk.dart
+++ b/tool/update_sdk.dart
@@ -12,7 +12,7 @@
   print('configuration: $info\n');
 
   final DownloadingSdkManager sdkManager = DownloadingSdkManager();
-  final DownloadedFlutterSdk sdk = await sdkManager.createFromConfigFile();
+  final FlutterSdk sdk = await sdkManager.createFromConfigFile();
 
   print('\nSDK setup complete (${sdk.flutterSdkPath}).');
 }