diff --git a/analysis_options.yaml b/analysis_options.yaml
index e29f308..5bbf4f3 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,4 +1,4 @@
-include: package:pedantic/analysis_options.1.7.0.yaml
+include: package:pedantic/analysis_options.1.8.0.yaml
 
 analyzer:
   exclude:
@@ -17,7 +17,8 @@
     - directives_ordering
     - no_adjacent_strings_in_list
     - package_api_docs
-    - slash_for_doc_comments
     - prefer_final_fields
+    - prefer_generic_function_type_aliases
+    - slash_for_doc_comments
     - unawaited_futures
 #    - unnecessary_brace_in_string_interps
diff --git a/bin/dartdoc.dart b/bin/dartdoc.dart
index 930eba0..9665cd1 100644
--- a/bin/dartdoc.dart
+++ b/bin/dartdoc.dart
@@ -27,16 +27,16 @@
 
 Future<List<DartdocOption>> createDartdocProgramOptions() async {
   return <DartdocOption>[
-    new DartdocOptionArgOnly<bool>('asyncStackTraces', false,
+    DartdocOptionArgOnly<bool>('asyncStackTraces', false,
         help: 'Display coordinated asynchronous stack traces (slow)',
         negatable: true),
-    new DartdocOptionArgOnly<bool>('generateDocs', true,
+    DartdocOptionArgOnly<bool>('generateDocs', true,
         help:
             'Generate docs into the output directory (or only display warnings if false).',
         negatable: true),
-    new DartdocOptionArgOnly<bool>('help', false,
+    DartdocOptionArgOnly<bool>('help', false,
         abbr: 'h', help: 'Show command help.', negatable: false),
-    new DartdocOptionArgOnly<bool>('version', false,
+    DartdocOptionArgOnly<bool>('version', false,
         help: 'Display the version for $name.', negatable: false),
   ];
 }
@@ -76,7 +76,7 @@
 
   DartdocProgramOptionContext config;
   try {
-    config = new DartdocProgramOptionContext(optionSet, null);
+    config = DartdocProgramOptionContext(optionSet, null);
   } on DartdocOptionError catch (e) {
     stderr.writeln(' fatal error: ${e.message}');
     stderr.writeln('');
@@ -94,7 +94,7 @@
   try {
     await Chain.capture(() async {
       await runZoned(dartdoc.generateDocs,
-          zoneSpecification: new ZoneSpecification(
+          zoneSpecification: ZoneSpecification(
               print: (Zone self, ZoneDelegate parent, Zone zone, String line) =>
                   logPrint(line)));
     }, onError: (e, Chain chain) {
diff --git a/lib/dartdoc.dart b/lib/dartdoc.dart
index 8b49977..7247245 100644
--- a/lib/dartdoc.dart
+++ b/lib/dartdoc.dart
@@ -48,15 +48,15 @@
 /// directory.
 class Dartdoc extends PackageBuilder {
   final List<Generator> generators;
-  final Set<String> writtenFiles = new Set();
+  final Set<String> writtenFiles = Set();
   Directory outputDir;
 
   // Fires when the self checks make progress.
   final StreamController<String> _onCheckProgress =
-      new StreamController(sync: true);
+      StreamController(sync: true);
 
   Dartdoc._(DartdocOptionContext config, this.generators) : super(config) {
-    outputDir = new Directory(config.output)..createSync(recursive: true);
+    outputDir = Directory(config.output)..createSync(recursive: true);
     generators.forEach((g) => g.onFileCreated.listen(logProgress));
   }
 
@@ -65,19 +65,19 @@
   static Future<Dartdoc> withDefaultGenerators(
       DartdocGeneratorOptionContext config) async {
     List<Generator> generators = await initGenerators(config);
-    return new Dartdoc._(config, generators);
+    return Dartdoc._(config, generators);
   }
 
   /// An asynchronous factory method that builds
   static Future<Dartdoc> withEmptyGenerator(DartdocOptionContext config) async {
     List<Generator> generators = await initEmptyGenerators(config);
-    return new Dartdoc._(config, generators);
+    return Dartdoc._(config, generators);
   }
 
   /// Basic synchronous factory that gives a stripped down Dartdoc that won't
   /// use generators.  Useful for testing.
   factory Dartdoc.withoutGenerators(DartdocOptionContext config) {
-    return new Dartdoc._(config, []);
+    return Dartdoc._(config, []);
   }
 
   Stream<String> get onCheckProgress => _onCheckProgress.stream;
@@ -90,7 +90,7 @@
   /// thrown if dartdoc fails in an expected way, for example if there is an
   /// analysis error in the code.
   Future<DartdocResults> generateDocsBase() async {
-    Stopwatch _stopwatch = new Stopwatch()..start();
+    Stopwatch _stopwatch = Stopwatch()..start();
     double seconds;
     packageGraph = await buildPackageGraph();
     seconds = _stopwatch.elapsedMilliseconds / 1000.0;
@@ -125,8 +125,7 @@
     logInfo(
         "Documented ${packageGraph.localPublicLibraries.length} public librar${packageGraph.localPublicLibraries.length == 1 ? 'y' : 'ies'} "
         "in ${seconds.toStringAsFixed(1)} seconds");
-    return new DartdocResults(
-        config.topLevelPackageMeta, packageGraph, outputDir);
+    return DartdocResults(config.topLevelPackageMeta, packageGraph, outputDir);
   }
 
   Future<DartdocResults> generateDocs() async {
@@ -134,14 +133,13 @@
 
     DartdocResults dartdocResults = await generateDocsBase();
     if (dartdocResults.packageGraph.localPublicLibraries.isEmpty) {
-      throw new DartdocFailure(
-          "dartdoc could not find any libraries to document");
+      throw DartdocFailure("dartdoc could not find any libraries to document");
     }
 
     final int errorCount =
         dartdocResults.packageGraph.packageWarningCounter.errorCount;
     if (errorCount > 0) {
-      throw new DartdocFailure(
+      throw DartdocFailure(
           "dartdoc encountered $errorCount} errors while processing.");
     }
     logInfo(
@@ -156,7 +154,7 @@
     // Ordinarily this would go in [Package.warn], but we don't actually know what
     // ModelElement to warn on yet.
     Warnable warnOnElement;
-    Set<Warnable> referredFromElements = new Set();
+    Set<Warnable> referredFromElements = Set();
     Set<Warnable> warnOnElements;
 
     // Make all paths relative to origin.
@@ -202,7 +200,7 @@
     String indexJson = path.joinAll([normalOrigin, 'index.json']);
     bool foundIndexJson = false;
     for (FileSystemEntity f
-        in new Directory(normalOrigin).listSync(recursive: true)) {
+        in Directory(normalOrigin).listSync(recursive: true)) {
       var fullPath = path.normalize(f.path);
       if (f is Directory) {
         continue;
@@ -240,7 +238,7 @@
   // This is extracted to save memory during the check; be careful not to hang
   // on to anything referencing the full file and doc tree.
   Tuple2<Iterable<String>, String> _getStringLinksAndHref(String fullPath) {
-    File file = new File("$fullPath");
+    File file = File("$fullPath");
     if (!file.existsSync()) {
       return null;
     }
@@ -256,21 +254,21 @@
         .where((href) => href != null)
         .toList();
 
-    return new Tuple2(stringLinks, baseHref);
+    return Tuple2(stringLinks, baseHref);
   }
 
   void _doSearchIndexCheck(
       PackageGraph packageGraph, String origin, Set<String> visited) {
     String fullPath = path.joinAll([origin, 'index.json']);
     String indexPath = path.joinAll([origin, 'index.html']);
-    File file = new File("$fullPath");
+    File file = File("$fullPath");
     if (!file.existsSync()) {
       return null;
     }
-    JsonDecoder decoder = new JsonDecoder();
+    JsonDecoder decoder = JsonDecoder();
     List jsonData = decoder.convert(file.readAsStringSync());
 
-    Set<String> found = new Set();
+    Set<String> found = Set();
     found.add(fullPath);
     // The package index isn't supposed to be in the search, so suppress the
     // warning.
@@ -322,9 +320,9 @@
     // here instead -- occasionally, very large jobs have overflowed
     // the stack without this.
     // (newPathToCheck, newFullPath)
-    Set<Tuple2<String, String>> toVisit = new Set();
+    Set<Tuple2<String, String>> toVisit = Set();
 
-    final RegExp ignoreHyperlinks = new RegExp(r'^(https:|http:|mailto:|ftp:)');
+    final RegExp ignoreHyperlinks = RegExp(r'^(https:|http:|mailto:|ftp:)');
     for (String href in stringLinks) {
       if (!href.startsWith(ignoreHyperlinks)) {
         Uri uri;
@@ -345,7 +343,7 @@
           String newFullPath = path.joinAll([origin, newPathToCheck]);
           newFullPath = path.normalize(newFullPath);
           if (!visited.contains(newFullPath)) {
-            toVisit.add(new Tuple2(newPathToCheck, newFullPath));
+            toVisit.add(Tuple2(newPathToCheck, newFullPath));
             visited.add(newFullPath);
           }
         }
@@ -366,7 +364,7 @@
     assert(_hrefs == null);
     _hrefs = packageGraph.allHrefs;
 
-    final Set<String> visited = new Set();
+    final Set<String> visited = Set();
     final String start = 'index.html';
     logInfo('Validating docs...');
     _doCheck(packageGraph, origin, visited, start);
diff --git a/lib/src/dartdoc_options.dart b/lib/src/dartdoc_options.dart
index 860fa1d..cf05f89 100644
--- a/lib/src/dartdoc_options.dart
+++ b/lib/src/dartdoc_options.dart
@@ -32,8 +32,8 @@
 /// Constants to help with type checking, because T is int and so forth
 /// don't work in Dart.
 const String _kStringVal = '';
-const List<String> _kListStringVal = const <String>[];
-const Map<String, String> _kMapStringVal = const <String, String>{};
+const List<String> _kListStringVal = <String>[];
+const Map<String, String> _kMapStringVal = <String, String>{};
 const int _kIntVal = 0;
 const double _kDoubleVal = 0.0;
 const bool _kBoolVal = true;
@@ -80,7 +80,7 @@
   CategoryConfiguration._(this.categoryDefinitions);
 
   static CategoryConfiguration get empty {
-    return new CategoryConfiguration._({});
+    return CategoryConfiguration._({});
   }
 
   static CategoryConfiguration fromYamlMap(
@@ -97,16 +97,16 @@
         if (documentationMarkdown != null) {
           documentationMarkdown =
               pathContext.canonicalize(documentationMarkdown);
-          if (!new File(documentationMarkdown).existsSync()) {
-            throw new DartdocFileMissing(
+          if (!File(documentationMarkdown).existsSync()) {
+            throw DartdocFileMissing(
                 'In categories definition for ${name}, "markdown" resolves to the missing file $documentationMarkdown');
           }
         }
         newCategoryDefinitions[name] =
-            new CategoryDefinition(name, displayName, documentationMarkdown);
+            CategoryDefinition(name, displayName, documentationMarkdown);
       }
     }
-    return new CategoryConfiguration._(newCategoryDefinitions);
+    return CategoryConfiguration._(newCategoryDefinitions);
   }
 }
 
@@ -243,7 +243,7 @@
     if (snapshots.containsKey(toolPath)) {
       return snapshots[toolPath];
     }
-    snapshots[toolPath] = new Snapshot(snapshotCache, toolPath, _serial);
+    snapshots[toolPath] = Snapshot(snapshotCache, toolPath, _serial);
     _serial++;
     return snapshots[toolPath];
   }
@@ -281,7 +281,7 @@
       // replace the first argument with the path to the snapshot.
       args[0] = snapshotFile.absolute.path;
     }
-    return new Tuple2(Platform.resolvedExecutable,
+    return Tuple2(Platform.resolvedExecutable,
         needsSnapshot ? snapshot.snapshotCompleted : null);
   }
 
@@ -301,7 +301,7 @@
   ToolConfiguration._(this.tools);
 
   static ToolConfiguration get empty {
-    return new ToolConfiguration._({});
+    return ToolConfiguration._({});
   }
 
   // TODO(jcollins-g): consider caching these.
@@ -325,7 +325,7 @@
             if (toolMap[commandFrom].value is String) {
               command = [toolMap[commandFrom].toString()];
               if (command[0].isEmpty) {
-                throw new DartdocOptionError(
+                throw DartdocOptionError(
                     'Tool commands must not be empty. Tool $name command entry '
                     '"$commandFrom" must contain at least one path.');
               }
@@ -334,12 +334,12 @@
                   .map<String>((node) => node.toString())
                   .toList();
               if (command.isEmpty) {
-                throw new DartdocOptionError(
+                throw DartdocOptionError(
                     'Tool commands must not be empty. Tool $name command entry '
                     '"$commandFrom" must contain at least one path.');
               }
             } else {
-              throw new DartdocOptionError(
+              throw DartdocOptionError(
                   'Tool commands must be a path to an executable, or a list of '
                   'strings that starts with a path to an executable. '
                   'The tool $name has a $commandFrom entry that is a '
@@ -352,12 +352,12 @@
         command = findCommand();
         setupCommand = findCommand('setup_');
       } else {
-        throw new DartdocOptionError(
+        throw DartdocOptionError(
             'Tools must be defined as a map of tool names to definitions. Tool '
             '$name is not a map.');
       }
       if (command == null) {
-        throw new DartdocOptionError(
+        throw DartdocOptionError(
             'At least one of "command" or "${Platform.operatingSystem}" must '
             'be defined for the tool $name.');
       }
@@ -366,10 +366,10 @@
           return (0x1 & ((mode >> 6) | (mode >> 3) | mode)) != 0;
         }
 
-        var executableFile = new File(executable);
+        var executableFile = File(executable);
         var exeStat = executableFile.statSync();
         if (exeStat.type == FileSystemEntityType.notFound) {
-          throw new DartdocOptionError('Command executables must exist. '
+          throw DartdocOptionError('Command executables must exist. '
               'The file "$executable" does not exist for tool $name.');
         }
 
@@ -377,7 +377,7 @@
         // Dart scripts don't need to be executable, because they'll be
         // executed with the Dart binary.
         if (!isDartCommand && !isExecutable(exeStat.mode)) {
-          throw new DartdocOptionError('Non-Dart commands must be '
+          throw DartdocOptionError('Non-Dart commands must be '
               'executable. The file "$executable" for tool $name does not have '
               'execute permission.');
         }
@@ -396,10 +396,10 @@
                 : [setupExecutable]) +
             setupCommand;
       }
-      newToolDefinitions[name] = new ToolDefinition.fromCommand(
+      newToolDefinitions[name] = ToolDefinition.fromCommand(
           [executable] + command, setupCommand, description);
     }
-    return new ToolConfiguration._(newToolDefinitions);
+    return ToolConfiguration._(newToolDefinitions);
   }
 }
 
@@ -436,7 +436,7 @@
   _OptionValueWithContext(this.value, String path, {String definingFile}) {
     this.definingFile = definingFile;
     canonicalDirectoryPath = p.canonicalize(path);
-    pathContext = new p.Context(current: canonicalDirectoryPath);
+    pathContext = p.Context(current: canonicalDirectoryPath);
   }
 
   /// Assume value is a path, and attempt to resolve it.  Throws [UnsupportedError]
@@ -452,11 +452,10 @@
     } else if (value is Map<String, String>) {
       return (value as Map<String, String>)
           .map<String, String>((String key, String value) {
-        return new MapEntry(
-            key, pathContext.canonicalize(resolveTildePath(value)));
+        return MapEntry(key, pathContext.canonicalize(resolveTildePath(value)));
       }) as T;
     } else {
-      throw new UnsupportedError('Type $T is not supported for resolvedValue');
+      throw UnsupportedError('Type $T is not supported for resolvedValue');
     }
   }
 }
@@ -534,7 +533,7 @@
   Map<String, _YamlFileData> get _yamlAtCanonicalPathCache =>
       root.__yamlAtCanonicalPathCache;
 
-  final ArgParser __argParser = new ArgParser(usageLineLength: 80);
+  final ArgParser __argParser = ArgParser(usageLineLength: 80);
 
   ArgParser get argParser => root.__argParser;
 
@@ -570,7 +569,7 @@
           "${valueWithContext.value.runtimeType}");
     }
     for (String path in resolvedPaths) {
-      FileSystemEntity f = isDir ? new Directory(path) : new File(path);
+      FileSystemEntity f = isDir ? Directory(path) : File(path);
       if (!f.existsSync()) {
         _onMissing(valueWithContext, path);
       }
@@ -640,13 +639,13 @@
   T valueAtCurrent() => valueAt(directoryCurrent);
 
   /// Calls [valueAt] on the directory this element is defined in.
-  T valueAtElement(Element element) => valueAt(
-      new Directory(p.canonicalize(p.basename(element.source.fullName))));
+  T valueAtElement(Element element) =>
+      valueAt(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)) {
-      throw new DartdocOptionError(
+      throw DartdocOptionError(
           'Tried to add two children with the same name: ${option.name}');
     }
     _children[option.name] = option;
@@ -796,7 +795,7 @@
 
   T _valueAtFromSynthetic(Directory dir) {
     _OptionValueWithContext context =
-        new _OptionValueWithContext<T>(_compute(this, dir), dir.path);
+        _OptionValueWithContext<T>(_compute(this, dir), dir.path);
     return _handlePathsInContext(context);
   }
 
@@ -809,12 +808,12 @@
       _OptionValueWithContext valueWithContext, String missingPath) {
     String description =
         'Synthetic configuration option ${name} from <internal>';
-    throw new DartdocFileMissing(
+    throw DartdocFileMissing(
         '$description, computed as ${valueWithContext.value}, resolves to missing path: "${missingPath}"');
   }
 }
 
-typedef Future<List<DartdocOption>> OptionGenerator();
+typedef OptionGenerator = Future<List<DartdocOption>> Function();
 
 /// A [DartdocOption] that only contains other [DartdocOption]s and is not an option itself.
 class DartdocOptionSet extends DartdocOption<Null> {
@@ -829,7 +828,7 @@
   /// [DartdocOption]s that will be added to the new option set.
   static Future<DartdocOptionSet> fromOptionGenerators(
       String name, Iterable<OptionGenerator> optionGenerators) async {
-    DartdocOptionSet optionSet = new DartdocOptionSet(name);
+    DartdocOptionSet optionSet = DartdocOptionSet(name);
     for (OptionGenerator generator in optionGenerators) {
       optionSet.addAll(await generator());
     }
@@ -998,7 +997,7 @@
       _OptionValueWithContext valueWithContext, String missingPath) {
     String dartdocYaml = p.join(
         valueWithContext.canonicalDirectoryPath, valueWithContext.definingFile);
-    throw new DartdocFileMissing(
+    throw DartdocFileMissing(
         'Field ${fieldName} from ${dartdocYaml}, set to ${valueWithContext.value}, resolves to missing path: "${missingPath}"');
   }
 
@@ -1010,7 +1009,7 @@
     return _valueAtFromFiles(dir) ?? defaultsTo;
   }
 
-  final Map<String, T> __valueAtFromFiles = new Map();
+  final Map<String, T> __valueAtFromFiles = Map();
 
   // The value of this option from files will not change unless files are
   // modified during execution (not allowed in Dartdoc).
@@ -1092,12 +1091,12 @@
         };
       }
       if (_convertYamlToType == null) {
-        throw new DartdocOptionError(
+        throw DartdocOptionError(
             'Unable to convert yaml to type for option: $fieldName, method not defined');
       }
       String canonicalDirectoryPath = p.canonicalize(contextPath);
       returnData = _convertYamlToType(
-          yamlData, new p.Context(current: canonicalDirectoryPath));
+          yamlData, p.Context(current: canonicalDirectoryPath));
     } else if (_isDouble) {
       if (yamlData is num) {
         returnData = yamlData.toDouble();
@@ -1107,30 +1106,28 @@
         returnData = yamlData;
       }
     } else {
-      throw new UnsupportedError('Type ${T} is not supported');
+      throw UnsupportedError('Type ${T} is not supported');
     }
-    return new _OptionValueWithContext(returnData as T, contextPath,
+    return _OptionValueWithContext(returnData as T, contextPath,
         definingFile: 'dartdoc_options.yaml');
   }
 
   _YamlFileData _yamlAtDirectory(Directory dir) {
     List<String> canonicalPaths = [p.canonicalize(dir.path)];
     if (!_yamlAtCanonicalPathCache.containsKey(canonicalPaths.first)) {
-      _YamlFileData yamlData =
-          new _YamlFileData(new Map(), directoryCurrentPath);
+      _YamlFileData yamlData = _YamlFileData(Map(), directoryCurrentPath);
       if (dir.existsSync()) {
         File dartdocOptionsFile;
 
         while (true) {
-          dartdocOptionsFile =
-              new File(p.join(dir.path, 'dartdoc_options.yaml'));
+          dartdocOptionsFile = File(p.join(dir.path, 'dartdoc_options.yaml'));
           if (dartdocOptionsFile.existsSync() ||
               p.equals(dir.parent.path, dir.path)) break;
           dir = dir.parent;
           canonicalPaths.add(p.canonicalize(dir.path));
         }
         if (dartdocOptionsFile.existsSync()) {
-          yamlData = new _YamlFileData(
+          yamlData = _YamlFileData(
               loadYaml(dartdocOptionsFile.readAsStringSync()),
               p.canonicalize(dir.path));
         }
@@ -1170,7 +1167,7 @@
     } else if (_isDouble) {
       example = '0.76';
     }
-    throw new DartdocOptionError(
+    throw DartdocOptionError(
         'Invalid argument value: --${argName}, set to "${value}", must be a ${T}.  Example:  --${argName} ${example}');
   }
 
@@ -1187,7 +1184,7 @@
 
   void _onMissingFromArgs(
       _OptionValueWithContext valueWithContext, String missingPath) {
-    throw new DartdocFileMissing(
+    throw DartdocFileMissing(
         'Argument --${argName}, set to ${valueWithContext.value}, resolves to missing path: "${missingPath}"');
   }
 
@@ -1223,7 +1220,7 @@
     } else {
       throw UnsupportedError('Type ${T} is not supported');
     }
-    return new _OptionValueWithContext(retval, directoryCurrentPath);
+    return _OptionValueWithContext(retval, directoryCurrentPath);
   }
 
   /// The name of this option as a command line argument.
@@ -1237,7 +1234,7 @@
     argName = argName.replaceAll('_', '-');
     // Do not consume the lowercase character after the uppercase one, to handle
     // two character words.
-    final camelCaseRegexp = new RegExp(r'([a-z])([A-Z])(?=([a-z]))');
+    final camelCaseRegexp = RegExp(r'([a-z])([A-Z])(?=([a-z]))');
     argName = argName.replaceAllMapped(camelCaseRegexp, (Match m) {
       String before = m.group(1);
       String after = m.group(2).toLowerCase();
@@ -1280,7 +1277,7 @@
           hide: hide,
           splitCommas: splitCommas);
     } else {
-      throw new UnsupportedError('Type ${T} is not supported');
+      throw UnsupportedError('Type ${T} is not supported');
     }
   }
 }
@@ -1316,9 +1313,9 @@
     if (entity == null) {
       String inputDir = optionSet['inputDir'].valueAt(directoryCurrent) ??
           directoryCurrentPath;
-      context = new Directory(inputDir);
+      context = Directory(inputDir);
     } else {
-      context = new Directory(
+      context = Directory(
           p.canonicalize(entity is File ? entity.parent.path : entity.path));
     }
   }
@@ -1327,21 +1324,19 @@
   /// location).
   factory DartdocOptionContext.fromElement(
       DartdocOptionSet optionSet, Element element) {
-    return new DartdocOptionContext(
-        optionSet, new File(element.source.fullName));
+    return DartdocOptionContext(optionSet, File(element.source.fullName));
   }
 
   /// Build a DartdocOptionContext from an existing [DartdocOptionContext] and a new analyzer [Element].
   factory DartdocOptionContext.fromContextElement(
       DartdocOptionContext optionContext, Element element) {
-    return new DartdocOptionContext.fromElement(
-        optionContext.optionSet, element);
+    return DartdocOptionContext.fromElement(optionContext.optionSet, element);
   }
 
   /// Build a DartdocOptionContext from an existing [DartdocOptionContext].
   factory DartdocOptionContext.fromContext(
       DartdocOptionContext optionContext, FileSystemEntity entity) {
-    return new DartdocOptionContext(optionContext.optionSet, entity);
+    return DartdocOptionContext(optionContext.optionSet, entity);
   }
 
   // All values defined in createDartdocOptions should be exposed here.
@@ -1428,27 +1423,26 @@
 /// given command line arguments.
 Future<List<DartdocOption>> createDartdocOptions() async {
   return <DartdocOption>[
-    new DartdocOptionArgOnly<bool>('allowTools', false,
+    DartdocOptionArgOnly<bool>('allowTools', false,
         help: 'Execute user-defined tools to fill in @tool directives.',
         negatable: true),
-    new DartdocOptionArgFile<double>(
-        'ambiguousReexportScorerMinConfidence', 0.1,
+    DartdocOptionArgFile<double>('ambiguousReexportScorerMinConfidence', 0.1,
         help: 'Minimum scorer confidence to suppress warning on ambiguous '
             'reexport.'),
-    new DartdocOptionArgOnly<bool>('autoIncludeDependencies', false,
+    DartdocOptionArgOnly<bool>('autoIncludeDependencies', false,
         help: 'Include all the used libraries into the docs, even the ones not '
             'in the current package or "include-external"',
         negatable: true),
-    new DartdocOptionArgFile<List<String>>('categoryOrder', [],
+    DartdocOptionArgFile<List<String>>('categoryOrder', [],
         help:
             "A list of categories (not package names) to place first when grouping symbols on dartdoc's sidebar. "
             'Unmentioned categories are sorted after these.'),
-    new DartdocOptionFileOnly<CategoryConfiguration>(
+    DartdocOptionFileOnly<CategoryConfiguration>(
         'categories', CategoryConfiguration.empty,
         convertYamlToType: CategoryConfiguration.fromYamlMap,
         help: 'A list of all categories, their display names, and markdown '
             'documentation in the order they are to be displayed.'),
-    new DartdocOptionSyntheticOnly<List<String>>('dropTextFrom',
+    DartdocOptionSyntheticOnly<List<String>>('dropTextFrom',
         (DartdocSyntheticOption<List<String>> option, Directory dir) {
       if (option.parent['hideSdkText'].valueAt(dir)) {
         return [
@@ -1472,45 +1466,45 @@
       }
       return [];
     }, help: 'Remove text from libraries with the following names.'),
-    new DartdocOptionArgFile<String>('examplePathPrefix', null,
+    DartdocOptionArgFile<String>('examplePathPrefix', null,
         isDir: true,
         help: 'Prefix for @example paths.\n(defaults to the project root)',
         mustExist: true),
-    new DartdocOptionArgFile<List<String>>('exclude', [],
+    DartdocOptionArgFile<List<String>>('exclude', [],
         help: 'Library names to ignore.', splitCommas: true),
-    new DartdocOptionArgOnly<List<String>>('excludePackages', [],
+    DartdocOptionArgOnly<List<String>>('excludePackages', [],
         help: 'Package names to ignore.', splitCommas: true),
     // This could be a ArgOnly, but trying to not provide too many ways
     // to set the flutter root.
-    new DartdocOptionSyntheticOnly<String>(
+    DartdocOptionSyntheticOnly<String>(
         'flutterRoot',
         (DartdocSyntheticOption<String> option, Directory dir) =>
             resolveTildePath(Platform.environment['FLUTTER_ROOT']),
         isDir: true,
         help: 'Root of the Flutter SDK, specified from environment.',
         mustExist: true),
-    new DartdocOptionArgOnly<bool>('hideSdkText', false,
+    DartdocOptionArgOnly<bool>('hideSdkText', false,
         hide: true,
         help: 'Drop all text for SDK components.  Helpful for integration '
             'tests for dartdoc, probably not useful for anything else.',
         negatable: true),
-    new DartdocOptionArgFile<List<String>>('include', [],
+    DartdocOptionArgFile<List<String>>('include', [],
         help: 'Library names to generate docs for.', splitCommas: true),
-    new DartdocOptionArgFile<List<String>>('includeExternal', null,
+    DartdocOptionArgFile<List<String>>('includeExternal', null,
         isFile: true,
         help:
             'Additional (external) dart files to include; use "dir/fileName", '
             'as in lib/material.dart.',
         mustExist: true,
         splitCommas: true),
-    new DartdocOptionArgOnly<bool>('includeSource', true,
+    DartdocOptionArgOnly<bool>('includeSource', true,
         help: 'Show source code blocks.', negatable: true),
-    new DartdocOptionArgOnly<bool>('injectHtml', false,
+    DartdocOptionArgOnly<bool>('injectHtml', false,
         help: 'Allow the use of the {@inject-html} directive to inject raw '
             'HTML into dartdoc output.'),
-    new DartdocOptionArgOnly<String>('input', directoryCurrentPath,
+    DartdocOptionArgOnly<String>('input', directoryCurrentPath,
         isDir: true, help: 'Path to source directory', mustExist: true),
-    new DartdocOptionSyntheticOnly<String>('inputDir',
+    DartdocOptionSyntheticOnly<String>('inputDir',
         (DartdocSyntheticOption<String> option, Directory dir) {
       if (option.parent['sdkDocs'].valueAt(dir)) {
         return option.parent['sdkDir'].valueAt(dir);
@@ -1520,16 +1514,16 @@
         help: 'Path to source directory (with override if --sdk-docs)',
         isDir: true,
         mustExist: true),
-    new DartdocOptionSet('linkTo')
+    DartdocOptionSet('linkTo')
       ..addAll([
-        new DartdocOptionArgOnly<Map<String, String>>(
+        DartdocOptionArgOnly<Map<String, String>>(
             'hosted',
             {
               'pub.dartlang.org':
                   'https://pub.dartlang.org/documentation/%n%/%v%'
             },
             help: 'Specify URLs for hosted pub packages'),
-        new DartdocOptionArgOnly<Map<String, String>>(
+        DartdocOptionArgOnly<Map<String, String>>(
           'sdks',
           {
             'Dart': 'https://api.dartlang.org/%b%/%v%',
@@ -1537,7 +1531,7 @@
           },
           help: 'Specify URLs for SDKs.',
         ),
-        new DartdocOptionFileSynth<String>('url',
+        DartdocOptionFileSynth<String>('url',
             (DartdocSyntheticOption<String> option, Directory dir) {
           PackageMeta packageMeta =
               option.parent.parent['packageMeta'].valueAt(dir);
@@ -1555,70 +1549,69 @@
           }
           return '';
         }, help: 'Url to use for this particular package.'),
-        new DartdocOptionArgOnly<bool>('remote', false,
+        DartdocOptionArgOnly<bool>('remote', false,
             help: 'Allow links to be generated for packages outside this one.',
             negatable: true),
       ]),
-    new DartdocOptionArgOnly<String>('output', p.join('doc', 'api'),
+    DartdocOptionArgOnly<String>('output', p.join('doc', 'api'),
         isDir: true, help: 'Path to output directory.'),
-    new DartdocOptionSyntheticOnly<PackageMeta>(
+    DartdocOptionSyntheticOnly<PackageMeta>(
       'packageMeta',
       (DartdocSyntheticOption<PackageMeta> option, Directory dir) {
-        PackageMeta packageMeta = new PackageMeta.fromDir(dir);
+        PackageMeta packageMeta = PackageMeta.fromDir(dir);
         if (packageMeta == null) {
-          throw new DartdocOptionError(
+          throw DartdocOptionError(
               'Unable to determine package for directory: ${dir.path}');
         }
         return packageMeta;
       },
     ),
-    new DartdocOptionArgOnly<List<String>>('packageOrder', [],
+    DartdocOptionArgOnly<List<String>>('packageOrder', [],
         help:
             'A list of package names to place first when grouping libraries in packages. '
             'Unmentioned packages are sorted after these.'),
-    new DartdocOptionArgOnly<bool>('sdkDocs', false,
+    DartdocOptionArgOnly<bool>('sdkDocs', false,
         help: 'Generate ONLY the docs for the Dart SDK.'),
-    new DartdocOptionArgSynth<String>('sdkDir',
+    DartdocOptionArgSynth<String>('sdkDir',
         (DartdocSyntheticOption<String> option, Directory dir) {
       if (!option.parent['sdkDocs'].valueAt(dir) &&
           (option.root['topLevelPackageMeta'].valueAt(dir) as PackageMeta)
               .requiresFlutter) {
         String flutterRoot = option.root['flutterRoot'].valueAt(dir);
         if (flutterRoot == null) {
-          throw new DartdocOptionError(
+          throw DartdocOptionError(
               'Top level package requires Flutter but FLUTTER_ROOT environment variable not set');
         }
         return p.join(flutterRoot, 'bin', 'cache', 'dart-sdk');
       }
       return defaultSdkDir.absolute.path;
     }, help: 'Path to the SDK directory.', isDir: true, mustExist: true),
-    new DartdocOptionArgFile<bool>('showUndocumentedCategories', false,
+    DartdocOptionArgFile<bool>('showUndocumentedCategories', false,
         help: "Label categories that aren't documented", negatable: true),
-    new DartdocOptionSyntheticOnly<PackageMeta>('topLevelPackageMeta',
+    DartdocOptionSyntheticOnly<PackageMeta>('topLevelPackageMeta',
         (DartdocSyntheticOption<PackageMeta> option, Directory dir) {
-      PackageMeta packageMeta = new PackageMeta.fromDir(
-          new Directory(option.parent['inputDir'].valueAt(dir)));
+      PackageMeta packageMeta = PackageMeta.fromDir(
+          Directory(option.parent['inputDir'].valueAt(dir)));
       if (packageMeta == null) {
-        throw new DartdocOptionError(
+        throw DartdocOptionError(
             'Unable to generate documentation: no package found');
       }
       if (!packageMeta.isValid) {
         final String firstError = packageMeta.getInvalidReasons().first;
-        throw new DartdocOptionError('Package is invalid: $firstError');
+        throw DartdocOptionError('Package is invalid: $firstError');
       }
       return packageMeta;
     }, help: 'PackageMeta object for the default package.'),
-    new DartdocOptionArgOnly<bool>('useCategories', true,
+    DartdocOptionArgOnly<bool>('useCategories', true,
         help: 'Display categories in the sidebar of packages'),
-    new DartdocOptionArgOnly<bool>('validateLinks', true,
+    DartdocOptionArgOnly<bool>('validateLinks', true,
         help:
             'Runs the built-in link checker to display Dart context aware warnings for broken links (slow)',
         negatable: true),
-    new DartdocOptionArgOnly<bool>('verboseWarnings', true,
+    DartdocOptionArgOnly<bool>('verboseWarnings', true,
         help: 'Display extra debugging information and help with warnings.',
         negatable: true),
-    new DartdocOptionFileOnly<ToolConfiguration>(
-        'tools', ToolConfiguration.empty,
+    DartdocOptionFileOnly<ToolConfiguration>('tools', ToolConfiguration.empty,
         convertYamlToType: ToolConfiguration.fromYamlMap,
         help: 'A map of tool names to executable paths. Each executable must '
             'exist. Executables for different platforms are specified by '
diff --git a/lib/src/element_type.dart b/lib/src/element_type.dart
index bba26f8..0d2598c 100644
--- a/lib/src/element_type.dart
+++ b/lib/src/element_type.dart
@@ -21,10 +21,9 @@
   factory ElementType.from(DartType f, PackageGraph packageGraph,
       [ElementType returnedFrom]) {
     if (f.element == null || f.element.kind == ElementKind.DYNAMIC) {
-      return new UndefinedElementType(f, packageGraph, returnedFrom);
+      return UndefinedElementType(f, packageGraph, returnedFrom);
     } else {
-      ModelElement element =
-          new ModelElement.fromElement(f.element, packageGraph);
+      ModelElement element = ModelElement.fromElement(f.element, packageGraph);
       assert(f is ParameterizedType || f is TypeParameterType);
       bool isGenericTypeAlias =
           f.element.enclosingElement is GenericTypeAliasElement;
@@ -32,33 +31,30 @@
         assert(f is ParameterizedType);
         if (isGenericTypeAlias) {
           assert(element is! ModelFunctionAnonymous);
-          return new CallableGenericTypeAliasElementType(
+          return CallableGenericTypeAliasElementType(
               f, packageGraph, element, returnedFrom);
         } else {
           if (element is ModelFunctionAnonymous) {
-            return new CallableAnonymousElementType(
+            return CallableAnonymousElementType(
                 f, packageGraph, element, returnedFrom);
           } else {
             assert(element is! ModelFunctionAnonymous);
-            return new CallableElementType(
-                f, packageGraph, element, returnedFrom);
+            return CallableElementType(f, packageGraph, element, returnedFrom);
           }
         }
       } else if (isGenericTypeAlias) {
         assert(f is TypeParameterType);
         assert(element is! ModelFunctionAnonymous);
-        return new GenericTypeAliasElementType(
+        return GenericTypeAliasElementType(
             f, packageGraph, element, returnedFrom);
       }
       if (f is TypeParameterType) {
         assert(element is! ModelFunctionAnonymous);
-        return new TypeParameterElementType(
-            f, packageGraph, element, returnedFrom);
+        return TypeParameterElementType(f, packageGraph, element, returnedFrom);
       }
       assert(f is ParameterizedType);
       assert(element is! ModelFunctionAnonymous);
-      return new ParameterizedElementType(
-          f, packageGraph, element, returnedFrom);
+      return ParameterizedElementType(f, packageGraph, element, returnedFrom);
     }
   }
 
@@ -117,7 +113,7 @@
   @override
   String get linkedName {
     if (_linkedName == null) {
-      StringBuffer buf = new StringBuffer();
+      StringBuffer buf = StringBuffer();
 
       buf.write(element.linkedName);
 
@@ -140,7 +136,7 @@
   @override
   String get nameWithGenerics {
     if (_nameWithGenerics == null) {
-      StringBuffer buf = new StringBuffer();
+      StringBuffer buf = StringBuffer();
 
       buf.write(element.name);
 
@@ -212,7 +208,7 @@
   ElementType _returnType;
   ElementType get returnType {
     if (_returnType == null) {
-      _returnType = new ElementType.from(type, packageGraph, this);
+      _returnType = ElementType.from(type, packageGraph, this);
     }
     return _returnType;
   }
@@ -225,7 +221,7 @@
     if (_typeArguments == null) {
       _typeArguments = (type as ParameterizedType)
           .typeArguments
-          .map((f) => new ElementType.from(f, packageGraph))
+          .map((f) => ElementType.from(f, packageGraph))
           .toList();
     }
     return _typeArguments;
@@ -242,7 +238,7 @@
   @override
   ElementType get returnType {
     if (_returnType == null) {
-      _returnType = new ElementType.from(type.returnType, packageGraph, this);
+      _returnType = ElementType.from(type.returnType, packageGraph, this);
     }
     return _returnType;
   }
@@ -268,7 +264,7 @@
       }
       if (dartTypeArguments != null) {
         _typeArguments = dartTypeArguments
-            .map((f) => new ElementType.from(f, packageGraph))
+            .map((f) => ElementType.from(f, packageGraph))
             .toList();
       }
     }
@@ -332,8 +328,8 @@
   @override
   ModelElement get returnElement {
     if (_returnElement == null) {
-      _returnElement = new ModelElement.fromElement(
-          type.element.enclosingElement, packageGraph);
+      _returnElement =
+          ModelElement.fromElement(type.element.enclosingElement, packageGraph);
     }
     return _returnElement;
   }
@@ -341,8 +337,8 @@
   @override
   ElementType get returnType {
     if (_returnType == null) {
-      _returnType = new ElementType.from(
-          returnElement.modelType.type, packageGraph, this);
+      _returnType =
+          ElementType.from(returnElement.modelType.type, packageGraph, this);
     }
     return _returnType;
   }
diff --git a/lib/src/empty_generator.dart b/lib/src/empty_generator.dart
index 476dd67..92a96b8 100644
--- a/lib/src/empty_generator.dart
+++ b/lib/src/empty_generator.dart
@@ -27,8 +27,7 @@
     return null;
   }
 
-  final StreamController<void> _onFileCreated =
-      new StreamController(sync: true);
+  final StreamController<void> _onFileCreated = StreamController(sync: true);
 
   @override
 
@@ -37,5 +36,5 @@
   Stream<void> get onFileCreated => _onFileCreated.stream;
 
   @override
-  Set<String> get writtenFiles => new Set();
+  Set<String> get writtenFiles => Set();
 }
diff --git a/lib/src/experiment_options.dart b/lib/src/experiment_options.dart
index 0d9fa2f..b7f65b5 100644
--- a/lib/src/experiment_options.dart
+++ b/lib/src/experiment_options.dart
@@ -24,16 +24,16 @@
 Future<List<DartdocOption>> createExperimentOptions() async {
   return <DartdocOption>[
     // TODO(jcollins-g): Consider loading experiment values from dartdoc_options.yaml?
-    new DartdocOptionArgOnly<List<String>>('enable-experiment', [],
+    DartdocOptionArgOnly<List<String>>('enable-experiment', [],
         help: 'Enable or disable listed experiments.\n' +
             ExperimentStatus.knownFeatures.values
                 .where((e) => e.documentation != null)
                 .map((e) =>
                     '    [no-]${e.enableString}: ${e.documentation} (default: ${e.isEnabledByDefault})')
                 .join('\n')),
-    new DartdocOptionSyntheticOnly<ExperimentStatus>(
+    DartdocOptionSyntheticOnly<ExperimentStatus>(
         'experimentStatus',
-        (option, dir) => new ExperimentStatus.fromStrings(
+        (option, dir) => ExperimentStatus.fromStrings(
             option.parent['enable-experiment'].valueAt(dir))),
   ];
 }
diff --git a/lib/src/html/html_generator.dart b/lib/src/html/html_generator.dart
index 89b6402..c4c18ee 100644
--- a/lib/src/html/html_generator.dart
+++ b/lib/src/html/html_generator.dart
@@ -17,7 +17,7 @@
 import 'package:dartdoc/src/model.dart';
 import 'package:path/path.dart' as path;
 
-typedef String Renderer(String input);
+typedef Renderer = String Function(String input);
 
 // Generation order for libraries:
 //   constants
@@ -42,14 +42,13 @@
   final HtmlGeneratorOptions _options;
   HtmlGeneratorInstance _instance;
 
-  final StreamController<void> _onFileCreated =
-      new StreamController(sync: true);
+  final StreamController<void> _onFileCreated = StreamController(sync: true);
 
   @override
   Stream<void> get onFileCreated => _onFileCreated.stream;
 
   @override
-  final Set<String> writtenFiles = new Set<String>();
+  final Set<String> writtenFiles = Set<String>();
 
   static Future<HtmlGenerator> create(
       {HtmlGeneratorOptions options,
@@ -61,8 +60,7 @@
         footerPaths: footers,
         footerTextPaths: footerTexts);
 
-    return new HtmlGenerator._(
-        options ?? new HtmlGeneratorOptions(), templates);
+    return HtmlGenerator._(options ?? HtmlGeneratorOptions(), templates);
   }
 
   HtmlGenerator._(this._options, this._templates);
@@ -78,13 +76,13 @@
     void write(String filePath, Object content, {bool allowOverwrite}) {
       allowOverwrite ??= false;
       if (!enabled) {
-        throw new StateError('`write` was called after `generate` completed.');
+        throw StateError('`write` was called after `generate` completed.');
       }
       // If you see this assert, we're probably being called to build non-canonical
       // docs somehow.  Check data.self.isCanonical and callers for bugs.
       assert(allowOverwrite || !writtenFiles.contains(filePath));
 
-      var file = new File(path.join(outputDirectoryPath, filePath));
+      var file = File(path.join(outputDirectoryPath, filePath));
       var parent = file.parent;
       if (!parent.existsSync()) {
         parent.createSync(recursive: true);
@@ -95,7 +93,7 @@
       } else if (content is List<int>) {
         file.writeAsBytesSync(content);
       } else {
-        throw new ArgumentError.value(
+        throw ArgumentError.value(
             content, 'content', '`content` must be `String` or `List<int>`.');
       }
       _onFileCreated.add(file);
@@ -104,7 +102,7 @@
 
     try {
       _instance =
-          new HtmlGeneratorInstance(_options, _templates, packageGraph, write);
+          HtmlGeneratorInstance(_options, _templates, packageGraph, write);
       await _instance.generate();
     } finally {
       enabled = false;
@@ -140,7 +138,7 @@
 Future<List<Generator>> initGenerators(GeneratorContext config) async {
   // TODO(jcollins-g): Rationalize based on GeneratorContext all the way down
   // through the generators.
-  HtmlGeneratorOptions options = new HtmlGeneratorOptions(
+  HtmlGeneratorOptions options = HtmlGeneratorOptions(
       url: config.hostedUrl,
       relCanonicalPrefix: config.relCanonicalPrefix,
       toolVersion: dartdocVersion,
@@ -184,23 +182,23 @@
 Future<List<DartdocOption>> createGeneratorOptions() async {
   await _setSdkFooterCopyrightUri();
   return <DartdocOption>[
-    new DartdocOptionArgFile<String>('favicon', null,
+    DartdocOptionArgFile<String>('favicon', null,
         isFile: true,
         help: 'A path to a favicon for the generated docs.',
         mustExist: true),
-    new DartdocOptionArgFile<List<String>>('footer', [],
+    DartdocOptionArgFile<List<String>>('footer', [],
         isFile: true,
         help: 'paths to footer files containing HTML text.',
         mustExist: true,
         splitCommas: true),
-    new DartdocOptionArgFile<List<String>>('footerText', [],
+    DartdocOptionArgFile<List<String>>('footerText', [],
         isFile: true,
         help:
             'paths to footer-text files (optional text next to the package name '
             'and version).',
         mustExist: true,
         splitCommas: true),
-    new DartdocOptionSyntheticOnly<List<String>>(
+    DartdocOptionSyntheticOnly<List<String>>(
       'footerTextPaths',
       (DartdocSyntheticOption<List<String>> option, Directory dir) {
         final List<String> footerTextPaths = <String>[];
@@ -218,18 +216,18 @@
       help: 'paths to footer-text-files (adding special case for SDK)',
       mustExist: true,
     ),
-    new DartdocOptionArgFile<List<String>>('header', [],
+    DartdocOptionArgFile<List<String>>('header', [],
         isFile: true,
         help: 'paths to header files containing HTML text.',
         splitCommas: true),
-    new DartdocOptionArgOnly<String>('hostedUrl', null,
+    DartdocOptionArgOnly<String>('hostedUrl', null,
         help:
             'URL where the docs will be hosted (used to generate the sitemap).'),
-    new DartdocOptionArgOnly<bool>('prettyIndexJson', false,
+    DartdocOptionArgOnly<bool>('prettyIndexJson', false,
         help:
             "Generates `index.json` with indentation and newlines. The file is larger, but it's also easier to diff.",
         negatable: false),
-    new DartdocOptionArgOnly<String>('relCanonicalPrefix', null,
+    DartdocOptionArgOnly<String>('relCanonicalPrefix', null,
         help:
             'If provided, add a rel="canonical" prefixed with provided value. '
             'Consider using if\nbuilding many versions of the docs for public '
diff --git a/lib/src/html/html_generator_instance.dart b/lib/src/html/html_generator_instance.dart
index 6b86232..e542532 100644
--- a/lib/src/html/html_generator_instance.dart
+++ b/lib/src/html/html_generator_instance.dart
@@ -19,7 +19,8 @@
 import 'package:mustache/mustache.dart';
 import 'package:path/path.dart' as path;
 
-typedef void FileWriter(String path, Object content, {bool allowOverwrite});
+typedef FileWriter = void Function(String path, Object content,
+    {bool allowOverwrite});
 
 class HtmlGeneratorInstance {
   final HtmlGeneratorOptions _options;
@@ -40,7 +41,7 @@
 
     await _copyResources();
     if (_options.faviconPath != null) {
-      var bytes = new File(_options.faviconPath).readAsBytesSync();
+      var bytes = File(_options.faviconPath).readAsBytesSync();
       // Allow overwrite of favicon.
       _writer(path.join('static-assets', 'favicon.png'), bytes,
           allowOverwrite: true);
@@ -48,7 +49,7 @@
   }
 
   void _generateCategoryJson() {
-    var encoder = new JsonEncoder.withIndent('  ');
+    var encoder = JsonEncoder.withIndent('  ');
     final List<Map> indexItems = _categorizationItems.map((Categorization e) {
       Map data = {
         'name': e.name,
@@ -79,9 +80,8 @@
   List<Categorization> _categorizationItems;
 
   void _generateSearchIndex() {
-    var encoder = _options.prettyIndexJson
-        ? new JsonEncoder.withIndent(' ')
-        : new JsonEncoder();
+    var encoder =
+        _options.prettyIndexJson ? JsonEncoder.withIndent(' ') : JsonEncoder();
     _categorizationItems = [];
 
     final List<Map> indexItems = _indexedElements.map((Indexable e) {
@@ -242,8 +242,7 @@
   }
 
   void generatePackage(PackageGraph packageGraph, Package package) {
-    TemplateData data =
-        new PackageTemplateData(_options, packageGraph, package);
+    TemplateData data = PackageTemplateData(_options, packageGraph, package);
     logInfo('documenting ${package.name}');
 
     _build('index.html', _templates.indexTemplate, data);
@@ -253,8 +252,7 @@
   void generateCategory(PackageGraph packageGraph, Category category) {
     logInfo(
         'Generating docs for category ${category.name} from ${category.package.fullyQualifiedName}...');
-    TemplateData data =
-        new CategoryTemplateData(_options, packageGraph, category);
+    TemplateData data = CategoryTemplateData(_options, packageGraph, category);
 
     _build(path.joinAll(category.href.split('/')), _templates.categoryTemplate,
         data);
@@ -266,27 +264,25 @@
     if (!lib.isAnonymous && !lib.hasDocumentation) {
       packageGraph.warnOnElement(lib, PackageWarning.noLibraryLevelDocs);
     }
-    TemplateData data = new LibraryTemplateData(_options, packageGraph, lib);
+    TemplateData data = LibraryTemplateData(_options, packageGraph, lib);
 
     _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);
+    TemplateData data = ClassTemplateData(_options, packageGraph, lib, clazz);
     _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);
+    TemplateData data = MixinTemplateData(_options, packageGraph, lib, mixin);
     _build(path.joinAll(mixin.href.split('/')), _templates.mixinTemplate, data);
   }
 
   void generateConstructor(PackageGraph packageGraph, Library lib, Class clazz,
       Constructor constructor) {
-    TemplateData data = new ConstructorTemplateData(
+    TemplateData data = ConstructorTemplateData(
         _options, packageGraph, lib, clazz, constructor);
 
     _build(path.joinAll(constructor.href.split('/')),
@@ -294,7 +290,7 @@
   }
 
   void generateEnum(PackageGraph packageGraph, Library lib, Enum eNum) {
-    TemplateData data = new EnumTemplateData(_options, packageGraph, lib, eNum);
+    TemplateData data = EnumTemplateData(_options, packageGraph, lib, eNum);
 
     _build(path.joinAll(eNum.href.split('/')), _templates.enumTemplate, data);
   }
@@ -302,7 +298,7 @@
   void generateFunction(
       PackageGraph packageGraph, Library lib, ModelFunction function) {
     TemplateData data =
-        new FunctionTemplateData(_options, packageGraph, lib, function);
+        FunctionTemplateData(_options, packageGraph, lib, function);
 
     _build(path.joinAll(function.href.split('/')), _templates.functionTemplate,
         data);
@@ -311,7 +307,7 @@
   void generateMethod(
       PackageGraph packageGraph, Library lib, Class clazz, Method method) {
     TemplateData data =
-        new MethodTemplateData(_options, packageGraph, lib, clazz, method);
+        MethodTemplateData(_options, packageGraph, lib, clazz, method);
 
     _build(
         path.joinAll(method.href.split('/')), _templates.methodTemplate, data);
@@ -320,7 +316,7 @@
   void generateConstant(
       PackageGraph packageGraph, Library lib, Class clazz, Field property) {
     TemplateData data =
-        new ConstantTemplateData(_options, packageGraph, lib, clazz, property);
+        ConstantTemplateData(_options, packageGraph, lib, clazz, property);
 
     _build(path.joinAll(property.href.split('/')), _templates.constantTemplate,
         data);
@@ -329,7 +325,7 @@
   void generateProperty(
       PackageGraph packageGraph, Library lib, Class clazz, Field property) {
     TemplateData data =
-        new PropertyTemplateData(_options, packageGraph, lib, clazz, property);
+        PropertyTemplateData(_options, packageGraph, lib, clazz, property);
 
     _build(path.joinAll(property.href.split('/')), _templates.propertyTemplate,
         data);
@@ -338,7 +334,7 @@
   void generateTopLevelProperty(
       PackageGraph packageGraph, Library lib, TopLevelVariable property) {
     TemplateData data =
-        new TopLevelPropertyTemplateData(_options, packageGraph, lib, property);
+        TopLevelPropertyTemplateData(_options, packageGraph, lib, property);
 
     _build(path.joinAll(property.href.split('/')),
         _templates.topLevelPropertyTemplate, data);
@@ -347,7 +343,7 @@
   void generateTopLevelConstant(
       PackageGraph packageGraph, Library lib, TopLevelVariable property) {
     TemplateData data =
-        new TopLevelConstTemplateData(_options, packageGraph, lib, property);
+        TopLevelConstTemplateData(_options, packageGraph, lib, property);
 
     _build(path.joinAll(property.href.split('/')),
         _templates.topLevelConstantTemplate, data);
@@ -356,7 +352,7 @@
   void generateTypeDef(
       PackageGraph packageGraph, Library lib, Typedef typeDef) {
     TemplateData data =
-        new TypedefTemplateData(_options, packageGraph, lib, typeDef);
+        TypedefTemplateData(_options, packageGraph, lib, typeDef);
 
     _build(path.joinAll(typeDef.href.split('/')), _templates.typeDefTemplate,
         data);
@@ -367,7 +363,7 @@
     final prefix = 'package:dartdoc/resources/';
     for (String resourcePath in resources.resource_names) {
       if (!resourcePath.startsWith(prefix)) {
-        throw new StateError('Resource paths must start with $prefix, '
+        throw StateError('Resource paths must start with $prefix, '
             'encountered $resourcePath');
       }
       String destFileName = resourcePath.substring(prefix.length);
diff --git a/lib/src/html/resource_loader.dart b/lib/src/html/resource_loader.dart
index 89e1be6..ec1984f 100644
--- a/lib/src/html/resource_loader.dart
+++ b/lib/src/html/resource_loader.dart
@@ -25,7 +25,7 @@
 /// Loads a `package:` resource as an [List<int>].
 Future<List<int>> loadAsBytes(String path) async {
   if (!path.startsWith('package:')) {
-    throw new ArgumentError('path must begin with package:');
+    throw ArgumentError('path must begin with package:');
   }
 
   Uri uri = Uri.parse(path);
diff --git a/lib/src/html/resources.g.dart b/lib/src/html/resources.g.dart
index 2d833be..5e78a8c 100644
--- a/lib/src/html/resources.g.dart
+++ b/lib/src/html/resources.g.dart
@@ -1,6 +1,6 @@
 // WARNING: This file is auto-generated. Do not taunt.
 
-const List<String> resource_names = const [
+const List<String> resource_names = [
   'package:dartdoc/resources/URI.js',
   'package:dartdoc/resources/css/bootstrap.css',
   'package:dartdoc/resources/css/bootstrap.css.map',
diff --git a/lib/src/html/templates.dart b/lib/src/html/templates.dart
index ee30023..bcd90c2 100644
--- a/lib/src/html/templates.dart
+++ b/lib/src/html/templates.dart
@@ -10,7 +10,7 @@
 import 'package:dartdoc/src/html/resource_loader.dart' as loader;
 import 'package:mustache/mustache.dart';
 
-const _partials = const <String>[
+const _partials = <String>[
   'callable',
   'callable_multiline',
   'categorization',
@@ -52,20 +52,18 @@
     String template = await _getTemplateFile(templatePath);
 
     if (templatePath.contains('_head')) {
-      String headerValue = headerPaths
-          .map((path) => new File(path).readAsStringSync())
-          .join('\n');
+      String headerValue =
+          headerPaths.map((path) => File(path).readAsStringSync()).join('\n');
       template = template.replaceAll(headerPlaceholder, headerValue);
     }
 
     if (templatePath.contains('_footer')) {
-      String footerValue = footerPaths
-          .map((path) => new File(path).readAsStringSync())
-          .join('\n');
+      String footerValue =
+          footerPaths.map((path) => File(path).readAsStringSync()).join('\n');
       template = template.replaceAll(footerPlaceholder, footerValue);
 
       String footerTextValue = footerTextPaths
-          .map((path) => new File(path).readAsStringSync())
+          .map((path) => File(path).readAsStringSync())
           .join('\n');
       template = template.replaceAll(footerTextPlaceholder, footerTextValue);
     }
@@ -110,7 +108,7 @@
     Template _partial(String name) {
       String partial = partials[name];
       if (partial == null || partial.isEmpty) {
-        throw new StateError('Did not find partial "$name"');
+        throw StateError('Did not find partial "$name"');
       }
       return Template(partial);
     }
@@ -138,7 +136,7 @@
     var typeDefTemplate = await _loadTemplate('typedef.html');
     var mixinTemplate = await _loadTemplate('mixin.html');
 
-    return new Templates._(
+    return Templates._(
         indexTemplate,
         categoryTemplate,
         libraryTemplate,
diff --git a/lib/src/io_utils.dart b/lib/src/io_utils.dart
index d321b1a..9e0c34c 100644
--- a/lib/src/io_utils.dart
+++ b/lib/src/io_utils.dart
@@ -40,18 +40,18 @@
     Iterable<FileSystemEntity> listDir(Directory dir)}) {
   if (listDir == null) listDir = (Directory dir) => dir.listSync();
 
-  return _doList(dir, new Set<String>(), recursive, listDir);
+  return _doList(dir, Set<String>(), recursive, listDir);
 }
 
 Iterable<String> _doList(String dir, Set<String> listedDirectories,
     bool recurse, Iterable<FileSystemEntity> listDir(Directory dir)) sync* {
   // Avoid recursive symlinks.
-  var resolvedPath = new Directory(dir).resolveSymbolicLinksSync();
+  var resolvedPath = Directory(dir).resolveSymbolicLinksSync();
   if (!listedDirectories.contains(resolvedPath)) {
-    listedDirectories = new Set<String>.from(listedDirectories);
+    listedDirectories = Set<String>.from(listedDirectories);
     listedDirectories.add(resolvedPath);
 
-    for (var entity in listDir(new Directory(dir))) {
+    for (var entity in listDir(Directory(dir))) {
       // Skip hidden files and directories
       if (path.basename(entity.path).startsWith('.')) {
         continue;
@@ -76,16 +76,16 @@
 String getFileNameFor(String name) =>
     '${name.replaceAll(libraryNameRegexp, '-')}.html';
 
-final libraryNameRegexp = new RegExp('[.:]');
-final partOfRegexp = new RegExp('part of ');
-final newLinePartOfRegexp = new RegExp('\npart of ');
+final libraryNameRegexp = RegExp('[.:]');
+final partOfRegexp = RegExp('part of ');
+final newLinePartOfRegexp = RegExp('\npart of ');
 
 /// Best used with Future<void>.
 class MultiFutureTracker<T> {
   /// Approximate maximum number of simultaneous active Futures.
   final int parallel;
 
-  final Set<Future<T>> _trackedFutures = new Set();
+  final Set<Future<T>> _trackedFutures = Set();
 
   MultiFutureTracker(this.parallel);
 
diff --git a/lib/src/line_number_cache.dart b/lib/src/line_number_cache.dart
index 3000238..0f5e3b9 100644
--- a/lib/src/line_number_cache.dart
+++ b/lib/src/line_number_cache.dart
@@ -23,7 +23,7 @@
   var newlineChar = _getNewlineChar(contents);
   var offset = 0;
   var lineNumber = 0;
-  var result = new SplayTreeMap<int, int>();
+  var result = SplayTreeMap<int, int>();
 
   do {
     result[offset] = lineNumber;
@@ -34,7 +34,7 @@
   return result;
 }
 
-final LineNumberCache lineNumberCache = new LineNumberCache();
+final LineNumberCache lineNumberCache = LineNumberCache();
 
 // TODO(kevmoo): this could use some testing
 class LineNumberCache {
@@ -47,11 +47,11 @@
         file, () => _createLineNumbersMap(_fileContents(file)));
     var lastKey = lineMap.lastKeyBefore(offset);
     if (lastKey != null) {
-      return new Tuple2(lineMap[lastKey] + 1, offset - lastKey);
+      return Tuple2(lineMap[lastKey] + 1, offset - lastKey);
     }
     return null;
   }
 
   String _fileContents(String file) =>
-      __fileContents.putIfAbsent(file, () => new File(file).readAsStringSync());
+      __fileContents.putIfAbsent(file, () => File(file).readAsStringSync());
 }
diff --git a/lib/src/logging.dart b/lib/src/logging.dart
index ae67052..ba162ce 100644
--- a/lib/src/logging.dart
+++ b/lib/src/logging.dart
@@ -9,17 +9,17 @@
 
 import 'package:logging/logging.dart';
 
-final _logger = new Logger('dartdoc');
+final _logger = Logger('dartdoc');
 
 /// A custom [Level] for tracking file writes and verification.
 ///
 /// Has a value of `501` – one more than [Level.FINE].
-final Level progressLevel = new Level('PROGRESS', 501);
+final Level progressLevel = Level('PROGRESS', 501);
 
 /// A custom [Level] for errant print statements.
 ///
 /// Has a value of `1201` – one more than [Level.SHOUT].
-final Level printLevel = new Level('PRINT', 1201);
+final Level printLevel = Level('PRINT', 1201);
 
 void logWarning(Object message) {
   _logger.log(Level.WARNING, message);
@@ -69,7 +69,7 @@
       print(json.encode(output));
     });
   } else {
-    final stopwatch = new Stopwatch()..start();
+    final stopwatch = Stopwatch()..start();
 
     // Used to track if we're printing `...` to show progress.
     // Allows unified new-line tracking
@@ -121,13 +121,13 @@
 
 Future<List<DartdocOption>> createLoggingOptions() async {
   return <DartdocOption>[
-    new DartdocOptionArgOnly<bool>('json', false,
+    DartdocOptionArgOnly<bool>('json', false,
         help: 'Prints out progress JSON maps. One entry per line.',
         negatable: true),
-    new DartdocOptionArgOnly<bool>('showProgress', false,
+    DartdocOptionArgOnly<bool>('showProgress', false,
         help: 'Display progress indications to console stdout',
         negatable: false),
-    new DartdocOptionArgSynth<bool>('quiet',
+    DartdocOptionArgSynth<bool>('quiet',
         (DartdocSyntheticOption option, Directory dir) {
       if (option.root['generateDocs']?.valueAt(dir) == false) {
         return true;
diff --git a/lib/src/markdown_processor.dart b/lib/src/markdown_processor.dart
index 368fd31..aac01e2 100644
--- a/lib/src/markdown_processor.dart
+++ b/lib/src/markdown_processor.dart
@@ -16,7 +16,7 @@
 import 'package:html/parser.dart' show parse;
 import 'package:markdown/markdown.dart' as md;
 
-const validHtmlTags = const [
+const validHtmlTags = [
   "a",
   "abbr",
   "address",
@@ -118,30 +118,30 @@
 ];
 
 final RegExp nonHTML =
-    new RegExp("</?(?!(${validHtmlTags.join("|")})[> ])\\w+[> ]");
+    RegExp("</?(?!(${validHtmlTags.join("|")})[> ])\\w+[> ]");
 
 // Type parameters and other things to ignore at the end of doc references.
-final RegExp trailingIgnoreStuff = new RegExp(r'(<.*>|\(.*\))$');
+final RegExp trailingIgnoreStuff = RegExp(r'(<.*>|\(.*\))$');
 
 // Things to ignore at the beginning of doc references
 final RegExp leadingIgnoreStuff =
-    new RegExp(r'^(const|final|var)[\s]+', multiLine: true);
+    RegExp(r'^(const|final|var)[\s]+', multiLine: true);
 
 // If found, this may be intended as a reference to a constructor.
-final RegExp isConstructor = new RegExp(r'(^new[\s]+|\(\)$)', multiLine: true);
+final RegExp isConstructor = RegExp(r'(^new[\s]+|\(\)$)', multiLine: true);
 
 // This is probably not really intended as a doc reference, so don't try or
 // warn about them.
 // Covers anything with leading digits/symbols, empty string, weird punctuation, spaces.
-final RegExp notARealDocReference = new RegExp(r'''(^[^\w]|^[\d]|[,"'/]|^$)''');
+final RegExp notARealDocReference = RegExp(r'''(^[^\w]|^[\d]|[,"'/]|^$)''');
 
-final RegExp operatorPrefix = new RegExp(r'^operator[ ]*');
+final RegExp operatorPrefix = RegExp(r'^operator[ ]*');
 
 final HtmlEscape htmlEscape = const HtmlEscape(HtmlEscapeMode.element);
 
 final List<md.InlineSyntax> _markdown_syntaxes = [
-  new _InlineCodeSyntax(),
-  new _AutolinkWithoutScheme(),
+  _InlineCodeSyntax(),
+  _AutolinkWithoutScheme(),
   md.InlineHtmlSyntax(),
   md.StrikethroughSyntax(),
   md.AutolinkExtensionSyntax(),
@@ -152,11 +152,10 @@
   const md.HeaderWithIdSyntax(),
   const md.SetextHeaderWithIdSyntax(),
   const md.TableSyntax(),
-
 ];
 
 // Remove these schemas from the display text for hyperlinks.
-final RegExp _hide_schemes = new RegExp('^(http|https)://');
+final RegExp _hide_schemes = RegExp('^(http|https)://');
 
 class MatchingLinkResult {
   final ModelElement element;
@@ -198,7 +197,7 @@
   if (!codeRef.contains(isConstructor) &&
       codeRef.contains(notARealDocReference)) {
     // Don't waste our time on things we won't ever find.
-    return new MatchingLinkResult(null, warn: false);
+    return MatchingLinkResult(null, warn: false);
   }
 
   ModelElement refModelElement;
@@ -206,9 +205,9 @@
   // Try expensive not-scoped lookup.
   if (refModelElement == null && element is ModelElement) {
     Class preferredClass = _getPreferredClass(element);
-    refModelElement = new _MarkdownCommentReference(
-            codeRef, element, commentRefs, preferredClass)
-        .computeReferredElement();
+    refModelElement =
+        _MarkdownCommentReference(codeRef, element, commentRefs, preferredClass)
+            .computeReferredElement();
   }
 
   // Did not find it anywhere.
@@ -216,12 +215,12 @@
     // TODO(jcollins-g): remove squelching of non-canonical warnings here
     //                   once we no longer process full markdown for
     //                   oneLineDocs (#1417)
-    return new MatchingLinkResult(null, warn: element.isCanonical);
+    return MatchingLinkResult(null, warn: element.isCanonical);
   }
 
   // Ignore all parameters.
   if (refModelElement is Parameter || refModelElement is TypeParameter) {
-    return new MatchingLinkResult(null, warn: false);
+    return MatchingLinkResult(null, warn: false);
   }
 
   // There have been places in the code which helpfully cache entities
@@ -230,7 +229,7 @@
   assert(refModelElement == null ||
       refModelElement.packageGraph == element.packageGraph);
   if (refModelElement != null) {
-    return new MatchingLinkResult(refModelElement);
+    return MatchingLinkResult(refModelElement);
   }
   // From this point on, we haven't been able to find a canonical ModelElement.
   if (!refModelElement.isCanonical) {
@@ -240,7 +239,7 @@
     }
     // Don't warn about doc references because that's covered by the no
     // canonical library found message.
-    return new MatchingLinkResult(null, warn: false);
+    return MatchingLinkResult(null, warn: false);
   }
   // We should never get here unless there's a bug in findCanonicalModelElementFor.
   // findCanonicalModelElementFor(searchElement, preferredClass: preferredClass)
@@ -248,7 +247,7 @@
   // would return a non-canonical element.  However, outside of checked mode,
   // at least we have a canonical element, so proceed.
   assert(false);
-  return new MatchingLinkResult(refModelElement);
+  return MatchingLinkResult(refModelElement);
 }
 
 /// Given a set of commentRefs, return the one whose name matches the codeRef.
@@ -356,7 +355,7 @@
   /// [element.warn] for [PackageWarning.ambiguousDocReference] if there
   /// are more than one, but does not warn otherwise.
   ModelElement computeReferredElement() {
-    results = new Set();
+    results = Set();
     // TODO(jcollins-g): A complex package winds up spending a lot of cycles in here.  Optimize.
     for (void Function() findMethod in [
       // This might be an operator.  Strip the operator prefix and try again.
@@ -511,7 +510,7 @@
   void _findWithoutLeadingIgnoreStuff() {
     if (codeRef.contains(leadingIgnoreStuff)) {
       String newCodeRef = codeRef.replaceFirst(leadingIgnoreStuff, '');
-      results.add(new _MarkdownCommentReference(
+      results.add(_MarkdownCommentReference(
               newCodeRef, element, commentRefs, preferredClass)
           .computeReferredElement());
     }
@@ -520,7 +519,7 @@
   void _findWithoutTrailingIgnoreStuff() {
     if (codeRef.contains(trailingIgnoreStuff)) {
       String newCodeRef = codeRef.replaceFirst(trailingIgnoreStuff, '');
-      results.add(new _MarkdownCommentReference(
+      results.add(_MarkdownCommentReference(
               newCodeRef, element, commentRefs, preferredClass)
           .computeReferredElement());
     }
@@ -529,7 +528,7 @@
   void _findWithoutOperatorPrefix() {
     if (codeRef.startsWith(operatorPrefix)) {
       String newCodeRef = codeRef.replaceFirst(operatorPrefix, '');
-      results.add(new _MarkdownCommentReference(
+      results.add(_MarkdownCommentReference(
               newCodeRef, element, commentRefs, preferredClass)
           .computeReferredElement());
     }
@@ -680,7 +679,7 @@
   void _findAnalyzerReferences() {
     Element refElement = _getRefElementFromCommentRefs(commentRefs, codeRef);
     if (refElement != null) {
-      ModelElement refModelElement = new ModelElement.fromElement(
+      ModelElement refModelElement = ModelElement.fromElement(
           _getRefElementFromCommentRefs(commentRefs, codeRef),
           element.packageGraph);
       if (refModelElement is Accessor) {
@@ -784,8 +783,8 @@
 // Maximum number of characters to display after the beginning of a suspected generic.
 const maxPostContext = 30;
 
-final RegExp allBeforeFirstNewline = new RegExp(r'^.*\n', multiLine: true);
-final RegExp allAfterLastNewline = new RegExp(r'\n.*$', multiLine: true);
+final RegExp allBeforeFirstNewline = RegExp(r'^.*\n', multiLine: true);
+final RegExp allAfterLastNewline = RegExp(r'\n.*$', multiLine: true);
 
 // Generics should be wrapped into `[]` blocks, to avoid handling them as HTML tags
 // (like, [Apple<int>]). @Hixie asked for a warning when there's something, that looks
@@ -858,7 +857,7 @@
   /// Returns a tuple of longHtml, shortHtml.  longHtml is NULL if [processFullDocs] is true.
   static Tuple2<String, String> _renderNodesToHtml(
       List<md.Node> nodes, bool processFullDocs) {
-    var rawHtml = new md.HtmlRenderer().render(nodes);
+    var rawHtml = md.HtmlRenderer().render(nodes);
     var asHtmlDocument = parse(rawHtml);
     for (var s in asHtmlDocument.querySelectorAll('script')) {
       s.remove();
@@ -891,7 +890,7 @@
         ? ''
         : asHtmlDocument.body.children.first.innerHtml;
 
-    return new Tuple2(asHtml, asOneLiner);
+    return Tuple2(asHtml, asOneLiner);
   }
 
   // From package:markdown/src/document.dart
@@ -901,7 +900,7 @@
       var node = nodes[i];
       if (node is md.UnparsedContent) {
         List<md.Node> inlineNodes =
-            new md.InlineParser(node.textContent, this).parse();
+            md.InlineParser(node.textContent, this).parse();
         nodes.removeAt(i);
         nodes.insertAll(i, inlineNodes);
         i += inlineNodes.length - 1;
@@ -918,7 +917,7 @@
     md.Node firstNode;
     List<md.Node> nodes = [];
     for (md.Node node
-        in new IterableBlockParser(lines, this).parseLinesGenerator()) {
+        in IterableBlockParser(lines, this).parseLinesGenerator()) {
       if (firstNode != null) {
         hasExtendedDocs = true;
         if (!processFullDocs) break;
@@ -942,8 +941,7 @@
         shortHtml = '';
       }
     }
-    return new Tuple3<String, String, bool>(
-        longHtml, shortHtml, hasExtendedDocs);
+    return Tuple3<String, String, bool>(longHtml, shortHtml, hasExtendedDocs);
   }
 }
 
@@ -1005,12 +1003,12 @@
       if (name.isEmpty) {
         return null;
       }
-      return new md.Text(_linkDocReference(name, _element, commentRefs));
+      return md.Text(_linkDocReference(name, _element, commentRefs));
     }
 
     String text = _element.documentation;
     _showWarningsForGenericsOutsideSquareBracketsBlocks(text, _element);
-    MarkdownDocument document = new MarkdownDocument(
+    MarkdownDocument document = MarkdownDocument(
         inlineSyntaxes: _markdown_syntaxes,
         blockSyntaxes: _markdown_block_syntaxes,
         linkResolver: _linkResolver);
@@ -1024,7 +1022,7 @@
 
   @override
   bool onMatch(md.InlineParser parser, Match match) {
-    var element = new md.Element.text('code', htmlEscape.convert(match[1]));
+    var element = md.Element.text('code', htmlEscape.convert(match[1]));
     parser.addNode(element);
     return true;
   }
@@ -1035,7 +1033,7 @@
   bool onMatch(md.InlineParser parser, Match match) {
     var url = match[1];
     var text = htmlEscape.convert(url).replaceFirst(_hide_schemes, '');
-    var anchor = new md.Element.text('a', text);
+    var anchor = md.Element.text('a', text);
     anchor.attributes['href'] = url;
     parser.addNode(anchor);
 
diff --git a/lib/src/model.dart b/lib/src/model.dart
index 183a504..3ffb04d 100644
--- a/lib/src/model.dart
+++ b/lib/src/model.dart
@@ -76,7 +76,7 @@
 /// Items mapped to zero will sort alphabetically among custom annotations.
 /// Custom annotations are assumed to be any annotation or feature not in this
 /// map.
-const Map<String, int> featureOrder = const {
+const Map<String, int> featureOrder = {
   'read-only': 1,
   'write-only': 1,
   'read / write': 1,
@@ -102,26 +102,25 @@
   return compareAsciiLowerCaseNatural(a, b);
 }
 
-final RegExp locationSplitter = new RegExp(r'(package:|[\\/;.])');
-final RegExp substituteNameVersion = new RegExp(r'%([bnv])%');
+final RegExp locationSplitter = RegExp(r'(package:|[\\/;.])');
+final RegExp substituteNameVersion = RegExp(r'%([bnv])%');
 
 /// This doc may need to be processed in case it has a template or html
 /// fragment.
-final needsPrecacheRegExp = new RegExp(r'{@(template|tool|inject-html)');
+final needsPrecacheRegExp = RegExp(r'{@(template|tool|inject-html)');
 
-final templateRegExp = new RegExp(
+final templateRegExp = RegExp(
     r'[ ]*{@template\s+(.+?)}([\s\S]+?){@endtemplate}[ ]*\n?',
     multiLine: true);
-final htmlRegExp = new RegExp(
+final htmlRegExp = RegExp(
     r'[ ]*{@inject-html\s*}([\s\S]+?){@end-inject-html}[ ]*\n?',
     multiLine: true);
-final htmlInjectRegExp =
-    new RegExp(r'<dartdoc-html>([a-f0-9]+)</dartdoc-html>');
+final htmlInjectRegExp = RegExp(r'<dartdoc-html>([a-f0-9]+)</dartdoc-html>');
 
 // Matches all tool directives (even some invalid ones). This is so
 // we can give good error messages if the directive is malformed, instead of
 // just silently emitting it as-is.
-final basicToolRegExp = new RegExp(
+final basicToolRegExp = RegExp(
     r'[ ]*{@tool\s+([^}]+)}\n?([\s\S]+?)\n?{@end-tool}[ ]*\n?',
     multiLine: true);
 
@@ -132,15 +131,15 @@
 /// Match group 2 contains the quote character used (which is discarded).
 /// Match group 3 is a quoted arg, if any, without the quotes.
 /// Match group 4 is the unquoted arg, if any.
-final RegExp argMatcher = new RegExp(r'([a-zA-Z\-_0-9]+=)?' // option name
+final RegExp argMatcher = RegExp(r'([a-zA-Z\-_0-9]+=)?' // option name
     r'(?:' // Start a new non-capture group for the two possibilities.
     r'''(["'])((?:\\{2})*|(?:.*?[^\\](?:\\{2})*))\2|''' // with quotes.
     r'([^ ]+))'); // without quotes.
 
-final categoryRegexp = new RegExp(
+final categoryRegexp = RegExp(
     r'[ ]*{@(api|category|subCategory|image|samples) (.+?)}[ ]*\n?',
     multiLine: true);
-final macroRegExp = new RegExp(r'{@macro\s+([^}]+)}');
+final macroRegExp = RegExp(r'{@macro\s+([^}]+)}');
 
 /// Mixin for subclasses of ModelElement representing Elements that can be
 /// inherited from one class to another.
@@ -168,7 +167,7 @@
   ModelElement get definingEnclosingElement {
     if (_definingEnclosingClass == null) {
       _definingEnclosingClass =
-          new ModelElement.fromElement(element.enclosingElement, packageGraph);
+          ModelElement.fromElement(element.enclosingElement, packageGraph);
     }
     return _definingEnclosingClass;
   }
@@ -328,11 +327,11 @@
     InheritableAccessor accessor;
     if (element == null) return null;
     if (inheritedAccessors.contains(element)) {
-      accessor = new ModelElement.from(
+      accessor = ModelElement.from(
           element, enclosingClass.library, enclosingClass.packageGraph,
           enclosingClass: enclosingClass);
     } else {
-      accessor = new ModelElement.from(
+      accessor = ModelElement.from(
           element, enclosingClass.library, enclosingClass.packageGraph);
     }
     return accessor;
@@ -382,7 +381,7 @@
               accessor = PackageGraph.getBasestElement(accessor);
             }
             Class parentClass =
-                new ModelElement.fromElement(t.element, packageGraph);
+                ModelElement.fromElement(t.element, packageGraph);
             List<Field> possibleFields = [];
             possibleFields.addAll(parentClass.allInstanceFields);
             possibleFields.addAll(parentClass.staticProperties);
@@ -487,8 +486,7 @@
           _accessor.enclosingElement.enclosingElement);
     }
 
-    return new ModelElement.from(
-        _accessor.enclosingElement, library, packageGraph);
+    return ModelElement.from(_accessor.enclosingElement, library, packageGraph);
   }
 
   @override
@@ -562,7 +560,7 @@
       _superclassConstraints = (element as ClassElement)
           .superclassConstraints
           .map<ParameterizedElementType>(
-              (InterfaceType i) => new ElementType.from(i, packageGraph))
+              (InterfaceType i) => ElementType.from(i, packageGraph))
           .toList();
     }
     return _superclassConstraints;
@@ -608,18 +606,18 @@
     packageGraph.specialClasses.addSpecial(this);
     _mixins = _cls.mixins
         .map((f) {
-          DefinedElementType t = new ElementType.from(f, packageGraph);
+          DefinedElementType t = ElementType.from(f, packageGraph);
           return t;
         })
         .where((mixin) => mixin != null)
         .toList(growable: false);
 
     if (_cls.supertype != null && _cls.supertype.element.supertype != null) {
-      supertype = new ElementType.from(_cls.supertype, packageGraph);
+      supertype = ElementType.from(_cls.supertype, packageGraph);
     }
 
     _interfaces = _cls.interfaces
-        .map((f) => new ElementType.from(f, packageGraph) as DefinedElementType)
+        .map((f) => ElementType.from(f, packageGraph) as DefinedElementType)
         .toList(growable: false);
   }
 
@@ -678,7 +676,7 @@
 
   Map<Element, ModelElement> get allElements {
     if (_allElements == null) {
-      _allElements = new Map();
+      _allElements = Map();
       for (ModelElement me in allModelElements) {
         assert(!_allElements.containsKey(me.element));
         _allElements[me.element] = me;
@@ -715,10 +713,10 @@
   /// for Object.
   ModelElement memberByExample(ModelElement example) {
     if (_membersByName == null) {
-      _membersByName = new Map();
+      _membersByName = Map();
       for (ModelElement me in allModelElements) {
         if (!_membersByName.containsKey(me.name)) {
-          _membersByName[me.name] = new List();
+          _membersByName[me.name] = List();
         }
         _membersByName[me.name].add(me);
       }
@@ -739,7 +737,7 @@
 
   List<ModelElement> get allModelElements {
     if (_allModelElements == null) {
-      _allModelElements = new List.from(
+      _allModelElements = List.from(
           quiver.concat([
             allInstanceMethods,
             allInstanceFields,
@@ -767,7 +765,7 @@
     if (_constructors != null) return _constructors;
 
     _constructors = _cls.constructors.map((e) {
-      return new ModelElement.from(e, library, packageGraph) as Constructor;
+      return ModelElement.from(e, library, packageGraph) as Constructor;
     }).toList(growable: true)
       ..sort(byName);
 
@@ -857,8 +855,8 @@
       }).toSet();
 
       for (ExecutableElement e in inheritedMethodElements) {
-        Method m = new ModelElement.from(e, library, packageGraph,
-            enclosingClass: this);
+        Method m =
+            ModelElement.from(e, library, packageGraph, enclosingClass: this);
         _inheritedMethods.add(m);
       }
       _inheritedMethods.sort(byName);
@@ -882,8 +880,8 @@
             !operatorNames.contains(e.name));
       }).toSet();
       for (ExecutableElement e in inheritedOperatorElements) {
-        Operator o = new ModelElement.from(e, library, packageGraph,
-            enclosingClass: this);
+        Operator o =
+            ModelElement.from(e, library, packageGraph, enclosingClass: this);
         _inheritedOperators.add(o);
       }
       _inheritedOperators.sort(byName);
@@ -1042,7 +1040,7 @@
         if ((parent.type as InterfaceType)?.superclass?.superclass == null) {
           parent = null;
         } else {
-          parent = new ElementType.from(
+          parent = ElementType.from(
               (parent.type as InterfaceType).superclass, packageGraph);
         }
       } else {
@@ -1068,7 +1066,7 @@
       Map<String, ExecutableElement> imap = definingLibrary.inheritanceManager
           .getMembersInheritedFromInterfaces(// ignore: deprecated_member_use
               element);
-      __inheritedElements = new List.from(cmap.values)
+      __inheritedElements = List.from(cmap.values)
         ..addAll(imap.values.where((e) => !cmap.containsKey(e.name)));
     }
     return __inheritedElements;
@@ -1079,14 +1077,12 @@
   List<Field> get _allFields {
     if (_fields != null) return _fields;
     _fields = [];
-    Set<PropertyAccessorElement> inheritedAccessors = new Set()
-      ..addAll(_inheritedElements
-          .where((e) => e is PropertyAccessorElement)
-          .cast<PropertyAccessorElement>());
+    Set<PropertyAccessorElement> inheritedAccessors = Set()
+      ..addAll(_inheritedElements.whereType<PropertyAccessorElement>());
 
     // This structure keeps track of inherited accessors, allowing lookup
     // by field name (stripping the '=' from setters).
-    Map<String, List<PropertyAccessorElement>> accessorMap = new Map();
+    Map<String, List<PropertyAccessorElement>> accessorMap = Map();
     for (PropertyAccessorElement accessorElement in inheritedAccessors) {
       String name = accessorElement.name.replaceFirst('=', '');
       accessorMap.putIfAbsent(name, () => []);
@@ -1137,9 +1133,9 @@
       Set<PropertyAccessorElement> inheritedAccessors,
       [FieldElement f]) {
     InheritableAccessor getter =
-        new InheritableAccessor.from(getterElement, inheritedAccessors, this);
+        InheritableAccessor.from(getterElement, inheritedAccessors, this);
     InheritableAccessor setter =
-        new InheritableAccessor.from(setterElement, inheritedAccessors, this);
+        InheritableAccessor.from(setterElement, inheritedAccessors, this);
     // Rebind getterElement/setterElement as ModelElement.from can resolve
     // MultiplyInheritedExecutableElements or resolve Members.
     getterElement = getter?.element;
@@ -1170,14 +1166,14 @@
     if ((getter == null || getter.isInherited) &&
         (setter == null || setter.isInherited)) {
       // Field is 100% inherited.
-      field = new ModelElement.from(f, library, packageGraph,
+      field = ModelElement.from(f, library, packageGraph,
           enclosingClass: this, getter: getter, setter: setter);
     } else {
       // Field is <100% inherited (could be half-inherited).
       // TODO(jcollins-g): Navigation is probably still confusing for
       // half-inherited fields when traversing the inheritance tree.  Make
       // this better, somehow.
-      field = new ModelElement.from(f, library, packageGraph,
+      field = ModelElement.from(f, library, packageGraph,
           getter: getter, setter: setter);
     }
     _fields.add(field);
@@ -1189,7 +1185,7 @@
     if (_allMethods != null) return _allMethods;
 
     _allMethods = _cls.methods.map((e) {
-      return new ModelElement.from(e, library, packageGraph) as Method;
+      return ModelElement.from(e, library, packageGraph) as Method;
     }).toList(growable: false)
       ..sort(byName);
 
@@ -1203,8 +1199,8 @@
   List<TypeParameter> get typeParameters {
     if (_typeParameters == null) {
       _typeParameters = _cls.typeParameters.map((f) {
-        var lib = new Library(f.enclosingElement.library, packageGraph);
-        return new ModelElement.from(f, lib, packageGraph) as TypeParameter;
+        var lib = Library(f.enclosingElement.library, packageGraph);
+        return ModelElement.from(f, lib, packageGraph) as TypeParameter;
       }).toList();
     }
     return _typeParameters;
@@ -1231,8 +1227,8 @@
       (enclosingElement as Class).typeParameters;
 
   @override
-  ModelElement get enclosingElement => new ModelElement.from(
-      _constructor.enclosingElement, library, packageGraph);
+  ModelElement get enclosingElement =>
+      ModelElement.from(_constructor.enclosingElement, library, packageGraph);
 
   String get fullKind {
     if (isConst) return 'const $kind';
@@ -1341,8 +1337,8 @@
   /// out that information from the given comments and returning the stripped
   /// version.
   String _stripAndSetDartdocCategories(String rawDocs) {
-    Set<String> _categorySet = new Set();
-    Set<String> _subCategorySet = new Set();
+    Set<String> _categorySet = Set();
+    Set<String> _subCategorySet = Set();
     _hasCategorization = false;
 
     rawDocs = rawDocs.replaceAllMapped(categoryRegexp, (match) {
@@ -1537,7 +1533,7 @@
   }
 
   ScoredCandidate scoreElementWithLibrary(Library lib) {
-    ScoredCandidate scoredCandidate = new ScoredCandidate(this, lib);
+    ScoredCandidate scoredCandidate = ScoredCandidate(this, lib);
     Iterable<String> resplit(Set<String> items) sync* {
       for (String item in items) {
         for (String subItem in item.split('_')) {
@@ -1593,7 +1589,7 @@
   ModelElement get canonicalModelElement => null;
 
   @override
-  ModelElement get enclosingElement => throw new UnsupportedError('');
+  ModelElement get enclosingElement => throw UnsupportedError('');
 
   /// And similiarly, even if someone references it directly it can have
   /// no hyperlink.
@@ -1625,7 +1621,7 @@
     if (_instanceProperties == null) {
       _instanceProperties = super
           .instanceProperties
-          .map((Field p) => new ModelElement.from(
+          .map((Field p) => ModelElement.from(
               p.element, p.library, p.packageGraph,
               getter: p.getter, setter: p.setter) as EnumField)
           .toList(growable: false);
@@ -1737,7 +1733,7 @@
       PackageGraph packageGraph,
       Accessor getter,
       Accessor setter) {
-    Field newField = new Field(element, library, packageGraph, getter, setter);
+    Field newField = Field(element, library, packageGraph, getter, setter);
     newField._isInherited = true;
     newField._enclosingClass = enclosingClass;
     // Can't set _isInherited to true if this is the defining element, because
@@ -1751,7 +1747,7 @@
     // Verify that hasSetter and hasGetterNoSetter are mutually exclusive,
     // to prevent displaying more or less than one summary.
     if (isPublic) {
-      Set<bool> assertCheck = new Set()
+      Set<bool> assertCheck = Set()
         ..addAll([hasPublicSetter, hasPublicGetterNoSetter]);
       assert(assertCheck.containsAll([true, false]));
     }
@@ -1763,7 +1759,7 @@
   ModelElement get enclosingElement {
     if (_enclosingClass == null) {
       _enclosingClass =
-          new ModelElement.from(_field.enclosingElement, library, packageGraph);
+          ModelElement.from(_field.enclosingElement, library, packageGraph);
     }
     return _enclosingClass;
   }
@@ -1804,7 +1800,7 @@
 
   @override
   List<String> get annotations {
-    List<String> all_annotations = new List<String>();
+    List<String> all_annotations = List<String>();
     all_annotations.addAll(super.annotations);
 
     if (element is PropertyInducingElement) {
@@ -1862,7 +1858,7 @@
       String fieldSourceCode = modelNode.sourceCode ?? '';
       String getterSourceCode = getter?.sourceCode ?? '';
       String setterSourceCode = setter?.sourceCode ?? '';
-      StringBuffer buffer = new StringBuffer();
+      StringBuffer buffer = StringBuffer();
       if (fieldSourceCode.isNotEmpty) {
         buffer.write(fieldSourceCode);
       }
@@ -1902,7 +1898,7 @@
   }
 
   Set<String> get comboFeatures {
-    Set<String> allFeatures = new Set();
+    Set<String> allFeatures = Set();
     if (hasExplicitGetter && hasPublicGetter) {
       allFeatures.addAll(getter.features);
     }
@@ -1933,8 +1929,7 @@
         .toString();
     Element staticElement =
         (constantInitializer as InstanceCreationExpression).staticElement;
-    Constructor target =
-        new ModelElement.fromElement(staticElement, packageGraph);
+    Constructor target = ModelElement.fromElement(staticElement, packageGraph);
     Class targetClass = target.enclosingElement;
     // TODO(jcollins-g): this logic really should be integrated into Constructor,
     // but that's not trivial because of linkedName's usage.
@@ -2001,7 +1996,7 @@
       if (!hasAccessorsWithDocs) {
         _oneLineDoc = computeOneLineDoc();
       } else {
-        StringBuffer buffer = new StringBuffer();
+        StringBuffer buffer = StringBuffer();
         if (hasPublicGetter && getter.oneLineDoc.isNotEmpty) {
           buffer.write('${getter.oneLineDoc}');
         }
@@ -2015,7 +2010,7 @@
   }
 
   String get getterSetterDocumentationComment {
-    var buffer = new StringBuffer();
+    var buffer = StringBuffer();
 
     if (hasPublicGetter && !getter.isSynthetic) {
       assert(getter.documentationFrom.length == 1);
@@ -2143,18 +2138,18 @@
   Library._(ResolvedLibraryResult libraryResult, PackageGraph packageGraph,
       this._package)
       : super(libraryResult.element, null, packageGraph, null) {
-    if (element == null) throw new ArgumentError.notNull('element');
+    if (element == null) throw ArgumentError.notNull('element');
 
     // Initialize [packageGraph]'s cache of ModelNodes for relevant
     // elements in this library.
-    Map<String, CompilationUnit> _compilationUnitMap = new Map();
+    Map<String, CompilationUnit> _compilationUnitMap = Map();
     _compilationUnitMap.addEntries(libraryResult.units
-        .map((ResolvedUnitResult u) => new MapEntry(u.path, u.unit)));
+        .map((ResolvedUnitResult u) => MapEntry(u.path, u.unit)));
     _HashableChildLibraryElementVisitor((Element e) =>
             packageGraph._populateModelNodeFor(e, _compilationUnitMap))
         .visitElement(element);
     _exportedNamespace =
-        new NamespaceBuilder().createExportNamespaceForLibrary(element);
+        NamespaceBuilder().createExportNamespaceForLibrary(element);
     _package._allLibraries.add(this);
   }
 
@@ -2183,15 +2178,13 @@
         Accessor setter;
         if (e is GetterSetterCombo) {
           if (e.hasGetter) {
-            getter =
-                new ModelElement.fromElement(e.getter.element, packageGraph);
+            getter = ModelElement.fromElement(e.getter.element, packageGraph);
           }
           if (e.hasSetter) {
-            setter =
-                new ModelElement.fromElement(e.setter.element, packageGraph);
+            setter = ModelElement.fromElement(e.setter.element, packageGraph);
           }
         }
-        return new ModelElement.from(
+        return ModelElement.from(
                 e.element,
                 packageGraph.findButDoNotCreateLibraryFor(e.element),
                 packageGraph,
@@ -2253,7 +2246,7 @@
   // more than one package.
   Set<Library> get packageImportedExportedLibraries {
     if (_packageImportedExportedLibraries == null) {
-      _packageImportedExportedLibraries = new Set();
+      _packageImportedExportedLibraries = Set();
       packageGraph.publicLibraries
           .where((l) => l.packageName == packageName)
           .forEach((l) {
@@ -2269,14 +2262,14 @@
   /// recursively.
   Set<Library> get importedExportedLibraries {
     if (_importedExportedLibraries == null) {
-      _importedExportedLibraries = new Set();
-      Set<LibraryElement> importedExportedLibraryElements = new Set();
+      _importedExportedLibraries = Set();
+      Set<LibraryElement> importedExportedLibraryElements = Set();
       importedExportedLibraryElements
           .addAll((element as LibraryElement).importedLibraries);
       importedExportedLibraryElements
           .addAll((element as LibraryElement).exportedLibraries);
       for (LibraryElement l in importedExportedLibraryElements) {
-        Library lib = new ModelElement.from(l, library, packageGraph);
+        Library lib = ModelElement.from(l, library, packageGraph);
         _importedExportedLibraries.add(lib);
         _importedExportedLibraries.addAll(lib.importedExportedLibraries);
       }
@@ -2294,9 +2287,9 @@
       for (ImportElement i in (element as LibraryElement).imports) {
         // Ignore invalid imports.
         if (i.prefix?.name != null && i.importedLibrary != null) {
-          _prefixToLibrary.putIfAbsent(i.prefix?.name, () => new Set());
-          _prefixToLibrary[i.prefix?.name].add(
-              new ModelElement.from(i.importedLibrary, library, packageGraph));
+          _prefixToLibrary.putIfAbsent(i.prefix?.name, () => Set());
+          _prefixToLibrary[i.prefix?.name]
+              .add(ModelElement.from(i.importedLibrary, library, packageGraph));
         }
       }
     }
@@ -2334,9 +2327,9 @@
   @override
   String _buildDocumentationAddition(String rawDocs) {
     rawDocs = super._buildDocumentationAddition(rawDocs);
-    Set<String> newCanonicalFor = new Set();
-    Set<String> notFoundInAllModelElements = new Set();
-    final canonicalRegExp = new RegExp(r'{@canonicalFor\s([^}]+)}');
+    Set<String> newCanonicalFor = Set();
+    Set<String> notFoundInAllModelElements = Set();
+    final canonicalRegExp = RegExp(r'{@canonicalFor\s([^}]+)}');
     rawDocs = rawDocs.replaceAllMapped(canonicalRegExp, (Match match) {
       newCanonicalFor.add(match.group(1));
       notFoundInAllModelElements.add(match.group(1));
@@ -2365,11 +2358,10 @@
     if (_enums != null) return _enums;
     List<ClassElement> enumClasses = [];
     enumClasses.addAll(_exportedNamespace.definedNames.values
-        .where((e) => e is ClassElement)
-        .cast<ClassElement>()
+        .whereType<ClassElement>()
         .where((element) => element.isEnum));
     _enums = enumClasses
-        .map((e) => new ModelElement.from(e, this, packageGraph) as Enum)
+        .map((e) => ModelElement.from(e, this, packageGraph) as Enum)
         .toList(growable: false)
           ..sort(byName);
 
@@ -2387,7 +2379,7 @@
         .whereType<ClassElement>()
         .where((ClassElement c) => c.isMixin));
     _mixins = mixinClasses
-        .map((e) => new ModelElement.from(e, this, packageGraph) as Mixin)
+        .map((e) => ModelElement.from(e, this, packageGraph) as Mixin)
         .toList(growable: false)
           ..sort(byName);
     return _mixins;
@@ -2408,17 +2400,16 @@
   List<ModelFunction> get functions {
     if (_functions != null) return _functions;
 
-    Set<FunctionElement> elements = new Set();
+    Set<FunctionElement> elements = Set();
     elements.addAll(_libraryElement.definingCompilationUnit.functions);
     for (CompilationUnitElement cu in _libraryElement.parts) {
       elements.addAll(cu.functions);
     }
-    elements.addAll(_exportedNamespace.definedNames.values
-        .where((e) => e is FunctionElement)
-        .cast<FunctionElement>());
+    elements.addAll(
+        _exportedNamespace.definedNames.values.whereType<FunctionElement>());
 
     _functions = elements.map((e) {
-      return new ModelElement.from(e, this, packageGraph) as ModelFunction;
+      return ModelElement.from(e, this, packageGraph) as ModelFunction;
     }).toList(growable: false)
       ..sort(byName);
 
@@ -2440,7 +2431,7 @@
   InheritanceManager get inheritanceManager {
     if (_inheritanceManager == null) {
       // ignore: deprecated_member_use
-      _inheritanceManager = new InheritanceManager(element);
+      _inheritanceManager = InheritanceManager(element);
     }
     return _inheritanceManager;
   }
@@ -2486,7 +2477,7 @@
 
   PackageMeta get packageMeta {
     if (_packageMeta == null) {
-      _packageMeta = new PackageMeta.fromElement(element, config);
+      _packageMeta = PackageMeta.fromElement(element, config);
     }
     return _packageMeta;
   }
@@ -2505,7 +2496,7 @@
   List<Typedef> get typedefs {
     if (_typedefs != null) return _typedefs;
 
-    Set<FunctionTypeAliasElement> elements = new Set();
+    Set<FunctionTypeAliasElement> elements = Set();
     elements
         .addAll(_libraryElement.definingCompilationUnit.functionTypeAliases);
     for (CompilationUnitElement cu in _libraryElement.parts) {
@@ -2513,10 +2504,9 @@
     }
 
     elements.addAll(_exportedNamespace.definedNames.values
-        .where((e) => e is FunctionTypeAliasElement)
-        .cast<FunctionTypeAliasElement>());
+        .whereType<FunctionTypeAliasElement>());
     _typedefs = elements
-        .map((e) => new ModelElement.from(e, this, packageGraph) as Typedef)
+        .map((e) => ModelElement.from(e, this, packageGraph) as Typedef)
         .toList(growable: false)
           ..sort(byName);
 
@@ -2526,7 +2516,7 @@
   List<Class> get _allClasses {
     if (_classes != null) return _classes;
 
-    Set<ClassElement> types = new Set();
+    Set<ClassElement> types = Set();
     types.addAll(_libraryElement.definingCompilationUnit.types);
     for (CompilationUnitElement cu in _libraryElement.parts) {
       types.addAll(cu.types);
@@ -2543,7 +2533,7 @@
         .where((element) => !element.isEnum));
 
     _classes = types
-        .map((e) => new ModelElement.from(e, this, packageGraph) as Class)
+        .map((e) => ModelElement.from(e, this, packageGraph) as Class)
         .toList(growable: false)
           ..sort(byName);
 
@@ -2560,7 +2550,7 @@
   List<TopLevelVariable> _getVariables() {
     if (_variables != null) return _variables;
 
-    Set<TopLevelVariableElement> elements = new Set();
+    Set<TopLevelVariableElement> elements = Set();
     elements.addAll(_libraryElement.definingCompilationUnit.topLevelVariables);
     for (CompilationUnitElement cu in _libraryElement.parts) {
       elements.addAll(cu.topLevelVariables);
@@ -2574,13 +2564,13 @@
     for (TopLevelVariableElement element in elements) {
       Accessor getter;
       if (element.getter != null) {
-        getter = new ModelElement.from(element.getter, this, packageGraph);
+        getter = ModelElement.from(element.getter, this, packageGraph);
       }
       Accessor setter;
       if (element.setter != null) {
-        setter = new ModelElement.from(element.setter, this, packageGraph);
+        setter = ModelElement.from(element.setter, this, packageGraph);
       }
-      ModelElement me = new ModelElement.from(element, this, packageGraph,
+      ModelElement me = ModelElement.from(element, this, packageGraph,
           getter: getter, setter: setter);
       _variables.add(me);
     }
@@ -2651,10 +2641,10 @@
   /// in this library.  Used for code reference lookups.
   Map<String, Set<ModelElement>> get modelElementsNameMap {
     if (_modelElementsNameMap == null) {
-      _modelElementsNameMap = new Map<String, Set<ModelElement>>();
+      _modelElementsNameMap = Map<String, Set<ModelElement>>();
       allModelElements.forEach((ModelElement modelElement) {
         _modelElementsNameMap.putIfAbsent(
-            modelElement.fullyQualifiedNameWithoutLibrary, () => new Set());
+            modelElement.fullyQualifiedNameWithoutLibrary, () => Set());
         _modelElementsNameMap[modelElement.fullyQualifiedNameWithoutLibrary]
             .add(modelElement);
       });
@@ -2690,12 +2680,12 @@
           ]);
         }),
       ]);
-      _modelElementsMap = new Map<Element, Set<ModelElement>>();
+      _modelElementsMap = Map<Element, Set<ModelElement>>();
       results.forEach((modelElement) {
-        _modelElementsMap.putIfAbsent(modelElement.element, () => new Set());
+        _modelElementsMap.putIfAbsent(modelElement.element, () => Set());
         _modelElementsMap[modelElement.element].add(modelElement);
       });
-      _modelElementsMap.putIfAbsent(element, () => new Set());
+      _modelElementsMap.putIfAbsent(element, () => Set());
       _modelElementsMap[element].add(this);
     }
     return _modelElementsMap;
@@ -2744,15 +2734,15 @@
 
   void _calcTypeParameters() {
     typeParameters = _method.typeParameters.map((f) {
-      return new ModelElement.from(f, library, packageGraph) as TypeParameter;
+      return ModelElement.from(f, library, packageGraph) as TypeParameter;
     }).toList();
   }
 
   @override
   ModelElement get enclosingElement {
     if (_enclosingClass == null) {
-      _enclosingClass = new ModelElement.from(
-          _method.enclosingElement, library, packageGraph);
+      _enclosingClass =
+          ModelElement.from(_method.enclosingElement, library, packageGraph);
     }
     return _enclosingClass;
   }
@@ -2803,7 +2793,7 @@
       Element e = t.getMethod(element.name);
       if (e != null) {
         assert(e.enclosingElement is ClassElement);
-        return new ModelElement.fromElement(e, packageGraph);
+        return ModelElement.fromElement(e, packageGraph);
       }
     }
     return null;
@@ -2858,8 +2848,8 @@
     Library library,
     PackageGraph packageGraph,
     Class enclosingClass) {
-  Iterable<Inheritable> inheritables = e.inheritedElements.map(
-      (ee) => new ModelElement.fromElement(ee, packageGraph) as Inheritable);
+  Iterable<Inheritable> inheritables = e.inheritedElements
+      .map((ee) => ModelElement.fromElement(ee, packageGraph) as Inheritable);
   Inheritable foundInheritable;
   int lowIndex = enclosingClass.inheritanceChain.length;
   for (var inheritable in inheritables) {
@@ -2870,7 +2860,7 @@
       lowIndex = index;
     }
   }
-  return new ModelElement.from(foundInheritable.element, library, packageGraph,
+  return ModelElement.from(foundInheritable.element, library, packageGraph,
       enclosingClass: enclosingClass);
 }
 
@@ -2933,12 +2923,10 @@
     Accessor getter;
     Accessor setter;
     if (e is PropertyInducingElement) {
-      getter =
-          e.getter != null ? new ModelElement.from(e.getter, lib, p) : null;
-      setter =
-          e.setter != null ? new ModelElement.from(e.setter, lib, p) : null;
+      getter = e.getter != null ? ModelElement.from(e.getter, lib, p) : null;
+      setter = e.setter != null ? ModelElement.from(e.setter, lib, p) : null;
     }
-    return new ModelElement.from(e, lib, p, getter: getter, setter: setter);
+    return ModelElement.from(e, lib, p, getter: getter, setter: setter);
   }
 
   // TODO(jcollins-g): this way of using the optional parameter is messy,
@@ -2974,8 +2962,7 @@
       originalMember = e;
       e = basest;
     }
-    Tuple3<Element, Library, Class> key =
-        new Tuple3(e, library, enclosingClass);
+    Tuple3<Element, Library, Class> key = Tuple3(e, library, enclosingClass);
     ModelElement newModelElement;
     if (e.kind != ElementKind.DYNAMIC &&
         packageGraph._allConstructedModelElements.containsKey(key)) {
@@ -2983,86 +2970,83 @@
       assert(newModelElement.element is! MultiplyInheritedExecutableElement);
     } else {
       if (e.kind == ElementKind.DYNAMIC) {
-        newModelElement = new Dynamic(e, packageGraph);
+        newModelElement = Dynamic(e, packageGraph);
       }
       if (e is MultiplyInheritedExecutableElement) {
         newModelElement = resolveMultiplyInheritedElement(
             e, library, packageGraph, enclosingClass);
       } else {
         if (e is LibraryElement) {
-          newModelElement = new Library(e, packageGraph);
+          newModelElement = Library(e, packageGraph);
         }
         // Also handles enums
         if (e is ClassElement) {
           if (e.isMixin) {
-            newModelElement = new Mixin(e, library, packageGraph);
+            newModelElement = Mixin(e, library, packageGraph);
           } else if (e.isEnum) {
-            newModelElement = new Enum(e, library, packageGraph);
+            newModelElement = Enum(e, library, packageGraph);
           } else {
-            newModelElement = new Class(e, library, packageGraph);
+            newModelElement = Class(e, library, packageGraph);
           }
         }
         if (e is FunctionElement) {
-          newModelElement = new ModelFunction(e, library, packageGraph);
+          newModelElement = ModelFunction(e, library, packageGraph);
         } else if (e is GenericFunctionTypeElement) {
           if (e is FunctionTypeAliasElement) {
             assert(e.name != '');
-            newModelElement =
-                new ModelFunctionTypedef(e, library, packageGraph);
+            newModelElement = ModelFunctionTypedef(e, library, packageGraph);
           } else {
             if (e.enclosingElement is GenericTypeAliasElement) {
               assert(e.enclosingElement.name != '');
-              newModelElement =
-                  new ModelFunctionTypedef(e, library, packageGraph);
+              newModelElement = ModelFunctionTypedef(e, library, packageGraph);
             } else {
               // Allowing null here is allowed as a workaround for
               // dart-lang/sdk#32005.
               assert(e.name == '' || e.name == null);
-              newModelElement = new ModelFunctionAnonymous(e, packageGraph);
+              newModelElement = ModelFunctionAnonymous(e, packageGraph);
             }
           }
         }
         if (e is FunctionTypeAliasElement) {
-          newModelElement = new Typedef(e, library, packageGraph);
+          newModelElement = Typedef(e, library, packageGraph);
         }
         if (e is FieldElement) {
           if (enclosingClass == null) {
             if (e.isEnumConstant) {
               int index =
                   e.computeConstantValue().getField(e.name).toIntValue();
-              newModelElement = new EnumField.forConstant(
+              newModelElement = EnumField.forConstant(
                   index, e, library, packageGraph, getter);
               // ignore: unnecessary_cast
             } else if ((e.enclosingElement as ClassElement).isEnum) {
               newModelElement =
-                  new EnumField(e, library, packageGraph, getter, setter);
+                  EnumField(e, library, packageGraph, getter, setter);
             } else {
-              newModelElement =
-                  new Field(e, library, packageGraph, getter, setter);
+              newModelElement = Field(e, library, packageGraph, getter, setter);
             }
           } else {
             // EnumFields can't be inherited, so this case is simpler.
-            newModelElement = new Field.inherited(
+            newModelElement = Field.inherited(
                 e, enclosingClass, library, packageGraph, getter, setter);
           }
         }
         if (e is ConstructorElement) {
-          newModelElement = new Constructor(e, library, packageGraph);
+          newModelElement = Constructor(e, library, packageGraph);
         }
         if (e is MethodElement && e.isOperator) {
           if (enclosingClass == null) {
-            newModelElement = new Operator(e, library, packageGraph);
+            newModelElement = Operator(e, library, packageGraph);
           } else {
-            newModelElement = new Operator.inherited(
+            newModelElement = Operator.inherited(
                 e, enclosingClass, library, packageGraph,
                 originalMember: originalMember);
           }
         }
         if (e is MethodElement && !e.isOperator) {
           if (enclosingClass == null) {
-            newModelElement = new Method(e, library, packageGraph);
+            newModelElement = Method(e, library, packageGraph);
           } else {
-            newModelElement = new Method.inherited(
+            newModelElement = Method.inherited(
                 e, enclosingClass, library, packageGraph,
                 originalMember: originalMember);
           }
@@ -3070,29 +3054,28 @@
         if (e is TopLevelVariableElement) {
           assert(getter != null || setter != null);
           newModelElement =
-              new TopLevelVariable(e, library, packageGraph, getter, setter);
+              TopLevelVariable(e, library, packageGraph, getter, setter);
         }
         if (e is PropertyAccessorElement) {
           // TODO(jcollins-g): why test for ClassElement in enclosingElement?
           if (e.enclosingElement is ClassElement ||
               e is MultiplyInheritedExecutableElement) {
             if (enclosingClass == null) {
-              newModelElement =
-                  new InheritableAccessor(e, library, packageGraph);
+              newModelElement = InheritableAccessor(e, library, packageGraph);
             } else {
-              newModelElement = new InheritableAccessor.inherited(
+              newModelElement = InheritableAccessor.inherited(
                   e, library, packageGraph, enclosingClass,
                   originalMember: originalMember);
             }
           } else {
-            newModelElement = new Accessor(e, library, packageGraph, null);
+            newModelElement = Accessor(e, library, packageGraph, null);
           }
         }
         if (e is TypeParameterElement) {
-          newModelElement = new TypeParameter(e, library, packageGraph);
+          newModelElement = TypeParameter(e, library, packageGraph);
         }
         if (e is ParameterElement) {
-          newModelElement = new Parameter(e, library, packageGraph,
+          newModelElement = Parameter(e, library, packageGraph,
               originalMember: originalMember);
         }
       }
@@ -3105,9 +3088,9 @@
     if (library != null && newModelElement is! Parameter) {
       library.packageGraph._allConstructedModelElements[key] = newModelElement;
       if (newModelElement is Inheritable) {
-        Tuple2<Element, Library> iKey = new Tuple2(e, library);
+        Tuple2<Element, Library> iKey = Tuple2(e, library);
         library.packageGraph._allInheritableElements
-            .putIfAbsent(iKey, () => new Set());
+            .putIfAbsent(iKey, () => Set());
         library.packageGraph._allInheritableElements[iKey].add(newModelElement);
       }
     }
@@ -3162,7 +3145,7 @@
           annotationElement != null &&
           annotationClassElement != null) {
         annotationClass =
-            new ModelElement.fromElement(annotationClassElement, packageGraph)
+            ModelElement.fromElement(annotationClassElement, packageGraph)
                 as Class;
       }
       // Some annotations are intended to be invisible (@pragma)
@@ -3226,22 +3209,22 @@
   @override
   DartdocOptionContext get config {
     if (_config == null) {
-      _config = new DartdocOptionContext.fromContextElement(
-          packageGraph.config, element);
+      _config =
+          DartdocOptionContext.fromContextElement(packageGraph.config, element);
     }
     return _config;
   }
 
   @override
   Set<String> get locationPieces {
-    return new Set.from(element.location
+    return Set.from(element.location
         .toString()
         .split(locationSplitter)
         .where((s) => s.isNotEmpty));
   }
 
   Set<String> _baseFeatures() {
-    Set<String> allFeatures = new Set<String>();
+    Set<String> allFeatures = Set<String>();
     allFeatures.addAll(annotations);
 
     // Replace the @override annotation with a feature that explicitly
@@ -3298,7 +3281,7 @@
   String _sourceHref;
 
   String get sourceHref {
-    _sourceHref ??= new SourceLinker.fromElement(this).href();
+    _sourceHref ??= SourceLinker.fromElement(this).href();
     return _sourceHref;
   }
 
@@ -3321,7 +3304,7 @@
       Inheritable thisInheritable = (this as Inheritable);
       Class definingEnclosingClass =
           thisInheritable.definingEnclosingElement as Class;
-      ModelElement fromThis = new ModelElement.fromElement(
+      ModelElement fromThis = ModelElement.fromElement(
           element, definingEnclosingClass.packageGraph);
       docFrom = fromThis.documentationFrom;
     } else {
@@ -3459,7 +3442,7 @@
 
           // Start with our top-level element.
           ModelElement warnable =
-              new ModelElement.fromElement(topLevelElement, packageGraph);
+              ModelElement.fromElement(topLevelElement, packageGraph);
           if (candidateLibraries.length > 1) {
             // Heuristic scoring to determine which library a human likely
             // considers this element to be primarily 'from', and therefore,
@@ -3687,11 +3670,11 @@
           (_originalMember is ExecutableMember ||
               _originalMember is ParameterMember)) {
         if (_originalMember is ExecutableMember) {
-          _modelType = new ElementType.from(
+          _modelType = ElementType.from(
               (_originalMember as ExecutableMember).type, packageGraph);
         } else {
           // ParameterMember
-          _modelType = new ElementType.from(
+          _modelType = ElementType.from(
               (_originalMember as ParameterMember).type, packageGraph);
         }
       } else if (element is ExecutableElement ||
@@ -3699,8 +3682,7 @@
           element is ParameterElement ||
           element is TypeDefiningElement ||
           element is PropertyInducingElement) {
-        _modelType =
-            new ElementType.from((element as dynamic).type, packageGraph);
+        _modelType = ElementType.from((element as dynamic).type, packageGraph);
       }
     }
     return _modelType;
@@ -3742,8 +3724,8 @@
   // elsewhere as appropriate?
   List<Parameter> get allParameters {
     if (_allParameters == null) {
-      final Set<Parameter> recursedParameters = new Set();
-      final Set<Parameter> newParameters = new Set();
+      final Set<Parameter> recursedParameters = Set();
+      final Set<Parameter> newParameters = Set();
       if (this is GetterSetterCombo &&
           (this as GetterSetterCombo).setter != null) {
         newParameters.addAll((this as GetterSetterCombo).setter.parameters);
@@ -3765,7 +3747,7 @@
 
   List<Parameter> get parameters {
     if (!canHaveParameters) {
-      throw new StateError("$element cannot have parameters");
+      throw StateError("$element cannot have parameters");
     }
 
     if (_parameters == null) {
@@ -3787,9 +3769,8 @@
         }
       }
 
-      _parameters = new UnmodifiableListView<Parameter>(params
-          .map((p) =>
-              new ModelElement.from(p, library, packageGraph) as Parameter)
+      _parameters = UnmodifiableListView<Parameter>(params
+          .map((p) => ModelElement.from(p, library, packageGraph) as Parameter)
           .toList());
     }
     return _parameters;
@@ -3828,7 +3809,7 @@
 
   Documentation get _documentation {
     if (__documentation != null) return __documentation;
-    __documentation = new Documentation.forElement(this);
+    __documentation = Documentation.forElement(this);
     return __documentation;
   }
 
@@ -3846,7 +3827,7 @@
 
   String renderParam(
       Parameter param, String suffix, bool showMetadata, bool showNames) {
-    StringBuffer buf = new StringBuffer();
+    StringBuffer buf = StringBuffer();
     ElementType paramModelType = param.modelType;
 
     buf.write('<span class="parameter" id="${param.htmlId}">');
@@ -3915,7 +3896,7 @@
     List<Parameter> namedParams =
         parameters.where((Parameter p) => p.isOptionalNamed).toList();
 
-    StringBuffer builder = new StringBuffer();
+    StringBuffer builder = StringBuffer();
 
     // prefix
     if (requiredParams.isEmpty && positionalParams.isNotEmpty) {
@@ -4013,7 +3994,7 @@
   ///
   String _injectExamples(String rawdocs) {
     final dirPath = package.packageMeta.dir.path;
-    RegExp exampleRE = new RegExp(r'{@example\s+([^}]+)}');
+    RegExp exampleRE = RegExp(r'{@example\s+([^}]+)}');
     return rawdocs.replaceAllMapped(exampleRE, (match) {
       var args = _getExampleArgs(match[1]);
       if (args == null) {
@@ -4025,7 +4006,7 @@
 
       var replacement = match[0]; // default to fully matched string.
 
-      var fragmentFile = new File(path.join(dirPath, args['file']));
+      var fragmentFile = File(path.join(dirPath, args['file']));
       if (fragmentFile.existsSync()) {
         replacement = fragmentFile.readAsStringSync();
         if (lang.isNotEmpty) {
@@ -4045,7 +4026,7 @@
 
   static Future<String> _replaceAllMappedAsync(
       String string, Pattern exp, Future<String> replace(Match match)) async {
-    StringBuffer replaced = new StringBuffer();
+    StringBuffer replaced = StringBuffer();
     int currentIndex = 0;
     for (Match match in exp.allMatches(string)) {
       String prefix = match.input.substring(currentIndex, match.start);
@@ -4176,14 +4157,14 @@
     // Matches all youtube directives (even some invalid ones). This is so
     // we can give good error messages if the directive is malformed, instead of
     // just silently emitting it as-is.
-    final RegExp basicAnimationRegExp = new RegExp(r'''{@youtube\s+([^}]+)}''');
+    final RegExp basicAnimationRegExp = RegExp(r'''{@youtube\s+([^}]+)}''');
 
     // Matches YouTube IDs from supported YouTube URLs.
     final RegExp validYouTubeUrlRegExp =
-        new RegExp('https://www\.youtube\.com/watch\\?v=([^&]+)\$');
+        RegExp('https://www\.youtube\.com/watch\\?v=([^&]+)\$');
 
     return rawDocs.replaceAllMapped(basicAnimationRegExp, (basicMatch) {
-      final ArgParser parser = new ArgParser();
+      final ArgParser parser = ArgParser();
       final ArgResults args = _parseArgs(basicMatch[1], parser, 'youtube');
       if (args == null) {
         // Already warned about an invalid parameter if this happens.
@@ -4276,13 +4257,12 @@
     // Matches all animation directives (even some invalid ones). This is so
     // we can give good error messages if the directive is malformed, instead of
     // just silently emitting it as-is.
-    final RegExp basicAnimationRegExp =
-        new RegExp(r'''{@animation\s+([^}]+)}''');
+    final RegExp basicAnimationRegExp = RegExp(r'''{@animation\s+([^}]+)}''');
 
     // Matches valid javascript identifiers.
-    final RegExp validIdRegExp = new RegExp(r'^[a-zA-Z_]\w*$');
+    final RegExp validIdRegExp = RegExp(r'^[a-zA-Z_]\w*$');
 
-    final Set<String> uniqueIds = new Set<String>();
+    final Set<String> uniqueIds = Set<String>();
     String getUniqueId(String base) {
       int count = 1;
       String id = '$base$count';
@@ -4294,7 +4274,7 @@
     }
 
     return rawDocs.replaceAllMapped(basicAnimationRegExp, (basicMatch) {
-      final ArgParser parser = new ArgParser();
+      final ArgParser parser = ArgParser();
       parser.addOption('id');
       final ArgResults args = _parseArgs(basicMatch[1], parser, 'animation');
       if (args == null) {
@@ -4589,7 +4569,7 @@
   /// The computed file path, constructed from 'src' and 'region' will have key
   /// 'file'.
   Map<String, String> _getExampleArgs(String argsAsString) {
-    ArgParser parser = new ArgParser();
+    ArgParser parser = ArgParser();
     parser.addOption('lang');
     parser.addOption('region');
     ArgResults results = _parseArgs(argsAsString, parser, 'example');
@@ -4657,7 +4637,7 @@
   ModelElement get enclosingElement {
     // These are not considered to be a part of libraries, so we can simply
     // blindly instantiate a ModelElement for their enclosing element.
-    return new ModelElement.fromElement(element.enclosingElement, packageGraph);
+    return ModelElement.fromElement(element.enclosingElement, packageGraph);
   }
 
   @override
@@ -4705,7 +4685,7 @@
 
   void _calcTypeParameters() {
     typeParameters = _func.typeParameters.map((f) {
-      return new ModelElement.from(f, library, packageGraph) as TypeParameter;
+      return ModelElement.from(f, library, packageGraph) as TypeParameter;
     }).toList();
   }
 
@@ -4746,7 +4726,7 @@
 
   Set<String> get namePieces {
     if (_namePieces == null) {
-      _namePieces = new Set()
+      _namePieces = Set()
         ..addAll(name.split(locationSplitter).where((s) => s.isNotEmpty));
     }
     return _namePieces;
@@ -4778,7 +4758,7 @@
 }
 
 class Operator extends Method {
-  static const Map<String, String> friendlyNames = const {
+  static const Map<String, String> friendlyNames = {
     "[]": "get",
     "[]=": "put",
     "~": "bitwise_negate",
@@ -4839,10 +4819,10 @@
       this.config, this.driver, this.sdk, this.hasEmbedderSdk)
       : packageMeta = config.topLevelPackageMeta,
         session = driver.currentSession {
-    _packageWarningCounter = new PackageWarningCounter(this);
+    _packageWarningCounter = PackageWarningCounter(this);
     // Make sure the default package exists, even if it has no libraries.
     // This can happen for packages that only contain embedder SDKs.
-    new Package.fromPackageMeta(packageMeta, this);
+    Package.fromPackageMeta(packageMeta, this);
   }
 
   /// Call during initialization to add a library to this [PackageGraph].
@@ -4853,9 +4833,9 @@
   void addLibraryToGraph(ResolvedLibraryResult result) {
     assert(!allLibrariesAdded);
     LibraryElement element = result.element;
-    var packageMeta = new PackageMeta.fromElement(element, config);
-    var lib = new Library._(
-        result, this, new Package.fromPackageMeta(packageMeta, this));
+    var packageMeta = PackageMeta.fromElement(element, config);
+    var lib =
+        Library._(result, this, Package.fromPackageMeta(packageMeta, this));
     packageMap[packageMeta.name]._libraries.add(lib);
     allLibraries[element] = lib;
   }
@@ -4875,7 +4855,7 @@
     assert(!_localDocumentationBuilt);
     // From here on in, we might find special objects.  Initialize the
     // specialClasses handler so when we find them, they get added.
-    specialClasses = new SpecialClasses();
+    specialClasses = SpecialClasses();
     // 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();
@@ -4904,7 +4884,7 @@
   /// Generate a list of futures for any docs that actually require precaching.
   Iterable<Future> precacheLocalDocs() sync* {
     // Prevent reentrancy.
-    Set<ModelElement> precachedElements = new Set();
+    Set<ModelElement> precachedElements = Set();
 
     Iterable<Future> precacheOneElement(ModelElement m) sync* {
       for (ModelElement d
@@ -4961,13 +4941,13 @@
   Map<String, Set<ModelElement>> get findRefElementCache {
     if (_findRefElementCache == null) {
       assert(packageGraph.allLibrariesAdded);
-      _findRefElementCache = new Map();
+      _findRefElementCache = Map();
       for (final modelElement
           in filterNonDocumented(packageGraph.allLocalModelElements)) {
         _findRefElementCache.putIfAbsent(
-            modelElement.fullyQualifiedNameWithoutLibrary, () => new Set());
+            modelElement.fullyQualifiedNameWithoutLibrary, () => Set());
         _findRefElementCache.putIfAbsent(
-            modelElement.fullyQualifiedName, () => new Set());
+            modelElement.fullyQualifiedName, () => Set());
         _findRefElementCache[modelElement.fullyQualifiedName].add(modelElement);
         _findRefElementCache[modelElement.fullyQualifiedNameWithoutLibrary]
             .add(modelElement);
@@ -4977,21 +4957,21 @@
   }
 
   // All library objects related to this package; a superset of _libraries.
-  final Map<LibraryElement, Library> allLibraries = new Map();
+  final Map<LibraryElement, Library> allLibraries = Map();
 
   /// Keep track of warnings
   PackageWarningCounter _packageWarningCounter;
 
   /// All ModelElements constructed for this package; a superset of [allModelElements].
   final Map<Tuple3<Element, Library, Class>, ModelElement>
-      _allConstructedModelElements = new Map();
+      _allConstructedModelElements = Map();
 
   /// Anything that might be inheritable, place here for later lookup.
   final Map<Tuple2<Element, Library>, Set<ModelElement>>
-      _allInheritableElements = new Map();
+      _allInheritableElements = Map();
 
   /// Map of Class.href to a list of classes implementing that class
-  final Map<String, List<Class>> _implementors = new Map();
+  final Map<String, List<Class>> _implementors = Map();
 
   /// PackageMeta for the default package.
   final PackageMeta packageMeta;
@@ -5006,7 +4986,7 @@
 
   Package get defaultPackage {
     if (_defaultPackage == null) {
-      _defaultPackage = new Package.fromPackageMeta(packageMeta, this);
+      _defaultPackage = Package.fromPackageMeta(packageMeta, this);
     }
     return _defaultPackage;
   }
@@ -5027,7 +5007,7 @@
 
   Map<Source, SdkLibrary> get sdkLibrarySources {
     if (_sdkLibrarySources == null) {
-      _sdkLibrarySources = new Map();
+      _sdkLibrarySources = Map();
       for (SdkLibrary lib in sdk?.sdkLibraries) {
         _sdkLibrarySources[sdk.mapDartUri(lib.shortName)] = lib;
       }
@@ -5048,7 +5028,7 @@
 
   bool packageDocumentedFor(ModelElement element) {
     if (_allRootDirs == null) {
-      _allRootDirs = new Set()
+      _allRootDirs = Set()
         ..addAll(publicLibraries.map((l) => l.packageMeta?.resolvedDir));
     }
     return (_allRootDirs.contains(element.library.packageMeta?.resolvedDir));
@@ -5056,14 +5036,13 @@
 
   PackageWarningCounter get packageWarningCounter => _packageWarningCounter;
 
-  final Set<Tuple3<Element, PackageWarning, String>> _warnAlreadySeen =
-      new Set();
+  final Set<Tuple3<Element, PackageWarning, String>> _warnAlreadySeen = Set();
 
   void warnOnElement(Warnable warnable, PackageWarning kind,
       {String message,
       Iterable<Locatable> referredFrom,
       Iterable<String> extendedDebug}) {
-    var newEntry = new Tuple3(warnable?.element, kind, message);
+    var newEntry = Tuple3(warnable?.element, kind, message);
     if (_warnAlreadySeen.contains(newEntry)) {
       return;
     }
@@ -5270,16 +5249,16 @@
   Iterable<Package> get documentedPackages =>
       packages.where((p) => p.documentedWhere != DocumentLocation.missing);
 
-  Map<LibraryElement, Set<Library>> _libraryElementReexportedBy = new Map();
+  Map<LibraryElement, Set<Library>> _libraryElementReexportedBy = Map();
 
   /// Prevent cycles from breaking our stack.
-  Set<Tuple2<Library, LibraryElement>> _reexportsTagged = new Set();
+  Set<Tuple2<Library, LibraryElement>> _reexportsTagged = Set();
 
   void _tagReexportsFor(
       final Library topLevelLibrary, final LibraryElement libraryElement,
       [ExportElement lastExportedElement]) {
     Tuple2<Library, LibraryElement> key =
-        new Tuple2(topLevelLibrary, libraryElement);
+        Tuple2(topLevelLibrary, libraryElement);
     if (_reexportsTagged.contains(key)) {
       return;
     }
@@ -5294,7 +5273,7 @@
           referredFrom: <Locatable>[topLevelLibrary]);
       return;
     }
-    _libraryElementReexportedBy.putIfAbsent(libraryElement, () => new Set());
+    _libraryElementReexportedBy.putIfAbsent(libraryElement, () => Set());
     _libraryElementReexportedBy[libraryElement].add(topLevelLibrary);
     for (ExportElement exportedElement in libraryElement.exports) {
       _tagReexportsFor(
@@ -5308,8 +5287,8 @@
     // Table must be reset if we're still in the middle of adding libraries.
     if (allLibraries.keys.length != _lastSizeOfAllLibraries) {
       _lastSizeOfAllLibraries = allLibraries.keys.length;
-      _libraryElementReexportedBy = new Map<LibraryElement, Set<Library>>();
-      _reexportsTagged = new Set();
+      _libraryElementReexportedBy = Map<LibraryElement, Set<Library>>();
+      _reexportsTagged = Set();
       for (Library library in publicLibraries) {
         _tagReexportsFor(library, library.element);
       }
@@ -5323,7 +5302,7 @@
   /// on more than just [allLocalModelElements] to make the error messages
   /// comprehensive.
   Map<String, Set<ModelElement>> get allHrefs {
-    Map<String, Set<ModelElement>> hrefMap = new Map();
+    Map<String, Set<ModelElement>> hrefMap = Map();
     // TODO(jcollins-g ): handle calculating hrefs causing new elements better
     //                    than toList().
     for (ModelElement modelElement
@@ -5336,13 +5315,13 @@
       // TODO: see [Accessor.enclosingCombo]
       if (modelElement is Accessor) continue;
       if (modelElement.href == null) continue;
-      hrefMap.putIfAbsent(modelElement.href, () => new Set());
+      hrefMap.putIfAbsent(modelElement.href, () => Set());
       hrefMap[modelElement.href].add(modelElement);
     }
     for (Package package in packageMap.values) {
       for (Library library in package.libraries) {
         if (library.href == null) continue;
-        hrefMap.putIfAbsent(library.href, () => new Set());
+        hrefMap.putIfAbsent(library.href, () => Set());
         hrefMap[library.href].add(library);
       }
     }
@@ -5419,7 +5398,7 @@
   /// and the class these inherit from should instead claim implementation.
   Set<Class> get inheritThrough {
     if (_inheritThrough == null) {
-      _inheritThrough = new Set();
+      _inheritThrough = Set();
       _inheritThrough.add(specialClasses[SpecialClass.interceptor]);
     }
     return _inheritThrough;
@@ -5431,7 +5410,7 @@
   /// in that we should never count them as documentable annotations.
   Set<Class> get invisibleAnnotations {
     if (_invisibleAnnotations == null) {
-      _invisibleAnnotations = new Set();
+      _invisibleAnnotations = Set();
       _invisibleAnnotations.add(specialClasses[SpecialClass.pragma]);
     }
     return _invisibleAnnotations;
@@ -5440,7 +5419,7 @@
   @override
   String toString() => 'PackageGraph built from ${defaultPackage.name}';
 
-  final Map<Element, Library> _canonicalLibraryFor = new Map();
+  final Map<Element, Library> _canonicalLibraryFor = Map();
 
   /// Tries to find a top level library that references this element.
   Library findCanonicalLibraryFor(Element e) {
@@ -5505,12 +5484,12 @@
     // with member elements.
     if (e is ClassMemberElement || e is PropertyAccessorElement) {
       if (e is Member) e = getBasestElement(e);
-      Set<ModelElement> candidates = new Set();
-      Tuple2<Element, Library> iKey = new Tuple2(e, lib);
+      Set<ModelElement> candidates = Set();
+      Tuple2<Element, Library> iKey = Tuple2(e, lib);
       Tuple4<Element, Library, Class, ModelElement> key =
-          new Tuple4(e, lib, null, null);
+          Tuple4(e, lib, null, null);
       Tuple4<Element, Library, Class, ModelElement> keyWithClass =
-          new Tuple4(e, lib, preferredClass, null);
+          Tuple4(e, lib, preferredClass, null);
       if (_allConstructedModelElements.containsKey(key)) {
         candidates.add(_allConstructedModelElements[key]);
       }
@@ -5528,16 +5507,14 @@
           return false;
         }));
       }
-      Set<ModelElement> matches = new Set()
+      Set<ModelElement> matches = Set()
         ..addAll(candidates.where((me) => me.isCanonical));
 
       // It's possible to find accessors but no combos.  Be sure that if we
       // have Accessors, we find their combos too.
       if (matches.any((me) => me is Accessor)) {
-        List<GetterSetterCombo> combos = matches
-            .where((me) => me is Accessor)
-            .map((a) => (a as Accessor).enclosingCombo)
-            .toList();
+        List<GetterSetterCombo> combos =
+            matches.whereType<Accessor>().map((a) => a.enclosingCombo).toList();
         matches.addAll(combos);
         assert(combos.every((c) => c.isCanonical));
       }
@@ -5555,7 +5532,7 @@
             !superChain.contains((me as EnclosedElement).enclosingElement));
         // Assumed all matches are EnclosedElement because we've been told about a
         // preferredClass.
-        Set<Class> enclosingElements = new Set()
+        Set<Class> enclosingElements = Set()
           ..addAll(matches
               .map((me) => (me as EnclosedElement).enclosingElement as Class));
         for (Class c in superChain.reversed) {
@@ -5582,13 +5559,13 @@
         Accessor setter;
         if (e is PropertyInducingElement) {
           if (e.getter != null) {
-            getter = new ModelElement.from(e.getter, lib, packageGraph);
+            getter = ModelElement.from(e.getter, lib, packageGraph);
           }
           if (e.setter != null) {
-            setter = new ModelElement.from(e.setter, lib, packageGraph);
+            setter = ModelElement.from(e.setter, lib, packageGraph);
           }
         }
-        modelElement = new ModelElement.from(e, lib, packageGraph,
+        modelElement = ModelElement.from(e, lib, packageGraph,
             getter: getter, setter: setter);
       }
       assert(modelElement is! Inheritable);
@@ -5626,11 +5603,11 @@
     if (result.element.library == null) {
       return null;
     }
-    Library foundLibrary = new Library._(
+    Library foundLibrary = Library._(
         result,
         this,
-        new Package.fromPackageMeta(
-            new PackageMeta.fromElement(result.element.library, config),
+        Package.fromPackageMeta(
+            PackageMeta.fromElement(result.element.library, config),
             packageGraph));
     allLibraries[result.element.library] = foundLibrary;
     return foundLibrary;
@@ -5643,11 +5620,11 @@
     if (_allModelElements == null) {
       _allModelElements = [];
       Set<Package> packagesToDo = packages.toSet();
-      Set<Package> completedPackages = new Set();
+      Set<Package> completedPackages = Set();
       while (packagesToDo.length > completedPackages.length) {
         packagesToDo.difference(completedPackages).forEach((Package p) {
           Set<Library> librariesToDo = p.allLibraries.toSet();
-          Set<Library> completedLibraries = new Set();
+          Set<Library> completedLibraries = Set();
           while (librariesToDo.length > completedLibraries.length) {
             librariesToDo
                 .difference(completedLibraries)
@@ -5839,7 +5816,7 @@
 
   Documentation get _documentation {
     if (__documentation != null) return __documentation;
-    __documentation = new Documentation.forElement(this);
+    __documentation = Documentation.forElement(this);
     return __documentation;
   }
 
@@ -5866,7 +5843,7 @@
   String get location => path.toUri(documentationFile.file.path).toString();
 
   @override
-  Set<String> get locationPieces => new Set.from(<String>[location]);
+  Set<String> get locationPieces => Set.from(<String>[location]);
 }
 
 /// A category is a subcategory of a package, containing libraries tagged
@@ -5886,7 +5863,7 @@
   final String _name;
   @override
   DartdocOptionContext config;
-  final Set<Categorization> _allItems = new Set();
+  final Set<Categorization> _allItems = Set();
 
   Category(this._name, this.package, this.config) {
     _enums = [];
@@ -6015,8 +5992,8 @@
   FileContents get documentationFile {
     if (_documentationFile == null) {
       if (categoryDefinition?.documentationMarkdown != null) {
-        _documentationFile = new FileContents(
-            new File(categoryDefinition.documentationMarkdown));
+        _documentationFile =
+            FileContents(File(categoryDefinition.documentationMarkdown));
       }
     }
     return _documentationFile;
@@ -6063,8 +6040,8 @@
 
     if (!packageGraph.packageMap.containsKey(packageName) &&
         packageGraph.allLibrariesAdded) expectNonLocal = true;
-    packageGraph.packageMap.putIfAbsent(packageName,
-        () => new Package._(packageName, packageGraph, packageMeta));
+    packageGraph.packageMap.putIfAbsent(
+        packageName, () => Package._(packageName, packageGraph, packageMeta));
     // Verify that we don't somehow decide to document locally a package picked
     // up after all documented libraries are added, because that breaks the
     // assumption that we've picked up all documented libraries and packages
@@ -6091,9 +6068,9 @@
   /// Pieces of the location split by [locationSplitter] (removing package: and
   /// slashes).
   @override
-  Set<String> get locationPieces => new Set();
+  Set<String> get locationPieces => Set();
 
-  final Set<Library> _allLibraries = new Set();
+  final Set<Library> _allLibraries = Set();
 
   bool get hasHomepage =>
       packageMeta.homepage != null && packageMeta.homepage.isNotEmpty;
@@ -6122,7 +6099,7 @@
   @override
   String get documentationAsHtml {
     if (_documentationAsHtml != null) return _documentationAsHtml;
-    _documentationAsHtml = new Documentation.forElement(this).asHtml;
+    _documentationAsHtml = Documentation.forElement(this).asHtml;
 
     return _documentationAsHtml;
   }
@@ -6216,7 +6193,7 @@
             // elsewhere.
             case 'b':
               {
-                Version version = new Version.parse(packageMeta.version);
+                Version version = Version.parse(packageMeta.version);
                 return version.isPreRelease
                     ? version.preRelease.first
                     : 'stable';
@@ -6267,15 +6244,13 @@
     if (_nameToCategory.isEmpty) {
       Category categoryFor(String category) {
         _nameToCategory.putIfAbsent(
-            category, () => new Category(category, this, config));
+            category, () => Category(category, this, config));
         return _nameToCategory[category];
       }
 
-      _nameToCategory[null] = new Category(null, this, config);
-      for (Categorization c in libraries.expand((l) => l
-          .allCanonicalModelElements
-          .where((e) => e is Categorization)
-          .cast<Categorization>())) {
+      _nameToCategory[null] = Category(null, this, config);
+      for (Categorization c in libraries.expand(
+          (l) => l.allCanonicalModelElements.whereType<Categorization>())) {
         for (String category in c.categoryNames) {
           categoryFor(category).addItem(c);
         }
@@ -6307,8 +6282,8 @@
   @override
   DartdocOptionContext get config {
     if (_config == null) {
-      _config = new DartdocOptionContext.fromContext(
-          packageGraph.config, new Directory(packagePath));
+      _config = DartdocOptionContext.fromContext(
+          packageGraph.config, Directory(packagePath));
     }
     return _config;
   }
@@ -6368,7 +6343,7 @@
 
   @override
   ModelElement get enclosingElement =>
-      new ModelElement.from(_parameter.enclosingElement, library, packageGraph);
+      ModelElement.from(_parameter.enclosingElement, library, packageGraph);
 
   bool get hasDefaultValue {
     return _parameter.defaultValueCode != null &&
@@ -6377,7 +6352,7 @@
 
   @override
   String get href {
-    throw new StateError('href not implemented for parameters');
+    throw StateError('href not implemented for parameters');
   }
 
   @override
@@ -6479,7 +6454,7 @@
     // Verify that hasSetter and hasGetterNoSetter are mutually exclusive,
     // to prevent displaying more or less than one summary.
     if (isPublic) {
-      Set<bool> assertCheck = new Set()
+      Set<bool> assertCheck = Set()
         ..addAll([hasPublicSetter, hasPublicGetterNoSetter]);
       assert(assertCheck.containsAll([true, false]));
     }
@@ -6583,7 +6558,7 @@
 
   @override
   List<TypeParameter> get typeParameters => _typedef.typeParameters.map((f) {
-        return new ModelElement.from(f, library, packageGraph) as TypeParameter;
+        return ModelElement.from(f, library, packageGraph) as TypeParameter;
       }).toList();
 }
 
@@ -6594,7 +6569,7 @@
 
   @override
   ModelElement get enclosingElement =>
-      new ModelElement.from(element.enclosingElement, library, packageGraph);
+      ModelElement.from(element.enclosingElement, library, packageGraph);
 
   @override
   String get href {
@@ -6615,7 +6590,7 @@
     if (_boundType == null) {
       var bound = _typeParameter.bound;
       if (bound != null) {
-        _boundType = new ElementType.from(bound, packageGraph);
+        _boundType = ElementType.from(bound, packageGraph);
       }
     }
     return _boundType;
@@ -6657,7 +6632,7 @@
       config.topLevelPackageMeta.runPubGet();
     }
 
-    PackageGraph newGraph = new PackageGraph.UninitializedPackageGraph(
+    PackageGraph newGraph = PackageGraph.UninitializedPackageGraph(
         config, driver, sdk, hasEmbedderSdkFiles);
     await getLibraries(newGraph);
     await newGraph.initializePackageGraph();
@@ -6668,7 +6643,7 @@
 
   DartSdk get sdk {
     if (_sdk == null) {
-      _sdk = new FolderBasedDartSdk(PhysicalResourceProvider.INSTANCE,
+      _sdk = FolderBasedDartSdk(PhysicalResourceProvider.INSTANCE,
           PhysicalResourceProvider.INSTANCE.getFolder(config.sdkDir));
     }
     return _sdk;
@@ -6678,15 +6653,15 @@
 
   EmbedderSdk get embedderSdk {
     if (_embedderSdk == null && !config.topLevelPackageMeta.isSdk) {
-      _embedderSdk = new EmbedderSdk(PhysicalResourceProvider.INSTANCE,
-          new EmbedderYamlLocator(packageMap).embedderYamls);
+      _embedderSdk = EmbedderSdk(PhysicalResourceProvider.INSTANCE,
+          EmbedderYamlLocator(packageMap).embedderYamls);
     }
     return _embedderSdk;
   }
 
   static Map<String, List<file_system.Folder>> _calculatePackageMap(
       file_system.Folder dir) {
-    Map<String, List<file_system.Folder>> map = new Map();
+    Map<String, List<file_system.Folder>> map = Map();
     var info = package_config.findPackagesFromFile(dir.toUri());
 
     for (String name in info.packages) {
@@ -6717,21 +6692,21 @@
 
   DartUriResolver get embedderResolver {
     if (_embedderResolver == null) {
-      _embedderResolver = new DartUriResolver(embedderSdk);
+      _embedderResolver = DartUriResolver(embedderSdk);
     }
     return _embedderResolver;
   }
 
   SourceFactory get sourceFactory {
     List<UriResolver> resolvers = [];
-    resolvers.add(new SdkExtUriResolver(packageMap));
-    final UriResolver packageResolver = new PackageMapUriResolver(
-        PhysicalResourceProvider.INSTANCE, packageMap);
+    resolvers.add(SdkExtUriResolver(packageMap));
+    final UriResolver packageResolver =
+        PackageMapUriResolver(PhysicalResourceProvider.INSTANCE, packageMap);
     UriResolver sdkResolver;
     if (embedderSdk == null || embedderSdk.urlMappings.isEmpty) {
       // The embedder uri resolver has no mappings. Use the default Dart SDK
       // uri resolver.
-      sdkResolver = new DartUriResolver(sdk);
+      sdkResolver = DartUriResolver(sdk);
     } else {
       // The embedder uri resolver has mappings, use it instead of the default
       // Dart SDK uri resolver.
@@ -6742,14 +6717,14 @@
     /// never resolve to embedded SDK files, and the resolvers list must still
     /// contain a DartUriResolver.  This hack won't be necessary once analyzer
     /// has a clean public API.
-    resolvers.add(new PackageWithoutSdkResolver(packageResolver, sdkResolver));
+    resolvers.add(PackageWithoutSdkResolver(packageResolver, sdkResolver));
     resolvers.add(sdkResolver);
     resolvers.add(
-        new file_system.ResourceUriResolver(PhysicalResourceProvider.INSTANCE));
+        file_system.ResourceUriResolver(PhysicalResourceProvider.INSTANCE));
 
     assert(
         resolvers.any((UriResolver resolver) => resolver is DartUriResolver));
-    SourceFactory sourceFactory = new SourceFactory(resolvers);
+    SourceFactory sourceFactory = SourceFactory(resolvers);
     return sourceFactory;
   }
 
@@ -6757,9 +6732,9 @@
 
   AnalysisDriver get driver {
     if (_driver == null) {
-      PerformanceLog log = new PerformanceLog(null);
-      AnalysisDriverScheduler scheduler = new AnalysisDriverScheduler(log);
-      AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+      PerformanceLog log = PerformanceLog(null);
+      AnalysisDriverScheduler scheduler = AnalysisDriverScheduler(log);
+      AnalysisOptionsImpl options = AnalysisOptionsImpl();
 
       // TODO(jcollins-g): pass in an ExperimentStatus instead?
       options.enabledExperiments = config.enableExperiment;
@@ -6767,12 +6742,12 @@
       // TODO(jcollins-g): Make use of currently not existing API for managing
       //                   many AnalysisDrivers
       // TODO(jcollins-g): make use of DartProject isApi()
-      _driver = new AnalysisDriver(
+      _driver = AnalysisDriver(
           scheduler,
           log,
           PhysicalResourceProvider.INSTANCE,
-          new MemoryByteStore(),
-          new FileContentOverlay(),
+          MemoryByteStore(),
+          FileContentOverlay(),
           null,
           sourceFactory,
           options);
@@ -6802,19 +6777,19 @@
       name = name.substring(directoryCurrentPath.length);
       if (name.startsWith(Platform.pathSeparator)) name = name.substring(1);
     }
-    JavaFile javaFile = new JavaFile(filePath).getAbsoluteFile();
-    Source source = new FileBasedSource(javaFile);
+    JavaFile javaFile = JavaFile(filePath).getAbsoluteFile();
+    Source source = FileBasedSource(javaFile);
 
     // TODO(jcollins-g): remove the manual reversal using embedderSdk when we
     // upgrade to analyzer-0.30 (where DartUriResolver implements
     // restoreAbsolute)
     Uri uri = embedderSdk?.fromFileUri(source.uri)?.uri;
     if (uri != null) {
-      source = new FileBasedSource(javaFile, uri);
+      source = FileBasedSource(javaFile, uri);
     } else {
       uri = driver.sourceFactory.restoreUri(source);
       if (uri != null) {
-        source = new FileBasedSource(javaFile, uri);
+        source = FileBasedSource(javaFile, uri);
       }
     }
     var sourceKind = await driver.getSourceKind(filePath);
@@ -6829,9 +6804,9 @@
   }
 
   Set<PackageMeta> _packageMetasForFiles(Iterable<String> files) {
-    Set<PackageMeta> metas = new Set();
+    Set<PackageMeta> metas = Set();
     for (String filename in files) {
-      metas.add(new PackageMeta.fromFilename(filename));
+      metas.add(PackageMeta.fromFilename(filename));
     }
     return metas;
   }
@@ -6848,7 +6823,7 @@
       Set<String> files,
       [bool Function(LibraryElement) isLibraryIncluded]) async {
     isLibraryIncluded ??= (_) => true;
-    Set<PackageMeta> lastPass = new Set();
+    Set<PackageMeta> lastPass = Set();
     Set<PackageMeta> current;
     do {
       lastPass = _packageMetasForFiles(files);
@@ -6894,12 +6869,12 @@
       [bool filterExcludes = true]) sync* {
     final String sep = path.separator;
 
-    Set<String> packageDirs = new Set()..add(basePackageDir);
+    Set<String> packageDirs = Set()..add(basePackageDir);
 
     if (autoIncludeDependencies) {
       Map<String, Uri> info = package_config
           .findPackagesFromFile(
-              new Uri.file(path.join(basePackageDir, 'pubspec.yaml')))
+              Uri.file(path.join(basePackageDir, 'pubspec.yaml')))
           .asMap();
       for (String packageName in info.keys) {
         if (!filterExcludes || !config.exclude.contains(packageName)) {
@@ -6923,7 +6898,7 @@
           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();
+            var contents = File(lib).readAsStringSync();
 
             if (contents.contains(newLinePartOfRegexp) ||
                 contents.startsWith(partOfRegexp)) {
@@ -6944,7 +6919,7 @@
   Iterable<String> _includeExternalsFrom(Iterable<String> files) sync* {
     for (String file in files) {
       DartdocOptionContext fileContext =
-          new DartdocOptionContext.fromContext(config, new File(file));
+          DartdocOptionContext.fromContext(config, File(file));
       if (fileContext.includeExternal != null) {
         yield* fileContext.includeExternal;
       }
@@ -6960,7 +6935,7 @@
           config.inputDir, config.autoIncludeDependencies);
     }
     files = quiver.concat([files, _includeExternalsFrom(files)]);
-    return new Set.from(files.map((s) => new File(s).absolute.path));
+    return Set.from(files.map((s) => File(s).absolute.path));
   }
 
   Iterable<String> getEmbedderSdkFiles() sync* {
@@ -6969,7 +6944,7 @@
         !config.topLevelPackageMeta.isSdk) {
       for (String dartUri in embedderSdk.urlMappings.keys) {
         Source source = embedderSdk.mapDartUri(dartUri);
-        yield (new File(source.fullName)).absolute.path;
+        yield (File(source.fullName)).absolute.path;
       }
     }
   }
@@ -6995,14 +6970,14 @@
       return true;
     }
 
-    Set<LibraryElement> foundLibraries = new Set();
+    Set<LibraryElement> foundLibraries = Set();
     await _parseLibraries(uninitializedPackageGraph.addLibraryToGraph,
         foundLibraries, files, isLibraryIncluded);
     if (config.include.isNotEmpty) {
       Iterable knownLibraryNames = foundLibraries.map((l) => l.name);
-      Set notFound = new Set.from(config.include)
-          .difference(new Set.from(knownLibraryNames))
-          .difference(new Set.from(config.exclude));
+      Set notFound = Set.from(config.include)
+          .difference(Set.from(knownLibraryNames))
+          .difference(Set.from(config.exclude));
       if (notFound.isNotEmpty) {
         throw 'Did not find: [${notFound.join(', ')}] in '
             'known libraries: [${knownLibraryNames.join(', ')}]';
diff --git a/lib/src/model_utils.dart b/lib/src/model_utils.dart
index ca9fc98..42711b1 100644
--- a/lib/src/model_utils.dart
+++ b/lib/src/model_utils.dart
@@ -25,7 +25,7 @@
       element.nameOffset != -1) {
     CompilationUnit unit = compilationUnitMap[element.source.fullName];
     if (unit != null) {
-      var locator = new NodeLocator2(element.nameOffset);
+      var locator = NodeLocator2(element.nameOffset);
       return (locator.searchWithin(unit)?.parent);
     }
   }
@@ -53,13 +53,13 @@
 String getFileContentsFor(Element e) {
   var location = e.source.fullName;
   if (!_fileContents.containsKey(location)) {
-    var contents = new File(location).readAsStringSync();
+    var contents = File(location).readAsStringSync();
     _fileContents.putIfAbsent(location, () => contents);
   }
   return _fileContents[location];
 }
 
-final RegExp slashes = new RegExp('[\/]');
+final RegExp slashes = RegExp('[\/]');
 bool hasPrivateName(Element e) {
   if (e.name == null) return false;
 
diff --git a/lib/src/package_meta.dart b/lib/src/package_meta.dart
index ac2dc7d..c6ba1bb 100644
--- a/lib/src/package_meta.dart
+++ b/lib/src/package_meta.dart
@@ -15,10 +15,10 @@
 import 'logging.dart';
 
 Map<String, PackageMeta> _packageMetaCache = {};
-Encoding utf8AllowMalformed = new Utf8Codec(allowMalformed: true);
+Encoding utf8AllowMalformed = Utf8Codec(allowMalformed: true);
 
 Directory get defaultSdkDir {
-  Directory sdkDir = new File(Platform.resolvedExecutable).parent.parent;
+  Directory sdkDir = File(Platform.resolvedExecutable).parent.parent;
   assert(path.equals(sdkDir.path, PackageMeta.sdkDirParent(sdkDir).path));
   return sdkDir;
 }
@@ -49,8 +49,8 @@
         for (List<String> paths in __sdkDirFilePathsPosix) {
           List<String> windowsPaths = [];
           for (String p in paths) {
-            windowsPaths.add(path
-                .joinAll(new path.Context(style: path.Style.posix).split(p)));
+            windowsPaths.add(
+                path.joinAll(path.Context(style: path.Style.posix).split(p)));
           }
           __sdkDirFilePaths.add(windowsPaths);
         }
@@ -71,7 +71,7 @@
       _sdkDirParent[dirPathCanonical] = null;
       while (dir.existsSync()) {
         if (_sdkDirFilePaths.every((List<String> l) {
-          return l.any((f) => new File(path.join(dir.path, f)).existsSync());
+          return l.any((f) => File(path.join(dir.path, f)).existsSync());
         })) {
           _sdkDirParent[dirPathCanonical] = dir;
           break;
@@ -99,14 +99,14 @@
     // context since sdkDir is argOnly and this is supposed to be a temporary
     // workaround.
     if (libraryElement.isInSdk) {
-      return new PackageMeta.fromDir(new Directory(config.sdkDir));
+      return PackageMeta.fromDir(Directory(config.sdkDir));
     }
-    return new PackageMeta.fromDir(
-        new File(path.canonicalize(libraryElement.source.fullName)).parent);
+    return PackageMeta.fromDir(
+        File(path.canonicalize(libraryElement.source.fullName)).parent);
   }
 
   factory PackageMeta.fromFilename(String filename) {
-    return new PackageMeta.fromDir(new File(filename).parent);
+    return PackageMeta.fromDir(File(filename).parent);
   }
 
   /// This factory is guaranteed to return the same object for any given
@@ -117,7 +117,7 @@
     Directory original = dir.absolute;
     dir = original;
     if (!original.existsSync()) {
-      throw new PackageMetaFailure(
+      throw PackageMetaFailure(
           "fatal error: unable to locate the input directory at ${original.path}.");
     }
 
@@ -126,12 +126,12 @@
       // There are pubspec.yaml files inside the SDK.  Ignore them.
       Directory parentSdkDir = sdkDirParent(dir);
       if (parentSdkDir != null) {
-        packageMeta = new _SdkMeta(parentSdkDir);
+        packageMeta = _SdkMeta(parentSdkDir);
       } else {
         while (dir.existsSync()) {
-          File pubspec = new File(path.join(dir.path, 'pubspec.yaml'));
+          File pubspec = File(path.join(dir.path, 'pubspec.yaml'));
           if (pubspec.existsSync()) {
-            packageMeta = new _FilePackageMeta(dir);
+            packageMeta = _FilePackageMeta(dir);
             break;
           }
           // Allow a package to be at root (possible in a Windows setting with
@@ -220,8 +220,7 @@
 
   FileContents._(this.file);
 
-  factory FileContents(File file) =>
-      file == null ? null : new FileContents._(file);
+  factory FileContents(File file) => file == null ? null : FileContents._(file);
 
   String get contents => file.readAsStringSync(encoding: utf8AllowMalformed);
 
@@ -238,7 +237,7 @@
   Map _pubspec;
 
   _FilePackageMeta(Directory dir) : super(dir) {
-    File f = new File(path.join(dir.path, 'pubspec.yaml'));
+    File f = File(path.join(dir.path, 'pubspec.yaml'));
     if (f.existsSync()) {
       _pubspec = loadYaml(f.readAsStringSync());
     } else {
@@ -267,7 +266,7 @@
         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()) {
+            Directory(path.join(pubCacheRoot, '_temp')).existsSync()) {
           _hostedAt = path.basename(hostname);
         }
       }
@@ -280,7 +279,7 @@
 
   @override
   bool get needsPubGet =>
-      !(new File(path.join(dir.path, '.packages')).existsSync());
+      !(File(path.join(dir.path, '.packages')).existsSync());
 
   @override
   void runPubGet() {
@@ -297,10 +296,10 @@
     }
 
     if (result.exitCode != 0) {
-      StringBuffer buf = new StringBuffer();
+      StringBuffer buf = StringBuffer();
       buf.writeln('${result.stdout}');
       buf.writeln('${result.stderr}');
-      throw new DartdocFailure('pub get failed: ${buf.toString().trim()}');
+      throw DartdocFailure('pub get failed: ${buf.toString().trim()}');
     }
   }
 
@@ -323,23 +322,22 @@
   @override
   FileContents getReadmeContents() {
     if (_readme != null) return _readme;
-    _readme =
-        new FileContents(_locate(dir, ['readme.md', 'readme.txt', 'readme']));
+    _readme = FileContents(_locate(dir, ['readme.md', 'readme.txt', 'readme']));
     return _readme;
   }
 
   @override
   FileContents getLicenseContents() {
     if (_license != null) return _license;
-    _license = new FileContents(
-        _locate(dir, ['license.md', 'license.txt', 'license']));
+    _license =
+        FileContents(_locate(dir, ['license.md', 'license.txt', 'license']));
     return _license;
   }
 
   @override
   FileContents getChangelogContents() {
     if (_changelog != null) return _changelog;
-    _changelog = new FileContents(
+    _changelog = FileContents(
         _locate(dir, ['changelog.md', 'changelog.txt', 'changelog']));
     return _changelog;
   }
@@ -359,8 +357,7 @@
 }
 
 File _locate(Directory dir, List<String> fileNames) {
-  List<File> files =
-      new List<File>.from(dir.listSync().where((f) => f is File));
+  List<File> files = dir.listSync().whereType<File>().toList();
 
   for (String name in fileNames) {
     for (File f in files) {
@@ -396,7 +393,7 @@
 
   @override
   String get version {
-    File versionFile = new File(path.join(dir.path, 'version'));
+    File versionFile = File(path.join(dir.path, 'version'));
     if (versionFile.existsSync()) return versionFile.readAsStringSync().trim();
     return 'unknown';
   }
@@ -414,11 +411,11 @@
 
   @override
   FileContents getReadmeContents() {
-    File f = new File(path.join(dir.path, 'lib', 'api_readme.md'));
+    File f = File(path.join(dir.path, 'lib', 'api_readme.md'));
     if (!f.existsSync()) {
-      f = new File(path.join(dir.path, 'api_readme.md'));
+      f = File(path.join(dir.path, 'api_readme.md'));
     }
-    return f.existsSync() ? new FileContents(f) : null;
+    return f.existsSync() ? FileContents(f) : null;
   }
 
   @override
diff --git a/lib/src/source_linker.dart b/lib/src/source_linker.dart
index cfa64ad..7a2def8 100644
--- a/lib/src/source_linker.dart
+++ b/lib/src/source_linker.dart
@@ -9,7 +9,7 @@
 import 'package:dartdoc/src/model.dart';
 import 'package:path/path.dart' as path;
 
-final uriTemplateRegexp = new RegExp(r'(%[frl]%)');
+final uriTemplateRegexp = RegExp(r'(%[frl]%)');
 
 abstract class SourceLinkerOptionContext implements DartdocOptionContextBase {
   List<String> get linkToSourceExcludes =>
@@ -27,20 +27,20 @@
 
 Future<List<DartdocOption>> createSourceLinkerOptions() async {
   return <DartdocOption>[
-    new DartdocOptionSet('linkToSource')
+    DartdocOptionSet('linkToSource')
       ..addAll([
-        new DartdocOptionArgFile<List<String>>('excludes', [],
+        DartdocOptionArgFile<List<String>>('excludes', [],
             isDir: true,
             help:
                 'A list of directories to exclude from linking to a source code repository.'),
         // TODO(jcollins-g): Use [DartdocOptionArgSynth], possibly in combination with a repository type and the root directory, and get revision number automatically
-        new DartdocOptionArgOnly<String>('revision', null,
+        DartdocOptionArgOnly<String>('revision', null,
             help: 'Revision number to insert into the URI.'),
-        new DartdocOptionArgFile<String>('root', null,
+        DartdocOptionArgFile<String>('root', null,
             isDir: true,
             help:
                 'Path to a local directory that is the root of the repository we link to.  All source code files under this directory will be linked.'),
-        new DartdocOptionArgFile<String>('uriTemplate', null,
+        DartdocOptionArgFile<String>('uriTemplate', null,
             help:
                 '''Substitute into this template to generate a uri for an element's source code.
              Dartdoc dynamically substitutes the following fields into the template:
@@ -84,7 +84,7 @@
   /// Build a SourceLinker from a ModelElement.
   factory SourceLinker.fromElement(ModelElement element) {
     SourceLinkerOptionContext config = element.config;
-    return new SourceLinker(
+    return SourceLinker(
       excludes: config.linkToSourceExcludes,
       // TODO(jcollins-g): disallow defaulting?  Some elements come back without
       // a line number right now.
@@ -108,7 +108,7 @@
     return uriTemplate.replaceAllMapped(uriTemplateRegexp, (match) {
       switch (match[1]) {
         case '%f%':
-          var urlContext = new path.Context(style: path.Style.url);
+          var urlContext = path.Context(style: path.Style.url);
           return urlContext
               .joinAll(path.split(path.relative(sourceFileName, from: root)));
           break;
diff --git a/lib/src/special_elements.dart b/lib/src/special_elements.dart
index 9da4bcd..0dceb95 100644
--- a/lib/src/special_elements.dart
+++ b/lib/src/special_elements.dart
@@ -66,12 +66,12 @@
 /// The index is a shortcut to reduce processing time for determining if
 /// a class might be "special".
 final Map<String, _SpecialClassDefinition> _specialClassDefinitions = {
-  'Object': new _SpecialClassDefinition(
+  'Object': _SpecialClassDefinition(
       SpecialClass.object, 'Object', 'dart.core', 'dart:core'),
-  'Interceptor': new _SpecialClassDefinition(SpecialClass.interceptor,
+  'Interceptor': _SpecialClassDefinition(SpecialClass.interceptor,
       'Interceptor', '_interceptors', 'dart:_interceptors',
       required: false),
-  'pragma': new _SpecialClassDefinition(
+  'pragma': _SpecialClassDefinition(
       SpecialClass.pragma, 'pragma', 'dart.core', 'dart:core',
       required: false),
 };
diff --git a/lib/src/tool_runner.dart b/lib/src/tool_runner.dart
index 400e8ec..daf4931 100644
--- a/lib/src/tool_runner.dart
+++ b/lib/src/tool_runner.dart
@@ -17,7 +17,7 @@
 
 /// Set a ceiling on how many tool instances can be in progress at once,
 /// limiting both parallelization and the number of open temporary files.
-final MultiFutureTracker _toolTracker = new MultiFutureTracker(4);
+final MultiFutureTracker _toolTracker = MultiFutureTracker(4);
 
 /// Can be called when the ToolRunner is no longer needed.
 ///
@@ -38,7 +38,7 @@
 
   Future<File> createTemporaryFile() async {
     _temporaryFileCount++;
-    File tempFile = new File(path.join(
+    File tempFile = File(path.join(
         temporaryDirectory.absolute.path, 'input_$_temporaryFileCount'));
     await tempFile.create(recursive: true);
     return tempFile;
diff --git a/lib/src/utils.dart b/lib/src/utils.dart
index d732e50..dd3f5f2 100644
--- a/lib/src/utils.dart
+++ b/lib/src/utils.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 library dartdoc.utils;
 
-final RegExp leadingWhiteSpace = new RegExp(r'^([ \t]*)[^ ]');
+final RegExp leadingWhiteSpace = RegExp(r'^([ \t]*)[^ ]');
 
 Iterable<String> stripCommonWhitespace(String str) sync* {
   List<String> lines = str.split('\n');
@@ -32,7 +32,7 @@
 String stripComments(String str) {
   bool cStyle = false;
   if (str == null) return null;
-  StringBuffer buf = new StringBuffer();
+  StringBuffer buf = StringBuffer();
 
   if (str.startsWith('///')) {
     for (String line in stripCommonWhitespace(str)) {
diff --git a/lib/src/warnings.dart b/lib/src/warnings.dart
index f67ab81..1b96459 100644
--- a/lib/src/warnings.dart
+++ b/lib/src/warnings.dart
@@ -25,7 +25,7 @@
 
 Future<List<DartdocOption>> createPackageWarningOptions() async {
   return <DartdocOption>[
-    new DartdocOptionArgOnly<bool>('allowNonLocalWarnings', false,
+    DartdocOptionArgOnly<bool>('allowNonLocalWarnings', false,
         negatable: true,
         help: 'Show warnings from packages we are not documenting locally.'),
 
@@ -33,21 +33,21 @@
     // for individual packages are command-line only.  This will allow
     // meta-packages like Flutter to control whether warnings are displayed for
     // packages they don't control.
-    new DartdocOptionArgOnly<List<String>>('allowWarningsInPackages', null,
+    DartdocOptionArgOnly<List<String>>('allowWarningsInPackages', null,
         help:
             'Package names to display warnings for (ignore all others if set).'),
-    new DartdocOptionArgOnly<List<String>>('allowErrorsInPackages', null,
+    DartdocOptionArgOnly<List<String>>('allowErrorsInPackages', null,
         help: 'Package names to display errors for (ignore all others if set)'),
-    new DartdocOptionArgOnly<List<String>>('ignoreWarningsInPackages', null,
+    DartdocOptionArgOnly<List<String>>('ignoreWarningsInPackages', null,
         help:
             'Package names to ignore warnings for.  Takes priority over allow-warnings-in-packages'),
-    new DartdocOptionArgOnly<List<String>>('ignoreErrorsInPackages', null,
+    DartdocOptionArgOnly<List<String>>('ignoreErrorsInPackages', null,
         help:
             'Package names to ignore errors for. Takes priority over allow-errors-in-packages'),
     // Options for globally enabling/disabling warnings and errors across
     // packages.  Loaded from dartdoc_options.yaml, but command line arguments
     // will override.
-    new DartdocOptionArgFile<List<String>>('errors', null,
+    DartdocOptionArgFile<List<String>>('errors', null,
         help:
             'Additional warning names to force as errors.  Specify an empty list to force defaults (overriding dartdoc_options.yaml)\nDefaults:\n' +
                 (packageWarningDefinitions.values
@@ -57,7 +57,7 @@
                           ..sort())
                     .map((d) => '   ${d.warningName}: ${d.shortHelp}')
                     .join('\n')),
-    new DartdocOptionArgFile<List<String>>('ignore', null,
+    DartdocOptionArgFile<List<String>>('ignore', null,
         help:
             'Additional warning names to ignore.  Specify an empty list to force defaults (overriding dartdoc_options.yaml).\nDefaults:\n' +
                 (packageWarningDefinitions.values
@@ -67,7 +67,7 @@
                           ..sort())
                     .map((d) => '   ${d.warningName}: ${d.shortHelp}')
                     .join('\n')),
-    new DartdocOptionArgFile<List<String>>('warnings', null,
+    DartdocOptionArgFile<List<String>>('warnings', null,
         help:
             'Additional warning names to show as warnings (instead of error or ignore, if not warning by default).\nDefaults:\n' +
                 (packageWarningDefinitions.values
@@ -78,7 +78,7 @@
                     .map((d) => '   ${d.warningName}: ${d.shortHelp}')
                     .join('\n')),
     // Synthetic option uses a factory to build a PackageWarningOptions from all the above flags.
-    new DartdocOptionSyntheticOnly<PackageWarningOptions>(
+    DartdocOptionSyntheticOnly<PackageWarningOptions>(
         'packageWarningOptions', PackageWarningOptions.fromOptions),
   ];
 }
@@ -103,22 +103,22 @@
 
 /// Same as [packageWarningDefinitions], except keyed by the warning name.
 final Map<String, PackageWarningDefinition> packageWarningsByName =
-    new Map.fromEntries(packageWarningDefinitions.values
-        .map((definition) => new MapEntry(definition.warningName, definition)));
+    Map.fromEntries(packageWarningDefinitions.values
+        .map((definition) => MapEntry(definition.warningName, definition)));
 
 /// Provides description text and command line flags for warnings.
 /// TODO(jcollins-g): Actually use this for command line flags.
 final Map<PackageWarning, PackageWarningDefinition> packageWarningDefinitions =
     const {
-  PackageWarning.ambiguousDocReference: const PackageWarningDefinition(
+  PackageWarning.ambiguousDocReference: PackageWarningDefinition(
       PackageWarning.ambiguousDocReference,
       "ambiguous-doc-reference",
       "A comment reference could refer to two or more different objects"),
-  PackageWarning.ambiguousReexport: const PackageWarningDefinition(
+  PackageWarning.ambiguousReexport: PackageWarningDefinition(
       PackageWarning.ambiguousReexport,
       "ambiguous-reexport",
       "A symbol is exported from private to public in more than one library and dartdoc can not determine which one is canonical",
-      longHelp: const [
+      longHelp: [
         "Use {@canonicalFor @@name@@} in the desired library's documentation to resolve",
         "the ambiguity and/or override dartdoc's decision, or structure your package ",
         "so the reexport is less ambiguous.  The symbol will still be referenced in ",
@@ -127,71 +127,64 @@
         "The flag --ambiguous-reexport-scorer-min-confidence allows you to set the",
         "threshold at which this warning will appear."
       ]),
-  PackageWarning.ignoredCanonicalFor: const PackageWarningDefinition(
+  PackageWarning.ignoredCanonicalFor: PackageWarningDefinition(
       PackageWarning.ignoredCanonicalFor,
       "ignored-canonical-for",
       "A @canonicalFor tag refers to a library which this symbol can not be canonical for"),
-  PackageWarning.noCanonicalFound: const PackageWarningDefinition(
+  PackageWarning.noCanonicalFound: PackageWarningDefinition(
       PackageWarning.noCanonicalFound,
       "no-canonical-found",
       "A symbol is part of the public interface for this package, but no library documented with this package documents it so dartdoc can not link to it"),
-  PackageWarning.noLibraryLevelDocs: const PackageWarningDefinition(
+  PackageWarning.noLibraryLevelDocs: PackageWarningDefinition(
       PackageWarning.noLibraryLevelDocs,
       "no-library-level-docs",
       "There are no library level docs for this library"),
-  PackageWarning.packageOrderGivesMissingPackageName:
-      const PackageWarningDefinition(
-          PackageWarning.packageOrderGivesMissingPackageName,
-          "category-order-gives-missing-package-name",
-          "The category-order flag on the command line was given the name of a nonexistent package"),
-  PackageWarning.reexportedPrivateApiAcrossPackages: const PackageWarningDefinition(
+  PackageWarning.packageOrderGivesMissingPackageName: PackageWarningDefinition(
+      PackageWarning.packageOrderGivesMissingPackageName,
+      "category-order-gives-missing-package-name",
+      "The category-order flag on the command line was given the name of a nonexistent package"),
+  PackageWarning.reexportedPrivateApiAcrossPackages: PackageWarningDefinition(
       PackageWarning.reexportedPrivateApiAcrossPackages,
       "reexported-private-api-across-packages",
       "One or more libraries reexports private API members from outside its own package"),
-  PackageWarning.unresolvedDocReference: const PackageWarningDefinition(
+  PackageWarning.unresolvedDocReference: PackageWarningDefinition(
       PackageWarning.unresolvedDocReference,
       "unresolved-doc-reference",
       "A comment reference could not be found in parameters, enclosing class, enclosing library, or at the top level of any documented library with the package"),
-  PackageWarning.brokenLink: const PackageWarningDefinition(
-      PackageWarning.brokenLink,
-      "broken-link",
-      "Dartdoc generated a link to a non-existent file"),
-  PackageWarning.unknownMacro: const PackageWarningDefinition(
+  PackageWarning.brokenLink: PackageWarningDefinition(PackageWarning.brokenLink,
+      "broken-link", "Dartdoc generated a link to a non-existent file"),
+  PackageWarning.unknownMacro: PackageWarningDefinition(
       PackageWarning.unknownMacro,
       "unknown-macro",
       "A comment reference contains an unknown macro"),
-  PackageWarning.orphanedFile: const PackageWarningDefinition(
+  PackageWarning.orphanedFile: PackageWarningDefinition(
       PackageWarning.orphanedFile,
       "orphaned-file",
       "Dartdoc generated files that are unreachable from the index"),
-  PackageWarning.unknownFile: const PackageWarningDefinition(
+  PackageWarning.unknownFile: PackageWarningDefinition(
       PackageWarning.unknownFile,
       "unknown-file",
       "A leftover file exists in the tree that dartdoc did not write in this pass"),
-  PackageWarning.missingFromSearchIndex: const PackageWarningDefinition(
+  PackageWarning.missingFromSearchIndex: PackageWarningDefinition(
       PackageWarning.missingFromSearchIndex,
       "missing-from-search-index",
       "A file generated by dartdoc is not present in the generated index.json"),
-  PackageWarning.typeAsHtml: const PackageWarningDefinition(
+  PackageWarning.typeAsHtml: PackageWarningDefinition(
       PackageWarning.typeAsHtml,
       "type-as-html",
       "Use of <> in a comment for type parameters is being treated as HTML by markdown",
       defaultWarningMode: PackageWarningMode.ignore),
-  PackageWarning.invalidParameter: const PackageWarningDefinition(
+  PackageWarning.invalidParameter: PackageWarningDefinition(
       PackageWarning.invalidParameter,
       "invalid-parameter",
       "A parameter given to a dartdoc directive was invalid.",
       defaultWarningMode: PackageWarningMode.error),
-  PackageWarning.toolError: const PackageWarningDefinition(
-      PackageWarning.toolError,
-      "tool-error",
-      "Unable to execute external tool.",
+  PackageWarning.toolError: PackageWarningDefinition(PackageWarning.toolError,
+      "tool-error", "Unable to execute external tool.",
       defaultWarningMode: PackageWarningMode.error),
-  PackageWarning.deprecated: const PackageWarningDefinition(
-      PackageWarning.deprecated,
-      "deprecated",
-      "A dartdoc directive has a deprecated format."),
-  PackageWarning.unresolvedExport: const PackageWarningDefinition(
+  PackageWarning.deprecated: PackageWarningDefinition(PackageWarning.deprecated,
+      "deprecated", "A dartdoc directive has a deprecated format."),
+  PackageWarning.unresolvedExport: PackageWarningDefinition(
       PackageWarning.unresolvedExport,
       "unresolved-export",
       "An export refers to a URI that cannot be resolved.",
@@ -258,7 +251,7 @@
 /// In particular, this set should not include warnings around public/private
 /// or canonicalization problems, because those can break the isDocumented()
 /// check.
-final Set<PackageWarning> skipWarningIfNotDocumentedFor = new Set()
+final Set<PackageWarning> skipWarningIfNotDocumentedFor = Set()
   ..addAll([PackageWarning.unresolvedDocReference, PackageWarning.typeAsHtml]);
 
 class PackageWarningOptions {
@@ -292,7 +285,7 @@
       DartdocSyntheticOption<PackageWarningOptions> option, Directory dir) {
     // First, initialize defaults.
     PackageWarningOptions newOptions = PackageWarningOptions();
-    PackageMeta packageMeta = new PackageMeta.fromDir(dir);
+    PackageMeta packageMeta = PackageMeta.fromDir(dir);
 
     // Interpret errors/warnings/ignore options.  In the event of conflict, warning overrides error and
     // ignore overrides warning.
@@ -357,8 +350,7 @@
 }
 
 class PackageWarningCounter {
-  final countedWarnings =
-      new Map<Element, Set<Tuple2<PackageWarning, String>>>();
+  final countedWarnings = Map<Element, Set<Tuple2<PackageWarning, String>>>();
   final _items = <Jsonable>[];
   final _displayedWarningCounts = <PackageWarning, int>{};
   final PackageGraph packageGraph;
@@ -393,7 +385,7 @@
         entry = '$entry$verboseOut';
       }
       assert(entry == entry.trimRight());
-      _items.add(new _JsonWarning(type, kind, fullMessage, entry));
+      _items.add(_JsonWarning(type, kind, fullMessage, entry));
     }
     for (var item in _items) {
       logWarning(item);
@@ -403,7 +395,7 @@
 
   /// Returns true if we've already warned for this.
   bool hasWarning(Warnable element, PackageWarning kind, String message) {
-    Tuple2<PackageWarning, String> warningData = new Tuple2(kind, message);
+    Tuple2<PackageWarning, String> warningData = Tuple2(kind, message);
     if (countedWarnings.containsKey(element?.element)) {
       return countedWarnings[element?.element].contains(warningData);
     }
@@ -429,8 +421,8 @@
     } else if (warningMode == PackageWarningMode.error) {
       errorCount += 1;
     }
-    Tuple2<PackageWarning, String> warningData = new Tuple2(kind, message);
-    countedWarnings.putIfAbsent(element?.element, () => new Set());
+    Tuple2<PackageWarning, String> warningData = Tuple2(kind, message);
+    countedWarnings.putIfAbsent(element?.element, () => Set());
     countedWarnings[element?.element].add(warningData);
     _writeWarning(kind, warningMode, config.verboseWarnings,
         element?.fullyQualifiedName, fullMessage);
diff --git a/test/dartdoc_integration_test.dart b/test/dartdoc_integration_test.dart
index 835f5ad..2e65818 100644
--- a/test/dartdoc_integration_test.dart
+++ b/test/dartdoc_integration_test.dart
@@ -30,8 +30,8 @@
     setUpAll(() async {
       tempDir =
           Directory.systemTemp.createTempSync('dartdoc_integration_test.');
-      subprocessLauncher = new CoverageSubprocessLauncher(
-          'dartdoc_integration_test-subprocesses');
+      subprocessLauncher =
+          CoverageSubprocessLauncher('dartdoc_integration_test-subprocesses');
     });
 
     tearDown(() async {
@@ -128,47 +128,46 @@
           contains('Generate HTML documentation for Dart libraries.'));
       expect(
           outputLines.join('\n'),
-          contains(new RegExp('^-h, --help[ ]+Show command help.',
-              multiLine: true)));
+          contains(
+              RegExp('^-h, --help[ ]+Show command help.', multiLine: true)));
     });
 
     test('Validate missing FLUTTER_ROOT exception is clean', () async {
-      StringBuffer output = new StringBuffer();
+      StringBuffer output = StringBuffer();
       var args = <String>[dartdocPath];
       Future run = subprocessLauncher.runStreamed(
           Platform.resolvedExecutable, args,
-          environment: new Map.from(Platform.environment)
-            ..remove('FLUTTER_ROOT'),
+          environment: Map.from(Platform.environment)..remove('FLUTTER_ROOT'),
           includeParentEnvironment: false,
           workingDirectory: _testPackageFlutterPluginPath, perLine: (s) {
         output.writeln(s);
       });
       // Asynchronous exception, but we still need the output, too.
-      expect(run, throwsA(new TypeMatcher<ProcessException>()));
+      expect(run, throwsA(TypeMatcher<ProcessException>()));
       try {
         await run;
       } on ProcessException catch (_) {}
 
       expect(
           output.toString(),
-          contains(new RegExp(
+          contains(RegExp(
               'Top level package requires Flutter but FLUTTER_ROOT environment variable not set|test_package_flutter_plugin requires the Flutter SDK, version solving failed')));
       expect(output.toString(), isNot(contains('asynchronous gap')));
     });
 
     test("Validate --version works", () async {
-      StringBuffer output = new StringBuffer();
+      StringBuffer output = StringBuffer();
       var args = <String>[dartdocPath, '--version'];
       await subprocessLauncher.runStreamed(Platform.resolvedExecutable, args,
           workingDirectory: _testPackagePath,
           perLine: (s) => output.writeln(s));
-      PackageMeta dartdocMeta = new PackageMeta.fromFilename(dartdocPath);
+      PackageMeta dartdocMeta = PackageMeta.fromFilename(dartdocPath);
       expect(output.toString(),
           endsWith('dartdoc version: ${dartdocMeta.version}\n'));
     });
 
     test('Check for sample code in examples', () async {
-      StringBuffer output = new StringBuffer();
+      StringBuffer output = StringBuffer();
       var args = <String>[
         dartdocPath,
         '--include',
@@ -185,7 +184,7 @@
       // Examples are reported as unfound because we (purposefully)
       // did not use --example-path-prefix above.
       final sep = '.'; // We don't care what the path separator character is
-      final firstUnfoundExample = new RegExp('warning: lib${sep}example.dart: '
+      final firstUnfoundExample = RegExp('warning: lib${sep}example.dart: '
           '@example file not found.*test_package${sep}dog${sep}food.md');
       if (!output.toString().contains(firstUnfoundExample)) {
         fail('Should warn about unfound @example files');
@@ -209,12 +208,12 @@
 
       expect(jsonValues, isNotEmpty,
           reason: 'All STDOUT lines should be JSON-encoded maps.');
-    }, timeout: new Timeout.factor(2));
+    }, timeout: Timeout.factor(2));
 
     test('--footer-text includes text', () async {
       String footerTextPath =
           path.join(Directory.systemTemp.path, 'footer.txt');
-      new File(footerTextPath).writeAsStringSync(' footer text include ');
+      File(footerTextPath).writeAsStringSync(' footer text include ');
 
       var args = <String>[
         dartdocPath,
@@ -228,8 +227,8 @@
       await subprocessLauncher.runStreamed(Platform.resolvedExecutable, args,
           workingDirectory: _testPackagePath);
 
-      File outFile = new File(path.join(tempDir.path, 'index.html'));
+      File outFile = File(path.join(tempDir.path, 'index.html'));
       expect(outFile.readAsStringSync(), contains('footer text include'));
     });
-  }, timeout: new Timeout.factor(4));
+  }, timeout: Timeout.factor(4));
 }
diff --git a/test/dartdoc_options_test.dart b/test/dartdoc_options_test.dart
index ef73ab1..fb41b7a 100644
--- a/test/dartdoc_options_test.dart
+++ b/test/dartdoc_options_test.dart
@@ -33,7 +33,7 @@
           break;
       }
     }
-    return new ConvertedOption._(p1, p2, contextPath);
+    return ConvertedOption._(p1, p2, contextPath);
   }
 }
 
@@ -54,11 +54,11 @@
   File firstExisting;
 
   setUpAll(() {
-    dartdocOptionSetSynthetic = new DartdocOptionSet('dartdoc');
+    dartdocOptionSetSynthetic = DartdocOptionSet('dartdoc');
     dartdocOptionSetSynthetic
-        .add(new DartdocOptionArgFile<int>('mySpecialInteger', 91));
+        .add(DartdocOptionArgFile<int>('mySpecialInteger', 91));
     dartdocOptionSetSynthetic.add(
-        new DartdocOptionSyntheticOnly<List<String>>('vegetableLoader',
+        DartdocOptionSyntheticOnly<List<String>>('vegetableLoader',
             (DartdocSyntheticOption<List<String>> option, Directory dir) {
       if (option.root['mySpecialInteger'].valueAt(dir) > 20) {
         return <String>['existing.dart'];
@@ -67,115 +67,105 @@
       }
     }));
     dartdocOptionSetSynthetic.add(
-        new DartdocOptionSyntheticOnly<List<String>>('vegetableLoaderChecked',
+        DartdocOptionSyntheticOnly<List<String>>('vegetableLoaderChecked',
             (DartdocSyntheticOption<List<String>> option, Directory dir) {
       return option.root['vegetableLoader'].valueAt(dir);
     }, isFile: true, mustExist: true));
-    dartdocOptionSetSynthetic.add(new DartdocOptionFileSynth<double>('double',
+    dartdocOptionSetSynthetic.add(DartdocOptionFileSynth<double>('double',
         (DartdocSyntheticOption<double> option, Directory dir) {
       return 3.7 + 4.1;
     }));
     dartdocOptionSetSynthetic.add(
-        new DartdocOptionArgSynth<String>('nonCriticalFileOption',
+        DartdocOptionArgSynth<String>('nonCriticalFileOption',
             (DartdocSyntheticOption<String> option, Directory dir) {
       return option.root['vegetableLoader'].valueAt(dir).first;
     }, isFile: true));
 
-    dartdocOptionSetFiles = new DartdocOptionSet('dartdoc');
+    dartdocOptionSetFiles = DartdocOptionSet('dartdoc');
     dartdocOptionSetFiles
-        .add(new DartdocOptionFileOnly<List<String>>('categoryOrder', []));
-    dartdocOptionSetFiles.add(new DartdocOptionFileOnly<double>('double', 3.0));
+        .add(DartdocOptionFileOnly<List<String>>('categoryOrder', []));
+    dartdocOptionSetFiles.add(DartdocOptionFileOnly<double>('double', 3.0));
     dartdocOptionSetFiles
-        .add(new DartdocOptionFileOnly<int>('mySpecialInteger', 42));
-    dartdocOptionSetFiles.add(new DartdocOptionFileOnly<Map<String, String>>(
+        .add(DartdocOptionFileOnly<int>('mySpecialInteger', 42));
+    dartdocOptionSetFiles.add(DartdocOptionFileOnly<Map<String, String>>(
         'mapOption', {'hello': 'world'}));
-    dartdocOptionSetFiles.add(new DartdocOptionFileOnly<List<String>>(
+    dartdocOptionSetFiles.add(DartdocOptionFileOnly<List<String>>(
         'fileOptionList', [],
         isFile: true, mustExist: true));
-    dartdocOptionSetFiles.add(new DartdocOptionFileOnly<String>(
-        'fileOption', null,
+    dartdocOptionSetFiles.add(DartdocOptionFileOnly<String>('fileOption', null,
         isFile: true, mustExist: true));
-    dartdocOptionSetFiles.add(new DartdocOptionFileOnly<String>(
+    dartdocOptionSetFiles.add(DartdocOptionFileOnly<String>(
         'parentOverride', 'oops',
         parentDirOverridesChild: true));
-    dartdocOptionSetFiles.add(new DartdocOptionFileOnly<String>(
+    dartdocOptionSetFiles.add(DartdocOptionFileOnly<String>(
         'nonCriticalFileOption', null,
         isFile: true));
-    dartdocOptionSetFiles.add(new DartdocOptionSet('nestedOption')
-      ..addAll([new DartdocOptionFileOnly<bool>('flag', false)]));
-    dartdocOptionSetFiles.add(new DartdocOptionFileOnly<String>(
-        'dirOption', null,
+    dartdocOptionSetFiles.add(DartdocOptionSet('nestedOption')
+      ..addAll([DartdocOptionFileOnly<bool>('flag', false)]));
+    dartdocOptionSetFiles.add(DartdocOptionFileOnly<String>('dirOption', null,
         isDir: true, mustExist: true));
-    dartdocOptionSetFiles.add(new DartdocOptionFileOnly<String>(
+    dartdocOptionSetFiles.add(DartdocOptionFileOnly<String>(
         'nonCriticalDirOption', null,
         isDir: true));
-    dartdocOptionSetFiles.add(new DartdocOptionFileOnly<ConvertedOption>(
+    dartdocOptionSetFiles.add(DartdocOptionFileOnly<ConvertedOption>(
       'convertThisMap',
       null,
       convertYamlToType: ConvertedOption.fromYamlMap,
     ));
 
-    dartdocOptionSetArgs = new DartdocOptionSet('dartdoc');
+    dartdocOptionSetArgs = DartdocOptionSet('dartdoc');
     dartdocOptionSetArgs
-        .add(new DartdocOptionArgOnly<bool>('cauliflowerSystem', false));
+        .add(DartdocOptionArgOnly<bool>('cauliflowerSystem', false));
     dartdocOptionSetArgs
-        .add(new DartdocOptionArgOnly<String>('extraSpecial', 'something'));
+        .add(DartdocOptionArgOnly<String>('extraSpecial', 'something'));
     dartdocOptionSetArgs.add(
-        new DartdocOptionArgOnly<List<String>>('excludeFiles', ['one', 'two']));
+        DartdocOptionArgOnly<List<String>>('excludeFiles', ['one', 'two']));
     dartdocOptionSetArgs
-        .add(new DartdocOptionArgOnly<int>('number_of_heads', 3, abbr: 'h'));
+        .add(DartdocOptionArgOnly<int>('number_of_heads', 3, abbr: 'h'));
     dartdocOptionSetArgs
-        .add(new DartdocOptionArgOnly<double>('respawnProbability', 0.2));
-    dartdocOptionSetArgs.add(new DartdocOptionSet('warn')
-      ..addAll(
-          [new DartdocOptionArgOnly<bool>('unrecognizedVegetable', false)]));
-    dartdocOptionSetArgs.add(new DartdocOptionArgOnly<Map<String, String>>(
+        .add(DartdocOptionArgOnly<double>('respawnProbability', 0.2));
+    dartdocOptionSetArgs.add(DartdocOptionSet('warn')
+      ..addAll([DartdocOptionArgOnly<bool>('unrecognizedVegetable', false)]));
+    dartdocOptionSetArgs.add(DartdocOptionArgOnly<Map<String, String>>(
         'aFancyMapVariable', {'hello': 'map world'},
         splitCommas: true));
-    dartdocOptionSetArgs.add(new DartdocOptionArgOnly<List<String>>(
-        'filesFlag', [],
+    dartdocOptionSetArgs.add(DartdocOptionArgOnly<List<String>>('filesFlag', [],
         isFile: true, mustExist: true));
-    dartdocOptionSetArgs.add(new DartdocOptionArgOnly<String>(
-        'singleFile', 'hello',
+    dartdocOptionSetArgs.add(DartdocOptionArgOnly<String>('singleFile', 'hello',
         isFile: true, mustExist: true));
-    dartdocOptionSetArgs.add(new DartdocOptionArgOnly<String>(
+    dartdocOptionSetArgs.add(DartdocOptionArgOnly<String>(
         'unimportantFile', 'whatever',
         isFile: true));
 
-    dartdocOptionSetAll = new DartdocOptionSet('dartdoc');
+    dartdocOptionSetAll = DartdocOptionSet('dartdoc');
     dartdocOptionSetAll
-        .add(new DartdocOptionArgFile<List<String>>('categoryOrder', []));
-    dartdocOptionSetAll
-        .add(new DartdocOptionArgFile<int>('mySpecialInteger', 91));
-    dartdocOptionSetAll.add(new DartdocOptionSet('warn')
-      ..addAll(
-          [new DartdocOptionArgFile<bool>('unrecognizedVegetable', false)]));
-    dartdocOptionSetAll.add(new DartdocOptionArgFile<Map<String, String>>(
+        .add(DartdocOptionArgFile<List<String>>('categoryOrder', []));
+    dartdocOptionSetAll.add(DartdocOptionArgFile<int>('mySpecialInteger', 91));
+    dartdocOptionSetAll.add(DartdocOptionSet('warn')
+      ..addAll([DartdocOptionArgFile<bool>('unrecognizedVegetable', false)]));
+    dartdocOptionSetAll.add(DartdocOptionArgFile<Map<String, String>>(
         'mapOption', {'hi': 'there'}));
     dartdocOptionSetAll
-        .add(new DartdocOptionArgFile<String>('notInAnyFile', 'so there'));
-    dartdocOptionSetAll.add(new DartdocOptionArgFile<String>('fileOption', null,
+        .add(DartdocOptionArgFile<String>('notInAnyFile', 'so there'));
+    dartdocOptionSetAll.add(DartdocOptionArgFile<String>('fileOption', null,
         isFile: true, mustExist: true));
 
     tempDir = Directory.systemTemp.createTempSync('options_test');
-    firstDir = new Directory(path.join(tempDir.path, 'firstDir'))..createSync();
-    firstExisting = new File(path.join(firstDir.path, 'existing.dart'))
+    firstDir = Directory(path.join(tempDir.path, 'firstDir'))..createSync();
+    firstExisting = File(path.join(firstDir.path, 'existing.dart'))
       ..createSync();
-    secondDir = new Directory(path.join(tempDir.path, 'secondDir'))
-      ..createSync();
-    new File(path.join(secondDir.path, 'existing.dart'))..createSync();
+    secondDir = Directory(path.join(tempDir.path, 'secondDir'))..createSync();
+    File(path.join(secondDir.path, 'existing.dart'))..createSync();
 
-    secondDirFirstSub = new Directory(path.join(secondDir.path, 'firstSub'))
+    secondDirFirstSub = Directory(path.join(secondDir.path, 'firstSub'))
       ..createSync();
-    secondDirSecondSub = new Directory(path.join(secondDir.path, 'secondSub'))
+    secondDirSecondSub = Directory(path.join(secondDir.path, 'secondSub'))
       ..createSync();
 
-    dartdocOptionsOne =
-        new File(path.join(firstDir.path, 'dartdoc_options.yaml'));
-    dartdocOptionsTwo =
-        new File(path.join(secondDir.path, 'dartdoc_options.yaml'));
+    dartdocOptionsOne = File(path.join(firstDir.path, 'dartdoc_options.yaml'));
+    dartdocOptionsTwo = File(path.join(secondDir.path, 'dartdoc_options.yaml'));
     dartdocOptionsTwoFirstSub =
-        new File(path.join(secondDirFirstSub.path, 'dartdoc_options.yaml'));
+        File(path.join(secondDirFirstSub.path, 'dartdoc_options.yaml'));
 
     dartdocOptionsOne.writeAsStringSync('''
 dartdoc:
diff --git a/test/dartdoc_test.dart b/test/dartdoc_test.dart
index 29779a0..ce1f348 100644
--- a/test/dartdoc_test.dart
+++ b/test/dartdoc_test.dart
@@ -32,8 +32,7 @@
       DartdocOptionSet optionSet = await DartdocOptionSet.fromOptionGenerators(
           'dartdoc', [createLoggingOptions]);
       optionSet.parseArguments([]);
-      startLogging(
-          new DartdocLoggingOptionContext(optionSet, Directory.current));
+      startLogging(DartdocLoggingOptionContext(optionSet, Directory.current));
     });
 
     setUp(() async {
@@ -69,9 +68,9 @@
       });
 
       test('generator parameters', () async {
-        File favicon = new File(
-            path.joinAll([tempDir.path, 'static-assets', 'favicon.png']));
-        File index = new File(path.joinAll([tempDir.path, 'index.html']));
+        File favicon =
+            File(path.joinAll([tempDir.path, 'static-assets', 'favicon.png']));
+        File index = File(path.joinAll([tempDir.path, 'index.html']));
         expect(favicon.readAsStringSync(),
             contains('Not really a png, but a test file'));
         String indexString = index.readAsStringSync();
@@ -231,7 +230,7 @@
           useSomethingInAnotherPackage.modelType.linkedName,
           matches(
               '<a href=\"https://pub.dartlang.org/documentation/meta/[^\"]*/meta/Required-class.html\">Required</a>'));
-      RegExp stringLink = new RegExp(
+      RegExp stringLink = RegExp(
           'https://api.dartlang.org/(dev|stable|edge|be)/${Platform.version.split(' ').first}/dart-core/String-class.html">String</a>');
       expect(useSomethingInTheSdk.modelType.linkedName, contains(stringLink));
     });
@@ -266,8 +265,8 @@
       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(path.join(tempDir.path,
-            'anonymous_library', 'anonymous_library-library.html'));
+        File anonymousOutput = File(path.join(tempDir.path, 'anonymous_library',
+            'anonymous_library-library.html'));
         expect(anonymousOutput.existsSync(), isTrue);
         expect(
             anonymousOutput.readAsStringSync(),
@@ -364,5 +363,5 @@
           dart_bear.allClasses.map((cls) => cls.name).contains('Bear'), isTrue);
       expect(p.packageMap["Dart"].publicLibraries, hasLength(3));
     });
-  }, timeout: new Timeout.factor(8));
+  }, timeout: Timeout.factor(8));
 }
diff --git a/test/experiment_options_test.dart b/test/experiment_options_test.dart
index 5231bb3..6a6f466 100644
--- a/test/experiment_options_test.dart
+++ b/test/experiment_options_test.dart
@@ -53,7 +53,7 @@
     test('Defaults work for all options', () {
       experimentOptions.parseArguments([]);
       DartdocOptionContext tester =
-          new DartdocOptionContext(experimentOptions, emptyTempDir);
+          DartdocOptionContext(experimentOptions, emptyTempDir);
       if (defaultOnNotExpired != null) {
         expect(tester.experimentStatus.isEnabled(defaultOnNotExpired), isTrue);
       }
@@ -72,7 +72,7 @@
         '${defaultOffNotExpired?.disableString},${defaultOnNotExpired?.disableString},${defaultOnExpired.disableString},${defaultOffExpired.enableString}'
       ]);
       DartdocOptionContext tester =
-          new DartdocOptionContext(experimentOptions, emptyTempDir);
+          DartdocOptionContext(experimentOptions, emptyTempDir);
       if (defaultOnNotExpired != null) {
         expect(tester.experimentStatus.isEnabled(defaultOnNotExpired), isFalse);
       }
diff --git a/test/grind_test.dart b/test/grind_test.dart
index f4b8bec..2308754 100644
--- a/test/grind_test.dart
+++ b/test/grind_test.dart
@@ -14,17 +14,16 @@
     WarningsCollection originalWithDirs, currentWithDirs;
     setUp(() {
       original =
-          new WarningsCollection('/a/tempdir', '/pubcache/path', 'oldbranch');
+          WarningsCollection('/a/tempdir', '/pubcache/path', 'oldbranch');
       original.add('originalwarning');
       original.add('morewarning');
       original.add('duplicateoriginalwarning');
       original.add('duplicateoriginalwarning');
-      current =
-          new WarningsCollection('/a/tempdir2', '/pubcache/path2', 'current');
+      current = WarningsCollection('/a/tempdir2', '/pubcache/path2', 'current');
       current.add('newwarning');
       current.add('morewarning');
       current.add('duplicateoriginalwarning');
-      originalWithDirs = new WarningsCollection(
+      originalWithDirs = WarningsCollection(
           '/a/tempdirFOO', '/pubcache/pathFOO', 'DirsOriginal');
       originalWithDirs.add(
           'originalWarning found in /a/tempdirFOO/some/subdir/program.dart!!!!');
@@ -34,7 +33,7 @@
           'insufficent exclamation mark warning found in /pubcache/pathFOO/some/package/lib/thingy.dart.');
       originalWithDirs.add(
           'another originalWarning found in /a/tempdirFOO/some/subdir/program.dart');
-      currentWithDirs = new WarningsCollection(
+      currentWithDirs = WarningsCollection(
           '/a/tempdirBAR', '/pubcache/pathBAR', 'DirsCurrent');
       currentWithDirs.add(
           'originalWarning found in /a/tempdirBAR/some/subdir/program.dart!!!!');
diff --git a/test/html_generator_test.dart b/test/html_generator_test.dart
index 2fe8cc2..e5cb79b 100644
--- a/test/html_generator_test.dart
+++ b/test/html_generator_test.dart
@@ -81,19 +81,19 @@
 
       test('resources are put into the right place', () {
         Directory output =
-            new Directory(path.join(tempOutput.path, 'static-assets'));
+            Directory(path.join(tempOutput.path, 'static-assets'));
         expect(output, doesExist);
 
         for (var resource in resource_names.map((r) =>
             path.relative(Uri.parse(r).path, from: 'dartdoc/resources'))) {
-          expect(new File(path.join(output.path, resource)), doesExist);
+          expect(File(path.join(output.path, resource)), doesExist);
         }
       });
     });
   });
 }
 
-const Matcher doesExist = const _DoesExist();
+const Matcher doesExist = _DoesExist();
 
 class _DoesExist extends Matcher {
   const _DoesExist();
diff --git a/test/model_test.dart b/test/model_test.dart
index c5c733b..1ef9067 100644
--- a/test/model_test.dart
+++ b/test/model_test.dart
@@ -132,7 +132,7 @@
       expect(typedSet.modelType.typeArguments.map((a) => a.name).toList(),
           equals(['String']));
       expect(typedSet.constantValue,
-          matches(new RegExp(r'const &lt;String&gt;\s?{}')));
+          matches(RegExp(r'const &lt;String&gt;\s?{}')));
     });
   });
 
@@ -147,7 +147,7 @@
     Method invokeToolPrivateLibrary, invokeToolPrivateLibraryOriginal;
     Method invokeToolParentDoc, invokeToolParentDocOriginal;
     final RegExp packageInvocationIndexRegexp =
-        new RegExp(r'PACKAGE_INVOCATION_INDEX: (\d+)');
+        RegExp(r'PACKAGE_INVOCATION_INDEX: (\d+)');
 
     setUpAll(() {
       _NonCanonicalToolUser = fakeLibrary.allClasses
@@ -228,12 +228,10 @@
 
     test('can invoke a tool and pass args and environment', () {
       expect(invokeTool.documentation, contains('--file=<INPUT_FILE>'));
-      expect(
-          invokeTool.documentation,
-          contains(
-              new RegExp(r'--source=lib[/\\]example\.dart_[0-9]+_[0-9]+, ')));
       expect(invokeTool.documentation,
-          contains(new RegExp(r'--package-path=<PACKAGE_PATH>, ')));
+          contains(RegExp(r'--source=lib[/\\]example\.dart_[0-9]+_[0-9]+, ')));
+      expect(invokeTool.documentation,
+          contains(RegExp(r'--package-path=<PACKAGE_PATH>, ')));
       expect(
           invokeTool.documentation, contains('--package-name=test_package, '));
       expect(invokeTool.documentation, contains('--library-name=ex, '));
@@ -243,18 +241,18 @@
           contains(r'''--special= |\[]!@#\"'$%^&*()_+]'''));
       expect(invokeTool.documentation, contains('INPUT: <INPUT_FILE>'));
       expect(invokeTool.documentation,
-          contains(new RegExp('SOURCE_COLUMN: [0-9]+, ')));
+          contains(RegExp('SOURCE_COLUMN: [0-9]+, ')));
       expect(invokeTool.documentation,
-          contains(new RegExp(r'SOURCE_PATH: lib[/\\]example\.dart, ')));
+          contains(RegExp(r'SOURCE_PATH: lib[/\\]example\.dart, ')));
       expect(invokeTool.documentation,
-          contains(new RegExp(r'PACKAGE_PATH: <PACKAGE_PATH>, ')));
+          contains(RegExp(r'PACKAGE_PATH: <PACKAGE_PATH>, ')));
       expect(
           invokeTool.documentation, contains('PACKAGE_NAME: test_package, '));
       expect(invokeTool.documentation, contains('LIBRARY_NAME: ex, '));
       expect(invokeTool.documentation,
           contains('ELEMENT_NAME: ToolUser.invokeTool, '));
       expect(invokeTool.documentation,
-          contains(new RegExp('INVOCATION_INDEX: [0-9]+}')));
+          contains(RegExp('INVOCATION_INDEX: [0-9]+}')));
       expect(invokeTool.documentation, contains('## `Yes it is a [Dog]!`'));
     });
     test('can invoke a tool and add a reference link', () {
@@ -529,7 +527,7 @@
     List<String> containerNames;
 
     setUpAll(() {
-      topLevel = new TestLibraryContainer('topLevel', [], null);
+      topLevel = TestLibraryContainer('topLevel', [], null);
       sortOrderBasic = ['theFirst', 'second', 'fruit'];
       containerNames = [
         'moo',
@@ -544,11 +542,9 @@
     test('multiple containers with specified sort order', () {
       List<LibraryContainer> containers = [];
       for (String name in containerNames) {
-        containers
-            .add(new TestLibraryContainer(name, sortOrderBasic, topLevel));
+        containers.add(TestLibraryContainer(name, sortOrderBasic, topLevel));
       }
-      containers
-          .add(new TestLibraryContainerSdk('SDK', sortOrderBasic, topLevel));
+      containers.add(TestLibraryContainerSdk('SDK', sortOrderBasic, topLevel));
       containers.sort();
       expect(
           containers.map((c) => c.name),
@@ -566,9 +562,9 @@
     test('multiple containers, no specified sort order', () {
       List<LibraryContainer> containers = [];
       for (String name in containerNames) {
-        containers.add(new TestLibraryContainer(name, [], topLevel));
+        containers.add(TestLibraryContainer(name, [], topLevel));
       }
-      containers.add(new TestLibraryContainerSdk('SDK', [], topLevel));
+      containers.add(TestLibraryContainerSdk('SDK', [], topLevel));
       containers.sort();
       expect(
           containers.map((c) => c.name),
@@ -1342,14 +1338,11 @@
       });
 
       test('Verify there is no emoji support', () {
-        TopLevelVariable tpvar = fakeLibrary.constants.firstWhere((t) => t.name == 'hasMarkdownInDoc');
+        TopLevelVariable tpvar = fakeLibrary.constants
+            .firstWhere((t) => t.name == 'hasMarkdownInDoc');
         docsAsHtml = tpvar.documentationAsHtml;
-        expect(
-            docsAsHtml.contains(
-                '3ffe:2a00:100:7031::1'),
-            isTrue);
+        expect(docsAsHtml.contains('3ffe:2a00:100:7031::1'), isTrue);
       });
-
     });
 
     group('doc references', () {
@@ -1687,8 +1680,8 @@
         () {
       Field powers = superAwesomeClass.instanceProperties
           .firstWhere((p) => p.name == 'powers');
-      Iterable<Match> matches = new RegExp('In the super class')
-          .allMatches(powers.documentationAsHtml);
+      Iterable<Match> matches =
+          RegExp('In the super class').allMatches(powers.documentationAsHtml);
       expect(matches, hasLength(1));
     });
 
@@ -3217,7 +3210,7 @@
     test('PRETTY_COLORS', () {
       expect(
           prettyColorsConstant.constantValue,
-          matches(new RegExp(
+          matches(RegExp(
               r"const &lt;String&gt;\s?\[COLOR_GREEN, COLOR_ORANGE, &#39;blue&#39;\]")));
     });
 
@@ -3708,8 +3701,8 @@
       r"x100$",
     ];
     for (var i = 1; i < names.length; i++) {
-      var a = new StringName(names[i - 1]);
-      var b = new StringName(names[i]);
+      var a = StringName(names[i - 1]);
+      var b = StringName(names[i]);
       test('"$a" < "$b"', () {
         expect(byName(a, a), 0);
         expect(byName(b, b), 0);
diff --git a/test/package_meta_test.dart b/test/package_meta_test.dart
index 2b2452d..dd231b6 100644
--- a/test/package_meta_test.dart
+++ b/test/package_meta_test.dart
@@ -16,7 +16,7 @@
 
     setUp(() {
       var d = Directory.systemTemp.createTempSync('test_package_not_valid');
-      p = new PackageMeta.fromDir(d);
+      p = PackageMeta.fromDir(d);
     });
 
     test('is not valid', () {
@@ -25,7 +25,7 @@
   });
 
   group('PackageMeta for the test package', () {
-    PackageMeta p = new PackageMeta.fromDir(new Directory(
+    PackageMeta p = PackageMeta.fromDir(Directory(
         path.join(Directory.current.path, 'testing', 'test_package')));
 
     test('readme with corrupt UTF-8 loads without throwing', () {
@@ -35,7 +35,7 @@
   });
 
   group('PackageMeta.fromDir for this package', () {
-    PackageMeta p = new PackageMeta.fromDir(Directory.current);
+    PackageMeta p = PackageMeta.fromDir(Directory.current);
 
     test('has a name', () {
       expect(p.name, 'dartdoc');
@@ -79,7 +79,7 @@
   });
 
   group('PackageMeta.fromSdk', () {
-    PackageMeta p = new PackageMeta.fromDir(defaultSdkDir);
+    PackageMeta p = PackageMeta.fromDir(defaultSdkDir);
 
     test('has a name', () {
       expect(p.name, 'Dart');
diff --git a/test/source_linker_test.dart b/test/source_linker_test.dart
index e31014a..7c68a8d 100644
--- a/test/source_linker_test.dart
+++ b/test/source_linker_test.dart
@@ -11,7 +11,7 @@
 void main() {
   group('Source link computations', () {
     test('Basic usage', () {
-      var sourceLinkerHref = () => new SourceLinker(
+      var sourceLinkerHref = () => SourceLinker(
               excludes: [],
               lineNumber: 14,
               root: 'path',
@@ -24,7 +24,7 @@
     });
 
     test('Throw when missing a revision if one is in the template', () {
-      var sourceLinkerHref = () => new SourceLinker(
+      var sourceLinkerHref = () => SourceLinker(
               excludes: [],
               lineNumber: 20,
               root: 'path',
@@ -35,7 +35,7 @@
     });
 
     test('Allow a missing revision as long as it is not in the template', () {
-      var sourceLinkerHref = () => new SourceLinker(
+      var sourceLinkerHref = () => SourceLinker(
               excludes: [],
               lineNumber: 71,
               root: 'path',
@@ -47,7 +47,7 @@
     });
 
     test('Throw if only revision specified', () {
-      var sourceLinkerHref = () => new SourceLinker(
+      var sourceLinkerHref = () => SourceLinker(
             excludes: [],
             lineNumber: 20,
             revision: '12345',
@@ -56,7 +56,7 @@
     });
 
     test('Hide a path inside an exclude', () {
-      var sourceLinkerHref = () => new SourceLinker(
+      var sourceLinkerHref = () => SourceLinker(
               excludes: ['path/under/exclusion'],
               lineNumber: 14,
               root: 'path',
@@ -68,7 +68,7 @@
     });
 
     test('Check that paths outside exclusions work', () {
-      var sourceLinkerHref = () => new SourceLinker(
+      var sourceLinkerHref = () => SourceLinker(
               excludes: ['path/under/exclusion'],
               lineNumber: 14,
               root: 'path',
diff --git a/test/src/utils.dart b/test/src/utils.dart
index 33df91a..8655f8f 100644
--- a/test/src/utils.dart
+++ b/test/src/utils.dart
@@ -14,9 +14,9 @@
 import 'package:dartdoc/src/package_meta.dart';
 import 'package:path/path.dart' as path;
 
-final RegExp quotables = new RegExp(r'[ "\r\n\$]');
+final RegExp quotables = RegExp(r'[ "\r\n\$]');
 final RegExp observatoryPortRegexp =
-    new RegExp(r'^Observatory listening on http://.*:(\d+)');
+    RegExp(r'^Observatory listening on http://.*:(\d+)');
 
 Directory sdkDir;
 PackageMeta sdkPackageMeta;
@@ -27,26 +27,25 @@
 PackageGraph testPackageGraphErrors;
 PackageGraph testPackageGraphSdk;
 
-final Directory testPackageBadDir = new Directory('testing/test_package_bad');
-final Directory testPackageDir = new Directory('testing/test_package');
+final Directory testPackageBadDir = Directory('testing/test_package_bad');
+final Directory testPackageDir = Directory('testing/test_package');
 final Directory testPackageExperimentsDir =
-    new Directory('testing/test_package_experiments');
+    Directory('testing/test_package_experiments');
 final Directory testPackageMinimumDir =
-    new Directory('testing/test_package_minimum');
+    Directory('testing/test_package_minimum');
 final Directory testPackageWithEmbedderYaml =
-    new Directory('testing/test_package_embedder_yaml');
+    Directory('testing/test_package_embedder_yaml');
 final Directory testPackageWithNoReadme =
-    new Directory('testing/test_package_small');
+    Directory('testing/test_package_small');
 final Directory testPackageIncludeExclude =
-    new Directory('testing/test_package_include_exclude');
+    Directory('testing/test_package_include_exclude');
 final Directory testPackageImportExportError =
-    new Directory('testing/test_package_import_export_error');
-final Directory testPackageOptions =
-    new Directory('testing/test_package_options');
+    Directory('testing/test_package_import_export_error');
+final Directory testPackageOptions = Directory('testing/test_package_options');
 final Directory testPackageOptionsImporter =
-    new Directory('testing/test_package_options_importer');
+    Directory('testing/test_package_options_importer');
 final Directory testPackageToolError =
-    new Directory('testing/test_package_tool_error');
+    Directory('testing/test_package_tool_error');
 
 /// Convenience factory to build a [DartdocGeneratorOptionContext] and associate
 /// it with a [DartdocOptionSet] based on the current working directory and/or
@@ -56,7 +55,7 @@
   DartdocOptionSet optionSet = await DartdocOptionSet.fromOptionGenerators(
       'dartdoc', [createDartdocOptions, createGeneratorOptions]);
   optionSet.parseArguments(argv);
-  return new DartdocGeneratorOptionContext(optionSet, null);
+  return DartdocGeneratorOptionContext(optionSet, null);
 }
 
 /// Convenience factory to build a [DartdocOptionContext] and associate it with a
@@ -65,12 +64,12 @@
   DartdocOptionSet optionSet = await DartdocOptionSet.fromOptionGenerators(
       'dartdoc', [createDartdocOptions]);
   optionSet.parseArguments(argv);
-  return new DartdocOptionContext(optionSet, Directory.current);
+  return DartdocOptionContext(optionSet, Directory.current);
 }
 
 void init({List<String> additionalArguments}) async {
   sdkDir = defaultSdkDir;
-  sdkPackageMeta = new PackageMeta.fromDir(sdkDir);
+  sdkPackageMeta = PackageMeta.fromDir(sdkDir);
   additionalArguments ??= <String>[];
 
   testPackageGraph = await bootBasicPackage(
@@ -98,16 +97,16 @@
 }
 
 Future<PackageGraph> bootSdkPackage() async {
-  return new PackageBuilder(await contextFromArgv(['--input', sdkDir.path]))
+  return PackageBuilder(await contextFromArgv(['--input', sdkDir.path]))
       .buildPackageGraph();
 }
 
 Future<PackageGraph> bootBasicPackage(
     String dirPath, List<String> excludeLibraries,
     {List<String> additionalArguments}) async {
-  Directory dir = new Directory(dirPath);
+  Directory dir = Directory(dirPath);
   additionalArguments ??= <String>[];
-  return new PackageBuilder(await contextFromArgv([
+  return PackageBuilder(await contextFromArgv([
             '--input',
             dir.path,
             '--sdk-dir',
@@ -142,7 +141,7 @@
   static Directory get tempDir {
     if (_tempDir == null) {
       if (Platform.environment['DARTDOC_COVERAGE_DATA'] != null) {
-        _tempDir = new Directory(Platform.environment['DARTDOC_COVERAGE_DATA']);
+        _tempDir = Directory(Platform.environment['DARTDOC_COVERAGE_DATA']);
       } else {
         _tempDir = Directory.systemTemp.createTempSync('dartdoc_coverage_data');
       }
@@ -192,7 +191,7 @@
             executable == Platform.resolvedExecutable,
         'Must use dart executable for tracking coverage');
 
-    Completer<String> portAsString = new Completer();
+    Completer<String> portAsString = Completer();
     void parsePortAsString(String line) {
       if (!portAsString.isCompleted && coverageEnabled) {
         Match m = observatoryPortRegexp.matchAsPrefix(line);
@@ -205,7 +204,7 @@
     Completer<Iterable<Map>> coverageResult;
 
     if (coverageEnabled) {
-      coverageResult = new Completer();
+      coverageResult = Completer();
       // This must be added before awaiting in this method.
       coverageResults.add(coverageResult.future);
       arguments = [
@@ -297,7 +296,7 @@
       }
       if (result != null) {
         if (jsonObjects == null) {
-          jsonObjects = new List();
+          jsonObjects = List();
         }
         jsonObjects.add(result);
         if (result.containsKey('message')) {
@@ -363,7 +362,7 @@
 
     int exitCode = await process.exitCode;
     if (exitCode != 0) {
-      throw new ProcessException(executable, arguments,
+      throw ProcessException(executable, arguments,
           "SubprocessLauncher got non-zero exitCode: $exitCode", exitCode);
     }
     return jsonObjects;
diff --git a/test/template_test.dart b/test/template_test.dart
index 91de138..575e5d2 100644
--- a/test/template_test.dart
+++ b/test/template_test.dart
@@ -19,7 +19,7 @@
         if (sitemap == null) {
           var templatePath =
               path.join(path.current, 'test/templates/sitemap.xml');
-          File tmplFile = new File(templatePath);
+          File tmplFile = File(templatePath);
           var siteMapTmpl = tmplFile.readAsStringSync();
           sitemap = Template(siteMapTmpl);
         }
diff --git a/test/tool_runner_test.dart b/test/tool_runner_test.dart
index 6087faa..da33b54 100644
--- a/test/tool_runner_test.dart
+++ b/test/tool_runner_test.dart
@@ -79,10 +79,10 @@
     // yaml map (which would fail on a missing executable), or a file is deleted
     // during execution,it might, so we test it.
     toolMap.tools.addAll({
-      'missing': new ToolDefinition(['/a/missing/executable'], null, "missing"),
+      'missing': ToolDefinition(['/a/missing/executable'], null, "missing"),
     });
 
-    runner = new ToolRunner(toolMap);
+    runner = ToolRunner(toolMap);
     errorCallback = (String message) => errors.add(message);
   });
   tearDownAll(() {
diff --git a/test/utils_test.dart b/test/utils_test.dart
index 9ef899c..5d3dd21 100644
--- a/test/utils_test.dart
+++ b/test/utils_test.dart
@@ -21,7 +21,7 @@
       // Trim the left margin of every following line.
       .replaceAll('\n$multilineStringMargin  ', '\n')
       // Trim the last line.
-      .replaceFirst(new RegExp('\n$multilineStringMargin\$'), '');
+      .replaceFirst(RegExp('\n$multilineStringMargin\$'), '');
 
   void expectCorrectDocumentation() =>
       expect(stripComments(trimMargin(comment)), trimMargin(documentation));
diff --git a/test/warnings_test.dart b/test/warnings_test.dart
index a5b98e0..3dc54b2 100644
--- a/test/warnings_test.dart
+++ b/test/warnings_test.dart
@@ -25,12 +25,12 @@
       ..createSync();
     testPackageThree = Directory(path.join(tempDir.path, 'test_package_three'))
       ..createSync();
-    pubspecYamlOne = new File(path.join(testPackageOne.path, 'pubspec.yaml'));
+    pubspecYamlOne = File(path.join(testPackageOne.path, 'pubspec.yaml'));
     pubspecYamlOne.writeAsStringSync('name: test_package_one');
-    pubspecYamlTwo = new File(path.join(testPackageTwo.path, 'pubspec.yaml'));
+    pubspecYamlTwo = File(path.join(testPackageTwo.path, 'pubspec.yaml'));
     pubspecYamlTwo.writeAsStringSync('name: test_package_two');
     dartdocYamlThree =
-        new File(path.join(testPackageThree.path, 'dartdoc_options.yaml'));
+        File(path.join(testPackageThree.path, 'dartdoc_options.yaml'));
     dartdocYamlThree.writeAsStringSync('''
 dartdoc:
   warnings:
@@ -41,8 +41,7 @@
   ignore:
     - ambiguous-reexport  
     ''');
-    pubspecYamlThree =
-        new File(path.join(testPackageThree.path, 'pubspec.yaml'));
+    pubspecYamlThree = File(path.join(testPackageThree.path, 'pubspec.yaml'));
     pubspecYamlThree.writeAsStringSync('name: test_package_three');
   });
 
diff --git a/testing/test_package/bin/drill.dart b/testing/test_package/bin/drill.dart
index 9149504..8217cbf 100644
--- a/testing/test_package/bin/drill.dart
+++ b/testing/test_package/bin/drill.dart
@@ -22,12 +22,12 @@
   // Normalize the filenames, since they include random
   // and system-specific components, but make sure they
   // match the patterns we expect.
-  RegExp inputFileRegExp = new RegExp(
-      r'(--file=)?(.*)([/\\]dartdoc_tools_)([^/\\]+)([/\\]input_)(\d+)');
-  RegExp packagePathRegExp = new RegExp(
-      r'(--package-path=)?(.+dartdoc.*[/\\]testing[/\\]test_package)');
+  RegExp inputFileRegExp =
+      RegExp(r'(--file=)?(.*)([/\\]dartdoc_tools_)([^/\\]+)([/\\]input_)(\d+)');
+  RegExp packagePathRegExp =
+      RegExp(r'(--package-path=)?(.+dartdoc.*[/\\]testing[/\\]test_package)');
 
-  final Set<String> variableNames = new Set<String>.from([
+  final Set<String> variableNames = Set<String>.from([
     'INPUT',
     'SOURCE_COLUMN',
     'SOURCE_PATH',
@@ -56,9 +56,9 @@
     }
   }).toList();
   RegExp snapshotCacheRegExp =
-      new RegExp(r'.*[/\\]dartdoc_snapshot_cache_[^/\\]+[/\\]snapshot_0');
+      RegExp(r'.*[/\\]dartdoc_snapshot_cache_[^/\\]+[/\\]snapshot_0');
   RegExp snapshotFirstRegExp =
-      new RegExp(r'.*[/\\]testing[/\\]test_package[/\\]bin[/\\]drill.dart$');
+      RegExp(r'.*[/\\]testing[/\\]test_package[/\\]bin[/\\]drill.dart$');
   if (snapshotCacheRegExp.hasMatch(Platform.script.path)) {
     print('Script location is in snapshot cache.');
   } else if (snapshotFirstRegExp.hasMatch(Platform.script.path)) {
@@ -68,7 +68,7 @@
   }
   print('Args: $normalized');
   if (args['file'] != null) {
-    File file = new File(args['file']);
+    File file = File(args['file']);
     if (file.existsSync()) {
       List<String> lines = file.readAsLinesSync();
       for (String line in lines) {
diff --git a/testing/test_package/bin/setup.dart b/testing/test_package/bin/setup.dart
index f67b442..a04713d 100644
--- a/testing/test_package/bin/setup.dart
+++ b/testing/test_package/bin/setup.dart
@@ -10,7 +10,7 @@
 void main(List<String> args) {
   assert(args.isNotEmpty);
   // Just touch the file given on the command line.
-  File setupFile = new File(args[0])..createSync(recursive: true);
+  File setupFile = File(args[0])..createSync(recursive: true);
   setupFile.writeAsStringSync('setup');
   exit(0);
 }
diff --git a/testing/test_package/lib/example.dart b/testing/test_package/lib/example.dart
index ea392c6..b464043 100644
--- a/testing/test_package/lib/example.dart
+++ b/testing/test_package/lib/example.dart
@@ -46,7 +46,6 @@
 /// {@endtemplate}
 bool get isCheck => true;
 
-
 /// A custom annotation.
 class aThingToDo {
   final String who;
@@ -55,12 +54,8 @@
   const aThingToDo(this.who, this.what);
 }
 
-const ConstantCat MY_CAT = const ConstantCat('tabby');
-const List<String> PRETTY_COLORS = const <String>[
-  COLOR_GREEN,
-  COLOR_ORANGE,
-  'blue'
-];
+const ConstantCat MY_CAT = ConstantCat('tabby');
+const List<String> PRETTY_COLORS = <String>[COLOR_GREEN, COLOR_ORANGE, 'blue'];
 @deprecated
 int deprecatedField;
 
@@ -157,7 +152,7 @@
   Apple();
 
   factory Apple.fromString(String s) {
-    return new Apple._internal(s);
+    return Apple._internal(s);
   }
 
   Apple._internal(this._s2);
@@ -300,7 +295,7 @@
   static const String aStaticConstField = "A Constant Dog";
 
   /// Verify link substitution in constants (#1535)
-  static const ShortName aName = const ExtendedShortName("hello there");
+  static const ShortName aName = ExtendedShortName("hello there");
 
   @protected
   final int aProtectedFinalField;
@@ -321,7 +316,7 @@
   @override
   bool get isImplemented => true;
 
-  int get aGetterReturningRandomThings => (new Random()).nextInt(50);
+  int get aGetterReturningRandomThings => (Random()).nextInt(50);
 
   @override
   operator ==(other) => other is Dog && name == other.name;
@@ -330,12 +325,12 @@
 
   @deprecated
   List<Apple> getClassA() {
-    return [new Apple()];
+    return [Apple()];
   }
 
   @Deprecated('before v27.3')
   List<Dog> getAnotherClassD() {
-    return [new Dog()];
+    return [Dog()];
   }
 
   /// A tasty static + final property.
@@ -440,7 +435,7 @@
 
   @Deprecated("Internal use")
   static Dog createDog(String s) {
-    return new Dog.deprecatedCreate(s);
+    return Dog.deprecatedCreate(s);
   }
 
   @override
@@ -511,8 +506,8 @@
 ///    [MyError] and [MyException] and
 ///    [List<int>] foo bar.
 class ShapeType extends _RetainedEnum {
-  static const ShapeType rect = const ShapeType._internal("Rect");
-  static const ShapeType ellipse = const ShapeType._internal("Ellipse");
+  static const ShapeType rect = ShapeType._internal("Rect");
+  static const ShapeType ellipse = ShapeType._internal("Ellipse");
 
   const ShapeType._internal(String name) : super(name);
 }
diff --git a/testing/test_package/lib/fake.dart b/testing/test_package/lib/fake.dart
index 5797624..5e828e7 100644
--- a/testing/test_package/lib/fake.dart
+++ b/testing/test_package/lib/fake.dart
@@ -180,8 +180,8 @@
 /// | [foo]                | Not really   | "blah"    |
 /// | [bar]                | Maybe        | "stuff"   |
 class DocumentWithATable {
-  static const DocumentWithATable foo = const DocumentWithATable();
-  static const DocumentWithATable bar = const DocumentWithATable();
+  static const DocumentWithATable foo = DocumentWithATable();
+  static const DocumentWithATable bar = DocumentWithATable();
 
   const DocumentWithATable();
   void aMethod(String parameter) {}
@@ -245,7 +245,7 @@
   String aProperty;
 }
 
-const _APrivateConstClass CUSTOM_CLASS_PRIVATE = const _APrivateConstClass();
+const _APrivateConstClass CUSTOM_CLASS_PRIVATE = _APrivateConstClass();
 
 /// Type inference mixing with anonymous functions.
 final importantComputations = {
@@ -256,7 +256,7 @@
 };
 
 // No dart docs on purpose. Also, a non-primitive const class.
-const ConstantClass CUSTOM_CLASS = const ConstantClass('custom');
+const ConstantClass CUSTOM_CLASS = ConstantClass('custom');
 
 /// Up is a direction.
 ///
@@ -510,7 +510,7 @@
   @override
 
   /// Getter doc for explicitGetterImplicitSetter
-  List<int> get explicitGetterImplicitSetter => new List<int>();
+  List<int> get explicitGetterImplicitSetter => List<int>();
 
   myCoolTypedef _aFunction;
 
@@ -546,7 +546,7 @@
   set explicitSetter(f(int bar, Cool baz, List<int> macTruck)) {}
 
   /// This property has some docs, too.
-  final Set finalProperty = new Set();
+  final Set finalProperty = Set();
 
   Map implicitReadWrite;
 
@@ -661,8 +661,8 @@
   final int index;
   const Foo2(this.index);
 
-  static const Foo2 BAR = const Foo2(0);
-  static const Foo2 BAZ = const Foo2(1);
+  static const Foo2 BAR = Foo2(0);
+  static const Foo2 BAZ = Foo2(1);
 }
 
 class OtherGenericsThing<A> {
@@ -999,7 +999,7 @@
 abstract class _MIEEPrivateOverride<K, V> implements MIEEThing<K, V> {
   // ignore: annotate_overrides
   void operator []=(K key, V value) {
-    throw new UnsupportedError("Never use this");
+    throw UnsupportedError("Never use this");
   }
 }
 
@@ -1035,7 +1035,8 @@
 }
 
 /// The method [invokeToolParentDoc] gets its documentation from an interface class.
-abstract class CanonicalPrivateInheritedToolUser implements ImplementingClassForTool {
+abstract class CanonicalPrivateInheritedToolUser
+    implements ImplementingClassForTool {
   @override
   void invokeToolParentDoc() {
     print('hello, tool world');
diff --git a/testing/test_package_bad/lib/test_package_bad.dart b/testing/test_package_bad/lib/test_package_bad.dart
index 722b02f..72e4c62 100644
--- a/testing/test_package_bad/lib/test_package_bad.dart
+++ b/testing/test_package_bad/lib/test_package_bad.dart
@@ -4,5 +4,5 @@
 void myTestFunction() {
   print('one');
   print('two');
-  Foo foo = new Foo('three');
+  Foo foo = Foo('three');
 }
diff --git a/testing/test_package_experiments/lib/main.dart b/testing/test_package_experiments/lib/main.dart
index 23c65c0..d037519 100644
--- a/testing/test_package_experiments/lib/main.dart
+++ b/testing/test_package_experiments/lib/main.dart
@@ -1,5 +1,5 @@
 const inferredTypeSet = {1, 2.5, 3};
-const Set<int> specifiedSet = const {};
+const Set<int> specifiedSet = {};
 const untypedMap = {};
 const typedSet = <String>{};
 
@@ -10,7 +10,8 @@
   const AClassContainingLiterals(this.value1, this.value2);
 
   @override
-  bool operator==(Object other) => other is AClassContainingLiterals && value1 == other.value1;
+  bool operator ==(Object other) =>
+      other is AClassContainingLiterals && value1 == other.value1;
 }
 
-const aComplexSet = {AClassContainingLiterals(3, 5)};
\ No newline at end of file
+const aComplexSet = {AClassContainingLiterals(3, 5)};
diff --git a/tool/builder.dart b/tool/builder.dart
index a62b693..fa92cef 100644
--- a/tool/builder.dart
+++ b/tool/builder.dart
@@ -11,7 +11,7 @@
 String _resourcesFile(Iterable<String> packagePaths) => '''
 // WARNING: This file is auto-generated. Do not taunt.
 
-const List<String> resource_names = const [
+const List<String> resource_names = [
 ${packagePaths.map((p) => "  '$p'").join(',\n')}
 ];
 ''';
@@ -20,7 +20,7 @@
   final BuilderOptions builderOptions;
   ResourceBuilder(this.builderOptions);
 
-  static final _allResources = new Glob('lib/resources/**');
+  static final _allResources = Glob('lib/resources/**');
   @override
   Future build(BuildStep buildStep) async {
     var packagePaths = <String>[];
@@ -29,15 +29,15 @@
     }
     packagePaths.sort();
     await buildStep.writeAsString(
-        new AssetId(buildStep.inputId.package,
+        AssetId(buildStep.inputId.package,
             path.url.join('lib', 'src', 'html', 'resources.g.dart')),
         _resourcesFile(packagePaths));
   }
 
   @override
   final Map<String, List<String>> buildExtensions = const {
-    r'$lib$': const ['src/html/resources.g.dart']
+    r'$lib$': ['src/html/resources.g.dart']
   };
 }
 
-Builder resourceBuilder(BuilderOptions options) => new ResourceBuilder(options);
+Builder resourceBuilder(BuilderOptions options) => ResourceBuilder(options);
diff --git a/tool/doc_packages.dart b/tool/doc_packages.dart
index 20903c9..5a8ea81 100644
--- a/tool/doc_packages.dart
+++ b/tool/doc_packages.dart
@@ -47,7 +47,7 @@
 }
 
 ArgParser _createArgsParser() {
-  var parser = new ArgParser();
+  var parser = ArgParser();
   parser.addFlag('help',
       abbr: 'h', negatable: false, help: 'Show command help.');
   parser.addFlag('list', help: 'Show available pub packages', negatable: false);
@@ -125,7 +125,7 @@
   return http
       .get('https://pub.dartlang.org/packages.json?page=${page}')
       .then((response) {
-    return new List<String>.from(json.decode(response.body)['packages']);
+    return List<String>.from(json.decode(response.body)['packages']);
   });
 }
 
@@ -134,9 +134,9 @@
     return http.get(p).then((response) {
       var decodedJson = json.decode(response.body);
       String name = decodedJson['name'];
-      List<Version> versions = new List<Version>.from(
-          decodedJson['versions'].map((v) => new Version.parse(v)));
-      return new PackageInfo(name, Version.primary(versions));
+      List<Version> versions = List<Version>.from(
+          decodedJson['versions'].map((v) => Version.parse(v)));
+      return PackageInfo(name, Version.primary(versions));
     });
   }).toList();
 
@@ -148,24 +148,23 @@
 /// Generate the docs for the given package into _rootDir. Return whether
 /// generation was performed or was skipped (due to an older package).
 Future<bool> _generateFor(PackageInfo package) async {
-  _logBuffer = new StringBuffer();
+  _logBuffer = StringBuffer();
 
   // Get the package archive (tar zxvf foo.tar.gz).
   var response = await http.get(package.archiveUrl);
   if (response.statusCode != 200) throw response;
 
-  Directory output = new Directory('${_rootDir}/${package.name}');
+  Directory output = Directory('${_rootDir}/${package.name}');
   output.createSync(recursive: true);
 
   try {
-    new File(output.path + '/archive.tar.gz')
-        .writeAsBytesSync(response.bodyBytes);
+    File(output.path + '/archive.tar.gz').writeAsBytesSync(response.bodyBytes);
 
     await _exec('tar', ['zxvf', 'archive.tar.gz'],
         cwd: output.path, quiet: true);
 
     // Rule out any old packages (old sdk constraints).
-    File pubspecFile = new File(output.path + '/pubspec.yaml');
+    File pubspecFile = File(output.path + '/pubspec.yaml');
     var pubspecInfo = loadYaml(pubspecFile.readAsStringSync());
 
     // Check for old versions.
@@ -176,7 +175,7 @@
 
     // Run pub get.
     await _exec('pub', ['get'],
-        cwd: output.path, timeout: new Duration(seconds: 30));
+        cwd: output.path, timeout: Duration(seconds: 30));
 
     // Run dartdoc.
     await _exec('dart', ['../../bin/dartdoc.dart'], cwd: output.path);
@@ -187,8 +186,7 @@
     _log(st.toString());
     rethrow;
   } finally {
-    new File(output.path + '/output.txt')
-        .writeAsStringSync(_logBuffer.toString());
+    File(output.path + '/output.txt').writeAsStringSync(_logBuffer.toString());
   }
 }
 
@@ -224,12 +222,12 @@
   if (environment != null) {
     var sdk = environment['sdk'];
     if (sdk != null) {
-      VersionConstraint constraint = new VersionConstraint.parse(sdk);
+      VersionConstraint constraint = VersionConstraint.parse(sdk);
       String version = Platform.version;
       if (version.contains(' ')) {
         version = version.substring(0, version.indexOf(' '));
       }
-      if (!constraint.allows(new Version.parse(version))) {
+      if (!constraint.allows(Version.parse(version))) {
         _log('sdk constraint = ${constraint}');
         return true;
       } else {
diff --git a/tool/grind.dart b/tool/grind.dart
index 8309e30..2f05c76 100644
--- a/tool/grind.dart
+++ b/tool/grind.dart
@@ -24,13 +24,13 @@
 
 /// Kind of an inefficient grepper for now.
 void expectFileContains(String path, List<Pattern> items) {
-  File source = new File(path);
+  File source = File(path);
   if (!source.existsSync()) {
-    throw new GrindTestFailure('file not found: ${path}');
+    throw 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}');
+    if (!File(path).readAsStringSync().contains(item)) {
+      throw GrindTestFailure('Can not find ${item} in ${path}');
     }
   }
 }
@@ -41,7 +41,7 @@
 
 /// Run no more than the number of processors available in parallel.
 final MultiFutureTracker testFutures =
-    new MultiFutureTracker(Platform.numberOfProcessors);
+    MultiFutureTracker(Platform.numberOfProcessors);
 
 // Directory.systemTemp is not a constant.  So wrap it.
 Directory createTempSync(String prefix) =>
@@ -58,38 +58,37 @@
   if (_cleanFlutterRepo == null) {
     // No await is allowed between check of _cleanFlutterRepo and its assignment,
     // to prevent reentering this function.
-    _cleanFlutterRepo = new Completer();
+    _cleanFlutterRepo = Completer();
 
     // Figure out where the repository is supposed to be and lock updates for
     // it.
     await cleanFlutterDir.parent.create(recursive: true);
     assert(_lockFuture == null);
-    _lockFuture = new File(path.join(cleanFlutterDir.parent.path, 'lock'))
+    _lockFuture = File(path.join(cleanFlutterDir.parent.path, 'lock'))
         .openSync(mode: FileMode.write)
         .lock();
     await _lockFuture;
     File lastSynced =
-        new File(path.join(cleanFlutterDir.parent.path, 'lastSynced'));
+        File(path.join(cleanFlutterDir.parent.path, 'lastSynced'));
     FlutterRepo newRepo =
-        new FlutterRepo.fromPath(cleanFlutterDir.path, {}, 'clean');
+        FlutterRepo.fromPath(cleanFlutterDir.path, {}, 'clean');
 
     // We have a repository, but is it up to date?
     DateTime lastSyncedTime;
     if (lastSynced.existsSync()) {
-      lastSyncedTime = new DateTime.fromMillisecondsSinceEpoch(
+      lastSyncedTime = DateTime.fromMillisecondsSinceEpoch(
           int.parse(lastSynced.readAsStringSync()));
     }
     if (lastSyncedTime == null ||
-        new DateTime.now().difference(lastSyncedTime) >
-            new Duration(hours: 4)) {
+        DateTime.now().difference(lastSyncedTime) > Duration(hours: 4)) {
       // Rebuild the repository.
       if (cleanFlutterDir.existsSync()) {
         cleanFlutterDir.deleteSync(recursive: true);
       }
       cleanFlutterDir.createSync(recursive: true);
       await newRepo._init();
-      await lastSynced.writeAsString(
-          (new DateTime.now()).millisecondsSinceEpoch.toString());
+      await lastSynced
+          .writeAsString((DateTime.now()).millisecondsSinceEpoch.toString());
     }
     _cleanFlutterRepo.complete(newRepo);
   }
@@ -109,7 +108,7 @@
 
 Directory get sdkDocsDir => _sdkDocsDir ??= createTempSync('sdkdocs');
 
-Directory cleanFlutterDir = new Directory(
+Directory cleanFlutterDir = Directory(
     path.join(resolveTildePath('~/.dartdoc_grinder'), 'cleanFlutter'));
 
 Directory _flutterDir;
@@ -117,10 +116,10 @@
 Directory get flutterDir => _flutterDir ??= createTempSync('flutter');
 
 Directory get testPackage =>
-    new Directory(path.joinAll(['testing', 'test_package']));
+    Directory(path.joinAll(['testing', 'test_package']));
 
 Directory get pluginPackage =>
-    new Directory(path.joinAll(['testing', 'test_package_flutter_plugin']));
+    Directory(path.joinAll(['testing', 'test_package_flutter_plugin']));
 
 Directory _testPackageDocsDir;
 
@@ -147,7 +146,7 @@
 /// If DARTDOC_PARAMS is set, add given parameters to the list.
 List<String> get extraDartdocParameters {
   if (_extraDartdocParams == null) {
-    final RegExp whitespace = new RegExp(r'\s+');
+    final RegExp whitespace = RegExp(r'\s+');
     _extraDartdocParams = [];
     if (Platform.environment.containsKey('DARTDOC_PARAMS')) {
       _extraDartdocParams
@@ -158,15 +157,15 @@
 }
 
 final Directory flutterDirDevTools =
-    new Directory(path.join(flutterDir.path, 'dev', 'tools'));
+    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(path.join(pubCache.path, 'bin'));
+  final Directory pubCacheBin = Directory(path.join(pubCache.path, 'bin'));
   pubCacheBin.createSync();
-  return new Map.fromIterables([
+  return Map.fromIterables([
     'PUB_CACHE',
     'PATH'
   ], [
@@ -176,16 +175,16 @@
 }
 
 // TODO(jcollins-g): make a library out of this
-final FilePath _pkgDir = new FilePath('lib/src/third_party/pkg');
+final FilePath _pkgDir = FilePath('lib/src/third_party/pkg');
 final FilePath _mustache4dartDir =
-    new FilePath('lib/src/third_party/pkg/mustache4dart');
+    FilePath('lib/src/third_party/pkg/mustache4dart');
 final RegExp _mustache4dartPatches =
-    new RegExp(r'^\d\d\d-mustache4dart-.*[.]patch$');
+    RegExp(r'^\d\d\d-mustache4dart-.*[.]patch$');
 
 @Task('Update third_party forks')
 void updateThirdParty() async {
   run('rm', arguments: ['-rf', _mustache4dartDir.path]);
-  new Directory(_pkgDir.path).createSync(recursive: true);
+  Directory(_pkgDir.path).createSync(recursive: true);
   run('git', arguments: [
     'clone',
     '--branch',
@@ -195,7 +194,7 @@
     _mustache4dartDir.path,
   ]);
   run('rm', arguments: ['-rf', path.join(_mustache4dartDir.path, '.git')]);
-  for (String patchFileName in new Directory(_pkgDir.path)
+  for (String patchFileName in Directory(_pkgDir.path)
       .listSync()
       .map((e) => path.basename(e.path))
       .where((String filename) => _mustache4dartPatches.hasMatch(filename))
@@ -213,7 +212,7 @@
 
 @Task('Analyze dartdoc to ensure there are no errors and warnings')
 void analyze() async {
-  await new SubprocessLauncher('analyze').runStreamed(
+  await SubprocessLauncher('analyze').runStreamed(
     sdkBin('dartanalyzer'),
     [
       '--fatal-warnings',
@@ -236,8 +235,7 @@
 @Task('Generate docs for the Dart SDK')
 Future buildSdkDocs() async {
   log('building SDK docs');
-  await _buildSdkDocs(
-      sdkDocsDir.path, new Future.value(Directory.current.path));
+  await _buildSdkDocs(sdkDocsDir.path, Future.value(Directory.current.path));
 }
 
 class WarningsCollection {
@@ -247,7 +245,7 @@
   final String pubCachePath;
 
   WarningsCollection(this.tempDir, this.pubCachePath, this.branch)
-      : this.warningKeyCounts = new Map();
+      : this.warningKeyCounts = Map();
 
   static const String kPubCachePathReplacement = '_xxxPubDirectoryxxx_';
   static const String kTempDirReplacement = '_xxxTempDirectoryxxx_';
@@ -276,12 +274,12 @@
 
   /// Output formatter for comparing warnings.  [this] is the original.
   String getPrintableWarningDelta(String title, WarningsCollection current) {
-    StringBuffer printBuffer = new StringBuffer();
-    Set<String> quantityChangedOuts = new Set();
-    Set<String> onlyOriginal = new Set();
-    Set<String> onlyCurrent = new Set();
-    Set<String> identical = new Set();
-    Set<String> allKeys = new Set.from([]
+    StringBuffer printBuffer = StringBuffer();
+    Set<String> quantityChangedOuts = Set();
+    Set<String> onlyOriginal = Set();
+    Set<String> onlyCurrent = Set();
+    Set<String> identical = Set();
+    Set<String> allKeys = Set.from([]
       ..addAll(warningKeyCounts.keys)
       ..addAll(current.warningKeyCounts.keys));
 
@@ -336,7 +334,7 @@
 WarningsCollection jsonMessageIterableToWarnings(Iterable<Map> messageIterable,
     String tempPath, String pubDir, String branch) {
   WarningsCollection warningTexts =
-      new WarningsCollection(tempPath, pubDir, branch);
+      WarningsCollection(tempPath, pubDir, branch);
   if (messageIterable == null) return warningTexts;
   for (Map<String, dynamic> message in messageIterable) {
     if (message.containsKey('level') &&
@@ -354,7 +352,7 @@
       Directory.systemTemp.createTempSync('dartdoc-comparison-sdkdocs');
   Future originalDartdoc = createComparisonDartdoc();
   Future currentDartdocSdkBuild = _buildSdkDocs(
-      sdkDocsDir.path, new Future.value(Directory.current.path), 'current');
+      sdkDocsDir.path, Future.value(Directory.current.path), 'current');
   Future originalDartdocSdkBuild =
       _buildSdkDocs(originalDartdocSdkDocs.path, originalDartdoc, 'original');
   WarningsCollection currentDartdocWarnings = jsonMessageIterableToWarnings(
@@ -373,7 +371,7 @@
 /// directory, assumed to be a git repository).  Uses [dartdocOriginalBranch]
 /// to checkout a branch or tag.
 Future<String> createComparisonDartdoc() async {
-  var launcher = new SubprocessLauncher('create-comparison-dartdoc');
+  var launcher = SubprocessLauncher('create-comparison-dartdoc');
   Directory dartdocClean =
       Directory.systemTemp.createTempSync('dartdoc-comparison');
   await launcher
@@ -389,7 +387,7 @@
 /// directory, assumed to be a git repository), configured to use the head
 /// version of the Dart SDK for analyzer, front-end, and kernel.
 Future<String> createSdkDartdoc() async {
-  var launcher = new SubprocessLauncher('create-sdk-dartdoc');
+  var launcher = SubprocessLauncher('create-sdk-dartdoc');
   Directory dartdocSdk = Directory.systemTemp.createTempSync('dartdoc-sdk');
   await launcher
       .runStreamed('git', ['clone', Directory.current.path, dartdocSdk.path]);
@@ -406,7 +404,7 @@
     'https://dart.googlesource.com/sdk.git',
     sdkClone.path
   ]);
-  File dartdocPubspec = new File(path.join(dartdocSdk.path, 'pubspec.yaml'));
+  File dartdocPubspec = File(path.join(dartdocSdk.path, 'pubspec.yaml'));
   List<String> pubspecLines = await dartdocPubspec.readAsLines();
   List<String> pubspecLinesFiltered = [];
   for (String line in pubspecLines) {
@@ -435,7 +433,7 @@
 
 @Task('Run grind tasks with the analyzer SDK.')
 Future<void> testWithAnalyzerSdk() async {
-  var launcher = new SubprocessLauncher('test-with-analyzer-sdk');
+  var launcher = SubprocessLauncher('test-with-analyzer-sdk');
   var sdkDartdoc = await createSdkDartdoc();
   final String defaultGrindParameter =
       Platform.environment['DARTDOC_GRIND_STEP'] ?? 'test';
@@ -448,7 +446,7 @@
     [String label]) async {
   if (label == null) label = '';
   if (label != '') label = '-$label';
-  var launcher = new SubprocessLauncher('build-sdk-docs$label');
+  var launcher = SubprocessLauncher('build-sdk-docs$label');
   String cwd = await futureCwd;
   await launcher.runStreamed(sdkBin('pub'), ['get'], workingDirectory: cwd);
   return await launcher.runStreamed(
@@ -470,7 +468,7 @@
     [String label]) async {
   if (label == null) label = '';
   if (label != '') label = '-$label';
-  var launcher = new SubprocessLauncher('build-test-package-docs$label');
+  var launcher = SubprocessLauncher('build-test-package-docs$label');
   Future testPackagePubGet = launcher.runStreamed(sdkBin('pub'), ['get'],
       workingDirectory: testPackage.absolute.path);
   String cwd = await futureCwd;
@@ -495,15 +493,15 @@
 
 @Task('Build generated test package docs (with inherited docs and source code)')
 Future<void> buildTestPackageDocs() async {
-  await _buildTestPackageDocs(testPackageDocsDir.absolute.path,
-      new Future.value(Directory.current.path));
+  await _buildTestPackageDocs(
+      testPackageDocsDir.absolute.path, Future.value(Directory.current.path));
 }
 
 @Task('Serve test package docs locally with dhttpd on port 8002')
 @Depends(buildTestPackageDocs)
 Future<void> serveTestPackageDocs() async {
   log('launching dhttpd on port 8002 for SDK');
-  var launcher = new SubprocessLauncher('serve-test-package-docs');
+  var launcher = SubprocessLauncher('serve-test-package-docs');
   await launcher.runStreamed(sdkBin('pub'), [
     'run',
     'dhttpd',
@@ -516,7 +514,7 @@
 
 Future<void> _serveDocsFrom(String servePath, int port, String context) async {
   log('launching dhttpd on port $port for $context');
-  var launcher = new SubprocessLauncher(context);
+  var launcher = SubprocessLauncher(context);
   await launcher.runStreamed(sdkBin('pub'), ['get']);
   await launcher.runStreamed(sdkBin('pub'), ['global', 'activate', 'dhttpd']);
   await launcher.runStreamed(
@@ -527,7 +525,7 @@
 @Depends(buildSdkDocs)
 Future<void> serveSdkDocs() async {
   log('launching dhttpd on port 8000 for SDK');
-  var launcher = new SubprocessLauncher('serve-sdk-docs');
+  var launcher = SubprocessLauncher('serve-sdk-docs');
   await launcher.runStreamed(sdkBin('pub'), [
     'run',
     'dhttpd',
@@ -546,7 +544,7 @@
   Map<String, String> envCurrent = _createThrowawayPubCache();
   Map<String, String> envOriginal = _createThrowawayPubCache();
   Future currentDartdocFlutterBuild = _buildFlutterDocs(flutterDir.path,
-      new Future.value(Directory.current.path), envCurrent, 'docs-current');
+      Future.value(Directory.current.path), envCurrent, 'docs-current');
   Future originalDartdocFlutterBuild = _buildFlutterDocs(
       originalDartdocFlutter.path,
       originalDartdoc,
@@ -567,7 +565,7 @@
       'Flutter repo', currentDartdocWarnings));
 
   if (Platform.environment['SERVE_FLUTTER'] == '1') {
-    var launcher = new SubprocessLauncher('serve-flutter-docs');
+    var launcher = SubprocessLauncher('serve-flutter-docs');
     await launcher.runStreamed(sdkBin('pub'), ['get']);
     Future original = launcher.runStreamed(sdkBin('pub'), [
       'run',
@@ -593,7 +591,7 @@
 @Depends(buildFlutterDocs)
 Future<void> serveFlutterDocs() async {
   log('launching dhttpd on port 8001 for Flutter');
-  var launcher = new SubprocessLauncher('serve-flutter-docs');
+  var launcher = SubprocessLauncher('serve-flutter-docs');
   await launcher.runStreamed(sdkBin('pub'), ['get']);
   await launcher.runStreamed(sdkBin('pub'), [
     'run',
@@ -614,9 +612,9 @@
   log('building flutter docs into: $flutterDir');
   Map<String, String> env = _createThrowawayPubCache();
   await _buildFlutterDocs(
-      flutterDir.path, new Future.value(Directory.current.path), env, 'docs');
+      flutterDir.path, Future.value(Directory.current.path), env, 'docs');
   String index =
-      new File(path.join(flutterDir.path, 'dev', 'docs', 'doc', 'index.html'))
+      File(path.join(flutterDir.path, 'dev', 'docs', 'doc', 'index.html'))
           .readAsStringSync();
   stdout.write(index);
 }
@@ -635,11 +633,11 @@
         '${path.join(path.canonicalize(flutterPath), "bin")}:${env['PATH'] ?? Platform.environment['PATH']}';
     env['FLUTTER_ROOT'] = flutterPath;
     launcher =
-        new SubprocessLauncher('flutter${label == null ? "" : "-$label"}', env);
+        SubprocessLauncher('flutter${label == null ? "" : "-$label"}', env);
   }
 
   Future<void> _init() async {
-    new Directory(flutterPath).createSync(recursive: true);
+    Directory(flutterPath).createSync(recursive: true);
     await launcher.runStreamed(
         'git', ['clone', 'https://github.com/flutter/flutter.git', '.'],
         workingDirectory: flutterPath);
@@ -662,7 +660,7 @@
 
   factory FlutterRepo.fromPath(String flutterPath, Map<String, String> env,
       [String label]) {
-    FlutterRepo flutterRepo = new FlutterRepo._(flutterPath, env, label);
+    FlutterRepo flutterRepo = FlutterRepo._(flutterPath, env, label);
     return flutterRepo;
   }
 
@@ -671,15 +669,14 @@
       FlutterRepo origRepo, String flutterPath, Map<String, String> env,
       [String label]) async {
     await copyPath(origRepo.flutterPath, flutterPath);
-    FlutterRepo flutterRepo = new FlutterRepo._(flutterPath, env, label);
+    FlutterRepo flutterRepo = FlutterRepo._(flutterPath, env, label);
     return flutterRepo;
   }
 
   /// Doesn't actually copy the existing repo; use for read-only operations only.
   static Future<FlutterRepo> fromExistingFlutterRepo(FlutterRepo origRepo,
       [String label]) async {
-    FlutterRepo flutterRepo =
-        new FlutterRepo._(origRepo.flutterPath, {}, label);
+    FlutterRepo flutterRepo = FlutterRepo._(origRepo.flutterPath, {}, label);
     return flutterRepo;
   }
 
@@ -718,7 +715,7 @@
     String pubPackageName, List<String> dartdocParameters,
     [String version, String label]) async {
   Map<String, String> env = _createThrowawayPubCache();
-  var launcher = new SubprocessLauncher(
+  var launcher = SubprocessLauncher(
       'build-${pubPackageName}${version == null ? "" : "-$version"}${label == null ? "" : "-$label"}',
       env);
   List<String> args = <String>['cache', 'add'];
@@ -726,7 +723,7 @@
   args.add(pubPackageName);
   await launcher.runStreamed('pub', args);
   Directory cache =
-      new Directory(path.join(env['PUB_CACHE'], 'hosted', 'pub.dartlang.org'));
+      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'],
@@ -760,7 +757,7 @@
 
 @Task('Checks that CHANGELOG mentions current version')
 Future<void> checkChangelogHasVersion() async {
-  var changelog = new File('CHANGELOG.md');
+  var changelog = File('CHANGELOG.md');
   if (!changelog.existsSync()) {
     fail('ERROR: No CHANGELOG.md found in ${Directory.current}');
   }
@@ -773,7 +770,7 @@
 }
 
 String _getPackageVersion() {
-  var pubspec = new File('pubspec.yaml');
+  var pubspec = File('pubspec.yaml');
   var yamlDoc;
   if (pubspec.existsSync()) {
     yamlDoc = yaml.loadYaml(pubspec.readAsStringSync());
@@ -787,13 +784,13 @@
 
 @Task('Rebuild generated files')
 Future<void> build() async {
-  var launcher = new SubprocessLauncher('build');
+  var launcher = SubprocessLauncher('build');
   await launcher.runStreamed(sdkBin('pub'),
       ['run', 'build_runner', 'build', '--delete-conflicting-outputs']);
 
   // TODO(jcollins-g): port to build system?
   String version = _getPackageVersion();
-  File dartdoc_options = new File('dartdoc_options.yaml');
+  File dartdoc_options = File('dartdoc_options.yaml');
   await dartdoc_options.writeAsString('''dartdoc:
   linkToSource:
     root: '.'
@@ -810,14 +807,14 @@
 
 @Task('Verify generated files are up to date')
 Future<void> checkBuild() async {
-  var originalFileContents = new Map<String, String>();
+  var originalFileContents = Map<String, String>();
   var differentFiles = <String>[];
 
   // Load original file contents into memory before running the builder;
   // it modifies them in place.
   for (String relPath in _generated_files_list) {
     String origPath = path.joinAll(['lib', relPath]);
-    File oldVersion = new File(origPath);
+    File oldVersion = File(origPath);
     if (oldVersion.existsSync()) {
       originalFileContents[relPath] = oldVersion.readAsStringSync();
     }
@@ -825,7 +822,7 @@
 
   await build();
   for (String relPath in _generated_files_list) {
-    File newVersion = new File(path.join('lib', relPath));
+    File newVersion = File(path.join('lib', relPath));
     if (!await newVersion.exists()) {
       log('${newVersion.path} does not exist\n');
       differentFiles.add(relPath);
@@ -846,7 +843,7 @@
 @Task('Dry run of publish to pub.dartlang')
 @Depends(checkChangelogHasVersion)
 Future<void> tryPublish() async {
-  var launcher = new SubprocessLauncher('try-publish');
+  var launcher = SubprocessLauncher('try-publish');
   await launcher.runStreamed(sdkBin('pub'), ['publish', '-n']);
 }
 
@@ -856,7 +853,7 @@
   await testFutures.wait();
 }
 
-List<File> get testFiles => new Directory('test')
+List<File> get testFiles => Directory('test')
     .listSync(recursive: true)
     .where((e) => e is File && e.path.endsWith('test.dart'))
     .cast<File>()
@@ -867,7 +864,7 @@
 
   for (File dartFile in testFiles) {
     await testFutures.addFutureFromClosure(() =>
-        new CoverageSubprocessLauncher('dart2-${path.basename(dartFile.path)}')
+        CoverageSubprocessLauncher('dart2-${path.basename(dartFile.path)}')
             .runStreamed(
                 Platform.resolvedExecutable,
                 <String>[]
@@ -875,13 +872,12 @@
                   ..add(dartFile.path)));
   }
 
-  return CoverageSubprocessLauncher.generateCoverageToFile(
-      new File('lcov.info'));
+  return CoverageSubprocessLauncher.generateCoverageToFile(File('lcov.info'));
 }
 
 @Task('Generate docs for dartdoc')
 Future<void> testDartdoc() async {
-  var launcher = new SubprocessLauncher('test-dartdoc');
+  var launcher = SubprocessLauncher('test-dartdoc');
   await launcher.runStreamed(Platform.resolvedExecutable, [
     '--enable-asserts',
     'bin/dartdoc.dart',
@@ -890,7 +886,7 @@
   ]);
   expectFileContains(path.join(dartdocDocsDir.path, 'index.html'),
       ['<title>dartdoc - Dart API docs</title>']);
-  final RegExp object = new RegExp('<li>Object</li>', multiLine: true);
+  final RegExp object = RegExp('<li>Object</li>', multiLine: true);
   expectFileContains(
       path.join(dartdocDocsDir.path, 'dartdoc', 'ModelElement-class.html'),
       [object]);
@@ -898,8 +894,8 @@
 
 @Task('Generate docs for dartdoc with remote linking')
 Future<void> testDartdocRemote() async {
-  var launcher = new SubprocessLauncher('test-dartdoc-remote');
-  final RegExp object = new RegExp(
+  var launcher = SubprocessLauncher('test-dartdoc-remote');
+  final RegExp object = RegExp(
       '<a href="https://api.dartlang.org/(dev|stable)/[^/]*/dart-core/Object-class.html">Object</a>',
       multiLine: true);
   await launcher.runStreamed(Platform.resolvedExecutable, [
