diff --git a/analysis_options.yaml b/analysis_options.yaml
index e913fc0..e29f308 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,4 +1,4 @@
-include: package:pedantic/analysis_options.1.5.0.yaml
+include: package:pedantic/analysis_options.1.7.0.yaml
 
 analyzer:
   exclude:
diff --git a/lib/dartdoc.dart b/lib/dartdoc.dart
index b428213..8b49977 100644
--- a/lib/dartdoc.dart
+++ b/lib/dartdoc.dart
@@ -24,7 +24,7 @@
 import 'package:dartdoc/src/warnings.dart';
 import 'package:html/dom.dart' show Element, Document;
 import 'package:html/parser.dart' show parse;
-import 'package:path/path.dart' as pathLib;
+import 'package:path/path.dart' as path;
 
 export 'package:dartdoc/src/dartdoc_options.dart';
 export 'package:dartdoc/src/element_type.dart';
@@ -105,10 +105,11 @@
 
       for (var generator in generators) {
         await generator.generate(packageGraph, outputDir.path);
-        writtenFiles.addAll(generator.writtenFiles.map(pathLib.normalize));
+        writtenFiles.addAll(generator.writtenFiles.map(path.normalize));
       }
-      if (config.validateLinks && writtenFiles.isNotEmpty)
+      if (config.validateLinks && writtenFiles.isNotEmpty) {
         validateLinks(packageGraph, outputDir.path);
+      }
     }
 
     int warnings = packageGraph.packageWarningCounter.warningCount;
@@ -159,12 +160,12 @@
     Set<Warnable> warnOnElements;
 
     // Make all paths relative to origin.
