diff --git a/CHANGELOG.md b/CHANGELOG.md
index b2f49e7..d819fba 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+## 0.16.1
+ * Add an analysis_options.yaml and fix or suppress all the complaints from it.
+
 ## 0.16.0
  * Fix 'k' formatting (1 to 24 hours) which incorrectly showed 0 to 23.
  * Tighten up types in a couple of places.
diff --git a/lib/date_symbol_data_custom.dart b/lib/date_symbol_data_custom.dart
index 67ad522..40a9afc 100644
--- a/lib/date_symbol_data_custom.dart
+++ b/lib/date_symbol_data_custom.dart
@@ -1,14 +1,12 @@
-// Copyright (c) 2017, the Dart project authors.
-// Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code
-// is governed by a
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file for
+// details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 /// API to allow setting Date/Time formatting in a custom way.
 ///
 /// It does not actually provide any data - that's left to the user of the API.
-import "date_symbols.dart";
-import "src/date_format_internal.dart";
+import 'date_symbols.dart';
+import 'src/date_format_internal.dart';
 
 /// This should be called for at least one [locale] before any date
 /// formatting methods are called.
@@ -23,13 +21,16 @@
     {String locale, DateSymbols symbols, Map<String, String> patterns}) {
   initializeDateSymbols(_emptySymbols);
   initializeDatePatterns(_emptyPatterns);
-  if (symbols == null)
-    throw new ArgumentError("Missing DateTime formatting symbols");
-  if (patterns == null)
-    throw new ArgumentError("Missing DateTime formatting patterns");
-  if (locale != symbols.NAME)
-    throw new ArgumentError.value(
-        [locale, symbols.NAME], "Locale does not match symbols.NAME");
+  if (symbols == null) {
+    throw ArgumentError('Missing DateTime formatting symbols');
+  }
+  if (patterns == null) {
+    throw ArgumentError('Missing DateTime formatting patterns');
+  }
+  if (locale != symbols.NAME) {
+    throw ArgumentError.value(
+        [locale, symbols.NAME], 'Locale does not match symbols.NAME');
+  }
   dateTimeSymbols[symbols.NAME] = symbols;
   dateTimePatterns[symbols.NAME] = patterns;
 }
diff --git a/lib/date_symbol_data_file.dart b/lib/date_symbol_data_file.dart
index dbb1dc0..6a4f33d 100644
--- a/lib/date_symbol_data_file.dart
+++ b/lib/date_symbol_data_file.dart
@@ -23,19 +23,21 @@
 /// methods are called. It sets up the lookup for date symbols using [path].
 /// The [path] parameter should end with a directory separator appropriate
 /// for the platform.
-Future initializeDateFormatting(String locale, String filePath) {
-  var reader = new FileDataReader(path.join(filePath, 'symbols'));
-  initializeDateSymbols(() => new LazyLocaleData(
+Future<void> initializeDateFormatting(String locale, String filePath) {
+  var reader = FileDataReader(path.join(filePath, 'symbols'));
+  initializeDateSymbols(() => LazyLocaleData(
       reader, _createDateSymbol, availableLocalesForDateFormatting));
-  var reader2 = new FileDataReader(path.join(filePath, 'patterns'));
+  var reader2 = FileDataReader(path.join(filePath, 'patterns'));
   initializeDatePatterns(() =>
-      new LazyLocaleData(reader2, (x) => x, availableLocalesForDateFormatting));
+      LazyLocaleData(reader2, (x) => x, availableLocalesForDateFormatting));
   return initializeIndividualLocaleDateFormatting((symbols, patterns) {
-    return Future.wait(
-        <Future>[symbols.initLocale(locale), patterns.initLocale(locale)]);
+    return Future.wait(<Future<dynamic>>[
+      symbols.initLocale(locale),
+      patterns.initLocale(locale)
+    ]);
   });
 }
 
 /// Defines how new date symbol entries are created.
-DateSymbols _createDateSymbol(Map map) =>
-    new DateSymbols.deserializeFromMap(map);
+DateSymbols _createDateSymbol(Map<dynamic, dynamic> map) =>
+    DateSymbols.deserializeFromMap(map);
diff --git a/lib/date_symbol_data_http_request.dart b/lib/date_symbol_data_http_request.dart
index fd4f625..0950856 100644
--- a/lib/date_symbol_data_http_request.dart
+++ b/lib/date_symbol_data_http_request.dart
@@ -21,17 +21,17 @@
 /// methods are called. It sets up the lookup for date symbols using [url].
 /// The [url] parameter should end with a "/". For example,
 ///   "http://localhost:8000/dates/"
-Future initializeDateFormatting(String locale, String url) {
-  var reader = new HttpRequestDataReader('${url}symbols/');
-  initializeDateSymbols(() => new LazyLocaleData(
+Future<void> initializeDateFormatting(String locale, String url) {
+  var reader = HttpRequestDataReader('${url}symbols/');
+  initializeDateSymbols(() => LazyLocaleData(
       reader, _createDateSymbol, availableLocalesForDateFormatting));
-  var reader2 = new HttpRequestDataReader('${url}patterns/');
+  var reader2 = HttpRequestDataReader('${url}patterns/');
   initializeDatePatterns(() =>
-      new LazyLocaleData(reader2, (x) => x, availableLocalesForDateFormatting));
-  var actualLocale = Intl.verifiedLocale(
-      locale, (l) => availableLocalesForDateFormatting.contains(l));
+      LazyLocaleData(reader2, (x) => x, availableLocalesForDateFormatting));
+  var actualLocale =
+      Intl.verifiedLocale(locale, availableLocalesForDateFormatting.contains);
   return initializeIndividualLocaleDateFormatting((symbols, patterns) {
-    return Future.wait(<Future>[
+    return Future.wait(<Future<List<dynamic>>>[
       symbols.initLocale(actualLocale),
       patterns.initLocale(actualLocale)
     ]);
@@ -39,5 +39,5 @@
 }
 
 /// Defines how new date symbol entries are created.
-DateSymbols _createDateSymbol(Map map) =>
-    new DateSymbols.deserializeFromMap(map);
+DateSymbols _createDateSymbol(Map<dynamic, dynamic> map) =>
+    DateSymbols.deserializeFromMap(map);
diff --git a/lib/date_symbol_data_local.dart b/lib/date_symbol_data_local.dart
index 6f74968..36db1cc 100644
--- a/lib/date_symbol_data_local.dart
+++ b/lib/date_symbol_data_local.dart
@@ -15,6 +15,9 @@
 /// to incorporate changes before we could correct CLDR. All manual
 /// modification must be documented in this section, and should be
 /// removed after those changes land to CLDR.
+
+// MANUAL EDIT TO SUPPRESS WARNINGS IN GENERATED CODE
+// ignore_for_file: unnecessary_new, prefer_single_quotes, directives_ordering
 library date_symbol_data_local;
 
 import "date_symbols.dart";
@@ -26,7 +29,7 @@
 /// formatting methods are called. It sets up the lookup for date
 /// symbols. Both the [locale] and [ignored] parameter are ignored, as
 /// the data for all locales is directly available.
-Future initializeDateFormatting([String locale, String ignored]) {
+Future<void> initializeDateFormatting([String locale, String ignored]) {
   initializeDateSymbols(dateTimeSymbolMap);
   initializeDatePatterns(dateTimePatternMap);
   return new Future.value(null);
@@ -35,7 +38,7 @@
 /// Returns a Map from locale names to the DateSymbols instance for
 /// that locale. Internal use only. Call initializeDateFormatting
 /// instead.
-Map dateTimeSymbolMap() => {
+Map<dynamic, dynamic> dateTimeSymbolMap() => {
       // Date/time formatting symbols for locale en_ISO.
       "en_ISO": new DateSymbols(
           NAME: 'en_ISO',
diff --git a/lib/date_symbols.dart b/lib/date_symbols.dart
index dca4020..da43178 100644
--- a/lib/date_symbols.dart
+++ b/lib/date_symbols.dart
@@ -3,6 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 library date_symbols;
 
+// Suppress naming lints, as changes would be breaking.
+// ignore_for_file: avoid_types_as_parameter_names,non_constant_identifier_names
+
 /// This holds onto information about how a particular locale formats dates. It
 /// contains mostly strings, e.g. what the names of months or weekdays are,
 /// but also indicates things like the first day of the week. We expect the data
@@ -132,83 +135,81 @@
 
   // TODO(alanknight): Replace this with use of a more general serialization
   // facility once one is available. Issue 4926.
-  DateSymbols.deserializeFromMap(Map map) {
-    List<String> _getStringList(String name) =>
-        new List<String>.from(map[name]);
-    NAME = map["NAME"];
-    ERAS = _getStringList("ERAS");
-    ERANAMES = _getStringList("ERANAMES");
-    NARROWMONTHS = _getStringList("NARROWMONTHS");
-    STANDALONENARROWMONTHS = _getStringList("STANDALONENARROWMONTHS");
-    MONTHS = _getStringList("MONTHS");
-    STANDALONEMONTHS = _getStringList("STANDALONEMONTHS");
-    SHORTMONTHS = _getStringList("SHORTMONTHS");
-    STANDALONESHORTMONTHS = _getStringList("STANDALONESHORTMONTHS");
-    WEEKDAYS = _getStringList("WEEKDAYS");
-    STANDALONEWEEKDAYS = _getStringList("STANDALONEWEEKDAYS");
-    SHORTWEEKDAYS = _getStringList("SHORTWEEKDAYS");
-    STANDALONESHORTWEEKDAYS = _getStringList("STANDALONESHORTWEEKDAYS");
-    NARROWWEEKDAYS = _getStringList("NARROWWEEKDAYS");
-    STANDALONENARROWWEEKDAYS = _getStringList("STANDALONENARROWWEEKDAYS");
-    SHORTQUARTERS = _getStringList("SHORTQUARTERS");
-    QUARTERS = _getStringList("QUARTERS");
-    AMPMS = _getStringList("AMPMS");
-    ZERODIGIT = map["ZERODIGIT"];
-    DATEFORMATS = _getStringList("DATEFORMATS");
-    TIMEFORMATS = _getStringList("TIMEFORMATS");
-    AVAILABLEFORMATS =
-        new Map<String, String>.from(map["AVAILABLEFORMATS"] ?? {});
-    FIRSTDAYOFWEEK = map["FIRSTDAYOFWEEK"];
-    WEEKENDRANGE = new List<int>.from(map["WEEKENDRANGE"]);
-    FIRSTWEEKCUTOFFDAY = map["FIRSTWEEKCUTOFFDAY"];
-    DATETIMEFORMATS = _getStringList("DATETIMEFORMATS");
+  DateSymbols.deserializeFromMap(Map<dynamic, dynamic> map) {
+    List<String> _getStringList(String name) => List<String>.from(map[name]);
+    NAME = map['NAME'];
+    ERAS = _getStringList('ERAS');
+    ERANAMES = _getStringList('ERANAMES');
+    NARROWMONTHS = _getStringList('NARROWMONTHS');
+    STANDALONENARROWMONTHS = _getStringList('STANDALONENARROWMONTHS');
+    MONTHS = _getStringList('MONTHS');
+    STANDALONEMONTHS = _getStringList('STANDALONEMONTHS');
+    SHORTMONTHS = _getStringList('SHORTMONTHS');
+    STANDALONESHORTMONTHS = _getStringList('STANDALONESHORTMONTHS');
+    WEEKDAYS = _getStringList('WEEKDAYS');
+    STANDALONEWEEKDAYS = _getStringList('STANDALONEWEEKDAYS');
+    SHORTWEEKDAYS = _getStringList('SHORTWEEKDAYS');
+    STANDALONESHORTWEEKDAYS = _getStringList('STANDALONESHORTWEEKDAYS');
+    NARROWWEEKDAYS = _getStringList('NARROWWEEKDAYS');
+    STANDALONENARROWWEEKDAYS = _getStringList('STANDALONENARROWWEEKDAYS');
+    SHORTQUARTERS = _getStringList('SHORTQUARTERS');
+    QUARTERS = _getStringList('QUARTERS');
+    AMPMS = _getStringList('AMPMS');
+    ZERODIGIT = map['ZERODIGIT'];
+    DATEFORMATS = _getStringList('DATEFORMATS');
+    TIMEFORMATS = _getStringList('TIMEFORMATS');
+    AVAILABLEFORMATS = Map<String, String>.from(map['AVAILABLEFORMATS'] ?? {});
+    FIRSTDAYOFWEEK = map['FIRSTDAYOFWEEK'];
+    WEEKENDRANGE = List<int>.from(map['WEEKENDRANGE']);
+    FIRSTWEEKCUTOFFDAY = map['FIRSTWEEKCUTOFFDAY'];
+    DATETIMEFORMATS = _getStringList('DATETIMEFORMATS');
   }
 
-  Map serializeToMap() {
+  Map<String, dynamic> serializeToMap() {
     // Don't write default ZERODIGIT, conserves space, but also minimize file
     // churn.
     var basicMap = _serializeToMap();
     if (ZERODIGIT != null && ZERODIGIT != '') {
-      basicMap["ZERODIGIT"] = ZERODIGIT;
+      basicMap['ZERODIGIT'] = ZERODIGIT;
     }
     return basicMap;
   }
 
-  Map _serializeToMap() => {
-        "NAME": NAME,
-        "ERAS": ERAS,
-        "ERANAMES": ERANAMES,
-        "NARROWMONTHS": NARROWMONTHS,
-        "STANDALONENARROWMONTHS": STANDALONENARROWMONTHS,
-        "MONTHS": MONTHS,
-        "STANDALONEMONTHS": STANDALONEMONTHS,
-        "SHORTMONTHS": SHORTMONTHS,
-        "STANDALONESHORTMONTHS": STANDALONESHORTMONTHS,
-        "WEEKDAYS": WEEKDAYS,
-        "STANDALONEWEEKDAYS": STANDALONEWEEKDAYS,
-        "SHORTWEEKDAYS": SHORTWEEKDAYS,
-        "STANDALONESHORTWEEKDAYS": STANDALONESHORTWEEKDAYS,
-        "NARROWWEEKDAYS": NARROWWEEKDAYS,
-        "STANDALONENARROWWEEKDAYS": STANDALONENARROWWEEKDAYS,
-        "SHORTQUARTERS": SHORTQUARTERS,
-        "QUARTERS": QUARTERS,
-        "AMPMS": AMPMS,
-        "DATEFORMATS": DATEFORMATS,
-        "TIMEFORMATS": TIMEFORMATS,
-        "AVAILABLEFORMATS": AVAILABLEFORMATS,
-        "FIRSTDAYOFWEEK": FIRSTDAYOFWEEK,
-        "WEEKENDRANGE": WEEKENDRANGE,
-        "FIRSTWEEKCUTOFFDAY": FIRSTWEEKCUTOFFDAY,
-        "DATETIMEFORMATS": DATETIMEFORMATS,
+  Map<String, dynamic> _serializeToMap() => {
+        'NAME': NAME,
+        'ERAS': ERAS,
+        'ERANAMES': ERANAMES,
+        'NARROWMONTHS': NARROWMONTHS,
+        'STANDALONENARROWMONTHS': STANDALONENARROWMONTHS,
+        'MONTHS': MONTHS,
+        'STANDALONEMONTHS': STANDALONEMONTHS,
+        'SHORTMONTHS': SHORTMONTHS,
+        'STANDALONESHORTMONTHS': STANDALONESHORTMONTHS,
+        'WEEKDAYS': WEEKDAYS,
+        'STANDALONEWEEKDAYS': STANDALONEWEEKDAYS,
+        'SHORTWEEKDAYS': SHORTWEEKDAYS,
+        'STANDALONESHORTWEEKDAYS': STANDALONESHORTWEEKDAYS,
+        'NARROWWEEKDAYS': NARROWWEEKDAYS,
+        'STANDALONENARROWWEEKDAYS': STANDALONENARROWWEEKDAYS,
+        'SHORTQUARTERS': SHORTQUARTERS,
+        'QUARTERS': QUARTERS,
+        'AMPMS': AMPMS,
+        'DATEFORMATS': DATEFORMATS,
+        'TIMEFORMATS': TIMEFORMATS,
+        'AVAILABLEFORMATS': AVAILABLEFORMATS,
+        'FIRSTDAYOFWEEK': FIRSTDAYOFWEEK,
+        'WEEKENDRANGE': WEEKENDRANGE,
+        'FIRSTWEEKCUTOFFDAY': FIRSTWEEKCUTOFFDAY,
+        'DATETIMEFORMATS': DATETIMEFORMATS,
       };
 
-  toString() => NAME;
+  String toString() => NAME;
 }
 
 /// We hard-code the locale data for en_US here so that there's at least one
 /// locale always available.
-var en_USSymbols = new DateSymbols(
-    NAME: "en_US",
+var en_USSymbols = DateSymbols(
+    NAME: 'en_US',
     ERAS: const ['BC', 'AD'],
     ERANAMES: const ['Before Christ', 'Anno Domini'],
     NARROWMONTHS: const [
diff --git a/lib/date_time_patterns.dart b/lib/date_time_patterns.dart
index 457cdd0..21be1fc 100644
--- a/lib/date_time_patterns.dart
+++ b/lib/date_time_patterns.dart
@@ -8,12 +8,15 @@
 /// 'http://go/generate_datetime_pattern_dart.cc' (Google internal)
 /// File generated from CLDR ver. 35.0
 
+// MANUAL EDIT TO SUPPRESS WARNINGS IN GENERATED CODE
+// ignore_for_file: unnecessary_const
+
 library date_time_patterns;
 
 /// Returns a Map from locale names to another Map that goes from skeletons
 /// to the locale-specific formatting patterns.
 /// Internal use only. Call initializeDateFormatting instead.
-Map dateTimePatternMap() => const {
+Map<dynamic, dynamic> dateTimePatternMap() => const {
       /// Extended set of localized date/time patterns for locale af.
       'af': const {
         'd': 'd', // DAY
diff --git a/lib/intl.dart b/lib/intl.dart
index 1eb9f82..f4120c7 100644
--- a/lib/intl.dart
+++ b/lib/intl.dart
@@ -28,7 +28,7 @@
 import 'number_symbols_data.dart';
 import 'src/date_format_internal.dart';
 import 'src/intl_helpers.dart';
-import 'package:intl/src/plural_rules.dart' as plural_rules;
+import 'src/plural_rules.dart' as plural_rules;
 
 part 'src/intl/bidi_formatter.dart';
 part 'src/intl/bidi_utils.dart';
@@ -46,7 +46,7 @@
 ///
 /// Examples:
 ///      today(date) => Intl.message(
-///          "Today's date is $date",
+///          'Today's date is $date',
 ///          name: 'today',
 ///          args: [date],
 ///          desc: 'Indicate the current date',
@@ -71,12 +71,12 @@
 /// the main [package documentation](https://pub.dartlang.org/packages/intl)
 ///
 /// You can set the default locale.
-///       Intl.defaultLocale = "pt_BR";
+///       Intl.defaultLocale = 'pt_BR';
 ///
 /// To temporarily use a locale other than the default, use the `withLocale`
 /// function.
-///       var todayString = new DateFormat("pt_BR").format(new DateTime.now());
-///       print(withLocale("pt_BR", () => today(todayString));
+///       var todayString = new DateFormat('pt_BR').format(new DateTime.now());
+///       print(withLocale('pt_BR', () => today(todayString));
 ///
 /// See `tests/message_format_test.dart` for more examples.
 //TODO(efortuna): documentation example involving the offset parameter?
@@ -114,7 +114,7 @@
   /// If [desiredLocale] is not specified, then we default to [locale].
   DateFormat date([String pattern, String desiredLocale]) {
     var actualLocale = (desiredLocale == null) ? locale : desiredLocale;
-    return new DateFormat(pattern, actualLocale);
+    return DateFormat(pattern, actualLocale);
   }
 
   /// Constructor optionally [aLocale] for specifics of the language
@@ -130,7 +130,7 @@
   /// returns the value of this call and provides a scope for the variables that
   /// will be substituted in the message.
   ///
-  /// The [message_str] is the string to be translated, which may be
+  /// The [messageText] is the string to be translated, which may be
   /// interpolated based on one or more variables.
   ///
   /// The [args] is a list containing the arguments of the enclosing function.
@@ -150,11 +150,11 @@
   /// For example
   ///
   ///       hello(yourName) => Intl.message(
-  ///         "Hello, $yourName",
-  ///         name: "hello",
+  ///         'Hello, $yourName',
+  ///         name: 'hello',
   ///         args: [yourName],
-  ///         desc: "Say hello",
-  ///         examples: const {"yourName": "Sparky"});
+  ///         desc: 'Say hello',
+  ///         examples: const {'yourName': 'Sparky'});
   ///
   /// The source code will be processed via the analyzer to extract out the
   /// message data, so only a subset of valid Dart code is accepted. In
@@ -175,22 +175,22 @@
   // We want dart2js to try to inline these messages, but not inline the
   // internal messages, so it will eliminate the descriptions and other
   // information not neeeded at runtime.
-  static String message(String message_str,
-          {String desc: '',
+  static String message(String messageText,
+          {String desc = '',
           Map<String, Object> examples,
           String locale,
           String name,
           List<Object> args,
           String meaning,
           bool skip}) =>
-      _message(message_str, locale, name, args, meaning);
+      _message(messageText, locale, name, args, meaning);
 
   /// Omit the compile-time only parameters so dart2js can see to drop them.
   @pragma('dart2js:noInline')
-  static String _message(String message_str, String locale, String name,
+  static String _message(String messageText, String locale, String name,
       List<Object> args, String meaning) {
     return messageLookup.lookupMessage(
-        message_str, locale, name, args, meaning);
+        messageText, locale, name, args, meaning);
   }
 
   /// Return the locale for this instance. If none was set, the locale will
@@ -214,7 +214,7 @@
   /// [newLocale] is null the default locale will be returned.
   static String verifiedLocale(
       String newLocale, bool Function(String) localeExists,
-      {String Function(String) onFailure: _throwLocaleError}) {
+      {String Function(String) onFailure = _throwLocaleError}) {
     // TODO(alanknight): Previously we kept a single verified locale on the Intl
     // object, but with different verification for different uses, that's more
     // difficult. As a result, we call this more often. Consider keeping
@@ -230,7 +230,7 @@
     for (var each in [
       canonicalizedLocale(newLocale),
       shortLocale(newLocale),
-      "fallback"
+      'fallback'
     ]) {
       if (localeExists(each)) {
         return each;
@@ -242,7 +242,7 @@
   /// The default action if a locale isn't found in verifiedLocale. Throw
   /// an exception indicating the locale isn't correct.
   static String _throwLocaleError(String localeName) {
-    throw new ArgumentError("Invalid locale '$localeName'");
+    throw ArgumentError('Invalid locale "$localeName"');
   }
 
   /// Return the short version of a locale name, e.g. 'en_US' => 'en'
@@ -264,7 +264,7 @@
     // TODO(alanknight): en_ISO is probably not quite right for the C/Posix
     // locale for formatting. Consider adding C to the formats database.
     if (aLocale == null) return getCurrentLocale();
-    if (aLocale == "C") return "en_ISO";
+    if (aLocale == 'C') return 'en_ISO';
     if (aLocale.length < 5) return aLocale;
     if (aLocale[2] != '-' && (aLocale[2] != '_')) return aLocale;
     var region = aLocale.substring(3);
@@ -359,10 +359,10 @@
       int precision,
       String meaning}) {
     if (other == null) {
-      throw new ArgumentError("The 'other' named argument must be provided");
+      throw ArgumentError("The 'other' named argument must be provided");
     }
     if (howMany == null) {
-      throw new ArgumentError("The howMany argument to plural cannot be null");
+      throw ArgumentError('The howMany argument to plural cannot be null');
     }
 
     // This is for backward compatibility.
@@ -398,15 +398,16 @@
       case plural_rules.PluralCase.OTHER:
         return other;
       default:
-        throw new ArgumentError.value(
-            howMany, "howMany", "Invalid plural argument");
+        throw ArgumentError.value(
+            howMany, 'howMany', 'Invalid plural argument');
     }
   }
 
-  static var _cachedPluralRule;
+  static plural_rules.PluralRule _cachedPluralRule;
   static String _cachedPluralLocale;
 
-  static _pluralRule(String locale, num howMany, int precision) {
+  static plural_rules.PluralRule _pluralRule(
+      String locale, num howMany, int precision) {
     plural_rules.startRuleEvaluation(howMany, precision);
     var verifiedLocale = Intl.verifiedLocale(
         locale, plural_rules.localeHasPluralRules,
@@ -468,15 +469,15 @@
 
   /// Internal: Implements the logic for gender selection - use [gender] for
   /// normal messages.
-  static genderLogic(String targetGender,
-      {female, male, other, String locale}) {
+  static T genderLogic<T>(String targetGender,
+      {T female, T male, T other, String locale}) {
     if (other == null) {
-      throw new ArgumentError("The 'other' named argument must be specified");
+      throw ArgumentError("The 'other' named argument must be specified");
     }
     switch (targetGender) {
-      case "female":
+      case 'female':
         return female == null ? other : female;
-      case "male":
+      case 'male':
         return male == null ? other : male;
       default:
         return other;
@@ -515,7 +516,7 @@
       {String locale, String name, List<Object> args, String meaning}) {
     // Look up our translation, but pass in a null message so we don't have to
     // eagerly evaluate calls that may not be necessary.
-    var stringChoice = choice is String ? choice : "$choice".split('.').last;
+    var stringChoice = choice is String ? choice : '$choice'.split('.').last;
     var modifiedArgs =
         args == null ? null : (<Object>[stringChoice]..addAll(args.skip(1)));
     var translated = _message(null, locale, name, modifiedArgs, meaning);
@@ -527,7 +528,7 @@
 
   /// Internal: Implements the logic for select - use [select] for
   /// normal messages.
-  static selectLogic(Object choice, Map<Object, dynamic> cases) {
+  static T selectLogic<T>(Object choice, Map<Object, T> cases) {
     // This will work if choice is a string, or if it's e.g. an
     // enum and the map uses the enum values as choices.
     var exact = cases[choice];
@@ -536,12 +537,13 @@
     // take the part after the period. We need to do this
     // because enums print as 'EnumType.enumName' and periods
     // aren't acceptable in ICU select choices.
-    var stringChoice = "$choice".split('.').last;
+    var stringChoice = '$choice'.split('.').last;
     var stringMatch = cases[stringChoice];
     if (stringMatch != null) return stringMatch;
-    var other = cases["other"];
-    if (other == null)
-      throw new ArgumentError("The 'other' case must be specified");
+    var other = cases['other'];
+    if (other == null) {
+      throw ArgumentError("The 'other' case must be specified");
+    }
     return other;
   }
 
@@ -557,17 +559,17 @@
   ///
   /// For example
   ///
-  ///       Intl.withLocale("fr", () => new NumberFormat.format(123456));
+  ///       Intl.withLocale('fr', () => new NumberFormat.format(123456));
   ///
   /// or
   ///
   ///       hello(name) => Intl.message(
-  ///           "Hello $name.",
+  ///           'Hello $name.',
   ///           name: 'hello',
   ///           args: [name],
   ///           desc: 'Say Hello');
-  ///       Intl.withLocale("zh", new Timer(new Duration(milliseconds:10),
-  ///           () => print(hello("World")));
+  ///       Intl.withLocale('zh', new Timer(new Duration(milliseconds:10),
+  ///           () => print(hello('World')));
   static dynamic withLocale<T>(String locale, T Function() function) {
     // TODO(alanknight): Make this return T. This requires work because T might
     // be Future and the caller could get an unawaited Future.  Which is
@@ -580,11 +582,11 @@
   /// unless for some reason this gets called inside a message that resets the
   /// locale.
   static String getCurrentLocale() {
-    if (defaultLocale == null) defaultLocale = systemLocale;
+    defaultLocale ??= systemLocale;
     return defaultLocale;
   }
 
-  toString() => "Intl($locale)";
+  String toString() => 'Intl($locale)';
 }
 
 /// Convert a string to beginning of sentence case, in a way appropriate to the
@@ -596,7 +598,7 @@
 /// dotted i in Turkish and Azeri.
 String toBeginningOfSentenceCase(String input, [String locale]) {
   if (input == null || input.isEmpty) return input;
-  return "${_upperCaseLetter(input[0], locale)}${input.substring(1)}";
+  return '${_upperCaseLetter(input[0], locale)}${input.substring(1)}';
 }
 
 /// Convert the input single-letter string to upper case. A trivial
@@ -611,8 +613,8 @@
 String _upperCaseLetter(String input, String locale) {
   // Hard-code the important edge case of i->İ
   if (locale != null) {
-    if (input == "i" && locale.startsWith("tr") || locale.startsWith("az")) {
-      return "\u0130";
+    if (input == 'i' && locale.startsWith('tr') || locale.startsWith('az')) {
+      return '\u0130';
     }
   }
   return input.toUpperCase();
diff --git a/lib/intl_browser.dart b/lib/intl_browser.dart
index e38e9f0..28d45ed 100644
--- a/lib/intl_browser.dart
+++ b/lib/intl_browser.dart
@@ -9,9 +9,9 @@
 
 library intl_browser;
 
-import "dart:async";
-import "dart:html";
-import "intl.dart";
+import 'dart:async';
+import 'dart:html';
+import 'intl.dart';
 
 // TODO(alanknight): The need to do this by forcing the user to specially
 // import a particular library is a horrible hack, only done because there
@@ -23,5 +23,5 @@
 /// [Intl.systemLocale] variable.
 Future<String> findSystemLocale() {
   Intl.systemLocale = Intl.canonicalizedLocale(window.navigator.language);
-  return new Future.value(Intl.systemLocale);
+  return Future.value(Intl.systemLocale);
 }
diff --git a/lib/intl_standalone.dart b/lib/intl_standalone.dart
index 7da66d0..90563fc 100644
--- a/lib/intl_standalone.dart
+++ b/lib/intl_standalone.dart
@@ -9,9 +9,9 @@
 
 library intl_standalone;
 
-import "dart:async";
-import "dart:io";
-import "intl.dart";
+import 'dart:async';
+import 'dart:io';
+import 'intl.dart';
 
 // TODO(alanknight): The need to do this by forcing the user to specially
 // import a particular library is a horrible hack, only done because there
@@ -25,7 +25,7 @@
   try {
     Intl.systemLocale = Intl.canonicalizedLocale(Platform.localeName);
   } catch (e) {
-    return new Future.value();
+    return Future.value();
   }
-  return new Future.value(Intl.systemLocale);
+  return Future.value(Intl.systemLocale);
 }
diff --git a/lib/message_lookup_by_library.dart b/lib/message_lookup_by_library.dart
index 5b376e5..1e41981 100644
--- a/lib/message_lookup_by_library.dart
+++ b/lib/message_lookup_by_library.dart
@@ -19,7 +19,7 @@
 /// of individual [MessageLookupByLibrary] instances.
 class CompositeMessageLookup implements MessageLookup {
   /// A map from locale names to the corresponding lookups.
-  Map<String, MessageLookupByLibrary> availableMessages = new Map();
+  Map<String, MessageLookupByLibrary> availableMessages = Map();
 
   /// Return true if we have a message lookup for [localeName].
   bool localeExists(localeName) => availableMessages.containsKey(localeName);
@@ -35,10 +35,9 @@
 
   /// Look up the message with the given [name] and [locale] and return the
   /// translated version with the values in [args] interpolated.  If nothing is
-  /// found, return the result of [ifAbsent] or [message_str]. The
-  /// [desc] and [examples] parameters are ignored
-  String lookupMessage(
-      String message_str, String locale, String name, List args, String meaning,
+  /// found, return the result of [ifAbsent] or [messageText].
+  String lookupMessage(String messageText, String locale, String name,
+      List<dynamic> args, String meaning,
       {MessageIfAbsent ifAbsent}) {
     // If passed null, use the default.
     var knownLocale = locale ?? Intl.getCurrentLocale();
@@ -48,9 +47,9 @@
     // If we didn't find any messages for this locale, use the original string,
     // faking interpolations if necessary.
     if (messages == null) {
-      return ifAbsent == null ? message_str : ifAbsent(message_str, args);
+      return ifAbsent == null ? messageText : ifAbsent(messageText, args);
     }
-    return messages.lookupMessage(message_str, locale, name, args, meaning,
+    return messages.lookupMessage(messageText, locale, name, args, meaning,
         ifAbsent: ifAbsent);
   }
 
@@ -88,34 +87,26 @@
 abstract class MessageLookupByLibrary {
   /// Return the localized version of a message. We are passed the original
   /// version of the message, which consists of a
-  /// [message_str] that will be translated, and which may be interpolated
-  /// based on one or more variables, a [desc] providing a description of usage
-  /// for the [message_str], and a map of [examples] for each data element to be
-  /// substituted into the message.
+  /// [messageText] that will be translated, and which may be interpolated
+  /// based on one or more variables.
   ///
   /// For example, if message="Hello, $name", then
   /// examples = {'name': 'Sparky'}. If not using the user's default locale, or
   /// if the locale is not easily detectable, explicitly pass [locale].
   ///
-  /// The values of [desc] and [examples] are not used at run-time but are only
-  /// made available to the translators, so they MUST be simple Strings
-  /// available at compile time: no String interpolation or concatenation.  The
-  /// expected usage of this is inside a function that takes as parameters the
-  /// variables used in the interpolated string.
-  ///
   /// Ultimately, the information about the enclosing function and its arguments
   /// will be extracted automatically but for the time being it must be passed
   /// explicitly in the [name] and [args] arguments.
-  String lookupMessage(
-      String message_str, String locale, String name, List args, String meaning,
+  String lookupMessage(String messageText, String locale, String name,
+      List<dynamic> args, String meaning,
       {MessageIfAbsent ifAbsent}) {
     var notFound = false;
-    var actualName = computeMessageName(name, message_str, meaning);
+    var actualName = computeMessageName(name, messageText, meaning);
     if (actualName == null) notFound = true;
     var translation = this[actualName];
     notFound = notFound || (translation == null);
     if (notFound) {
-      return ifAbsent == null ? message_str : ifAbsent(message_str, args);
+      return ifAbsent == null ? messageText : ifAbsent(messageText, args);
     } else {
       args = args ?? const [];
       return evaluateMessage(translation, args);
@@ -123,12 +114,12 @@
   }
 
   /// Evaluate the translated message and return the translated string.
-  String evaluateMessage(translation, List args) {
+  String evaluateMessage(translation, List<dynamic> args) {
     return Function.apply(translation, args);
   }
 
   /// Return our message with the given name
-  operator [](String messageName) => messages[messageName];
+  dynamic operator [](String messageName) => messages[messageName];
 
   /// Subclasses should override this to return a list of their message
   /// implementations. In this class these are functions, but subclasses may
@@ -138,9 +129,10 @@
   /// Subclasses should override this to return their locale, e.g. 'en_US'
   String get localeName;
 
-  toString() => localeName;
+  String toString() => localeName;
 
   /// Return a function that returns the given string.
   /// An optimization for dart2js, used from the generated code.
-  static simpleMessage(translatedString) => () => translatedString;
+  static String Function() simpleMessage(translatedString) =>
+      () => translatedString;
 }
diff --git a/lib/number_symbols.dart b/lib/number_symbols.dart
index a18145b..3c18637 100644
--- a/lib/number_symbols.dart
+++ b/lib/number_symbols.dart
@@ -3,6 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 library number_symbols;
 
+// Suppress naming issues as changes would be breaking.
+// ignore_for_file: avoid_types_as_parameter_names, non_constant_identifier_names
+
 /// This holds onto information about how a particular locale formats
 /// numbers. It contains strings for things like the decimal separator, digit to
 /// use for "0" and infinity. We expect the data for instances to be generated
@@ -43,7 +46,7 @@
       this.CURRENCY_PATTERN,
       this.DEF_CURRENCY_CODE});
 
-  toString() => NAME;
+  String toString() => NAME;
 }
 
 class CompactNumberSymbols {
diff --git a/lib/number_symbols_data.dart b/lib/number_symbols_data.dart
index d762eb4..146c4e3 100644
--- a/lib/number_symbols_data.dart
+++ b/lib/number_symbols_data.dart
@@ -14,11 +14,13 @@
 /// modification must be documented in this section, and should be
 /// removed after those changes land to CLDR.
 
+// MANUAL EDIT TO SUPPRESS WARNINGS IN GENERATED CODE
+// ignore_for_file: unnecessary_new, prefer_single_quotes, prefer_const_constructors
 library number_symbol_data;
 
 import "number_symbols.dart";
 
-Map numberFormatSymbols = <String, NumberSymbols>{
+Map<dynamic, dynamic> numberFormatSymbols = <String, NumberSymbols>{
   // Number formatting symbols for locale af.
   "af": new NumberSymbols(
       NAME: "af",
diff --git a/lib/src/data/dates/locale_list.dart b/lib/src/data/dates/locale_list.dart
index 1581cca..b62354e 100644
--- a/lib/src/data/dates/locale_list.dart
+++ b/lib/src/data/dates/locale_list.dart
@@ -4,118 +4,118 @@
 
 /// Hard-coded list of all available locales for dates.
 final availableLocalesForDateFormatting = const [
-  "en_ISO",
-  "af",
-  "am",
-  "ar",
-  "ar_DZ",
-  "ar_EG",
-  "az",
-  "be",
-  "bg",
-  "bn",
-  "br",
-  "bs",
-  "ca",
-  "chr",
-  "cs",
-  "cy",
-  "da",
-  "de",
-  "de_AT",
-  "de_CH",
-  "el",
-  "en",
-  "en_AU",
-  "en_CA",
-  "en_GB",
-  "en_IE",
-  "en_IN",
-  "en_MY",
-  "en_SG",
-  "en_US",
-  "en_ZA",
-  "es",
-  "es_419",
-  "es_ES",
-  "es_MX",
-  "es_US",
-  "et",
-  "eu",
-  "fa",
-  "fi",
-  "fil",
-  "fr",
-  "fr_CA",
-  "fr_CH",
-  "ga",
-  "gl",
-  "gsw",
-  "gu",
-  "haw",
-  "he",
-  "hi",
-  "hr",
-  "hu",
-  "hy",
-  "id",
-  "in",
-  "is",
-  "it",
-  "it_CH",
-  "iw",
-  "ja",
-  "ka",
-  "kk",
-  "km",
-  "kn",
-  "ko",
-  "ky",
-  "ln",
-  "lo",
-  "lt",
-  "lv",
-  "mk",
-  "ml",
-  "mn",
-  "mr",
-  "ms",
-  "mt",
-  "my",
-  "nb",
-  "ne",
-  "nl",
-  "no",
-  "no_NO",
-  "or",
-  "pa",
-  "pl",
-  "ps",
-  "pt",
-  "pt_BR",
-  "pt_PT",
-  "ro",
-  "ru",
-  "si",
-  "sk",
-  "sl",
-  "sq",
-  "sr",
-  "sr_Latn",
-  "sv",
-  "sw",
-  "ta",
-  "te",
-  "th",
-  "tl",
-  "tr",
-  "uk",
-  "ur",
-  "uz",
-  "vi",
-  "zh",
-  "zh_CN",
-  "zh_HK",
-  "zh_TW",
-  "zu"
+  'en_ISO',
+  'af',
+  'am',
+  'ar',
+  'ar_DZ',
+  'ar_EG',
+  'az',
+  'be',
+  'bg',
+  'bn',
+  'br',
+  'bs',
+  'ca',
+  'chr',
+  'cs',
+  'cy',
+  'da',
+  'de',
+  'de_AT',
+  'de_CH',
+  'el',
+  'en',
+  'en_AU',
+  'en_CA',
+  'en_GB',
+  'en_IE',
+  'en_IN',
+  'en_MY',
+  'en_SG',
+  'en_US',
+  'en_ZA',
+  'es',
+  'es_419',
+  'es_ES',
+  'es_MX',
+  'es_US',
+  'et',
+  'eu',
+  'fa',
+  'fi',
+  'fil',
+  'fr',
+  'fr_CA',
+  'fr_CH',
+  'ga',
+  'gl',
+  'gsw',
+  'gu',
+  'haw',
+  'he',
+  'hi',
+  'hr',
+  'hu',
+  'hy',
+  'id',
+  'in',
+  'is',
+  'it',
+  'it_CH',
+  'iw',
+  'ja',
+  'ka',
+  'kk',
+  'km',
+  'kn',
+  'ko',
+  'ky',
+  'ln',
+  'lo',
+  'lt',
+  'lv',
+  'mk',
+  'ml',
+  'mn',
+  'mr',
+  'ms',
+  'mt',
+  'my',
+  'nb',
+  'ne',
+  'nl',
+  'no',
+  'no_NO',
+  'or',
+  'pa',
+  'pl',
+  'ps',
+  'pt',
+  'pt_BR',
+  'pt_PT',
+  'ro',
+  'ru',
+  'si',
+  'sk',
+  'sl',
+  'sq',
+  'sr',
+  'sr_Latn',
+  'sv',
+  'sw',
+  'ta',
+  'te',
+  'th',
+  'tl',
+  'tr',
+  'uk',
+  'ur',
+  'uz',
+  'vi',
+  'zh',
+  'zh_CN',
+  'zh_HK',
+  'zh_TW',
+  'zu'
 ];
diff --git a/lib/src/date_format_internal.dart b/lib/src/date_format_internal.dart
index 27924d9..f0ac494 100644
--- a/lib/src/date_format_internal.dart
+++ b/lib/src/date_format_internal.dart
@@ -13,8 +13,9 @@
 library date_format_internal;
 
 import 'dart:async';
-import 'intl_helpers.dart';
+
 import '../date_symbols.dart';
+import 'intl_helpers.dart';
 
 /// This holds the symbols to be used for date/time formatting, indexed
 /// by locale. Note that it will be set differently during initialization,
@@ -37,8 +38,8 @@
   lastDateSymbolLocale = null;
 }
 
-dynamic _dateTimeSymbols = new UninitializedLocaleData(
-    'initializeDateFormatting(<locale>)', en_USSymbols);
+dynamic _dateTimeSymbols =
+    UninitializedLocaleData('initializeDateFormatting(<locale>)', en_USSymbols);
 
 /// Cache the last used symbols to reduce repeated lookups.
 DateSymbols cachedDateSymbols;
@@ -53,7 +54,7 @@
 /// result in an informative error message.
 // TODO(alanknight): Have a valid type for this. Currently it can be an
 // UninitializedLocaleData, Map, or LazyLocaleData.
-dynamic dateTimePatterns = new UninitializedLocaleData(
+dynamic dateTimePatterns = UninitializedLocaleData(
     'initializeDateFormatting(<locale>)', en_USPatterns);
 
 /// Initialize the symbols dictionary. This should be passed a function that
@@ -61,7 +62,7 @@
 /// initializing the data is an expensive operation it need only be done once,
 /// no matter how many times this method is called.
 void initializeDateSymbols(Function symbols) {
-  if (dateTimeSymbols is UninitializedLocaleData) {
+  if (dateTimeSymbols is UninitializedLocaleData<dynamic>) {
     dateTimeSymbols = symbols();
   }
 }
@@ -71,11 +72,11 @@
 /// initializing the data is an expensive operation it need only be done once,
 /// no matter how many times this method is called.
 void initializeDatePatterns(Function patterns) {
-  if (dateTimePatterns is UninitializedLocaleData) {
+  if (dateTimePatterns is UninitializedLocaleData<dynamic>) {
     dateTimePatterns = patterns();
   }
 }
 
-Future initializeIndividualLocaleDateFormatting(Function init) {
+Future<dynamic> initializeIndividualLocaleDateFormatting(Function init) {
   return init(dateTimeSymbols, dateTimePatterns);
 }
diff --git a/lib/src/file_data_reader.dart b/lib/src/file_data_reader.dart
index d5d1ff5..10b6edc 100644
--- a/lib/src/file_data_reader.dart
+++ b/lib/src/file_data_reader.dart
@@ -8,8 +8,9 @@
 library file_data_reader;
 
 import 'dart:async';
-import 'package:path/path.dart';
 import 'dart:io';
+
+import 'package:path/path.dart';
 import 'intl_helpers.dart';
 
 class FileDataReader implements LocaleDataReader {
@@ -19,8 +20,8 @@
   FileDataReader(this.path);
 
   /// Read the locale data found for [locale] on our [path].
-  Future read(String locale) {
-    var file = new File(join(path, '$locale.json'));
+  Future<String> read(String locale) {
+    var file = File(join(path, '$locale.json'));
     return file.readAsString();
   }
 }
diff --git a/lib/src/http_request_data_reader.dart b/lib/src/http_request_data_reader.dart
index c9c6cd6..da11908 100644
--- a/lib/src/http_request_data_reader.dart
+++ b/lib/src/http_request_data_reader.dart
@@ -16,8 +16,8 @@
   String url;
   HttpRequestDataReader(this.url);
 
-  Future read(String locale) {
-    var request = new HttpRequest();
+  Future<String> read(String locale) {
+    var request = HttpRequest();
     request.timeout = 5000;
     return _getString('$url$locale.json', request).then((r) => r.responseText);
   }
@@ -26,7 +26,7 @@
   /// of HttpRequest getString, but was the simplest way I could find to
   /// issue a request with a timeout.
   Future<HttpRequest> _getString(String url, HttpRequest xhr) {
-    var completer = new Completer<HttpRequest>();
+    var completer = Completer<HttpRequest>();
     xhr.open('GET', url, async: true);
     xhr.onLoad.listen((e) {
       // Note: file:// URIs have status of 0.
diff --git a/lib/src/intl/bidi_formatter.dart b/lib/src/intl/bidi_formatter.dart
index c40fd5e..f275d23 100644
--- a/lib/src/intl/bidi_formatter.dart
+++ b/lib/src/intl/bidi_formatter.dart
@@ -4,6 +4,9 @@
 
 part of intl;
 
+// Suppress naming issues as changing them would be breaking.
+// ignore_for_file: non_constant_identifier_names
+
 /// Bidi stands for Bi-directional text.  According to
 /// [Wikipedia](http://en.wikipedia.org/wiki/Bi-directional_text):
 /// Bi-directional text is text containing text in both text directionalities,
@@ -58,7 +61,7 @@
   TextDirection contextDirection;
 
   /// Indicates if we should always wrap the formatted text in a &lt;span&lt;,.
-  bool _alwaysSpan;
+  final bool _alwaysSpan;
 
   /// Create a formatting object with a direction. If [alwaysSpan] is true we
   /// should always use a `span` tag, even when the input directionality is
@@ -93,9 +96,9 @@
   /// a trailing unicode BiDi mark matching the context directionality is
   /// appended (LRM or RLM). If [isHtml] is false, we HTML-escape the [text].
   String wrapWithSpan(String text,
-      {bool isHtml: false, bool resetDir: true, TextDirection direction}) {
-    if (direction == null) direction = estimateDirection(text, isHtml: isHtml);
-    var result;
+      {bool isHtml = false, bool resetDir = true, TextDirection direction}) {
+    direction ??= estimateDirection(text, isHtml: isHtml);
+    String result;
     if (!isHtml) text = const HtmlEscape().convert(text);
     var directionChange = contextDirection.isDirectionChange(direction);
     if (_alwaysSpan || directionChange) {
@@ -128,12 +131,12 @@
   /// [isHtml]. [isHtml] is used to designate if the text contains HTML (escaped
   /// or unescaped).
   String wrapWithUnicode(String text,
-      {bool isHtml: false, bool resetDir: true, TextDirection direction}) {
-    if (direction == null) direction = estimateDirection(text, isHtml: isHtml);
+      {bool isHtml = false, bool resetDir = true, TextDirection direction}) {
+    direction ??= estimateDirection(text, isHtml: isHtml);
     var result = text;
     if (contextDirection.isDirectionChange(direction)) {
       var marker = direction == TextDirection.RTL ? Bidi.RLE : Bidi.LRE;
-      result = "${marker}$text${Bidi.PDF}";
+      result = '$marker$text${Bidi.PDF}';
     }
     return result + (resetDir ? _resetDir(text, direction, isHtml) : '');
   }
@@ -142,7 +145,7 @@
   /// general-purpose method (using relative word counts). A
   /// TextDirection.UNKNOWN return value indicates completely neutral input.
   /// [isHtml] is true if [text] HTML or HTML-escaped.
-  TextDirection estimateDirection(String text, {bool isHtml: false}) {
+  TextDirection estimateDirection(String text, {bool isHtml = false}) {
     return Bidi.estimateDirectionOfText(text, isHtml: isHtml); //TODO~!!!
   }
 
diff --git a/lib/src/intl/bidi_utils.dart b/lib/src/intl/bidi_utils.dart
index 438ef29..7e8be01 100644
--- a/lib/src/intl/bidi_utils.dart
+++ b/lib/src/intl/bidi_utils.dart
@@ -4,6 +4,9 @@
 
 part of intl;
 
+// Suppress naming issues as changing them would be breaking.
+// ignore_for_file: constant_identifier_names
+
 /// Bidi stands for Bi-directional text.  According to
 /// http://en.wikipedia.org/wiki/Bi-directional_text: Bi-directional text is
 /// text containing text in both text directionalities, both right-to-left (RTL)
@@ -21,12 +24,12 @@
 /// bidi functionality in the given directional context, instead of using
 /// bidi_utils.dart directly.
 class TextDirection {
-  static const LTR = const TextDirection._('LTR', 'ltr');
-  static const RTL = const TextDirection._('RTL', 'rtl');
+  static const LTR = TextDirection._('LTR', 'ltr');
+  static const RTL = TextDirection._('RTL', 'rtl');
   // If the directionality of the text cannot be determined and we are not using
   // the context direction (or if the context direction is unknown), then the
   // text falls back on the more common ltr direction.
-  static const UNKNOWN = const TextDirection._('UNKNOWN', 'ltr');
+  static const UNKNOWN = TextDirection._('UNKNOWN', 'ltr');
 
   /// Textual representation of the directionality constant. One of
   /// 'LTR', 'RTL', or 'UNKNOWN'.
@@ -43,9 +46,11 @@
       otherDirection != TextDirection.UNKNOWN && this != otherDirection;
 }
 
+// ignore: avoid_classes_with_only_static_members
 /// This provides utility methods for working with bidirectional text. All
 /// of the methods are static, and are organized into a class primarily to
 /// group them together for documentation and discoverability.
+// TODO(alanknight): Consider a better way of organizing these.
 class Bidi {
   /// Unicode "Left-To-Right Embedding" (LRE) character.
   static const LRE = '\u202A';
@@ -63,7 +68,7 @@
   static const RLM = '\u200F';
 
   /// Constant to define the threshold of RTL directionality.
-  static num _RTL_DETECTION_THRESHOLD = 0.40;
+  static const _RTL_DETECTION_THRESHOLD = 0.40;
 
   /// Practical patterns to identify strong LTR and RTL characters,
   /// respectively.  These patterns are not completely correct according to the
@@ -86,20 +91,20 @@
     // The regular expression is simplified for an HTML tag (opening or
     // closing) or an HTML escape. We might want to skip over such expressions
     // when estimating the text directionality.
-    return text.replaceAll(new RegExp(r'<[^>]*>|&[^;]+;'), ' ');
+    return text.replaceAll(RegExp(r'<[^>]*>|&[^;]+;'), ' ');
   }
 
   /// Determines if the first character in [text] with strong directionality is
   /// LTR. If [isHtml] is true, the text is HTML or HTML-escaped.
   static bool startsWithLtr(String text, [isHtml = false]) {
-    return new RegExp('^[^$_RTL_CHARS]*[$_LTR_CHARS]')
+    return RegExp('^[^$_RTL_CHARS]*[$_LTR_CHARS]')
         .hasMatch(isHtml ? stripHtmlIfNeeded(text) : text);
   }
 
   /// Determines if the first character in [text] with strong directionality is
   /// RTL. If [isHtml] is true, the text is HTML or HTML-escaped.
   static bool startsWithRtl(String text, [isHtml = false]) {
-    return new RegExp('^[^$_LTR_CHARS]*[$_RTL_CHARS]')
+    return RegExp('^[^$_LTR_CHARS]*[$_RTL_CHARS]')
         .hasMatch(isHtml ? stripHtmlIfNeeded(text) : text);
   }
 
@@ -107,7 +112,7 @@
   /// character in [text] is LTR. If [isHtml] is true, the text is HTML or
   /// HTML-escaped.
   static bool endsWithLtr(String text, [isHtml = false]) {
-    return new RegExp('[$_LTR_CHARS][^$_RTL_CHARS]*\$')
+    return RegExp('[$_LTR_CHARS][^$_RTL_CHARS]*\$')
         .hasMatch(isHtml ? stripHtmlIfNeeded(text) : text);
   }
 
@@ -115,25 +120,25 @@
   /// character in [text] is RTL. If [isHtml] is true, the text is HTML or
   /// HTML-escaped.
   static bool endsWithRtl(String text, [isHtml = false]) {
-    return new RegExp('[$_RTL_CHARS][^$_LTR_CHARS]*\$')
+    return RegExp('[$_RTL_CHARS][^$_LTR_CHARS]*\$')
         .hasMatch(isHtml ? stripHtmlIfNeeded(text) : text);
   }
 
   /// Determines if the given [text] has any LTR characters in it.
   /// If [isHtml] is true, the text is HTML or HTML-escaped.
   static bool hasAnyLtr(String text, [isHtml = false]) {
-    return new RegExp(r'[' '$_LTR_CHARS' r']')
+    return RegExp(r'[' '$_LTR_CHARS' r']')
         .hasMatch(isHtml ? stripHtmlIfNeeded(text) : text);
   }
 
   /// Determines if the given [text] has any RTL characters in it.
   /// If [isHtml] is true, the text is HTML or HTML-escaped.
   static bool hasAnyRtl(String text, [isHtml = false]) {
-    return new RegExp(r'[' '$_RTL_CHARS' r']')
+    return RegExp(r'[' '$_RTL_CHARS' r']')
         .hasMatch(isHtml ? stripHtmlIfNeeded(text) : text);
   }
 
-  static final _rtlLocaleRegex = new RegExp(
+  static final _rtlLocaleRegex = RegExp(
       r'^(ar|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_]'
       r'(Arab|Hebr|Thaa|Nkoo|Tfng))(?!.*[-_](Latn|Cyrl)($|-|_))'
       r'($|-|_)',
@@ -209,9 +214,9 @@
   /// FF and IE).
   static String _enforceInHtmlHelper(String html, String direction) {
     if (html.startsWith('<')) {
-      StringBuffer buffer = new StringBuffer();
+      var buffer = StringBuffer();
       var startIndex = 0;
-      Match match = new RegExp('<\\w+').firstMatch(html);
+      Match match = RegExp('<\\w+').firstMatch(html);
       if (match != null) {
         buffer
           ..write(html.substring(startIndex, match.end))
@@ -230,10 +235,10 @@
   /// RTL directionality, regardless of the estimated directionality.
   static String guardBracketInHtml(String str, [bool isRtlContext]) {
     var useRtl = isRtlContext == null ? hasAnyRtl(str) : isRtlContext;
-    RegExp matchingBrackets =
-        new RegExp(r'(\(.*?\)+)|(\[.*?\]+)|(\{.*?\}+)|(&lt;.*?(&gt;)+)');
+    var matchingBrackets =
+        RegExp(r'(\(.*?\)+)|(\[.*?\]+)|(\{.*?\}+)|(&lt;.*?(&gt;)+)');
     return _guardBracketHelper(str, matchingBrackets,
-        '<span dir=${useRtl? "rtl" : "ltr"}>', '</span>');
+        '<span dir=${useRtl ? "rtl" : "ltr"}>', '</span>');
   }
 
   /// Apply bracket guard to [str] using LRM and RLM. This is to address the
@@ -245,8 +250,8 @@
   static String guardBracketInText(String str, [bool isRtlContext]) {
     var useRtl = isRtlContext == null ? hasAnyRtl(str) : isRtlContext;
     var mark = useRtl ? RLM : LRM;
-    return _guardBracketHelper(str,
-        new RegExp(r'(\(.*?\)+)|(\[.*?\]+)|(\{.*?\}+)|(<.*?>+)'), mark, mark);
+    return _guardBracketHelper(
+        str, RegExp(r'(\(.*?\)+)|(\[.*?\]+)|(\{.*?\}+)|(<.*?>+)'), mark, mark);
   }
 
   /// (Mostly) reimplements the $& functionality of "replace" in JavaScript.
@@ -257,16 +262,16 @@
   /// is implemented in Dart.  // See Issue 2979.
   static String _guardBracketHelper(String str, RegExp regexp,
       [String before, String after]) {
-    var buffer = new StringBuffer();
+    var buffer = StringBuffer();
     var startIndex = 0;
-    regexp.allMatches(str).forEach((match) {
+    for (var match in regexp.allMatches(str)) {
       buffer
         ..write(str.substring(startIndex, match.start))
         ..write(before)
         ..write(str.substring(match.start, match.end))
         ..write(after);
       startIndex = match.end;
-    });
+    }
     return (buffer..write(str.substring(startIndex))).toString();
   }
 
@@ -281,24 +286,24 @@
   /// Otherwise, returns UNKNOWN, which is used to mean `neutral`.
   /// Numbers and URLs are counted as weakly LTR.
   static TextDirection estimateDirectionOfText(String text,
-      {bool isHtml: false}) {
+      {bool isHtml = false}) {
     text = isHtml ? stripHtmlIfNeeded(text) : text;
     var rtlCount = 0;
     var total = 0;
     var hasWeaklyLtr = false;
     // Split a string into 'words' for directionality estimation based on
     // relative word counts.
-    for (String token in text.split(new RegExp(r'\s+'))) {
+    for (var token in text.split(RegExp(r'\s+'))) {
       if (startsWithRtl(token)) {
         rtlCount++;
         total++;
-      } else if (new RegExp(r'^http://').hasMatch(token)) {
+      } else if (RegExp(r'^http://').hasMatch(token)) {
         // Checked if token looks like something that must always be LTR even in
         // RTL text, such as a URL.
         hasWeaklyLtr = true;
       } else if (hasAnyLtr(token)) {
         total++;
-      } else if (new RegExp(r'\d').hasMatch(token)) {
+      } else if (RegExp(r'\d').hasMatch(token)) {
         // Checked if token contains any numerals.
         hasWeaklyLtr = true;
       }
@@ -316,18 +321,18 @@
   /// Replace the double and single quote directly after a Hebrew character in
   /// [str] with GERESH and GERSHAYIM. This is most likely the user's intention.
   static String normalizeHebrewQuote(String str) {
-    StringBuffer buf = new StringBuffer();
-    if (str.length > 0) {
+    var buf = StringBuffer();
+    if (str.isNotEmpty) {
       buf.write(str.substring(0, 1));
     }
     // Start at 1 because we're looking for the patterns [\u0591-\u05f2])" or
     // [\u0591-\u05f2]'.
-    for (int i = 1; i < str.length; i++) {
+    for (var i = 1; i < str.length; i++) {
       if (str.substring(i, i + 1) == '"' &&
-          new RegExp('[\u0591-\u05f2]').hasMatch(str.substring(i - 1, i))) {
+          RegExp('[\u0591-\u05f2]').hasMatch(str.substring(i - 1, i))) {
         buf.write('\u05f4');
       } else if (str.substring(i, i + 1) == "'" &&
-          new RegExp('[\u0591-\u05f2]').hasMatch(str.substring(i - 1, i))) {
+          RegExp('[\u0591-\u05f2]').hasMatch(str.substring(i - 1, i))) {
         buf.write('\u05f3');
       } else {
         buf.write(str.substring(i, i + 1));
@@ -339,6 +344,6 @@
   /// Check the estimated directionality of [str], return true if the piece of
   /// text should be laid out in RTL direction. If [isHtml] is true, the string
   /// is HTML or HTML-escaped.
-  static bool detectRtlDirectionality(String str, {bool isHtml: false}) =>
+  static bool detectRtlDirectionality(String str, {bool isHtml = false}) =>
       estimateDirectionOfText(str, isHtml: isHtml) == TextDirection.RTL;
 }
diff --git a/lib/src/intl/compact_number_format.dart b/lib/src/intl/compact_number_format.dart
index 5818018..a1e459d 100644
--- a/lib/src/intl/compact_number_format.dart
+++ b/lib/src/intl/compact_number_format.dart
@@ -4,6 +4,9 @@
 
 part of intl;
 
+// Suppress naming issues as changes would be breaking.
+// ignore_for_file: constant_identifier_names
+
 /// An abstract class for compact number styles.
 abstract class _CompactStyleBase {
   /// The _CompactStyle for the sign of [number], i.e. positive or
@@ -14,7 +17,7 @@
   ///
   /// If the pattern is
   ///
-  ///       4: "00K",
+  ///       4: '00K',
   ///
   /// then this is 5, meaning we expect this to be a 5-digit (or more)
   /// number. We will scale by 1000 and expect 2 integer digits remaining, so we
@@ -42,7 +45,7 @@
       number < 0 ? negativeStyle : positiveStyle;
   int get totalDigits => positiveStyle.totalDigits;
   int get divisor => positiveStyle.divisor;
-  get allStyles => [positiveStyle, negativeStyle];
+  List<_CompactStyle> get allStyles => [positiveStyle, negativeStyle];
 }
 
 /// Represents a compact format for a particular base
@@ -61,11 +64,11 @@
 class _CompactStyle extends _CompactStyleBase {
   _CompactStyle(
       {this.pattern,
-      this.requiredDigits: 0,
-      this.divisor: 1,
-      this.expectedDigits: 1,
-      this.prefix: '',
-      this.suffix: ''});
+      this.requiredDigits = 0,
+      this.divisor = 1,
+      this.expectedDigits = 1,
+      this.prefix = '',
+      this.suffix = ''});
 
   /// The pattern on which this is based.
   ///
@@ -99,16 +102,16 @@
   ///
   /// If the pattern is
   ///
-  ///       4: "00K",
+  ///       4: '00K',
   ///
   /// then this is 5, meaning we expect this to be a 5-digit (or more)
   /// number. We will scale by 1000 and expect 2 integer digits remaining, so we
   /// get something like '12K'. This is used to find the closest pattern for a
   /// number.
-  get totalDigits => requiredDigits + expectedDigits - 1;
+  int get totalDigits => requiredDigits + expectedDigits - 1;
 
   /// Return true if this is the fallback compact pattern, printing the number
-  /// un-compacted. e.g. 1200 might print as "1.2K", but 12 just prints as "12".
+  /// un-compacted. e.g. 1200 might print as '1.2K', but 12 just prints as '12'.
   ///
   /// For currencies, with the fallback pattern we use the super implementation
   /// so that we will respect things like the default number of decimal digits
@@ -119,14 +122,13 @@
   ///
   /// This happens if the pattern has no abbreviation for scaling (e.g. K, M).
   /// So either the pattern is empty or it is of a form like '0 $'. This is a
-  /// workaround for locales like "it", which include patterns with no suffix
+  /// workaround for locales like 'it', which include patterns with no suffix
   /// for numbers >= 1000 but < 1,000,000.
   bool get printsAsIs =>
-      isFallback ||
-      pattern.replaceAll(new RegExp('[0\u00a0\u00a4]'), '').isEmpty;
+      isFallback || pattern.replaceAll(RegExp('[0\u00a0\u00a4]'), '').isEmpty;
 
   _CompactStyle styleForSign(number) => this;
-  get allStyles => [this];
+  List<_CompactStyle> get allStyles => [this];
 }
 
 enum _CompactFormatType {
@@ -136,7 +138,7 @@
 }
 
 class _CompactNumberFormat extends NumberFormat {
-  /// A default, using the decimal pattern, for the [getPattern] constructor parameter.
+  /// A default, using the decimal pattern, for the `getPattern` constructor parameter.
   static String _forDecimal(NumberSymbols symbols) => symbols.DECIMAL_PATTERN;
 
   // Will be either the COMPACT_DECIMAL_SHORT_PATTERN,
@@ -150,10 +152,10 @@
       _CompactFormatType formatType,
       String name,
       String currencySymbol,
-      String getPattern(NumberSymbols symbols): _forDecimal,
-      String computeCurrencySymbol(NumberFormat),
+      String Function(NumberSymbols) getPattern = _forDecimal,
+      String Function(NumberFormat) computeCurrencySymbol,
       int decimalDigits,
-      bool isForCurrency: false})
+      bool isForCurrency = false})
       : super._forPattern(locale, getPattern,
             name: name,
             currencySymbol: currencySymbol,
@@ -176,12 +178,12 @@
         _patterns = compactSymbols.COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN;
         break;
       default:
-        throw new ArgumentError.notNull("formatType");
+        throw ArgumentError.notNull('formatType');
     }
     _patterns.forEach((int impliedDigits, String pattern) {
-      if (pattern.contains(";")) {
-        var patterns = pattern.split(";");
-        _styles.add(new _CompactStyleWithNegative(
+      if (pattern.contains(';')) {
+        var patterns = pattern.split(';');
+        _styles.add(_CompactStyleWithNegative(
             _createStyle(patterns.first, impliedDigits),
             _createStyle(patterns.last, impliedDigits)));
       } else {
@@ -192,12 +194,12 @@
     // Reverse the styles so that we look through them from largest to smallest.
     _styles = _styles.reversed.toList();
     // Add a fallback style that just prints the number.
-    _styles.add(new _CompactStyle());
+    _styles.add(_CompactStyle());
   }
 
-  final _regex = new RegExp('([^0]*)(0+)(.*)');
+  final _regex = RegExp('([^0]*)(0+)(.*)');
 
-  final _justZeros = new RegExp(r'^0*$');
+  final _justZeros = RegExp(r'^0*$');
 
   /// Does pattern have any additional characters or is it just zeros.
   bool _hasNonZeroContent(String pattern) => !_justZeros.hasMatch(pattern);
@@ -217,7 +219,7 @@
     if (_hasNonZeroContent(pattern)) {
       divisor = pow(10, impliedDigits - integerDigits + 1);
     }
-    return new _CompactStyle(
+    return _CompactStyle(
         pattern: pattern,
         requiredDigits: impliedDigits,
         expectedDigits: integerDigits,
@@ -243,12 +245,12 @@
     // so remove it and replace. This has the remote possibility of a false
     // positive, but it seems unlikely that e.g. USD would occur as a string in
     // a regular number.
-    if (this._isForCurrency && !_style.isFallback) {
+    if (_isForCurrency && !_style.isFallback) {
       formatted = formatted.replaceFirst(currencySymbol, '').trim();
       prefix = prefix.replaceFirst('\u00a4', currencySymbol);
       suffix = suffix.replaceFirst('\u00a4', currencySymbol);
     }
-    var withExtras = "${prefix}$formatted${suffix}";
+    var withExtras = '$prefix$formatted$suffix';
     _style = null;
     return withExtras;
   }
@@ -285,8 +287,8 @@
     var divided = numerator ~/ denominator;
     var integerPart = divided.toInt();
     if (divided != integerPart) {
-      throw new FormatException(
-          "Number too big to use with compact format", numerator);
+      throw FormatException(
+          'Number too big to use with compact format', numerator);
     }
     var remainder = numerator.remainder(denominator).toInt();
     var originalFraction = numerator - (numerator ~/ 1);
@@ -312,8 +314,8 @@
         return style.styleForSign(number);
       }
     }
-    throw new FormatException(
-        "No compact style found for number. This should not happen", number);
+    throw FormatException(
+        'No compact style found for number. This should not happen', number);
   }
 
   Iterable<_CompactStyle> get _stylesForSearching =>
@@ -330,7 +332,7 @@
         }
       }
     }
-    throw new FormatException(
+    throw FormatException(
         "Cannot parse compact number in locale '$locale'", text);
   }
 
diff --git a/lib/src/intl/date_format.dart b/lib/src/intl/date_format.dart
index 55901ff..5625802 100644
--- a/lib/src/intl/date_format.dart
+++ b/lib/src/intl/date_format.dart
@@ -4,6 +4,9 @@
 
 part of intl;
 
+// Suppress naming issues as changes would breaking.
+// ignore_for_file: non_constant_identifier_names, constant_identifier_names
+
 // TODO(efortuna): Customized pattern system -- suggested by i18n needs
 // feedback on appropriateness.
 /// DateFormat is for formatting and parsing dates in a locale-sensitive
@@ -16,7 +19,7 @@
 /// date-time strings under certain locales. Date elements that vary across
 /// locales include month name, weekname, field, order, etc.
 ///
-/// Formatting dates in the default "en_US" format does not require any
+/// Formatting dates in the default 'en_US' format does not require any
 /// initialization. e.g.
 ///
 /// ```dart
@@ -25,7 +28,7 @@
 ///
 /// But for other locales, the formatting data for the locale must be
 /// obtained. This can currently be done in one of three ways, determined by
-/// which library you import. In all cases, the "initializeDateFormatting"
+/// which library you import. In all cases, the 'initializeDateFormatting'
 /// method must be called and will return a future that is complete once the
 /// locale data is available. The result of the future isn't important, but the
 /// data for that locale is available to the date formatting and parsing once it
@@ -36,7 +39,7 @@
 ///
 /// ```dart
 /// import 'package:intl/date_symbol_data_local.dart';
-/// initializeDateFormatting("fr_FR", null).then((_) => runMyCode());
+/// initializeDateFormatting('fr_FR', null).then((_) => runMyCode());
 /// ```
 ///
 /// If we are running outside of a browser, we may want to read the data
@@ -44,7 +47,7 @@
 ///
 /// ```dart
 /// import 'package:intl/date_symbol_data_file.dart';
-/// initializeDateFormatting("de_DE", null).then((_) => runMyCode());
+/// initializeDateFormatting('de_DE', null).then((_) => runMyCode());
 /// ```
 ///
 /// If we are running in a browser, we may want to read the data from the
@@ -52,7 +55,7 @@
 ///
 /// ```dart
 /// import 'package:intl/date_symbol_data_http_request.dart';
-/// initializeDateFormatting("pt_BR", null).then((_) => runMyCode());
+/// initializeDateFormatting('pt_BR', null).then((_) => runMyCode());
 /// ```
 ///
 /// The code in example/basic/basic_example.dart shows a full example of
@@ -60,7 +63,7 @@
 ///
 /// Once we have the locale data, we need to specify the particular format.
 /// This library uses the ICU/JDK date/time pattern specification both for
-/// complete format specifications and also the abbreviated "skeleton" form
+/// complete format specifications and also the abbreviated 'skeleton' form
 /// which can also adapt to different locales and is preferred where available.
 ///
 /// Skeletons: These can be specified either as the ICU constant name or as the
@@ -118,8 +121,8 @@
 ///      Pattern                           Result
 ///      ----------------                  -------
 ///      new DateFormat.yMd()             -> 7/10/1996
-///      new DateFormat("yMd")            -> 7/10/1996
-///      new DateFormat.yMMMMd("en_US")   -> July 10, 1996
+///      new DateFormat('yMd')            -> 7/10/1996
+///      new DateFormat.yMMMMd('en_US')   -> July 10, 1996
 ///      new DateFormat.jm()              -> 5:08 PM
 ///      new DateFormat.yMd().add_jm()    -> 7/10/1996 5:08 PM
 ///      new DateFormat.Hm()              -> 17:08 // force 24 hour time
@@ -127,9 +130,9 @@
 /// Explicit Pattern Syntax: Formats can also be specified with a pattern
 /// string.  This can be used for formats that don't have a skeleton available,
 /// but these will not adapt to different locales. For example, in an explicit
-/// pattern the letters "H" and "h" are available for 24 hour and 12 hour time
+/// pattern the letters 'H' and 'h' are available for 24 hour and 12 hour time
 /// formats respectively. But there isn't a way in an explicit pattern to get
-/// the behaviour of the "j" skeleton, which prints 24 hour or 12 hour time
+/// the behaviour of the 'j' skeleton, which prints 24 hour or 12 hour time
 /// according to the conventions of the locale, and also includes am/pm markers
 /// where appropriate. So it is preferable to use the skeletons.
 ///
@@ -169,9 +172,9 @@
 /// * less than 3--use numeric form if one exists
 ///
 /// **Number**: the minimum number of digits. Shorter numbers are zero-padded to
-/// this amount (e.g. if "m" produces "6", "mm" produces "06"). Year is handled
+/// this amount (e.g. if 'm' produces '6', 'mm' produces '06'). Year is handled
 /// specially; that is, if the count of 'y' is 2, the Year will be truncated to
-/// 2 digits. (e.g., if "yyyy" produces "1997", "yy" produces "97".) Unlike
+/// 2 digits. (e.g., if 'yyyy' produces '1997', 'yy' produces '97'.) Unlike
 /// other fields, fractional seconds are padded on the right with zero.
 ///
 /// **(Text & Number)**: 3 or over, use text, otherwise use number.
@@ -187,27 +190,27 @@
 ///
 ///     Format Pattern                    Result
 ///     --------------                    -------
-///     "yyyy.MM.dd G 'at' HH:mm:ss vvvv" 1996.07.10 AD at 15:08:56 Pacific Time
-///     "EEE, MMM d, ''yy"                Wed, Jul 10, '96
-///     "h:mm a"                          12:08 PM
-///     "hh 'o''clock' a, zzzz"           12 o'clock PM, Pacific Daylight Time
-///     "K:mm a, vvv"                     0:00 PM, PT
-///     "yyyyy.MMMMM.dd GGG hh:mm aaa"    01996.July.10 AD 12:08 PM
+///     'yyyy.MM.dd G 'at' HH:mm:ss vvvv' 1996.07.10 AD at 15:08:56 Pacific Time
+///     'EEE, MMM d, ''yy'                Wed, Jul 10, '96
+///     'h:mm a'                          12:08 PM
+///     'hh 'o''clock' a, zzzz'           12 o'clock PM, Pacific Daylight Time
+///     'K:mm a, vvv'                     0:00 PM, PT
+///     'yyyyy.MMMMM.dd GGG hh:mm aaa'    01996.July.10 AD 12:08 PM
 ///
-/// When parsing a date string using the abbreviated year pattern ("yy"),
+/// When parsing a date string using the abbreviated year pattern ('yy'),
 /// DateFormat must interpret the abbreviated year relative to some
 /// century. It does this by adjusting dates to be within 80 years before and 20
 /// years after the time the parse function is called. For example, using a
-/// pattern of "MM/dd/yy" and a DateParse instance created on Jan 1, 1997,
-/// the string "01/11/12" would be interpreted as Jan 11, 2012 while the string
-/// "05/04/64" would be interpreted as May 4, 1964. During parsing, only
+/// pattern of 'MM/dd/yy' and a DateParse instance created on Jan 1, 1997,
+/// the string '01/11/12' would be interpreted as Jan 11, 2012 while the string
+/// '05/04/64' would be interpreted as May 4, 1964. During parsing, only
 /// strings consisting of exactly two digits will be parsed into the default
 /// century. Any other numeric string, such as a one digit string, a three or
 /// more digit string will be interpreted as its face value.
 ///
 /// If the year pattern does not have exactly two 'y' characters, the year is
 /// interpreted literally, regardless of the number of digits. So using the
-/// pattern "MM/dd/yyyy", "01/11/12" parses to Jan 11, 12 A.D.
+/// pattern 'MM/dd/yyyy', '01/11/12' parses to Jan 11, 12 A.D.
 
 class DateFormat {
   /// Creates a new DateFormat, using the format specified by [newPattern].
@@ -230,7 +233,7 @@
   /// new DateFormat('EEE, M/d/y');
   /// ```
   ///
-  /// would produce the same result, a date of the form "Wed, 6/27/2012".
+  /// would produce the same result, a date of the form 'Wed, 6/27/2012'.
   ///
   /// The first version would produce a different format string if used in
   /// another locale, but the second format would always be the same.
@@ -241,7 +244,7 @@
     // TODO(alanknight): It should be possible to specify multiple skeletons eg
     // date, time, timezone all separately. Adding many or named parameters to
     // the constructor seems awkward, especially with the possibility of
-    // confusion with the locale. A "fluent" interface with cascading on an
+    // confusion with the locale. A 'fluent' interface with cascading on an
     // instance might work better? A list of patterns is also possible.
     _locale = Intl.verifiedLocale(locale, localeExists);
     addPattern(newPattern);
@@ -251,8 +254,10 @@
   /// and internal format.
   String format(DateTime date) {
     // TODO(efortuna): read optional TimeZone argument (or similar)?
-    var result = new StringBuffer();
-    _formatFields.forEach((field) => result.write(field.format(date)));
+    var result = StringBuffer();
+    for (var field in _formatFields) {
+      result.write(field.format(date));
+    }
     return result.toString();
   }
 
@@ -280,7 +285,7 @@
   DateTime parse(String inputString, [bool utc = false]) =>
       _parse(inputString, utc: utc, strict: false);
 
-  /// Given user input, attempt to parse the [inputString] "loosely" into the
+  /// Given user input, attempt to parse the [inputString] 'loosely' into the
   /// anticipated format, accepting some variations from the strict format.
   ///
   /// If [inputString] is accepted by [parseStrict], just return the result. If
@@ -297,14 +302,14 @@
   ///
   /// For example, this will accept
   ///
-  ///       new DateFormat.yMMMd("en_US").parseLoose("SEp   3 2014");
-  ///       new DateFormat.yMd("en_US").parseLoose("09    03/2014");
-  ///       new DateFormat.yMd("en_US").parseLoose("09 / 03 / 2014");
+  ///       new DateFormat.yMMMd('en_US').parseLoose('SEp   3 2014');
+  ///       new DateFormat.yMd('en_US').parseLoose('09    03/2014');
+  ///       new DateFormat.yMd('en_US').parseLoose('09 / 03 / 2014');
   ///
   /// It will NOT accept
   ///
-  ///      // "Sept" is not a valid month name.
-  ///      new DateFormat.yMMMd("en_US").parseLoose("Sept 3, 2014");
+  ///      // 'Sept' is not a valid month name.
+  ///      new DateFormat.yMMMd('en_US').parseLoose('Sept 3, 2014');
   DateTime parseLoose(String inputString, [bool utc = false]) {
     try {
       return _parse(inputString, utc: utc, strict: true);
@@ -314,13 +319,15 @@
   }
 
   DateTime _parseLoose(String inputString, bool utc) {
-    var dateFields = new _DateBuilder();
+    var dateFields = _DateBuilder();
     if (utc) dateFields.utc = true;
-    var stream = new _Stream(inputString);
-    _formatFields.forEach((f) => f.parseLoose(stream, dateFields));
+    var stream = _Stream(inputString);
+    for (var field in _formatFields) {
+      field.parseLoose(stream, dateFields);
+    }
     if (!stream.atEnd()) {
-      throw new FormatException(
-          "Characters remaining after date parsing in $inputString");
+      throw FormatException(
+          'Characters remaining after date parsing in $inputString');
     }
     dateFields.verify(inputString);
     return dateFields.asDate();
@@ -337,17 +344,19 @@
   DateTime parseStrict(String inputString, [bool utc = false]) =>
       _parse(inputString, utc: utc, strict: true);
 
-  DateTime _parse(String inputString, {bool utc: false, bool strict: false}) {
+  DateTime _parse(String inputString, {bool utc = false, bool strict = false}) {
     // TODO(alanknight): The Closure code refers to special parsing of numeric
     // values with no delimiters, which we currently don't do. Should we?
-    var dateFields = new _DateBuilder();
+    var dateFields = _DateBuilder();
     if (utc) dateFields.utc = true;
-    dateFields._dateOnly = this.dateOnly;
-    var stream = new _Stream(inputString);
-    _formatFields.forEach((f) => f.parse(stream, dateFields));
+    dateFields._dateOnly = dateOnly;
+    var stream = _Stream(inputString);
+    for (var field in _formatFields) {
+      field.parse(stream, dateFields);
+    }
     if (strict && !stream.atEnd()) {
-      throw new FormatException(
-          "Characters remaining after date parsing in $inputString");
+      throw FormatException(
+          'Characters remaining after date parsing in $inputString');
     }
     if (strict) dateFields.verify(inputString);
     return dateFields.asDate();
@@ -382,25 +391,25 @@
   /// Returns a list of all locales for which we have date formatting
   /// information.
   static List<String> allLocalesWithSymbols() =>
-      new List<String>.from(dateTimeSymbols.keys);
+      List<String>.from(dateTimeSymbols.keys);
 
   /// The named constructors for this class are all conveniences for creating
-  /// instances using one of the known "skeleton" formats, and having code
+  /// instances using one of the known 'skeleton' formats, and having code
   /// completion support for discovering those formats.
   /// So,
   ///
   /// ```dart
-  /// new DateFormat.yMd("en_US")
+  /// new DateFormat.yMd('en_US')
   /// ```
   ///
   /// is equivalent to
   ///
   /// ```dart
-  /// new DateFormat("yMd", "en_US")
+  /// new DateFormat('yMd', 'en_US')
   /// ```
   ///
   /// To create a compound format you can use these constructors in combination
-  /// with the "add_*" methods below. e.g.
+  /// with the 'add_*' methods below. e.g.
   ///
   /// ```dart
   /// new DateFormat.yMd().add_Hms();
@@ -408,49 +417,49 @@
   ///
   /// If the optional [locale] is omitted, the format will be created using the
   /// default locale in [Intl.systemLocale].
-  DateFormat.d([locale]) : this("d", locale);
-  DateFormat.E([locale]) : this("E", locale);
-  DateFormat.EEEE([locale]) : this("EEEE", locale);
-  DateFormat.LLL([locale]) : this("LLL", locale);
-  DateFormat.LLLL([locale]) : this("LLLL", locale);
-  DateFormat.M([locale]) : this("M", locale);
-  DateFormat.Md([locale]) : this("Md", locale);
-  DateFormat.MEd([locale]) : this("MEd", locale);
-  DateFormat.MMM([locale]) : this("MMM", locale);
-  DateFormat.MMMd([locale]) : this("MMMd", locale);
-  DateFormat.MMMEd([locale]) : this("MMMEd", locale);
-  DateFormat.MMMM([locale]) : this("MMMM", locale);
-  DateFormat.MMMMd([locale]) : this("MMMMd", locale);
-  DateFormat.MMMMEEEEd([locale]) : this("MMMMEEEEd", locale);
-  DateFormat.QQQ([locale]) : this("QQQ", locale);
-  DateFormat.QQQQ([locale]) : this("QQQQ", locale);
-  DateFormat.y([locale]) : this("y", locale);
-  DateFormat.yM([locale]) : this("yM", locale);
-  DateFormat.yMd([locale]) : this("yMd", locale);
-  DateFormat.yMEd([locale]) : this("yMEd", locale);
-  DateFormat.yMMM([locale]) : this("yMMM", locale);
-  DateFormat.yMMMd([locale]) : this("yMMMd", locale);
-  DateFormat.yMMMEd([locale]) : this("yMMMEd", locale);
-  DateFormat.yMMMM([locale]) : this("yMMMM", locale);
-  DateFormat.yMMMMd([locale]) : this("yMMMMd", locale);
-  DateFormat.yMMMMEEEEd([locale]) : this("yMMMMEEEEd", locale);
-  DateFormat.yQQQ([locale]) : this("yQQQ", locale);
-  DateFormat.yQQQQ([locale]) : this("yQQQQ", locale);
-  DateFormat.H([locale]) : this("H", locale);
-  DateFormat.Hm([locale]) : this("Hm", locale);
-  DateFormat.Hms([locale]) : this("Hms", locale);
-  DateFormat.j([locale]) : this("j", locale);
-  DateFormat.jm([locale]) : this("jm", locale);
-  DateFormat.jms([locale]) : this("jms", locale);
-  DateFormat.jmv([locale]) : this("jmv", locale);
-  DateFormat.jmz([locale]) : this("jmz", locale);
-  DateFormat.jv([locale]) : this("jv", locale);
-  DateFormat.jz([locale]) : this("jz", locale);
-  DateFormat.m([locale]) : this("m", locale);
-  DateFormat.ms([locale]) : this("ms", locale);
-  DateFormat.s([locale]) : this("s", locale);
+  DateFormat.d([locale]) : this('d', locale);
+  DateFormat.E([locale]) : this('E', locale);
+  DateFormat.EEEE([locale]) : this('EEEE', locale);
+  DateFormat.LLL([locale]) : this('LLL', locale);
+  DateFormat.LLLL([locale]) : this('LLLL', locale);
+  DateFormat.M([locale]) : this('M', locale);
+  DateFormat.Md([locale]) : this('Md', locale);
+  DateFormat.MEd([locale]) : this('MEd', locale);
+  DateFormat.MMM([locale]) : this('MMM', locale);
+  DateFormat.MMMd([locale]) : this('MMMd', locale);
+  DateFormat.MMMEd([locale]) : this('MMMEd', locale);
+  DateFormat.MMMM([locale]) : this('MMMM', locale);
+  DateFormat.MMMMd([locale]) : this('MMMMd', locale);
+  DateFormat.MMMMEEEEd([locale]) : this('MMMMEEEEd', locale);
+  DateFormat.QQQ([locale]) : this('QQQ', locale);
+  DateFormat.QQQQ([locale]) : this('QQQQ', locale);
+  DateFormat.y([locale]) : this('y', locale);
+  DateFormat.yM([locale]) : this('yM', locale);
+  DateFormat.yMd([locale]) : this('yMd', locale);
+  DateFormat.yMEd([locale]) : this('yMEd', locale);
+  DateFormat.yMMM([locale]) : this('yMMM', locale);
+  DateFormat.yMMMd([locale]) : this('yMMMd', locale);
+  DateFormat.yMMMEd([locale]) : this('yMMMEd', locale);
+  DateFormat.yMMMM([locale]) : this('yMMMM', locale);
+  DateFormat.yMMMMd([locale]) : this('yMMMMd', locale);
+  DateFormat.yMMMMEEEEd([locale]) : this('yMMMMEEEEd', locale);
+  DateFormat.yQQQ([locale]) : this('yQQQ', locale);
+  DateFormat.yQQQQ([locale]) : this('yQQQQ', locale);
+  DateFormat.H([locale]) : this('H', locale);
+  DateFormat.Hm([locale]) : this('Hm', locale);
+  DateFormat.Hms([locale]) : this('Hms', locale);
+  DateFormat.j([locale]) : this('j', locale);
+  DateFormat.jm([locale]) : this('jm', locale);
+  DateFormat.jms([locale]) : this('jms', locale);
+  DateFormat.jmv([locale]) : this('jmv', locale);
+  DateFormat.jmz([locale]) : this('jmz', locale);
+  DateFormat.jv([locale]) : this('jv', locale);
+  DateFormat.jz([locale]) : this('jz', locale);
+  DateFormat.m([locale]) : this('m', locale);
+  DateFormat.ms([locale]) : this('ms', locale);
+  DateFormat.s([locale]) : this('s', locale);
 
-  /// The "add_*" methods append a particular skeleton to the format, or set
+  /// The 'add_*' methods append a particular skeleton to the format, or set
   /// it as the only format if none was previously set. These are primarily
   /// useful for creating compound formats. For example
   ///
@@ -459,47 +468,47 @@
   /// ```
   ///
   /// would create a date format that prints both the date and the time.
-  DateFormat add_d() => addPattern("d");
-  DateFormat add_E() => addPattern("E");
-  DateFormat add_EEEE() => addPattern("EEEE");
-  DateFormat add_LLL() => addPattern("LLL");
-  DateFormat add_LLLL() => addPattern("LLLL");
-  DateFormat add_M() => addPattern("M");
-  DateFormat add_Md() => addPattern("Md");
-  DateFormat add_MEd() => addPattern("MEd");
-  DateFormat add_MMM() => addPattern("MMM");
-  DateFormat add_MMMd() => addPattern("MMMd");
-  DateFormat add_MMMEd() => addPattern("MMMEd");
-  DateFormat add_MMMM() => addPattern("MMMM");
-  DateFormat add_MMMMd() => addPattern("MMMMd");
-  DateFormat add_MMMMEEEEd() => addPattern("MMMMEEEEd");
-  DateFormat add_QQQ() => addPattern("QQQ");
-  DateFormat add_QQQQ() => addPattern("QQQQ");
-  DateFormat add_y() => addPattern("y");
-  DateFormat add_yM() => addPattern("yM");
-  DateFormat add_yMd() => addPattern("yMd");
-  DateFormat add_yMEd() => addPattern("yMEd");
-  DateFormat add_yMMM() => addPattern("yMMM");
-  DateFormat add_yMMMd() => addPattern("yMMMd");
-  DateFormat add_yMMMEd() => addPattern("yMMMEd");
-  DateFormat add_yMMMM() => addPattern("yMMMM");
-  DateFormat add_yMMMMd() => addPattern("yMMMMd");
-  DateFormat add_yMMMMEEEEd() => addPattern("yMMMMEEEEd");
-  DateFormat add_yQQQ() => addPattern("yQQQ");
-  DateFormat add_yQQQQ() => addPattern("yQQQQ");
-  DateFormat add_H() => addPattern("H");
-  DateFormat add_Hm() => addPattern("Hm");
-  DateFormat add_Hms() => addPattern("Hms");
-  DateFormat add_j() => addPattern("j");
-  DateFormat add_jm() => addPattern("jm");
-  DateFormat add_jms() => addPattern("jms");
-  DateFormat add_jmv() => addPattern("jmv");
-  DateFormat add_jmz() => addPattern("jmz");
-  DateFormat add_jv() => addPattern("jv");
-  DateFormat add_jz() => addPattern("jz");
-  DateFormat add_m() => addPattern("m");
-  DateFormat add_ms() => addPattern("ms");
-  DateFormat add_s() => addPattern("s");
+  DateFormat add_d() => addPattern('d');
+  DateFormat add_E() => addPattern('E');
+  DateFormat add_EEEE() => addPattern('EEEE');
+  DateFormat add_LLL() => addPattern('LLL');
+  DateFormat add_LLLL() => addPattern('LLLL');
+  DateFormat add_M() => addPattern('M');
+  DateFormat add_Md() => addPattern('Md');
+  DateFormat add_MEd() => addPattern('MEd');
+  DateFormat add_MMM() => addPattern('MMM');
+  DateFormat add_MMMd() => addPattern('MMMd');
+  DateFormat add_MMMEd() => addPattern('MMMEd');
+  DateFormat add_MMMM() => addPattern('MMMM');
+  DateFormat add_MMMMd() => addPattern('MMMMd');
+  DateFormat add_MMMMEEEEd() => addPattern('MMMMEEEEd');
+  DateFormat add_QQQ() => addPattern('QQQ');
+  DateFormat add_QQQQ() => addPattern('QQQQ');
+  DateFormat add_y() => addPattern('y');
+  DateFormat add_yM() => addPattern('yM');
+  DateFormat add_yMd() => addPattern('yMd');
+  DateFormat add_yMEd() => addPattern('yMEd');
+  DateFormat add_yMMM() => addPattern('yMMM');
+  DateFormat add_yMMMd() => addPattern('yMMMd');
+  DateFormat add_yMMMEd() => addPattern('yMMMEd');
+  DateFormat add_yMMMM() => addPattern('yMMMM');
+  DateFormat add_yMMMMd() => addPattern('yMMMMd');
+  DateFormat add_yMMMMEEEEd() => addPattern('yMMMMEEEEd');
+  DateFormat add_yQQQ() => addPattern('yQQQ');
+  DateFormat add_yQQQQ() => addPattern('yQQQQ');
+  DateFormat add_H() => addPattern('H');
+  DateFormat add_Hm() => addPattern('Hm');
+  DateFormat add_Hms() => addPattern('Hms');
+  DateFormat add_j() => addPattern('j');
+  DateFormat add_jm() => addPattern('jm');
+  DateFormat add_jms() => addPattern('jms');
+  DateFormat add_jmv() => addPattern('jmv');
+  DateFormat add_jmz() => addPattern('jmz');
+  DateFormat add_jv() => addPattern('jv');
+  DateFormat add_jz() => addPattern('jz');
+  DateFormat add_m() => addPattern('m');
+  DateFormat add_ms() => addPattern('ms');
+  DateFormat add_s() => addPattern('s');
 
   /// For each of the skeleton formats we also allow the use of the
   /// corresponding ICU constant names.
@@ -569,33 +578,32 @@
 
   /// We are being asked to do formatting without having set any pattern.
   /// Use a default.
-  _useDefaultPattern() {
+  void _useDefaultPattern() {
     add_yMMMMd();
     add_jms();
   }
 
   /// A series of regular expressions used to parse a format string into its
   /// component fields.
-  static List<RegExp> _matchers = [
+  static final List<RegExp> _matchers = [
     // Quoted String - anything between single quotes, with escaping
     //   of single quotes by doubling them.
-    // e.g. in the pattern "hh 'o''clock'" will match 'o''clock'
-    new RegExp("^\'(?:[^\']|\'\')*\'"),
+    // e.g. in the pattern 'hh 'o''clock'' will match 'o''clock'
+    RegExp('^\'(?:[^\']|\'\')*\''),
     // Fields - any sequence of 1 or more of the same field characters.
-    // e.g. in "hh:mm:ss" will match hh, mm, and ss. But in "hms" would
+    // e.g. in 'hh:mm:ss' will match hh, mm, and ss. But in 'hms' would
     // match each letter individually.
-    new RegExp(
-        "^(?:G+|y+|M+|k+|S+|E+|a+|h+|K+|H+|c+|L+|Q+|d+|D+|m+|s+|v+|z+|Z+)"),
+    RegExp('^(?:G+|y+|M+|k+|S+|E+|a+|h+|K+|H+|c+|L+|Q+|d+|D+|m+|s+|v+|z+|Z+)'),
     // Everything else - A sequence that is not quotes or field characters.
-    // e.g. in "hh:mm:ss" will match the colons.
-    new RegExp("^[^\'GyMkSEahKHcLQdDmsvzZ]+")
+    // e.g. in 'hh:mm:ss' will match the colons.
+    RegExp('^[^\'GyMkSEahKHcLQdDmsvzZ]+')
   ];
 
   /// Set our pattern, appending it to any existing patterns. Also adds a single
   /// space to separate the two.
-  _appendPattern(String inputPattern, [String separator = ' ']) {
+  void _appendPattern(String inputPattern, [String separator = ' ']) {
     _pattern =
-        _pattern == null ? inputPattern : "$_pattern$separator$inputPattern";
+        _pattern == null ? inputPattern : '$_pattern$separator$inputPattern';
   }
 
   /// Add [inputPattern] to this instance as a pattern.
@@ -607,7 +615,7 @@
   /// pattern.
   DateFormat addPattern(String inputPattern, [String separator = ' ']) {
     // TODO(alanknight): This is an expensive operation. Caching recently used
-    // formats, or possibly introducing an entire "locale" object that would
+    // formats, or possibly introducing an entire 'locale' object that would
     // cache patterns for that locale could be a good optimization.
     // If we have already parsed the format fields, reset them.
     _formatFieldsPrivate = null;
@@ -621,12 +629,12 @@
   }
 
   /// Return the pattern that we use to format dates.
-  get pattern => _pattern;
+  String get pattern => _pattern;
 
   /// Return the skeletons for our current locale.
-  Map get _availableSkeletons => dateTimePatterns[locale];
+  Map<dynamic, dynamic> get _availableSkeletons => dateTimePatterns[locale];
 
-  /// Return the [DateSymbol] information for the locale.
+  /// Return the [DateSymbols] information for the locale.
   ///
   /// This can be useful to find lists like the names of weekdays or months in a
   /// locale, but the structure of this data may change, and it's generally
@@ -645,9 +653,9 @@
   /// Should a new DateFormat for [locale] have useNativeDigits true.
   ///
   /// For example, for locale 'ar' when this setting is true, DateFormat will
-  /// format using Eastern Arabic digits, e.g. "\u0660, \u0661, \u0662". If it
+  /// format using Eastern Arabic digits, e.g. '\u0660, \u0661, \u0662'. If it
   /// is false, a new DateFormat will format using ASCII digits.
-  static shouldUseNativeDigitsByDefaultFor(String locale) {
+  static bool shouldUseNativeDigitsByDefaultFor(String locale) {
     return _useNativeDigitsByDefault[locale] ?? true;
   }
 
@@ -655,12 +663,12 @@
   /// true.
   ///
   /// For example, for locale 'ar' when this setting is true, DateFormat will
-  /// format using Eastern Arabic digits, e.g. "\u0660, \u0661, \u0662". If it
+  /// format using Eastern Arabic digits, e.g. '\u0660, \u0661, \u0662'. If it
   /// is false, a new DateFormat will format using ASCII digits.
   ///
   /// If not indicated, the default value is true, so native digits will be
   /// used.
-  static useNativeDigitsByDefaultFor(String locale, bool value) {
+  static void useNativeDigitsByDefaultFor(String locale, bool value) {
     _useNativeDigitsByDefault[locale] = value;
   }
 
@@ -687,7 +695,7 @@
   ///
   /// Keys are the zero digits, and the values are matchers for digits in that
   /// locale.
-  static Map<String, RegExp> _digitMatchers = {};
+  static final Map<String, RegExp> _digitMatchers = {};
 
   RegExp _digitMatcher;
 
@@ -699,7 +707,7 @@
   }
 
   /// Hard-code the most common matcher, which has special RegExp syntax.
-  static final RegExp _asciiDigitMatcher = new RegExp(r'^\d+');
+  static final RegExp _asciiDigitMatcher = RegExp(r'^\d+');
 
   int _localeZeroCodeUnit;
 
@@ -713,7 +721,7 @@
 
   /// For performance, keep the zero digit available.
   String get localeZero => _localeZero == null
-      ? _localeZero = (useNativeDigits ? dateSymbols.ZERODIGIT ?? '0' : '0')
+      ? _localeZero = useNativeDigits ? dateSymbols.ZERODIGIT ?? '0' : '0'
       : _localeZero;
 
   // Does this use non-ASCII digits, e.g. Eastern Arabic.
@@ -727,23 +735,23 @@
   /// locale digits.
   String _localizeDigits(String numberString) {
     if (usesAsciiDigits) return numberString;
-    var newDigits = new List<int>(numberString.length);
+    var newDigits = List<int>(numberString.length);
     var oldDigits = numberString.codeUnits;
     for (var i = 0; i < numberString.length; i++) {
       newDigits[i] = oldDigits[i] + localeZeroCodeUnit - _asciiZeroCodeUnit;
     }
-    return new String.fromCharCodes(newDigits);
+    return String.fromCharCodes(newDigits);
   }
 
   /// A regular expression that matches for digits in a particular
   /// locale, defined by the digit for zero in that locale.
   RegExp _initDigitMatcher() {
     if (usesAsciiDigits) return _asciiDigitMatcher;
-    List<int> localeDigits = new Iterable.generate(10, (i) => i)
+    var localeDigits = Iterable.generate(10, (i) => i)
         .map((i) => localeZeroCodeUnit + i)
         .toList();
-    var localeDigitsString = new String.fromCharCodes(localeDigits);
-    return new RegExp(r'^[' + localeDigitsString + ']+');
+    var localeDigitsString = String.fromCharCodes(localeDigits);
+    return RegExp('^[$localeDigitsString]+');
   }
 
   /// Return true if the locale exists, or if it is null. The null case
@@ -753,11 +761,12 @@
     return dateTimeSymbols.containsKey(localeName);
   }
 
-  static List get _fieldConstructors => [
-        (pattern, parent) => new _DateFormatQuotedField(pattern, parent),
-        (pattern, parent) => new _DateFormatPatternField(pattern, parent),
-        (pattern, parent) => new _DateFormatLiteralField(pattern, parent)
-      ];
+  static List<_DateFormatField Function(String, DateFormat)>
+      get _fieldConstructors => [
+            (pattern, parent) => _DateFormatQuotedField(pattern, parent),
+            (pattern, parent) => _DateFormatPatternField(pattern, parent),
+            (pattern, parent) => _DateFormatLiteralField(pattern, parent)
+          ];
 
   /// Parse the template pattern and return a list of field objects.
   List<_DateFormatField> parsePattern(String pattern) {
diff --git a/lib/src/intl/date_format_field.dart b/lib/src/intl/date_format_field.dart
index 8c250d2..c5bc6fc 100644
--- a/lib/src/intl/date_format_field.dart
+++ b/lib/src/intl/date_format_field.dart
@@ -6,10 +6,10 @@
 
 /// This is a private class internal to DateFormat which is used for formatting
 /// particular fields in a template. e.g. if the format is hh:mm:ss then the
-/// fields would be "hh", ":", "mm", ":", and "ss". Each type of field knows
+/// fields would be 'hh', ':', 'mm', ':', and 'ss'. Each type of field knows
 /// how to format that portion of a date.
 abstract class _DateFormatField {
-  /// The format string that defines us, e.g. "hh"
+  /// The format string that defines us, e.g. 'hh'
   final String pattern;
 
   /// The DateFormat that we are part of.
@@ -84,8 +84,8 @@
 
   /// Throw a format exception with an error message indicating the position.
   void throwFormatException(_Stream stream) {
-    throw new FormatException("Trying to read $this from ${stream.contents} "
-        "at position ${stream.index}");
+    throw FormatException('Trying to read $this from ${stream.contents} '
+        'at position ${stream.index}');
   }
 }
 
@@ -95,11 +95,11 @@
 class _DateFormatLiteralField extends _DateFormatField {
   _DateFormatLiteralField(pattern, parent) : super(pattern, parent);
 
-  parse(_Stream input, _DateBuilder dateFields) {
+  void parse(_Stream input, _DateBuilder dateFields) {
     parseLiteral(input);
   }
 
-  parseLoose(_Stream input, _DateBuilder dateFields) =>
+  void parseLoose(_Stream input, _DateBuilder dateFields) =>
       parseLiteralLoose(input);
 }
 
@@ -115,14 +115,14 @@
     _fullPattern = pattern;
   }
 
-  parse(_Stream input, _DateBuilder dateFields) {
+  void parse(_Stream input, _DateBuilder dateFields) {
     parseLiteral(input);
   }
 
-  parseLoose(_Stream input, _DateBuilder dateFields) =>
+  void parseLoose(_Stream input, _DateBuilder dateFields) =>
       parseLiteralLoose(input);
 
-  static final _twoEscapedQuotes = new RegExp(r"''");
+  static final _twoEscapedQuotes = RegExp(r"''");
 
   static String _patchQuotes(String pattern) {
     if (pattern == "''") {
@@ -135,7 +135,7 @@
   }
 }
 
-/// A field that parses "loosely", meaning that we'll accept input that is
+/// A field that parses 'loosely', meaning that we'll accept input that is
 /// missing delimiters, has upper/lower case mixed up, and might not strictly
 /// conform to the pattern, e.g. the pattern calls for Sep we might accept
 /// sep, september, sEPTember. Doesn't affect numeric fields.
@@ -144,7 +144,7 @@
 
   /// Parse from a list of possibilities, but case-insensitively.
   /// Assumes that input is lower case.
-  int parseEnumeratedString(_Stream input, List possibilities) {
+  int parseEnumeratedString(_Stream input, List<String> possibilities) {
     var lowercasePossibilities =
         possibilities.map((x) => x.toLowerCase()).toList();
     try {
@@ -254,7 +254,7 @@
   /// into the correct place in dateFields. Allow looser parsing, accepting
   /// case-insensitive input and skipped delimiters.
   void parseLoose(_Stream input, _DateBuilder dateFields) {
-    new _LoosePatternField(pattern, parent).parse(input, dateFields);
+    _LoosePatternField(pattern, parent).parse(input, dateFields);
   }
 
   bool _forDate;
@@ -263,7 +263,7 @@
   /// time.
   ///
   /// The [pattern] will contain one or more of a particular format character,
-  /// e.g. "yyyy" for a four-digit year. This hard-codes all the pattern
+  /// e.g. 'yyyy' for a four-digit year. This hard-codes all the pattern
   /// characters that pertain to dates. The remaining characters, 'ahHkKms' are
   /// all time-related. See e.g. [formatField]
   bool get forDate => _forDate ??= 'cdDEGLMQvyZz'.contains(pattern[0]);
@@ -389,12 +389,12 @@
   /// Return the symbols for our current locale.
   DateSymbols get symbols => parent.dateSymbols;
 
-  formatEra(DateTime date) {
+  String formatEra(DateTime date) {
     var era = date.year > 0 ? 1 : 0;
     return width >= 4 ? symbols.ERANAMES[era] : symbols.ERAS[era];
   }
 
-  formatYear(DateTime date) {
+  String formatYear(DateTime date) {
     // TODO(alanknight): Proper handling of years <= 0
     var year = date.year;
     if (year < 0) {
@@ -404,13 +404,18 @@
   }
 
   /// We are given [input] as a stream from which we want to read a date. We
-  /// can't dynamically build up a date, so we are given a list [dateFields] of
-  /// the constructor arguments and an [position] at which to set it
-  /// (year,month,day,hour,minute,second,fractionalSecond)
-  /// then after all parsing is done we construct a date from the arguments.
+  /// can't dynamically build up a date, so the caller has a list of the
+  /// constructor arguments and a position at which to set it
+  /// (year,month,day,hour,minute,second,fractionalSecond) and gives us a setter
+  /// for it.
+  ///
+  /// Then after all parsing is done we construct a date from the
+  /// arguments.
+  ///
   /// This method handles reading any of the numeric fields. The [offset]
   /// argument allows us to compensate for zero-based versus one-based values.
-  void handleNumericField(_Stream input, Function setter, [int offset = 0]) {
+  void handleNumericField(_Stream input, void Function(num) setter,
+      [int offset = 0]) {
     var result = input.nextInteger(
         digitMatcher: parent.digitMatcher,
         zeroDigit: parent.localeZeroCodeUnit);
@@ -419,13 +424,16 @@
   }
 
   /// We are given [input] as a stream from which we want to read a date. We
-  /// can't dynamically build up a date, so we are given a list [dateFields] of
-  /// the constructor arguments and an [position] at which to set it
-  /// (year,month,day,hour,minute,second,fractionalSecond)
-  /// then after all parsing is done we construct a date from the arguments.
-  /// This method handles reading any of string fields from an enumerated set.
-  int parseEnumeratedString(_Stream input, List possibilities) {
-    var results = new _Stream(possibilities)
+  /// can't dynamically build up a date, so the caller has a list of the
+  /// constructor arguments and a position at which to set it
+  /// (year,month,day,hour,minute,second,fractionalSecond) and gives us a setter
+  /// for it.
+  ///
+  /// Then after all parsing is done we construct a date from the
+  /// arguments. This method handles reading any of string fields from an
+  /// enumerated set.
+  int parseEnumeratedString(_Stream input, List<String> possibilities) {
+    var results = _Stream(possibilities)
         .findIndexes((each) => input.peek(each.length) == each);
     if (results.isEmpty) throwFormatException(input);
     results.sort(
@@ -449,7 +457,7 @@
   }
 
   void parseMonth(input, dateFields) {
-    var possibilities;
+    List<String> possibilities;
     switch (width) {
       case 5:
         possibilities = symbols.NARROWMONTHS;
@@ -490,7 +498,7 @@
   }
 
   void parseAmPm(input, dateFields) {
-    // If we see a "PM" note it in an extra field.
+    // If we see a 'PM' note it in an extra field.
     var ampm = parseEnumeratedString(input, symbols.AMPMS);
     if (ampm == 1) dateFields.pm = true;
   }
@@ -530,7 +538,7 @@
 
   void parseStandaloneDay(_Stream input) {
     // This is ignored, but we still have to skip over it the correct amount.
-    var possibilities;
+    List<String> possibilities;
     switch (width) {
       case 5:
         possibilities = symbols.STANDALONENARROWWEEKDAYS;
@@ -561,7 +569,7 @@
   }
 
   void parseStandaloneMonth(input, dateFields) {
-    var possibilities;
+    List<String> possibilities;
     switch (width) {
       case 5:
         possibilities = symbols.STANDALONENARROWMONTHS;
@@ -625,15 +633,15 @@
 
   String formatTimeZoneId(DateTime date) {
     // TODO(alanknight): implement time zone support
-    throw new UnimplementedError();
+    throw UnimplementedError();
   }
 
   String formatTimeZone(DateTime date) {
-    throw new UnimplementedError();
+    throw UnimplementedError();
   }
 
   String formatTimeZoneRFC(DateTime date) {
-    throw new UnimplementedError();
+    throw UnimplementedError();
   }
 
   /// Return a string representation of the object padded to the left with
diff --git a/lib/src/intl/date_format_helpers.dart b/lib/src/intl/date_format_helpers.dart
index 7781c77..8193a47 100644
--- a/lib/src/intl/date_format_helpers.dart
+++ b/lib/src/intl/date_format_helpers.dart
@@ -19,7 +19,7 @@
 /// Return true if this is a leap year. Rely on [DateTime] to do the
 /// underlying calculation, even though it doesn't expose the test to us.
 bool _isLeapYear(DateTime date) {
-  var feb29 = new DateTime(date.year, 2, 29);
+  var feb29 = DateTime(date.year, 2, 29);
   return feb29.month == 2;
 }
 
@@ -54,7 +54,10 @@
   /// bad. Compensate by adjusting the time portion forward. But only do that
   /// when we're explicitly trying to construct a date, which we can tell from
   /// the format.
-  bool _dateOnly = false;
+
+  // We do set it, the analyzer just can't tell.
+  // ignore: prefer_final_fields
+  var _dateOnly = false;
 
   // Functions that exist just to be closurized so we can pass them to a general
   // method.
@@ -86,22 +89,22 @@
     fractionalSecond = x;
   }
 
-  get hour24 => pm ? hour + 12 : hour;
+  int get hour24 => pm ? hour + 12 : hour;
 
   /// Verify that we correspond to a valid date. This will reject out of
   /// range values, even if the DateTime constructor would accept them. An
   /// invalid message will result in throwing a [FormatException].
-  verify(String s) {
-    _verify(month, 1, 12, "month", s);
-    _verify(hour24, 0, 23, "hour", s);
-    _verify(minute, 0, 59, "minute", s);
-    _verify(second, 0, 59, "second", s);
-    _verify(fractionalSecond, 0, 999, "fractional second", s);
+  void verify(String s) {
+    _verify(month, 1, 12, 'month', s);
+    _verify(hour24, 0, 23, 'hour', s);
+    _verify(minute, 0, 59, 'minute', s);
+    _verify(second, 0, 59, 'second', s);
+    _verify(fractionalSecond, 0, 999, 'fractional second', s);
     // Verifying the day is tricky, because it depends on the month. Create
     // our resulting date and then verify that our values agree with it
     // as an additional verification. And since we're doing that, also
     // check the year, which we otherwise can't verify, and the hours,
-    // which will catch cases like "14:00:00 PM".
+    // which will catch cases like '14:00:00 PM'.
     var date = asDate();
     // On rare occasions, possibly related to DST boundaries, a parsed date will
     // come out as 1:00am. We compensate for the case of going backwards in
@@ -109,42 +112,42 @@
     // that doesn't exist. So tolerate an hour value of zero or one in these
     // cases.
     var minimumDate = _dateOnly && date.hour == 1 ? 0 : date.hour;
-    _verify(hour24, minimumDate, date.hour, "hour", s, date);
+    _verify(hour24, minimumDate, date.hour, 'hour', s, date);
     if (day > 31) {
       // We have an ordinal date, compute the corresponding date for the result
       // and compare to that.
       var leapYear = _isLeapYear(date);
       var correspondingDay = _dayOfYear(date.month, date.day, leapYear);
-      _verify(day, correspondingDay, correspondingDay, "day", s, date);
+      _verify(day, correspondingDay, correspondingDay, 'day', s, date);
     } else {
       // We have the day of the month, compare directly.
-      _verify(day, date.day, date.day, "day", s, date);
+      _verify(day, date.day, date.day, 'day', s, date);
     }
-    _verify(year, date.year, date.year, "year", s, date);
+    _verify(year, date.year, date.year, 'year', s, date);
   }
 
-  _verify(int value, int min, int max, String desc, String originalInput,
+  void _verify(int value, int min, int max, String desc, String originalInput,
       [DateTime parsed]) {
     if (value < min || value > max) {
-      var parsedDescription = parsed == null ? "" : " Date parsed as $parsed.";
-      throw new FormatException(
-          "Error parsing $originalInput, invalid $desc value: $value."
-          " Expected value between $min and $max.$parsedDescription");
+      var parsedDescription = parsed == null ? '' : ' Date parsed as $parsed.';
+      throw FormatException(
+          'Error parsing $originalInput, invalid $desc value: $value.'
+          ' Expected value between $min and $max.$parsedDescription');
     }
   }
 
   /// Return a date built using our values. If no date portion is set,
-  /// use the "Epoch" of January 1, 1970.
-  DateTime asDate({int retries: 3}) {
+  /// use the 'Epoch' of January 1, 1970.
+  DateTime asDate({int retries = 3}) {
     // TODO(alanknight): Validate the date, especially for things which
     // can crash the VM, e.g. large month values.
 
     if (utc) {
-      return new DateTime.utc(
+      return DateTime.utc(
           year, month, day, hour24, minute, second, fractionalSecond);
     } else {
-      var preliminaryResult = new DateTime(
-          year, month, day, hour24, minute, second, fractionalSecond);
+      var preliminaryResult =
+          DateTime(year, month, day, hour24, minute, second, fractionalSecond);
       return _correctForErrors(preliminaryResult, retries);
     }
   }
@@ -187,7 +190,7 @@
         result.isUtc &&
         (result.hour != hour24 ||
             result.day != correspondingDay ||
-            !new DateTime.now().isUtc)) {
+            !DateTime.now().isUtc)) {
       // This may be a UTC failure. Retry and if the result doesn't look
       // like it's in the UTC time zone, use that instead.
       return asDate(retries: retries - 1);
@@ -199,9 +202,10 @@
       // same day that's all right for a date. It gets the day correct, and we
       // have no way to even represent midnight on a day when it doesn't
       // happen.
-      var adjusted = result.add(new Duration(hours: (24 - result.hour)));
-      if (_dayOfYear(adjusted.month, adjusted.day, leapYear) == day)
+      var adjusted = result.add(Duration(hours: 24 - result.hour));
+      if (_dayOfYear(adjusted.month, adjusted.day, leapYear) == day) {
         return adjusted;
+      }
     }
     return result;
   }
@@ -216,18 +220,18 @@
 // strings, or else make the implementation trivial. And consider renaming,
 // as _Stream is now just confusing with the system Streams.
 class _Stream {
-  var contents;
+  dynamic contents;
   int index = 0;
 
   _Stream(this.contents);
 
   bool atEnd() => index >= contents.length;
 
-  next() => contents[index++];
+  dynamic next() => contents[index++];
 
   /// Return the next [howMany] items, or as many as there are remaining.
   /// Advance the stream by that many positions.
-  read([int howMany = 1]) {
+  dynamic read([int howMany = 1]) {
     var result = peek(howMany);
     index += howMany;
     return result;
@@ -242,8 +246,8 @@
 
   /// Return the next [howMany] items, or as many as there are remaining.
   /// Does not modify the stream position.
-  peek([int howMany = 1]) {
-    var result;
+  dynamic peek([int howMany = 1]) {
+    dynamic result;
     if (contents is String) {
       String stringContents = contents;
       result = stringContents.substring(
@@ -256,7 +260,7 @@
   }
 
   /// Return the remaining contents of the stream
-  rest() => peek(contents.length - index);
+  dynamic rest() => peek(contents.length - index);
 
   /// Find the index of the first element for which [f] returns true.
   /// Advances the stream to that position.
@@ -269,7 +273,7 @@
 
   /// Find the indexes of all the elements for which [f] returns true.
   /// Leaves the stream positioned at the end.
-  List findIndexes(Function f) {
+  List<dynamic> findIndexes(Function f) {
     var results = [];
     while (!atEnd()) {
       if (f(next())) results.add(index - 1);
@@ -291,11 +295,11 @@
     if (zeroDigit != null && zeroDigit != DateFormat._asciiZeroCodeUnit) {
       // Trying to optimize this, as it might get called a lot.
       var oldDigits = string.codeUnits;
-      var newDigits = new List<int>(string.length);
+      var newDigits = List<int>(string.length);
       for (var i = 0; i < string.length; i++) {
         newDigits[i] = oldDigits[i] - zeroDigit + DateFormat._asciiZeroCodeUnit;
       }
-      string = new String.fromCharCodes(newDigits);
+      string = String.fromCharCodes(newDigits);
     }
     return int.parse(string);
   }
diff --git a/lib/src/intl/number_format.dart b/lib/src/intl/number_format.dart
index 0185472..c92560b 100644
--- a/lib/src/intl/number_format.dart
+++ b/lib/src/intl/number_format.dart
@@ -4,9 +4,11 @@
 
 part of intl;
 
+// ignore_for_file: constant_identifier_names
+
 /// The function that we pass internally to NumberFormat to get
 /// the appropriate pattern (e.g. currency)
-typedef String _PatternGetter(NumberSymbols symbols);
+typedef _PatternGetter = String Function(NumberSymbols);
 
 /// Provides the ability to format a number in a locale-specific way. The
 /// format is specified as a pattern using a subset of the ICU formatting
@@ -165,12 +167,12 @@
   /// single-threaded and unless we do an asynchronous operation in the process
   /// of formatting then there will only ever be one number being formatted
   /// at a time. In languages with threads we'd need to pass this on the stack.
-  final StringBuffer _buffer = new StringBuffer();
+  final StringBuffer _buffer = StringBuffer();
 
   /// Create a number format that prints using [newPattern] as it applies in
   /// [locale].
   factory NumberFormat([String newPattern, String locale]) =>
-      new NumberFormat._forPattern(locale, (x) => newPattern);
+      NumberFormat._forPattern(locale, (x) => newPattern);
 
   /// Create a number format that prints as DECIMAL_PATTERN.
   NumberFormat.decimalPattern([String locale])
@@ -191,25 +193,24 @@
 
   /// A regular expression to validate currency names are exactly three
   /// alphabetic characters.
-  static final _checkCurrencyName = new RegExp(r'^[a-zA-Z]{3}$');
+  static final _checkCurrencyName = RegExp(r'^[a-zA-Z]{3}$');
 
   /// Create a number format that prints as CURRENCY_PATTERN. (Deprecated:
   /// prefer NumberFormat.currency)
   ///
   /// If provided,
-  /// use [nameOrSymbol] in place of the default currency name. e.g.
+  /// use [currencyNameOrSymbol] in place of the default currency name. e.g.
   ///        var eurosInCurrentLocale = new NumberFormat
   ///            .currencyPattern(Intl.defaultLocale, "€");
-  @Deprecated("Use NumberFormat.currency")
+  @Deprecated('Use NumberFormat.currency')
   factory NumberFormat.currencyPattern(
       [String locale, String currencyNameOrSymbol]) {
     // If it looks like an iso4217 name, pass as name, otherwise as symbol.
     if (currencyNameOrSymbol != null &&
         _checkCurrencyName.hasMatch(currencyNameOrSymbol)) {
-      return new NumberFormat.currency(
-          locale: locale, name: currencyNameOrSymbol);
+      return NumberFormat.currency(locale: locale, name: currencyNameOrSymbol);
     } else {
-      return new NumberFormat.currency(
+      return NumberFormat.currency(
           locale: locale, symbol: currencyNameOrSymbol);
     }
   }
@@ -287,7 +288,7 @@
   /// will format with two, which is the default for that locale.
   factory NumberFormat.simpleCurrency(
       {String locale, String name, int decimalDigits}) {
-    return new NumberFormat._forPattern(locale, (x) => x.CURRENCY_PATTERN,
+    return NumberFormat._forPattern(locale, (x) => x.CURRENCY_PATTERN,
         name: name,
         computeCurrencySymbol: (format) =>
             _simpleCurrencySymbols[format.currencyName] ?? format.currencyName,
@@ -323,167 +324,167 @@
   ///
   /// (The current implementation is the same for all locales, but this is
   /// temporary and callers shouldn't rely on it.)
-  static Map<String, String> _simpleCurrencySymbols = {
-    "AFN": "Af.",
-    "TOP": r"T$",
-    "MGA": "Ar",
-    "THB": "\u0e3f",
-    "PAB": "B/.",
-    "ETB": "Birr",
-    "VEF": "Bs",
-    "BOB": "Bs",
-    "GHS": "GHS",
-    "CRC": "\u20a1",
-    "NIO": r"C$",
-    "GMD": "GMD",
-    "MKD": "din",
-    "BHD": "din",
-    "DZD": "din",
-    "IQD": "din",
-    "JOD": "din",
-    "KWD": "din",
-    "LYD": "din",
-    "RSD": "din",
-    "TND": "din",
-    "AED": "dh",
-    "MAD": "dh",
-    "STD": "Db",
-    "BSD": r"$",
-    "FJD": r"$",
-    "GYD": r"$",
-    "KYD": r"$",
-    "LRD": r"$",
-    "SBD": r"$",
-    "SRD": r"$",
-    "AUD": r"$",
-    "BBD": r"$",
-    "BMD": r"$",
-    "BND": r"$",
-    "BZD": r"$",
-    "CAD": r"$",
-    "HKD": r"$",
-    "JMD": r"$",
-    "NAD": r"$",
-    "NZD": r"$",
-    "SGD": r"$",
-    "TTD": r"$",
-    "TWD": r"NT$",
-    "USD": r"$",
-    "XCD": r"$",
-    "VND": "\u20ab",
-    "AMD": "Dram",
-    "CVE": "CVE",
-    "EUR": "\u20ac",
-    "AWG": "Afl.",
-    "HUF": "Ft",
-    "BIF": "FBu",
-    "CDF": "FrCD",
-    "CHF": "CHF",
-    "DJF": "Fdj",
-    "GNF": "FG",
-    "RWF": "RF",
-    "XOF": "CFA",
-    "XPF": "FCFP",
-    "KMF": "CF",
-    "XAF": "FCFA",
-    "HTG": "HTG",
-    "PYG": "Gs",
-    "UAH": "\u20b4",
-    "PGK": "PGK",
-    "LAK": "\u20ad",
-    "CZK": "K\u010d",
-    "SEK": "kr",
-    "ISK": "kr",
-    "DKK": "kr",
-    "NOK": "kr",
-    "HRK": "kn",
-    "MWK": "MWK",
-    "ZMK": "ZWK",
-    "AOA": "Kz",
-    "MMK": "K",
-    "GEL": "GEL",
-    "LVL": "Ls",
-    "ALL": "Lek",
-    "HNL": "L",
-    "SLL": "SLL",
-    "MDL": "MDL",
-    "RON": "RON",
-    "BGN": "lev",
-    "SZL": "SZL",
-    "TRY": "TL",
-    "LTL": "Lt",
-    "LSL": "LSL",
-    "AZN": "man.",
-    "BAM": "KM",
-    "MZN": "MTn",
-    "NGN": "\u20a6",
-    "ERN": "Nfk",
-    "BTN": "Nu.",
-    "MRO": "MRO",
-    "MOP": "MOP",
-    "CUP": r"$",
-    "CUC": r"$",
-    "ARS": r"$",
-    "CLF": "UF",
-    "CLP": r"$",
-    "COP": r"$",
-    "DOP": r"$",
-    "MXN": r"$",
-    "PHP": "\u20b1",
-    "UYU": r"$",
-    "FKP": "£",
-    "GIP": "£",
-    "SHP": "£",
-    "EGP": "E£",
-    "LBP": "L£",
-    "SDG": "SDG",
-    "SSP": "SSP",
-    "GBP": "£",
-    "SYP": "£",
-    "BWP": "P",
-    "GTQ": "Q",
-    "ZAR": "R",
-    "BRL": r"R$",
-    "OMR": "Rial",
-    "QAR": "Rial",
-    "YER": "Rial",
-    "IRR": "Rial",
-    "KHR": "Riel",
-    "MYR": "RM",
-    "SAR": "Riyal",
-    "BYR": "BYR",
-    "RUB": "руб.",
-    "MUR": "Rs",
-    "SCR": "SCR",
-    "LKR": "Rs",
-    "NPR": "Rs",
-    "INR": "\u20b9",
-    "PKR": "Rs",
-    "IDR": "Rp",
-    "ILS": "\u20aa",
-    "KES": "Ksh",
-    "SOS": "SOS",
-    "TZS": "TSh",
-    "UGX": "UGX",
-    "PEN": "S/.",
-    "KGS": "KGS",
-    "UZS": "so\u02bcm",
-    "TJS": "Som",
-    "BDT": "\u09f3",
-    "WST": "WST",
-    "KZT": "\u20b8",
-    "MNT": "\u20ae",
-    "VUV": "VUV",
-    "KPW": "\u20a9",
-    "KRW": "\u20a9",
-    "JPY": "¥",
-    "CNY": "¥",
-    "PLN": "z\u0142",
-    "MVR": "Rf",
-    "NLG": "NAf",
-    "ZMW": "ZK",
-    "ANG": "ƒ",
-    "TMT": "TMT",
+  static final Map<String, String> _simpleCurrencySymbols = {
+    'AFN': 'Af.',
+    'TOP': r'T$',
+    'MGA': 'Ar',
+    'THB': '\u0e3f',
+    'PAB': 'B/.',
+    'ETB': 'Birr',
+    'VEF': 'Bs',
+    'BOB': 'Bs',
+    'GHS': 'GHS',
+    'CRC': '\u20a1',
+    'NIO': r'C$',
+    'GMD': 'GMD',
+    'MKD': 'din',
+    'BHD': 'din',
+    'DZD': 'din',
+    'IQD': 'din',
+    'JOD': 'din',
+    'KWD': 'din',
+    'LYD': 'din',
+    'RSD': 'din',
+    'TND': 'din',
+    'AED': 'dh',
+    'MAD': 'dh',
+    'STD': 'Db',
+    'BSD': r'$',
+    'FJD': r'$',
+    'GYD': r'$',
+    'KYD': r'$',
+    'LRD': r'$',
+    'SBD': r'$',
+    'SRD': r'$',
+    'AUD': r'$',
+    'BBD': r'$',
+    'BMD': r'$',
+    'BND': r'$',
+    'BZD': r'$',
+    'CAD': r'$',
+    'HKD': r'$',
+    'JMD': r'$',
+    'NAD': r'$',
+    'NZD': r'$',
+    'SGD': r'$',
+    'TTD': r'$',
+    'TWD': r'NT$',
+    'USD': r'$',
+    'XCD': r'$',
+    'VND': '\u20ab',
+    'AMD': 'Dram',
+    'CVE': 'CVE',
+    'EUR': '\u20ac',
+    'AWG': 'Afl.',
+    'HUF': 'Ft',
+    'BIF': 'FBu',
+    'CDF': 'FrCD',
+    'CHF': 'CHF',
+    'DJF': 'Fdj',
+    'GNF': 'FG',
+    'RWF': 'RF',
+    'XOF': 'CFA',
+    'XPF': 'FCFP',
+    'KMF': 'CF',
+    'XAF': 'FCFA',
+    'HTG': 'HTG',
+    'PYG': 'Gs',
+    'UAH': '\u20b4',
+    'PGK': 'PGK',
+    'LAK': '\u20ad',
+    'CZK': 'K\u010d',
+    'SEK': 'kr',
+    'ISK': 'kr',
+    'DKK': 'kr',
+    'NOK': 'kr',
+    'HRK': 'kn',
+    'MWK': 'MWK',
+    'ZMK': 'ZWK',
+    'AOA': 'Kz',
+    'MMK': 'K',
+    'GEL': 'GEL',
+    'LVL': 'Ls',
+    'ALL': 'Lek',
+    'HNL': 'L',
+    'SLL': 'SLL',
+    'MDL': 'MDL',
+    'RON': 'RON',
+    'BGN': 'lev',
+    'SZL': 'SZL',
+    'TRY': 'TL',
+    'LTL': 'Lt',
+    'LSL': 'LSL',
+    'AZN': 'man.',
+    'BAM': 'KM',
+    'MZN': 'MTn',
+    'NGN': '\u20a6',
+    'ERN': 'Nfk',
+    'BTN': 'Nu.',
+    'MRO': 'MRO',
+    'MOP': 'MOP',
+    'CUP': r'$',
+    'CUC': r'$',
+    'ARS': r'$',
+    'CLF': 'UF',
+    'CLP': r'$',
+    'COP': r'$',
+    'DOP': r'$',
+    'MXN': r'$',
+    'PHP': '\u20b1',
+    'UYU': r'$',
+    'FKP': '£',
+    'GIP': '£',
+    'SHP': '£',
+    'EGP': 'E£',
+    'LBP': 'L£',
+    'SDG': 'SDG',
+    'SSP': 'SSP',
+    'GBP': '£',
+    'SYP': '£',
+    'BWP': 'P',
+    'GTQ': 'Q',
+    'ZAR': 'R',
+    'BRL': r'R$',
+    'OMR': 'Rial',
+    'QAR': 'Rial',
+    'YER': 'Rial',
+    'IRR': 'Rial',
+    'KHR': 'Riel',
+    'MYR': 'RM',
+    'SAR': 'Riyal',
+    'BYR': 'BYR',
+    'RUB': 'руб.',
+    'MUR': 'Rs',
+    'SCR': 'SCR',
+    'LKR': 'Rs',
+    'NPR': 'Rs',
+    'INR': '\u20b9',
+    'PKR': 'Rs',
+    'IDR': 'Rp',
+    'ILS': '\u20aa',
+    'KES': 'Ksh',
+    'SOS': 'SOS',
+    'TZS': 'TSh',
+    'UGX': 'UGX',
+    'PEN': 'S/.',
+    'KGS': 'KGS',
+    'UZS': 'so\u02bcm',
+    'TJS': 'Som',
+    'BDT': '\u09f3',
+    'WST': 'WST',
+    'KZT': '\u20b8',
+    'MNT': '\u20ae',
+    'VUV': 'VUV',
+    'KPW': '\u20a9',
+    'KRW': '\u20a9',
+    'JPY': '¥',
+    'CNY': '¥',
+    'PLN': 'z\u0142',
+    'MVR': 'Rf',
+    'NLG': 'NAf',
+    'ZMW': 'ZK',
+    'ANG': 'ƒ',
+    'TMT': 'TMT',
   };
 
   /// Create a number format that prints in a pattern we get from
@@ -495,20 +496,20 @@
   NumberFormat._forPattern(String locale, _PatternGetter getPattern,
       {String name,
       String currencySymbol,
-      String computeCurrencySymbol(NumberFormat),
+      String Function(NumberFormat) computeCurrencySymbol,
       int decimalDigits,
-      bool isForCurrency: false})
+      bool isForCurrency = false})
       : _locale = Intl.verifiedLocale(locale, localeExists),
         _isForCurrency = isForCurrency {
-    this._currencySymbol = currencySymbol;
-    this._decimalDigits = decimalDigits;
+    _currencySymbol = currencySymbol;
+    _decimalDigits = decimalDigits;
     _symbols = numberFormatSymbols[_locale];
     _localeZero = _symbols.ZERO_DIGIT.codeUnitAt(0);
     _zeroOffset = _localeZero - _zero;
     _negativePrefix = _symbols.MINUS_SIGN;
     currencyName = name ?? _symbols.DEF_CURRENCY_CODE;
-    if (this._currencySymbol == null && computeCurrencySymbol != null) {
-      this._currencySymbol = computeCurrencySymbol(this);
+    if (_currencySymbol == null && computeCurrencySymbol != null) {
+      _currencySymbol = computeCurrencySymbol(this);
     }
     _setPattern(getPattern(_symbols));
   }
@@ -516,7 +517,7 @@
   /// A number format for compact representations, e.g. "1.2M" instead
   /// of "1,200,000".
   factory NumberFormat.compact({String locale}) {
-    return new _CompactNumberFormat(
+    return _CompactNumberFormat(
         locale: locale,
         formatType: _CompactFormatType.COMPACT_DECIMAL_SHORT_PATTERN);
   }
@@ -524,7 +525,7 @@
   /// A number format for "long" compact representations, e.g. "1.2 million"
   /// instead of of "1,200,000".
   factory NumberFormat.compactLong({String locale}) {
-    return new _CompactNumberFormat(
+    return _CompactNumberFormat(
         locale: locale,
         formatType: _CompactFormatType.COMPACT_DECIMAL_LONG_PATTERN);
   }
@@ -535,7 +536,7 @@
   /// [NumberFormat.simpleCurrency].
   factory NumberFormat.compactSimpleCurrency(
       {String locale, String name, int decimalDigits}) {
-    return new _CompactNumberFormat(
+    return _CompactNumberFormat(
         locale: locale,
         formatType: _CompactFormatType.COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN,
         name: name,
@@ -550,7 +551,7 @@
   /// of "$1,200,000".
   factory NumberFormat.compactCurrency(
       {String locale, String name, String symbol, int decimalDigits}) {
-    return new _CompactNumberFormat(
+    return _CompactNumberFormat(
         locale: locale,
         formatType: _CompactFormatType.COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN,
         name: name,
@@ -577,7 +578,7 @@
   /// Format [number] according to our pattern and return the formatted string.
   String format(number) {
     if (_isNaN(number)) return symbols.NAN;
-    if (_isInfinite(number)) return "${_signPrefix(number)}${symbols.INFINITY}";
+    if (_isInfinite(number)) return '${_signPrefix(number)}${symbols.INFINITY}';
 
     _add(_signPrefix(number));
     _formatNumber(number.abs());
@@ -590,7 +591,7 @@
 
   /// Parse the number represented by the string. If it's not
   /// parseable, throws a [FormatException].
-  num parse(String text) => new _NumberParser(this, text).value;
+  num parse(String text) => _NumberParser(this, text).value;
 
   /// Format the main part of the number in the form dictated by the pattern.
   void _formatNumber(number) {
@@ -656,24 +657,24 @@
 
   /// Helpers to check numbers that don't conform to the [num] interface,
   /// e.g. Int64
-  _isInfinite(number) => number is num ? number.isInfinite : false;
-  _isNaN(number) => number is num ? number.isNaN : false;
+  bool _isInfinite(number) => number is num ? number.isInfinite : false;
+  bool _isNaN(number) => number is num ? number.isNaN : false;
 
   /// Helper to get the floor of a number which might not be num. This should
   /// only ever be called with an argument which is positive, or whose abs()
   ///  is negative. The second case is the maximum negative value on a
   ///  fixed-length integer. Since they are integers, they are also their own
   ///  floor.
-  _floor(number) {
-    if (number.isNegative && !(number.abs().isNegative)) {
-      throw new ArgumentError(
-          "Internal error: expected positive number, got $number");
+  dynamic _floor(dynamic number) {
+    if (number.isNegative && !number.abs().isNegative) {
+      throw ArgumentError(
+          'Internal error: expected positive number, got $number');
     }
     return (number is num) ? number.floor() : number ~/ 1;
   }
 
   /// Helper to round a number which might not be num.
-  _round(number) {
+  dynamic _round(dynamic number) {
     if (number is num) {
       if (number.isInfinite) {
         return _maxInt;
@@ -722,14 +723,14 @@
       max(0, remainingSignificantDigits);
 
   /// Format the basic number portion, including the fractional digits.
-  void _formatFixed(number) {
-    var integerPart;
+  void _formatFixed(dynamic number) {
+    dynamic integerPart;
     int fractionPart;
     int extraIntegerDigits;
     var fractionDigits = maximumFractionDigits;
 
     var power = 0;
-    var digitMultiplier;
+    int digitMultiplier;
 
     if (_isInfinite(number)) {
       integerPart = number.toInt();
@@ -790,7 +791,7 @@
     if (_hasIntegerDigits(integerDigits)) {
       // Add the padding digits to the regular digits so that we get grouping.
       var padding = '0' * (minimumIntegerDigits - digitLength);
-      integerDigits = "$padding$integerDigits";
+      integerDigits = '$padding$integerDigits';
       digitLength = integerDigits.length;
       for (var i = 0; i < digitLength; i++) {
         _addDigit(integerDigits.codeUnitAt(i));
@@ -826,7 +827,7 @@
     var intDigits = _mainIntegerDigits(integerPart);
     var paddedExtra =
         intDigits.isEmpty ? extra : extra.padLeft(_multiplierDigits, '0');
-    return "${intDigits}${paddedExtra}${paddingDigits}";
+    return '$intDigits$paddedExtra$paddingDigits';
   }
 
   /// The digit string of the integer part. This is the empty string if the
@@ -898,7 +899,7 @@
     for (var i = 0; i < numberOfDigits - basic.length; i++) {
       _add(symbols.ZERO_DIGIT);
     }
-    for (int i = 0; i < basic.length; i++) {
+    for (var i = 0; i < basic.length; i++) {
       _addDigit(basic.codeUnitAt(i));
     }
   }
@@ -946,8 +947,8 @@
     if (newPattern == null) return;
     // Make spaces non-breaking
     _pattern = newPattern.replaceAll(' ', '\u00a0');
-    var parser = new _NumberFormatParser(
-        this, newPattern, currencySymbol, decimalDigits);
+    var parser =
+        _NumberFormatParser(this, newPattern, currencySymbol, decimalDigits);
     parser.parse();
     if (_overridesDecimalDigits) {
       _decimalDigits ??= _defaultDecimalDigits;
@@ -965,7 +966,7 @@
     _finalGroupingSize = 0;
   }
 
-  String toString() => "NumberFormat($_locale, $_pattern)";
+  String toString() => 'NumberFormat($_locale, $_pattern)';
 }
 
 ///  A one-time object for parsing a particular numeric string. One-time here
@@ -990,7 +991,7 @@
   NumberSymbols get symbols => format.symbols;
 
   /// Where we accumulate the normalized representation of the number.
-  final StringBuffer _normalized = new StringBuffer();
+  final StringBuffer _normalized = StringBuffer();
 
   /// Did we see something that indicates this is, or at least might be,
   /// a positive number.
@@ -1025,9 +1026,7 @@
   int get _localeZero => format._localeZero;
 
   ///  Create a new [_NumberParser] on which we can call parse().
-  _NumberParser(this.format, text)
-      : this.text = text,
-        this.input = new _Stream(text) {
+  _NumberParser(this.format, this.text) : input = _Stream(text) {
     scale = format._internalMultiplier;
     value = parse();
   }
@@ -1035,7 +1034,7 @@
   ///  The strings we might replace with functions that return the replacement
   /// values. They are functions because we might need to check something
   /// in the context. Note that the ordering is important here. For example,
-  /// [symbols.PERCENT] might be " %", and we must handle that before we
+  /// `symbols.PERCENT` might be " %", and we must handle that before we
   /// look at an individual space.
   Map<String, Function> get replacements =>
       _replacements ??= _initializeReplacements();
@@ -1060,14 +1059,14 @@
         '-': () => '-',
       };
 
-  invalidFormat() =>
-      throw new FormatException("Invalid number: ${input.contents}");
+  void invalidFormat() =>
+      throw FormatException('Invalid number: ${input.contents}');
 
   /// Replace a space in the number with the normalized form. If space is not
   /// a significant character (normally grouping) then it's just invalid. If it
   /// is the grouping character, then it's only valid if it's followed by a
   /// digit. e.g. '$12 345.00'
-  handleSpace() =>
+  void handleSpace() =>
       groupingIsNotASpaceOrElseItIsSpaceFollowedByADigit ? '' : invalidFormat();
 
   /// Determine if a space is a valid character in the number. See
@@ -1092,7 +1091,7 @@
 
   /// Check to see if the input begins with either the positive or negative
   /// prefixes. Set the [gotPositive] and [gotNegative] variables accordingly.
-  void checkPrefixes({bool skip: false}) {
+  void checkPrefixes({bool skip = false}) {
     bool checkPrefix(String prefix) =>
         prefix.isNotEmpty && input.startsWith(prefix);
 
@@ -1156,11 +1155,11 @@
   /// Parse [text] and return the resulting number. Throws [FormatException]
   /// if we can't parse it.
   num parse() {
-    if (text == symbols.NAN) return (0.0 / 0.0);
-    if (text == "$_positivePrefix${symbols.INFINITY}$_positiveSuffix") {
+    if (text == symbols.NAN) return 0.0 / 0.0;
+    if (text == '$_positivePrefix${symbols.INFINITY}$_positiveSuffix') {
       return 1.0 / 0.0;
     }
-    if (text == "$_negativePrefix${symbols.INFINITY}$_negativeSuffix") {
+    if (text == '$_negativePrefix${symbols.INFINITY}$_negativeSuffix') {
       return -1.0 / 0.0;
     }
 
@@ -1176,7 +1175,7 @@
 
   /// The number is invalid, throw a [FormatException].
   void invalidNumber() =>
-      throw new FormatException("Invalid Number: ${input.contents}");
+      throw FormatException('Invalid Number: ${input.contents}');
 
   /// Parse the number portion of the input, i.e. not any prefixes or suffixes,
   /// and assuming NaN and Infinity are already handled.
@@ -1185,7 +1184,7 @@
       _normalized.write('-');
     }
     while (!done && !input.atEnd()) {
-      int digit = asDigit(input.peek());
+      var digit = asDigit(input.peek());
       if (digit != null) {
         _normalized.writeCharCode(_zero + digit);
         input.next();
@@ -1197,7 +1196,7 @@
 
     var normalizedText = _normalized.toString();
     num parsed = int.tryParse(normalizedText);
-    if (parsed == null) parsed = double.parse(normalizedText);
+    parsed ??= double.parse(normalizedText);
     return parsed / scale;
   }
 }
@@ -1261,8 +1260,8 @@
       // positive trunk.
       for (var each in _iterable(trunk)) {
         if (pattern.current != each && pattern.current != null) {
-          throw new FormatException(
-              "Positive and negative trunks must be the same");
+          throw FormatException(
+              'Positive and negative trunks must be the same', trunk);
         }
         pattern.moveNext();
       }
@@ -1281,9 +1280,9 @@
   /// Parse a prefix or suffix and return the prefix/suffix string. Note that
   /// this also may modify the state of [format].
   String _parseAffix() {
-    var affix = new StringBuffer();
+    var affix = StringBuffer();
     inQuote = false;
-    while (parseCharacterAffix(affix) && pattern.moveNext());
+    while (parseCharacterAffix(affix) && pattern.moveNext()) {}
     return affix.toString();
   }
 
@@ -1319,7 +1318,7 @@
           break;
         case _PATTERN_PERCENT:
           if (format._multiplier != 1 && format._multiplier != _PERCENT_SCALE) {
-            throw new FormatException('Too many percent/permill');
+            throw FormatException('Too many percent/permill', format);
           }
           format._multiplier = _PERCENT_SCALE;
           affix.write(symbols.PERCENT);
@@ -1327,7 +1326,7 @@
         case _PATTERN_PER_MILLE:
           if (format._multiplier != 1 &&
               format._multiplier != _PER_MILLE_SCALE) {
-            throw new FormatException('Too many percent/permill');
+            throw FormatException('Too many percent/permill', format);
           }
           format._multiplier = _PER_MILLE_SCALE;
           affix.write(symbols.PERMILL);
@@ -1350,7 +1349,7 @@
   /// positive or negative prefixes or suffixes.
   String _parseTrunk() {
     var loop = true;
-    var trunk = new StringBuffer();
+    var trunk = StringBuffer();
     while (pattern.current != null && loop) {
       loop = parseTrunkCharacter(trunk);
     }
@@ -1370,7 +1369,7 @@
             (decimalPos < digitLeftCount ||
                 decimalPos > digitLeftCount + zeroDigitCount) ||
         groupingCount == 0) {
-      throw new FormatException('Malformed pattern "${pattern.input}"');
+      throw FormatException('Malformed pattern "${pattern.input}"');
     }
     var totalDigits = digitLeftCount + zeroDigitCount + digitRightCount;
 
@@ -1428,8 +1427,7 @@
         break;
       case _PATTERN_ZERO_DIGIT:
         if (digitRightCount > 0) {
-          throw new FormatException(
-              'Unexpected "0" in pattern "' + pattern.input + '"');
+          throw FormatException('Unexpected "0" in pattern "${pattern.input}');
         }
         zeroDigitCount++;
         if (groupingCount >= 0 && decimalPos < 0) {
@@ -1445,7 +1443,7 @@
         break;
       case _PATTERN_DECIMAL_SEPARATOR:
         if (decimalPos >= 0) {
-          throw new FormatException(
+          throw FormatException(
               'Multiple decimal separators in pattern "$pattern"');
         }
         decimalPos = digitLeftCount + zeroDigitCount + digitRightCount;
@@ -1453,7 +1451,7 @@
       case _PATTERN_EXPONENT:
         trunk.write(ch);
         if (format._useExponentialNotation) {
-          throw new FormatException(
+          throw FormatException(
               'Multiple exponential symbols in pattern "$pattern"');
         }
         format._useExponentialNotation = true;
@@ -1478,7 +1476,7 @@
 
         if ((digitLeftCount + zeroDigitCount) < 1 ||
             format.minimumExponentDigits < 1) {
-          throw new FormatException('Malformed exponential pattern "$pattern"');
+          throw FormatException('Malformed exponential pattern "$pattern"');
         }
         return false;
       default:
@@ -1491,10 +1489,10 @@
 }
 
 /// Returns an [Iterable] on the string as a list of substrings.
-Iterable _iterable(String s) => new _StringIterable(s);
+Iterable<String> _iterable(String s) => _StringIterable(s);
 
 /// Return an iterator on the string as a list of substrings.
-Iterator<String> _iterator(String s) => new _StringIterator(s);
+Iterator<String> _iterator(String s) => _StringIterator(s);
 
 // TODO(nweiz): remove this when issue 3780 is fixed.
 /// Provides an Iterable that wraps [_iterator] so it can be used in a `for`
@@ -1510,7 +1508,7 @@
 class _StringIterator implements Iterator<String> {
   final String input;
   int nextIndex = 0;
-  String _current = null;
+  String _current;
 
   _StringIterator(input) : input = _validate(input);
 
@@ -1530,7 +1528,7 @@
   Iterator<String> get iterator => this;
 
   static String _validate(input) {
-    if (input is! String) throw new ArgumentError(input);
+    if (input is! String) throw ArgumentError(input);
     return input;
   }
 }
@@ -1540,7 +1538,7 @@
 ///
 /// It supports no operations other than being used for Intl number formatting.
 abstract class MicroMoney {
-  factory MicroMoney(micros) => new _MicroMoney(micros);
+  factory MicroMoney(micros) => _MicroMoney(micros);
 }
 
 /// Used primarily for currency formatting, this stores millionths of a
@@ -1548,44 +1546,44 @@
 ///
 /// This private class provides the operations needed by the formatting code.
 class _MicroMoney implements MicroMoney {
-  var _micros;
+  final dynamic _micros;
   _MicroMoney(this._micros);
   static const _multiplier = 1000000;
 
-  get _integerPart => _micros ~/ _multiplier;
+  dynamic get _integerPart => _micros ~/ _multiplier;
   int get _fractionPart => (this - _integerPart)._micros.toInt().abs();
 
   bool get isNegative => _micros.isNegative;
 
-  _MicroMoney abs() => isNegative ? new _MicroMoney(_micros.abs()) : this;
+  _MicroMoney abs() => isNegative ? _MicroMoney(_micros.abs()) : this;
 
   // Note that if this is done in a general way there's a risk of integer
   // overflow on JS when multiplying out the [other] parameter, which may be
   // an Int64. In formatting we only ever subtract out our own integer part.
   _MicroMoney operator -(other) {
-    if (other is _MicroMoney) return new _MicroMoney(_micros - other._micros);
-    return new _MicroMoney(_micros - (other * _multiplier));
+    if (other is _MicroMoney) return _MicroMoney(_micros - other._micros);
+    return _MicroMoney(_micros - (other * _multiplier));
   }
 
   _MicroMoney operator +(other) {
-    if (other is _MicroMoney) return new _MicroMoney(_micros + other._micros);
-    return new _MicroMoney(_micros + (other * _multiplier));
+    if (other is _MicroMoney) return _MicroMoney(_micros + other._micros);
+    return _MicroMoney(_micros + (other * _multiplier));
   }
 
   _MicroMoney operator ~/(divisor) {
     if (divisor is! int) {
-      throw new ArgumentError.value(
+      throw ArgumentError.value(
           divisor, 'divisor', '_MicroMoney ~/ only supports int arguments.');
     }
-    return new _MicroMoney((_integerPart ~/ divisor) * _multiplier);
+    return _MicroMoney((_integerPart ~/ divisor) * _multiplier);
   }
 
   _MicroMoney operator *(other) {
     if (other is! int) {
-      throw new ArgumentError.value(
+      throw ArgumentError.value(
           other, 'other', '_MicroMoney * only supports int arguments.');
     }
-    return new _MicroMoney(
+    return _MicroMoney(
         (_integerPart * other) * _multiplier + (_fractionPart * other));
   }
 
@@ -1593,10 +1591,10 @@
   /// not division by another MicroMoney
   _MicroMoney remainder(other) {
     if (other is! int) {
-      throw new ArgumentError.value(
+      throw ArgumentError.value(
           other, 'other', '_MicroMoney.remainder only supports int arguments.');
     }
-    return new _MicroMoney(_micros.remainder(other * _multiplier));
+    return _MicroMoney(_micros.remainder(other * _multiplier));
   }
 
   double toDouble() => _micros.toDouble() / _multiplier;
@@ -1604,11 +1602,11 @@
   int toInt() => _integerPart.toInt();
 
   String toString() {
-    var beforeDecimal = _integerPart.toString();
+    var beforeDecimal = '$_integerPart';
     var decimalPart = '';
     var fractionPart = _fractionPart;
     if (fractionPart != 0) {
-      decimalPart = '.' + fractionPart.toString();
+      decimalPart = '.$fractionPart';
     }
     return '$beforeDecimal$decimalPart';
   }
diff --git a/lib/src/intl_helpers.dart b/lib/src/intl_helpers.dart
index d284f2e..57edee8 100644
--- a/lib/src/intl_helpers.dart
+++ b/lib/src/intl_helpers.dart
@@ -11,7 +11,8 @@
 import 'package:intl/intl.dart';
 
 /// Type for the callback action when a message translation is not found.
-typedef MessageIfAbsent(String message_str, List<Object> args);
+typedef MessageIfAbsent = String Function(
+    String messageText, List<Object> args);
 
 /// This is used as a marker for a locale data map that hasn't been initialized,
 /// and will throw an exception on any usage that isn't the fallback
@@ -21,7 +22,7 @@
   final F fallbackData;
   UninitializedLocaleData(this.message, this.fallbackData);
 
-  operator [](String key) =>
+  F operator [](String key) =>
       (key == 'en_US') ? fallbackData : _throwException();
 
   /// If a message is looked up before any locale initialization, record it,
@@ -37,26 +38,26 @@
   static final bool throwOnFallback = false;
 
   /// The messages that were called before the locale was initialized.
-  List<String> _badMessages = [];
+  final List<String> _badMessages = [];
 
   void _reportErrors() {
-    if (throwOnFallback && _badMessages.length > 0) {
-      throw new StateError(
-          "The following messages were called before locale initialization:"
-          " $_uninitializedMessages");
+    if (throwOnFallback && _badMessages.isNotEmpty) {
+      throw StateError(
+          'The following messages were called before locale initialization:'
+          ' $_uninitializedMessages');
     }
   }
 
   String get _uninitializedMessages =>
-      (_badMessages.toSet().toList()..sort()).join("\n    ");
+      (_badMessages.toSet().toList()..sort()).join('\n    ');
 
-  String lookupMessage(String message_str, String locale, String name,
+  String lookupMessage(String messageText, String locale, String name,
       List<Object> args, String meaning,
       {MessageIfAbsent ifAbsent}) {
     if (throwOnFallback) {
-      _badMessages.add(name ?? message_str);
+      _badMessages.add(name ?? messageText);
     }
-    return message_str;
+    return messageText;
   }
 
   /// Given an initial locale or null, returns the locale that will be used
@@ -67,16 +68,16 @@
 
   bool containsKey(String key) => (key == 'en_US') ? true : _throwException();
 
-  _throwException() {
-    throw new LocaleDataException("Locale data has not been initialized"
-        ", call $message.");
+  F _throwException() {
+    throw LocaleDataException('Locale data has not been initialized'
+        ', call $message.');
   }
 
   void addLocale(String localeName, Function findLocale) => _throwException();
 }
 
 abstract class MessageLookup {
-  String lookupMessage(String message_str, String locale, String name,
+  String lookupMessage(String messageText, String locale, String name,
       List<Object> args, String meaning,
       {MessageIfAbsent ifAbsent});
   void addLocale(String localeName, Function findLocale);
@@ -85,27 +86,27 @@
 class LocaleDataException implements Exception {
   final String message;
   LocaleDataException(this.message);
-  toString() => "LocaleDataException: $message";
+  String toString() => 'LocaleDataException: $message';
 }
 
 ///  An abstract superclass for data readers to keep the type system happy.
 abstract class LocaleDataReader {
-  Future read(String locale);
+  Future<String> read(String locale);
 }
 
 /// The internal mechanism for looking up messages. We expect this to be set
 /// by the implementing package so that we're not dependent on its
 /// implementation.
 MessageLookup messageLookup =
-    new UninitializedLocaleData('initializeMessages(<locale>)', null);
+    UninitializedLocaleData('initializeMessages(<locale>)', null);
 
 /// Initialize the message lookup mechanism. This is for internal use only.
 /// User applications should import `message_lookup_by_library.dart` and call
 /// `initializeMessages`
 void initializeInternalMessageLookup(Function lookupFunction) {
-  if (messageLookup is UninitializedLocaleData) {
+  if (messageLookup is UninitializedLocaleData<dynamic>) {
     // This line has to be precisely this way to work around an analyzer crash.
-    (messageLookup as UninitializedLocaleData)._reportErrors();
+    (messageLookup as UninitializedLocaleData<dynamic>)._reportErrors();
     messageLookup = lookupFunction();
   }
 }
@@ -114,6 +115,6 @@
 /// a name based on that and the meaning, if present.
 // NOTE: THIS LOGIC IS DUPLICATED IN intl_translation AND THE TWO MUST MATCH.
 String computeMessageName(String name, String text, String meaning) {
-  if (name != null && name != "") return name;
-  return meaning == null ? text : "${text}_${meaning}";
+  if (name != null && name != '') return name;
+  return meaning == null ? text : '${text}_$meaning';
 }
diff --git a/lib/src/lazy_locale_data.dart b/lib/src/lazy_locale_data.dart
index b975a4e..0469ef6 100644
--- a/lib/src/lazy_locale_data.dart
+++ b/lib/src/lazy_locale_data.dart
@@ -17,35 +17,32 @@
 /// the external source.
 class LazyLocaleData {
   /// This holds the data we have loaded.
-  Map map;
+  Map<dynamic, dynamic> map;
 
   /// The object that actually does the data reading.
-  LocaleDataReader _reader;
+  final LocaleDataReader _reader;
 
   /// In order to avoid a potentially remote call to see if a locale
   /// is available, we hold a complete list of all the available
   /// locales.
-  List availableLocales;
+  List<String> availableLocales;
 
   /// Given a piece of remote data, apply [_creationFunction] to it to
   /// convert it into the right form. Typically this means converting it
   /// from a Map into an object form.
-  Function _creationFunction;
+  final Function _creationFunction;
 
   /// The set of available locales.
-  Set availableLocaleSet;
-
-  static const jsonDecoder = const JsonCodec();
+  Set<String> availableLocaleSet;
 
   /// The constructor. The [_reader] specifies where the data comes
   /// from. The [_creationFunction] creates the appropriate data type
   /// from the remote data (which typically comes in as a Map). The
   /// [keys] lists the set of remotely available locale names so we know which
   /// things can be fetched without having to check remotely.
-  LazyLocaleData(this._reader, this._creationFunction, List keys) {
-    map = new Map();
-    availableLocales = keys;
-    availableLocaleSet = new Set.from(availableLocales);
+  LazyLocaleData(this._reader, this._creationFunction, this.availableLocales) {
+    map = Map();
+    availableLocaleSet = Set.from(availableLocales);
   }
 
   ///  Tests if we have data for the locale available. Note that this returns
@@ -54,18 +51,17 @@
   bool containsKey(String locale) => availableLocaleSet.contains(locale);
 
   /// Returns the list of keys/locale names.
-  List get keys => availableLocales;
+  List<String> get keys => availableLocales;
 
   /// Returns the data stored for [localeName]. If no data has been loaded
   /// for [localeName], throws an exception. If no data is available for
   /// [localeName] then throw an exception with a different message.
-  operator [](String localeName) {
+  dynamic operator [](String localeName) {
     if (containsKey(localeName)) {
       var data = map[localeName];
       if (data == null) {
-        throw new LocaleDataException(
-            "Locale $localeName has not been initialized."
-            " Call initializeDateFormatting($localeName, <data url>) first");
+        throw LocaleDataException('Locale $localeName has not been initialized.'
+            ' Call initializeDateFormatting($localeName, <data url>) first');
       } else {
         return data;
       }
@@ -76,13 +72,13 @@
 
   /// Throw an exception indicating that the locale has no data available,
   /// either locally or remotely.
-  unsupportedLocale(localeName) {
-    throw new LocaleDataException('Locale $localeName has no data available');
+  void unsupportedLocale(localeName) {
+    throw LocaleDataException('Locale $localeName has no data available');
   }
 
   /// Initialize for locale. Internal use only. As a user, call
   /// initializeDateFormatting instead.
-  Future initLocale(String localeName) {
+  Future<void> initLocale(String localeName) {
     var data = _reader.read(localeName);
     return jsonData(data).then((input) {
       map[localeName] = _creationFunction(input);
@@ -91,7 +87,7 @@
 
   /// Given a Future [input] whose value is expected to be a string in JSON
   /// form, return another future that parses the JSON into a usable format.
-  Future jsonData(Future input) {
-    return input.then((response) => jsonDecoder.decode(response));
+  Future<dynamic> jsonData(Future<String> input) {
+    return input.then((response) => json.decode(response));
   }
 }
diff --git a/lib/src/locale.dart b/lib/src/locale.dart
index 3a941eb..d2c53c9 100644
--- a/lib/src/locale.dart
+++ b/lib/src/locale.dart
@@ -101,7 +101,7 @@
   @override
   bool operator ==(Object other) {
     if (identical(this, other)) return true;
-    return other is Locale && this.toLanguageTag() == other.toLanguageTag();
+    return other is Locale && toLanguageTag() == other.toLanguageTag();
   }
 
   @override
diff --git a/lib/src/locale/locale_extensions.dart b/lib/src/locale/locale_extensions.dart
index 4018ba5..245ecbf 100644
--- a/lib/src/locale/locale_extensions.dart
+++ b/lib/src/locale/locale_extensions.dart
@@ -59,8 +59,9 @@
         otherExtensions == null ||
             otherExtensions.entries.every((e) {
               if (!_otherExtensionsValidKeysRE.hasMatch(e.key)) return false;
-              if (!_otherExtensionsValidValuesRE.hasMatch(e.value))
+              if (!_otherExtensionsValidValuesRE.hasMatch(e.value)) {
                 return false;
+              }
               return true;
             }),
         'otherExtensions keys must match '
@@ -149,21 +150,21 @@
   /// are stored under normalized (lowercased) `key`. See
   /// http://www.unicode.org/reports/tr35/#unicode_locale_extensions for
   /// details.
-  Map<String, String> _uExtensions;
+  final Map<String, String> _uExtensions;
 
   /// `-t-` extension, with keys in sorted order. tlang attributes are stored
   /// under the zero-length string as key. See
   /// http://www.unicode.org/reports/tr35/#transformed_extensions for
   /// details.
-  Map<String, String> _tExtensions;
+  final Map<String, String> _tExtensions;
 
   /// Other extensions, with keys in sorted order. See
   /// http://www.unicode.org/reports/tr35/#other_extensions for details.
-  Map<String, String> _otherExtensions;
+  final Map<String, String> _otherExtensions;
 
   /// -x- extension values. See
   /// http://www.unicode.org/reports/tr35/#pu_extensions for details.
-  String _xExtensions;
+  final String _xExtensions;
 
   /// List of subtags in the [Unicode Locale
   /// Identifier](https://www.unicode.org/reports/tr35/#Unicode_locale_identifier)
@@ -177,11 +178,11 @@
   /// unicode_language_id and '-' as delimiter to provide a UTS #35 compliant
   /// normalized Locale Identifier.
   List<String> get subtags {
-    final List<String> result = [];
-    final List<String> resultVWYZ = [];
+    final result = <String>[];
+    final resultVWYZ = <String>[];
 
     _otherExtensions.forEach((singleton, value) {
-      final int letter = (singleton.codeUnitAt(0) - 0x61) & 0xFFFF;
+      final letter = (singleton.codeUnitAt(0) - 0x61) & 0xFFFF;
       // 't', 'u' and 'x' are handled by other members.
       assert(letter < 26 && letter != 19 && letter != 20 && letter != 23);
       if (letter < 19) {
@@ -209,7 +210,7 @@
       result.addAll(resultVWYZ);
     }
     if (_xExtensions != null) {
-      result.add('x-${_xExtensions}');
+      result.add('x-$_xExtensions');
     }
     return result;
   }
@@ -220,7 +221,7 @@
   if (unsorted == null) {
     return const {};
   }
-  Map<String, String> map = {};
+  var map = <String, String>{};
   for (var key in unsorted.keys.toList()..sort()) {
     map[key] = unsorted[key];
   }
diff --git a/lib/src/locale/locale_implementation.dart b/lib/src/locale/locale_implementation.dart
index 11b398c..ed3dea3 100644
--- a/lib/src/locale/locale_implementation.dart
+++ b/lib/src/locale/locale_implementation.dart
@@ -27,8 +27,8 @@
         'countryCode must match RegExp/${_normalizedRegionRE.pattern}/ '
         'but is "$countryCode".');
     assert(
-        variants is List &&
-            variants.every((v) => _normalizedVariantRE.hasMatch(v)),
+        variants is List<String> &&
+            variants.every(_normalizedVariantRE.hasMatch),
         'each variant must match RegExp/${_normalizedVariantRE.pattern}/ '
         'but variants are "$variants".');
   }
@@ -55,8 +55,7 @@
   /// [variants], does not imply subtags are valid as per Unicode LDML spec!
   //
   // Must be static to get tree-shaken away in production code.
-  static final _normalizedVariantRE =
-      RegExp(r'^[a-z\d]{5,8}$|^\d[a-z\d]{3}$');
+  static final _normalizedVariantRE = RegExp(r'^[a-z\d]{5,8}$|^\d[a-z\d]{3}$');
 
   /// Simple factory which assumes parameters are syntactically correct.
   ///
@@ -173,7 +172,7 @@
   /// Returns the canonical Unicode BCP47 Locale Identifier for this locale.
   String toLanguageTag() {
     if (_languageTag == null) {
-      final List<String> out = [languageCode];
+      final out = [languageCode];
       if (scriptCode != null) out.add(scriptCode);
       if (countryCode != null) out.add(countryCode);
       out.addAll(variants);
diff --git a/lib/src/locale/locale_parser.dart b/lib/src/locale/locale_parser.dart
index 4fb90d5..8c151b0 100644
--- a/lib/src/locale/locale_parser.dart
+++ b/lib/src/locale/locale_parser.dart
@@ -128,7 +128,7 @@
     _currentIndex = 0;
     _current = _subtags[0];
 
-    bool scriptFound = false;
+    var scriptFound = false;
     if (acceptLanguage()) {
       _languageCode = replaceDeprecatedLanguageSubtag(accepted());
       scriptFound = acceptScript();
@@ -160,7 +160,7 @@
   /// empty.
   void processExtensions() {
     while (acceptSingleton()) {
-      String singleton = accepted();
+      var singleton = accepted();
       if (singleton == 'u') {
         processUExtensions();
       } else if (singleton == 't') {
@@ -185,8 +185,8 @@
       return;
     }
     _uExtensions = <String, String>{};
-    bool empty = true;
-    final List<String> attributes = [];
+    var empty = true;
+    final attributes = <String>[];
     while (acceptLowAlphaNumeric3to8()) {
       attributes.add(accepted());
     }
@@ -198,8 +198,8 @@
     // unicode_locale_extensions: collect "(sep keyword)*".
     while (acceptUExtensionKey()) {
       empty = false;
-      String key = accepted();
-      final List<String> typeParts = <String>[];
+      var key = accepted();
+      final typeParts = <String>[];
       while (acceptLowAlphaNumeric3to8()) {
         typeParts.add(accepted());
       }
@@ -229,8 +229,8 @@
       return;
     }
     _tExtensions = <String, String>{};
-    bool empty = true;
-    final List<String> tlang = <String>[];
+    var empty = true;
+    final tlang = <String>[];
     if (acceptLanguage()) {
       empty = false;
       tlang.add(replaceDeprecatedLanguageSubtag(accepted()));
@@ -247,8 +247,8 @@
     }
     // transformed_extensions: collect "(sep tfield)*".
     while (acceptTExtensionKey()) {
-      String tkey = accepted();
-      final List<String> tvalueParts = <String>[];
+      var tkey = accepted();
+      final tvalueParts = <String>[];
       while (acceptLowAlphaNumeric3to8()) {
         tvalueParts.add(accepted());
       }
@@ -274,7 +274,7 @@
   /// If parsing fails, `atEnd()` will be false and/or [problems] will not be
   /// empty.
   void processPrivateUseExtensions() {
-    final List<String> values = <String>[];
+    final values = <String>[];
     while (acceptLowAlphaNumeric1to8()) {
       values.add(accepted());
     }
@@ -290,7 +290,7 @@
   /// If parsing fails, `atEnd()` will be false and/or [problems] will not be
   /// empty.
   void processOtherExtensions(String singleton) {
-    final List<String> values = <String>[];
+    final values = <String>[];
     while (acceptLowAlphaNumeric2to8()) {
       values.add(accepted());
     }
@@ -374,8 +374,9 @@
   /// ranging from 2 to 8.
   bool acceptLowAlphaNumeric2to8() {
     if (atEnd()) return false;
-    if (!_alphaNumeric1to8RegExp.hasMatch(current()) || current().length < 2)
+    if (!_alphaNumeric1to8RegExp.hasMatch(current()) || current().length < 2) {
       return false;
+    }
     advance();
     return true;
   }
@@ -384,8 +385,9 @@
   /// ranging from 3 to 8.
   bool acceptLowAlphaNumeric3to8() {
     if (atEnd()) return false;
-    if (!_alphaNumeric1to8RegExp.hasMatch(current()) || current().length < 3)
+    if (!_alphaNumeric1to8RegExp.hasMatch(current()) || current().length < 3) {
       return false;
+    }
     advance();
     return true;
   }
diff --git a/lib/src/plural_rules.dart b/lib/src/plural_rules.dart
index efa906c..1a3beb5 100644
--- a/lib/src/plural_rules.dart
+++ b/lib/src/plural_rules.dart
@@ -16,9 +16,12 @@
 /// * t	- visible fractional digits in n, without trailing zeros.
 library plural_rules;
 
+// Suppress naming issues as changing them might be breaking.
+// ignore_for_file: constant_identifier_names, non_constant_identifier_names
+
 import 'dart:math' as math;
 
-typedef PluralCase PluralRule();
+typedef PluralRule = PluralCase Function();
 
 /// The possible cases used in a plural rule.
 enum PluralCase { ZERO, ONE, TWO, FEW, MANY, OTHER }
@@ -28,7 +31,7 @@
 
 /// This must be called before evaluating a new rule, because we're using
 /// library-global state to both keep the rules terse and minimize space.
-startRuleEvaluation(num howMany, [int precision = 0]) {
+void startRuleEvaluation(num howMany, [int precision = 0]) {
   _n = howMany;
   _precision = precision;
   _i = _n.round();
@@ -67,8 +70,8 @@
 /// The short names for parameters / return match the CLDR syntax and UTS #35
 ///     (https://unicode.org/reports/tr35/tr35-numbers.html#Plural_rules_syntax)
 /// Takes the item count [n] and a [precision].
-_updateVF(num n, int precision) {
-  int defaultDigits = 3;
+void _updateVF(num n, int precision) {
+  var defaultDigits = 3;
 
   _v = precision ?? math.min(_decimals(n, precision), defaultDigits);
 
@@ -82,7 +85,7 @@
 ///     (https://unicode.org/reports/tr35/tr35-numbers.html#Plural_rules_syntax)
 /// @param v Calculated previously.
 /// @param f Calculated previously.
-_updateWT(int v, int f) {
+void _updateWT(int v, int f) {
   if (f == 0) {
     // Unused, for now _w = 0;
     _t = 0;
diff --git a/pubspec.yaml b/pubspec.yaml
index 0f57a18..4ab9cd5 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: intl
-version: 0.16.0
+version: 0.16.1-dev
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/intl
 description: >-
diff --git a/test/bidi_format_test.dart b/test/bidi_format_test.dart
index 2421c85..ca69e85 100644
--- a/test/bidi_format_test.dart
+++ b/test/bidi_format_test.dart
@@ -7,8 +7,10 @@
 import 'package:intl/intl.dart';
 import 'package:test/test.dart';
 
+// ignore_for_file: non_constant_identifier_names
+
 /// Tests the bidirectional text formatting library.
-main() {
+void main() {
   var LTR = TextDirection.LTR;
   var RTL = TextDirection.RTL;
   var LRM = Bidi.LRM;
@@ -21,9 +23,9 @@
   var en = 'abba';
   var html = '&lt;';
   var longEn = 'abba sabba gabba ';
-  var ltrFmt = new BidiFormatter.LTR(); // LTR context
-  var rtlFmt = new BidiFormatter.RTL(); // RTL context
-  var unkFmt = new BidiFormatter.UNKNOWN(); // unknown context
+  var ltrFmt = BidiFormatter.LTR(); // LTR context
+  var rtlFmt = BidiFormatter.RTL(); // RTL context
+  var unkFmt = BidiFormatter.UNKNOWN(); // unknown context
 
   test('estimateDirection', () {
     expect(ltrFmt.estimateDirection(''), equals(UNKNOWN));
@@ -86,8 +88,8 @@
     expect(ltrFmt.wrapWithSpan('<br>$en', isHtml: false, resetDir: false),
         equals('&lt;br&gt;$en'));
 
-    var ltrAlwaysSpanFmt = new BidiFormatter.LTR(true);
-    var rtlAlwaysSpanFmt = new BidiFormatter.RTL(true);
+    var ltrAlwaysSpanFmt = BidiFormatter.LTR(true);
+    var rtlAlwaysSpanFmt = BidiFormatter.RTL(true);
 
     // Test alwaysSpan, overall dir matches context dir (LTR), no dirReset.
     expect(ltrAlwaysSpanFmt.wrapWithSpan(en, isHtml: true, resetDir: false),
diff --git a/test/bidi_utils_test.dart b/test/bidi_utils_test.dart
index a6f0832..a0a2e95 100644
--- a/test/bidi_utils_test.dart
+++ b/test/bidi_utils_test.dart
@@ -7,8 +7,10 @@
 import 'package:intl/intl.dart';
 import 'package:test/test.dart';
 
+// ignore_for_file: non_constant_identifier_names
+
 /// Tests the bidi utilities library.
-main() {
+void main() {
   var LRE = '\u202A';
   var RLE = '\u202B';
   var PDF = '\u202C';
@@ -99,55 +101,55 @@
   });
 
   test('guardBracketInHtml', () {
-    var strWithRtl = "asc \u05d0 (\u05d0\u05d0\u05d0)";
+    var strWithRtl = 'asc \u05d0 (\u05d0\u05d0\u05d0)';
     expect(Bidi.guardBracketInHtml(strWithRtl),
-        equals("asc \u05d0 <span dir=rtl>(\u05d0\u05d0\u05d0)</span>"));
+        equals('asc \u05d0 <span dir=rtl>(\u05d0\u05d0\u05d0)</span>'));
     expect(Bidi.guardBracketInHtml(strWithRtl, true),
-        equals("asc \u05d0 <span dir=rtl>(\u05d0\u05d0\u05d0)</span>"));
+        equals('asc \u05d0 <span dir=rtl>(\u05d0\u05d0\u05d0)</span>'));
     expect(Bidi.guardBracketInHtml(strWithRtl, false),
-        equals("asc \u05d0 <span dir=ltr>(\u05d0\u05d0\u05d0)</span>"));
+        equals('asc \u05d0 <span dir=ltr>(\u05d0\u05d0\u05d0)</span>'));
 
-    var strWithRtl2 = "\u05d0 a (asc:))";
+    var strWithRtl2 = '\u05d0 a (asc:))';
     expect(Bidi.guardBracketInHtml(strWithRtl2),
-        equals("\u05d0 a <span dir=rtl>(asc:))</span>"));
+        equals('\u05d0 a <span dir=rtl>(asc:))</span>'));
     expect(Bidi.guardBracketInHtml(strWithRtl2, true),
-        equals("\u05d0 a <span dir=rtl>(asc:))</span>"));
+        equals('\u05d0 a <span dir=rtl>(asc:))</span>'));
     expect(Bidi.guardBracketInHtml(strWithRtl2, false),
-        equals("\u05d0 a <span dir=ltr>(asc:))</span>"));
+        equals('\u05d0 a <span dir=ltr>(asc:))</span>'));
 
-    var strWithoutRtl = "a (asc) {{123}}";
+    var strWithoutRtl = 'a (asc) {{123}}';
     expect(Bidi.guardBracketInHtml(strWithoutRtl),
-        equals("a <span dir=ltr>(asc)</span> <span dir=ltr>{{123}}</span>"));
+        equals('a <span dir=ltr>(asc)</span> <span dir=ltr>{{123}}</span>'));
     expect(Bidi.guardBracketInHtml(strWithoutRtl, true),
-        equals("a <span dir=rtl>(asc)</span> <span dir=rtl>{{123}}</span>"));
+        equals('a <span dir=rtl>(asc)</span> <span dir=rtl>{{123}}</span>'));
     expect(Bidi.guardBracketInHtml(strWithoutRtl, false),
-        equals("a <span dir=ltr>(asc)</span> <span dir=ltr>{{123}}</span>"));
+        equals('a <span dir=ltr>(asc)</span> <span dir=ltr>{{123}}</span>'));
   });
 
   test('guardBracketInText', () {
-    var strWithRtl = "asc \u05d0 (\u05d0\u05d0\u05d0)";
+    var strWithRtl = 'asc \u05d0 (\u05d0\u05d0\u05d0)';
     expect(Bidi.guardBracketInText(strWithRtl),
-        equals("asc \u05d0 \u200f(\u05d0\u05d0\u05d0)\u200f"));
+        equals('asc \u05d0 \u200f(\u05d0\u05d0\u05d0)\u200f'));
     expect(Bidi.guardBracketInText(strWithRtl, true),
-        equals("asc \u05d0 \u200f(\u05d0\u05d0\u05d0)\u200f"));
+        equals('asc \u05d0 \u200f(\u05d0\u05d0\u05d0)\u200f'));
     expect(Bidi.guardBracketInText(strWithRtl, false),
-        equals("asc \u05d0 \u200e(\u05d0\u05d0\u05d0)\u200e"));
+        equals('asc \u05d0 \u200e(\u05d0\u05d0\u05d0)\u200e'));
 
-    var strWithRtl2 = "\u05d0 a (asc:))";
+    var strWithRtl2 = '\u05d0 a (asc:))';
     expect(Bidi.guardBracketInText(strWithRtl2),
-        equals("\u05d0 a \u200f(asc:))\u200f"));
+        equals('\u05d0 a \u200f(asc:))\u200f'));
     expect(Bidi.guardBracketInText(strWithRtl2, true),
-        equals("\u05d0 a \u200f(asc:))\u200f"));
+        equals('\u05d0 a \u200f(asc:))\u200f'));
     expect(Bidi.guardBracketInText(strWithRtl2, false),
-        equals("\u05d0 a \u200e(asc:))\u200e"));
+        equals('\u05d0 a \u200e(asc:))\u200e'));
 
-    var strWithoutRtl = "a (asc) {{123}}";
+    var strWithoutRtl = 'a (asc) {{123}}';
     expect(Bidi.guardBracketInText(strWithoutRtl),
-        equals("a \u200e(asc)\u200e \u200e{{123}}\u200e"));
+        equals('a \u200e(asc)\u200e \u200e{{123}}\u200e'));
     expect(Bidi.guardBracketInText(strWithoutRtl, true),
-        equals("a \u200f(asc)\u200f \u200f{{123}}\u200f"));
+        equals('a \u200f(asc)\u200f \u200f{{123}}\u200f'));
     expect(Bidi.guardBracketInText(strWithoutRtl, false),
-        equals("a \u200e(asc)\u200e \u200e{{123}}\u200e"));
+        equals('a \u200e(asc)\u200e \u200e{{123}}\u200e'));
   });
 
   test('enforceRtlInHtml', () {
@@ -200,8 +202,7 @@
     expect(Bidi.estimateDirectionOfText('http://foo/bar/', isHtml: false).value,
         equals(TextDirection.LTR.value));
     expect(
-        Bidi
-            .estimateDirectionOfText(
+        Bidi.estimateDirectionOfText(
                 'http://foo/bar/?s=\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0'
                 '\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0'
                 '\u05d0\u05d0\u05d0\u05d0\u05d0')
@@ -210,20 +211,17 @@
     expect(Bidi.estimateDirectionOfText('\u05d0', isHtml: false).value,
         equals(TextDirection.RTL.value));
     expect(
-        Bidi
-            .estimateDirectionOfText('9 \u05d0 -> 17.5, 23, 45, 19',
+        Bidi.estimateDirectionOfText('9 \u05d0 -> 17.5, 23, 45, 19',
                 isHtml: false)
             .value,
         equals(TextDirection.RTL.value));
     expect(
-        Bidi
-            .estimateDirectionOfText(
+        Bidi.estimateDirectionOfText(
                 'http://foo/bar/ \u05d0 http://foo2/bar2/ http://foo3/bar3/')
             .value,
         equals(TextDirection.RTL.value));
     expect(
-        Bidi
-            .estimateDirectionOfText(
+        Bidi.estimateDirectionOfText(
                 '\u05d0\u05d9\u05df \u05de\u05de\u05e9 \u05de\u05d4 \u05dc\u05e8\u05d0'
                 '\u05d5\u05ea: \u05dc\u05d0 \u05e6\u05d9\u05dc\u05de\u05ea\u05d9 \u05d4'
                 '\u05e8\u05d1\u05d4 \u05d5\u05d2\u05dd \u05d0\u05dd \u05d4\u05d9\u05d9'
@@ -232,8 +230,7 @@
             .value,
         equals(TextDirection.RTL.value));
     expect(
-        Bidi
-            .estimateDirectionOfText(
+        Bidi.estimateDirectionOfText(
                 '\u05db\u05d0 - http://geek.co.il/gallery/v/2007-06 - \u05d0\u05d9'
                 '\u05df \u05de\u05de\u05e9 \u05de\u05d4 \u05dc\u05e8\u05d0\u05d5\u05ea:'
                 ' \u05dc\u05d0 \u05e6\u05d9\u05dc\u05de\u05ea\u05d9 \u05d4\u05e8\u05d1 '
@@ -250,15 +247,13 @@
             .value,
         equals(TextDirection.RTL.value));
     expect(
-        Bidi
-            .estimateDirectionOfText(
+        Bidi.estimateDirectionOfText(
                 'CAPTCHA \u05de\u05e9\u05d5\u05db\u05dc\u05dc '
                 '\u05de\u05d3\u05d9?')
             .value,
         equals(TextDirection.RTL.value));
     expect(
-        Bidi
-            .estimateDirectionOfText(
+        Bidi.estimateDirectionOfText(
                 'Yes Prime Minister \u05e2\u05d3\u05db\u05d5\u05df. \u05e9\u05d0\u05dc'
                 '\u05d5 \u05d0\u05d5\u05ea\u05d9 \u05de\u05d4 \u05d0\u05e0\u05d9 '
                 '\u05e8\u05d5\u05e6\u05d4 \u05de\u05ea\u05e0\u05d4 \u05dc\u05d7'
@@ -266,47 +261,40 @@
             .value,
         equals(TextDirection.RTL.value));
     expect(
-        Bidi
-            .estimateDirectionOfText(
+        Bidi.estimateDirectionOfText(
                 '17.4.02 \u05e9\u05e2\u05d4:13-20 .15-00 .\u05dc\u05d0 \u05d4\u05d9'
                 '\u05d9\u05ea\u05d9 \u05db\u05d0\u05df.')
             .value,
         equals(TextDirection.RTL.value));
     expect(
-        Bidi
-            .estimateDirectionOfText(
+        Bidi.estimateDirectionOfText(
                 '5710 5720 5730. \u05d4\u05d3\u05dc\u05ea. \u05d4\u05e0\u05e9\u05d9'
                 '\u05e7\u05d4',
                 isHtml: false)
             .value,
         equals(TextDirection.RTL.value));
     expect(
-        Bidi
-            .estimateDirectionOfText(
+        Bidi.estimateDirectionOfText(
                 '\u05d4\u05d3\u05dc\u05ea http://www.google.com '
                 'http://www.gmail.com')
             .value,
         equals(TextDirection.RTL.value));
     expect(
-        Bidi
-            .estimateDirectionOfText(
+        Bidi.estimateDirectionOfText(
                 '\u05d4\u05d3\u05dc <some quite nasty html mark up>')
             .value,
         equals(TextDirection.LTR.value));
     expect(
-        Bidi
-            .estimateDirectionOfText(
+        Bidi.estimateDirectionOfText(
                 '\u05d4\u05d3\u05dc <some quite nasty html mark up>')
             .value,
         equals(TextDirection.LTR.value));
     expect(
-        Bidi
-            .estimateDirectionOfText('\u05d4\u05d3\u05dc\u05ea &amp; &lt; &gt;')
+        Bidi.estimateDirectionOfText('\u05d4\u05d3\u05dc\u05ea &amp; &lt; &gt;')
             .value,
         equals(TextDirection.LTR.value));
     expect(
-        Bidi
-            .estimateDirectionOfText('\u05d4\u05d3\u05dc\u05ea &amp; &lt; &gt;',
+        Bidi.estimateDirectionOfText('\u05d4\u05d3\u05dc\u05ea &amp; &lt; &gt;',
                 isHtml: true)
             .value,
         equals(TextDirection.RTL.value));
@@ -314,10 +302,10 @@
 
   test('detectRtlDirectionality', () {
     var bidiText = [];
-    var item = new SampleItem('Pure Ascii content');
+    var item = SampleItem('Pure Ascii content');
     bidiText.add(item);
 
-    item = new SampleItem(
+    item = SampleItem(
         '\u05d0\u05d9\u05df \u05de\u05de\u05e9 \u05de\u05d4'
         ' \u05dc\u05e8\u05d0\u05d5\u05ea: \u05dc\u05d0 \u05e6\u05d9\u05dc'
         '\u05de\u05ea\u05d9 \u05d4\u05e8\u05d1\u05d4 \u05d5\u05d2\u05dd '
@@ -326,7 +314,7 @@
         true);
     bidiText.add(item);
 
-    item = new SampleItem(
+    item = SampleItem(
         '\u05db\u05d0\u05df - http://geek.co.il/gallery/v/'
         '2007-06 - \u05d0\u05d9\u05df \u05de\u05de\u05e9 \u05de\u05d4 \u05dc'
         '\u05e8\u05d0\u05d5\u05ea: \u05dc\u05d0 \u05e6\u05d9\u05dc\u05de\u05ea'
@@ -343,13 +331,13 @@
         true);
     bidiText.add(item);
 
-    item = new SampleItem(
+    item = SampleItem(
         'CAPTCHA \u05de\u05e9\u05d5\u05db\u05dc\u05dc '
         '\u05de\u05d3\u05d9?',
         true);
     bidiText.add(item);
 
-    item = new SampleItem(
+    item = SampleItem(
         'Yes Prime Minister \u05e2\u05d3\u05db\u05d5\u05df. '
         '\u05e9\u05d0\u05dc\u05d5 \u05d0\u05d5\u05ea\u05d9 \u05de\u05d4 \u05d0'
         '\u05e0\u05d9 \u05e8\u05d5\u05e6\u05d4 \u05de\u05ea\u05e0\u05d4 '
@@ -357,28 +345,28 @@
         true);
     bidiText.add(item);
 
-    item = new SampleItem(
+    item = SampleItem(
         '17.4.02 \u05e9\u05e2\u05d4:13-20 .15-00 .\u05dc'
         '\u05d0 \u05d4\u05d9\u05d9\u05ea\u05d9 \u05db\u05d0\u05df.',
         true);
     bidiText.add(item);
 
-    item = new SampleItem(
+    item = SampleItem(
         '5710 5720 5730. \u05d4\u05d3\u05dc\u05ea. \u05d4'
         '\u05e0\u05e9\u05d9\u05e7\u05d4',
         true);
     bidiText.add(item);
 
-    item = new SampleItem(
+    item = SampleItem(
         '\u05d4\u05d3\u05dc\u05ea http://www.google.com '
         'http://www.gmail.com',
         true);
     bidiText.add(item);
 
-    item = new SampleItem('&gt;\u05d4&lt;', true, true);
+    item = SampleItem('&gt;\u05d4&lt;', true, true);
     bidiText.add(item);
 
-    item = new SampleItem('&gt;\u05d4&lt;', false);
+    item = SampleItem('&gt;\u05d4&lt;', false);
     bidiText.add(item);
 
     for (var i = 0; i < bidiText.length; i++) {
@@ -399,8 +387,5 @@
   String text;
   bool isRtl;
   bool isHtml;
-  SampleItem([someText = '', someIsRtl = false, isHtml = false])
-      : this.text = someText,
-        this.isRtl = someIsRtl,
-        this.isHtml = isHtml;
+  SampleItem([this.text = '', this.isRtl = false, this.isHtml = false]);
 }
diff --git a/test/brazil_timezone_test.dart b/test/brazil_timezone_test.dart
index 3032276..6fb5bd4 100644
--- a/test/brazil_timezone_test.dart
+++ b/test/brazil_timezone_test.dart
@@ -20,7 +20,7 @@
 import 'package:test/test.dart';
 import 'timezone_test_core.dart';
 
-main() {
+void main() {
   // The test date is Jan 1, so Brazilian Summer Time will be in effect.
   testTimezone('America/Sao_Paulo', expectedUtcOffset: -2);
 }
diff --git a/test/compact_number_test_data.dart b/test/compact_number_test_data.dart
index b90f119..0951c15 100755
--- a/test/compact_number_test_data.dart
+++ b/test/compact_number_test_data.dart
@@ -14,6 +14,9 @@
 /// significant digits and decimal digits. Manual edits were made to pair up
 /// CLDR ver. 35 formats with old digit handling.
 
+// MANUAL EDIT TO SUPPRESS WARNINGS IN GENERATED CODE
+// ignore_for_file: prefer_single_quotes
+
 /// The test data. A map, keyed by locale name, whose values
 /// are a list of [basic, shortform, longform] formatted data
 /// for different numbers.
diff --git a/test/data_directory.dart b/test/data_directory.dart
index 72e33c6..2bb9fa3 100644
--- a/test/data_directory.dart
+++ b/test/data_directory.dart
@@ -11,8 +11,8 @@
 ///   run things by default
 library data_directory;
 
-import "dart:io";
-import "package:path/path.dart" as path;
+import 'dart:io';
+import 'package:path/path.dart' as path;
 
 String get dataDirectory {
   return path.join(intlDirectory, datesRelativeToIntl);
@@ -21,13 +21,13 @@
 /// Returns whether [dir] is the root of the `intl` package. We validate that it
 /// is by looking for a pubspec file with the entry `name: intl`.
 bool _isIntlRoot(String dir) {
-  var file = new File(path.join(dir, 'pubspec.yaml'));
+  var file = File(path.join(dir, 'pubspec.yaml'));
   if (!file.existsSync()) return false;
   return file.readAsStringSync().contains('name: intl\n');
 }
 
 String get intlDirectory {
-  var dir;
+  String dir;
   if (Platform.script.scheme == 'file') {
     dir = path.fromUri(Platform.script);
   } else {
@@ -39,7 +39,7 @@
     if (_isIntlRoot(dir)) return dir;
     dir = path.dirname(dir);
   }
-  throw new UnsupportedError(
+  throw UnsupportedError(
       'Cannot find the root directory of the `intl` package.');
 }
 
diff --git a/test/date_time_format_custom_test.dart b/test/date_time_format_custom_test.dart
index ca1d0ae..6a1e64d 100644
--- a/test/date_time_format_custom_test.dart
+++ b/test/date_time_format_custom_test.dart
@@ -6,25 +6,27 @@
 /// from the local copy.
 
 import 'dart:async';
-import 'date_time_format_test_stub.dart';
-import 'package:intl/date_symbol_data_local.dart' as localSymbols;
-import 'package:intl/date_time_patterns.dart' as localPatterns;
+
+import 'package:intl/date_symbol_data_local.dart' as local_symbols;
+import 'package:intl/date_time_patterns.dart' as local_patterns;
 import 'package:intl/date_symbol_data_custom.dart';
 
-main() {
-  var symbols = localSymbols.dateTimeSymbolMap();
-  var patterns = localPatterns.dateTimePatternMap();
+import 'date_time_format_test_stub.dart';
+
+void main() {
+  var symbols = local_symbols.dateTimeSymbolMap();
+  var patterns = local_patterns.dateTimePatternMap();
   var locales = <String>[];
   symbols.keys.take(10).forEach(locales.add);
   // Force inclusion of locales that are hard-coded in tests.
-  var requiredLocales = ["en_US", "de", "fr", "ja", "el", "de_AT"];
+  var requiredLocales = ['en_US', 'de', 'fr', 'ja', 'el', 'de_AT'];
   locales.addAll(requiredLocales);
   for (var locale in locales) {
-    print("initializing $locale");
+    print('initializing $locale');
     initializeDateFormattingCustom(
         locale: locale, symbols: symbols[locale], patterns: patterns[locale]);
   }
   runWith(() => locales, null, nullInitialization);
 }
 
-Future nullInitialization(String a, String b) => new Future.value(null);
+Future<void> nullInitialization(String a, String b) => Future.value(null);
diff --git a/test/date_time_format_file_even_test.dart b/test/date_time_format_file_even_test.dart
index eb6a723..2e55022 100644
--- a/test/date_time_format_file_even_test.dart
+++ b/test/date_time_format_file_even_test.dart
@@ -6,15 +6,15 @@
 /// local file system. This tests one half the locales, since testing all
 /// of them takes long enough that it may cause timeouts in the test bots.
 
-@Timeout(const Duration(seconds: 60))
-@TestOn("vm")
+@Timeout(Duration(seconds: 60))
+@TestOn('vm')
 library date_time_format_file_test_2;
 
-import 'date_time_format_test_stub.dart';
-import 'data_directory.dart';
 import 'package:intl/date_symbol_data_file.dart';
 import 'package:test/test.dart';
+import 'data_directory.dart';
+import 'date_time_format_test_stub.dart';
 
-main() {
+void main() {
   runWith(evenLocales, dataDirectory, initializeDateFormatting);
 }
diff --git a/test/date_time_format_file_odd_test.dart b/test/date_time_format_file_odd_test.dart
index 3bb2d66..687b392 100644
--- a/test/date_time_format_file_odd_test.dart
+++ b/test/date_time_format_file_odd_test.dart
@@ -6,15 +6,15 @@
 /// local file system. This tests one half the locales, since testing all
 /// of them takes long enough that it may cause timeouts in the test bots.
 
-@Timeout(const Duration(seconds: 60))
-@TestOn("vm")
+@Timeout(Duration(seconds: 60))
+@TestOn('vm')
 library date_time_format_file_test_1;
 
-import 'date_time_format_test_stub.dart';
-import 'data_directory.dart';
 import 'package:intl/date_symbol_data_file.dart';
 import 'package:test/test.dart';
+import 'data_directory.dart';
+import 'date_time_format_test_stub.dart';
 
-main() {
+void main() {
   runWith(oddLocales, dataDirectory, initializeDateFormatting);
 }
diff --git a/test/date_time_format_local_even_test.dart b/test/date_time_format_local_even_test.dart
index cbeee35..e52cb31 100644
--- a/test/date_time_format_local_even_test.dart
+++ b/test/date_time_format_local_even_test.dart
@@ -9,9 +9,9 @@
 
 library date_time_format_test_2;
 
-import 'date_time_format_test_stub.dart';
 import 'package:intl/date_symbol_data_local.dart';
+import 'date_time_format_test_stub.dart';
 
-main() {
+void main() {
   runWith(evenLocales, null, initializeDateFormatting);
 }
diff --git a/test/date_time_format_local_odd_test.dart b/test/date_time_format_local_odd_test.dart
index 5102bcc..ecede2d 100644
--- a/test/date_time_format_local_odd_test.dart
+++ b/test/date_time_format_local_odd_test.dart
@@ -9,9 +9,9 @@
 
 library date_time_format_test_1;
 
-import 'date_time_format_test_stub.dart';
 import 'package:intl/date_symbol_data_local.dart';
+import 'date_time_format_test_stub.dart';
 
-main() {
+void main() {
   runWith(oddLocales, null, initializeDateFormatting);
 }
diff --git a/test/date_time_format_test_core.dart b/test/date_time_format_test_core.dart
index 951ef42..83982c0 100644
--- a/test/date_time_format_test_core.dart
+++ b/test/date_time_format_test_core.dart
@@ -8,9 +8,9 @@
 
 library date_time_format_tests;
 
+import 'package:intl/intl.dart';
 import 'package:test/test.dart';
 import 'date_time_format_test_data.dart';
-import 'package:intl/intl.dart';
 
 var formatsToTest = const [
   DateFormat.DAY,
@@ -66,50 +66,50 @@
 var icuFormatNamesToTest = const [
   // It would be really nice to not have to duplicate this and just be able
   // to use the names to get reflective access.
-  "DAY",
-  "ABBR_WEEKDAY",
-  "WEEKDAY",
-  "ABBR_STANDALONE_MONTH",
-  "STANDALONE_MONTH",
-  "NUM_MONTH",
-  "NUM_MONTH_DAY",
-  "NUM_MONTH_WEEKDAY_DAY",
-  "ABBR_MONTH",
-  "ABBR_MONTH_DAY",
-  "ABBR_MONTH_WEEKDAY_DAY",
-  "MONTH",
-  "MONTH_DAY",
-  "MONTH_WEEKDAY_DAY",
-  "ABBR_QUARTER",
-  "QUARTER",
-  "YEAR",
-  "YEAR_NUM_MONTH",
-  "YEAR_NUM_MONTH_DAY",
-  "YEAR_NUM_MONTH_WEEKDAY_DAY",
-  "YEAR_ABBR_MONTH",
-  "YEAR_ABBR_MONTH_DAY",
-  "YEAR_ABBR_MONTH_WEEKDAY_DAY",
-  "YEAR_MONTH",
-  "YEAR_MONTH_DAY",
-  "YEAR_MONTH_WEEKDAY_DAY",
+  'DAY',
+  'ABBR_WEEKDAY',
+  'WEEKDAY',
+  'ABBR_STANDALONE_MONTH',
+  'STANDALONE_MONTH',
+  'NUM_MONTH',
+  'NUM_MONTH_DAY',
+  'NUM_MONTH_WEEKDAY_DAY',
+  'ABBR_MONTH',
+  'ABBR_MONTH_DAY',
+  'ABBR_MONTH_WEEKDAY_DAY',
+  'MONTH',
+  'MONTH_DAY',
+  'MONTH_WEEKDAY_DAY',
+  'ABBR_QUARTER',
+  'QUARTER',
+  'YEAR',
+  'YEAR_NUM_MONTH',
+  'YEAR_NUM_MONTH_DAY',
+  'YEAR_NUM_MONTH_WEEKDAY_DAY',
+  'YEAR_ABBR_MONTH',
+  'YEAR_ABBR_MONTH_DAY',
+  'YEAR_ABBR_MONTH_WEEKDAY_DAY',
+  'YEAR_MONTH',
+  'YEAR_MONTH_DAY',
+  'YEAR_MONTH_WEEKDAY_DAY',
   // TODO(alanknight): CLDR and ICU appear to disagree on these for Japanese.
   // omit for the time being
-  //    "YEAR_ABBR_QUARTER",
-  //    "YEAR_QUARTER",
-  "HOUR24",
-  "HOUR24_MINUTE",
-  "HOUR24_MINUTE_SECOND",
-  "HOUR",
-  "HOUR_MINUTE",
-  "HOUR_MINUTE_SECOND",
+  //    'YEAR_ABBR_QUARTER',
+  //    'YEAR_QUARTER',
+  'HOUR24',
+  'HOUR24_MINUTE',
+  'HOUR24_MINUTE_SECOND',
+  'HOUR',
+  'HOUR_MINUTE',
+  'HOUR_MINUTE_SECOND',
   // TODO(alanknight): Time zone support
-  //    "HOUR_MINUTE_GENERIC_TZ",
-  //    "HOUR_MINUTE_TZ",
-  //    "HOUR_GENERIC_TZ",
-  //    "HOUR_TZ",
-  "MINUTE",
-  "MINUTE_SECOND",
-  "SECOND"
+  //    'HOUR_MINUTE_GENERIC_TZ',
+  //    'HOUR_MINUTE_TZ',
+  //    'HOUR_GENERIC_TZ',
+  //    'HOUR_TZ',
+  'MINUTE',
+  'MINUTE_SECOND',
+  'SECOND'
   // ABBR_GENERIC_TZ,
   // GENERIC_TZ,
   // ABBR_SPECIFIC_TZ,
@@ -121,19 +121,20 @@
 /// locale. [expectedResults] is a map from ICU format names to the
 /// expected result of formatting [date] according to that format in
 /// [localeName].
-testLocale(String localeName, Map expectedResults, DateTime date) {
-  var intl = new Intl(localeName);
-  for (int i = 0; i < formatsToTest.length; i++) {
+void testLocale(
+    String localeName, Map<String, String> expectedResults, DateTime date) {
+  var intl = Intl(localeName);
+  for (var i = 0; i < formatsToTest.length; i++) {
     var skeleton = formatsToTest[i];
     var format = intl.date(skeleton);
     var icuName = icuFormatNamesToTest[i];
     var actualResult = format.format(date);
     expect(expectedResults[icuName], equals(actualResult),
-        reason: "Mismatch in $localeName, testing skeleton '$skeleton'");
+        reason: 'Mismatch in $localeName, testing skeleton "$skeleton"');
   }
 }
 
-testRoundTripParsing(String localeName, DateTime date,
+void testRoundTripParsing(String localeName, DateTime date,
     [bool forceAscii = false]) {
   // In order to test parsing, we can't just read back the date, because
   // printing in most formats loses information. But we can test that
@@ -154,10 +155,10 @@
     DateFormat.NUM_MONTH_WEEKDAY_DAY,
     DateFormat.ABBR_MONTH_WEEKDAY_DAY
   ];
-  for (int i = 0; i < formatsToTest.length; i++) {
+  for (var i = 0; i < formatsToTest.length; i++) {
     var skeleton = formatsToTest[i];
     if (!badSkeletons.any((x) => x == skeleton)) {
-      var format = new DateFormat(skeleton, localeName);
+      var format = DateFormat(skeleton, localeName);
       if (forceAscii) format.useNativeDigits = false;
       var actualResult = format.format(date);
       var parsed = format.parseStrict(actualResult);
@@ -170,16 +171,13 @@
 /// A shortcut for returning all the locales we have available.
 List<String> allLocales() => DateFormat.allLocalesWithSymbols();
 
-typedef List<String> SubsetFuncType();
+typedef SubsetFuncType = List<String> Function();
 SubsetFuncType _subsetFunc;
 
 List<String> _subsetValue;
 
 List<String> get subset {
-  if (_subsetValue == null) {
-    _subsetValue = _subsetFunc();
-  }
-  return _subsetValue;
+  return _subsetValue ??= _subsetFunc();
 }
 
 // TODO(alanknight): Run specific tests for the en_ISO locale which isn't
@@ -190,56 +188,56 @@
   _subsetFunc = subsetFunc;
 
   test('Multiple patterns', () {
-    var date = new DateTime.now();
-    var multiple1 = new DateFormat.yMd().add_jms();
-    var multiple2 = new DateFormat("yMd").add_jms();
-    var separate1 = new DateFormat.yMd();
-    var separate2 = new DateFormat.jms();
-    var separateFormat = "${separate1.format(date)} ${separate2.format(date)}";
+    var date = DateTime.now();
+    var multiple1 = DateFormat.yMd().add_jms();
+    var multiple2 = DateFormat('yMd').add_jms();
+    var separate1 = DateFormat.yMd();
+    var separate2 = DateFormat.jms();
+    var separateFormat = '${separate1.format(date)} ${separate2.format(date)}';
     expect(multiple1.format(date), equals(multiple2.format(date)));
     expect(multiple1.format(date), equals(separateFormat));
-    var customPunctuation = new DateFormat("yMd").addPattern("jms", ":::");
-    var custom = "${separate1.format(date)}:::${separate2.format(date)}";
+    var customPunctuation = DateFormat('yMd').addPattern('jms', ':::');
+    var custom = '${separate1.format(date)}:::${separate2.format(date)}';
     expect(customPunctuation.format(date), equals(custom));
   });
 
   test('Basic date format parsing', () {
-    var date_format = new DateFormat("d");
-    expect(date_format.parsePattern("hh:mm:ss").map((x) => x.pattern).toList(),
-        orderedEquals(["hh", ":", "mm", ":", "ss"]));
-    expect(date_format.parsePattern("hh:mm:ss").map((x) => x.pattern).toList(),
-        orderedEquals(["hh", ":", "mm", ":", "ss"]));
+    var dateFormat = DateFormat('d');
+    expect(dateFormat.parsePattern('hh:mm:ss').map((x) => x.pattern).toList(),
+        orderedEquals(['hh', ':', 'mm', ':', 'ss']));
+    expect(dateFormat.parsePattern('hh:mm:ss').map((x) => x.pattern).toList(),
+        orderedEquals(['hh', ':', 'mm', ':', 'ss']));
   });
 
   test('Test ALL the supported formats on representative locales', () {
-    var aDate = new DateTime(2012, 1, 27, 20, 58, 59, 0);
-    testLocale("en_US", English, aDate);
+    var aDate = DateTime(2012, 1, 27, 20, 58, 59, 0);
+    testLocale('en_US', english, aDate);
     if (subset.length > 1) {
       // Don't run if we have just one locale, so some of these won't be there.
-      testLocale("de_DE", German, aDate);
-      testLocale("fr_FR", French, aDate);
-      testLocale("ja_JP", Japanese, aDate);
-      testLocale("el_GR", Greek, aDate);
-      testLocale("de_AT", Austrian, aDate);
+      testLocale('de_DE', german, aDate);
+      testLocale('fr_FR', french, aDate);
+      testLocale('ja_JP', japanese, aDate);
+      testLocale('el_GR', greek, aDate);
+      testLocale('de_AT', austrian, aDate);
     }
   });
 
   test('Test round-trip parsing of dates', () {
     var hours = [0, 1, 11, 12, 13, 23];
     var months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
-    // For locales that use non-ascii digits, e.g. "ar", also test
+    // For locales that use non-ascii digits, e.g. 'ar', also test
     // forcing ascii digits.
     for (var locale in subset) {
-      var alsoForceAscii = new DateFormat.d(locale).usesNativeDigits;
+      var alsoForceAscii = DateFormat.d(locale).usesNativeDigits;
       for (var month in months) {
-        var aDate = new DateTime(2012, month, 27, 13, 58, 59, 012);
+        var aDate = DateTime(2012, month, 27, 13, 58, 59, 012);
         testRoundTripParsing(locale, aDate);
         if (alsoForceAscii) {
           testRoundTripParsing(locale, aDate, true);
         }
       }
       for (var hour in hours) {
-        var aDate = new DateTime(2012, 1, 27, hour, 58, 59, 123);
+        var aDate = DateTime(2012, 1, 27, hour, 58, 59, 123);
         testRoundTripParsing(locale, aDate);
         if (alsoForceAscii) {
           testRoundTripParsing(locale, aDate, true);
@@ -255,68 +253,68 @@
   test('Test malformed locales', () {
     // Don't run if we have just one locale, which may not include these.
     if (subset.length <= 1) return;
-    var aDate = new DateTime(2012, 1, 27, 20, 58, 59, 0);
+    var aDate = DateTime(2012, 1, 27, 20, 58, 59, 0);
     // Austrian is a useful test locale here because it differs slightly
-    // from the generic "de" locale so we can tell the difference between
-    // correcting to "de_AT" and falling back to just "de".
-    testLocale('de-AT', Austrian, aDate);
-    testLocale('de_at', Austrian, aDate);
-    testLocale('de-at', Austrian, aDate);
+    // from the generic 'de' locale so we can tell the difference between
+    // correcting to 'de_AT' and falling back to just 'de'.
+    testLocale('de-AT', austrian, aDate);
+    testLocale('de_at', austrian, aDate);
+    testLocale('de-at', austrian, aDate);
   });
 
   test('Test format creation via Intl', () {
     // Don't run if we have just one locale, which may not include these.
     if (subset.length <= 1) return;
-    var intl = new Intl('ja_JP');
+    var intl = Intl('ja_JP');
     var instanceJP = intl.date('jms');
     var instanceUS = intl.date('jms', 'en_US');
     var blank = intl.date('jms');
-    var date = new DateTime(2012, 1, 27, 20, 58, 59, 0);
-    expect(instanceJP.format(date), equals("20:58:59"));
-    expect(instanceUS.format(date), equals("8:58:59 PM"));
-    expect(blank.format(date), equals("20:58:59"));
+    var date = DateTime(2012, 1, 27, 20, 58, 59, 0);
+    expect(instanceJP.format(date), equals('20:58:59'));
+    expect(instanceUS.format(date), equals('8:58:59 PM'));
+    expect(blank.format(date), equals('20:58:59'));
   });
 
   test('Test explicit format string', () {
     // Don't run if we have just one locale, which may not include these.
     if (subset.length <= 1) return;
-    var aDate = new DateTime(2012, 1, 27, 20, 58, 59, 0);
+    var aDate = DateTime(2012, 1, 27, 20, 58, 59, 0);
     // An explicit format that doesn't conform to any skeleton
-    var us = new DateFormat(r'yy //// :W \\\\ dd:ss ^&@ M');
-    expect(us.format(aDate), equals(r"12 //// :W \\\\ 27:59 ^&@ 1"));
+    var us = DateFormat(r'yy //// :W \\\\ dd:ss ^&@ M');
+    expect(us.format(aDate), equals(r'12 //// :W \\\\ 27:59 ^&@ 1'));
     // The result won't change with locale unless we use fields that are words.
-    var greek = new DateFormat(r'yy //// :W \\\\ dd:ss ^&@ M', 'el_GR');
-    expect(greek.format(aDate), equals(r"12 //// :W \\\\ 27:59 ^&@ 1"));
-    var usWithWords = new DateFormat('yy / :W \\ dd:ss ^&@ MMM', 'en_US');
-    var greekWithWords = new DateFormat('yy / :W \\ dd:ss ^&@ MMM', 'el_GR');
-    expect(usWithWords.format(aDate), equals(r"12 / :W \ 27:59 ^&@ Jan"));
-    expect(greekWithWords.format(aDate), equals(r"12 / :W \ 27:59 ^&@ Ιαν"));
-    var escaped = new DateFormat(r"hh 'o''clock'");
+    var greek = DateFormat(r'yy //// :W \\\\ dd:ss ^&@ M', 'el_GR');
+    expect(greek.format(aDate), equals(r'12 //// :W \\\\ 27:59 ^&@ 1'));
+    var usWithWords = DateFormat('yy / :W \\ dd:ss ^&@ MMM', 'en_US');
+    var greekWithWords = DateFormat('yy / :W \\ dd:ss ^&@ MMM', 'el_GR');
+    expect(usWithWords.format(aDate), equals(r'12 / :W \ 27:59 ^&@ Jan'));
+    expect(greekWithWords.format(aDate), equals(r'12 / :W \ 27:59 ^&@ Ιαν'));
+    var escaped = DateFormat(r"hh 'o''clock'");
     expect(escaped.format(aDate), equals(r"08 o'clock"));
     var reParsed = escaped.parse(escaped.format(aDate));
     expect(escaped.format(reParsed), equals(escaped.format(aDate)));
-    var noSeparators = new DateFormat('HHmmss');
-    expect(noSeparators.format(aDate), equals("205859"));
+    var noSeparators = DateFormat('HHmmss');
+    expect(noSeparators.format(aDate), equals('205859'));
   });
 
   test('Test fractional seconds padding', () {
-    var one = new DateTime(2012, 1, 27, 20, 58, 59, 1);
-    var oneHundred = new DateTime(2012, 1, 27, 20, 58, 59, 100);
-    var fractional = new DateFormat('hh:mm:ss.SSS', 'en_US');
+    var one = DateTime(2012, 1, 27, 20, 58, 59, 1);
+    var oneHundred = DateTime(2012, 1, 27, 20, 58, 59, 100);
+    var fractional = DateFormat('hh:mm:ss.SSS', 'en_US');
     expect(fractional.format(one), equals('08:58:59.001'));
     expect(fractional.format(oneHundred), equals('08:58:59.100'));
-    var long = new DateFormat('ss.SSSSSSSS', 'en_US');
+    var long = DateFormat('ss.SSSSSSSS', 'en_US');
     expect(long.format(oneHundred), equals('59.10000000'));
     expect(long.format(one), equals('59.00100000'));
   });
 
   test('Test parseUTC', () {
-    var local = new DateTime(2012, 1, 27, 20, 58, 59, 1);
-    var utc = new DateTime.utc(2012, 1, 27, 20, 58, 59, 1);
+    var local = DateTime(2012, 1, 27, 20, 58, 59, 1);
+    var utc = DateTime.utc(2012, 1, 27, 20, 58, 59, 1);
     // Getting the offset as a duration via difference() would be simpler,
     // but doesn't work on dart2js in checked mode. See issue 4437.
     var offset = utc.millisecondsSinceEpoch - local.millisecondsSinceEpoch;
-    var format = new DateFormat('yyyy-MM-dd HH:mm:ss');
+    var format = DateFormat('yyyy-MM-dd HH:mm:ss');
     var localPrinted = format.format(local);
     var parsed = format.parse(localPrinted);
     var parsedUTC = format.parseUTC(format.format(utc));
@@ -328,22 +326,22 @@
   });
 
   test('Test 0-padding', () {
-    var someDate = new DateTime(123, 1, 2, 3, 4, 5);
-    var format = new DateFormat('yyyy-MM-dd HH:mm:ss');
+    var someDate = DateTime(123, 1, 2, 3, 4, 5);
+    var format = DateFormat('yyyy-MM-dd HH:mm:ss');
     expect(format.format(someDate), '0123-01-02 03:04:05');
   });
 
   test('Test default format', () {
-    var someDate = new DateTime(2012, 1, 27, 20, 58, 59, 1);
-    var emptyFormat = new DateFormat(null, "en_US");
-    var knownDefault = new DateFormat.yMMMMd("en_US").add_jms();
+    var someDate = DateTime(2012, 1, 27, 20, 58, 59, 1);
+    var emptyFormat = DateFormat(null, 'en_US');
+    var knownDefault = DateFormat.yMMMMd('en_US').add_jms();
     var result = emptyFormat.format(someDate);
     var knownResult = knownDefault.format(someDate);
     expect(result, knownResult);
   });
 
   test('Get symbols', () {
-    var emptyFormat = new DateFormat(null, "en_US");
+    var emptyFormat = DateFormat(null, 'en_US');
     var symbols = emptyFormat.dateSymbols;
     expect(symbols.NARROWWEEKDAYS, ['S', 'M', 'T', 'W', 'T', 'F', 'S']);
   });
@@ -363,17 +361,17 @@
       'Q4',
       'Q4'
     ];
-    var quarterFormat = new DateFormat.QQQ();
-    for (int i = 0; i < 12; i++) {
+    var quarterFormat = DateFormat.QQQ();
+    for (var i = 0; i < 12; i++) {
       var month = i + 1;
-      var aDate = new DateTime(2012, month, 27, 13, 58, 59, 012);
+      var aDate = DateTime(2012, month, 27, 13, 58, 59, 012);
       var formatted = quarterFormat.format(aDate);
       expect(formatted, quarters[i]);
     }
   });
 
   test('Quarter formatting', () {
-    var date = new DateTime(2012, 02, 27);
+    var date = DateTime(2012, 02, 27);
     var formats = {
       'Q': '1',
       'QQ': '01',
@@ -382,14 +380,14 @@
       'QQQQQ': '00001'
     };
     formats.forEach((pattern, result) {
-      expect(new DateFormat(pattern, 'en_US').format(date), result);
+      expect(DateFormat(pattern, 'en_US').format(date), result);
     });
 
     if (subset.contains('zh_CN')) {
       // Especially test zh_CN formatting for `QQQ` and `yQQQ` because it
       // contains a single `Q`.
-      expect(new DateFormat.QQQ('zh_CN').format(date), '1季度');
-      expect(new DateFormat.yQQQ('zh_CN').format(date), '2012年第1季度');
+      expect(DateFormat.QQQ('zh_CN').format(date), '1季度');
+      expect(DateFormat.yQQQ('zh_CN').format(date), '2012年第1季度');
     }
   });
 
@@ -397,23 +395,23 @@
   /// to a Date object. If [year] is a leap year, then pass 1 for
   /// [leapDay], otherwise pass 0.
   Map<int, DateTime> generateDates(int year, int leapDay) =>
-      new Iterable.generate(365 + leapDay, (n) => n + 1)
+      Iterable.generate(365 + leapDay, (n) => n + 1)
           .map((day) {
             // Typically a "date" would have a time value of zero, but we
             // give them an hour value, because they can get created with an
             // offset to the previous day in time zones where the daylight
             // savings transition happens at midnight (e.g. Brazil).
-            var result = new DateTime(year, 1, day, 3);
+            var result = DateTime(year, 1, day, 3);
             // TODO(alanknight): This is a workaround for dartbug.com/15560.
-            if (result.toUtc() == result) result = new DateTime(year, 1, day);
+            if (result.toUtc() == result) result = DateTime(year, 1, day);
             return result;
           })
           .toList()
           .asMap();
 
-  void verifyOrdinals(Map dates) {
-    var f = new DateFormat("D");
-    var withYear = new DateFormat("yyyy D");
+  void verifyOrdinals(Map<int, DateTime> dates) {
+    var f = DateFormat('D');
+    var withYear = DateFormat('yyyy D');
     dates.forEach((number, date) {
       var formatted = f.format(date);
       expect(formatted, (number + 1).toString());
@@ -429,24 +427,24 @@
   }
 
   test('Ordinal Date', () {
-    var f = new DateFormat("D");
+    var f = DateFormat('D');
     var dates = generateDates(2012, 1);
     var nonLeapDates = generateDates(2013, 0);
     verifyOrdinals(dates);
     verifyOrdinals(nonLeapDates);
     // Check one hard-coded just to be on the safe side.
-    var aDate = new DateTime(2012, 4, 27, 13, 58, 59, 012);
-    expect(f.format(aDate), "118");
+    var aDate = DateTime(2012, 4, 27, 13, 58, 59, 012);
+    expect(f.format(aDate), '118');
   });
 
   // There are some very odd off-by-one bugs when parsing dates. Put in
   // some very basic tests to try and get more information.
   test('Simple Date Creation', () {
-    var format = new DateFormat(DateFormat.NUM_MONTH);
-    var first = format.parse("7");
-    var second = format.parse("7");
-    var basic = new DateTime(1970, 7);
-    var basicAgain = new DateTime(1970, 7);
+    var format = DateFormat(DateFormat.NUM_MONTH);
+    var first = format.parse('7');
+    var second = format.parse('7');
+    var basic = DateTime(1970, 7);
+    var basicAgain = DateTime(1970, 7);
     expect(first, second);
     expect(first, basic);
     expect(basic, basicAgain);
@@ -455,13 +453,13 @@
 
   test('Native digit default', () {
     if (!subset.contains('ar')) return;
-    var nativeFormat = new DateFormat.yMd('ar');
-    var date = new DateTime(1974, 12, 30);
+    var nativeFormat = DateFormat.yMd('ar');
+    var date = DateTime(1974, 12, 30);
     var native = nativeFormat.format(date);
     expect(DateFormat.shouldUseNativeDigitsByDefaultFor('ar'), true);
     DateFormat.useNativeDigitsByDefaultFor('ar', false);
     expect(DateFormat.shouldUseNativeDigitsByDefaultFor('ar'), false);
-    var asciiFormat = new DateFormat.yMd('ar');
+    var asciiFormat = DateFormat.yMd('ar');
     var ascii = asciiFormat.format(date);
     // This prints with RTL markers before the slashes. That doesn't seem good,
     // but it's what the data says.
@@ -483,6 +481,5 @@
     expect(zeroToTwentyThree.format(late), '00');
     expect(oneToTwelve.format(late), '12');
     expect(zeroToEleven.format(late), '00');
-
   });
 }
diff --git a/test/date_time_format_test_data.dart b/test/date_time_format_test_data.dart
index f9382f8..a0a57f7 100644
--- a/test/date_time_format_test_data.dart
+++ b/test/date_time_format_test_data.dart
@@ -11,329 +11,329 @@
 
 library date_time_format_test_data;
 
-var English = const {
-  "DAY": "27",
-  "ABBR_WEEKDAY": "Fri",
-  "WEEKDAY": "Friday",
-  "ABBR_STANDALONE_MONTH": "Jan",
-  "STANDALONE_MONTH": "January",
-  "NUM_MONTH": "1",
-  "NUM_MONTH_DAY": "1/27",
-  "NUM_MONTH_WEEKDAY_DAY": "Fri, 1/27",
-  "ABBR_MONTH": "Jan",
-  "ABBR_MONTH_DAY": "Jan 27",
-  "ABBR_MONTH_WEEKDAY_DAY": "Fri, Jan 27",
-  "MONTH": "January",
-  "MONTH_DAY": "January 27",
-  "MONTH_WEEKDAY_DAY": "Friday, January 27",
-  "ABBR_QUARTER": "Q1",
-  "QUARTER": "1st quarter",
-  "YEAR": "2012",
-  "YEAR_NUM_MONTH": "1/2012",
-  "YEAR_NUM_MONTH_DAY": "1/27/2012",
-  "YEAR_NUM_MONTH_WEEKDAY_DAY": "Fri, 1/27/2012",
-  "YEAR_ABBR_MONTH": "Jan 2012",
-  "YEAR_ABBR_MONTH_DAY": "Jan 27, 2012",
-  "YEAR_ABBR_MONTH_WEEKDAY_DAY": "Fri, Jan 27, 2012",
-  "YEAR_MONTH": "January 2012",
-  "YEAR_MONTH_DAY": "January 27, 2012",
-  "YEAR_MONTH_WEEKDAY_DAY": "Friday, January 27, 2012",
-  "YEAR_ABBR_QUARTER": "Q1 2012",
-  "YEAR_QUARTER": "1st quarter 2012",
-  "HOUR24": "20",
-  "HOUR24_MINUTE": "20:58",
-  "HOUR24_MINUTE_SECOND": "20:58:59",
-  "HOUR": "8 PM",
-  "HOUR_MINUTE": "8:58 PM",
-  "HOUR_MINUTE_SECOND": "8:58:59 PM",
-  "MINUTE": "58",
-  "MINUTE_SECOND": "58:59",
-  "SECOND": "59",
-  "LOCATION_TZ": "United States Time (Los Angeles)",
-  "GENERIC_TZ": "Pacific Time",
-  "ABBR_GENERIC_TZ": "PT",
-  "SPECIFIC_TZ": "Pacific Standard Time",
-  "ABBR_SPECIFIC_TZ": "PST",
-  "ABBR_UTC_TZ": "GMT-08:00",
-  "YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND":
-      "Friday, January 27, 2012 8:58:59 PM",
-  "YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + GENERIC_TZ":
-      "Friday, January 27, 2012 8:58:59 PM Pacific Time",
-  "YEAR_ABBR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + ABBR_SPECIFIC_TZ":
-      "Fri, Jan 27, 2012 8:58:59 PM PST",
-  "HOUR_MINUTE_SECOND + ABBR_GENERIC_TZ": "8:58:59 PM PT",
-  "HOUR_MINUTE + ABBR_SPECIFIC_TZ": "8:58 PM PST"
+const english = {
+  'DAY': '27',
+  'ABBR_WEEKDAY': 'Fri',
+  'WEEKDAY': 'Friday',
+  'ABBR_STANDALONE_MONTH': 'Jan',
+  'STANDALONE_MONTH': 'January',
+  'NUM_MONTH': '1',
+  'NUM_MONTH_DAY': '1/27',
+  'NUM_MONTH_WEEKDAY_DAY': 'Fri, 1/27',
+  'ABBR_MONTH': 'Jan',
+  'ABBR_MONTH_DAY': 'Jan 27',
+  'ABBR_MONTH_WEEKDAY_DAY': 'Fri, Jan 27',
+  'MONTH': 'January',
+  'MONTH_DAY': 'January 27',
+  'MONTH_WEEKDAY_DAY': 'Friday, January 27',
+  'ABBR_QUARTER': 'Q1',
+  'QUARTER': '1st quarter',
+  'YEAR': '2012',
+  'YEAR_NUM_MONTH': '1/2012',
+  'YEAR_NUM_MONTH_DAY': '1/27/2012',
+  'YEAR_NUM_MONTH_WEEKDAY_DAY': 'Fri, 1/27/2012',
+  'YEAR_ABBR_MONTH': 'Jan 2012',
+  'YEAR_ABBR_MONTH_DAY': 'Jan 27, 2012',
+  'YEAR_ABBR_MONTH_WEEKDAY_DAY': 'Fri, Jan 27, 2012',
+  'YEAR_MONTH': 'January 2012',
+  'YEAR_MONTH_DAY': 'January 27, 2012',
+  'YEAR_MONTH_WEEKDAY_DAY': 'Friday, January 27, 2012',
+  'YEAR_ABBR_QUARTER': 'Q1 2012',
+  'YEAR_QUARTER': '1st quarter 2012',
+  'HOUR24': '20',
+  'HOUR24_MINUTE': '20:58',
+  'HOUR24_MINUTE_SECOND': '20:58:59',
+  'HOUR': '8 PM',
+  'HOUR_MINUTE': '8:58 PM',
+  'HOUR_MINUTE_SECOND': '8:58:59 PM',
+  'MINUTE': '58',
+  'MINUTE_SECOND': '58:59',
+  'SECOND': '59',
+  'LOCATION_TZ': 'United States Time (Los Angeles)',
+  'GENERIC_TZ': 'Pacific Time',
+  'ABBR_GENERIC_TZ': 'PT',
+  'SPECIFIC_TZ': 'Pacific Standard Time',
+  'ABBR_SPECIFIC_TZ': 'PST',
+  'ABBR_UTC_TZ': 'GMT-08:00',
+  'YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND':
+      'Friday, January 27, 2012 8:58:59 PM',
+  'YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + GENERIC_TZ':
+      'Friday, January 27, 2012 8:58:59 PM Pacific Time',
+  'YEAR_ABBR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + ABBR_SPECIFIC_TZ':
+      'Fri, Jan 27, 2012 8:58:59 PM PST',
+  'HOUR_MINUTE_SECOND + ABBR_GENERIC_TZ': '8:58:59 PM PT',
+  'HOUR_MINUTE + ABBR_SPECIFIC_TZ': '8:58 PM PST'
 };
 
-var German = const {
-  "DAY": "27",
-  "ABBR_WEEKDAY": "Fr",
-  "WEEKDAY": "Freitag",
-  "ABBR_STANDALONE_MONTH": "Jan",
-  "STANDALONE_MONTH": "Januar",
-  "NUM_MONTH": "1",
-  "NUM_MONTH_DAY": "27.1.",
-  "NUM_MONTH_WEEKDAY_DAY": "Fr., 27.1.",
-  "ABBR_MONTH": "Jan",
-  "ABBR_MONTH_DAY": "27. Jan.",
-  "ABBR_MONTH_WEEKDAY_DAY": "Fr., 27. Jan.",
-  "MONTH": "Januar",
-  "MONTH_DAY": "27. Januar",
-  "MONTH_WEEKDAY_DAY": "Freitag, 27. Januar",
-  "ABBR_QUARTER": "Q1",
-  "QUARTER": "1. Quartal",
-  "YEAR": "2012",
-  "YEAR_NUM_MONTH": "1.2012",
-  "YEAR_NUM_MONTH_DAY": "27.1.2012",
-  "YEAR_NUM_MONTH_WEEKDAY_DAY": "Fr., 27.1.2012",
-  "YEAR_ABBR_MONTH": "Jan. 2012",
-  "YEAR_ABBR_MONTH_DAY": "27. Jan. 2012",
-  "YEAR_ABBR_MONTH_WEEKDAY_DAY": "Fr., 27. Jan. 2012",
-  "YEAR_MONTH": "Januar 2012",
-  "YEAR_MONTH_DAY": "27. Januar 2012",
-  "YEAR_MONTH_WEEKDAY_DAY": "Freitag, 27. Januar 2012",
-  "YEAR_ABBR_QUARTER": "Q1 2012",
-  "YEAR_QUARTER": "1. Quartal 2012",
-  "HOUR24": "20 Uhr",
-  "HOUR24_MINUTE": "20:58",
-  "HOUR24_MINUTE_SECOND": "20:58:59",
-  "HOUR": "20 Uhr",
-  "HOUR_MINUTE": "20:58",
-  "HOUR_MINUTE_SECOND": "20:58:59",
-  "MINUTE": "58",
-  "MINUTE_SECOND": "58:59",
-  "SECOND": "59",
-  "LOCATION_TZ": "Vereinigte Staaten Zeit (Los Angeles)",
-  "GENERIC_TZ": "Nordamerikanische Westküstenzeit",
-  "ABBR_GENERIC_TZ": "Vereinigte Staaten Zeit (Los Angeles)",
-  "SPECIFIC_TZ": "Nordamerikanische Westküsten-Winterzeit",
-  "ABBR_SPECIFIC_TZ": "GMT-08:00",
-  "ABBR_UTC_TZ": "GMT-08:00",
-  "YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND":
-      "Freitag, 27. Januar 2012 20:58:59",
-  "YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + GENERIC_TZ":
-      "Freitag, 27. Januar 2012 20:58:59 Nordamerikanische Westküstenzeit",
-  "YEAR_ABBR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + ABBR_SPECIFIC_TZ":
-      "Fr., 27. Jan 2012 20:58:59 GMT-08:00",
-  "HOUR_MINUTE_SECOND + ABBR_GENERIC_TZ":
-      "20:58:59 Vereinigte Staaten Zeit (Los Angeles)",
-  "HOUR_MINUTE + ABBR_SPECIFIC_TZ": "20:58 GMT-08:00"
+const german = {
+  'DAY': '27',
+  'ABBR_WEEKDAY': 'Fr',
+  'WEEKDAY': 'Freitag',
+  'ABBR_STANDALONE_MONTH': 'Jan',
+  'STANDALONE_MONTH': 'Januar',
+  'NUM_MONTH': '1',
+  'NUM_MONTH_DAY': '27.1.',
+  'NUM_MONTH_WEEKDAY_DAY': 'Fr., 27.1.',
+  'ABBR_MONTH': 'Jan',
+  'ABBR_MONTH_DAY': '27. Jan.',
+  'ABBR_MONTH_WEEKDAY_DAY': 'Fr., 27. Jan.',
+  'MONTH': 'Januar',
+  'MONTH_DAY': '27. Januar',
+  'MONTH_WEEKDAY_DAY': 'Freitag, 27. Januar',
+  'ABBR_QUARTER': 'Q1',
+  'QUARTER': '1. Quartal',
+  'YEAR': '2012',
+  'YEAR_NUM_MONTH': '1.2012',
+  'YEAR_NUM_MONTH_DAY': '27.1.2012',
+  'YEAR_NUM_MONTH_WEEKDAY_DAY': 'Fr., 27.1.2012',
+  'YEAR_ABBR_MONTH': 'Jan. 2012',
+  'YEAR_ABBR_MONTH_DAY': '27. Jan. 2012',
+  'YEAR_ABBR_MONTH_WEEKDAY_DAY': 'Fr., 27. Jan. 2012',
+  'YEAR_MONTH': 'Januar 2012',
+  'YEAR_MONTH_DAY': '27. Januar 2012',
+  'YEAR_MONTH_WEEKDAY_DAY': 'Freitag, 27. Januar 2012',
+  'YEAR_ABBR_QUARTER': 'Q1 2012',
+  'YEAR_QUARTER': '1. Quartal 2012',
+  'HOUR24': '20 Uhr',
+  'HOUR24_MINUTE': '20:58',
+  'HOUR24_MINUTE_SECOND': '20:58:59',
+  'HOUR': '20 Uhr',
+  'HOUR_MINUTE': '20:58',
+  'HOUR_MINUTE_SECOND': '20:58:59',
+  'MINUTE': '58',
+  'MINUTE_SECOND': '58:59',
+  'SECOND': '59',
+  'LOCATION_TZ': 'Vereinigte Staaten Zeit (Los Angeles)',
+  'GENERIC_TZ': 'Nordamerikanische Westküstenzeit',
+  'ABBR_GENERIC_TZ': 'Vereinigte Staaten Zeit (Los Angeles)',
+  'SPECIFIC_TZ': 'Nordamerikanische Westküsten-Winterzeit',
+  'ABBR_SPECIFIC_TZ': 'GMT-08:00',
+  'ABBR_UTC_TZ': 'GMT-08:00',
+  'YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND':
+      'Freitag, 27. Januar 2012 20:58:59',
+  'YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + GENERIC_TZ':
+      'Freitag, 27. Januar 2012 20:58:59 Nordamerikanische Westküstenzeit',
+  'YEAR_ABBR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + ABBR_SPECIFIC_TZ':
+      'Fr., 27. Jan 2012 20:58:59 GMT-08:00',
+  'HOUR_MINUTE_SECOND + ABBR_GENERIC_TZ':
+      '20:58:59 Vereinigte Staaten Zeit (Los Angeles)',
+  'HOUR_MINUTE + ABBR_SPECIFIC_TZ': '20:58 GMT-08:00'
 };
 
-var Austrian = const {
-  "DAY": "27",
-  "ABBR_WEEKDAY": "Fr",
-  "WEEKDAY": "Freitag",
-  "ABBR_STANDALONE_MONTH": "Jän",
-  "STANDALONE_MONTH": "Jänner",
-  "NUM_MONTH": "1",
-  "NUM_MONTH_DAY": "27.1.",
-  "NUM_MONTH_WEEKDAY_DAY": "Fr., 27.1.",
-  "ABBR_MONTH": "Jän",
-  "ABBR_MONTH_DAY": "27. Jän.",
-  "ABBR_MONTH_WEEKDAY_DAY": "Fr., 27. Jän.",
-  "MONTH": "Jänner",
-  "MONTH_DAY": "27. Jänner",
-  "MONTH_WEEKDAY_DAY": "Freitag, 27. Jänner",
-  "ABBR_QUARTER": "Q1",
-  "QUARTER": "1. Quartal",
-  "YEAR": "2012",
-  "YEAR_NUM_MONTH": "1.2012",
-  "YEAR_NUM_MONTH_DAY": "27.1.2012",
-  "YEAR_NUM_MONTH_WEEKDAY_DAY": "Fr., 27.1.2012",
-  "YEAR_ABBR_MONTH": "Jän. 2012",
-  "YEAR_ABBR_MONTH_DAY": "27. Jän. 2012",
-  "YEAR_ABBR_MONTH_WEEKDAY_DAY": "Fr., 27. Jän. 2012",
-  "YEAR_MONTH": "Jänner 2012",
-  "YEAR_MONTH_DAY": "27. Jänner 2012",
-  "YEAR_MONTH_WEEKDAY_DAY": "Freitag, 27. Jänner 2012",
-  "YEAR_ABBR_QUARTER": "Q1 2012",
-  "YEAR_QUARTER": "1. Quartal 2012",
-  "HOUR24": "20 Uhr",
-  "HOUR24_MINUTE": "20:58",
-  "HOUR24_MINUTE_SECOND": "20:58:59",
-  "HOUR": "20 Uhr",
-  "HOUR_MINUTE": "20:58",
-  "HOUR_MINUTE_SECOND": "20:58:59",
-  "MINUTE": "58",
-  "MINUTE_SECOND": "58:59",
-  "SECOND": "59",
-  "LOCATION_TZ": "Vereinigte Staaten Zeit (Los Angeles)",
-  "GENERIC_TZ": "Nordamerikanische Westküstenzeit",
-  "ABBR_GENERIC_TZ": "Vereinigte Staaten Zeit (Los Angeles)",
-  "SPECIFIC_TZ": "Nordamerikanische Westküsten-Winterzeit",
-  "ABBR_SPECIFIC_TZ": "GMT-08:00",
-  "ABBR_UTC_TZ": "GMT-08:00",
-  "YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND":
-      "Freitag, 27. Jänner 2012 20:58:59",
-  "YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + GENERIC_TZ":
-      "Freitag, 27. Jänner 2012 20:58:59 Nordamerikanische Westküstenzeit",
-  "YEAR_ABBR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + ABBR_SPECIFIC_TZ":
-      "Fr., 27. Jän 2012 20:58:59 GMT-08:00",
-  "HOUR_MINUTE_SECOND + ABBR_GENERIC_TZ":
-      "20:58:59 Vereinigte Staaten Zeit (Los Angeles)",
-  "HOUR_MINUTE + ABBR_SPECIFIC_TZ": "20:58 GMT-08:00"
+const austrian = {
+  'DAY': '27',
+  'ABBR_WEEKDAY': 'Fr',
+  'WEEKDAY': 'Freitag',
+  'ABBR_STANDALONE_MONTH': 'Jän',
+  'STANDALONE_MONTH': 'Jänner',
+  'NUM_MONTH': '1',
+  'NUM_MONTH_DAY': '27.1.',
+  'NUM_MONTH_WEEKDAY_DAY': 'Fr., 27.1.',
+  'ABBR_MONTH': 'Jän',
+  'ABBR_MONTH_DAY': '27. Jän.',
+  'ABBR_MONTH_WEEKDAY_DAY': 'Fr., 27. Jän.',
+  'MONTH': 'Jänner',
+  'MONTH_DAY': '27. Jänner',
+  'MONTH_WEEKDAY_DAY': 'Freitag, 27. Jänner',
+  'ABBR_QUARTER': 'Q1',
+  'QUARTER': '1. Quartal',
+  'YEAR': '2012',
+  'YEAR_NUM_MONTH': '1.2012',
+  'YEAR_NUM_MONTH_DAY': '27.1.2012',
+  'YEAR_NUM_MONTH_WEEKDAY_DAY': 'Fr., 27.1.2012',
+  'YEAR_ABBR_MONTH': 'Jän. 2012',
+  'YEAR_ABBR_MONTH_DAY': '27. Jän. 2012',
+  'YEAR_ABBR_MONTH_WEEKDAY_DAY': 'Fr., 27. Jän. 2012',
+  'YEAR_MONTH': 'Jänner 2012',
+  'YEAR_MONTH_DAY': '27. Jänner 2012',
+  'YEAR_MONTH_WEEKDAY_DAY': 'Freitag, 27. Jänner 2012',
+  'YEAR_ABBR_QUARTER': 'Q1 2012',
+  'YEAR_QUARTER': '1. Quartal 2012',
+  'HOUR24': '20 Uhr',
+  'HOUR24_MINUTE': '20:58',
+  'HOUR24_MINUTE_SECOND': '20:58:59',
+  'HOUR': '20 Uhr',
+  'HOUR_MINUTE': '20:58',
+  'HOUR_MINUTE_SECOND': '20:58:59',
+  'MINUTE': '58',
+  'MINUTE_SECOND': '58:59',
+  'SECOND': '59',
+  'LOCATION_TZ': 'Vereinigte Staaten Zeit (Los Angeles)',
+  'GENERIC_TZ': 'Nordamerikanische Westküstenzeit',
+  'ABBR_GENERIC_TZ': 'Vereinigte Staaten Zeit (Los Angeles)',
+  'SPECIFIC_TZ': 'Nordamerikanische Westküsten-Winterzeit',
+  'ABBR_SPECIFIC_TZ': 'GMT-08:00',
+  'ABBR_UTC_TZ': 'GMT-08:00',
+  'YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND':
+      'Freitag, 27. Jänner 2012 20:58:59',
+  'YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + GENERIC_TZ':
+      'Freitag, 27. Jänner 2012 20:58:59 Nordamerikanische Westküstenzeit',
+  'YEAR_ABBR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + ABBR_SPECIFIC_TZ':
+      'Fr., 27. Jän 2012 20:58:59 GMT-08:00',
+  'HOUR_MINUTE_SECOND + ABBR_GENERIC_TZ':
+      '20:58:59 Vereinigte Staaten Zeit (Los Angeles)',
+  'HOUR_MINUTE + ABBR_SPECIFIC_TZ': '20:58 GMT-08:00'
 };
 
-var French = const {
-  "DAY": "27",
-  "ABBR_WEEKDAY": "ven.",
-  "WEEKDAY": "vendredi",
-  "ABBR_STANDALONE_MONTH": "janv.",
-  "STANDALONE_MONTH": "janvier",
-  "NUM_MONTH": "1",
-  "NUM_MONTH_DAY": "27/01",
-  "NUM_MONTH_WEEKDAY_DAY": "ven. 27/01",
-  "ABBR_MONTH": "janv.",
-  "ABBR_MONTH_DAY": "27 janv.",
-  "ABBR_MONTH_WEEKDAY_DAY": "ven. 27 janv.",
-  "MONTH": "janvier",
-  "MONTH_DAY": "27 janvier",
-  "MONTH_WEEKDAY_DAY": "vendredi 27 janvier",
-  "ABBR_QUARTER": "T1",
-  "QUARTER": "1er trimestre",
-  "YEAR": "2012",
-  "YEAR_NUM_MONTH": "01/2012",
-  "YEAR_NUM_MONTH_DAY": "27/01/2012",
-  "YEAR_NUM_MONTH_WEEKDAY_DAY": "ven. 27/01/2012",
-  "YEAR_ABBR_MONTH": "janv. 2012",
-  "YEAR_ABBR_MONTH_DAY": "27 janv. 2012",
-  "YEAR_ABBR_MONTH_WEEKDAY_DAY": "ven. 27 janv. 2012",
-  "YEAR_MONTH": "janvier 2012",
-  "YEAR_MONTH_DAY": "27 janvier 2012",
-  "YEAR_MONTH_WEEKDAY_DAY": "vendredi 27 janvier 2012",
-  "YEAR_ABBR_QUARTER": "T1 2012",
-  "YEAR_QUARTER": "1er trimestre 2012",
-  "HOUR24": "20 h",
-  "HOUR24_MINUTE": "20:58",
-  "HOUR24_MINUTE_SECOND": "20:58:59",
-  "HOUR": "20 h",
-  "HOUR_MINUTE": "20:58",
-  "HOUR_MINUTE_SECOND": "20:58:59",
-  "MINUTE": "58",
-  "MINUTE_SECOND": "58:59",
-  "SECOND": "59",
-  "LOCATION_TZ": "Heure : États-Unis (Los Angeles)",
-  "GENERIC_TZ": "heure du Pacifique",
-  "ABBR_GENERIC_TZ": "Heure : États-Unis (Los Angeles)",
-  "SPECIFIC_TZ": "heure normale du Pacifique",
-  "ABBR_SPECIFIC_TZ": "UTC-08:00",
-  "ABBR_UTC_TZ": "UTC-08:00",
-  "YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND":
-      "vendredi 27 janvier 2012 20:58:59",
-  "YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + GENERIC_TZ":
-      "vendredi 27 janvier 2012 20:58:59 heure du Pacifique",
-  "YEAR_ABBR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + ABBR_SPECIFIC_TZ":
-      "ven. 27 janv. 2012 20:58:59 UTC-08:00",
-  "HOUR_MINUTE_SECOND + ABBR_GENERIC_TZ":
-      "20:58:59 Heure : États-Unis (Los Angeles)",
-  "HOUR_MINUTE + ABBR_SPECIFIC_TZ": "20:58 UTC-08:00"
+const french = {
+  'DAY': '27',
+  'ABBR_WEEKDAY': 'ven.',
+  'WEEKDAY': 'vendredi',
+  'ABBR_STANDALONE_MONTH': 'janv.',
+  'STANDALONE_MONTH': 'janvier',
+  'NUM_MONTH': '1',
+  'NUM_MONTH_DAY': '27/01',
+  'NUM_MONTH_WEEKDAY_DAY': 'ven. 27/01',
+  'ABBR_MONTH': 'janv.',
+  'ABBR_MONTH_DAY': '27 janv.',
+  'ABBR_MONTH_WEEKDAY_DAY': 'ven. 27 janv.',
+  'MONTH': 'janvier',
+  'MONTH_DAY': '27 janvier',
+  'MONTH_WEEKDAY_DAY': 'vendredi 27 janvier',
+  'ABBR_QUARTER': 'T1',
+  'QUARTER': '1er trimestre',
+  'YEAR': '2012',
+  'YEAR_NUM_MONTH': '01/2012',
+  'YEAR_NUM_MONTH_DAY': '27/01/2012',
+  'YEAR_NUM_MONTH_WEEKDAY_DAY': 'ven. 27/01/2012',
+  'YEAR_ABBR_MONTH': 'janv. 2012',
+  'YEAR_ABBR_MONTH_DAY': '27 janv. 2012',
+  'YEAR_ABBR_MONTH_WEEKDAY_DAY': 'ven. 27 janv. 2012',
+  'YEAR_MONTH': 'janvier 2012',
+  'YEAR_MONTH_DAY': '27 janvier 2012',
+  'YEAR_MONTH_WEEKDAY_DAY': 'vendredi 27 janvier 2012',
+  'YEAR_ABBR_QUARTER': 'T1 2012',
+  'YEAR_QUARTER': '1er trimestre 2012',
+  'HOUR24': '20 h',
+  'HOUR24_MINUTE': '20:58',
+  'HOUR24_MINUTE_SECOND': '20:58:59',
+  'HOUR': '20 h',
+  'HOUR_MINUTE': '20:58',
+  'HOUR_MINUTE_SECOND': '20:58:59',
+  'MINUTE': '58',
+  'MINUTE_SECOND': '58:59',
+  'SECOND': '59',
+  'LOCATION_TZ': 'Heure : États-Unis (Los Angeles)',
+  'GENERIC_TZ': 'heure du Pacifique',
+  'ABBR_GENERIC_TZ': 'Heure : États-Unis (Los Angeles)',
+  'SPECIFIC_TZ': 'heure normale du Pacifique',
+  'ABBR_SPECIFIC_TZ': 'UTC-08:00',
+  'ABBR_UTC_TZ': 'UTC-08:00',
+  'YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND':
+      'vendredi 27 janvier 2012 20:58:59',
+  'YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + GENERIC_TZ':
+      'vendredi 27 janvier 2012 20:58:59 heure du Pacifique',
+  'YEAR_ABBR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + ABBR_SPECIFIC_TZ':
+      'ven. 27 janv. 2012 20:58:59 UTC-08:00',
+  'HOUR_MINUTE_SECOND + ABBR_GENERIC_TZ':
+      '20:58:59 Heure : États-Unis (Los Angeles)',
+  'HOUR_MINUTE + ABBR_SPECIFIC_TZ': '20:58 UTC-08:00'
 };
 
-var Japanese = const {
-  "DAY": "27日",
-  "ABBR_WEEKDAY": "金",
-  "WEEKDAY": "金曜日",
-  "ABBR_STANDALONE_MONTH": "1月",
-  "STANDALONE_MONTH": "1月",
-  "NUM_MONTH": "1月",
-  "NUM_MONTH_DAY": "1/27",
-  "NUM_MONTH_WEEKDAY_DAY": "1/27(金)",
-  "ABBR_MONTH": "1月",
-  "ABBR_MONTH_DAY": "1月27日",
-  "ABBR_MONTH_WEEKDAY_DAY": "1月27日(金)",
-  "MONTH": "1月",
-  "MONTH_DAY": "1月27日",
-  "MONTH_WEEKDAY_DAY": "1月27日金曜日",
-  "ABBR_QUARTER": "Q1",
-  "QUARTER": "第1四半期",
-  "YEAR": "2012年",
-  "YEAR_NUM_MONTH": "2012/1",
-  "YEAR_NUM_MONTH_DAY": "2012/1/27",
-  "YEAR_NUM_MONTH_WEEKDAY_DAY": "2012/1/27(金)",
-  "YEAR_ABBR_MONTH": "2012年1月",
-  "YEAR_ABBR_MONTH_DAY": "2012年1月27日",
-  "YEAR_ABBR_MONTH_WEEKDAY_DAY": "2012年1月27日(金)",
-  "YEAR_MONTH": "2012年1月",
-  "YEAR_MONTH_DAY": "2012年1月27日",
-  "YEAR_MONTH_WEEKDAY_DAY": "2012年1月27日金曜日",
-  "YEAR_ABBR_QUARTER": "2012/Q1",
-  "YEAR_QUARTER": "2012/第1四半期",
-  "HOUR24": "20時",
-  "HOUR24_MINUTE": "20:58",
-  "HOUR24_MINUTE_SECOND": "20:58:59",
-  "HOUR": "20時",
-  "HOUR_MINUTE": "20:58",
-  "HOUR_MINUTE_SECOND": "20:58:59",
-  "MINUTE": "58",
-  "MINUTE_SECOND": "58:59",
-  "SECOND": "59",
-  "LOCATION_TZ": "アメリカ合衆国時間（ロサンゼルス）",
-  "GENERIC_TZ": "アメリカ太平洋時間",
-  "ABBR_GENERIC_TZ": "アメリカ合衆国時間（ロサンゼルス）",
-  "SPECIFIC_TZ": "アメリカ太平洋標準時",
-  "ABBR_SPECIFIC_TZ": "GMT-08:00",
-  "ABBR_UTC_TZ": "GMT-08:00",
-  "YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND": "2012年1月27日(金曜日) 20:58:59",
-  "YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + GENERIC_TZ":
-      "2012年1月27日(金曜日) 20時58分59秒 アメリカ太平洋時間",
-  "YEAR_ABBR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + ABBR_SPECIFIC_TZ":
-      "2012年1月27日(金) 20時58分59秒 GMT-08:00",
-  "HOUR_MINUTE_SECOND + ABBR_GENERIC_TZ": "20時58分59秒 アメリカ合衆国時間（ロサンゼルス）",
-  "HOUR_MINUTE + ABBR_SPECIFIC_TZ": "20:58 GMT-08:00"
+const japanese = {
+  'DAY': '27日',
+  'ABBR_WEEKDAY': '金',
+  'WEEKDAY': '金曜日',
+  'ABBR_STANDALONE_MONTH': '1月',
+  'STANDALONE_MONTH': '1月',
+  'NUM_MONTH': '1月',
+  'NUM_MONTH_DAY': '1/27',
+  'NUM_MONTH_WEEKDAY_DAY': '1/27(金)',
+  'ABBR_MONTH': '1月',
+  'ABBR_MONTH_DAY': '1月27日',
+  'ABBR_MONTH_WEEKDAY_DAY': '1月27日(金)',
+  'MONTH': '1月',
+  'MONTH_DAY': '1月27日',
+  'MONTH_WEEKDAY_DAY': '1月27日金曜日',
+  'ABBR_QUARTER': 'Q1',
+  'QUARTER': '第1四半期',
+  'YEAR': '2012年',
+  'YEAR_NUM_MONTH': '2012/1',
+  'YEAR_NUM_MONTH_DAY': '2012/1/27',
+  'YEAR_NUM_MONTH_WEEKDAY_DAY': '2012/1/27(金)',
+  'YEAR_ABBR_MONTH': '2012年1月',
+  'YEAR_ABBR_MONTH_DAY': '2012年1月27日',
+  'YEAR_ABBR_MONTH_WEEKDAY_DAY': '2012年1月27日(金)',
+  'YEAR_MONTH': '2012年1月',
+  'YEAR_MONTH_DAY': '2012年1月27日',
+  'YEAR_MONTH_WEEKDAY_DAY': '2012年1月27日金曜日',
+  'YEAR_ABBR_QUARTER': '2012/Q1',
+  'YEAR_QUARTER': '2012/第1四半期',
+  'HOUR24': '20時',
+  'HOUR24_MINUTE': '20:58',
+  'HOUR24_MINUTE_SECOND': '20:58:59',
+  'HOUR': '20時',
+  'HOUR_MINUTE': '20:58',
+  'HOUR_MINUTE_SECOND': '20:58:59',
+  'MINUTE': '58',
+  'MINUTE_SECOND': '58:59',
+  'SECOND': '59',
+  'LOCATION_TZ': 'アメリカ合衆国時間（ロサンゼルス）',
+  'GENERIC_TZ': 'アメリカ太平洋時間',
+  'ABBR_GENERIC_TZ': 'アメリカ合衆国時間（ロサンゼルス）',
+  'SPECIFIC_TZ': 'アメリカ太平洋標準時',
+  'ABBR_SPECIFIC_TZ': 'GMT-08:00',
+  'ABBR_UTC_TZ': 'GMT-08:00',
+  'YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND': '2012年1月27日(金曜日) 20:58:59',
+  'YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + GENERIC_TZ':
+      '2012年1月27日(金曜日) 20時58分59秒 アメリカ太平洋時間',
+  'YEAR_ABBR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + ABBR_SPECIFIC_TZ':
+      '2012年1月27日(金) 20時58分59秒 GMT-08:00',
+  'HOUR_MINUTE_SECOND + ABBR_GENERIC_TZ': '20時58分59秒 アメリカ合衆国時間（ロサンゼルス）',
+  'HOUR_MINUTE + ABBR_SPECIFIC_TZ': '20:58 GMT-08:00'
 };
 
-var Greek = const {
-  "DAY": "27",
-  "ABBR_WEEKDAY": "Παρ",
-  "WEEKDAY": "Παρασκευή",
-  "ABBR_STANDALONE_MONTH": "Ιαν",
-  "STANDALONE_MONTH": "Ιανουαρίου",
-  "NUM_MONTH": "1",
-  "NUM_MONTH_DAY": "27/1",
-  "NUM_MONTH_WEEKDAY_DAY": "Παρ, 27/1",
-  "ABBR_MONTH": "Ιαν",
-  "ABBR_MONTH_DAY": "27 Ιαν",
-  "ABBR_MONTH_WEEKDAY_DAY": "Παρ, 27 Ιαν",
-  "MONTH": "Ιανουαρίου",
-  "MONTH_DAY": "27 Ιανουαρίου",
-  "MONTH_WEEKDAY_DAY": "Παρασκευή, 27 Ιανουαρίου",
-  "ABBR_QUARTER": "Τ1",
-  "QUARTER": "1ο τρίμηνο",
-  "YEAR": "2012",
-  "YEAR_NUM_MONTH": "1/2012",
-  "YEAR_NUM_MONTH_DAY": "27/1/2012",
-  "YEAR_NUM_MONTH_WEEKDAY_DAY": "Παρ, 27/1/2012",
-  "YEAR_ABBR_MONTH": "Ιαν 2012",
-  "YEAR_ABBR_MONTH_DAY": "27 Ιαν 2012",
-  "YEAR_ABBR_MONTH_WEEKDAY_DAY": "Παρ, 27 Ιαν 2012",
-  "YEAR_MONTH": "Ιανουάριος 2012",
-  "YEAR_MONTH_DAY": "27 Ιανουαρίου 2012",
-  "YEAR_MONTH_WEEKDAY_DAY": "Παρασκευή, 27 Ιανουαρίου 2012",
-  "YEAR_ABBR_QUARTER": "2012 Τ1",
-  "YEAR_QUARTER": "2012 1ο τρίμηνο",
-  "HOUR24": "20",
-  "HOUR24_MINUTE": "20:58",
-  "HOUR24_MINUTE_SECOND": "20:58:59",
-  "HOUR": "8 μ.μ.",
-  "HOUR_MINUTE": "8:58 μ.μ.",
-  "HOUR_MINUTE_SECOND": "8:58:59 μ.μ.",
-  "MINUTE": "58",
-  "MINUTE_SECOND": "58:59",
-  "SECOND": "59",
-  "LOCATION_TZ": "Ηνωμένες Πολιτείες της Αμερικής (Λος Άντζελες)",
-  "GENERIC_TZ": "Ώρα Ειρηνικού",
-  "ABBR_GENERIC_TZ": "Ηνωμένες Πολιτείες της Αμερικής (Λος Άντζελες)",
-  "SPECIFIC_TZ": "Χειμερινή ώρα Ειρηνικού",
-  "ABBR_SPECIFIC_TZ": "GMT-08:00",
-  "ABBR_UTC_TZ": "GMT-08:00",
-  "YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND":
-      "Παρασκευή, 27 Ιανουαρίου 2012 8:58:59 μ.μ.",
-  "YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + GENERIC_TZ":
-      "Παρασκευή, 27 Ιανουαρίου 2012 8:58:59 μ.μ. Ώρα Ειρηνικού",
-  "YEAR_ABBR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + ABBR_SPECIFIC_TZ":
-      "Παρ, 27 Ιαν 2012 8:58:59 μ.μ. GMT-08:00",
-  "HOUR_MINUTE_SECOND + ABBR_GENERIC_TZ":
-      "8:58:59 μ.μ. Ηνωμένες Πολιτείες της Αμερικής (Λος Άντζελες)",
-  "HOUR_MINUTE + ABBR_SPECIFIC_TZ": "8:58 μ.μ. GMT-08:00"
+const greek = {
+  'DAY': '27',
+  'ABBR_WEEKDAY': 'Παρ',
+  'WEEKDAY': 'Παρασκευή',
+  'ABBR_STANDALONE_MONTH': 'Ιαν',
+  'STANDALONE_MONTH': 'Ιανουαρίου',
+  'NUM_MONTH': '1',
+  'NUM_MONTH_DAY': '27/1',
+  'NUM_MONTH_WEEKDAY_DAY': 'Παρ, 27/1',
+  'ABBR_MONTH': 'Ιαν',
+  'ABBR_MONTH_DAY': '27 Ιαν',
+  'ABBR_MONTH_WEEKDAY_DAY': 'Παρ, 27 Ιαν',
+  'MONTH': 'Ιανουαρίου',
+  'MONTH_DAY': '27 Ιανουαρίου',
+  'MONTH_WEEKDAY_DAY': 'Παρασκευή, 27 Ιανουαρίου',
+  'ABBR_QUARTER': 'Τ1',
+  'QUARTER': '1ο τρίμηνο',
+  'YEAR': '2012',
+  'YEAR_NUM_MONTH': '1/2012',
+  'YEAR_NUM_MONTH_DAY': '27/1/2012',
+  'YEAR_NUM_MONTH_WEEKDAY_DAY': 'Παρ, 27/1/2012',
+  'YEAR_ABBR_MONTH': 'Ιαν 2012',
+  'YEAR_ABBR_MONTH_DAY': '27 Ιαν 2012',
+  'YEAR_ABBR_MONTH_WEEKDAY_DAY': 'Παρ, 27 Ιαν 2012',
+  'YEAR_MONTH': 'Ιανουάριος 2012',
+  'YEAR_MONTH_DAY': '27 Ιανουαρίου 2012',
+  'YEAR_MONTH_WEEKDAY_DAY': 'Παρασκευή, 27 Ιανουαρίου 2012',
+  'YEAR_ABBR_QUARTER': '2012 Τ1',
+  'YEAR_QUARTER': '2012 1ο τρίμηνο',
+  'HOUR24': '20',
+  'HOUR24_MINUTE': '20:58',
+  'HOUR24_MINUTE_SECOND': '20:58:59',
+  'HOUR': '8 μ.μ.',
+  'HOUR_MINUTE': '8:58 μ.μ.',
+  'HOUR_MINUTE_SECOND': '8:58:59 μ.μ.',
+  'MINUTE': '58',
+  'MINUTE_SECOND': '58:59',
+  'SECOND': '59',
+  'LOCATION_TZ': 'Ηνωμένες Πολιτείες της Αμερικής (Λος Άντζελες)',
+  'GENERIC_TZ': 'Ώρα Ειρηνικού',
+  'ABBR_GENERIC_TZ': 'Ηνωμένες Πολιτείες της Αμερικής (Λος Άντζελες)',
+  'SPECIFIC_TZ': 'Χειμερινή ώρα Ειρηνικού',
+  'ABBR_SPECIFIC_TZ': 'GMT-08:00',
+  'ABBR_UTC_TZ': 'GMT-08:00',
+  'YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND':
+      'Παρασκευή, 27 Ιανουαρίου 2012 8:58:59 μ.μ.',
+  'YEAR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + GENERIC_TZ':
+      'Παρασκευή, 27 Ιανουαρίου 2012 8:58:59 μ.μ. Ώρα Ειρηνικού',
+  'YEAR_ABBR_MONTH_WEEKDAY_DAY + HOUR_MINUTE_SECOND + ABBR_SPECIFIC_TZ':
+      'Παρ, 27 Ιαν 2012 8:58:59 μ.μ. GMT-08:00',
+  'HOUR_MINUTE_SECOND + ABBR_GENERIC_TZ':
+      '8:58:59 μ.μ. Ηνωμένες Πολιτείες της Αμερικής (Λος Άντζελες)',
+  'HOUR_MINUTE + ABBR_SPECIFIC_TZ': '8:58 μ.μ. GMT-08:00'
 };
diff --git a/test/date_time_format_test_stub.dart b/test/date_time_format_test_stub.dart
index b6c3f9d..c8344ac 100644
--- a/test/date_time_format_test_stub.dart
+++ b/test/date_time_format_test_stub.dart
@@ -12,14 +12,15 @@
 import 'package:intl/intl.dart';
 import 'date_time_format_test_core.dart';
 
-typedef List<String> TestListFunc();
+typedef TestListFunc = List<String> Function();
 
-typedef Future InitializeDateFormattingFunc(String locale, String filePath);
+typedef InitializeDateFormattingFunc = Future<void> Function(
+    String locale, String filePath);
 
 /// Return only the odd-numbered locales. A simple way to divide the list into
 /// two roughly equal parts.
 List<String> oddLocales() {
-  int i = 1;
+  var i = 1;
   return allLocales().where((x) => (i++).isOdd).toList();
 }
 
@@ -31,8 +32,8 @@
 /// Return only the even-numbered locales. A simple way to divide the list into
 /// two roughly equal parts.
 List<String> evenLocales() {
-  int i = 1;
-  return allLocales().where((x) => !((i++).isOdd)).toList();
+  var i = 1;
+  return allLocales().where((x) => !(i++).isOdd).toList();
 }
 
 void runWith(TestListFunc getSubset, String dir,
@@ -41,13 +42,13 @@
   // Also, note that we take the list of locales as a function so that we don't
   // evaluate it until after we know that all the locales are available.
 
-  bool initialized = false;
+  var initialized = false;
 
   setUp(() {
     if (initialized) {
       return null;
     }
-    return initFunction("en_US", dir).then((_) {
+    return initFunction('en_US', dir).then((_) {
       return Future.forEach(DateFormat.allLocalesWithSymbols(), (locale) {
         return initFunction(locale, dir);
       });
diff --git a/test/date_time_format_uninitialized_test.dart b/test/date_time_format_uninitialized_test.dart
index 49c081b..79b09f9 100644
--- a/test/date_time_format_uninitialized_test.dart
+++ b/test/date_time_format_uninitialized_test.dart
@@ -8,6 +8,6 @@
 
 import 'date_time_format_test_core.dart';
 
-main() {
+void main() {
   runDateTests(() => ['en_US']);
 }
diff --git a/test/date_time_loose_parsing_test.dart b/test/date_time_loose_parsing_test.dart
index aa4fdf7..b0e000a 100644
--- a/test/date_time_loose_parsing_test.dart
+++ b/test/date_time_loose_parsing_test.dart
@@ -13,92 +13,92 @@
 import 'package:intl/intl.dart';
 import 'package:test/test.dart';
 
-main() {
-  var format;
+void main() {
+  DateFormat format;
 
-  var date = new DateTime(2014, 9, 3);
+  var date = DateTime(2014, 9, 3);
 
-  check(String s) {
+  void check(String s) {
     expect(() => format.parse(s), throwsFormatException);
     expect(format.parseLoose(s), date);
   }
 
-  test("Loose parsing yMMMd", () {
+  test('Loose parsing yMMMd', () {
     // Note: We can't handle e.g. Sept, we don't have those abbreviations
     // in our data.
-    // Also doesn't handle "sep3,2014", or "sep 3.2014"
-    format = new DateFormat.yMMMd("en_US");
-    check("Sep 3 2014");
-    check("sep 3 2014");
-    check("sep 3  2014");
-    check("sep  3 2014");
-    check("sep  3       2014");
-    check("sep3 2014");
-    check("september 3, 2014");
-    check("sEPTembER 3, 2014");
-    check("seP 3, 2014");
-    check("Sep 3,2014");
+    // Also doesn't handle 'sep3,2014', or 'sep 3.2014'
+    format = DateFormat.yMMMd('en_US');
+    check('Sep 3 2014');
+    check('sep 3 2014');
+    check('sep 3  2014');
+    check('sep  3 2014');
+    check('sep  3       2014');
+    check('sep3 2014');
+    check('september 3, 2014');
+    check('sEPTembER 3, 2014');
+    check('seP 3, 2014');
+    check('Sep 3,2014');
   });
 
-  test("Loose parsing yMMMd that parses strict", () {
-    expect(format.parseLoose("Sep 3, 2014"), date);
+  test('Loose parsing yMMMd that parses strict', () {
+    expect(format.parseLoose('Sep 3, 2014'), date);
   });
 
-  test("Loose parsing yMd", () {
-    format = new DateFormat.yMd("en_US");
-    check("09 3 2014");
-    check("09 00003    2014");
-    check("09/    03/2014");
-    check("09 / 03 / 2014");
+  test('Loose parsing yMd', () {
+    format = DateFormat.yMd('en_US');
+    check('09 3 2014');
+    check('09 00003    2014');
+    check('09/    03/2014');
+    check('09 / 03 / 2014');
   });
 
-  test("Loose parsing yMd that parses strict", () {
-    expect(format.parseLoose("09/03/2014"), date);
-    expect(format.parseLoose("09/3/2014"), date);
+  test('Loose parsing yMd that parses strict', () {
+    expect(format.parseLoose('09/03/2014'), date);
+    expect(format.parseLoose('09/3/2014'), date);
   });
 
-  test("Loose parsing should handle standalone month format", () {
+  test('Loose parsing should handle standalone month format', () {
     // This checks that LL actually sets the month.
     // The appended whitespace and extra d pattern are present to trigger the
     // loose parsing code path.
-    expect(new DateFormat('LL/d', 'en_US').parseLoose("05/ 2").month, 5);
+    expect(DateFormat('LL/d', 'en_US').parseLoose('05/ 2').month, 5);
   });
 
-  group("Loose parsing with year formats", () {
-    test("should fail when year is omitted (en_US)", () {
-      expect(() => new DateFormat('yyyy-MM-dd').parseLoose("1/11"),
+  group('Loose parsing with year formats', () {
+    test('should fail when year is omitted (en_US)', () {
+      expect(() => DateFormat('yyyy-MM-dd').parseLoose('1/11'),
           throwsFormatException);
     });
 
-    test("should fail when year is omitted (ja)", () {
+    test('should fail when year is omitted (ja)', () {
       initializeDateFormatting('ja', null);
-      expect(() => new DateFormat.yMMMd("ja").parseLoose('12月12日'),
+      expect(() => DateFormat.yMMMd('ja').parseLoose('12月12日'),
           throwsFormatException);
-      expect(() => new DateFormat.yMd("ja").parseLoose('12月12日'),
+      expect(() => DateFormat.yMd('ja').parseLoose('12月12日'),
           throwsFormatException);
-      expect(() => new DateFormat.yMEd("ja").parseLoose('12月12日'),
+      expect(() => DateFormat.yMEd('ja').parseLoose('12月12日'),
           throwsFormatException);
-      expect(() => new DateFormat.yMMMEd("ja").parseLoose('12月12日'),
+      expect(() => DateFormat.yMMMEd('ja').parseLoose('12月12日'),
           throwsFormatException);
-      expect(() => new DateFormat.yMMMMd("ja").parseLoose('12月12日'),
+      expect(() => DateFormat.yMMMMd('ja').parseLoose('12月12日'),
           throwsFormatException);
-      expect(() => new DateFormat.yMMMMEEEEd("ja").parseLoose('12月12日'),
+      expect(() => DateFormat.yMMMMEEEEd('ja').parseLoose('12月12日'),
           throwsFormatException);
     });
 
-    test("should fail when year is omitted (hu)", () {
+    test('should fail when year is omitted (hu)', () {
       initializeDateFormatting('hu', null);
-      expect(() => new DateFormat.yMMMd("hu").parseLoose('3. 17.'),
+      expect(() => DateFormat.yMMMd('hu').parseLoose('3. 17.'),
           throwsFormatException);
-      expect(() => new DateFormat.yMd("hu").parseLoose('3. 17.'),
+      expect(() => DateFormat.yMd('hu').parseLoose('3. 17.'),
           throwsFormatException);
-      expect(() => new DateFormat.yMEd("hu").parseLoose('3. 17.'),
+      expect(() => DateFormat.yMEd('hu').parseLoose('3. 17.'),
           throwsFormatException);
-      expect(() => new DateFormat.yMMMEd("hu").parseLoose('3. 17.'),
+      expect(() => DateFormat.yMMMEd('hu').parseLoose('3. 17.'),
           throwsFormatException);
-      expect(() => new DateFormat.yMMMMd("hu").parseLoose('3. 17.'),
+      expect(() => DateFormat.yMMMMd('hu').parseLoose('3. 17.'),
           throwsFormatException);
-      expect(() => new DateFormat.yMMMMEEEEd("hu").parseLoose('3. 17.'),
+      expect(() => DateFormat.yMMMMEEEEd('hu').parseLoose('3. 17.'),
           throwsFormatException);
     });
   });
diff --git a/test/date_time_strict_test.dart b/test/date_time_strict_test.dart
index cc5f597..e345d27 100644
--- a/test/date_time_strict_test.dart
+++ b/test/date_time_strict_test.dart
@@ -10,70 +10,69 @@
 import 'package:intl/intl.dart';
 import 'package:test/test.dart';
 
-main() {
-  test("All input consumed", () {
-    var format = new DateFormat.yMMMd();
-    var date = new DateTime(2014, 9, 3);
+void main() {
+  test('All input consumed', () {
+    var format = DateFormat.yMMMd();
+    var date = DateTime(2014, 9, 3);
     var formatted = 'Sep 3, 2014';
     expect(format.format(date), formatted);
     var parsed = format.parseStrict(formatted);
     expect(parsed, date);
 
-    check(String s) {
+    void check(String s) {
       expect(() => format.parseStrict(s), throwsFormatException);
       expect(format.parse(s), date);
     }
 
-    check(formatted + ",");
-    check(formatted + "abc");
-    check(formatted + "   ");
+    check('$formatted,');
+    check('${formatted}abc');
+    check('$formatted   ');
   });
 
-  test("Invalid dates", () {
-    var format = new DateFormat.yMd();
-    check(s) => expect(() => format.parseStrict(s), throwsFormatException);
-    check("0/3/2014");
-    check("13/3/2014");
-    check("9/0/2014");
-    check("9/31/2014");
-    check("09/31/2014");
-    check("10/32/2014");
-    check("2/29/2014");
-    expect(format.parseStrict("2/29/2016"), new DateTime(2016, 2, 29));
+  test('Invalid dates', () {
+    var format = DateFormat.yMd();
+    void check(s) => expect(() => format.parseStrict(s), throwsFormatException);
+    check('0/3/2014');
+    check('13/3/2014');
+    check('9/0/2014');
+    check('9/31/2014');
+    check('09/31/2014');
+    check('10/32/2014');
+    check('2/29/2014');
+    expect(format.parseStrict('2/29/2016'), DateTime(2016, 2, 29));
   });
 
-  test("Invalid times am/pm", () {
-    var format = new DateFormat.jms();
-    check(s) => expect(() => format.parseStrict(s), throwsFormatException);
-    check("-1:15:00 AM");
-    expect(format.parseStrict("0:15:00 AM"), new DateTime(1970, 1, 1, 0, 15));
-    check("24:00:00 PM");
-    check("24:00:00 AM");
-    check("25:00:00 PM");
-    check("0:-1:00 AM");
-    check("0:60:00 AM");
-    expect(format.parseStrict("0:59:00 AM"), new DateTime(1970, 1, 1, 0, 59));
-    check("0:0:-1 AM");
-    check("0:0:60 AM");
-    check("2:0:60 PM");
-    expect(
-        format.parseStrict("2:0:59 PM"), new DateTime(1970, 1, 1, 14, 0, 59));
+  test('Invalid times am/pm', () {
+    var format = DateFormat.jms();
+    void check(s) => expect(() => format.parseStrict(s), throwsFormatException);
+    check('-1:15:00 AM');
+    expect(format.parseStrict('0:15:00 AM'), DateTime(1970, 1, 1, 0, 15));
+    check('24:00:00 PM');
+    check('24:00:00 AM');
+    check('25:00:00 PM');
+    check('0:-1:00 AM');
+    check('0:60:00 AM');
+    expect(format.parseStrict('0:59:00 AM'), DateTime(1970, 1, 1, 0, 59));
+    check('0:0:-1 AM');
+    check('0:0:60 AM');
+    check('2:0:60 PM');
+    expect(format.parseStrict('2:0:59 PM'), DateTime(1970, 1, 1, 14, 0, 59));
   });
 
-  test("Invalid times 24 hour", () {
-    var format = new DateFormat.Hms();
+  test('Invalid times 24 hour', () {
+    var format = DateFormat.Hms();
     check(s) => expect(() => format.parseStrict(s), throwsFormatException);
-    check("-1:15:00");
-    expect(format.parseStrict("0:15:00"), new DateTime(1970, 1, 1, 0, 15));
-    check("24:00:00");
-    check("24:00:00");
-    check("25:00:00");
-    check("0:-1:00");
-    check("0:60:00");
-    expect(format.parseStrict("0:59:00"), new DateTime(1970, 1, 1, 0, 59));
-    check("0:0:-1");
-    check("0:0:60");
-    check("14:0:60");
-    expect(format.parseStrict("14:0:59"), new DateTime(1970, 1, 1, 14, 0, 59));
+    check('-1:15:00');
+    expect(format.parseStrict('0:15:00'), DateTime(1970, 1, 1, 0, 15));
+    check('24:00:00');
+    check('24:00:00');
+    check('25:00:00');
+    check('0:-1:00');
+    check('0:60:00');
+    expect(format.parseStrict('0:59:00'), DateTime(1970, 1, 1, 0, 59));
+    check('0:0:-1');
+    check('0:0:60');
+    check('14:0:60');
+    expect(format.parseStrict('14:0:59'), DateTime(1970, 1, 1, 14, 0, 59));
   });
 }
diff --git a/test/england_timezone_test.dart b/test/england_timezone_test.dart
index 8977deb..33e8901 100644
--- a/test/england_timezone_test.dart
+++ b/test/england_timezone_test.dart
@@ -17,6 +17,6 @@
 import 'package:test/test.dart';
 import 'timezone_test_core.dart';
 
-main() {
+void main() {
   testTimezone('Europe/London', expectedUtcOffset: 0);
 }
diff --git a/test/find_default_locale_browser_test.dart b/test/find_default_locale_browser_test.dart
index 818194e..cfc19f5 100644
--- a/test/find_default_locale_browser_test.dart
+++ b/test/find_default_locale_browser_test.dart
@@ -2,32 +2,30 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@TestOn("browser")
+@TestOn('browser')
 library find_default_locale_browser_test;
 
 import 'package:intl/intl.dart';
 import 'package:intl/intl_browser.dart';
 import 'package:test/test.dart';
 
-main() {
-  test("Find system locale in browser", () {
+void main() {
+  test('Find system locale in browser', () {
     // TODO (alanknight): This only verifies that we found some locale. We
     // should find a way to force the system locale before the test is run
     // and then verify that it's actually the correct value.
     Intl.systemLocale = 'xx_YY';
-    ThenArgument callback = expectAsync1(verifyLocale);
+    var callback = expectAsync1(verifyLocale);
     findSystemLocale().then(callback);
   });
 }
 
-typedef ThenArgument(String _);
-
-verifyLocale(_) {
-  expect(Intl.systemLocale, isNot(equals("xx_YY")));
+void verifyLocale(_) {
+  expect(Intl.systemLocale, isNot(equals('xx_YY')));
   // Allow either en_US or just en type locales. Windows in particular may
   // give us just ru for ru_RU
-  var pattern = new RegExp(r"\w\w_[A-Z0-9]+");
-  var shortPattern = new RegExp(r"\w\w");
+  var pattern = RegExp(r'\w\w_[A-Z0-9]+');
+  var shortPattern = RegExp(r'\w\w');
   var match = pattern.hasMatch(Intl.systemLocale);
   var shortMatch = shortPattern.hasMatch(Intl.systemLocale);
   expect(match || shortMatch, isTrue);
diff --git a/test/find_default_locale_standalone_test.dart b/test/find_default_locale_standalone_test.dart
index 21bf17b..e212848 100644
--- a/test/find_default_locale_standalone_test.dart
+++ b/test/find_default_locale_standalone_test.dart
@@ -2,28 +2,27 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@TestOn("vm")
+@TestOn('vm')
 import 'package:intl/intl.dart';
 import 'package:intl/intl_standalone.dart';
 import 'package:test/test.dart';
 
-main() {
-  test("Find system locale standalone", () {
+void main() {
+  test('Find system locale standalone', () {
     // TODO (alanknight): This only verifies that we found some locale. We
     // should find a way to force the system locale before the test is run
     // and then verify that it's actually the correct value.
     // We have no way of getting this reliably for Windows, so it will fail.
-    Intl.systemLocale = "xx_YY";
+    Intl.systemLocale = 'xx_YY';
     var callback = expectAsync1(verifyLocale);
     findSystemLocale().then(callback);
   });
 }
 
-typedef ThenArgument(String _);
-verifyLocale(_) {
-  expect(Intl.systemLocale, isNot(equals("xx_YY")));
-  var pattern = new RegExp(r"\w\w_[A-Z0-9]+");
-  var shortPattern = new RegExp(r"\w\w");
+void verifyLocale(_) {
+  expect(Intl.systemLocale, isNot(equals('xx_YY')));
+  var pattern = RegExp(r'\w\w_[A-Z0-9]+');
+  var shortPattern = RegExp(r'\w\w');
   var match = pattern.hasMatch(Intl.systemLocale);
   var shortMatch = shortPattern.hasMatch(Intl.systemLocale);
   expect(match || shortMatch, isTrue);
diff --git a/test/fixnum_test.dart b/test/fixnum_test.dart
index 17f5cc2..8f9f874 100644
--- a/test/fixnum_test.dart
+++ b/test/fixnum_test.dart
@@ -9,71 +9,71 @@
 import 'package:fixnum/fixnum.dart';
 
 var int64Values = {
-  new Int64(12345): ["USD12,345.00", "1,234,500%"],
-  new Int64(-12345): ["-USD12,345.00", "-1,234,500%"],
-  new Int64(0x7FFFFFFFFFFFF): [
-    "USD2,251,799,813,685,247.00",
-    "225,179,981,368,524,700%"
+  Int64(12345): ['USD12,345.00', '1,234,500%'],
+  Int64(-12345): ['-USD12,345.00', '-1,234,500%'],
+  Int64(0x7FFFFFFFFFFFF): [
+    'USD2,251,799,813,685,247.00',
+    '225,179,981,368,524,700%'
   ],
   Int64.parseHex('7FFFFFFFFFFFFFF'): [
-    "USD576,460,752,303,423,487.00",
-    "57,646,075,230,342,348,700%"
+    'USD576,460,752,303,423,487.00',
+    '57,646,075,230,342,348,700%'
   ],
   Int64.parseHex('8000000000000000'): [
-    "-USD9,223,372,036,854,775,808.00",
-    "-922,337,203,685,477,580,800%"
+    '-USD9,223,372,036,854,775,808.00',
+    '-922,337,203,685,477,580,800%'
   ]
 };
 
 var int32Values = {
-  new Int32(12345): ["USD12,345.00", "1,234,500%"],
-  new Int32(0x7FFFF): ["USD524,287.00", "52,428,700%"],
-  Int32.parseHex('7FFFFFF'): ["USD134,217,727.00", "13,421,772,700%"],
-  Int32.parseHex('7FFFFFFF'): ["USD2,147,483,647.00", "214,748,364,700%"],
-  Int32.parseHex('80000000'): ["-USD2,147,483,648.00", "-214,748,364,800%"]
+  Int32(12345): ['USD12,345.00', '1,234,500%'],
+  Int32(0x7FFFF): ['USD524,287.00', '52,428,700%'],
+  Int32.parseHex('7FFFFFF'): ['USD134,217,727.00', '13,421,772,700%'],
+  Int32.parseHex('7FFFFFFF'): ['USD2,147,483,647.00', '214,748,364,700%'],
+  Int32.parseHex('80000000'): ['-USD2,147,483,648.00', '-214,748,364,800%']
 };
 
 var microMoneyValues = {
-  new MicroMoney(new Int64(12345670000)): ["USD12,345.67", "1,234,567%"],
-  new MicroMoney(new Int64(12345671000)): ["USD12,345.67", "1,234,567%"],
-  new MicroMoney(new Int64(12345678000)): ["USD12,345.68", "1,234,568%"],
-  new MicroMoney(new Int64(-12345670000)): ["-USD12,345.67", "-1,234,567%"],
-  new MicroMoney(new Int64(-12345671000)): ["-USD12,345.67", "-1,234,567%"],
-  new MicroMoney(new Int64(-12345678000)): ["-USD12,345.68", "-1,234,568%"],
-  new MicroMoney(new Int64(12340000000)): ["USD12,340.00", "1,234,000%"],
-  new MicroMoney(new Int64(0x7FFFFFFFFFFFF)): [
-    "USD2,251,799,813.69",
-    "225,179,981,369%"
+  MicroMoney(Int64(12345670000)): ['USD12,345.67', '1,234,567%'],
+  MicroMoney(Int64(12345671000)): ['USD12,345.67', '1,234,567%'],
+  MicroMoney(Int64(12345678000)): ['USD12,345.68', '1,234,568%'],
+  MicroMoney(Int64(-12345670000)): ['-USD12,345.67', '-1,234,567%'],
+  MicroMoney(Int64(-12345671000)): ['-USD12,345.67', '-1,234,567%'],
+  MicroMoney(Int64(-12345678000)): ['-USD12,345.68', '-1,234,568%'],
+  MicroMoney(Int64(12340000000)): ['USD12,340.00', '1,234,000%'],
+  MicroMoney(Int64(0x7FFFFFFFFFFFF)): [
+    'USD2,251,799,813.69',
+    '225,179,981,369%'
   ],
-  new MicroMoney(Int64.parseHex('7FFFFFFFFFFFFFF')): [
-    "USD576,460,752,303.42",
-    "57,646,075,230,342%"
+  MicroMoney(Int64.parseHex('7FFFFFFFFFFFFFF')): [
+    'USD576,460,752,303.42',
+    '57,646,075,230,342%'
   ],
-  new MicroMoney(Int64.parseHex('7FFFFFFFFFFFFFFF')): [
-    "USD9,223,372,036,854.78",
-    "922,337,203,685,478%"
+  MicroMoney(Int64.parseHex('7FFFFFFFFFFFFFFF')): [
+    'USD9,223,372,036,854.78',
+    '922,337,203,685,478%'
   ],
-  new MicroMoney(Int64.parseHex('8000000000000000')): [
-    "-USD9,223,372,036,854.78",
-    "-922,337,203,685,478%"
+  MicroMoney(Int64.parseHex('8000000000000000')): [
+    '-USD9,223,372,036,854.78',
+    '-922,337,203,685,478%'
   ]
 };
 
-main() {
+void main() {
   test('int64', () {
     int64Values.forEach((number, expected) {
-      var currency = new NumberFormat.currency().format(number);
+      var currency = NumberFormat.currency().format(number);
       expect(currency, expected.first);
-      var percent = new NumberFormat.percentPattern().format(number);
+      var percent = NumberFormat.percentPattern().format(number);
       expect(percent, expected[1]);
     });
   });
 
   test('int32', () {
     int32Values.forEach((number, expected) {
-      var currency = new NumberFormat.currency().format(number);
+      var currency = NumberFormat.currency().format(number);
       expect(currency, expected.first);
-      var percent = new NumberFormat.percentPattern().format(number);
+      var percent = NumberFormat.percentPattern().format(number);
       expect(percent, expected[1]);
     });
   });
@@ -81,9 +81,9 @@
   test('micro money', () {
     microMoneyValues.forEach((number, expected) {
       // ignore: deprecated_member_use_from_same_package
-      var currency = new NumberFormat.currencyPattern().format(number);
+      var currency = NumberFormat.currencyPattern().format(number);
       expect(currency, expected.first);
-      var percent = new NumberFormat.percentPattern().format(number);
+      var percent = NumberFormat.percentPattern().format(number);
       expect(percent, expected[1]);
     });
   });
diff --git a/test/gmt_timezone_test.dart b/test/gmt_timezone_test.dart
index 338c41e..f8374ce 100644
--- a/test/gmt_timezone_test.dart
+++ b/test/gmt_timezone_test.dart
@@ -16,6 +16,6 @@
 import 'package:test/test.dart';
 import 'timezone_test_core.dart';
 
-main() {
+void main() {
   testTimezone('GMT', expectedUtcOffset: 0);
 }
diff --git a/test/intl_test.dart b/test/intl_test.dart
index e19ed5a..77f10c5 100644
--- a/test/intl_test.dart
+++ b/test/intl_test.dart
@@ -8,9 +8,9 @@
 import 'package:test/test.dart';
 import 'package:intl/date_symbol_data_local.dart';
 
-main() {
+void main() {
   test("Locale setting doesn't verify the core locale", () {
-    var de = new Intl('de_DE');
+    var de = Intl('de_DE');
     expect(de.locale, equals('de_DE'));
   });
 
@@ -20,13 +20,13 @@
     // locales covered for messages may be different from that for date
     // formatting.
     initializeDateFormatting('de_DE', null).then((_) {
-      var de = new Intl('de_DE');
+      var de = Intl('de_DE');
       var format = de.date().add_d();
       expect(format.locale, equals('de'));
     });
   });
 
-  test("Canonicalizing locales", () {
+  test('Canonicalizing locales', () {
     expect(Intl.canonicalizedLocale('en-us'), 'en_US');
     expect(Intl.canonicalizedLocale('en_us'), 'en_US');
     expect(Intl.canonicalizedLocale('en_US'), 'en_US');
@@ -35,7 +35,7 @@
     expect(Intl.canonicalizedLocale('C'), 'en_ISO');
   });
 
-  test("Verifying locale fallback for numbers", () {
+  test('Verifying locale fallback for numbers', () {
     expect(Intl.verifiedLocale('en-us', NumberFormat.localeExists), 'en_US');
     expect(Intl.verifiedLocale('en_us', NumberFormat.localeExists), 'en_US');
     expect(Intl.verifiedLocale('es-419', NumberFormat.localeExists), 'es_419');
@@ -45,7 +45,7 @@
     void checkAsNumberDefault(String locale, String expected) {
       var oldDefault = Intl.defaultLocale;
       Intl.defaultLocale = locale;
-      var format = new NumberFormat();
+      var format = NumberFormat();
       expect(format.locale, expected);
       Intl.defaultLocale = oldDefault;
     }
@@ -57,7 +57,7 @@
     checkAsNumberDefault('es-999', 'es');
   });
 
-  test("Verifying locale fallback for dates", () {
+  test('Verifying locale fallback for dates', () {
     expect(Intl.verifiedLocale('en-us', DateFormat.localeExists), 'en_US');
     expect(Intl.verifiedLocale('en_us', DateFormat.localeExists), 'en_US');
     expect(Intl.verifiedLocale('es-419', DateFormat.localeExists), 'es_419');
@@ -67,7 +67,7 @@
     void checkAsDateDefault(String locale, String expected) {
       var oldDefault = Intl.defaultLocale;
       Intl.defaultLocale = locale;
-      var format = new DateFormat();
+      var format = DateFormat();
       expect(format.locale, expected);
       Intl.defaultLocale = oldDefault;
     }
@@ -79,16 +79,16 @@
     checkAsDateDefault('es-999', 'es');
   });
 
-  test("toBeginningOfSentenceCase", () {
+  test('toBeginningOfSentenceCase', () {
     expect(toBeginningOfSentenceCase(null), null);
-    expect(toBeginningOfSentenceCase(""), "");
-    expect(toBeginningOfSentenceCase("A"), "A");
-    expect(toBeginningOfSentenceCase("a"), "A");
-    expect(toBeginningOfSentenceCase("abc"), "Abc");
-    expect(toBeginningOfSentenceCase("[a]"), "[a]");
-    expect(toBeginningOfSentenceCase("ABc"), "ABc");
-    expect(toBeginningOfSentenceCase("ı"), "I");
-    expect(toBeginningOfSentenceCase("i"), "I");
-    expect(toBeginningOfSentenceCase("i", "tr"), "\u0130");
+    expect(toBeginningOfSentenceCase(''), '');
+    expect(toBeginningOfSentenceCase('A'), 'A');
+    expect(toBeginningOfSentenceCase('a'), 'A');
+    expect(toBeginningOfSentenceCase('abc'), 'Abc');
+    expect(toBeginningOfSentenceCase('[a]'), '[a]');
+    expect(toBeginningOfSentenceCase('ABc'), 'ABc');
+    expect(toBeginningOfSentenceCase('ı'), 'I');
+    expect(toBeginningOfSentenceCase('i'), 'I');
+    expect(toBeginningOfSentenceCase('i', 'tr'), '\u0130');
   });
 }
diff --git a/test/locale_test.dart b/test/locale_test.dart
index 774fa5a..9b37792 100644
--- a/test/locale_test.dart
+++ b/test/locale_test.dart
@@ -38,7 +38,8 @@
   });
 
   group('Locale.fromSubtags() FormatExceptions:', () {
-    testExceptionForSubtags(String language, String script, String region) {
+    void testExceptionForSubtags(
+        String language, String script, String region) {
       test('fromSubtags: "$language / $script / $region"', () {
         expect(
             () => Locale.fromSubtags(
@@ -108,15 +109,15 @@
       [], 'en-u-co-phonebk-cu-usd-z-abc-001-foo-fii-bar');
 
   group('Locale.parse() throws FormatException:', () {
-    testExceptionForId(String x) {
+    void testExceptionForId(String x) {
       test('"$x"', () {
         expect(() => Locale.parse(x), throwsFormatException);
       });
     }
 
-    invalidLocales.forEach((badLocaleIdentifier) {
+    for (var badLocaleIdentifier in invalidLocales) {
       testExceptionForId(badLocaleIdentifier);
-    });
+    }
 
     // ICU permits '', taking it as 'und', but it is not a valid Unicode Locale
     // Identifier: We reject it.
@@ -144,11 +145,11 @@
   });
 
   group('Locale.tryParse() returns null:', () {
-    invalidLocales.forEach((badLocaleIdentifier) {
+    for (var badLocaleIdentifier in invalidLocales) {
       test('"$badLocaleIdentifier"', () {
         expect(Locale.tryParse(badLocaleIdentifier), isNull);
       });
-    });
+    }
   });
 
   // TODO: determine appropriate behaviour for the following examples.
@@ -174,7 +175,7 @@
   test('Locale cannot be modified via the variants field', () {
     var l = Locale.parse('en-scotland');
     List<String> v = l.variants;
-    bool good = false;
+    var good = false;
     try {
       v.add('basiceng');
     } on Error {
@@ -201,7 +202,7 @@
   });
 }
 
-testFromSubtags(
+void testFromSubtags(
     String language,
     String script,
     String region,
@@ -210,7 +211,7 @@
     String expectedRegion,
     String expectedTag) {
   test('Locale.fromSubtags(...) with $language, $script, $region', () {
-    Locale l = Locale.fromSubtags(
+    var l = Locale.fromSubtags(
         languageCode: language, scriptCode: script, countryCode: region);
     expect(l.languageCode, expectedLanguage);
     expect(l.scriptCode, expectedScript);
@@ -220,7 +221,7 @@
   });
 }
 
-testParse(
+void testParse(
     String bcp47Tag,
     String expectedLanguage,
     String expectedScript,
@@ -228,7 +229,7 @@
     Iterable<String> expectedVariants,
     String expectedTag) {
   test('Locale.parse("$bcp47Tag");', () {
-    Locale l = Locale.parse(bcp47Tag);
+    var l = Locale.parse(bcp47Tag);
     expect(l.languageCode, expectedLanguage);
     expect(l.scriptCode, expectedScript);
     expect(l.countryCode, expectedRegion);
diff --git a/test/number_closure_test.dart b/test/number_closure_test.dart
index 4f965c3..558b2dc 100644
--- a/test/number_closure_test.dart
+++ b/test/number_closure_test.dart
@@ -1,56 +1,57 @@
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+/// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+/// for details. All rights reserved. Use of this source code is governed by a
+/// BSD-style license that can be found in the LICENSE file.
 
 /// Tests based on the closure number formatting tests.
 library number_closure_test;
 
 import 'dart:async';
-import "package:intl/intl.dart";
-import "package:test/test.dart";
+import 'package:intl/intl.dart';
+import 'package:test/test.dart';
 
-main() {
-  test("testVeryBigNumber", testVeryBigNumber);
-  test("testStandardFormat", testStandardFormat);
-  test("testNegativePercentage", testNegativePercentage);
-  test("testCustomPercentage", testCustomPercentage);
-  test("testBasicFormat", testBasicFormat);
-  test("testGrouping", testGrouping);
-  test("testPerMill", testPerMill);
-  test("testQuotes", testQuotes);
-  test("testZeros", testZeros);
-  test("testExponential", testExponential);
-  test("testPlusSignInExponentPart", testPlusSignInExponentPart);
-  test("testApis", testApis);
-  test("testLocaleSwitch", testLocaleSwitch);
-  test("testLocaleSwitchAsync", testLocaleSwitchAsync);
+void main() {
+  test('testVeryBigNumber', testVeryBigNumber);
+  test('testStandardFormat', testStandardFormat);
+  test('testNegativePercentage', testNegativePercentage);
+  test('testCustomPercentage', testCustomPercentage);
+  test('testBasicFormat', testBasicFormat);
+  test('testGrouping', testGrouping);
+  test('testPerMill', testPerMill);
+  test('testQuotes', testQuotes);
+  test('testZeros', testZeros);
+  test('testExponential', testExponential);
+  test('testPlusSignInExponentPart', testPlusSignInExponentPart);
+  test('testApis', testApis);
+  test('testLocaleSwitch', testLocaleSwitch);
+  test('testLocaleSwitchAsync', testLocaleSwitchAsync);
 }
 
 /// Test two large numbers for equality, assuming that there may be some
 /// loss of precision in the less significant digits.
-veryBigNumberCompare(str1, str2) {
+bool veryBigNumberCompare(str1, str2) {
   return str1.length == str2.length &&
       str1.substring(0, 8) == str2.substring(0, 8);
 }
 
-testVeryBigNumber() {
-  var str;
-  var fmt;
+void testVeryBigNumber() {
+  String str;
+  NumberFormat fmt;
 
-  fmt = new NumberFormat.decimalPattern();
+  fmt = NumberFormat.decimalPattern();
   str = fmt.format(1.3456E20);
   expect(veryBigNumberCompare('134,560,000,000,000,000,000', str), isTrue);
 
-  fmt = new NumberFormat.percentPattern();
+  fmt = NumberFormat.percentPattern();
   str = fmt.format(1.3456E20);
   expect(veryBigNumberCompare('13,456,000,000,000,000,000,000%', str), isTrue);
 
   // TODO(alanknight): Note that this disagrees with what ICU would print
   // for this. We need significant digit support to do this properly.
-  fmt = new NumberFormat.scientificPattern();
+  fmt = NumberFormat.scientificPattern();
   str = fmt.format(1.3456E20);
   expect('1E20', str);
 
-  fmt = new NumberFormat.decimalPattern();
+  fmt = NumberFormat.decimalPattern();
   str = fmt.format(-1.234567890123456e306);
   expect(1 + 1 + 306 + 306 / 3, str.length);
   expect('-1,234,567,890,123,45', str.substring(0, 21));
@@ -62,32 +63,32 @@
 }
 
 void testStandardFormat() {
-  var str;
-  var fmt;
-  fmt = new NumberFormat.decimalPattern();
+  String str;
+  NumberFormat fmt;
+  fmt = NumberFormat.decimalPattern();
   str = fmt.format(1234.579);
   expect('1,234.579', str);
-  fmt = new NumberFormat.percentPattern();
+  fmt = NumberFormat.percentPattern();
   str = fmt.format(1234.579);
   expect('123,458%', str);
-  fmt = new NumberFormat.scientificPattern();
+  fmt = NumberFormat.scientificPattern();
   str = fmt.format(1234.579);
   expect('1E3', str);
 }
 
 void testNegativePercentage() {
-  var str;
-  var fmt = new NumberFormat('#,##0.00%');
+  String str;
+  var fmt = NumberFormat('#,##0.00%');
   str = fmt.format(-1234.56);
   expect('-123,456.00%', str);
 
-  fmt = new NumberFormat.percentPattern();
+  fmt = NumberFormat.percentPattern();
   str = fmt.format(-1234.579);
   expect('-123,458%', str);
 }
 
 void testCustomPercentage() {
-  var fmt = new NumberFormat.percentPattern();
+  var fmt = NumberFormat.percentPattern();
   fmt.maximumFractionDigits = 1;
   fmt.minimumFractionDigits = 1;
   var str = fmt.format(0.1291);
@@ -107,289 +108,281 @@
 }
 
 void testBasicFormat() {
-  var fmt = new NumberFormat('0.0000');
+  var fmt = NumberFormat('0.0000');
   var str = fmt.format(123.45789179565757);
   expect('123.4579', str);
 }
 
 void testGrouping() {
-  var str;
+  String str;
 
-  var fmt = new NumberFormat('#,###');
+  var fmt = NumberFormat('#,###');
   str = fmt.format(1234567890);
   expect('1,234,567,890', str);
-  fmt = new NumberFormat('#,####');
+  fmt = NumberFormat('#,####');
   str = fmt.format(1234567890);
   expect('12,3456,7890', str);
 
-  fmt = new NumberFormat('#');
+  fmt = NumberFormat('#');
   str = fmt.format(1234567890);
   expect('1234567890', str);
 }
 
 void testPerMill() {
-  var str;
+  String str;
 
-  var fmt = new NumberFormat('###.###\u2030');
+  var fmt = NumberFormat('###.###\u2030');
   str = fmt.format(0.4857);
   expect('485.7\u2030', str);
 }
 
 void testQuotes() {
-  var str;
+  String str;
 
-  var fmt = new NumberFormat('a\'fo\'\'o\'b#');
+  var fmt = NumberFormat('a\'fo\'\'o\'b#');
   str = fmt.format(123);
   expect('afo\'ob123', str);
 
-  fmt = new NumberFormat('a\'\'b#');
+  fmt = NumberFormat('a\'\'b#');
   str = fmt.format(123);
   expect('a\'b123', str);
 
-  fmt = new NumberFormat('a\'fo\'\'o\'b#');
+  fmt = NumberFormat('a\'fo\'\'o\'b#');
   str = fmt.format(-123);
   expect('-afo\'ob123', str);
 
-  fmt = new NumberFormat('a\'\'b#');
+  fmt = NumberFormat('a\'\'b#');
   str = fmt.format(-123);
   expect('-a\'b123', str);
 }
 
 void testZeros() {
-  var str;
-  var fmt;
+  String str;
 
-  fmt = new NumberFormat('#.#');
+  var fmt = NumberFormat('#.#');
   str = fmt.format(0);
   expect('0', str);
-  fmt = new NumberFormat('#.');
+  fmt = NumberFormat('#.');
   str = fmt.format(0);
   expect('0.', str);
-  fmt = new NumberFormat('.#');
+  fmt = NumberFormat('.#');
   str = fmt.format(0);
   expect('.0', str);
-  fmt = new NumberFormat('#');
+  fmt = NumberFormat('#');
   str = fmt.format(0);
   expect('0', str);
 
-  fmt = new NumberFormat('#0.#');
+  fmt = NumberFormat('#0.#');
   str = fmt.format(0);
   expect('0', str);
-  fmt = new NumberFormat('#0.');
+  fmt = NumberFormat('#0.');
   str = fmt.format(0);
   expect('0.', str);
-  fmt = new NumberFormat('#.0');
+  fmt = NumberFormat('#.0');
   str = fmt.format(0);
   expect('.0', str);
-  fmt = new NumberFormat('#');
+  fmt = NumberFormat('#');
   str = fmt.format(0);
   expect('0', str);
-  fmt = new NumberFormat('000');
+  fmt = NumberFormat('000');
   str = fmt.format(0);
   expect('000', str);
 }
 
 void testExponential() {
-  var str;
-  var fmt;
-
-  fmt = new NumberFormat('0.####E0');
+  String str;
+  var fmt = NumberFormat('0.####E0');
   str = fmt.format(0.01234);
   expect('1.234E-2', str);
-  fmt = new NumberFormat('00.000E00');
+  fmt = NumberFormat('00.000E00');
   str = fmt.format(0.01234);
   expect('12.340E-03', str);
-  fmt = new NumberFormat('##0.######E000');
+  fmt = NumberFormat('##0.######E000');
   str = fmt.format(0.01234);
   expect('12.34E-003', str);
-  fmt = new NumberFormat('0.###E0;[0.###E0]');
+  fmt = NumberFormat('0.###E0;[0.###E0]');
   str = fmt.format(0.01234);
   expect('1.234E-2', str);
 
-  fmt = new NumberFormat('0.####E0');
+  fmt = NumberFormat('0.####E0');
   str = fmt.format(123456789);
   expect('1.2346E8', str);
-  fmt = new NumberFormat('00.000E00');
+  fmt = NumberFormat('00.000E00');
   str = fmt.format(123456789);
   expect('12.346E07', str);
-  fmt = new NumberFormat('##0.######E000');
+  fmt = NumberFormat('##0.######E000');
   str = fmt.format(123456789);
   expect('123.456789E006', str);
-  fmt = new NumberFormat('0.###E0;[0.###E0]');
+  fmt = NumberFormat('0.###E0;[0.###E0]');
   str = fmt.format(123456789);
   expect('1.235E8', str);
 
-  fmt = new NumberFormat('0.####E0');
+  fmt = NumberFormat('0.####E0');
   str = fmt.format(1.23e300);
   expect('1.23E300', str);
-  fmt = new NumberFormat('00.000E00');
+  fmt = NumberFormat('00.000E00');
   str = fmt.format(1.23e300);
   expect('12.300E299', str);
-  fmt = new NumberFormat('##0.######E000');
+  fmt = NumberFormat('##0.######E000');
   str = fmt.format(1.23e300);
   expect('1.23E300', str);
-  fmt = new NumberFormat('0.###E0;[0.###E0]');
+  fmt = NumberFormat('0.###E0;[0.###E0]');
   str = fmt.format(1.23e300);
   expect('1.23E300', str);
 
-  fmt = new NumberFormat('0.####E0');
+  fmt = NumberFormat('0.####E0');
   str = fmt.format(-3.141592653e-271);
   expect('-3.1416E-271', str);
-  fmt = new NumberFormat('00.000E00');
+  fmt = NumberFormat('00.000E00');
   str = fmt.format(-3.141592653e-271);
   expect('-31.416E-272', str);
-  fmt = new NumberFormat('##0.######E000');
+  fmt = NumberFormat('##0.######E000');
   str = fmt.format(-3.141592653e-271);
   expect('-314.159265E-273', str);
-  fmt = new NumberFormat('0.###E0;[0.###E0]');
+  fmt = NumberFormat('0.###E0;[0.###E0]');
   str = fmt.format(-3.141592653e-271);
   expect('[3.142E-271]', str);
 
-  fmt = new NumberFormat('0.####E0');
+  fmt = NumberFormat('0.####E0');
   str = fmt.format(0);
   expect('0E0', str);
-  fmt = new NumberFormat('00.000E00');
+  fmt = NumberFormat('00.000E00');
   str = fmt.format(0);
   expect('00.000E00', str);
-  fmt = new NumberFormat('##0.######E000');
+  fmt = NumberFormat('##0.######E000');
   str = fmt.format(0);
   expect('0E000', str);
-  fmt = new NumberFormat('0.###E0;[0.###E0]');
+  fmt = NumberFormat('0.###E0;[0.###E0]');
   str = fmt.format(0);
   expect('0E0', str);
 
-  fmt = new NumberFormat('0.####E0');
+  fmt = NumberFormat('0.####E0');
   str = fmt.format(-1);
   expect('-1E0', str);
-  fmt = new NumberFormat('00.000E00');
+  fmt = NumberFormat('00.000E00');
   str = fmt.format(-1);
   expect('-10.000E-01', str);
-  fmt = new NumberFormat('##0.######E000');
+  fmt = NumberFormat('##0.######E000');
   str = fmt.format(-1);
   expect('-1E000', str);
-  fmt = new NumberFormat('0.###E0;[0.###E0]');
+  fmt = NumberFormat('0.###E0;[0.###E0]');
   str = fmt.format(-1);
   expect('[1E0]', str);
 
-  fmt = new NumberFormat('0.####E0');
+  fmt = NumberFormat('0.####E0');
   str = fmt.format(1);
   expect('1E0', str);
-  fmt = new NumberFormat('00.000E00');
+  fmt = NumberFormat('00.000E00');
   str = fmt.format(1);
   expect('10.000E-01', str);
-  fmt = new NumberFormat('##0.######E000');
+  fmt = NumberFormat('##0.######E000');
   str = fmt.format(1);
   expect('1E000', str);
-  fmt = new NumberFormat('0.###E0;[0.###E0]');
+  fmt = NumberFormat('0.###E0;[0.###E0]');
   str = fmt.format(1);
   expect('1E0', str);
 
-  fmt = new NumberFormat('#E0');
+  fmt = NumberFormat('#E0');
   str = fmt.format(12345.0);
   expect('1E4', str);
-  fmt = new NumberFormat('0E0');
+  fmt = NumberFormat('0E0');
   str = fmt.format(12345.0);
   expect('1E4', str);
-  fmt = new NumberFormat('##0.###E0');
+  fmt = NumberFormat('##0.###E0');
   str = fmt.format(12345.0);
   expect('12.345E3', str);
-  fmt = new NumberFormat('##0.###E0');
+  fmt = NumberFormat('##0.###E0');
   str = fmt.format(12345.00001);
   expect('12.345E3', str);
-  fmt = new NumberFormat('##0.###E0');
+  fmt = NumberFormat('##0.###E0');
   str = fmt.format(12345);
   expect('12.345E3', str);
 
-  fmt = new NumberFormat('##0.####E0');
+  fmt = NumberFormat('##0.####E0');
   str = fmt.format(789.12345e-9);
-  fmt = new NumberFormat('##0.####E0');
+  fmt = NumberFormat('##0.####E0');
   str = fmt.format(780e-9);
   expect('780E-9', str);
-  fmt = new NumberFormat('.###E0');
+  fmt = NumberFormat('.###E0');
   str = fmt.format(45678.0);
   expect('.457E5', str);
-  fmt = new NumberFormat('.###E0');
+  fmt = NumberFormat('.###E0');
   str = fmt.format(0);
   expect('.0E0', str);
 
-  fmt = new NumberFormat('#E0');
+  fmt = NumberFormat('#E0');
   str = fmt.format(45678000);
   expect('5E7', str);
-  fmt = new NumberFormat('##E0');
+  fmt = NumberFormat('##E0');
   str = fmt.format(45678000);
   expect('46E6', str);
-  fmt = new NumberFormat('####E0');
+  fmt = NumberFormat('####E0');
   str = fmt.format(45678000);
   expect('4568E4', str);
-  fmt = new NumberFormat('0E0');
+  fmt = NumberFormat('0E0');
   str = fmt.format(45678000);
   expect('5E7', str);
-  fmt = new NumberFormat('00E0');
+  fmt = NumberFormat('00E0');
   str = fmt.format(45678000);
   expect('46E6', str);
-  fmt = new NumberFormat('000E0');
+  fmt = NumberFormat('000E0');
   str = fmt.format(45678000);
   expect('457E5', str);
-  fmt = new NumberFormat('###E0');
+  fmt = NumberFormat('###E0');
   str = fmt.format(0.0000123);
   expect('12E-6', str);
-  fmt = new NumberFormat('###E0');
+  fmt = NumberFormat('###E0');
   str = fmt.format(0.000123);
   expect('123E-6', str);
-  fmt = new NumberFormat('###E0');
+  fmt = NumberFormat('###E0');
   str = fmt.format(0.00123);
   expect('1E-3', str);
-  fmt = new NumberFormat('###E0');
+  fmt = NumberFormat('###E0');
   str = fmt.format(0.0123);
   expect('12E-3', str);
-  fmt = new NumberFormat('###E0');
+  fmt = NumberFormat('###E0');
   str = fmt.format(0.123);
   expect('123E-3', str);
-  fmt = new NumberFormat('###E0');
+  fmt = NumberFormat('###E0');
   str = fmt.format(1.23);
   expect('1E0', str);
-  fmt = new NumberFormat('###E0');
+  fmt = NumberFormat('###E0');
   str = fmt.format(12.3);
   expect('12E0', str);
-  fmt = new NumberFormat('###E0');
+  fmt = NumberFormat('###E0');
   str = fmt.format(123.0);
   expect('123E0', str);
-  fmt = new NumberFormat('###E0');
+  fmt = NumberFormat('###E0');
   str = fmt.format(1230.0);
   expect('1E3', str);
 }
 
 void testPlusSignInExponentPart() {
-  var fmt;
-  fmt = new NumberFormat('0E+0');
+  var fmt = NumberFormat('0E+0');
   var str = fmt.format(45678000);
   expect('5E+7', str);
 }
 
 void testApis() {
-  var fmt;
-  var str;
-
-  fmt = new NumberFormat('#,###');
-  str = fmt.format(1234567890);
+  var fmt = NumberFormat('#,###');
+  var str = fmt.format(1234567890);
   expect('1,234,567,890', str);
 }
 
-testLocaleSwitch() {
-  Intl.withLocale("fr", verifyFrenchLocale);
+void testLocaleSwitch() {
+  Intl.withLocale('fr', verifyFrenchLocale);
 }
 
-typedef void TimerArgument();
-testLocaleSwitchAsync() {
-  Intl.withLocale("fr", () {
-    new Timer(new Duration(milliseconds: 10), expectAsync0(verifyFrenchLocale));
+void testLocaleSwitchAsync() {
+  Intl.withLocale('fr', () {
+    Timer(const Duration(milliseconds: 10), expectAsync0(verifyFrenchLocale));
   });
   // Verify that things running outside the zone still get en_US.
   testStandardFormat();
 }
 
 void verifyFrenchLocale() {
-  var fmt = new NumberFormat('#,###');
+  var fmt = NumberFormat('#,###');
   var str = fmt.format(1234567890);
   expect(str, '1\u202f234\u202f567\u202f890');
 }
diff --git a/test/number_format_compact_test.dart b/test/number_format_compact_test.dart
index 650c974..0c7ad5f 100644
--- a/test/number_format_compact_test.dart
+++ b/test/number_format_compact_test.dart
@@ -12,10 +12,10 @@
 /// A place to put a case that's causing a problem and have it run first when
 /// debugging
 var interestingCases = <String, List<List<String>>>{
-//  "mn" : [["4321", "4.32M", "whatever"]]
+//  'mn' : [['4321', '4.32M', 'whatever']]
 };
 
-main() {
+void main() {
   interestingCases.forEach(validate);
   testdata.compactNumberTestData.forEach(validate);
 
@@ -24,82 +24,83 @@
   // smoke test. JPY is a useful test because it has no decimalDigits and
   // different grouping than USD, as well as a different currency symbol and
   // suffixes.
-  testCurrency("ja", 1.2345, "¥1", "¥1");
-  testCurrency("ja", 1, "¥1", "¥1");
-  testCurrency("ja", 12, "¥12", "¥10");
-  testCurrency("ja", 123, "¥123", "¥100");
-  testCurrency("ja", 1234, "¥1230", "¥1000");
-  testCurrency("ja", 12345, "¥1.23\u4E07", "¥1\u4E07");
-  testCurrency("ja", 123456, "¥12.3\u4E07", "¥10\u4E07");
-  testCurrency("ja", 1234567, "¥123\u4e07", "¥100\u4e07");
-  testCurrency("ja", 12345678, "¥1230\u4e07", "¥1000\u4e07");
-  testCurrency("ja", 123456789, "¥1.23\u5104", "¥1\u5104");
+  testCurrency('ja', 1.2345, '¥1', '¥1');
+  testCurrency('ja', 1, '¥1', '¥1');
+  testCurrency('ja', 12, '¥12', '¥10');
+  testCurrency('ja', 123, '¥123', '¥100');
+  testCurrency('ja', 1234, '¥1230', '¥1000');
+  testCurrency('ja', 12345, '¥1.23\u4E07', '¥1\u4E07');
+  testCurrency('ja', 123456, '¥12.3\u4E07', '¥10\u4E07');
+  testCurrency('ja', 1234567, '¥123\u4e07', '¥100\u4e07');
+  testCurrency('ja', 12345678, '¥1230\u4e07', '¥1000\u4e07');
+  testCurrency('ja', 123456789, '¥1.23\u5104', '¥1\u5104');
 
-  testCurrency("ja", 0.9876, "¥1", "¥1");
-  testCurrency("ja", 9, "¥9", "¥9");
-  testCurrency("ja", 98, "¥98", "¥100");
-  testCurrency("ja", 987, "¥987", "¥1000");
-  testCurrency("ja", 9876, "¥9880", "¥1\u4E07");
-  testCurrency("ja", 98765, "¥9.88\u4E07", "¥10\u4E07");
-  testCurrency("ja", 987656, "¥98.8\u4E07", "¥100\u4E07");
-  testCurrency("ja", 9876567, "¥988\u4e07", "¥1000\u4e07");
-  testCurrency("ja", 98765678, "¥9880\u4e07", "¥1\u5104");
-  testCurrency("ja", 987656789, "¥9.88\u5104", "¥10\u5104");
+  testCurrency('ja', 0.9876, '¥1', '¥1');
+  testCurrency('ja', 9, '¥9', '¥9');
+  testCurrency('ja', 98, '¥98', '¥100');
+  testCurrency('ja', 987, '¥987', '¥1000');
+  testCurrency('ja', 9876, '¥9880', '¥1\u4E07');
+  testCurrency('ja', 98765, '¥9.88\u4E07', '¥10\u4E07');
+  testCurrency('ja', 987656, '¥98.8\u4E07', '¥100\u4E07');
+  testCurrency('ja', 9876567, '¥988\u4e07', '¥1000\u4e07');
+  testCurrency('ja', 98765678, '¥9880\u4e07', '¥1\u5104');
+  testCurrency('ja', 987656789, '¥9.88\u5104', '¥10\u5104');
 
-  testCurrency("en_US", 1.2345, r"$1.23", r"$1");
-  testCurrency("en_US", 1, r"$1.00", r"$1");
-  testCurrency("en_US", 12, r"$12.00", r"$10");
-  testCurrency("en_US", 12.3, r"$12.30", r"$10");
-  testCurrency("en_US", 123, r"$123", r"$100");
-  testCurrency("en_US", 1234, r"$1.23K", r"$1K");
-  testCurrency("en_US", 12345, r"$12.3K", r"$10K");
-  testCurrency("en_US", 123456, r"$123K", r"$100K");
-  testCurrency("en_US", 1234567, r"$1.23M", r"$1M");
+  testCurrency('en_US', 1.2345, r'$1.23', r'$1');
+  testCurrency('en_US', 1, r'$1.00', r'$1');
+  testCurrency('en_US', 12, r'$12.00', r'$10');
+  testCurrency('en_US', 12.3, r'$12.30', r'$10');
+  testCurrency('en_US', 123, r'$123', r'$100');
+  testCurrency('en_US', 1234, r'$1.23K', r'$1K');
+  testCurrency('en_US', 12345, r'$12.3K', r'$10K');
+  testCurrency('en_US', 123456, r'$123K', r'$100K');
+  testCurrency('en_US', 1234567, r'$1.23M', r'$1M');
 
   // Check for order of currency symbol when currency is a suffix.
-  testCurrency("ru", 4420, "4,42\u00A0тыс.\u00A0руб.", "4\u00A0тыс.\u00A0руб.");
+  testCurrency('ru', 4420, '4,42\u00A0тыс.\u00A0руб.', '4\u00A0тыс.\u00A0руб.');
 
   // Locales which don't have a suffix for thousands.
-  testCurrency("it", 442, "442\u00A0€", "400\u00A0€");
-  testCurrency("it", 4420, "4420\u00A0\$", "4000\u00A0\$", currency: 'CAD');
-  testCurrency("it", 4420000, "4,42\u00A0Mio\u00A0\$", "4\u00A0Mio\u00A0\$",
+  testCurrency('it', 442, '442\u00A0€', '400\u00A0€');
+  testCurrency('it', 4420, '4420\u00A0\$', '4000\u00A0\$', currency: 'CAD');
+  testCurrency('it', 4420000, '4,42\u00A0Mio\u00A0\$', '4\u00A0Mio\u00A0\$',
       currency: 'USD');
 
-  test("Explicit non-default symbol with compactCurrency", () {
-    var format = new NumberFormat.compactCurrency(locale: "ja", symbol: "()");
+  test('Explicit non-default symbol with compactCurrency', () {
+    var format = NumberFormat.compactCurrency(locale: 'ja', symbol: '()');
     var result = format.format(98765);
-    expect(result, "()9.88\u4e07");
+    expect(result, '()9.88\u4e07');
   });
 }
 
-testCurrency(String locale, num number, String expected, String expectedShort,
+void testCurrency(
+    String locale, num number, String expected, String expectedShort,
     {String currency}) {
-  test("Compact simple currency for $locale, $number", () {
+  test('Compact simple currency for $locale, $number', () {
     var format =
-        new NumberFormat.compactSimpleCurrency(locale: locale, name: currency);
+        NumberFormat.compactSimpleCurrency(locale: locale, name: currency);
     var result = format.format(number);
     expect(result, expected);
     var shortFormat =
-        new NumberFormat.compactSimpleCurrency(locale: locale, name: currency);
+        NumberFormat.compactSimpleCurrency(locale: locale, name: currency);
     shortFormat.significantDigits = 1;
     var shortResult = shortFormat.format(number);
     expect(shortResult, expectedShort);
   });
-  test("Compact currency for $locale, $number", () {
+  test('Compact currency for $locale, $number', () {
     var symbols = {
-      "ja": "¥",
-      "en_US": r"$",
-      "ru": "руб.",
-      "it": "€",
-      "CAD": r"$",
-      "USD": r"$"
+      'ja': '¥',
+      'en_US': r'$',
+      'ru': 'руб.',
+      'it': '€',
+      'CAD': r'$',
+      'USD': r'$'
     };
     var symbol = symbols[currency] ?? symbols[locale];
-    var format = new NumberFormat.compactCurrency(
+    var format = NumberFormat.compactCurrency(
         locale: locale, name: currency, symbol: symbol);
     var result = format.format(number);
     expect(result, expected);
-    var shortFormat = new NumberFormat.compactCurrency(
+    var shortFormat = NumberFormat.compactCurrency(
         locale: locale, name: currency, symbol: symbol);
     shortFormat.significantDigits = 1;
     var shortResult = shortFormat.format(number);
@@ -112,33 +113,33 @@
 // TODO(alanknight): Fix the problems, or at least figure out precisely where
 // the differences are.
 var problemLocalesShort = [
-  "am", // AM Suffixes differ, not sure why.
-  "ca", // For CA, CLDR rules are different. Jumps from 0000 to 00 prefix, so
+  'am', // AM Suffixes differ, not sure why.
+  'ca', // For CA, CLDR rules are different. Jumps from 0000 to 00 prefix, so
   // 11 digits prints as 11900.
-  "es_419", // Some odd formatting rules for these which seem to be different
+  'es_419', // Some odd formatting rules for these which seem to be different
   // from CLDR. wants e.g. '160000000000k' Actual: '160 B'
-  "es_ES", // The reverse of es_419 for a few cases. We're printing a longer
+  'es_ES', // The reverse of es_419 for a few cases. We're printing a longer
   // form.
-  "es_US", // Like es_419 but not as many of them. e.g. Expected: '87700k'
+  'es_US', // Like es_419 but not as many of them. e.g. Expected: '87700k'
   // Actual: '87.7 M'
-  "es_MX", // like es_419
-  "es",
-  "fa",
-  "fr_CA", // Several where PyICU isn't compacting. Expected: '988000000'
+  'es_MX', // like es_419
+  'es',
+  'fa',
+  'fr_CA', // Several where PyICU isn't compacting. Expected: '988000000'
   // Actual: '988 M'.
-  "gsw", // Suffixes disagree
-  "in", // IN not compacting 54321, looks similar to tr.
-  "id", // ID not compacting 54321, looks similar to tr.
-  "ka", // K Slight difference in the suffix
-  "kk", "mn", // We're picking the wrong pattern for 654321.
-  "lo", "mk", "my",
-  "pt_PT", // Seems to differ in appending mil or not after thousands. pt_BR
+  'gsw', // Suffixes disagree
+  'in', // IN not compacting 54321, looks similar to tr.
+  'id', // ID not compacting 54321, looks similar to tr.
+  'ka', // K Slight difference in the suffix
+  'kk', 'mn', // We're picking the wrong pattern for 654321.
+  'lo', 'mk', 'my',
+  'pt_PT', // Seems to differ in appending mil or not after thousands. pt_BR
   // does it.
-  "sd", // ICU considers this locale data questionable
-  "th", // TH Expected abbreviations as '1.09 พ.ล.' rather than '1.09 พ'
-  "tr", // TR Doesn't have a 0B format, goes directly to 00B, as a result 54321
+  'sd', // ICU considers this locale data questionable
+  'th', // TH Expected abbreviations as '1.09 พ.ล.' rather than '1.09 พ'
+  'tr', // TR Doesn't have a 0B format, goes directly to 00B, as a result 54321
   // just prints as 54321
-  "ur", // UR Fails one with Expected: '15 ٹریلین'  Actual: '150 کھرب'
+  'ur', // UR Fails one with Expected: '15 ٹریلین'  Actual: '150 کھرب'
 ];
 
 /// Locales that have problems in the long format.
@@ -151,27 +152,27 @@
 //TODO(alanknight): Narrow these down to particular numbers. Often it's just
 // 999999.
 var problemLocalesLong = [
-  "ar", "ar_DZ", "ar_EG",
-  "be", "bg", "bs",
-  "ca", "cs", "da", "de", "de_AT", "de_CH", "el", "es", "es_419", "es_ES",
-  "es_MX", "es_US", "et", "fi",
-  "fil", // FIL is different, seems like a genuine difference in suffixes
-  "fr", "fr_CA",
-  "fr_CH", // TODO(alanknight): million/millions, supported since CLDR 31.
-  "ga", "gl",
-  "gsw", // GSW seems like we have long forms and pyICU doesn't
-  "hr", "is", "it",
-  "it_CH", "lo", // LO seems to be picking up a different pattern.
-  "lt", "lv", "mk",
-  "my", // Seems to come out in the reverse order
-  "nb", "ne", "no", "no_NO", "pl",
-  "pt", // PT has some issues with scale as well, but I think it's differences
+  'ar', 'ar_DZ', 'ar_EG',
+  'be', 'bg', 'bs',
+  'ca', 'cs', 'da', 'de', 'de_AT', 'de_CH', 'el', 'es', 'es_419', 'es_ES',
+  'es_MX', 'es_US', 'et', 'fi',
+  'fil', // FIL is different, seems like a genuine difference in suffixes
+  'fr', 'fr_CA',
+  'fr_CH', // TODO(alanknight): million/millions, supported since CLDR 31.
+  'ga', 'gl',
+  'gsw', // GSW seems like we have long forms and pyICU doesn't
+  'hr', 'is', 'it',
+  'it_CH', 'lo', // LO seems to be picking up a different pattern.
+  'lt', 'lv', 'mk',
+  'my', // Seems to come out in the reverse order
+  'nb', 'ne', 'no', 'no_NO', 'pl',
+  'pt', // PT has some issues with scale as well, but I think it's differences
   // in the patterns.
-  "pt_BR", "pt_PT", "ro", "ru",
-  "sd", // ICU considers this locale data questionable
-  "sk", "sl", "sr", "sr_Latn", "sv", "te", "tl",
-  "ur",
-  "uk",
+  'pt_BR', 'pt_PT', 'ro', 'ru',
+  'sd', // ICU considers this locale data questionable
+  'sk', 'sl', 'sr', 'sr_Latn', 'sv', 'te', 'tl',
+  'ur',
+  'uk',
 ];
 
 void validate(String locale, List<List<String>> expected) {
@@ -186,12 +187,12 @@
     print("Skipping problem locale '$locale' for SHORT compact number tests");
     return;
   }
-  var shortFormat = new NumberFormat.compact(locale: locale);
-  test("Validate $locale SHORT", () {
+  var shortFormat = NumberFormat.compact(locale: locale);
+  test('Validate $locale SHORT', () {
     for (var data in expected) {
       var number = num.parse(data.first);
       validateNumber(number, shortFormat, data[1]);
-      var int64Number = new Int64(number);
+      var int64Number = Int64(number);
       validateNumber(int64Number, shortFormat, data[1]);
       // TODO(alanknight): Make this work for MicroMoney
     }
@@ -203,8 +204,8 @@
     print("Skipping problem locale '$locale' for LONG compact number tests");
     return;
   }
-  var longFormat = new NumberFormat.compactLong(locale: locale);
-  test("Validate $locale LONG", () {
+  var longFormat = NumberFormat.compactLong(locale: locale);
+  test('Validate $locale LONG', () {
     for (var data in expected) {
       var number = num.parse(data.first);
       validateNumber(number, longFormat, data[2]);
@@ -217,7 +218,7 @@
   var ok = closeEnough(formatted, expected);
   if (!ok) {
     expect(
-        "$formatted ${formatted.codeUnits}", "$expected ${expected.codeUnits}");
+        '$formatted ${formatted.codeUnits}', '$expected ${expected.codeUnits}');
   }
   var parsed = format.parse(formatted);
   var rounded = roundForPrinting(number, format);
@@ -228,7 +229,7 @@
 /// number that will round to print differently depending on the number
 /// of significant digits, we need to check that as well, e.g.
 /// 999999 may print as 1M.
-roundForPrinting(number, NumberFormat format) {
+num roundForPrinting(number, NumberFormat format) {
   var originalLength = NumberFormat.numberOfIntegerDigits(number);
   var additionalDigits = originalLength - format.significantDigits;
   if (additionalDigits > 0) {
@@ -241,7 +242,7 @@
 }
 
 final _nbsp = 0xa0;
-final _nbspString = new String.fromCharCode(_nbsp);
+final _nbspString = String.fromCharCode(_nbsp);
 
 /// Return true if the strings are close enough to what we
 /// expected to consider a pass.
@@ -275,12 +276,12 @@
 /// equal because that's checked first in the only caller.
 bool _oneSpaceOnlyDifference(String result, String expected) {
   var resultWithoutSpaces =
-      new String.fromCharCodes(result.codeUnits.where((x) => x != _nbsp));
+      String.fromCharCodes(result.codeUnits.where((x) => x != _nbsp));
   var expectedWithoutSpaces =
-      new String.fromCharCodes(expected.codeUnits.where((x) => x != _nbsp));
+      String.fromCharCodes(expected.codeUnits.where((x) => x != _nbsp));
   var resultDifference = result.length - resultWithoutSpaces.length;
   var expectedDifference = expected.length - expectedWithoutSpaces.length;
-  return (resultWithoutSpaces == expectedWithoutSpaces &&
+  return resultWithoutSpaces == expectedWithoutSpaces &&
       resultDifference <= 1 &&
-      expectedDifference <= 1);
+      expectedDifference <= 1;
 }
diff --git a/test/number_format_test_core.dart b/test/number_format_test_core.dart
index 9a54071..26fa95d 100644
--- a/test/number_format_test_core.dart
+++ b/test/number_format_test_core.dart
@@ -11,38 +11,38 @@
 
 /// Tests the Numeric formatting library in dart.
 var testNumbersWeCanReadBack = {
-  "-1": -1,
-  "-2": -2.0,
-  "-0.01": -0.01,
-  "-1.23": -1.23,
-  "0.001": 0.001,
-  "0.01": 0.01,
-  "0.1": 0.1,
-  "1": 1,
-  "2": 2.0,
-  "10": 10,
-  "100": 100,
-  "1,000": 1000,
-  "2,000,000,000,000": 2000000000000,
-  "0.123": 0.123,
-  "1,234": 1234.0,
-  "1.234": 1.234,
-  "1.23": 1.230,
-  "NaN": 0.0 / 0.0,
-  "∞": 1.0 / 0.0,
-  "-∞": -1.0 / 0.0,
+  '-1': -1,
+  '-2': -2.0,
+  '-0.01': -0.01,
+  '-1.23': -1.23,
+  '0.001': 0.001,
+  '0.01': 0.01,
+  '0.1': 0.1,
+  '1': 1,
+  '2': 2.0,
+  '10': 10,
+  '100': 100,
+  '1,000': 1000,
+  '2,000,000,000,000': 2000000000000,
+  '0.123': 0.123,
+  '1,234': 1234.0,
+  '1.234': 1.234,
+  '1.23': 1.230,
+  'NaN': 0.0 / 0.0,
+  '∞': 1.0 / 0.0,
+  '-∞': -1.0 / 0.0,
 };
 
 /// Test numbers that we can't parse because we lose precision in formatting.
 var testNumbersWeCannotReadBack = {
-  "3.142": 3.1415926535897932,
-  "-1.234": -1.2342,
-  "-1.235": -1.2348,
-  "1.234": 1.2342,
-  "1.235": 1.2348
+  '3.142': 3.1415926535897932,
+  '-1.234': -1.2342,
+  '-1.235': -1.2348,
+  '1.234': 1.2342,
+  '1.235': 1.2348
 };
 
-var testExponential = const {"1E-3": 0.001, "1E-2": 0.01, "1.23E0": 1.23};
+var testExponential = const {'1E-3': 0.001, '1E-2': 0.01, '1.23E0': 1.23};
 
 // TODO(alanknight): Test against currency, which requires generating data
 // for the three different forms that this now supports.
@@ -50,20 +50,20 @@
 // digit support.
 List<NumberFormat> standardFormats(String locale) {
   return [
-    new NumberFormat.decimalPattern(locale),
-    new NumberFormat.percentPattern(locale),
+    NumberFormat.decimalPattern(locale),
+    NumberFormat.percentPattern(locale),
   ];
 }
 
 Map<String, num> get testNumbers =>
-    new Map.from(testNumbersWeCanReadBack)..addAll(testNumbersWeCannotReadBack);
+    Map.from(testNumbersWeCanReadBack)..addAll(testNumbersWeCannotReadBack);
 
-runTests(Map<String, num> allTestNumbers) {
+void runTests(Map<String, num> allTestNumbers) {
   // For data from a list of locales, run each locale's data as a separate
   // test so we can see exactly which ones pass or fail. The test data is
   // hard-coded as printing 123, -12.3, %12,300, -1,230% in each locale.
   var mainList = numberTestData;
-  var sortedLocales = new List.from(numberFormatSymbols.keys);
+  var sortedLocales = List.from(numberFormatSymbols.keys);
   sortedLocales.sort((a, b) => a.compareTo(b));
   for (var locale in sortedLocales) {
     var testFormats = standardFormats(locale);
@@ -77,7 +77,7 @@
   }
 
   test('Simple set of numbers', () {
-    var number = new NumberFormat();
+    var number = NumberFormat();
     for (var x in allTestNumbers.keys) {
       var formatted = number.format(allTestNumbers[x]);
       expect(formatted, x);
@@ -105,14 +105,14 @@
       '0,000,001'
     ];
     for (var i = 0; i < 7; i++) {
-      var f = new NumberFormat.decimalPattern();
+      var f = NumberFormat.decimalPattern();
       f.minimumIntegerDigits = i;
       expect(f.format(1), expected[i]);
     }
   });
 
   test('Exponential form', () {
-    var number = new NumberFormat("#.###E0");
+    var number = NumberFormat('#.###E0');
     for (var x in testExponential.keys) {
       var formatted = number.format(testExponential[x]);
       expect(formatted, x);
@@ -122,9 +122,9 @@
   });
 
   test('Percent with no decimals and no integer part', () {
-    var number = new NumberFormat("#%");
+    var number = NumberFormat('#%');
     var formatted = number.format(0.12);
-    expect(formatted, "12%");
+    expect(formatted, '12%');
     var readBack = number.parse(formatted);
     expect(0.12, readBack);
   });
@@ -133,8 +133,8 @@
   // numbers and we're reading them in a format where they won't print
   // back the same way.
   test('Parsing modifiers,e.g. percent, in the base format', () {
-    var number = new NumberFormat();
-    var modified = {"12%": 0.12, "12\u2030": 0.012};
+    var number = NumberFormat();
+    var modified = {'12%': 0.12, '12\u2030': 0.012};
     modified.addAll(testExponential);
     for (var x in modified.keys) {
       var parsed = number.parse(x);
@@ -144,41 +144,48 @@
 
   test('Explicit currency name', () {
     var amount = 1000000.32;
-    var usConvention = new NumberFormat.currency(locale: 'en_US', symbol: '€');
+    var usConvention = NumberFormat.currency(locale: 'en_US', symbol: '€');
     var formatted = usConvention.format(amount);
     expect(formatted, '€1,000,000.32');
     var readBack = usConvention.parse(formatted);
     expect(readBack, amount);
     // ignore: deprecated_member_use_from_same_package
-    var swissConvention = new NumberFormat.currencyPattern('de_CH', r'$');
+    var swissConvention = NumberFormat.currencyPattern('de_CH', r'$');
     formatted = swissConvention.format(amount);
-    var nbsp = new String.fromCharCode(0xa0);
-    var backquote = new String.fromCharCode(0x2019);
-    expect(formatted,
-        r"$" + nbsp + "1" + backquote + "000" + backquote + "000.32");
+    var nbsp = String.fromCharCode(0xa0);
+    var backquote = String.fromCharCode(0x2019);
+    //ignore: prefer_interpolation_to_compose_strings
+    expect(
+        formatted,
+        //ignore: prefer_interpolation_to_compose_strings
+        r'$' + nbsp + '1' + backquote + '000' + backquote + '000.32');
     readBack = swissConvention.parse(formatted);
     expect(readBack, amount);
 
     // ignore: deprecated_member_use_from_same_package
-    var italianSwiss = new NumberFormat.currencyPattern('it_CH', r'$');
+    var italianSwiss = NumberFormat.currencyPattern('it_CH', r'$');
     formatted = italianSwiss.format(amount);
-    expect(formatted,
-        r"$" + nbsp + "1" + backquote + "000" + backquote + "000.32");
+    expect(
+        formatted,
+        //ignore: prefer_interpolation_to_compose_strings
+        r'$' + nbsp + '1' + backquote + '000' + backquote + '000.32');
     readBack = italianSwiss.parse(formatted);
     expect(readBack, amount);
 
     /// Verify we can leave off the currency and it gets filled in.
-    var plainSwiss = new NumberFormat.currency(locale: 'de_CH');
+    var plainSwiss = NumberFormat.currency(locale: 'de_CH');
     formatted = plainSwiss.format(amount);
-    expect(formatted,
-        r"CHF" + nbsp + "1" + backquote + "000" + backquote + "000.32");
+    expect(
+        formatted,
+        //ignore: prefer_interpolation_to_compose_strings
+        r'CHF' + nbsp + '1' + backquote + '000' + backquote + '000.32');
     readBack = plainSwiss.parse(formatted);
     expect(readBack, amount);
 
     // Verify that we can pass null in order to specify the currency symbol
     // but use the default locale.
     // ignore: deprecated_member_use_from_same_package
-    var defaultLocale = new NumberFormat.currencyPattern(null, 'Smurfs');
+    var defaultLocale = NumberFormat.currencyPattern(null, 'Smurfs');
     formatted = defaultLocale.format(amount);
     // We don't know what the exact format will be, but it should have Smurfs.
     expect(formatted.contains('Smurfs'), isTrue);
@@ -186,60 +193,59 @@
     expect(readBack, amount);
   });
 
-  test("Delta percent format", () {
-    var f = new NumberFormat("+#,##0%;-#,##0%");
-    expect(f.format(-0.07), "-7%");
-    expect(f.format(0.12), "+12%");
+  test('Delta percent format', () {
+    var f = NumberFormat('+#,##0%;-#,##0%');
+    expect(f.format(-0.07), '-7%');
+    expect(f.format(0.12), '+12%');
   });
 
   test('Unparseable', () {
-    var format = new NumberFormat.currency();
-    expect(() => format.parse("abcdefg"), throwsFormatException);
-    expect(() => format.parse(""), throwsFormatException);
-    expect(() => format.parse("1.0zzz"), throwsFormatException);
-    expect(() => format.parse("-∞+1"), throwsFormatException);
+    var format = NumberFormat.currency();
+    expect(() => format.parse('abcdefg'), throwsFormatException);
+    expect(() => format.parse(''), throwsFormatException);
+    expect(() => format.parse('1.0zzz'), throwsFormatException);
+    expect(() => format.parse('-∞+1'), throwsFormatException);
   });
 
   var digitsCheck = {
-    0: "@4",
-    1: "@4.3",
-    2: "@4.32",
-    3: "@4.322",
-    4: "@4.3220",
+    0: '@4',
+    1: '@4.3',
+    2: '@4.32',
+    3: '@4.322',
+    4: '@4.3220',
   };
 
   test('Decimal digits', () {
     var amount = 4.3219876;
     for (var digits in digitsCheck.keys) {
-      var f = new NumberFormat.currency(
+      var f = NumberFormat.currency(
           locale: 'en_US', symbol: '@', decimalDigits: digits);
       var formatted = f.format(amount);
       expect(formatted, digitsCheck[digits]);
     }
-    var defaultFormat = new NumberFormat.currency(locale: 'en_US', symbol: '@');
+    var defaultFormat = NumberFormat.currency(locale: 'en_US', symbol: '@');
     var formatted = defaultFormat.format(amount);
     expect(formatted, digitsCheck[2]);
 
     var jpyUs =
-        new NumberFormat.currency(locale: 'en_US', name: 'JPY', symbol: '@');
+        NumberFormat.currency(locale: 'en_US', name: 'JPY', symbol: '@');
     formatted = jpyUs.format(amount);
     expect(formatted, digitsCheck[0]);
 
-    var jpyJa =
-        new NumberFormat.currency(locale: 'ja', name: 'JPY', symbol: '@');
+    var jpyJa = NumberFormat.currency(locale: 'ja', name: 'JPY', symbol: '@');
     formatted = jpyJa.format(amount);
     expect(formatted, digitsCheck[0]);
 
-    var jpySimple = new NumberFormat.simpleCurrency(locale: 'ja', name: 'JPY');
+    var jpySimple = NumberFormat.simpleCurrency(locale: 'ja', name: 'JPY');
     formatted = jpySimple.format(amount);
-    expect(formatted, "¥4");
+    expect(formatted, '¥4');
 
     var jpyLower =
-        new NumberFormat.currency(locale: 'en_US', name: 'jpy', symbol: '@');
+        NumberFormat.currency(locale: 'en_US', name: 'jpy', symbol: '@');
     formatted = jpyLower.format(amount);
     expect(formatted, digitsCheck[0]);
 
-    var tnd = new NumberFormat.currency(name: 'TND', symbol: '@');
+    var tnd = NumberFormat.currency(name: 'TND', symbol: '@');
     formatted = tnd.format(amount);
     expect(formatted, digitsCheck[3]);
   });
@@ -247,7 +253,7 @@
   testSimpleCurrencySymbols();
 
   test('Padding digits with non-ascii zero', () {
-    var format = new NumberFormat('000', 'ar_EG');
+    var format = NumberFormat('000', 'ar_EG');
     var padded = format.format(0);
     expect(padded, '٠٠٠');
   });
@@ -255,8 +261,8 @@
   // Exercise a custom pattern. There's not actually much logic here, so just
   // validate that the custom pattern is in fact being used.
   test('Custom currency pattern', () {
-    var format = new NumberFormat.currency(
-        name: 'XYZZY', customPattern: '[\u00a4][#,##.#]');
+    var format =
+        NumberFormat.currency(name: 'XYZZY', customPattern: '[\u00a4][#,##.#]');
     var text = format.format(12345.67);
     expect(text, '[XYZZY][1,23,45.67]');
   });
@@ -268,14 +274,14 @@
   // which we don't want. We also treat the difference between Unicode
   // minus sign (2212) and hyphen-minus (45) as not significant.
   return input
-      .replaceAll("\u200e", "")
-      .replaceAll("\u200f", "")
-      .replaceAll("\u061c", "")
-      .replaceAll("\u2212", "-");
+      .replaceAll('\u200e', '')
+      .replaceAll('\u200f', '')
+      .replaceAll('\u061c', '')
+      .replaceAll('\u2212', '-');
 }
 
 void testAgainstIcu(locale, List<NumberFormat> testFormats, list) {
-  test("Test against ICU data for $locale", () {
+  test('Test against ICU data for $locale', () {
     for (var format in testFormats) {
       var formatted = format.format(123);
       var negative = format.format(-12.3);
@@ -296,35 +302,35 @@
   });
 }
 
-testSimpleCurrencySymbols() {
+void testSimpleCurrencySymbols() {
   var currencies = ['USD', 'CAD', 'EUR', 'CRC', null];
   //  Note that these print using the simple symbol as if we were in a
   // a locale where that currency symbol is well understood. So we
   // expect Canadian dollars printed as $, even though our locale is
   // en_US, and this would confuse users.
   var simple = currencies.map((currency) =>
-      new NumberFormat.simpleCurrency(locale: 'en_US', name: currency));
+      NumberFormat.simpleCurrency(locale: 'en_US', name: currency));
   var expectedSimple = [r'$', r'$', '\u20ac', '\u20a1', r'$'];
   // These will always print as the global name, regardless of locale
   var global = currencies.map(
-      (currency) => new NumberFormat.currency(locale: 'en_US', name: currency));
+      (currency) => NumberFormat.currency(locale: 'en_US', name: currency));
   var expectedGlobal = currencies.map((curr) => curr ?? 'USD').toList();
 
-  testCurrencySymbolsFor(expectedGlobal, global, "global");
-  testCurrencySymbolsFor(expectedSimple, simple, "simple");
+  testCurrencySymbolsFor(expectedGlobal, global, 'global');
+  testCurrencySymbolsFor(expectedSimple, simple, 'simple');
 }
 
-testCurrencySymbolsFor(expected, formats, name) {
+void testCurrencySymbolsFor(expected, formats, name) {
   var amount = 1000000.32;
-  new Map<Object, NumberFormat>.fromIterables(expected, formats)
+  Map<Object, NumberFormat>.fromIterables(expected, formats)
       .forEach((expected, NumberFormat format) {
-    test("Test $name ${format.currencyName}", () {
+    test('Test $name ${format.currencyName}', () {
       // Allow for currencies with different fraction digits, e.g. CRC.
       var maxDigits = format.maximumFractionDigits;
       var rounded = maxDigits == 0 ? amount.round() : amount;
       var fractionDigits = (amount - rounded) < 0.00001 ? '.32' : '';
       var formatted = format.format(rounded);
-      expect(formatted, "${expected}1,000,000$fractionDigits");
+      expect(formatted, '${expected}1,000,000$fractionDigits');
       var parsed = format.parse(formatted);
       expect(parsed, rounded);
     });
diff --git a/test/number_format_vm_test.dart b/test/number_format_vm_test.dart
index 4e383e9..8c04b58 100644
--- a/test/number_format_vm_test.dart
+++ b/test/number_format_vm_test.dart
@@ -4,7 +4,7 @@
 
 /// Number tests for the VM - includes numbers that can only be compiled for the
 /// VM.
-@TestOn("vm")
+@TestOn('vm')
 library number_format_vm_test;
 
 import 'package:test/test.dart';
@@ -12,10 +12,10 @@
 
 /// Test numbers that won't work in Javascript because they're too big.
 var testNumbersOnlyForTheVM = {
-  "9,000,000,000,000,000,000": 9000000000000000000,
-  "9,223,372,036,854,775,807": 9223372036854775807
+  '9,000,000,000,000,000,000': 9000000000000000000,
+  '9,223,372,036,854,775,807': 9223372036854775807
 };
 
-main() {
+void main() {
   core.runTests(core.testNumbers..addAll(testNumbersOnlyForTheVM));
 }
diff --git a/test/number_format_web_test.dart b/test/number_format_web_test.dart
index c626a4e..86db381 100644
--- a/test/number_format_web_test.dart
+++ b/test/number_format_web_test.dart
@@ -4,12 +4,12 @@
 
 /// Number format tests for the web - excludes numbers too big to compile for
 /// the web.
-@TestOn("browser")
+@TestOn('browser')
 library number_format_web_test;
 
 import 'package:test/test.dart';
 import 'number_format_test_core.dart' as core;
 
-main() {
+void main() {
   core.runTests(core.testNumbers);
 }
diff --git a/test/number_test_data.dart b/test/number_test_data.dart
index 981b289..7a0b60c 100644
--- a/test/number_test_data.dart
+++ b/test/number_test_data.dart
@@ -7,6 +7,9 @@
 /// DO NOT EDIT. This file is autogenerated from ICU data.
 /// File generated from CLDR ver. 35.0
 
+// MANUAL EDIT TO SUPPRESS WARNINGS IN GENERATED CODE
+// ignore_for_file: prefer_single_quotes
+
 library number_test_data;
 
 var numberTestData = const [
diff --git a/test/plural_test.dart b/test/plural_test.dart
index 9ab718e..5118064 100644
--- a/test/plural_test.dart
+++ b/test/plural_test.dart
@@ -160,7 +160,7 @@
 25:Other
 ''';
 
-plural(n, locale) => Intl.plural(n,
+String plural(n, locale) => Intl.plural(n,
     locale: locale,
     name: 'plural',
     desc: 'A simple plural test case',
@@ -172,7 +172,7 @@
     many: '$n:Many',
     other: '$n:Other');
 
-pluralNoZero(n, locale) => Intl.plural(n,
+String pluralNoZero(n, locale) => Intl.plural(n,
     locale: locale,
     name: 'plural',
     desc: 'A simple plural test case',
@@ -183,20 +183,20 @@
     many: '$n:Many',
     other: '$n:Other');
 
-main() {
+void main() {
   verify(expectedRu, 'ru', plural);
   verify(expectedRu, 'ru_RU', plural);
   verify(expectedEn, 'en', plural);
   verify(expectedRo, 'ro', pluralNoZero);
   verify(expectedSr, 'sr', pluralNoZero);
 
-  test("Check null howMany", () {
-    expect(plural(0, null), "0:Zero");
+  test('Check null howMany', () {
+    expect(plural(0, null), '0:Zero');
     expect(() => plural(null, null), throwsArgumentError);
-    expect(() => plural(null, "ru"), throwsArgumentError);
+    expect(() => plural(null, 'ru'), throwsArgumentError);
   });
 
-  verify_with_precision('1 dollar', 'en', 1, 0);
+  verifyWithPrecision('1 dollar', 'en', 1, 0);
   // This would not work in back-compatibility for one vs. =1 in plurals,
   // because of this test in intl.dart:
   //    if (howMany == 1 && one != null) return one;
@@ -204,14 +204,14 @@
   // test below requires the result to be 'other'
   // verify_with_precision('1.00 dollars', 'en', 1, 2);
 
-  verify_with_precision('1 dollar', 'en', 1.2, 0);
-  verify_with_precision('1.20 dollars', 'en', 1.2, 2);
+  verifyWithPrecision('1 dollar', 'en', 1.2, 0);
+  verifyWithPrecision('1.20 dollars', 'en', 1.2, 2);
 
-  verify_with_precision('3 dollars', 'en', 3.14, 0);
-  verify_with_precision('3.14 dollars', 'en', 3.14, 2);
+  verifyWithPrecision('3 dollars', 'en', 3.14, 0);
+  verifyWithPrecision('3.14 dollars', 'en', 3.14, 2);
 }
 
-verify(String expectedValues, String locale, pluralFunction) {
+void verify(String expectedValues, String locale, pluralFunction) {
   var lines = expectedValues.split('\n').where((x) => x.isNotEmpty).toList();
   for (var i = 0; i < lines.length; i++) {
     test(lines[i], () {
@@ -221,7 +221,7 @@
   }
 }
 
-verify_with_precision(String expected, String locale, num n, int precision) {
+void verifyWithPrecision(String expected, String locale, num n, int precision) {
   test('verify_with_precision(howMany: $n, precision: $precision)', () {
     var nString = n.toStringAsFixed(precision);
     var actual = Intl.plural(n,
diff --git a/test/scorbeysund_timezone_test.dart b/test/scorbeysund_timezone_test.dart
index 127dc1d..873b75d 100644
--- a/test/scorbeysund_timezone_test.dart
+++ b/test/scorbeysund_timezone_test.dart
@@ -17,6 +17,6 @@
 import 'package:test/test.dart';
 import 'timezone_test_core.dart';
 
-main() {
+void main() {
   testTimezone('America/Scoresbysund', expectedUtcOffset: -1);
 }
diff --git a/test/timezone_local_even_test_helper.dart b/test/timezone_local_even_test_helper.dart
index cd06423..7df4ea6 100644
--- a/test/timezone_local_even_test_helper.dart
+++ b/test/timezone_local_even_test_helper.dart
@@ -9,19 +9,20 @@
 
 import 'dart:io';
 
-import 'date_time_format_test_stub.dart';
 import 'package:intl/date_symbol_data_local.dart';
 import 'package:test/test.dart';
 
-main() {
+import 'date_time_format_test_stub.dart';
+
+void main() {
   var tzOffset = Platform.environment['EXPECTED_TZ_OFFSET_FOR_TEST'];
   var timezoneName = Platform.environment['TZ'];
   if (tzOffset != null) {
-    test("Actually running in the correct time zone: $timezoneName", () {
+    test('Actually running in the correct time zone: $timezoneName', () {
       // Pick a constant Date so that the offset is known.
-      var d = new DateTime(2012, 1, 1, 7, 6, 5);
-      print("Time zone offset is ${d.timeZoneOffset.inHours}");
-      print("Time zone name is ${d.timeZoneName}");
+      var d = DateTime(2012, 1, 1, 7, 6, 5);
+      print('Time zone offset is ${d.timeZoneOffset.inHours}');
+      print('Time zone name is ${d.timeZoneName}');
       expect(tzOffset, '${d.timeZoneOffset.inHours}');
     });
   }
diff --git a/test/timezone_test_core.dart b/test/timezone_test_core.dart
index 6b02564..14f3188 100644
--- a/test/timezone_test_core.dart
+++ b/test/timezone_test_core.dart
@@ -3,9 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// Test date formatting and parsing while the system time zone is set.
-import 'package:test/test.dart';
-import 'dart:io';
 import 'dart:convert';
+import 'dart:io';
+import 'package:test/test.dart';
 
 /// The VM arguments we were given, most importantly package-root.
 final vmArgs = Platform.executableArguments;
@@ -15,8 +15,8 @@
 /// Test for a particular timezone. In order to verify that we are in fact
 /// running in that time zone, verify that the DateTime offset is one of the
 /// expected values.
-testTimezone(String timezoneName, {int expectedUtcOffset}) {
-  // Define the environment variable "PACKAGE_DIR=<directory>" to indicate the
+void testTimezone(String timezoneName, {int expectedUtcOffset}) {
+  // Define the environment variable 'PACKAGE_DIR=<directory>' to indicate the
   // root of the Intl package. If it is not provided, we assume that the root of
   // the Intl package is the current directory.
   var packageDir = Platform.environment['PACKAGE_DIR'];
@@ -24,8 +24,8 @@
   var fileToSpawn =
       packageDir == null ? packageRelative : '$packageDir/$packageRelative';
 
-  test("Run tests in $timezoneName time zone", () async {
-    List<String> args = []
+  test('Run tests in $timezoneName time zone', () async {
+    var args = <String>[]
       ..addAll(vmArgs)
       ..add(fileToSpawn);
     var environment = <String, String>{'TZ': timezoneName};
@@ -33,18 +33,18 @@
       environment['EXPECTED_TZ_OFFSET_FOR_TEST'] = '$expectedUtcOffset';
     }
     var result = await Process.run(dart, args,
-        stdoutEncoding: new Utf8Codec(),
-        stderrEncoding: new Utf8Codec(),
+        stdoutEncoding: const Utf8Codec(),
+        stderrEncoding: const Utf8Codec(),
         includeParentEnvironment: true,
         environment: environment);
     // Because the actual tests are run in a spawned parocess their output isn't
     // directly visible here. To debug, it's necessary to look at the output of
     // that test, so we print it here for convenience.
-    print("Spawning test to run in the $timezoneName time zone. Stderr is:");
+    print('Spawning test to run in the $timezoneName time zone. Stderr is:');
     print(result.stderr);
-    print("Spawned test in $timezoneName time zone has Stdout:");
+    print('Spawned test in $timezoneName time zone has Stdout:');
     print(result.stdout);
     expect(result.exitCode, 0,
-        reason: "Spawned test failed. See the test log from stderr to debug");
+        reason: 'Spawned test failed. See the test log from stderr to debug');
   }, testOn: 'linux && vm');
 }
diff --git a/test/utc_timezone_test.dart b/test/utc_timezone_test.dart
index 43d6fb5..7c7d494 100644
--- a/test/utc_timezone_test.dart
+++ b/test/utc_timezone_test.dart
@@ -14,6 +14,6 @@
 import 'package:test/test.dart';
 import 'timezone_test_core.dart';
 
-main() {
+void main() {
   testTimezone('UTC', expectedUtcOffset: 0);
 }
diff --git a/tool/generate_locale_data_files.dart b/tool/generate_locale_data_files.dart
index 498d405..2f6a575 100644
--- a/tool/generate_locale_data_files.dart
+++ b/tool/generate_locale_data_files.dart
@@ -6,27 +6,26 @@
 /// are locale names and write it into individual JSON files named by locale.
 /// This should be run any time the locale data changes.
 ///
-/// The files are written under "data/dates", in two subdirectories, "symbols"
-/// and "patterns". In "data/dates" it will also generate "locale_list.dart",
+/// The files are written under 'data/dates', in two subdirectories, 'symbols'
+/// and 'patterns'. In 'data/dates' it will also generate 'locale_list.dart',
 /// which is sourced by the date_symbol_data... files.
-
+import 'dart:convert';
+import 'dart:io';
 import 'package:intl/date_symbol_data_local.dart';
 import 'package:intl/date_time_patterns.dart';
 import 'package:intl/intl.dart';
-import 'dart:convert';
-import 'dart:io';
-import '../test/data_directory.dart';
 import 'package:path/path.dart' as path;
+import '../test/data_directory.dart';
 
-main() {
-  initializeDateFormatting("en_IGNORED", null);
+void main() {
+  initializeDateFormatting('en_IGNORED', null);
   writeSymbolData();
   writePatternData();
   writeLocaleList();
 }
 
 void writeLocaleList() {
-  var file = new File(path.join(dataDirectory, 'locale_list.dart'));
+  var file = File(path.join(dataDirectory, 'locale_list.dart'));
   var output = file.openWrite();
   output.write(
       '// Copyright (c) 2012, the Dart project authors.  Please see the '
@@ -35,42 +34,40 @@
       ' LICENSE file.\n\n'
       '/// Hard-coded list of all available locales for dates.\n');
   output.write('final availableLocalesForDateFormatting = const [');
-  List<String> allLocales = DateFormat.allLocalesWithSymbols();
-  allLocales.forEach((locale) {
-    output.write('"$locale"');
+  var allLocales = DateFormat.allLocalesWithSymbols();
+  for (var locale in allLocales) {
+    output.write("'$locale'");
     if (locale == allLocales.last) {
       output.write('];');
     } else {
       output.write(',\n    ');
     }
-  });
+  }
   output.close();
 }
 
 void writeSymbolData() {
-  dateTimeSymbolMap()
-      .forEach((locale, symbols) => writeSymbols(locale, symbols));
+  dateTimeSymbolMap().forEach(writeSymbols);
 }
 
 void writePatternData() {
-  dateTimePatternMap()
-      .forEach((locale, patterns) => writePatterns(locale, patterns));
+  dateTimePatternMap().forEach(writePatterns);
 }
 
 void writeSymbols(locale, symbols) {
-  var file = new File(path.join(dataDirectory, 'symbols', '${locale}.json'));
+  var file = File(path.join(dataDirectory, 'symbols', '$locale.json'));
   var output = file.openWrite();
   writeToJSON(symbols, output);
   output.close();
 }
 
 void writePatterns(locale, patterns) {
-  var file = new File(path.join(dataDirectory, 'patterns', '${locale}.json'));
+  var file = File(path.join(dataDirectory, 'patterns', '$locale.json'));
   file.openWrite()
-    ..write(new JsonCodec().encode(patterns))
+    ..write(json.encode(patterns))
     ..close();
 }
 
 void writeToJSON(dynamic data, IOSink out) {
-  out.write(new JsonCodec().encode(data.serializeToMap()));
+  out.write(json.encode(data.serializeToMap()));
 }
