tool/stats.dart --update-files updates all configs by default
diff --git a/tool/stats.dart b/tool/stats.dart
index 7ee58ed..3b2a5ff 100644
--- a/tool/stats.dart
+++ b/tool/stats.dart
@@ -9,6 +9,9 @@
 
 import 'stats_lib.dart';
 
+final _configs =
+    List<Config>.unmodifiable([Config.commonMarkConfig, Config.gfmConfig]);
+
 Future main(List<String> args) async {
   final parser = ArgParser()
     ..addOption('section',
@@ -27,9 +30,7 @@
         defaultsTo: false,
         help: 'Print details for "loose" matches.',
         negatable: false)
-    ..addOption('flavor',
-        allowed: [Config.commonMarkConfig.prefix, Config.gfmConfig.prefix],
-        defaultsTo: Config.commonMarkConfig.prefix)
+    ..addOption('flavor', allowed: _configs.map((c) => c.prefix))
     ..addFlag('help', defaultsTo: false, negatable: false);
 
   ArgResults options;
@@ -61,37 +62,47 @@
     return;
   }
 
-  final testPrefix = options['flavor'] as String;
-
-  Config config;
-  switch (testPrefix) {
-    case 'gfm':
-      config = Config.gfmConfig;
-      break;
-    case 'common_mark':
-      config = Config.commonMarkConfig;
-      break;
-    default:
-      throw ArgumentError('Does not support `$testPrefix`.');
+  var testPrefix = options['flavor'] as String;
+  if (!updateFiles) {
+    testPrefix = _configs.first.prefix;
   }
 
+  final testPrefixes =
+      testPrefix == null ? _configs.map((c) => c.prefix) : <String>[testPrefix];
+
+  for (var testPrefix in testPrefixes) {
+    await _processConfig(testPrefix, raw, updateFiles, verbose,
+        specifiedSection, verboseLooseMatch);
+  }
+}
+
+Future<void> _processConfig(
+  String testPrefix,
+  bool raw,
+  bool updateFiles,
+  bool verbose,
+  String specifiedSection,
+  bool verboseLooseMatch,
+) async {
+  final config = _configs.singleWhere((c) => c.prefix == testPrefix);
+
   var sections = loadCommonMarkSections(testPrefix);
 
   var scores = SplayTreeMap<String, SplayTreeMap<int, CompareLevel>>(
       compareAsciiLowerCaseNatural);
 
-  sections.forEach((section, examples) {
-    if (specifiedSection != null && section != specifiedSection) {
+  for (var entry in sections.entries) {
+    if (specifiedSection != null && entry.key != specifiedSection) {
       return;
     }
-    for (var e in examples) {
-      var nestedMap =
-          scores.putIfAbsent(section, () => SplayTreeMap<int, CompareLevel>());
+    for (var e in entry.value) {
+      var nestedMap = scores.putIfAbsent(
+          entry.key, () => SplayTreeMap<int, CompareLevel>());
 
       nestedMap[e.example] = compareResult(config, e,
           verboseFail: verbose, verboseLooseMatch: verboseLooseMatch);
     }
-  });
+  }
 
   if (raw || updateFiles) {
     await _printRaw(testPrefix, scores, updateFiles);