-    if (pathLib.isWithin(origin, warnOn)) {
-      warnOn = pathLib.relative(warnOn, from: origin);
+    if (path.isWithin(origin, warnOn)) {
+      warnOn = path.relative(warnOn, from: origin);
     }
     if (referredFrom != null) {
-      if (pathLib.isWithin(origin, referredFrom)) {
-        referredFrom = pathLib.relative(referredFrom, from: origin);
+      if (path.isWithin(origin, referredFrom)) {
+        referredFrom = path.relative(referredFrom, from: origin);
       }
       // Source paths are always relative.
       if (_hrefs[referredFrom] != null) {
@@ -185,8 +186,9 @@
       }
     }
 
-    if (referredFromElements.isEmpty && referredFrom == 'index.html')
+    if (referredFromElements.isEmpty && referredFrom == 'index.html') {
       referredFromElements.add(packageGraph.defaultPackage);
+    }
     String message = warnOn;
     if (referredFrom == 'index.json') message = '$warnOn (from index.json)';
     packageGraph.warnOnElement(warnOnElement, kind,
@@ -195,13 +197,13 @@
 
   void _doOrphanCheck(
       PackageGraph packageGraph, String origin, Set<String> visited) {
-    String normalOrigin = pathLib.normalize(origin);
-    String staticAssets = pathLib.joinAll([normalOrigin, 'static-assets', '']);
-    String indexJson = pathLib.joinAll([normalOrigin, 'index.json']);
+    String normalOrigin = path.normalize(origin);
+    String staticAssets = path.joinAll([normalOrigin, 'static-assets', '']);
+    String indexJson = path.joinAll([normalOrigin, 'index.json']);
     bool foundIndexJson = false;
     for (FileSystemEntity f
         in new Directory(normalOrigin).listSync(recursive: true)) {
-      var fullPath = pathLib.normalize(f.path);
+      var fullPath = path.normalize(f.path);
       if (f is Directory) {
         continue;
       }
@@ -214,7 +216,7 @@
         continue;
       }
       if (visited.contains(fullPath)) continue;
-      String relativeFullPath = pathLib.relative(fullPath, from: normalOrigin);
+      String relativeFullPath = path.relative(fullPath, from: normalOrigin);
       if (!writtenFiles.contains(relativeFullPath)) {
         // This isn't a file we wrote (this time); don't claim we did.
         _warn(packageGraph, PackageWarning.unknownFile, fullPath, normalOrigin);
@@ -259,8 +261,8 @@
 
   void _doSearchIndexCheck(
       PackageGraph packageGraph, String origin, Set<String> visited) {
-    String fullPath = pathLib.joinAll([origin, 'index.json']);
-    String indexPath = pathLib.joinAll([origin, 'index.html']);
+    String fullPath = path.joinAll([origin, 'index.json']);
+    String indexPath = path.joinAll([origin, 'index.html']);
     File file = new File("$fullPath");
     if (!file.existsSync()) {
       return null;
@@ -275,10 +277,10 @@
     found.add(indexPath);
     for (Map<String, dynamic> entry in jsonData) {
       if (entry.containsKey('href')) {
-        String entryPath = pathLib.joinAll([origin, entry['href']]);
+        String entryPath = path.joinAll([origin, entry['href']]);
         if (!visited.contains(entryPath)) {
           _warn(packageGraph, PackageWarning.brokenLink, entryPath,
-              pathLib.normalize(origin),
+              path.normalize(origin),
               referredFrom: fullPath);
         }
         found.add(entryPath);
@@ -288,7 +290,7 @@
     Set<String> missing_from_search = visited.difference(found);
     for (String s in missing_from_search) {
       _warn(packageGraph, PackageWarning.missingFromSearchIndex, s,
-          pathLib.normalize(origin),
+          path.normalize(origin),
           referredFrom: fullPath);
     }
   }
@@ -297,14 +299,14 @@
       String pathToCheck,
       [String source, String fullPath]) {
     if (fullPath == null) {
-      fullPath = pathLib.joinAll([origin, pathToCheck]);
-      fullPath = pathLib.normalize(fullPath);
+      fullPath = path.joinAll([origin, pathToCheck]);
+      fullPath = path.normalize(fullPath);
     }
 
     Tuple2 stringLinksAndHref = _getStringLinksAndHref(fullPath);
     if (stringLinksAndHref == null) {
       _warn(packageGraph, PackageWarning.brokenLink, pathToCheck,
-          pathLib.normalize(origin),
+          path.normalize(origin),
           referredFrom: source);
       _onCheckProgress.add(pathToCheck);
       // Remove so that we properly count that the file doesn't exist for
@@ -328,18 +330,20 @@
         Uri uri;
         try {
           uri = Uri.parse(href);
-        } catch (FormatError) {}
+        } catch (FormatError) {
+          // ignore
+        }
 
         if (uri == null || !uri.hasAuthority && !uri.hasFragment) {
           var full;
           if (baseHref != null) {
-            full = '${pathLib.dirname(pathToCheck)}/$baseHref/$href';
+            full = '${path.dirname(pathToCheck)}/$baseHref/$href';
           } else {
-            full = '${pathLib.dirname(pathToCheck)}/$href';
+            full = '${path.dirname(pathToCheck)}/$href';
           }
-          var newPathToCheck = pathLib.normalize(full);
-          String newFullPath = pathLib.joinAll([origin, newPathToCheck]);
-          newFullPath = pathLib.normalize(newFullPath);
+          var newPathToCheck = path.normalize(full);
+          String newFullPath = path.joinAll([origin, newPathToCheck]);
+          newFullPath = path.normalize(newFullPath);
           if (!visited.contains(newFullPath)) {
             toVisit.add(new Tuple2(newPathToCheck, newFullPath));
             visited.add(newFullPath);
diff --git a/lib/src/dartdoc_options.dart b/lib/src/dartdoc_options.dart
index 6678e70..9b78b07 100644
--- a/lib/src/dartdoc_options.dart
+++ b/lib/src/dartdoc_options.dart
@@ -26,7 +26,7 @@
 import 'package:dartdoc/src/tool_runner.dart';
 import 'package:dartdoc/src/tuple.dart';
 import 'package:dartdoc/src/warnings.dart';
-import 'package:path/path.dart' as pathLib;
+import 'package:path/path.dart' as p;
 import 'package:yaml/yaml.dart';
 
 /// Constants to help with type checking, because T is int and so forth
@@ -41,8 +41,7 @@
 /// Args are computed relative to the current directory at the time the
 /// program starts.
 final Directory directoryCurrent = Directory.current;
-final String directoryCurrentPath =
-    pathLib.canonicalize(Directory.current.path);
+final String directoryCurrentPath = p.canonicalize(Directory.current.path);
 
 class DartdocOptionError extends DartdocFailure {
   DartdocOptionError(String details) : super(details);
@@ -85,7 +84,7 @@
   }
 
   static CategoryConfiguration fromYamlMap(
-      YamlMap yamlMap, pathLib.Context pathContext) {
+      YamlMap yamlMap, p.Context pathContext) {
     Map<String, CategoryDefinition> newCategoryDefinitions = {};
     for (MapEntry entry in yamlMap.entries) {
       String name = entry.key.toString();
@@ -136,7 +135,7 @@
   /// Returns true if the given executable path has an extension recognized as a
   /// Dart extension (e.g. '.dart' or '.snapshot').
   static bool isDartExecutable(String executable) {
-    var extension = pathLib.extension(executable);
+    var extension = p.extension(executable);
     return extension == '.dart' || extension == '.snapshot';
   }
 
@@ -189,6 +188,7 @@
 ///
 class Snapshot {
   File _snapshotFile;
+
   File get snapshotFile => _snapshotFile;
   final Completer _snapshotCompleter = Completer();
 
@@ -199,7 +199,7 @@
       snapshotCompleted();
     } else {
       _snapshotFile =
-          File(pathLib.join(snapshotCache.absolute.path, 'snapshot_$serial'));
+          File(p.join(snapshotCache.absolute.path, 'snapshot_$serial'));
     }
   }
 
@@ -216,6 +216,7 @@
   }
 
   Future<void> snapshotValid() => _snapshotCompleter.future;
+
   void snapshotCompleted() => _snapshotCompleter.complete();
 }
 
@@ -294,6 +295,7 @@
   final Map<String, ToolDefinition> tools;
 
   ToolRunner _runner;
+
   ToolRunner get runner => _runner ??= ToolRunner(this);
 
   ToolConfiguration._(this.tools);
@@ -303,8 +305,7 @@
   }
 
   // TODO(jcollins-g): consider caching these.
-  static ToolConfiguration fromYamlMap(
-      YamlMap yamlMap, pathLib.Context pathContext) {
+  static ToolConfiguration fromYamlMap(YamlMap yamlMap, p.Context pathContext) {
     var newToolDefinitions = <String, ToolDefinition>{};
     for (var entry in yamlMap.entries) {
       var name = entry.key.toString();
@@ -428,14 +429,14 @@
   String definingFile;
 
   /// A [pathLib.Context] variable initialized with canonicalDirectoryPath.
-  pathLib.Context pathContext;
+  p.Context pathContext;
 
   /// Build a _OptionValueWithContext.
   /// [path] is the path where this value came from (not required to be canonical)
   _OptionValueWithContext(this.value, String path, {String definingFile}) {
     this.definingFile = definingFile;
-    canonicalDirectoryPath = pathLib.canonicalize(path);
-    pathContext = new pathLib.Context(current: canonicalDirectoryPath);
+    canonicalDirectoryPath = p.canonicalize(path);
+    pathContext = new p.Context(current: canonicalDirectoryPath);
   }
 
   /// Assume value is a path, and attempt to resolve it.  Throws [UnsupportedError]
@@ -502,7 +503,7 @@
   }
 
   /// Closure to convert yaml data into some other structure.
-  T Function(YamlMap, pathLib.Context) _convertYamlToType;
+  T Function(YamlMap, p.Context) _convertYamlToType;
 
   // The choice not to use reflection means there's some ugly type checking,
   // somewhat more ugly than we'd have to do anyway to automatically convert
@@ -510,10 +511,15 @@
   //
   // Condense the ugly all in one place, this set of getters.
   bool get _isString => _kStringVal is T;
+
   bool get _isListString => _kListStringVal is T;
+
   bool get _isMapString => _kMapStringVal is T;
+
   bool get _isBool => _kBoolVal is T;
+
   bool get _isInt => _kIntVal is T;
+
   bool get _isDouble => _kDoubleVal is T;
 
   DartdocOption _parent;
@@ -529,6 +535,7 @@
       root.__yamlAtCanonicalPathCache;
 
   final ArgParser __argParser = new ArgParser();
+
   ArgParser get argParser => root.__argParser;
 
   ArgResults __argResults;
@@ -573,8 +580,9 @@
   /// For a [List<String>] or [String] value, if [isDir] or [isFile] is set,
   /// resolve paths in value relative to canonicalPath.
   T _handlePathsInContext(_OptionValueWithContext valueWithContext) {
-    if (valueWithContext?.value == null || !(isDir || isFile))
+    if (valueWithContext?.value == null || !(isDir || isFile)) {
       return valueWithContext?.value;
+    }
     _validatePaths(valueWithContext);
     return valueWithContext.resolvedValue;
   }
@@ -583,6 +591,7 @@
   /// children.
   void parseArguments(List<String> arguments) =>
       root._parseArguments(arguments);
+
   ArgResults get _argResults => root.__argResults;
 
   /// Set the parent of this [DartdocOption].  Do not call more than once.
@@ -631,14 +640,15 @@
   T valueAtCurrent() => valueAt(directoryCurrent);
 
   /// Calls [valueAt] on the directory this element is defined in.
-  T valueAtElement(Element element) => valueAt(new Directory(
-      pathLib.canonicalize(pathLib.basename(element.source.fullName))));
+  T valueAtElement(Element element) => valueAt(
+      new Directory(p.canonicalize(p.basename(element.source.fullName))));
 
   /// Adds a DartdocOption to the children of this DartdocOption.
   void add(DartdocOption option) {
-    if (_children.containsKey(option.name))
+    if (_children.containsKey(option.name)) {
       throw new DartdocOptionError(
           'Tried to add two children with the same name: ${option.name}');
+    }
     _children[option.name] = option;
     option.parent = this;
     option.traverse((option) => option._onAdd());
@@ -670,13 +680,14 @@
   bool _parentDirOverridesChild;
   @override
   T Function(DartdocSyntheticOption<T>, Directory) _compute;
+
   DartdocOptionFileSynth(String name, this._compute,
       {bool mustExist = false,
       String help = '',
       bool isDir = false,
       bool isFile = false,
       bool parentDirOverridesChild,
-      T Function(YamlMap, pathLib.Context) convertYamlToType})
+      T Function(YamlMap, p.Context) convertYamlToType})
       : super(name, null, help, isDir, isFile, mustExist, convertYamlToType) {
     _parentDirOverridesChild = parentDirOverridesChild;
   }
@@ -715,6 +726,7 @@
 
   @override
   T Function(DartdocSyntheticOption<T>, Directory) _compute;
+
   DartdocOptionArgSynth(String name, this._compute,
       {String abbr,
       bool mustExist = false,
@@ -747,8 +759,10 @@
 
   @override
   String get abbr => _abbr;
+
   @override
   bool get hide => _hide;
+
   @override
   bool get negatable => _negatable;
 
@@ -765,6 +779,7 @@
     with DartdocSyntheticOption<T> {
   @override
   T Function(DartdocSyntheticOption<T>, Directory) _compute;
+
   DartdocOptionSyntheticOnly(String name, this._compute,
       {bool mustExist = false,
       String help = '',
@@ -864,10 +879,13 @@
 
   @override
   String get abbr => _abbr;
+
   @override
   bool get hide => _hide;
+
   @override
   bool get negatable => _negatable;
+
   @override
   bool get splitCommas => _splitCommas;
 }
@@ -921,12 +939,16 @@
 
   @override
   String get abbr => _abbr;
+
   @override
   bool get hide => _hide;
+
   @override
   bool get negatable => _negatable;
+
   @override
   bool get parentDirOverridesChild => _parentDirOverridesChild;
+
   @override
   bool get splitCommas => _splitCommas;
 }
@@ -934,13 +956,14 @@
 class DartdocOptionFileOnly<T> extends DartdocOption<T>
     with _DartdocFileOption<T> {
   bool _parentDirOverridesChild;
+
   DartdocOptionFileOnly(String name, T defaultsTo,
       {bool mustExist = false,
       String help = '',
       bool isDir = false,
       bool isFile = false,
       bool parentDirOverridesChild = false,
-      T Function(YamlMap, pathLib.Context) convertYamlToType})
+      T Function(YamlMap, p.Context) convertYamlToType})
       : super(name, defaultsTo, help, isDir, isFile, mustExist,
             convertYamlToType) {
     _parentDirOverridesChild = parentDirOverridesChild;
@@ -973,7 +996,7 @@
 
   void _onMissingFromFiles(
       _OptionValueWithContext valueWithContext, String missingPath) {
-    String dartdocYaml = pathLib.join(
+    String dartdocYaml = p.join(
         valueWithContext.canonicalDirectoryPath, valueWithContext.definingFile);
     throw new DartdocFileMissing(
         'Field ${fieldName} from ${dartdocYaml}, set to ${valueWithContext.value}, resolves to missing path: "${missingPath}"');
@@ -988,10 +1011,11 @@
   }
 
   final Map<String, T> __valueAtFromFiles = new Map();
+
   // The value of this option from files will not change unless files are
   // modified during execution (not allowed in Dartdoc).
   T _valueAtFromFiles(Directory dir) {
-    String key = pathLib.canonicalize(dir.path);
+    String key = p.canonicalize(dir.path);
     if (!__valueAtFromFiles.containsKey(key)) {
       _OptionValueWithContext valueWithContext;
       if (parentDirOverridesChild) {
@@ -1011,7 +1035,7 @@
     _OptionValueWithContext value;
     while (true) {
       value = _valueAtFromFile(dir);
-      if (value != null || pathLib.equals(dir.parent.path, dir.path)) break;
+      if (value != null || p.equals(dir.parent.path, dir.path)) break;
       dir = dir.parent;
     }
     return value;
@@ -1025,7 +1049,7 @@
     while (true) {
       _OptionValueWithContext tmpValue = _valueAtFromFile(dir);
       if (tmpValue != null) value = tmpValue;
-      if (pathLib.equals(dir.parent.path, dir.path)) break;
+      if (p.equals(dir.parent.path, dir.path)) break;
       dir = dir.parent;
     }
     return value;
@@ -1059,7 +1083,7 @@
       // _OptionValueWithContext into the return data here, and would not have
       // that be separate.
       if (_isMapString && _convertYamlToType == null) {
-        _convertYamlToType = (YamlMap yamlMap, pathLib.Context pathContext) {
+        _convertYamlToType = (YamlMap yamlMap, p.Context pathContext) {
           var returnData = <String, String>{};
           for (MapEntry entry in yamlMap.entries) {
             returnData[entry.key.toString()] = entry.value.toString();
@@ -1071,9 +1095,9 @@
         throw new DartdocOptionError(
             'Unable to convert yaml to type for option: $fieldName, method not defined');
       }
-      String canonicalDirectoryPath = pathLib.canonicalize(contextPath);
+      String canonicalDirectoryPath = p.canonicalize(contextPath);
       returnData = _convertYamlToType(
-          yamlData, new pathLib.Context(current: canonicalDirectoryPath));
+          yamlData, new p.Context(current: canonicalDirectoryPath));
     } else if (_isDouble) {
       if (yamlData is num) {
         returnData = yamlData.toDouble();
@@ -1090,7 +1114,7 @@
   }
 
   _YamlFileData _yamlAtDirectory(Directory dir) {
-    List<String> canonicalPaths = [pathLib.canonicalize(dir.path)];
+    List<String> canonicalPaths = [p.canonicalize(dir.path)];
     if (!_yamlAtCanonicalPathCache.containsKey(canonicalPaths.first)) {
       _YamlFileData yamlData =
           new _YamlFileData(new Map(), directoryCurrentPath);
@@ -1099,16 +1123,16 @@
 
         while (true) {
           dartdocOptionsFile =
-              new File(pathLib.join(dir.path, 'dartdoc_options.yaml'));
+              new File(p.join(dir.path, 'dartdoc_options.yaml'));
           if (dartdocOptionsFile.existsSync() ||
-              pathLib.equals(dir.parent.path, dir.path)) break;
+              p.equals(dir.parent.path, dir.path)) break;
           dir = dir.parent;
-          canonicalPaths.add(pathLib.canonicalize(dir.path));
+          canonicalPaths.add(p.canonicalize(dir.path));
         }
         if (dartdocOptionsFile.existsSync()) {
           yamlData = new _YamlFileData(
               loadYaml(dartdocOptionsFile.readAsStringSync()),
-              pathLib.canonicalize(dir.path));
+              p.canonicalize(dir.path));
         }
       }
       canonicalPaths.forEach((p) => _yamlAtCanonicalPathCache[p] = yamlData);
@@ -1265,6 +1289,7 @@
 /// DartdocOptionContext mixins they use for calculating synthetic options.
 abstract class DartdocOptionContextBase {
   DartdocOptionSet get optionSet;
+
   Directory get context;
 }
 
@@ -1293,8 +1318,8 @@
           directoryCurrentPath;
       context = new Directory(inputDir);
     } else {
-      context = new Directory(pathLib
-          .canonicalize(entity is File ? entity.parent.path : entity.path));
+      context = new Directory(
+          p.canonicalize(entity is File ? entity.parent.path : entity.path));
     }
   }
 
@@ -1321,34 +1346,51 @@
 
   // All values defined in createDartdocOptions should be exposed here.
   bool get allowTools => optionSet['allowTools'].valueAt(context);
+
   double get ambiguousReexportScorerMinConfidence =>
       optionSet['ambiguousReexportScorerMinConfidence'].valueAt(context);
+
   bool get autoIncludeDependencies =>
       optionSet['autoIncludeDependencies'].valueAt(context);
+
   List<String> get categoryOrder => optionSet['categoryOrder'].valueAt(context);
+
   CategoryConfiguration get categories =>
       optionSet['categories'].valueAt(context);
+
   List<String> get dropTextFrom => optionSet['dropTextFrom'].valueAt(context);
+
   String get examplePathPrefix =>
       optionSet['examplePathPrefix'].valueAt(context);
+
   List<String> get exclude => optionSet['exclude'].valueAt(context);
+
   List<String> get excludePackages =>
       optionSet['excludePackages'].valueAt(context);
 
   String get flutterRoot => optionSet['flutterRoot'].valueAt(context);
+
   bool get hideSdkText => optionSet['hideSdkText'].valueAt(context);
+
   List<String> get include => optionSet['include'].valueAt(context);
+
   List<String> get includeExternal =>
       optionSet['includeExternal'].valueAt(context);
+
   bool get includeSource => optionSet['includeSource'].valueAt(context);
+
   bool get injectHtml => optionSet['injectHtml'].valueAt(context);
+
   ToolConfiguration get tools => optionSet['tools'].valueAt(context);
 
   /// _input is only used to construct synthetic options.
   // ignore: unused_element
   String get _input => optionSet['input'].valueAt(context);
+
   String get inputDir => optionSet['inputDir'].valueAt(context);
+
   bool get linkToRemote => optionSet['linkTo']['remote'].valueAt(context);
+
   String get linkToUrl => optionSet['linkTo']['url'].valueAt(context);
 
   /// _linkToHosted is only used to construct synthetic options.
@@ -1356,19 +1398,28 @@
   String get _linkToHosted => optionSet['linkTo']['hosted'].valueAt(context);
 
   String get output => optionSet['output'].valueAt(context);
+
   PackageMeta get packageMeta => optionSet['packageMeta'].valueAt(context);
+
   List<String> get packageOrder => optionSet['packageOrder'].valueAt(context);
+
   bool get sdkDocs => optionSet['sdkDocs'].valueAt(context);
+
   String get sdkDir => optionSet['sdkDir'].valueAt(context);
+
   bool get showUndocumentedCategories =>
       optionSet['showUndocumentedCategories'].valueAt(context);
+
   PackageMeta get topLevelPackageMeta =>
       optionSet['topLevelPackageMeta'].valueAt(context);
+
   bool get useCategories => optionSet['useCategories'].valueAt(context);
+
   bool get validateLinks => optionSet['validateLinks'].valueAt(context);
 
   bool isLibraryExcluded(String name) =>
       exclude.any((pattern) => name == pattern);
+
   bool isPackageExcluded(String name) =>
       excludePackages.any((pattern) => name == pattern);
 }
@@ -1508,7 +1559,7 @@
             help: 'Allow links to be generated for packages outside this one.',
             negatable: true),
       ]),
-    new DartdocOptionArgOnly<String>('output', pathLib.join('doc', 'api'),
+    new DartdocOptionArgOnly<String>('output', p.join('doc', 'api'),
         isDir: true, help: 'Path to output directory.'),
     new DartdocOptionSyntheticOnly<PackageMeta>(
       'packageMeta',
@@ -1537,7 +1588,7 @@
           throw new DartdocOptionError(
               'Top level package requires Flutter but FLUTTER_ROOT environment variable not set');
         }
-        return pathLib.join(flutterRoot, 'bin', 'cache', 'dart-sdk');
+        return p.join(flutterRoot, 'bin', 'cache', 'dart-sdk');
       }
       return defaultSdkDir.absolute.path;
     }, help: 'Path to the SDK directory.', isDir: true, mustExist: true),
diff --git a/lib/src/html/html_generator.dart b/lib/src/html/html_generator.dart
index b09db48..89b6402 100644
--- a/lib/src/html/html_generator.dart
+++ b/lib/src/html/html_generator.dart
@@ -15,7 +15,7 @@
 import 'package:dartdoc/src/html/template_data.dart';
 import 'package:dartdoc/src/html/templates.dart';
 import 'package:dartdoc/src/model.dart';
-import 'package:path/path.dart' as pathLib;
+import 'package:path/path.dart' as path;
 
 typedef String Renderer(String input);
 
@@ -84,7 +84,7 @@
       // docs somehow.  Check data.self.isCanonical and callers for bugs.
       assert(allowOverwrite || !writtenFiles.contains(filePath));
 
-      var file = new File(pathLib.join(outputDirectoryPath, filePath));
+      var file = new File(path.join(outputDirectoryPath, filePath));
       var parent = file.parent;
       if (!parent.existsSync()) {
         parent.createSync(recursive: true);
@@ -209,7 +209,7 @@
         // TODO(jcollins-g): Eliminate special casing for SDK and use config file.
         if (topLevelPackageMeta.isSdk == true) {
           footerTextPaths
-              .add(pathLib.canonicalize(_sdkFooterCopyrightUri.toFilePath()));
+              .add(path.canonicalize(_sdkFooterCopyrightUri.toFilePath()));
         }
         footerTextPaths.addAll(option.parent['footerText'].valueAt(dir));
         return footerTextPaths;
diff --git a/lib/src/html/html_generator_instance.dart b/lib/src/html/html_generator_instance.dart
index 79052ec..6b86232 100644
--- a/lib/src/html/html_generator_instance.dart
+++ b/lib/src/html/html_generator_instance.dart
@@ -17,7 +17,7 @@
 import 'package:dartdoc/src/model_utils.dart';
 import 'package:dartdoc/src/warnings.dart';
 import 'package:mustache/mustache.dart';
-import 'package:path/path.dart' as pathLib;
+import 'package:path/path.dart' as path;
 
 typedef void FileWriter(String path, Object content, {bool allowOverwrite});
 
@@ -42,7 +42,7 @@
     if (_options.faviconPath != null) {
       var bytes = new File(_options.faviconPath).readAsBytesSync();
       // Allow overwrite of favicon.
-      _writer(pathLib.join('static-assets', 'favicon.png'), bytes,
+      _writer(path.join('static-assets', 'favicon.png'), bytes,
           allowOverwrite: true);
     }
   }
@@ -73,10 +73,11 @@
     });
 
     String json = encoder.convert(indexItems);
-    _writer(pathLib.join('categories.json'), '${json}\n');
+    _writer(path.join('categories.json'), '${json}\n');
   }
 
   List<Categorization> _categorizationItems;
+
   void _generateSearchIndex() {
     var encoder = _options.prettyIndexJson
         ? new JsonEncoder.withIndent(' ')
@@ -84,8 +85,9 @@
     _categorizationItems = [];
 
     final List<Map> indexItems = _indexedElements.map((Indexable e) {
-      if (e is Categorization && e.hasCategorization)
+      if (e is Categorization && e.hasCategorization) {
         _categorizationItems.add(e);
+      }
       Map data = {
         'name': e.name,
         'qualifiedName': e.fullyQualifiedName,
@@ -114,7 +116,7 @@
     });
 
     String json = encoder.convert(indexItems);
-    _writer(pathLib.join('index.json'), '${json}\n');
+    _writer(path.join('index.json'), '${json}\n');
   }
 
   void _generateDocs() {
@@ -254,8 +256,8 @@
     TemplateData data =
         new CategoryTemplateData(_options, packageGraph, category);
 
-    _build(pathLib.joinAll(category.href.split('/')),
-        _templates.categoryTemplate, data);
+    _build(path.joinAll(category.href.split('/')), _templates.categoryTemplate,
+        data);
   }
 
   void generateLibrary(PackageGraph packageGraph, Library lib) {
@@ -266,22 +268,20 @@
     }
     TemplateData data = new LibraryTemplateData(_options, packageGraph, lib);
 
-    _build(pathLib.join(lib.dirName, '${lib.fileName}'),
+    _build(path.join(lib.dirName, '${lib.fileName}'),
         _templates.libraryTemplate, data);
   }
 
   void generateClass(PackageGraph packageGraph, Library lib, Class clazz) {
     TemplateData data =
         new ClassTemplateData(_options, packageGraph, lib, clazz);
-    _build(
-        pathLib.joinAll(clazz.href.split('/')), _templates.classTemplate, data);
+    _build(path.joinAll(clazz.href.split('/')), _templates.classTemplate, data);
   }
 
   void generateMixins(PackageGraph packageGraph, Library lib, Mixin mixin) {
     TemplateData data =
         new MixinTemplateData(_options, packageGraph, lib, mixin);
-    _build(
-        pathLib.joinAll(mixin.href.split('/')), _templates.mixinTemplate, data);
+    _build(path.joinAll(mixin.href.split('/')), _templates.mixinTemplate, data);
   }
 
   void generateConstructor(PackageGraph packageGraph, Library lib, Class clazz,
@@ -289,15 +289,14 @@
     TemplateData data = new ConstructorTemplateData(
         _options, packageGraph, lib, clazz, constructor);
 
-    _build(pathLib.joinAll(constructor.href.split('/')),
+    _build(path.joinAll(constructor.href.split('/')),
         _templates.constructorTemplate, data);
   }
 
   void generateEnum(PackageGraph packageGraph, Library lib, Enum eNum) {
     TemplateData data = new EnumTemplateData(_options, packageGraph, lib, eNum);
 
-    _build(
-        pathLib.joinAll(eNum.href.split('/')), _templates.enumTemplate, data);
+    _build(path.joinAll(eNum.href.split('/')), _templates.enumTemplate, data);
   }
 
   void generateFunction(
@@ -305,8 +304,8 @@
     TemplateData data =
         new FunctionTemplateData(_options, packageGraph, lib, function);
 
-    _build(pathLib.joinAll(function.href.split('/')),
-        _templates.functionTemplate, data);
+    _build(path.joinAll(function.href.split('/')), _templates.functionTemplate,
+        data);
   }
 
   void generateMethod(
@@ -314,8 +313,8 @@
     TemplateData data =
         new MethodTemplateData(_options, packageGraph, lib, clazz, method);
 
-    _build(pathLib.joinAll(method.href.split('/')), _templates.methodTemplate,
-        data);
+    _build(
+        path.joinAll(method.href.split('/')), _templates.methodTemplate, data);
   }
 
   void generateConstant(
@@ -323,8 +322,8 @@
     TemplateData data =
         new ConstantTemplateData(_options, packageGraph, lib, clazz, property);
 
-    _build(pathLib.joinAll(property.href.split('/')),
-        _templates.constantTemplate, data);
+    _build(path.joinAll(property.href.split('/')), _templates.constantTemplate,
+        data);
   }
 
   void generateProperty(
@@ -332,8 +331,8 @@
     TemplateData data =
         new PropertyTemplateData(_options, packageGraph, lib, clazz, property);
 
-    _build(pathLib.joinAll(property.href.split('/')),
-        _templates.propertyTemplate, data);
+    _build(path.joinAll(property.href.split('/')), _templates.propertyTemplate,
+        data);
   }
 
   void generateTopLevelProperty(
@@ -341,7 +340,7 @@
     TemplateData data =
         new TopLevelPropertyTemplateData(_options, packageGraph, lib, property);
 
-    _build(pathLib.joinAll(property.href.split('/')),
+    _build(path.joinAll(property.href.split('/')),
         _templates.topLevelPropertyTemplate, data);
   }
 
@@ -350,7 +349,7 @@
     TemplateData data =
         new TopLevelConstTemplateData(_options, packageGraph, lib, property);
 
-    _build(pathLib.joinAll(property.href.split('/')),
+    _build(path.joinAll(property.href.split('/')),
         _templates.topLevelConstantTemplate, data);
   }
 
@@ -359,7 +358,7 @@
     TemplateData data =
         new TypedefTemplateData(_options, packageGraph, lib, typeDef);
 
-    _build(pathLib.joinAll(typeDef.href.split('/')), _templates.typeDefTemplate,
+    _build(path.joinAll(typeDef.href.split('/')), _templates.typeDefTemplate,
         data);
   }
 
@@ -372,7 +371,7 @@
             'encountered $resourcePath');
       }
       String destFileName = resourcePath.substring(prefix.length);
-      _writer(pathLib.join('static-assets', destFileName),
+      _writer(path.join('static-assets', destFileName),
           await loader.loadAsBytes(resourcePath));
     }
   }
diff --git a/lib/src/io_utils.dart b/lib/src/io_utils.dart
index 358d948..d321b1a 100644
--- a/lib/src/io_utils.dart
+++ b/lib/src/io_utils.dart
@@ -8,7 +8,7 @@
 import 'dart:async';
 import 'dart:io';
 
-import 'package:path/path.dart' as pathLib;
+import 'package:path/path.dart' as path;
 
 /// Return a resolved path including the home directory in place of tilde
 /// references.
@@ -20,12 +20,12 @@
   String homeDir;
 
   if (Platform.isWindows) {
-    homeDir = pathLib.absolute(Platform.environment['USERPROFILE']);
+    homeDir = path.absolute(Platform.environment['USERPROFILE']);
   } else {
-    homeDir = pathLib.absolute(Platform.environment['HOME']);
+    homeDir = path.absolute(Platform.environment['HOME']);
   }
 
-  return pathLib.join(homeDir, originalPath.substring(2));
+  return path.join(homeDir, originalPath.substring(2));
 }
 
 /// Lists the contents of [dir].
@@ -53,7 +53,7 @@
 
     for (var entity in listDir(new Directory(dir))) {
       // Skip hidden files and directories
-      if (pathLib.basename(entity.path).startsWith('.')) {
+      if (path.basename(entity.path).startsWith('.')) {
         continue;
       }
 
diff --git a/lib/src/markdown_processor.dart b/lib/src/markdown_processor.dart
index c71592c..1d0b4bd 100644
--- a/lib/src/markdown_processor.dart
+++ b/lib/src/markdown_processor.dart
@@ -153,6 +153,7 @@
 class MatchingLinkResult {
   final ModelElement element;
   final bool warn;
+
   MatchingLinkResult(this.element, {this.warn = true});
 }
 
@@ -211,8 +212,9 @@
   }
 
   // Ignore all parameters.
-  if (refModelElement is Parameter || refModelElement is TypeParameter)
+  if (refModelElement is Parameter || refModelElement is TypeParameter) {
     return new MatchingLinkResult(null, warn: false);
+  }
 
   // There have been places in the code which helpfully cache entities
   // regardless of what package they are associated with.  This assert
@@ -433,9 +435,11 @@
   }
 
   List<String> _codeRefParts;
+
   List<String> get codeRefParts => _codeRefParts ??= codeRef.split('.');
 
   List<String> _codeRefChompedParts;
+
   List<String> get codeRefChompedParts =>
       _codeRefChompedParts ??= codeRefChomped.split('.');
 
@@ -933,9 +937,11 @@
 
 class Documentation {
   final Canonicalization _element;
+
   Documentation.forElement(this._element);
 
   bool _hasExtendedDocs;
+
   bool get hasExtendedDocs {
     if (_hasExtendedDocs == null) {
       _renderHtmlForDartdoc(_element.isCanonical && _asHtml == null);
@@ -944,6 +950,7 @@
   }
 
   String _asHtml;
+
   String get asHtml {
     if (_asHtml == null) {
       assert(_asOneLiner == null || _element.isCanonical);
@@ -953,6 +960,7 @@
   }
 
   String _asOneLiner;
+
   String get asOneLiner {
     if (_asOneLiner == null) {
       assert(_asHtml == null);
diff --git a/lib/src/model.dart b/lib/src/model.dart
index 454d84d..a417a57 100644
--- a/lib/src/model.dart
+++ b/lib/src/model.dart
@@ -23,28 +23,30 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/visitor.dart';
-import 'package:analyzer/file_system/file_system.dart' as fileSystem;
+import 'package:analyzer/file_system/file_system.dart' as file_system;
 import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/src/source/package_map_resolver.dart';
-import 'package:analyzer/src/source/sdk_ext.dart';
-// TODO(jcollins-g): Stop using internal analyzer structures somehow.
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/handle.dart';
+import 'package:analyzer/src/dart/element/member.dart'
+    show ExecutableMember, Member, ParameterMember;
 import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/engine.dart' hide AnalysisResult;
 import 'package:analyzer/src/generated/java_io.dart';
 import 'package:analyzer/src/generated/resolver.dart'
-    show Namespace, NamespaceBuilder, InheritanceManager; // ignore: deprecated_member_use
+    show
+        Namespace,
+        NamespaceBuilder,
+        InheritanceManager; // ignore: deprecated_member_use
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
-import 'package:analyzer/src/dart/element/member.dart'
-    show ExecutableMember, Member, ParameterMember;
-import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
+import 'package:analyzer/src/source/sdk_ext.dart';
 import 'package:args/args.dart';
 import 'package:collection/collection.dart';
 import 'package:crypto/crypto.dart';
@@ -61,10 +63,10 @@
 import 'package:dartdoc/src/tuple.dart';
 import 'package:dartdoc/src/utils.dart';
 import 'package:dartdoc/src/warnings.dart';
-import 'package:path/path.dart' as pathLib;
-import 'package:pub_semver/pub_semver.dart';
 import 'package:package_config/discovery.dart' as package_config;
-import 'package:quiver/iterables.dart' as quiverIterables;
+import 'package:path/path.dart' as path;
+import 'package:pub_semver/pub_semver.dart';
+import 'package:quiver/iterables.dart' as quiver;
 
 int byName(Nameable a, Nameable b) =>
     compareAsciiLowerCaseNatural(a.name, b.name);
@@ -158,6 +160,7 @@
 /// the one in the public namespace that will be documented.
 abstract class Inheritable implements ModelElement {
   bool get isInherited;
+
   bool _canonicalEnclosingClassIsSet = false;
   Class _canonicalEnclosingClass;
   Class _definingEnclosingClass;
@@ -264,6 +267,7 @@
   Inheritable get overriddenElement;
 
   bool _isOverride;
+
   bool get isOverride {
     if (_isOverride == null) {
       // The canonical version of the enclosing element -- not canonicalEnclosingElement,
@@ -300,6 +304,7 @@
   }
 
   int _overriddenDepth;
+
   @override
   int get overriddenDepth {
     if (_overriddenDepth == null) {
@@ -335,6 +340,7 @@
 
   ModelElement _enclosingElement;
   bool _isInherited = false;
+
   InheritableAccessor(PropertyAccessorElement element, Library library,
       PackageGraph packageGraph)
       : super(element, library, packageGraph, null);
@@ -359,6 +365,7 @@
 
   bool _overriddenElementIsSet = false;
   ModelElement _overriddenElement;
+
   @override
   InheritableAccessor get overriddenElement {
     assert(packageGraph.allLibrariesAdded);
@@ -501,6 +508,7 @@
   }
 
   bool get isGetter => _accessor.isGetter;
+
   bool get isSetter => _accessor.isSetter;
 
   @override
@@ -562,6 +570,7 @@
 
   bool get hasPublicSuperclassConstraints =>
       publicSuperclassConstraints.isNotEmpty;
+
   Iterable<ParameterizedElementType> get publicSuperclassConstraints =>
       filterNonPublic(superclassConstraints);
 
@@ -615,6 +624,7 @@
   }
 
   Constructor _defaultConstructor;
+
   Constructor get defaultConstructor {
     if (_defaultConstructor == null) {
       _defaultConstructor = constructors
@@ -624,7 +634,7 @@
   }
 
   Iterable<Method> get allInstanceMethods =>
-      quiverIterables.concat([instanceMethods, inheritedMethods]);
+      quiver.concat([instanceMethods, inheritedMethods]);
 
   Iterable<Method> get allPublicInstanceMethods =>
       filterNonPublic(allInstanceMethods);
@@ -633,9 +643,9 @@
       instanceMethods.every((f) => f.isInherited);
 
   Iterable<Field> get allInstanceFields =>
-      quiverIterables.concat([instanceProperties, inheritedProperties]);
+      quiver.concat([instanceProperties, inheritedProperties]);
 
-  Iterable<Accessor> get allAccessors => quiverIterables.concat([
+  Iterable<Accessor> get allAccessors => quiver.concat([
         allInstanceFields.expand((f) => f.allAccessors),
         constants.map((c) => c.getter)
       ]);
@@ -647,7 +657,7 @@
       allPublicInstanceProperties.every((f) => f.isInherited);
 
   Iterable<Operator> get allOperators =>
-      quiverIterables.concat([operators, inheritedOperators]);
+      quiver.concat([operators, inheritedOperators]);
 
   Iterable<Operator> get allPublicOperators => filterNonPublic(allOperators);
 
@@ -665,6 +675,7 @@
   Iterable<Field> get publicConstants => filterNonPublic(constants);
 
   Map<Element, ModelElement> _allElements;
+
   Map<Element, ModelElement> get allElements {
     if (_allElements == null) {
       _allElements = new Map();
@@ -706,8 +717,9 @@
     if (_membersByName == null) {
       _membersByName = new Map();
       for (ModelElement me in allModelElements) {
-        if (!_membersByName.containsKey(me.name))
+        if (!_membersByName.containsKey(me.name)) {
           _membersByName[me.name] = new List();
+        }
         _membersByName[me.name].add(me);
       }
     }
@@ -724,10 +736,11 @@
   }
 
   List<ModelElement> _allModelElements;
+
   List<ModelElement> get allModelElements {
     if (_allModelElements == null) {
       _allModelElements = new List.from(
-          quiverIterables.concat([
+          quiver.concat([
             allInstanceMethods,
             allInstanceFields,
             allAccessors,
@@ -744,6 +757,7 @@
   }
 
   List<ModelElement> _allCanonicalModelElements;
+
   List<ModelElement> get allCanonicalModelElements {
     return (_allCanonicalModelElements ??=
         allModelElements.where((e) => e.isCanonical).toList());
@@ -813,8 +827,9 @@
 
   @override
   String get href {
-    if (!identical(canonicalModelElement, this))
+    if (!identical(canonicalModelElement, this)) {
       return canonicalModelElement?.href;
+    }
     assert(canonicalLibrary != null);
     assert(canonicalLibrary == library);
     return '${package.baseHref}${library.dirName}/$fileName';
@@ -914,7 +929,9 @@
 
   Iterable<Field> get publicInstanceProperties =>
       filterNonPublic(instanceProperties);
+
   List<DefinedElementType> get interfaces => _interfaces;
+
   Iterable<DefinedElementType> get publicInterfaces =>
       filterNonPublic(interfaces);
 
@@ -991,6 +1008,7 @@
   /// to include them in the set of things we might link to for documentation
   /// purposes in abstract classes.
   List<Class> _inheritanceChain;
+
   List<Class> get inheritanceChain {
     if (_inheritanceChain == null) {
       _inheritanceChain = [];
@@ -1036,16 +1054,20 @@
 
   Iterable<DefinedElementType> get publicSuperChain =>
       filterNonPublic(superChain);
+
   Iterable<DefinedElementType> get publicSuperChainReversed =>
       publicSuperChain.toList().reversed;
 
   List<ExecutableElement> __inheritedElements;
+
   List<ExecutableElement> get _inheritedElements {
     if (__inheritedElements == null) {
       Map<String, ExecutableElement> cmap = definingLibrary.inheritanceManager
-          .getMembersInheritedFromClasses(element); // ignore: deprecated_member_use
+          .getMembersInheritedFromClasses(
+              element); // ignore: deprecated_member_use
       Map<String, ExecutableElement> imap = definingLibrary.inheritanceManager
-          .getMembersInheritedFromInterfaces(element); // ignore: deprecated_member_use
+          .getMembersInheritedFromInterfaces(
+              element); // ignore: deprecated_member_use
       __inheritedElements = new List.from(cmap.values)
         ..addAll(imap.values.where((e) => !cmap.containsKey(e.name)));
     }
@@ -1130,7 +1152,8 @@
         f = getterElement.variable;
       } else if (getter == null && setter != null) {
         f = setterElement.variable;
-      } else /* getter != null && setter != null */ {
+      } else
+      /* getter != null && setter != null */ {
         // In cases where a Field is composed of two Accessors defined in
         // different places in the inheritance chain, there are two FieldElements
         // for this single Field we're trying to compose.  Pick the one closest
@@ -1174,6 +1197,7 @@
   }
 
   List<TypeParameter> _typeParameters;
+
   // a stronger hash?
   @override
   List<TypeParameter> get typeParameters {
@@ -1224,8 +1248,9 @@
 
   @override
   String get href {
-    if (!identical(canonicalModelElement, this))
+    if (!identical(canonicalModelElement, this)) {
       return canonicalModelElement?.href;
+    }
     assert(canonicalLibrary != null);
     assert(canonicalLibrary == library);
     return '${package.baseHref}${enclosingElement.library.dirName}/${enclosingElement.name}/$name.html';
@@ -1245,6 +1270,7 @@
   DefinedElementType get modelType => super.modelType;
 
   String _name;
+
   @override
   String get name {
     if (_name == null) {
@@ -1259,6 +1285,7 @@
   }
 
   String _nameWithGenerics;
+
   @override
   String get nameWithGenerics {
     if (_nameWithGenerics == null) {
@@ -1288,12 +1315,19 @@
 /// both of which have documentation.
 abstract class Documentable extends Nameable {
   String get documentation;
+
   String get documentationAsHtml;
+
   bool get hasDocumentation;
+
   bool get hasExtendedDocumentation;
+
   String get oneLineDoc;
+
   PackageGraph get packageGraph;
+
   bool get isDocumented;
+
   DartdocOptionContext get config;
 }
 
@@ -1396,6 +1430,7 @@
   bool _hasCategorization;
 
   Iterable<Category> _categories;
+
   Iterable<Category> get categories {
     if (_categories == null) {
       _categories = categoryNames
@@ -1425,6 +1460,7 @@
 class ModelCommentReference {
   final String name;
   final Element staticElement;
+
   ModelCommentReference(CommentReference ref)
       : name = ref.identifier.name,
         staticElement = ref.identifier.staticElement;
@@ -1485,9 +1521,11 @@
 /// Classes extending this class have canonicalization support in Dartdoc.
 abstract class Canonicalization implements Locatable, Documentable {
   bool get isCanonical;
+
   Library get canonicalLibrary;
 
   List<ModelCommentReference> _commentRefs;
+
   List<ModelCommentReference> get commentRefs => _commentRefs;
 
   /// Pieces of the location split by [locationSplitter] (removing package: and
@@ -1581,6 +1619,7 @@
       : super(element, library, packageGraph);
 
   List<EnumField> _instanceProperties;
+
   @override
   List<EnumField> get instanceProperties {
     if (_instanceProperties == null) {
@@ -1639,8 +1678,9 @@
 
   @override
   String get href {
-    if (!identical(canonicalModelElement, this))
+    if (!identical(canonicalModelElement, this)) {
       return canonicalModelElement?.href;
+    }
     assert(!(canonicalLibrary == null || canonicalEnclosingElement == null));
     assert(canonicalLibrary == library);
     assert(canonicalEnclosingElement == enclosingElement);
@@ -1730,8 +1770,9 @@
 
   @override
   String get href {
-    if (!identical(canonicalModelElement, this))
+    if (!identical(canonicalModelElement, this)) {
       return canonicalModelElement?.href;
+    }
     assert(canonicalLibrary != null);
     assert(canonicalEnclosingElement == enclosingElement);
     assert(canonicalLibrary == library);
@@ -1862,10 +1903,12 @@
 
   Set<String> get comboFeatures {
     Set<String> allFeatures = new Set();
-    if (hasExplicitGetter && hasPublicGetter)
+    if (hasExplicitGetter && hasPublicGetter) {
       allFeatures.addAll(getter.features);
-    if (hasExplicitSetter && hasPublicSetter)
+    }
+    if (hasExplicitSetter && hasPublicSetter) {
       allFeatures.addAll(setter.features);
+    }
     if (readOnly && !isFinal && !isConst) allFeatures.add('read-only');
     if (writeOnly) allFeatures.add('write-only');
     if (readWrite) allFeatures.add('read / write');
@@ -1877,6 +1920,7 @@
 
   @override
   ModelElement enclosingElement;
+
   bool get isInherited;
 
   Expression get constantInitializer =>
@@ -1907,13 +1951,16 @@
   }
 
   String get constantValue => linkifyConstantValue(constantValueBase);
+
   String get constantValueTruncated =>
       linkifyConstantValue(truncateString(constantValueBase, 200));
   String _constantValueBase;
+
   String get constantValueBase =>
       _constantValueBase ??= _buildConstantValueBase();
 
   bool get hasPublicGetter => hasGetter && getter.isPublic;
+
   bool get hasPublicSetter => hasSetter && setter.isPublic;
 
   @override
@@ -1928,9 +1975,10 @@
       } else if (hasPublicSetter) {
         _documentationFrom.addAll(setter.documentationFrom);
       }
-      if (_documentationFrom.isEmpty||
-          _documentationFrom.every((e) => e.documentationComment == ''))
+      if (_documentationFrom.isEmpty ||
+          _documentationFrom.every((e) => e.documentationComment == '')) {
         _documentationFrom = computeDocumentationFrom;
+      }
     }
     return _documentationFrom;
   }
@@ -1941,6 +1989,7 @@
       hasPublicSetter &&
           !setter.isSynthetic &&
           setter.documentation.isNotEmpty);
+
   bool get getterSetterBothAvailable => (hasPublicGetter &&
       getter.documentation.isNotEmpty &&
       hasPublicSetter &&
@@ -2014,11 +2063,13 @@
   }
 
   bool get hasExplicitGetter => hasPublicGetter && !getter.isSynthetic;
+
   bool get hasExplicitSetter => hasPublicSetter && !setter.isSynthetic;
 
   bool get hasGetter => getter != null;
 
   bool get hasNoGetterSetter => !hasGetterOrSetter;
+
   bool get hasGetterOrSetter => hasExplicitGetter || hasExplicitSetter;
 
   bool get hasSetter => setter != null;
@@ -2037,6 +2088,7 @@
   }
 
   bool get readOnly => hasPublicGetter && !hasPublicSetter;
+
   bool get readWrite => hasPublicGetter && hasPublicSetter;
 
   bool get writeOnly => hasPublicSetter && !hasPublicGetter;
@@ -2049,6 +2101,7 @@
 class _HashableChildLibraryElementVisitor
     extends GeneralizingElementVisitor<void> {
   final void Function(Element) libraryProcessor;
+
   _HashableChildLibraryElementVisitor(this.libraryProcessor);
 
   @override
@@ -2108,6 +2161,7 @@
   List<String> _allOriginalModelElementNames;
 
   final Package _package;
+
   @override
   Package get package {
     // Everything must be in a package.  TODO(jcollins-g): Support other things
@@ -2172,8 +2226,9 @@
       return false;
     }
     if (config.isLibraryExcluded(name) ||
-        config.isLibraryExcluded(element.librarySource.uri.toString()))
+        config.isLibraryExcluded(element.librarySource.uri.toString())) {
       return false;
+    }
     return true;
   }
 
@@ -2249,6 +2304,7 @@
   }
 
   String _dirName;
+
   String get dirName {
     if (_dirName == null) {
       _dirName = name;
@@ -2371,17 +2427,19 @@
 
   @override
   String get href {
-    if (!identical(canonicalModelElement, this))
+    if (!identical(canonicalModelElement, this)) {
       return canonicalModelElement?.href;
+    }
     return '${package.baseHref}${library.dirName}/$fileName';
   }
 
   // ignore: deprecated_member_use
   InheritanceManager _inheritanceManager;
+
   // ignore: deprecated_member_use
   InheritanceManager get inheritanceManager {
     if (_inheritanceManager == null) {
-  // ignore: deprecated_member_use
+      // ignore: deprecated_member_use
       _inheritanceManager = new InheritanceManager(element);
     }
     return _inheritanceManager;
@@ -2425,6 +2483,7 @@
 
   /// The real packageMeta, as opposed to the package we are documenting with.
   PackageMeta _packageMeta;
+
   PackageMeta get packageMeta {
     if (_packageMeta == null) {
       _packageMeta = new PackageMeta.fromElement(element, config);
@@ -2514,11 +2573,13 @@
     _variables = [];
     for (TopLevelVariableElement element in elements) {
       Accessor getter;
-      if (element.getter != null)
+      if (element.getter != null) {
         getter = new ModelElement.from(element.getter, this, packageGraph);
+      }
       Accessor setter;
-      if (element.setter != null)
+      if (element.setter != null) {
         setter = new ModelElement.from(element.setter, this, packageGraph);
+      }
       ModelElement me = new ModelElement.from(element, this, packageGraph,
           getter: getter, setter: setter);
       _variables.add(me);
@@ -2567,7 +2628,7 @@
     String name = element.name;
     if (name == null || name.isEmpty) {
       // handle the case of an anonymous library
-      name = pathLib.basename(source.fullName);
+      name = path.basename(source.fullName);
 
       if (name.endsWith('.dart')) {
         name = name.substring(0, name.length - '.dart'.length);
@@ -2602,27 +2663,28 @@
   }
 
   Map<Element, Set<ModelElement>> _modelElementsMap;
+
   Map<Element, Set<ModelElement>> get modelElementsMap {
     if (_modelElementsMap == null) {
-      Iterable<ModelElement> results = quiverIterables.concat([
+      Iterable<ModelElement> results = quiver.concat([
         library.constants,
         library.functions,
         library.properties,
         library.typedefs,
         library.allClasses.expand((c) {
-          return quiverIterables.concat([
+          return quiver.concat([
             [c],
             c.allModelElements
           ]);
         }),
         library.enums.expand((e) {
-          return quiverIterables.concat([
+          return quiver.concat([
             [e],
             e.allModelElements
           ]);
         }),
         library.mixins.expand((m) {
-          return quiverIterables.concat([
+          return quiver.concat([
             [m],
             m.allModelElements
           ]);
@@ -2640,6 +2702,7 @@
   }
 
   List<ModelElement> _allModelElements;
+
   Iterable<ModelElement> get allModelElements {
     if (_allModelElements == null) {
       _allModelElements = [];
@@ -2651,6 +2714,7 @@
   }
 
   List<ModelElement> _allCanonicalModelElements;
+
   Iterable<ModelElement> get allCanonicalModelElements {
     return (_allCanonicalModelElements ??=
         allModelElements.where((e) => e.isCanonical).toList());
@@ -2700,8 +2764,9 @@
 
   @override
   String get href {
-    if (!identical(canonicalModelElement, this))
+    if (!identical(canonicalModelElement, this)) {
       return canonicalModelElement?.href;
+    }
     assert(!(canonicalLibrary == null || canonicalEnclosingElement == null));
     assert(canonicalLibrary == library);
     assert(canonicalEnclosingElement == enclosingElement);
@@ -2844,6 +2909,7 @@
     with Privacy, Warnable, Nameable, SourceCodeMixin, Indexable
     implements Comparable, Documentable {
   final Element _element;
+
   // TODO(jcollins-g): This really wants a "member that has a type" class.
   final Member _originalMember;
   final Library _library;
@@ -2983,20 +3049,22 @@
           newModelElement = new Constructor(e, library, packageGraph);
         }
         if (e is MethodElement && e.isOperator) {
-          if (enclosingClass == null)
+          if (enclosingClass == null) {
             newModelElement = new Operator(e, library, packageGraph);
-          else
+          } else {
             newModelElement = new Operator.inherited(
                 e, enclosingClass, library, packageGraph,
                 originalMember: originalMember);
+          }
         }
         if (e is MethodElement && !e.isOperator) {
-          if (enclosingClass == null)
+          if (enclosingClass == null) {
             newModelElement = new Method(e, library, packageGraph);
-          else
+          } else {
             newModelElement = new Method.inherited(
                 e, enclosingClass, library, packageGraph,
                 originalMember: originalMember);
+          }
         }
         if (e is TopLevelVariableElement) {
           assert(getter != null || setter != null);
@@ -3007,13 +3075,14 @@
           // TODO(jcollins-g): why test for ClassElement in enclosingElement?
           if (e.enclosingElement is ClassElement ||
               e is MultiplyInheritedExecutableElement) {
-            if (enclosingClass == null)
+            if (enclosingClass == null) {
               newModelElement =
                   new InheritableAccessor(e, library, packageGraph);
-            else
+            } else {
               newModelElement = new InheritableAccessor.inherited(
                   e, library, packageGraph, enclosingClass,
                   originalMember: originalMember);
+            }
           } else {
             newModelElement = new Accessor(e, library, packageGraph, null);
           }
@@ -3060,6 +3129,7 @@
   }
 
   ModelNode _modelNode;
+
   @override
   ModelNode get modelNode =>
       _modelNode ??= packageGraph._getModelNodeFor(element);
@@ -3108,6 +3178,7 @@
   }
 
   bool _isPublic;
+
   @override
   bool get isPublic {
     if (_isPublic == null) {
@@ -3150,6 +3221,7 @@
   }
 
   DartdocOptionContext _config;
+
   @override
   DartdocOptionContext get config {
     if (_config == null) {
@@ -3206,10 +3278,12 @@
   // Returns the canonical ModelElement for this ModelElement, or null
   // if there isn't one.
   ModelElement _canonicalModelElement;
+
   ModelElement get canonicalModelElement =>
       _canonicalModelElement ??= _buildCanonicalModelElement();
 
   List<ModelElement> _documentationFrom;
+
   // TODO(jcollins-g): untangle when mixins can call super
   @override
   List<ModelElement> get documentationFrom {
@@ -3221,6 +3295,7 @@
 
   bool get hasSourceHref => sourceHref.isNotEmpty;
   String _sourceHref;
+
   String get sourceHref {
     _sourceHref ??= new SourceLinker.fromElement(this).href();
     return _sourceHref;
@@ -3309,6 +3384,7 @@
   /// definitions are stripped, but macros themselves are not injected.  This
   /// is a two stage process to avoid ordering problems.
   String _documentationLocal;
+
   String get documentationLocal =>
       _documentationLocal ??= _buildDocumentationLocal();
 
@@ -3323,9 +3399,11 @@
       packageGraph.findButDoNotCreateLibraryFor(element);
 
   Library _canonicalLibrary;
+
   // _canonicalLibrary can be null so we can't check against null to see whether
   // we tried to compute it before.
   bool _canonicalLibraryIsSet = false;
+
   @override
   Library get canonicalLibrary {
     if (!_canonicalLibraryIsSet) {
@@ -3357,8 +3435,9 @@
             Element lookup = (l.element as LibraryElement)
                 .exportNamespace
                 .definedNames[topLevelElement?.name];
-            if (lookup is PropertyAccessorElement)
+            if (lookup is PropertyAccessorElement) {
               lookup = (lookup as PropertyAccessorElement).variable;
+            }
             if (topLevelElement == lookup) return true;
             return false;
           }).toList();
@@ -3402,8 +3481,9 @@
                   message: message, extendedDebug: debugLines);
             }
           }
-          if (candidateLibraries.isNotEmpty)
+          if (candidateLibraries.isNotEmpty) {
             _canonicalLibrary = candidateLibraries.last;
+          }
         }
       } else {
         _canonicalLibrary = definingLibrary;
@@ -3446,6 +3526,7 @@
   }
 
   String _htmlDocumentation;
+
   @override
   String get documentationAsHtml {
     if (_htmlDocumentation != null) return _htmlDocumentation;
@@ -3460,9 +3541,9 @@
   String get location {
     // Call nothing from here that can emit warnings or you'll cause stack overflows.
     if (lineAndColumn != null) {
-      return "(${pathLib.toUri(sourceFileName)}:${lineAndColumn.item1}:${lineAndColumn.item2})";
+      return "(${path.toUri(sourceFileName)}:${lineAndColumn.item1}:${lineAndColumn.item2})";
     }
-    return "(${pathLib.toUri(sourceFileName)})";
+    return "(${path.toUri(sourceFileName)})";
   }
 
   /// Returns a link to extended documentation, or the empty string if that
@@ -3497,6 +3578,7 @@
 
   Tuple2<int, int> _lineAndColumn;
   bool _isLineNumberComputed = false;
+
   @override
   Tuple2<int, int> get lineAndColumn {
     // TODO(jcollins-g): implement lineAndColumn for explicit fields
@@ -3631,6 +3713,7 @@
   String computeOneLineDoc() =>
       '${_documentation.asOneLiner}${extendedDocLink.isEmpty ? "" : " $extendedDocLink"}';
   String _oneLineDoc;
+
   @override
   String get oneLineDoc {
     if (_oneLineDoc == null) {
@@ -3642,6 +3725,7 @@
   Member get originalMember => _originalMember;
 
   final PackageGraph _packageGraph;
+
   @override
   PackageGraph get packageGraph => _packageGraph;
 
@@ -3652,6 +3736,7 @@
       isPublic && library.packageGraph.packageDocumentedFor(this);
 
   List<Parameter> _allParameters;
+
   // TODO(jcollins-g): This is in the wrong place.  Move parts to GetterSetterCombo,
   // elsewhere as appropriate?
   List<Parameter> get allParameters {
@@ -3724,6 +3809,7 @@
 
   bool _documentationCommentComputed = false;
   String _documentationComment;
+
   String get documentationComment {
     if (_documentationCommentComputed == false) {
       _documentationComment = _computeDocumentationComment();
@@ -3797,8 +3883,9 @@
       if (typeName.isNotEmpty) {
         buf.write('<span class="type-annotation">$typeName</span>');
       }
-      if (typeName.isNotEmpty && showNames && param.name.isNotEmpty)
+      if (typeName.isNotEmpty && showNames && param.name.isNotEmpty) {
         buf.write(' ');
+      }
       if (showNames && param.name.isNotEmpty) {
         buf.write('<span class="parameter-name">${param.name}</span>');
       }
@@ -3817,7 +3904,9 @@
   }
 
   String linkedParams(
-      {bool showMetadata = true, bool showNames = true, String separator = ', '}) {
+      {bool showMetadata = true,
+      bool showNames = true,
+      String separator = ', '}) {
     List<Parameter> requiredParams =
         parameters.where((Parameter p) => !p.isOptional).toList();
     List<Parameter> positionalParams =
@@ -3931,11 +4020,11 @@
         return '';
       }
       var lang =
-          args['lang'] ?? pathLib.extension(args['src']).replaceFirst('.', '');
+          args['lang'] ?? path.extension(args['src']).replaceFirst('.', '');
 
       var replacement = match[0]; // default to fully matched string.
 
-      var fragmentFile = new File(pathLib.join(dirPath, args['file']));
+      var fragmentFile = new File(path.join(dirPath, args['file']));
       if (fragmentFile.existsSync()) {
         replacement = fragmentFile.readAsStringSync();
         if (lang.isNotEmpty) {
@@ -4044,7 +4133,7 @@
               'SOURCE_PATH': (sourceFileName == null ||
                       package?.packagePath == null)
                   ? null
-                  : pathLib.relative(sourceFileName, from: package.packagePath),
+                  : path.relative(sourceFileName, from: package.packagePath),
               'PACKAGE_PATH': package?.packagePath,
               'PACKAGE_NAME': package?.name,
               'LIBRARY_NAME': library?.fullyQualifiedName,
@@ -4465,8 +4554,9 @@
     // by an equals sign), add a "--" in front so that they parse as options.
     return matches.map<String>((Match match) {
       var option = '';
-      if (convertToArgs && match[1] != null && !match[1].startsWith('-'))
+      if (convertToArgs && match[1] != null && !match[1].startsWith('-')) {
         option = '--';
+      }
       if (match[2] != null) {
         // This arg has quotes, so strip them.
         return '$option${match[1] ?? ''}${match[3] ?? ''}${match[4] ?? ''}';
@@ -4521,14 +4611,14 @@
     var file = src + fragExtension;
     var region = args['region'] ?? '';
     if (region.isNotEmpty) {
-      var dir = pathLib.dirname(src);
-      var basename = pathLib.basenameWithoutExtension(src);
-      var ext = pathLib.extension(src);
-      file = pathLib.join(dir, '$basename-$region$ext$fragExtension');
+      var dir = path.dirname(src);
+      var basename = path.basenameWithoutExtension(src);
+      var ext = path.extension(src);
+      file = path.join(dir, '$basename-$region$ext$fragExtension');
     }
     args['file'] = config.examplePathPrefix == null
         ? file
-        : pathLib.join(config.examplePathPrefix, file);
+        : path.join(config.examplePathPrefix, file);
     return args;
   }
 }
@@ -4590,8 +4680,9 @@
   String get name {
     Element e = element;
     while (e != null) {
-      if (e is FunctionTypeAliasElement || e is GenericTypeAliasElement)
+      if (e is FunctionTypeAliasElement || e is GenericTypeAliasElement) {
         return e.name;
+      }
       e = e.enclosingElement;
     }
     assert(false);
@@ -4622,8 +4713,9 @@
 
   @override
   String get href {
-    if (!identical(canonicalModelElement, this))
+    if (!identical(canonicalModelElement, this)) {
       return canonicalModelElement?.href;
+    }
     assert(canonicalLibrary != null);
     assert(canonicalLibrary == library);
     return '${package.baseHref}${library.dirName}/$fileName';
@@ -4646,9 +4738,11 @@
 /// Something that has a name.
 abstract class Nameable {
   String get name;
+
   String get fullyQualifiedName => name;
 
   Set<String> _namePieces;
+
   Set<String> get namePieces {
     if (_namePieces == null) {
       _namePieces = new Set()
@@ -4676,7 +4770,9 @@
 /// Something able to be indexed.
 abstract class Indexable implements Nameable {
   String get href;
+
   String get kind;
+
   int get overriddenDepth => 0;
 }
 
@@ -4782,7 +4878,9 @@
     // Go through docs of every ModelElement in package to pre-build the macros
     // index.  Uses toList() in order to get all the precaching on the stack.
     List<Future> precacheFutures = precacheLocalDocs().toList();
-    for (Future f in precacheFutures) await f;
+    for (Future f in precacheFutures) {
+      await f;
+    }
     _localDocumentationBuilt = true;
 
     // Scan all model elements to insure that interceptor and other special
@@ -4808,9 +4906,10 @@
     Set<ModelElement> precachedElements = new Set();
 
     Iterable<Future> precacheOneElement(ModelElement m) sync* {
-      for (ModelElement d in m.documentationFrom.where((d) => d.documentationComment != null)) {
-        if (needsPrecacheRegExp.hasMatch(d.documentationComment)
-            && !precachedElements.contains(d)) {
+      for (ModelElement d
+          in m.documentationFrom.where((d) => d.documentationComment != null)) {
+        if (needsPrecacheRegExp.hasMatch(d.documentationComment) &&
+            !precachedElements.contains(d)) {
           precachedElements.add(d);
           yield d._precacheLocalDocs();
         }
@@ -4830,6 +4929,7 @@
   // Many ModelElements have the same ModelNode; don't build/cache this data more
   // than once for them.
   final Map<Element, ModelNode> _modelNodes = Map();
+
   void _populateModelNodeFor(
       Element element, Map<String, CompilationUnit> compilationUnitMap) {
     _modelNodes.putIfAbsent(element,
@@ -4850,6 +4950,7 @@
   }
 
   Map<String, Set<ModelElement>> _findRefElementCache;
+
   Map<String, Set<ModelElement>> get findRefElementCache {
     if (_findRefElementCache == null) {
       assert(packageGraph.allLibrariesAdded);
@@ -4895,6 +4996,7 @@
   final DartdocOptionContext config;
 
   Package _defaultPackage;
+
   Package get defaultPackage {
     if (_defaultPackage == null) {
       _defaultPackage = new Package.fromPackageMeta(packageMeta, this);
@@ -4915,6 +5017,7 @@
   final DartSdk sdk;
 
   Map<Source, SdkLibrary> _sdkLibrarySources;
+
   Map<Source, SdkLibrary> get sdkLibrarySources {
     if (_sdkLibrarySources == null) {
       _sdkLibrarySources = new Map();
@@ -4935,6 +5038,7 @@
   /// Usable as a cross-check for dartdoc's canonicalization to generate
   /// warnings for ModelElement.isPublicAndPackageDocumented.
   Set<String> _allRootDirs;
+
   bool packageDocumentedFor(ModelElement element) {
     if (_allRootDirs == null) {
       _allRootDirs = new Set()
@@ -4947,6 +5051,7 @@
 
   final Set<Tuple3<Element, PackageWarning, String>> _warnAlreadySeen =
       new Set();
+
   void warnOnElement(Warnable warnable, PackageWarning kind,
       {String message,
       Iterable<Locatable> referredFrom,
@@ -4980,8 +5085,9 @@
       if (warnable is Accessor) {
         // This might be part of a Field, if so, assign this warning to the field
         // rather than the Accessor.
-        if ((warnable as Accessor).enclosingCombo != null)
+        if ((warnable as Accessor).enclosingCombo != null) {
           warnable = (warnable as Accessor).enclosingCombo;
+        }
       }
     } else {
       // If we don't have an element, we need a message to disambiguate.
@@ -5131,16 +5237,18 @@
   List<Package> get packages => packageMap.values.toList();
 
   List<Package> _publicPackages;
+
   List<Package> get publicPackages {
     if (_publicPackages == null) {
       assert(allLibrariesAdded);
       // Help the user if they pass us a package that doesn't exist.
       for (String packageName in config.packageOrder) {
-        if (!packages.map((p) => p.name).contains(packageName))
+        if (!packages.map((p) => p.name).contains(packageName)) {
           warnOnElement(
               null, PackageWarning.packageOrderGivesMissingPackageName,
               message:
                   "${packageName}, packages: ${packages.map((p) => p.name).join(',')}");
+        }
       }
       _publicPackages = packages.where((p) => p.isPublic).toList()..sort();
     }
@@ -5159,6 +5267,7 @@
 
   /// Prevent cycles from breaking our stack.
   Set<Tuple2<Library, LibraryElement>> _reexportsTagged = new Set();
+
   void _tagReexportsFor(
       final Library topLevelLibrary, final LibraryElement libraryElement,
       [ExportElement lastExportedElement]) {
@@ -5187,6 +5296,7 @@
   }
 
   int _lastSizeOfAllLibraries = 0;
+
   Map<LibraryElement, Set<Library>> get libraryElementReexportedBy {
     // Table must be reset if we're still in the middle of adding libraries.
     if (allLibraries.keys.length != _lastSizeOfAllLibraries) {
@@ -5263,6 +5373,7 @@
       packages.expand((p) => p.libraries).toList()..sort();
 
   List<Library> _publicLibraries;
+
   Iterable<Library> get publicLibraries {
     if (_publicLibraries == null) {
       assert(allLibrariesAdded);
@@ -5272,6 +5383,7 @@
   }
 
   List<Library> _localLibraries;
+
   Iterable<Library> get localLibraries {
     if (_localLibraries == null) {
       assert(allLibrariesAdded);
@@ -5282,6 +5394,7 @@
   }
 
   List<Library> _localPublicLibraries;
+
   Iterable<Library> get localPublicLibraries {
     if (_localPublicLibraries == null) {
       assert(allLibrariesAdded);
@@ -5461,10 +5574,12 @@
         Accessor getter;
         Accessor setter;
         if (e is PropertyInducingElement) {
-          if (e.getter != null)
+          if (e.getter != null) {
             getter = new ModelElement.from(e.getter, lib, packageGraph);
-          if (e.setter != null)
+          }
+          if (e.setter != null) {
             setter = new ModelElement.from(e.setter, lib, packageGraph);
+          }
         }
         modelElement = new ModelElement.from(e, lib, packageGraph,
             getter: getter, setter: setter);
@@ -5515,6 +5630,7 @@
   }
 
   List<ModelElement> _allModelElements;
+
   Iterable<ModelElement> get allModelElements {
     assert(allLibrariesAdded);
     if (_allModelElements == null) {
@@ -5543,6 +5659,7 @@
   }
 
   List<ModelElement> _allLocalModelElements;
+
   Iterable<ModelElement> get allLocalModelElements {
     assert(allLibrariesAdded);
     if (_allLocalModelElements == null) {
@@ -5555,6 +5672,7 @@
   }
 
   List<ModelElement> _allCanonicalModelElements;
+
   Iterable<ModelElement> get allCanonicalModelElements {
     return (_allCanonicalModelElements ??=
         allLocalModelElements.where((e) => e.isCanonical).toList());
@@ -5597,31 +5715,52 @@
   List<Typedef> _typedefs;
 
   Iterable<Class> get classes => _classes;
+
   Iterable<Enum> get enums => _enums;
+
   Iterable<Mixin> get mixins => _mixins;
+
   Iterable<Class> get exceptions => _exceptions;
+
   Iterable<TopLevelVariable> get constants => _constants;
+
   Iterable<TopLevelVariable> get properties => _properties;
+
   Iterable<ModelFunction> get functions => _functions;
+
   Iterable<Typedef> get typedefs => _typedefs;
 
   bool get hasPublicClasses => publicClasses.isNotEmpty;
+
   bool get hasPublicConstants => publicConstants.isNotEmpty;
+
   bool get hasPublicEnums => publicEnums.isNotEmpty;
+
   bool get hasPublicExceptions => publicExceptions.isNotEmpty;
+
   bool get hasPublicFunctions => publicFunctions.isNotEmpty;
+
   bool get hasPublicMixins => publicMixins.isNotEmpty;
+
   bool get hasPublicProperties => publicProperties.isNotEmpty;
+
   bool get hasPublicTypedefs => publicTypedefs.isNotEmpty;
 
   Iterable<Class> get publicClasses => filterNonPublic(classes);
+
   Iterable<TopLevelVariable> get publicConstants => filterNonPublic(constants);
+
   Iterable<Enum> get publicEnums => filterNonPublic(enums);
+
   Iterable<Class> get publicExceptions => filterNonPublic(exceptions);
+
   Iterable<ModelFunction> get publicFunctions => filterNonPublic(functions);
+
   Iterable<Mixin> get publicMixins => filterNonPublic(mixins);
+
   Iterable<TopLevelVariable> get publicProperties =>
       filterNonPublic(properties);
+
   Iterable<Typedef> get publicTypedefs => filterNonPublic(typedefs);
 }
 
@@ -5631,10 +5770,13 @@
 abstract class LibraryContainer
     implements Nameable, Comparable<LibraryContainer> {
   final List<Library> _libraries = [];
+
   List<Library> get libraries => _libraries;
 
   PackageGraph get packageGraph;
+
   Iterable<Library> get publicLibraries => filterNonPublic(libraries);
+
   bool get hasPublicLibraries => publicLibraries.isNotEmpty;
 
   /// The name of the container or object that this LibraryContainer is a part
@@ -5687,6 +5829,7 @@
   String get documentation => documentationFile?.contents;
 
   Documentation __documentation;
+
   Documentation get _documentation {
     if (__documentation != null) return __documentation;
     __documentation = new Documentation.forElement(this);
@@ -5713,7 +5856,7 @@
   FileContents get documentationFile;
 
   @override
-  String get location => pathLib.toUri(documentationFile.file.path).toString();
+  String get location => path.toUri(documentationFile.file.path).toString();
 
   @override
   Set<String> get locationPieces => new Set.from(<String>[location]);
@@ -5811,6 +5954,7 @@
   DocumentLocation get documentedWhere => package.documentedWhere;
 
   bool _isDocumented;
+
   @override
   bool get isDocumented {
     if (_isDocumented == null) {
@@ -5856,10 +6000,10 @@
   bool get isCanonical => categoryDefinition != null;
 
   @override
-  // TODO(jcollins-g): Category?  Topic?  Group?  Stuff?  Find a better name.
   String get kind => 'Topic';
 
   FileContents _documentationFile;
+
   @override
   FileContents get documentationFile {
     if (_documentationFile == null) {
@@ -5927,8 +6071,10 @@
   }
 
   Package._(this._name, this._packageGraph, this._packageMeta);
+
   @override
   bool get isCanonical => true;
+
   @override
   Library get canonicalLibrary => null;
 
@@ -5944,7 +6090,9 @@
 
   bool get hasHomepage =>
       packageMeta.homepage != null && packageMeta.homepage.isNotEmpty;
+
   String get homepage => packageMeta.homepage;
+
   String get kind => (isSdk) ? 'SDK' : 'package';
 
   @override
@@ -5963,6 +6111,7 @@
   LibraryContainer get defaultCategory => nameToCategory[null];
 
   String _documentationAsHtml;
+
   @override
   String get documentationAsHtml {
     if (_documentationAsHtml != null) return _documentationAsHtml;
@@ -6000,6 +6149,7 @@
   Warnable get enclosingElement => null;
 
   bool _isPublic;
+
   @override
   bool get isPublic {
     if (_isPublic == null) _isPublic = libraries.any((l) => l.isPublic);
@@ -6046,6 +6196,7 @@
   String get fullyQualifiedName => 'package:$name';
 
   String _baseHref;
+
   String get baseHref {
     if (_baseHref == null) {
       if (documentedWhere == DocumentLocation.remote) {
@@ -6085,7 +6236,7 @@
   String get href => '${baseHref}index.html';
 
   @override
-  String get location => pathLib.toUri(packageMeta.resolvedDir).toString();
+  String get location => path.toUri(packageMeta.resolvedDir).toString();
 
   @override
   String get name => _name;
@@ -6127,6 +6278,7 @@
   }
 
   List<Category> _categories;
+
   List<Category> get categories {
     if (_categories == null) {
       _categories = nameToCategory.values.where((c) => c.name != null).toList()
@@ -6140,9 +6292,11 @@
 
   Iterable<Category> get documentedCategories =>
       categories.where((c) => c.isDocumented);
+
   bool get hasDocumentedCategories => documentedCategories.isNotEmpty;
 
   DartdocOptionContext _config;
+
   @override
   DartdocOptionContext get config {
     if (_config == null) {
@@ -6162,9 +6316,10 @@
   bool get isSdk => packageMeta.isSdk;
 
   String _packagePath;
+
   String get packagePath {
     if (_packagePath == null) {
-      _packagePath = pathLib.canonicalize(packageMeta.dir.path);
+      _packagePath = path.canonicalize(packageMeta.dir.path);
     }
     return _packagePath;
   }
@@ -6183,6 +6338,7 @@
   }
 
   final PackageMeta _packageMeta;
+
   PackageMeta get packageMeta => _packageMeta;
 
   @override
@@ -6197,6 +6353,7 @@
       ParameterElement element, Library library, PackageGraph packageGraph,
       {Member originalMember})
       : super(element, library, packageGraph, originalMember);
+
   String get defaultValue {
     if (!hasDefaultValue) return null;
     return _parameter.defaultValueCode;
@@ -6259,6 +6416,7 @@
   Library get library;
 
   String _sourceCode;
+
   String get sourceCode =>
       _sourceCode ??= modelNode == null ? '' : modelNode.sourceCode;
 }
@@ -6326,8 +6484,9 @@
 
   @override
   String get href {
-    if (!identical(canonicalModelElement, this))
+    if (!identical(canonicalModelElement, this)) {
       return canonicalModelElement?.href;
+    }
     assert(canonicalLibrary != null);
     assert(canonicalLibrary == library);
     return '${package.baseHref}${library.dirName}/$fileName';
@@ -6393,8 +6552,9 @@
 
   @override
   String get href {
-    if (!identical(canonicalModelElement, this))
+    if (!identical(canonicalModelElement, this)) {
       return canonicalModelElement?.href;
+    }
     assert(canonicalLibrary != null);
     assert(canonicalLibrary == library);
     return '${package.baseHref}${library.dirName}/$fileName';
@@ -6431,8 +6591,9 @@
 
   @override
   String get href {
-    if (!identical(canonicalModelElement, this))
+    if (!identical(canonicalModelElement, this)) {
       return canonicalModelElement?.href;
+    }
     assert(canonicalLibrary != null);
     assert(canonicalLibrary == library);
     return '${package.baseHref}${enclosingElement.library.dirName}/${enclosingElement.name}/$name';
@@ -6442,6 +6603,7 @@
   String get kind => 'type parameter';
 
   ElementType _boundType;
+
   ElementType get boundType {
     if (_boundType == null) {
       var bound = _typeParameter.bound;
@@ -6453,6 +6615,7 @@
   }
 
   String _name;
+
   @override
   String get name {
     if (_name == null) {
@@ -6495,6 +6658,7 @@
   }
 
   DartSdk _sdk;
+
   DartSdk get sdk {
     if (_sdk == null) {
       _sdk = new FolderBasedDartSdk(PhysicalResourceProvider.INSTANCE,
@@ -6504,6 +6668,7 @@
   }
 
   EmbedderSdk _embedderSdk;
+
   EmbedderSdk get embedderSdk {
     if (_embedderSdk == null && !config.topLevelPackageMeta.isSdk) {
       _embedderSdk = new EmbedderSdk(PhysicalResourceProvider.INSTANCE,
@@ -6512,17 +6677,17 @@
     return _embedderSdk;
   }
 
-  static Map<String, List<fileSystem.Folder>> _calculatePackageMap(
-      fileSystem.Folder dir) {
-    Map<String, List<fileSystem.Folder>> map = new Map();
+  static Map<String, List<file_system.Folder>> _calculatePackageMap(
+      file_system.Folder dir) {
+    Map<String, List<file_system.Folder>> map = new Map();
     var info = package_config.findPackagesFromFile(dir.toUri());
 
     for (String name in info.packages) {
       Uri uri = info.asMap()[name];
-      String path = pathLib.normalize(pathLib.fromUri(uri));
-      fileSystem.Resource resource =
-          PhysicalResourceProvider.INSTANCE.getResource(path);
-      if (resource is fileSystem.Folder) {
+      String packagePath = path.normalize(path.fromUri(uri));
+      file_system.Resource resource =
+          PhysicalResourceProvider.INSTANCE.getResource(packagePath);
+      if (resource is file_system.Folder) {
         map[name] = [resource];
       }
     }
@@ -6530,10 +6695,11 @@
     return map;
   }
 
-  Map<String, List<fileSystem.Folder>> _packageMap;
-  Map<String, List<fileSystem.Folder>> get packageMap {
+  Map<String, List<file_system.Folder>> _packageMap;
+
+  Map<String, List<file_system.Folder>> get packageMap {
     if (_packageMap == null) {
-      fileSystem.Folder cwd =
+      file_system.Folder cwd =
           PhysicalResourceProvider.INSTANCE.getResource(config.inputDir);
       _packageMap = _calculatePackageMap(cwd);
     }
@@ -6541,6 +6707,7 @@
   }
 
   DartUriResolver _embedderResolver;
+
   DartUriResolver get embedderResolver {
     if (_embedderResolver == null) {
       _embedderResolver = new DartUriResolver(embedderSdk);
@@ -6571,7 +6738,7 @@
     resolvers.add(new PackageWithoutSdkResolver(packageResolver, sdkResolver));
     resolvers.add(sdkResolver);
     resolvers.add(
-        new fileSystem.ResourceUriResolver(PhysicalResourceProvider.INSTANCE));
+        new file_system.ResourceUriResolver(PhysicalResourceProvider.INSTANCE));
 
     assert(
         resolvers.any((UriResolver resolver) => resolver is DartUriResolver));
@@ -6580,6 +6747,7 @@
   }
 
   AnalysisDriver _driver;
+
   AnalysisDriver get driver {
     if (_driver == null) {
       PerformanceLog log = new PerformanceLog(null);
@@ -6717,25 +6885,25 @@
   Iterable<String> findFilesToDocumentInPackage(
       String basePackageDir, bool autoIncludeDependencies,
       [bool filterExcludes = true]) sync* {
-    final String sep = pathLib.separator;
+    final String sep = path.separator;
 
     Set<String> packageDirs = new Set()..add(basePackageDir);
 
     if (autoIncludeDependencies) {
       Map<String, Uri> info = package_config
           .findPackagesFromFile(
-              new Uri.file(pathLib.join(basePackageDir, 'pubspec.yaml')))
+              new Uri.file(path.join(basePackageDir, 'pubspec.yaml')))
           .asMap();
       for (String packageName in info.keys) {
         if (!filterExcludes || !config.exclude.contains(packageName)) {
-          packageDirs.add(pathLib.dirname(info[packageName].toFilePath()));
+          packageDirs.add(path.dirname(info[packageName].toFilePath()));
         }
       }
     }
 
     for (String packageDir in packageDirs) {
-      var packageLibDir = pathLib.join(packageDir, 'lib');
-      var packageLibSrcDir = pathLib.join(packageLibDir, 'src');
+      var packageLibDir = path.join(packageDir, 'lib');
+      var packageLibSrcDir = path.join(packageLibDir, 'src');
       // To avoid analyzing package files twice, only files with paths not
       // containing '/packages' will be added. The only exception is if the file
       // to analyze already has a '/package' in its path.
@@ -6745,8 +6913,8 @@
             (!lib.contains('${sep}packages${sep}') ||
                 packageDir.contains('${sep}packages${sep}'))) {
           // Only include libraries within the lib dir that are not in lib/src
-          if (pathLib.isWithin(packageLibDir, lib) &&
-              !pathLib.isWithin(packageLibSrcDir, lib)) {
+          if (path.isWithin(packageLibDir, lib) &&
+              !path.isWithin(packageLibSrcDir, lib)) {
             // Only add the file if it does not contain 'part of'
             var contents = new File(lib).readAsStringSync();
 
@@ -6784,7 +6952,7 @@
       files = findFilesToDocumentInPackage(
           config.inputDir, config.autoIncludeDependencies);
     }
-    files = quiverIterables.concat([files, _includeExternalsFrom(files)]);
+    files = quiver.concat([files, _includeExternalsFrom(files)]);
     return new Set.from(files.map((s) => new File(s).absolute.path));
   }
 
@@ -6846,11 +7014,11 @@
     var entities = dir.listSync();
 
     var pubspec = entities.firstWhere(
-        (e) => e is File && pathLib.basename(e.path) == 'pubspec.yaml',
+        (e) => e is File && path.basename(e.path) == 'pubspec.yaml',
         orElse: () => null);
 
     var libDir = entities.firstWhere(
-        (e) => e is Directory && pathLib.basename(e.path) == 'lib',
+        (e) => e is Directory && path.basename(e.path) == 'lib',
         orElse: () => null);
 
     if (pubspec != null && libDir != null) {
diff --git a/lib/src/package_meta.dart b/lib/src/package_meta.dart
index ffdfe40..ac2dc7d 100644
--- a/lib/src/package_meta.dart
+++ b/lib/src/package_meta.dart
@@ -9,7 +9,7 @@
 
 import 'package:analyzer/dart/element/element.dart';
 import 'package:dartdoc/dartdoc.dart';
-import 'package:path/path.dart' as pathLib;
+import 'package:path/path.dart' as path;
 import 'package:yaml/yaml.dart';
 
 import 'logging.dart';
@@ -19,7 +19,7 @@
 
 Directory get defaultSdkDir {
   Directory sdkDir = new File(Platform.resolvedExecutable).parent.parent;
-  assert(pathLib.equals(sdkDir.path, PackageMeta.sdkDirParent(sdkDir).path));
+  assert(path.equals(sdkDir.path, PackageMeta.sdkDirParent(sdkDir).path));
   return sdkDir;
 }
 
@@ -41,15 +41,16 @@
   PackageMeta(this.dir);
 
   static List<List<String>> __sdkDirFilePaths;
+
   static List<List<String>> get _sdkDirFilePaths {
     if (__sdkDirFilePaths == null) {
       __sdkDirFilePaths = [];
       if (Platform.isWindows) {
         for (List<String> paths in __sdkDirFilePathsPosix) {
           List<String> windowsPaths = [];
-          for (String path in paths) {
-            windowsPaths.add(pathLib.joinAll(
-                new pathLib.Context(style: pathLib.Style.posix).split(path)));
+          for (String p in paths) {
+            windowsPaths.add(path
+                .joinAll(new path.Context(style: path.Style.posix).split(p)));
           }
           __sdkDirFilePaths.add(windowsPaths);
         }
@@ -63,18 +64,19 @@
   /// Returns the directory of the SDK if the given directory is inside a Dart
   /// SDK.  Returns null if the directory isn't a subdirectory of the SDK.
   static final Map<String, Directory> _sdkDirParent = {};
+
   static Directory sdkDirParent(Directory dir) {
-    String dirPathCanonical = pathLib.canonicalize(dir.path);
+    String dirPathCanonical = path.canonicalize(dir.path);
     if (!_sdkDirParent.containsKey(dirPathCanonical)) {
       _sdkDirParent[dirPathCanonical] = null;
       while (dir.existsSync()) {
         if (_sdkDirFilePaths.every((List<String> l) {
-          return l.any((f) => new File(pathLib.join(dir.path, f)).existsSync());
+          return l.any((f) => new File(path.join(dir.path, f)).existsSync());
         })) {
           _sdkDirParent[dirPathCanonical] = dir;
           break;
         }
-        if (pathLib.equals(dir.path, dir.parent.path)) break;
+        if (path.equals(dir.path, dir.parent.path)) break;
         dir = dir.parent;
       }
     }
@@ -84,11 +86,11 @@
   @override
   bool operator ==(other) {
     if (other is! PackageMeta) return false;
-    return pathLib.equals(dir.absolute.path, other.dir.absolute.path);
+    return path.equals(dir.absolute.path, other.dir.absolute.path);
   }
 
   @override
-  int get hashCode => pathLib.hash(dir.absolute.path);
+  int get hashCode => path.hash(dir.absolute.path);
 
   /// Use this instead of fromDir where possible.
   factory PackageMeta.fromElement(
@@ -96,10 +98,11 @@
     // [config] is only here for sdkDir, and it's OK that it is the wrong
     // context since sdkDir is argOnly and this is supposed to be a temporary
     // workaround.
-    if (libraryElement.isInSdk)
+    if (libraryElement.isInSdk) {
       return new PackageMeta.fromDir(new Directory(config.sdkDir));
+    }
     return new PackageMeta.fromDir(
-        new File(pathLib.canonicalize(libraryElement.source.fullName)).parent);
+        new File(path.canonicalize(libraryElement.source.fullName)).parent);
   }
 
   factory PackageMeta.fromFilename(String filename) {
@@ -126,14 +129,14 @@
         packageMeta = new _SdkMeta(parentSdkDir);
       } else {
         while (dir.existsSync()) {
-          File pubspec = new File(pathLib.join(dir.path, 'pubspec.yaml'));
+          File pubspec = new File(path.join(dir.path, 'pubspec.yaml'));
           if (pubspec.existsSync()) {
             packageMeta = new _FilePackageMeta(dir);
             break;
           }
           // Allow a package to be at root (possible in a Windows setting with
           // drive letter mappings).
-          if (pathLib.equals(dir.path, dir.parent.path)) break;
+          if (path.equals(dir.path, dir.parent.path)) break;
           dir = dir.parent.absolute;
         }
       }
@@ -151,15 +154,15 @@
   /// "both"), or null if this package is not part of a SDK.
   String sdkType(String flutterRootPath) {
     if (flutterRootPath != null) {
-      String flutterPackages = pathLib.join(flutterRootPath, 'packages');
-      String flutterBinCache = pathLib.join(flutterRootPath, 'bin', 'cache');
+      String flutterPackages = path.join(flutterRootPath, 'packages');
+      String flutterBinCache = path.join(flutterRootPath, 'bin', 'cache');
 
       /// Don't include examples or other non-SDK components as being the
       /// "Flutter SDK".
-      if (pathLib.isWithin(
-              flutterPackages, pathLib.canonicalize(dir.absolute.path)) ||
-          pathLib.isWithin(
-              flutterBinCache, pathLib.canonicalize(dir.absolute.path))) {
+      if (path.isWithin(
+              flutterPackages, path.canonicalize(dir.absolute.path)) ||
+          path.isWithin(
+              flutterBinCache, path.canonicalize(dir.absolute.path))) {
         return 'Flutter';
       }
     }
@@ -177,11 +180,15 @@
   /// null if not a hosted pub package.  If set, the hostname
   /// that the package is hosted at -- usually 'pub.dartlang.org'.
   String get hostedAt;
+
   String get version;
+
   String get description;
+
   String get homepage;
 
   String _resolvedDir;
+
   String get resolvedDir {
     if (_resolvedDir == null) {
       _resolvedDir = dir.resolveSymbolicLinksSync();
@@ -190,7 +197,9 @@
   }
 
   FileContents getReadmeContents();
+
   FileContents getLicenseContents();
+
   FileContents getChangelogContents();
 
   /// Returns true if we are a valid package, valid enough to generate docs.
@@ -229,7 +238,7 @@
   Map _pubspec;
 
   _FilePackageMeta(Directory dir) : super(dir) {
-    File f = new File(pathLib.join(dir.path, 'pubspec.yaml'));
+    File f = new File(path.join(dir.path, 'pubspec.yaml'));
     if (f.existsSync()) {
       _pubspec = loadYaml(f.readAsStringSync());
     } else {
@@ -239,6 +248,7 @@
 
   bool _setHostedAt = false;
   String _hostedAt;
+
   @override
   String get hostedAt {
     if (!_setHostedAt) {
@@ -252,13 +262,13 @@
       // possibly by calculating hosting directly from pubspec.yaml or importing
       // a pub library to do this.
       // People could have a pub cache at root with Windows drive mappings.
-      if (pathLib.split(pathLib.canonicalize(dir.path)).length >= 3) {
+      if (path.split(path.canonicalize(dir.path)).length >= 3) {
         String pubCacheRoot = dir.parent.parent.parent.path;
-        String hosted = pathLib.canonicalize(dir.parent.parent.path);
-        String hostname = pathLib.canonicalize(dir.parent.path);
-        if (pathLib.basename(hosted) == 'hosted' &&
-            new Directory(pathLib.join(pubCacheRoot, '_temp')).existsSync()) {
-          _hostedAt = pathLib.basename(hostname);
+        String hosted = path.canonicalize(dir.parent.parent.path);
+        String hostname = path.canonicalize(dir.parent.path);
+        if (path.basename(hosted) == 'hosted' &&
+            new Directory(path.join(pubCacheRoot, '_temp')).existsSync()) {
+          _hostedAt = path.basename(hostname);
         }
       }
     }
@@ -270,12 +280,12 @@
 
   @override
   bool get needsPubGet =>
-      !(new File(pathLib.join(dir.path, '.packages')).existsSync());
+      !(new File(path.join(dir.path, '.packages')).existsSync());
 
   @override
   void runPubGet() {
     String pubPath =
-        pathLib.join(pathLib.dirname(Platform.resolvedExecutable), 'pub');
+        path.join(path.dirname(Platform.resolvedExecutable), 'pub');
     if (Platform.isWindows) pubPath += '.bat';
 
     ProcessResult result =
@@ -296,10 +306,13 @@
 
   @override
   String get name => _pubspec['name'];
+
   @override
   String get version => _pubspec['version'];
+
   @override
   String get description => _pubspec['description'];
+
   @override
   String get homepage => _pubspec['homepage'];
 
@@ -351,7 +364,7 @@
 
   for (String name in fileNames) {
     for (File f in files) {
-      String baseName = pathLib.basename(f.path).toLowerCase();
+      String baseName = path.basename(f.path).toLowerCase();
       if (baseName == name) return f;
       if (baseName.startsWith(name)) return f;
     }
@@ -364,7 +377,7 @@
   String sdkReadmePath;
 
   _SdkMeta(Directory dir) : super(dir) {
-    sdkReadmePath = pathLib.join(dir.path, 'lib', 'api_readme.md');
+    sdkReadmePath = path.join(dir.path, 'lib', 'api_readme.md');
   }
 
   @override
@@ -380,9 +393,10 @@
 
   @override
   String get name => 'Dart';
+
   @override
   String get version {
-    File versionFile = new File(pathLib.join(dir.path, 'version'));
+    File versionFile = new File(path.join(dir.path, 'version'));
     if (versionFile.existsSync()) return versionFile.readAsStringSync().trim();
     return 'unknown';
   }
@@ -391,6 +405,7 @@
   String get description =>
       'The Dart SDK is a set of tools and libraries for the '
       'Dart programming language.';
+
   @override
   String get homepage => 'https://github.com/dart-lang/sdk';
 
@@ -399,9 +414,9 @@
 
   @override
   FileContents getReadmeContents() {
-    File f = new File(pathLib.join(dir.path, 'lib', 'api_readme.md'));
+    File f = new File(path.join(dir.path, 'lib', 'api_readme.md'));
     if (!f.existsSync()) {
-      f = new File(pathLib.join(dir.path, 'api_readme.md'));
+      f = new File(path.join(dir.path, 'api_readme.md'));
     }
     return f.existsSync() ? new FileContents(f) : null;
   }
diff --git a/lib/src/source_linker.dart b/lib/src/source_linker.dart
index 2f51479..cfa64ad 100644
--- a/lib/src/source_linker.dart
+++ b/lib/src/source_linker.dart
@@ -7,17 +7,20 @@
 
 import 'package:dartdoc/src/dartdoc_options.dart';
 import 'package:dartdoc/src/model.dart';
-import 'package:path/path.dart' as pathLib;
+import 'package:path/path.dart' as path;
 
 final uriTemplateRegexp = new RegExp(r'(%[frl]%)');
 
 abstract class SourceLinkerOptionContext implements DartdocOptionContextBase {
   List<String> get linkToSourceExcludes =>
       optionSet['linkToSource']['excludes'].valueAt(context);
+
   String get linkToSourceRevision =>
       optionSet['linkToSource']['revision'].valueAt(context);
+
   String get linkToSourceRoot =>
       optionSet['linkToSource']['root'].valueAt(context);
+
   String get linkToSourceUriTemplate =>
       optionSet['linkToSource']['uriTemplate'].valueAt(context);
 }
@@ -94,18 +97,20 @@
   }
 
   String href() {
-    if (sourceFileName == null || root == null || uriTemplate == null)
+    if (sourceFileName == null || root == null || uriTemplate == null) {
       return '';
-    if (!pathLib.isWithin(root, sourceFileName) ||
+    }
+    if (!path.isWithin(root, sourceFileName) ||
         excludes
-            .any((String exclude) => pathLib.isWithin(exclude, sourceFileName)))
+            .any((String exclude) => path.isWithin(exclude, sourceFileName))) {
       return '';
+    }
     return uriTemplate.replaceAllMapped(uriTemplateRegexp, (match) {
       switch (match[1]) {
         case '%f%':
-          var urlContext = new pathLib.Context(style: pathLib.Style.url);
-          return urlContext.joinAll(
-              pathLib.split(pathLib.relative(sourceFileName, from: root)));
+          var urlContext = new path.Context(style: path.Style.url);
+          return urlContext
+              .joinAll(path.split(path.relative(sourceFileName, from: root)));
           break;
         case '%r%':
           return revision;
diff --git a/lib/src/tool_runner.dart b/lib/src/tool_runner.dart
index cc8d859..400e8ec 100644
--- a/lib/src/tool_runner.dart
+++ b/lib/src/tool_runner.dart
@@ -8,7 +8,7 @@
 import 'dart:io';
 
 import 'package:dartdoc/src/io_utils.dart';
-import 'package:path/path.dart' as pathLib;
+import 'package:path/path.dart' as path;
 import 'dartdoc_options.dart';
 
 typedef ToolErrorCallback = void Function(String message);
@@ -30,13 +30,15 @@
             Directory.systemTemp.createTempSync('dartdoc_tools_');
 
   static ToolTempFileTracker _instance;
+
   static ToolTempFileTracker get instance =>
       _instance ??= ToolTempFileTracker._();
 
   int _temporaryFileCount = 0;
+
   Future<File> createTemporaryFile() async {
     _temporaryFileCount++;
-    File tempFile = new File(pathLib.join(
+    File tempFile = new File(path.join(
         temporaryDirectory.absolute.path, 'input_$_temporaryFileCount'));
     await tempFile.create(recursive: true);
     return tempFile;
@@ -188,8 +190,9 @@
       argsWithInput.add(newArg);
     }
 
-    if (toolDefinition.setupCommand != null && !toolDefinition.setupComplete)
+    if (toolDefinition.setupCommand != null && !toolDefinition.setupComplete) {
       await _runSetup(tool, toolDefinition, envWithInput, toolErrorCallback);
+    }
 
     argsWithInput = toolArgs + argsWithInput;
     var commandPath;
diff --git a/lib/src/warnings.dart b/lib/src/warnings.dart
index 1ac42e8..f67ab81 100644
--- a/lib/src/warnings.dart
+++ b/lib/src/warnings.dart
@@ -14,10 +14,12 @@
 abstract class PackageWarningOptionContext implements DartdocOptionContextBase {
   bool get allowNonLocalWarnings =>
       optionSet['allowNonLocalWarnings'].valueAt(context);
+
   // allowWarningsInPackages, ignoreWarningsInPackages, errors, warnings, and ignore
   // are only used indirectly via the synthetic packageWarningOptions option.
   PackageWarningOptions get packageWarningOptions =>
       optionSet['packageWarningOptions'].valueAt(context);
+
   bool get verboseWarnings => optionSet['verboseWarnings'].valueAt(context);
 }
 
@@ -201,15 +203,20 @@
 abstract class Warnable implements Canonicalization {
   void warn(PackageWarning warning,
       {String message, Iterable<Locatable> referredFrom});
+
   Element get element;
+
   Warnable get enclosingElement;
+
   Package get package;
 }
 
 /// Something that can be located for warning purposes.
 abstract class Locatable {
   List<Locatable> get documentationFrom;
+
   String get fullyQualifiedName;
+
   String get href;
 
   /// A string indicating the URI of this Locatable, usually derived from
@@ -339,8 +346,10 @@
 
   void ignore(PackageWarning kind) =>
       warningModes[kind] = PackageWarningMode.ignore;
+
   void warn(PackageWarning kind) =>
       warningModes[kind] = PackageWarningMode.warn;
+
   void error(PackageWarning kind) =>
       warningModes[kind] = PackageWarningMode.error;
 
@@ -415,9 +424,11 @@
         !element.package.isLocal) {
       warningMode = PackageWarningMode.ignore;
     }
-    if (warningMode == PackageWarningMode.warn)
+    if (warningMode == PackageWarningMode.warn) {
       warningCount += 1;
-    else if (warningMode == PackageWarningMode.error) errorCount += 1;
+    } else if (warningMode == PackageWarningMode.error) {
+      errorCount += 1;
+    }
     Tuple2<PackageWarning, String> warningData = new Tuple2(kind, message);
     countedWarnings.putIfAbsent(element?.element, () => new Set());
     countedWarnings[element?.element].add(warningData);
diff --git a/test/dartdoc_integration_test.dart b/test/dartdoc_integration_test.dart
index e34ba1e..7129683 100644
--- a/test/dartdoc_integration_test.dart
+++ b/test/dartdoc_integration_test.dart
@@ -9,7 +9,7 @@
 import 'dart:mirrors';
 
 import 'package:dartdoc/dartdoc.dart';
-import 'package:path/path.dart' as pathLib;
+import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 
 import 'src/utils.dart';
@@ -17,14 +17,13 @@
 Uri get _currentFileUri =>
     (reflect(main) as ClosureMirror).function.location.sourceUri;
 String get _testPackagePath =>
-    pathLib.fromUri(_currentFileUri.resolve('../testing/test_package'));
-String get _testPackageFlutterPluginPath => pathLib
+    path.fromUri(_currentFileUri.resolve('../testing/test_package'));
+String get _testPackageFlutterPluginPath => path
     .fromUri(_currentFileUri.resolve('../testing/test_package_flutter_plugin'));
 
 void main() {
   group('Invoking command-line dartdoc', () {
-    String dartdocPath =
-        pathLib.canonicalize(pathLib.join('bin', 'dartdoc.dart'));
+    String dartdocPath = path.canonicalize(path.join('bin', 'dartdoc.dart'));
     CoverageSubprocessLauncher subprocessLauncher;
     Directory tempDir;
 
@@ -92,7 +91,7 @@
 
     test('missing a required file path prints a fatal-error', () async {
       List outputLines = [];
-      String impossiblePath = pathLib.join(dartdocPath, 'impossible');
+      String impossiblePath = path.join(dartdocPath, 'impossible');
       await expectLater(
           () => subprocessLauncher.runStreamed(
               Platform.resolvedExecutable,
@@ -114,7 +113,7 @@
           () => subprocessLauncher.runStreamed(Platform.resolvedExecutable, [
                 dartdocPath,
                 '--input=${testPackageToolError.path}',
-                '--output=${pathLib.join(tempDir.absolute.path, 'test_package_tool_error')}'
+                '--output=${path.join(tempDir.absolute.path, 'test_package_tool_error')}'
               ]),
           throwsA(const TypeMatcher<ProcessException>()));
     });
@@ -213,7 +212,7 @@
 
     test('--footer-text includes text', () async {
       String footerTextPath =
-          pathLib.join(Directory.systemTemp.path, 'footer.txt');
+          path.join(Directory.systemTemp.path, 'footer.txt');
       new File(footerTextPath).writeAsStringSync(' footer text include ');
 
       var args = <String>[
@@ -228,7 +227,7 @@
       await subprocessLauncher.runStreamed(Platform.resolvedExecutable, args,
           workingDirectory: _testPackagePath);
 
-      File outFile = new File(pathLib.join(tempDir.path, 'index.html'));
+      File outFile = new File(path.join(tempDir.path, 'index.html'));
       expect(outFile.readAsStringSync(), contains('footer text include'));
     });
   }, timeout: new Timeout.factor(4));
diff --git a/test/dartdoc_options_test.dart b/test/dartdoc_options_test.dart
index 6076df0..ef73ab1 100644
--- a/test/dartdoc_options_test.dart
+++ b/test/dartdoc_options_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import 'package:dartdoc/src/dartdoc_options.dart';
-import 'package:path/path.dart' as pathLib;
+import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 import 'package:yaml/yaml.dart';
 
@@ -18,7 +18,7 @@
 
   ConvertedOption._(this.param1, this.param2, this.myContextPath);
 
-  static ConvertedOption fromYamlMap(YamlMap yamlMap, pathLib.Context context) {
+  static ConvertedOption fromYamlMap(YamlMap yamlMap, path.Context context) {
     String p1;
     String p2;
     String contextPath = context.current;
@@ -158,25 +158,24 @@
         isFile: true, mustExist: true));
 
     tempDir = Directory.systemTemp.createTempSync('options_test');
-    firstDir = new Directory(pathLib.join(tempDir.path, 'firstDir'))
+    firstDir = new Directory(path.join(tempDir.path, 'firstDir'))..createSync();
+    firstExisting = new File(path.join(firstDir.path, 'existing.dart'))
       ..createSync();
-    firstExisting = new File(pathLib.join(firstDir.path, 'existing.dart'))
+    secondDir = new Directory(path.join(tempDir.path, 'secondDir'))
       ..createSync();
-    secondDir = new Directory(pathLib.join(tempDir.path, 'secondDir'))
-      ..createSync();
-    new File(pathLib.join(secondDir.path, 'existing.dart'))..createSync();
+    new File(path.join(secondDir.path, 'existing.dart'))..createSync();
 
-    secondDirFirstSub = new Directory(pathLib.join(secondDir.path, 'firstSub'))
+    secondDirFirstSub = new Directory(path.join(secondDir.path, 'firstSub'))
       ..createSync();
-    secondDirSecondSub =
-        new Directory(pathLib.join(secondDir.path, 'secondSub'))..createSync();
+    secondDirSecondSub = new Directory(path.join(secondDir.path, 'secondSub'))
+      ..createSync();
 
     dartdocOptionsOne =
-        new File(pathLib.join(firstDir.path, 'dartdoc_options.yaml'));
+        new File(path.join(firstDir.path, 'dartdoc_options.yaml'));
     dartdocOptionsTwo =
-        new File(pathLib.join(secondDir.path, 'dartdoc_options.yaml'));
+        new File(path.join(secondDir.path, 'dartdoc_options.yaml'));
     dartdocOptionsTwoFirstSub =
-        new File(pathLib.join(secondDirFirstSub.path, 'dartdoc_options.yaml'));
+        new File(path.join(secondDirFirstSub.path, 'dartdoc_options.yaml'));
 
     dartdocOptionsOne.writeAsStringSync('''
 dartdoc:
@@ -233,7 +232,7 @@
       dartdocOptionSetSynthetic.parseArguments([]);
       expect(
           dartdocOptionSetSynthetic['vegetableLoaderChecked'].valueAt(firstDir),
-          orderedEquals([pathLib.canonicalize(firstExisting.path)]));
+          orderedEquals([path.canonicalize(firstExisting.path)]));
 
       String errorMessage;
       try {
@@ -244,7 +243,7 @@
       expect(
           errorMessage,
           equals(
-              'Synthetic configuration option dartdoc from <internal>, computed as [existing.dart], resolves to missing path: "${pathLib.canonicalize(pathLib.join(tempDir.absolute.path, 'existing.dart'))}"'));
+              'Synthetic configuration option dartdoc from <internal>, computed as [existing.dart], resolves to missing path: "${path.canonicalize(path.join(tempDir.absolute.path, 'existing.dart'))}"'));
     });
 
     test('file can override synthetic in FileSynth', () {
@@ -260,8 +259,8 @@
       // Since this is an ArgSynth, it ignores the yaml option and resolves to the CWD
       expect(
           dartdocOptionSetSynthetic['nonCriticalFileOption'].valueAt(firstDir),
-          equals(pathLib.canonicalize(
-              pathLib.join(Directory.current.path, 'stuff.zip'))));
+          equals(path
+              .canonicalize(path.join(Directory.current.path, 'stuff.zip'))));
     });
 
     test('ArgSynth defaults to synthetic', () {
@@ -269,8 +268,7 @@
       // This option is composed of FileOptions which make use of firstDir.
       expect(
           dartdocOptionSetSynthetic['nonCriticalFileOption'].valueAt(firstDir),
-          equals(pathLib
-              .canonicalize(pathLib.join(firstDir.path, 'existing.dart'))));
+          equals(path.canonicalize(path.join(firstDir.path, 'existing.dart'))));
     });
   });
 
@@ -289,14 +287,14 @@
       expect(
           errorMessage,
           equals(
-              'Argument --file-option, set to override-not-existing.dart, resolves to missing path: "${pathLib.join(pathLib.canonicalize(Directory.current.path), "override-not-existing.dart")}"'));
+              'Argument --file-option, set to override-not-existing.dart, resolves to missing path: "${path.join(path.canonicalize(Directory.current.path), "override-not-existing.dart")}"'));
     });
 
     test('validate argument can override missing file', () {
       dartdocOptionSetAll.parseArguments(
-          ['--file-option', pathLib.canonicalize(firstExisting.path)]);
+          ['--file-option', path.canonicalize(firstExisting.path)]);
       expect(dartdocOptionSetAll['fileOption'].valueAt(secondDir),
-          equals(pathLib.canonicalize(firstExisting.path)));
+          equals(path.canonicalize(firstExisting.path)));
     });
 
     test('File errors still get passed through', () {
@@ -310,8 +308,8 @@
       expect(
           errorMessage,
           equals(
-              'Field dartdoc.fileOption from ${pathLib.canonicalize(dartdocOptionsTwo.path)}, set to not existing, resolves to missing path: '
-              '"${pathLib.join(pathLib.canonicalize(secondDir.path), "not existing")}"'));
+              'Field dartdoc.fileOption from ${path.canonicalize(dartdocOptionsTwo.path)}, set to not existing, resolves to missing path: '
+              '"${path.join(path.canonicalize(secondDir.path), "not existing")}"'));
     });
 
     test('validate override behavior basic', () {
@@ -383,7 +381,7 @@
           errorMessage,
           equals(
               'Argument --single-file, set to not_found.txt, resolves to missing path: '
-              '"${pathLib.join(pathLib.canonicalize(Directory.current.path), 'not_found.txt')}"'));
+              '"${path.join(path.canonicalize(Directory.current.path), 'not_found.txt')}"'));
     });
 
     test('DartdocOptionArgOnly checks file existence on multi-options', () {
@@ -403,7 +401,7 @@
           errorMessage,
           equals(
               'Argument --files-flag, set to [${firstExisting.absolute.path}, other_not_found.txt], resolves to missing path: '
-              '"${pathLib.join(pathLib.canonicalize(Directory.current.path), "other_not_found.txt")}"'));
+              '"${path.join(path.canonicalize(Directory.current.path), "other_not_found.txt")}"'));
     });
 
     test(
@@ -413,7 +411,7 @@
           .parseArguments(['--unimportant-file', 'this-will-never-exist']);
       expect(
           dartdocOptionSetArgs['unimportantFile'].valueAt(tempDir),
-          equals(pathLib.join(pathLib.canonicalize(Directory.current.path),
+          equals(path.join(path.canonicalize(Directory.current.path),
               'this-will-never-exist')));
     });
 
@@ -528,8 +526,7 @@
 
       expect(converted.param1, equals('value1'));
       expect(converted.param2, equals('value2'));
-      expect(
-          converted.myContextPath, equals(pathLib.canonicalize(firstDir.path)));
+      expect(converted.myContextPath, equals(path.canonicalize(firstDir.path)));
       expect(
           dartdocOptionSetFiles['convertThisMap'].valueAt(secondDir), isNull);
     });
@@ -544,9 +541,9 @@
       expect(
           errorMessage,
           equals(
-              'Field dartdoc.fileOptionList from ${pathLib.canonicalize(dartdocOptionsTwo.path)}, set to [existing.dart, thing/that/does/not/exist], resolves to missing path: '
-              '"${pathLib.joinAll([
-            pathLib.canonicalize(secondDir.path),
+              'Field dartdoc.fileOptionList from ${path.canonicalize(dartdocOptionsTwo.path)}, set to [existing.dart, thing/that/does/not/exist], resolves to missing path: '
+              '"${path.joinAll([
+            path.canonicalize(secondDir.path),
             'thing',
             'that',
             'does',
@@ -554,10 +551,8 @@
             'exist'
           ])}"'));
       // It doesn't matter that this fails.
-      expect(
-          dartdocOptionSetFiles['nonCriticalFileOption'].valueAt(firstDir),
-          equals(pathLib
-              .joinAll([pathLib.canonicalize(firstDir.path), 'whatever'])));
+      expect(dartdocOptionSetFiles['nonCriticalFileOption'].valueAt(firstDir),
+          equals(path.joinAll([path.canonicalize(firstDir.path), 'whatever'])));
     });
 
     test(
@@ -572,9 +567,9 @@
       expect(
           errorMessage,
           equals(
-              'Field dartdoc.fileOption from ${pathLib.canonicalize(dartdocOptionsTwo.path)}, set to not existing, resolves to missing path: '
-              '"${pathLib.joinAll([
-            pathLib.canonicalize(secondDir.path),
+              'Field dartdoc.fileOption from ${path.canonicalize(dartdocOptionsTwo.path)}, set to not existing, resolves to missing path: '
+              '"${path.joinAll([
+            path.canonicalize(secondDir.path),
             "not existing"
           ])}"'));
     });
@@ -583,15 +578,13 @@
       expect(
           dartdocOptionSetFiles['nonCriticalDirOption']
               .valueAt(secondDirFirstSub),
-          equals(pathLib.join(
-              pathLib.canonicalize(secondDirFirstSub.path), 'not_existing')));
+          equals(path.join(
+              path.canonicalize(secondDirFirstSub.path), 'not_existing')));
     });
 
     test('DartdocOptionSetFile checks errors for directory options', () {
-      expect(
-          dartdocOptionSetFiles['dirOption'].valueAt(secondDir),
-          equals(
-              pathLib.canonicalize(pathLib.join(secondDir.path, 'firstSub'))));
+      expect(dartdocOptionSetFiles['dirOption'].valueAt(secondDir),
+          equals(path.canonicalize(path.join(secondDir.path, 'firstSub'))));
       String errorMessage;
       try {
         dartdocOptionSetFiles['dirOption'].valueAt(firstDir);
@@ -601,8 +594,8 @@
       expect(
           errorMessage,
           equals(
-              'Field dartdoc.dirOption from ${pathLib.canonicalize(dartdocOptionsOne.path)}, set to notHere, resolves to missing path: '
-              '"${pathLib.canonicalize(pathLib.join(firstDir.path, "notHere"))}"'));
+              'Field dartdoc.dirOption from ${path.canonicalize(dartdocOptionsOne.path)}, set to notHere, resolves to missing path: '
+              '"${path.canonicalize(path.join(firstDir.path, "notHere"))}"'));
     });
 
     test('DartdocOptionSetFile loads defaults', () {
diff --git a/test/dartdoc_test.dart b/test/dartdoc_test.dart
index 664d7df..e7bcfe9 100644
--- a/test/dartdoc_test.dart
+++ b/test/dartdoc_test.dart
@@ -12,7 +12,7 @@
 import 'package:dartdoc/src/model.dart';
 import 'package:dartdoc/src/tuple.dart';
 import 'package:dartdoc/src/warnings.dart';
-import 'package:path/path.dart' as pathLib;
+import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 
 import 'src/utils.dart';
@@ -70,8 +70,8 @@
 
       test('generator parameters', () async {
         File favicon = new File(
-            pathLib.joinAll([tempDir.path, 'static-assets', 'favicon.png']));
-        File index = new File(pathLib.joinAll([tempDir.path, 'index.html']));
+            path.joinAll([tempDir.path, 'static-assets', 'favicon.png']));
+        File index = new File(path.joinAll([tempDir.path, 'index.html']));
         expect(favicon.readAsStringSync(),
             contains('Not really a png, but a test file'));
         String indexString = index.readAsStringSync();
@@ -250,7 +250,7 @@
         tempDir.deleteSync(recursive: true);
       });
 
-      test('generate docs for ${pathLib.basename(testPackageDir.path)} works',
+      test('generate docs for ${path.basename(testPackageDir.path)} works',
           () async {
         expect(results.packageGraph, isNotNull);
         PackageGraph packageGraph = results.packageGraph;
@@ -265,7 +265,7 @@
       test('source code links are visible', () async {
         // Picked this object as this library explicitly should never contain
         // a library directive, so we can predict what line number it will be.
-        File anonymousOutput = new File(pathLib.join(tempDir.path,
+        File anonymousOutput = new File(path.join(tempDir.path,
             'anonymous_library', 'anonymous_library-library.html'));
         expect(anonymousOutput.existsSync(), isTrue);
         expect(
@@ -275,7 +275,7 @@
       });
     });
 
-    test('generate docs for ${pathLib.basename(testPackageBadDir.path)} fails',
+    test('generate docs for ${path.basename(testPackageBadDir.path)} fails',
         () async {
       Dartdoc dartdoc = await buildDartdoc([], testPackageBadDir, tempDir);
 
diff --git a/test/experiment_options_test.dart b/test/experiment_options_test.dart
index d091f04..5231bb3 100644
--- a/test/experiment_options_test.dart
+++ b/test/experiment_options_test.dart
@@ -54,11 +54,13 @@
       experimentOptions.parseArguments([]);
       DartdocOptionContext tester =
           new DartdocOptionContext(experimentOptions, emptyTempDir);
-      if (defaultOnNotExpired != null)
+      if (defaultOnNotExpired != null) {
         expect(tester.experimentStatus.isEnabled(defaultOnNotExpired), isTrue);
-      if (defaultOffNotExpired != null)
+      }
+      if (defaultOffNotExpired != null) {
         expect(
             tester.experimentStatus.isEnabled(defaultOffNotExpired), isFalse);
+      }
       expect(tester.experimentStatus.isEnabled(defaultOnExpired), isTrue);
       expect(tester.experimentStatus.isEnabled(defaultOffExpired), isFalse);
     });
@@ -71,11 +73,13 @@
       ]);
       DartdocOptionContext tester =
           new DartdocOptionContext(experimentOptions, emptyTempDir);
-      if (defaultOnNotExpired != null)
+      if (defaultOnNotExpired != null) {
         expect(tester.experimentStatus.isEnabled(defaultOnNotExpired), isFalse);
-      if (defaultOffNotExpired != null)
+      }
+      if (defaultOffNotExpired != null) {
         expect(
             tester.experimentStatus.isEnabled(defaultOffNotExpired), isFalse);
+      }
       expect(tester.experimentStatus.isEnabled(defaultOnExpired), isTrue);
       expect(tester.experimentStatus.isEnabled(defaultOffExpired), isFalse);
     });
diff --git a/test/html_generator_test.dart b/test/html_generator_test.dart
index 1f5d779..2fe8cc2 100644
--- a/test/html_generator_test.dart
+++ b/test/html_generator_test.dart
@@ -9,7 +9,7 @@
 import 'package:dartdoc/src/html/html_generator.dart';
 import 'package:dartdoc/src/html/templates.dart';
 import 'package:dartdoc/src/html/resources.g.dart';
-import 'package:path/path.dart' as pathLib;
+import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 
 void main() {
@@ -81,12 +81,12 @@
 
       test('resources are put into the right place', () {
         Directory output =
-            new Directory(pathLib.join(tempOutput.path, 'static-assets'));
+            new Directory(path.join(tempOutput.path, 'static-assets'));
         expect(output, doesExist);
 
         for (var resource in resource_names.map((r) =>
-            pathLib.relative(Uri.parse(r).path, from: 'dartdoc/resources'))) {
-          expect(new File(pathLib.join(output.path, resource)), doesExist);
+            path.relative(Uri.parse(r).path, from: 'dartdoc/resources'))) {
+          expect(new File(path.join(output.path, resource)), doesExist);
         }
       });
     });
diff --git a/test/model_test.dart b/test/model_test.dart
index 450ffa8..0710a86 100644
--- a/test/model_test.dart
+++ b/test/model_test.dart
@@ -22,6 +22,7 @@
   String enclosingName;
   @override
   final String name;
+
   @override
   bool get isSdk => false;
   @override
@@ -88,12 +89,18 @@
   // when the feature is enabled by default.
   group('Experiments', () {
     Library main;
-    TopLevelVariable aComplexSet, inferredTypeSet, specifiedSet, untypedMap, typedSet;
+    TopLevelVariable aComplexSet,
+        inferredTypeSet,
+        specifiedSet,
+        untypedMap,
+        typedSet;
 
     setUpAll(() {
-      main = packageGraphExperiments.libraries.firstWhere((lib) => lib.name == 'main');
+      main = packageGraphExperiments.libraries
+          .firstWhere((lib) => lib.name == 'main');
       aComplexSet = main.constants.firstWhere((v) => v.name == 'aComplexSet');
-      inferredTypeSet = main.constants.firstWhere((v) => v.name == 'inferredTypeSet');
+      inferredTypeSet =
+          main.constants.firstWhere((v) => v.name == 'inferredTypeSet');
       specifiedSet = main.constants.firstWhere((v) => v.name == 'specifiedSet');
       untypedMap = main.constants.firstWhere((v) => v.name == 'untypedMap');
       typedSet = main.constants.firstWhere((v) => v.name == 'typedSet');
@@ -101,20 +108,28 @@
 
     test('Set literals test', () {
       expect(aComplexSet.modelType.name, equals('Set'));
-      expect(aComplexSet.modelType.typeArguments.map((a) => a.name).toList(), equals(['AClassContainingLiterals']));
-      expect(aComplexSet.constantValue, equals('const {const AClassContainingLiterals(3, 5)}'));
+      expect(aComplexSet.modelType.typeArguments.map((a) => a.name).toList(),
+          equals(['AClassContainingLiterals']));
+      expect(aComplexSet.constantValue,
+          equals('const {const AClassContainingLiterals(3, 5)}'));
       expect(inferredTypeSet.modelType.name, equals('Set'));
-      expect(inferredTypeSet.modelType.typeArguments.map((a) => a.name).toList(), equals(['num']));
+      expect(
+          inferredTypeSet.modelType.typeArguments.map((a) => a.name).toList(),
+          equals(['num']));
       expect(inferredTypeSet.constantValue, equals('const {1, 2.5, 3}'));
       expect(specifiedSet.modelType.name, equals('Set'));
-      expect(specifiedSet.modelType.typeArguments.map((a) => a.name).toList(), equals(['int']));
+      expect(specifiedSet.modelType.typeArguments.map((a) => a.name).toList(),
+          equals(['int']));
       expect(specifiedSet.constantValue, equals('const {}'));
       expect(untypedMap.modelType.name, equals('Map'));
-      expect(untypedMap.modelType.typeArguments.map((a) => a.name).toList(), equals(['dynamic', 'dynamic']));
+      expect(untypedMap.modelType.typeArguments.map((a) => a.name).toList(),
+          equals(['dynamic', 'dynamic']));
       expect(untypedMap.constantValue, equals('const {}'));
       expect(typedSet.modelType.name, equals('Set'));
-      expect(typedSet.modelType.typeArguments.map((a) => a.name).toList(), equals(['String']));
-      expect(typedSet.constantValue, matches(new RegExp(r'const &lt;String&gt;\s?{}')));
+      expect(typedSet.modelType.typeArguments.map((a) => a.name).toList(),
+          equals(['String']));
+      expect(typedSet.constantValue,
+          matches(new RegExp(r'const &lt;String&gt;\s?{}')));
     });
   });
 
@@ -128,7 +143,8 @@
     Method invokeToolNonCanonical, invokeToolNonCanonicalSubclass;
     Method invokeToolPrivateLibrary, invokeToolPrivateLibraryOriginal;
     Method invokeToolParentDoc, invokeToolParentDocOriginal;
-    final RegExp packageInvocationIndexRegexp = new RegExp(r'PACKAGE_INVOCATION_INDEX: (\d+)');
+    final RegExp packageInvocationIndexRegexp =
+        new RegExp(r'PACKAGE_INVOCATION_INDEX: (\d+)');
 
     setUpAll(() {
       _NonCanonicalToolUser = fakeLibrary.allClasses
@@ -165,13 +181,16 @@
       packageGraph.allLocalModelElements.forEach((m) => m.documentation);
     });
 
-    test('invokes tool when inherited documentation is the only means for it to be seen', () {
+    test(
+        'invokes tool when inherited documentation is the only means for it to be seen',
+        () {
       // Verify setup of the test is correct.
       expect(invokeToolParentDoc.isCanonical, isTrue);
       expect(invokeToolParentDoc.documentationComment, isNull);
       // Error message here might look strange due to toString() on Methods, but if this
       // fails that means we don't have the correct invokeToolParentDoc instance.
-      expect(invokeToolParentDoc.documentationFrom, contains(invokeToolParentDocOriginal));
+      expect(invokeToolParentDoc.documentationFrom,
+          contains(invokeToolParentDocOriginal));
       // Tool should be substituted out here.
       expect(invokeToolParentDoc.documentation, isNot(contains('{@tool')));
     });
@@ -187,18 +206,20 @@
             equals(packageInvocationIndexRegexp
                 .firstMatch(invokeToolNonCanonicalSubclass.documentation)
                 .group(1)));
-        expect(invokeToolPrivateLibrary.documentation, isNot(contains('{@tool')));
+        expect(
+            invokeToolPrivateLibrary.documentation, isNot(contains('{@tool')));
         expect(
             invokeToolPrivateLibraryOriginal.documentation, contains('{@tool'));
       });
 
       test('Documentation borrowed from implementer case', () {
-        expect(packageInvocationIndexRegexp
-            .firstMatch(invokeToolParentDoc.documentation)
-            .group(1),
-        equals(packageInvocationIndexRegexp
-            .firstMatch(invokeToolParentDocOriginal.documentation)
-            .group(1)));
+        expect(
+            packageInvocationIndexRegexp
+                .firstMatch(invokeToolParentDoc.documentation)
+                .group(1),
+            equals(packageInvocationIndexRegexp
+                .firstMatch(invokeToolParentDocOriginal.documentation)
+                .group(1)));
       });
     });
 
@@ -519,9 +540,10 @@
 
     test('multiple containers with specified sort order', () {
       List<LibraryContainer> containers = [];
-      for (String name in containerNames)
+      for (String name in containerNames) {
         containers
             .add(new TestLibraryContainer(name, sortOrderBasic, topLevel));
+      }
       containers
           .add(new TestLibraryContainerSdk('SDK', sortOrderBasic, topLevel));
       containers.sort();
@@ -540,8 +562,9 @@
 
     test('multiple containers, no specified sort order', () {
       List<LibraryContainer> containers = [];
-      for (String name in containerNames)
+      for (String name in containerNames) {
         containers.add(new TestLibraryContainer(name, [], topLevel));
+      }
       containers.add(new TestLibraryContainerSdk('SDK', [], topLevel));
       containers.sort();
       expect(
@@ -921,9 +944,10 @@
       withYouTubeInvalidUrl = documentationErrors.allInstanceMethods
           .firstWhere((m) => m.name == 'withYouTubeInvalidUrl')
             ..documentation;
-      withYouTubeUrlWithAdditionalParameters = documentationErrors.allInstanceMethods
+      withYouTubeUrlWithAdditionalParameters = documentationErrors
+          .allInstanceMethods
           .firstWhere((m) => m.name == 'withYouTubeUrlWithAdditionalParameters')
-        ..documentation;
+            ..documentation;
     });
 
     test("warns on youtube video with missing parameters", () {
@@ -993,19 +1017,26 @@
           .firstWhere((m) => m.name == 'withYouTubeInline');
     });
 
-    test("renders a YouTube video within the method documentation with correct aspect ratio", () {
-      expect(withYouTubeWatchUrl.documentation,
-          contains('<iframe src="https://www.youtube.com/embed/oHg5SJYRHA0?rel=0"'));
+    test(
+        "renders a YouTube video within the method documentation with correct aspect ratio",
+        () {
+      expect(
+          withYouTubeWatchUrl.documentation,
+          contains(
+              '<iframe src="https://www.youtube.com/embed/oHg5SJYRHA0?rel=0"'));
       // Video is 560x315, which means height is 56.25% of width.
-      expect(withYouTubeWatchUrl.documentation, contains('padding-top: 56.25%;'));
+      expect(
+          withYouTubeWatchUrl.documentation, contains('padding-top: 56.25%;'));
     });
     test("Doesn't place YouTube video in one line doc", () {
       expect(
           withYouTubeInOneLineDoc.oneLineDoc,
           isNot(contains(
               '<iframe src="https://www.youtube.com/embed/oHg5SJYRHA0?rel=0"')));
-      expect(withYouTubeInOneLineDoc.documentation,
-          contains('<iframe src="https://www.youtube.com/embed/oHg5SJYRHA0?rel=0"'));
+      expect(
+          withYouTubeInOneLineDoc.documentation,
+          contains(
+              '<iframe src="https://www.youtube.com/embed/oHg5SJYRHA0?rel=0"'));
     });
     test("Handles YouTube video inline properly", () {
       // Make sure it doesn't have a double-space before the continued line,
@@ -3162,8 +3193,10 @@
     });
 
     test('PRETTY_COLORS', () {
-      expect(prettyColorsConstant.constantValue, matches(new RegExp(
-          r"const &lt;String&gt;\s?\[COLOR_GREEN, COLOR_ORANGE, &#39;blue&#39;\]")));
+      expect(
+          prettyColorsConstant.constantValue,
+          matches(new RegExp(
+              r"const &lt;String&gt;\s?\[COLOR_GREEN, COLOR_ORANGE, &#39;blue&#39;\]")));
     });
 
     test('MY_CAT is linked', () {
@@ -3668,7 +3701,9 @@
 class StringName extends Nameable {
   @override
   final String name;
+
   StringName(this.name);
+
   @override
   String toString() => name;
 }
diff --git a/test/package_meta_test.dart b/test/package_meta_test.dart
index 871d546..2b2452d 100644
--- a/test/package_meta_test.dart
+++ b/test/package_meta_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import 'package:dartdoc/src/package_meta.dart';
-import 'package:path/path.dart' as pathLib;
+import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 
 void main() {
@@ -26,7 +26,7 @@
 
   group('PackageMeta for the test package', () {
     PackageMeta p = new PackageMeta.fromDir(new Directory(
-        pathLib.join(Directory.current.path, 'testing', 'test_package')));
+        path.join(Directory.current.path, 'testing', 'test_package')));
 
     test('readme with corrupt UTF-8 loads without throwing', () {
       expect(p.getReadmeContents().contents,
diff --git a/test/src/utils.dart b/test/src/utils.dart
index 3cbb31f..d017431 100644
--- a/test/src/utils.dart
+++ b/test/src/utils.dart
@@ -12,7 +12,7 @@
 import 'package:dartdoc/src/html/html_generator.dart';
 import 'package:dartdoc/src/model.dart';
 import 'package:dartdoc/src/package_meta.dart';
-import 'package:path/path.dart' as pathLib;
+import 'package:path/path.dart' as path;
 
 final RegExp quotables = new RegExp(r'[ "\r\n\$]');
 final RegExp observatoryPortRegexp =
@@ -150,7 +150,7 @@
   }
 
   static String buildNextCoverageFilename() =>
-      pathLib.join(tempDir.path, 'dart-cov-${pid}-${nextRun++}.json');
+      path.join(tempDir.path, 'dart-cov-${pid}-${nextRun++}.json');
 
   /// Call once all coverage runs have been generated by calling runStreamed
   /// on all [CoverageSubprocessLaunchers].
@@ -171,8 +171,8 @@
       '-b',
       '.',
       '--packages=.packages',
-      '--sdk-root=${pathLib.canonicalize(pathLib.join(pathLib.dirname(Platform.executable), '..'))}',
-      '--out=${pathLib.canonicalize(outputFile.path)}',
+      '--sdk-root=${path.canonicalize(path.join(path.dirname(Platform.executable), '..'))}',
+      '--out=${path.canonicalize(outputFile.path)}',
       '--report-on=bin,lib',
       '-i',
       tempDir.path,
@@ -291,7 +291,9 @@
       Map result;
       try {
         result = json.decoder.convert(line);
-      } catch (FormatException) {}
+      } catch (FormatException) {
+        // ignore
+      }
       if (result != null) {
         if (jsonObjects == null) {
           jsonObjects = new List();
diff --git a/test/template_test.dart b/test/template_test.dart
index eecf66d..91de138 100644
--- a/test/template_test.dart
+++ b/test/template_test.dart
@@ -6,7 +6,7 @@
 
 import 'dart:io';
 
-import 'package:path/path.dart' as pathLib;
+import 'package:path/path.dart' as path;
 import 'package:mustache/mustache.dart';
 import 'package:test/test.dart';
 
@@ -18,7 +18,7 @@
       setUp(() {
         if (sitemap == null) {
           var templatePath =
-              pathLib.join(pathLib.current, 'test/templates/sitemap.xml');
+              path.join(path.current, 'test/templates/sitemap.xml');
           File tmplFile = new File(templatePath);
           var siteMapTmpl = tmplFile.readAsStringSync();
           sitemap = Template(siteMapTmpl);
diff --git a/test/tool_runner_test.dart b/test/tool_runner_test.dart
index 5c9600d..6087faa 100644
--- a/test/tool_runner_test.dart
+++ b/test/tool_runner_test.dart
@@ -8,7 +8,7 @@
 
 import 'package:dartdoc/src/dartdoc_options.dart';
 import 'package:dartdoc/src/tool_runner.dart';
-import 'package:path/path.dart' as pathLib;
+import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 import 'package:yaml/yaml.dart';
 
@@ -27,7 +27,7 @@
   setUpAll(() async {
     ProcessResult result;
     tempDir = Directory.systemTemp.createTempSync('tool_runner_test_');
-    var snapshotFile = pathLib.join(tempDir.path, 'drill.snapshot');
+    var snapshotFile = path.join(tempDir.path, 'drill.snapshot');
     try {
       result = Process.runSync(
           Platform.resolvedExecutable,
@@ -46,7 +46,7 @@
       stderr.writeln(result.stderr);
     }
     expect(result?.exitCode, equals(0));
-    setupFile = File(pathLib.join(tempDir.path, 'setup.stamp'));
+    setupFile = File(path.join(tempDir.path, 'setup.stamp'));
     // We use the Dart executable for our "non-dart" tool
     // test, because it's the only executable that we know the
     // exact location of that works on all platforms.
@@ -73,8 +73,7 @@
   windows: ['C:\\Windows\\System32\\cmd.exe', '/c', 'echo']
   description: 'Works on everything'
 ''';
-    var pathContext =
-        pathLib.Context(current: utils.testPackageDir.absolute.path);
+    var pathContext = path.Context(current: utils.testPackageDir.absolute.path);
     toolMap = ToolConfiguration.fromYamlMap(loadYaml(yamlMap), pathContext);
     // This shouldn't really happen, but if you didn't load the config from a
     // yaml map (which would fail on a missing executable), or a file is deleted
diff --git a/test/warnings_test.dart b/test/warnings_test.dart
index 4e12f23..a5b98e0 100644
--- a/test/warnings_test.dart
+++ b/test/warnings_test.dart
@@ -9,7 +9,7 @@
 
 import 'package:dartdoc/src/dartdoc_options.dart';
 import 'package:dartdoc/src/warnings.dart';
-import 'package:path/path.dart' as pathLib;
+import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 
 void main() {
@@ -19,21 +19,18 @@
 
   setUpAll(() {
     tempDir = Directory.systemTemp.createTempSync('warnings_test');
-    testPackageOne = Directory(pathLib.join(tempDir.path, 'test_package_one'))
+    testPackageOne = Directory(path.join(tempDir.path, 'test_package_one'))
       ..createSync();
-    testPackageTwo = Directory(pathLib.join(tempDir.path, 'test_package_two'))
+    testPackageTwo = Directory(path.join(tempDir.path, 'test_package_two'))
       ..createSync();
-    testPackageThree =
-        Directory(pathLib.join(tempDir.path, 'test_package_three'))
-          ..createSync();
-    pubspecYamlOne =
-        new File(pathLib.join(testPackageOne.path, 'pubspec.yaml'));
+    testPackageThree = Directory(path.join(tempDir.path, 'test_package_three'))
+      ..createSync();
+    pubspecYamlOne = new File(path.join(testPackageOne.path, 'pubspec.yaml'));
     pubspecYamlOne.writeAsStringSync('name: test_package_one');
-    pubspecYamlTwo =
-        new File(pathLib.join(testPackageTwo.path, 'pubspec.yaml'));
+    pubspecYamlTwo = new File(path.join(testPackageTwo.path, 'pubspec.yaml'));
     pubspecYamlTwo.writeAsStringSync('name: test_package_two');
     dartdocYamlThree =
-        new File(pathLib.join(testPackageThree.path, 'dartdoc_options.yaml'));
+        new File(path.join(testPackageThree.path, 'dartdoc_options.yaml'));
     dartdocYamlThree.writeAsStringSync('''
 dartdoc:
   warnings:
@@ -45,7 +42,7 @@
     - ambiguous-reexport  
     ''');
     pubspecYamlThree =
-        new File(pathLib.join(testPackageThree.path, 'pubspec.yaml'));
+        new File(path.join(testPackageThree.path, 'pubspec.yaml'));
     pubspecYamlThree.writeAsStringSync('name: test_package_three');
   });
 
diff --git a/tool/builder.dart b/tool/builder.dart
index 4ad3a21..a62b693 100644
--- a/tool/builder.dart
+++ b/tool/builder.dart
@@ -6,7 +6,7 @@
 
 import 'package:build/build.dart';
 import 'package:glob/glob.dart';
-import 'package:path/path.dart' as pathLib;
+import 'package:path/path.dart' as path;
 
 String _resourcesFile(Iterable<String> packagePaths) => '''
 // WARNING: This file is auto-generated. Do not taunt.
@@ -30,7 +30,7 @@
     packagePaths.sort();
     await buildStep.writeAsString(
         new AssetId(buildStep.inputId.package,
-            pathLib.url.join('lib', 'src', 'html', 'resources.g.dart')),
+            path.url.join('lib', 'src', 'html', 'resources.g.dart')),
         _resourcesFile(packagePaths));
   }
 
diff --git a/tool/doc_packages.dart b/tool/doc_packages.dart
index 37e9206..20903c9 100644
--- a/tool/doc_packages.dart
+++ b/tool/doc_packages.dart
@@ -226,8 +226,9 @@
     if (sdk != null) {
       VersionConstraint constraint = new VersionConstraint.parse(sdk);
       String version = Platform.version;
-      if (version.contains(' '))
+      if (version.contains(' ')) {
         version = version.substring(0, version.indexOf(' '));
+      }
       if (!constraint.allows(new Version.parse(version))) {
         _log('sdk constraint = ${constraint}');
         return true;
diff --git a/tool/grind.dart b/tool/grind.dart
index dff46a3..8309e30 100644
--- a/tool/grind.dart
+++ b/tool/grind.dart
@@ -8,7 +8,7 @@
 import 'package:dartdoc/src/io_utils.dart';
 import 'package:grinder/grinder.dart';
 import 'package:io/io.dart';
-import 'package:path/path.dart' as pathLib;
+import 'package:path/path.dart' as path;
 import 'package:yaml/yaml.dart' as yaml;
 
 import '../test/src/utils.dart';
@@ -18,14 +18,16 @@
 /// Thrown on failure to find something in a file.
 class GrindTestFailure {
   final String message;
+
   GrindTestFailure(this.message);
 }
 
 /// Kind of an inefficient grepper for now.
 void expectFileContains(String path, List<Pattern> items) {
   File source = new File(path);
-  if (!source.existsSync())
+  if (!source.existsSync()) {
     throw new GrindTestFailure('file not found: ${path}');
+  }
   for (Pattern item in items) {
     if (!new File(path).readAsStringSync().contains(item)) {
       throw new GrindTestFailure('Can not find ${item} in ${path}');
@@ -62,12 +64,12 @@
     // it.
     await cleanFlutterDir.parent.create(recursive: true);
     assert(_lockFuture == null);
-    _lockFuture = new File(pathLib.join(cleanFlutterDir.parent.path, 'lock'))
+    _lockFuture = new File(path.join(cleanFlutterDir.parent.path, 'lock'))
         .openSync(mode: FileMode.write)
         .lock();
     await _lockFuture;
     File lastSynced =
-        new File(pathLib.join(cleanFlutterDir.parent.path, 'lastSynced'));
+        new File(path.join(cleanFlutterDir.parent.path, 'lastSynced'));
     FlutterRepo newRepo =
         new FlutterRepo.fromPath(cleanFlutterDir.path, {}, 'clean');
 
@@ -95,31 +97,38 @@
 }
 
 Directory _dartdocDocsDir;
+
 Directory get dartdocDocsDir => _dartdocDocsDir ??= createTempSync('dartdoc');
 
 Directory _dartdocDocsDirRemote;
+
 Directory get dartdocDocsDirRemote =>
     _dartdocDocsDirRemote ??= createTempSync('dartdoc_remote');
 
 Directory _sdkDocsDir;
+
 Directory get sdkDocsDir => _sdkDocsDir ??= createTempSync('sdkdocs');
 
 Directory cleanFlutterDir = new Directory(
-    pathLib.join(resolveTildePath('~/.dartdoc_grinder'), 'cleanFlutter'));
+    path.join(resolveTildePath('~/.dartdoc_grinder'), 'cleanFlutter'));
 
 Directory _flutterDir;
+
 Directory get flutterDir => _flutterDir ??= createTempSync('flutter');
 
 Directory get testPackage =>
-    new Directory(pathLib.joinAll(['testing', 'test_package']));
+    new Directory(path.joinAll(['testing', 'test_package']));
+
 Directory get pluginPackage =>
-    new Directory(pathLib.joinAll(['testing', 'test_package_flutter_plugin']));
+    new Directory(path.joinAll(['testing', 'test_package_flutter_plugin']));
 
 Directory _testPackageDocsDir;
+
 Directory get testPackageDocsDir =>
     _testPackageDocsDir ??= createTempSync('test_package');
 
 Directory _pluginPackageDocsDir;
+
 Directory get pluginPackageDocsDir =>
     _pluginPackageDocsDir ??= createTempSync('test_package_flutter_plugin');
 
@@ -149,14 +158,13 @@
 }
 
 final Directory flutterDirDevTools =
-    new Directory(pathLib.join(flutterDir.path, 'dev', 'tools'));
+    new Directory(path.join(flutterDir.path, 'dev', 'tools'));
 
 /// Creates a throwaway pub cache and returns the environment variables
 /// necessary to use it.
 Map<String, String> _createThrowawayPubCache() {
   final Directory pubCache = Directory.systemTemp.createTempSync('pubcache');
-  final Directory pubCacheBin =
-      new Directory(pathLib.join(pubCache.path, 'bin'));
+  final Directory pubCacheBin = new Directory(path.join(pubCache.path, 'bin'));
   pubCacheBin.createSync();
   return new Map.fromIterables([
     'PUB_CACHE',
@@ -173,6 +181,7 @@
     new FilePath('lib/src/third_party/pkg/mustache4dart');
 final RegExp _mustache4dartPatches =
     new RegExp(r'^\d\d\d-mustache4dart-.*[.]patch$');
+
 @Task('Update third_party forks')
 void updateThirdParty() async {
   run('rm', arguments: ['-rf', _mustache4dartDir.path]);
@@ -185,10 +194,10 @@
     'git@github.com:valotas/mustache4dart',
     _mustache4dartDir.path,
   ]);
-  run('rm', arguments: ['-rf', pathLib.join(_mustache4dartDir.path, '.git')]);
+  run('rm', arguments: ['-rf', path.join(_mustache4dartDir.path, '.git')]);
   for (String patchFileName in new Directory(_pkgDir.path)
       .listSync()
-      .map((e) => pathLib.basename(e.path))
+      .map((e) => path.basename(e.path))
       .where((String filename) => _mustache4dartPatches.hasMatch(filename))
       .toList()
         ..sort()) {
@@ -236,6 +245,7 @@
   final Map<String, int> warningKeyCounts;
   final String branch;
   final String pubCachePath;
+
   WarningsCollection(this.tempDir, this.pubCachePath, this.branch)
       : this.warningKeyCounts = new Map();
 
@@ -244,15 +254,17 @@
 
   String _toKey(String text) {
     String key = text.replaceAll(tempDir, kTempDirReplacement);
-    if (pubCachePath != null)
+    if (pubCachePath != null) {
       key = key.replaceAll(pubCachePath, kPubCachePathReplacement);
+    }
     return key;
   }
 
   String _fromKey(String text) {
     String key = text.replaceAll(kTempDirReplacement, tempDir);
-    if (pubCachePath != null)
+    if (pubCachePath != null) {
       key = key.replaceAll(kPubCachePathReplacement, pubCachePath);
+    }
     return key;
   }
 
@@ -394,7 +406,7 @@
     'https://dart.googlesource.com/sdk.git',
     sdkClone.path
   ]);
-  File dartdocPubspec = new File(pathLib.join(dartdocSdk.path, 'pubspec.yaml'));
+  File dartdocPubspec = new File(path.join(dartdocSdk.path, 'pubspec.yaml'));
   List<String> pubspecLines = await dartdocPubspec.readAsLines();
   List<String> pubspecLinesFiltered = [];
   for (String line in pubspecLines) {
@@ -443,7 +455,7 @@
       Platform.resolvedExecutable,
       [
         '--enable-asserts',
-        pathLib.join('bin', 'dartdoc.dart'),
+        path.join('bin', 'dartdoc.dart'),
         '--output',
         '${sdkDocsPath}',
         '--sdk-docs',
@@ -469,7 +481,7 @@
       Platform.resolvedExecutable,
       [
         '--enable-asserts',
-        pathLib.join(cwd, 'bin', 'dartdoc.dart'),
+        path.join(cwd, 'bin', 'dartdoc.dart'),
         '--output',
         outputDir,
         '--example-path-prefix',
@@ -563,7 +575,7 @@
       '--port',
       '9000',
       '--path',
-      pathLib.join(originalDartdocFlutter.absolute.path, 'dev', 'docs', 'doc'),
+      path.join(originalDartdocFlutter.absolute.path, 'dev', 'docs', 'doc'),
     ]);
     Future current = launcher.runStreamed(sdkBin('pub'), [
       'run',
@@ -571,7 +583,7 @@
       '--port',
       '9001',
       '--path',
-      pathLib.join(flutterDir.absolute.path, 'dev', 'docs', 'doc'),
+      path.join(flutterDir.absolute.path, 'dev', 'docs', 'doc'),
     ]);
     await Future.wait([original, current]);
   }
@@ -589,7 +601,7 @@
     '--port',
     '8001',
     '--path',
-    pathLib.join(flutterDir.path, 'dev', 'docs', 'doc'),
+    path.join(flutterDir.path, 'dev', 'docs', 'doc'),
   ]);
 }
 
@@ -603,9 +615,9 @@
   Map<String, String> env = _createThrowawayPubCache();
   await _buildFlutterDocs(
       flutterDir.path, new Future.value(Directory.current.path), env, 'docs');
-  String index = new File(
-          pathLib.join(flutterDir.path, 'dev', 'docs', 'doc', 'index.html'))
-      .readAsStringSync();
+  String index =
+      new File(path.join(flutterDir.path, 'dev', 'docs', 'doc', 'index.html'))
+          .readAsStringSync();
   stdout.write(index);
 }
 
@@ -613,15 +625,14 @@
 class FlutterRepo {
   final String flutterPath;
   final Map<String, String> env;
-  final String bin = pathLib.join('bin', 'flutter');
+  final String bin = path.join('bin', 'flutter');
 
   FlutterRepo._(this.flutterPath, this.env, String label) {
     cacheDart =
-        pathLib.join(flutterPath, 'bin', 'cache', 'dart-sdk', 'bin', 'dart');
-    cachePub =
-        pathLib.join(flutterPath, 'bin', 'cache', 'dart-sdk', 'bin', 'pub');
+        path.join(flutterPath, 'bin', 'cache', 'dart-sdk', 'bin', 'dart');
+    cachePub = path.join(flutterPath, 'bin', 'cache', 'dart-sdk', 'bin', 'pub');
     env['PATH'] =
-        '${pathLib.join(pathLib.canonicalize(flutterPath), "bin")}:${env['PATH'] ?? Platform.environment['PATH']}';
+        '${path.join(path.canonicalize(flutterPath), "bin")}:${env['PATH'] ?? Platform.environment['PATH']}';
     env['FLUTTER_ROOT'] = flutterPath;
     launcher =
         new SubprocessLauncher('flutter${label == null ? "" : "-$label"}', env);
@@ -685,19 +696,19 @@
   await flutterRepo.launcher.runStreamed(
     flutterRepo.cachePub,
     ['get'],
-    workingDirectory: pathLib.join(flutterPath, 'dev', 'tools'),
+    workingDirectory: path.join(flutterPath, 'dev', 'tools'),
   );
   await flutterRepo.launcher.runStreamed(
     flutterRepo.cachePub,
     ['get'],
-    workingDirectory: pathLib.join(flutterPath, 'dev', 'snippets'),
+    workingDirectory: path.join(flutterPath, 'dev', 'snippets'),
   );
   await flutterRepo.launcher.runStreamed(
       flutterRepo.cachePub, ['global', 'activate', '-spath', '.'],
       workingDirectory: await futureCwd);
   return await flutterRepo.launcher.runStreamed(
     flutterRepo.cacheDart,
-    [pathLib.join('dev', 'tools', 'dartdoc.dart'), '-c', '--json'],
+    [path.join('dev', 'tools', 'dartdoc.dart'), '-c', '--json'],
     workingDirectory: flutterPath,
   );
 }
@@ -714,8 +725,8 @@
   if (version != null) args.addAll(<String>['-v', version]);
   args.add(pubPackageName);
   await launcher.runStreamed('pub', args);
-  Directory cache = new Directory(
-      pathLib.join(env['PUB_CACHE'], 'hosted', 'pub.dartlang.org'));
+  Directory cache =
+      new Directory(path.join(env['PUB_CACHE'], 'hosted', 'pub.dartlang.org'));
   Directory pubPackageDir =
       cache.listSync().firstWhere((e) => e.path.contains(pubPackageName));
   await launcher.runStreamed('pub', ['get'],
@@ -724,12 +735,12 @@
       Platform.resolvedExecutable,
       [
         '--enable-asserts',
-        pathLib.join(Directory.current.absolute.path, 'bin', 'dartdoc.dart'),
+        path.join(Directory.current.absolute.path, 'bin', 'dartdoc.dart'),
         '--json',
         '--show-progress',
       ]..addAll(dartdocParameters),
       workingDirectory: pubPackageDir.absolute.path);
-  return pathLib.join(pubPackageDir.absolute.path, 'doc', 'api');
+  return path.join(pubPackageDir.absolute.path, 'doc', 'api');
 }
 
 @Task(
@@ -795,7 +806,7 @@
   '../dartdoc_options.yaml',
   'src/html/resources.g.dart',
   'src/version.dart',
-].map((s) => pathLib.joinAll(pathLib.posix.split(s)));
+].map((s) => path.joinAll(path.posix.split(s)));
 
 @Task('Verify generated files are up to date')
 Future<void> checkBuild() async {
@@ -805,7 +816,7 @@
   // Load original file contents into memory before running the builder;
   // it modifies them in place.
   for (String relPath in _generated_files_list) {
-    String origPath = pathLib.joinAll(['lib', relPath]);
+    String origPath = path.joinAll(['lib', relPath]);
     File oldVersion = new File(origPath);
     if (oldVersion.existsSync()) {
       originalFileContents[relPath] = oldVersion.readAsStringSync();
@@ -814,7 +825,7 @@
 
   await build();
   for (String relPath in _generated_files_list) {
-    File newVersion = new File(pathLib.join('lib', relPath));
+    File newVersion = new File(path.join('lib', relPath));
     if (!await newVersion.exists()) {
       log('${newVersion.path} does not exist\n');
       differentFiles.add(relPath);
@@ -827,7 +838,7 @@
 
   if (differentFiles.isNotEmpty) {
     fail('The following generated files needed to be rebuilt:\n'
-        '  ${differentFiles.map((f) => pathLib.join('lib', f)).join("\n  ")}\n'
+        '  ${differentFiles.map((f) => path.join('lib', f)).join("\n  ")}\n'
         'Rebuild them with "grind build" and check the results in.');
   }
 }
@@ -855,13 +866,13 @@
   List<String> parameters = ['--enable-asserts'];
 
   for (File dartFile in testFiles) {
-    await testFutures.addFutureFromClosure(() => new CoverageSubprocessLauncher(
-            'dart2-${pathLib.basename(dartFile.path)}')
-        .runStreamed(
-            Platform.resolvedExecutable,
-            <String>[]
-              ..addAll(parameters)
-              ..add(dartFile.path)));
+    await testFutures.addFutureFromClosure(() =>
+        new CoverageSubprocessLauncher('dart2-${path.basename(dartFile.path)}')
+            .runStreamed(
+                Platform.resolvedExecutable,
+                <String>[]
+                  ..addAll(parameters)
+                  ..add(dartFile.path)));
   }
 
   return CoverageSubprocessLauncher.generateCoverageToFile(
@@ -877,11 +888,11 @@
     '--output',
     dartdocDocsDir.path
   ]);
-  expectFileContains(pathLib.join(dartdocDocsDir.path, 'index.html'),
+  expectFileContains(path.join(dartdocDocsDir.path, 'index.html'),
       ['<title>dartdoc - Dart API docs</title>']);
   final RegExp object = new RegExp('<li>Object</li>', multiLine: true);
   expectFileContains(
-      pathLib.join(dartdocDocsDir.path, 'dartdoc', 'ModelElement-class.html'),
+      path.join(dartdocDocsDir.path, 'dartdoc', 'ModelElement-class.html'),
       [object]);
 }
 
@@ -898,10 +909,10 @@
     '--output',
     dartdocDocsDir.path
   ]);
-  expectFileContains(pathLib.join(dartdocDocsDir.path, 'index.html'),
+  expectFileContains(path.join(dartdocDocsDir.path, 'index.html'),
       ['<title>dartdoc - Dart API docs</title>']);
   expectFileContains(
-      pathLib.join(dartdocDocsDir.path, 'dartdoc', 'ModelElement-class.html'),
+      path.join(dartdocDocsDir.path, 'dartdoc', 'ModelElement-class.html'),
       [object]);
 }
 
@@ -921,7 +932,7 @@
           flutterRepo.cacheDart,
           [
             '--enable-asserts',
-            pathLib.join(Directory.current.path, 'bin', 'dartdoc.dart'),
+            path.join(Directory.current.path, 'bin', 'dartdoc.dart'),
             '--exclude-packages',
             'Dart', // TODO(jcollins-g): dart-lang/dartdoc#1431
             '--json',
@@ -948,7 +959,7 @@
   }
   // Verify that links to Dart SDK and Flutter SDK go to the flutter site.
   expectFileContains(
-      pathLib.join(
+      path.join(
           pluginPackageDocsDir.path, 'testlib', 'MyAwesomeWidget-class.html'),
       [
         '<a href="https://docs.flutter.io/flutter/widgets/Widget-class.html">Widget</a>',
@@ -994,8 +1005,8 @@
   }
   log('$libsLength dart: libraries found');
 
-  var futureConstFile = joinFile(
-      sdkDocsDir, [pathLib.join('dart-async', 'Future', 'Future.html')]);
+  var futureConstFile =
+      joinFile(sdkDocsDir, [path.join('dart-async', 'Future', 'Future.html')]);
   if (!futureConstFile.existsSync()) {
     fail('no Future.html found for dart:async Future constructor');
   }
