diff --git a/.gitignore b/.gitignore
index a6867f2..79f51c3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,14 +1,3 @@
-# Don’t commit the following directories created by pub.
-.pub/
-build/
-packages
+.dart_tool
 .packages
-
-# Or the files created by dart2js.
-*.dart.js
-*.js_
-*.js.deps
-*.js.map
-
-# Include when developing application packages.
 pubspec.lock
diff --git a/.travis.yml b/.travis.yml
index afad71a..8681e29 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,16 +1,20 @@
 language: dart
 
 dart:
+  - 2.0.0
   - dev
 
 dart_task:
   - test: --platform vm
   - test: --platform firefox -j 1
-  - dartanalyzer
 
 matrix:
   include:
     - dart: dev
+      dartanalyzer: --fatal-infos --fatal-warnings .
+    - dart: stable
+      dartanalyzer: --fatal-warnings .
+    - dart: dev
       dart_task: dartfmt
 
 # Only building master means that we don't run two builds for each pull request.
diff --git a/analysis_options.yaml b/analysis_options.yaml
new file mode 100644
index 0000000..9d14291
--- /dev/null
+++ b/analysis_options.yaml
@@ -0,0 +1,9 @@
+include: package:pedantic/analysis_options.yaml
+
+linter:
+  rules:
+  - prefer_equal_for_default_values
+  - prefer_generic_function_type_aliases
+  - slash_for_doc_comments
+  - unnecessary_const
+  - unnecessary_new
diff --git a/bin/css.dart b/bin/css.dart
index f64faac..1aae7a8 100644
--- a/bin/css.dart
+++ b/bin/css.dart
@@ -3,6 +3,7 @@
 // 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.
 
+// ignore: deprecated_member_use_from_same_package
 import 'package:csslib/css.dart' as css;
 
 void main(List<String> args) => css.main(args);
diff --git a/example/call_parser.dart b/example/call_parser.dart
index fc6b33c..fc299d9 100644
--- a/example/call_parser.dart
+++ b/example/call_parser.dart
@@ -4,7 +4,7 @@
 import 'package:csslib/parser.dart' as css;
 import 'package:csslib/visitor.dart';
 
-const _default = const css.PreprocessorOptions(
+const _default = css.PreprocessorOptions(
     useColors: false,
     checked: true,
     warningsAsErrors: true,
@@ -20,7 +20,7 @@
 }
 
 // Pretty printer for CSS.
-var emitCss = new CssPrinter();
+var emitCss = CssPrinter();
 String prettyPrint(StyleSheet ss) =>
     (emitCss..visitTree(ss, pretty: true)).toString();
 
diff --git a/lib/css.dart b/lib/css.dart
index f47b4f1..ac6510b 100644
--- a/lib/css.dart
+++ b/lib/css.dart
@@ -20,7 +20,7 @@
   var options = _parseOptions(arguments);
   if (options == null) return;
 
-  messages = new Messages(options: options);
+  messages = Messages(options: options);
 
   _time('Total time spent on ${options.inputFile}', () {
     _compile(options.inputFile, options.verbose);
@@ -36,24 +36,24 @@
   try {
     // Read the file.
     var filename = path.basename(inputPath);
-    var contents = new File(inputPath).readAsStringSync();
-    var file = new SourceFile.fromString(contents, url: path.toUri(inputPath));
+    var contents = File(inputPath).readAsStringSync();
+    var file = SourceFile.fromString(contents, url: path.toUri(inputPath));
 
     // Parse the CSS.
-    StyleSheet tree = _time(
-        'Parse $filename', () => new Parser(file, contents).parse(), verbose);
+    StyleSheet tree =
+        _time('Parse $filename', () => Parser(file, contents).parse(), verbose);
 
-    _time('Analyzer $filename', () => new Analyzer([tree], messages), verbose)
+    _time('Analyzer $filename', () => Analyzer([tree], messages), verbose)
         .run();
 
     // Emit the processed CSS.
-    var emitter = new CssPrinter();
+    var emitter = CssPrinter();
     _time('Codegen $filename', () => emitter.visitTree(tree, pretty: true),
         verbose);
 
     // Write the contents to a file.
     var outPath = path.join(path.dirname(inputPath), '_$filename');
-    new File(outPath).writeAsStringSync(emitter.toString());
+    File(outPath).writeAsStringSync(emitter.toString());
   } catch (e) {
     messages.error('error processing $inputPath. Original message:\n $e', null);
   }
@@ -61,7 +61,7 @@
 
 T _time<T>(String message, T Function() callback, bool printTime) {
   if (!printTime) return callback();
-  final watch = new Stopwatch();
+  final watch = Stopwatch();
   watch.start();
   var result = callback();
   watch.stop();
@@ -71,7 +71,7 @@
 }
 
 void _printMessage(String message, int duration) {
-  var buf = new StringBuffer();
+  var buf = StringBuffer();
   buf.write(message);
   for (int i = message.length; i < 60; i++) buf.write(' ');
   buf.write(' -- ');
@@ -81,7 +81,7 @@
   print(buf.toString());
 }
 
-PreprocessorOptions _fromArgs(ArgResults args) => new PreprocessorOptions(
+PreprocessorOptions _fromArgs(ArgResults args) => PreprocessorOptions(
     warningsAsErrors: args['warnings_as_errors'],
     throwOnWarnings: args['throw_on_warnings'],
     throwOnErrors: args['throw_on_errors'],
@@ -90,11 +90,11 @@
     lessSupport: args['less'],
     useColors: args['colors'],
     polyfill: args['polyfill'],
-    inputFile: args.rest.length > 0 ? args.rest[0] : null);
+    inputFile: args.rest.isNotEmpty ? args.rest[0] : null);
 
 // tool.dart [options...] <css file>
 PreprocessorOptions _parseOptions(List<String> arguments) {
-  var parser = new ArgParser()
+  var parser = ArgParser()
     ..addFlag('verbose',
         abbr: 'v',
         defaultsTo: false,
@@ -128,7 +128,7 @@
 
   try {
     var results = parser.parse(arguments);
-    if (results['help'] || results.rest.length == 0) {
+    if (results['help'] || results.rest.isEmpty) {
       _showUsage(parser);
       return null;
     }
diff --git a/lib/parser.dart b/lib/parser.dart
index 511f204..7680683 100644
--- a/lib/parser.dart
+++ b/lib/parser.dart
@@ -43,10 +43,10 @@
   if (errors == null) errors = [];
 
   if (options == null) {
-    options = new PreprocessorOptions(useColors: false, inputFile: 'memory');
+    options = PreprocessorOptions(useColors: false, inputFile: 'memory');
   }
 
-  messages = new Messages(options: options, printHandler: errors.add);
+  messages = Messages(options: options, printHandler: errors.add);
 }
 
 /// CSS checked mode enabled.
@@ -57,9 +57,9 @@
 StyleSheet compile(input,
     {List<Message> errors,
     PreprocessorOptions options,
-    bool nested: true,
-    bool polyfill: false,
-    List<StyleSheet> includes: null}) {
+    bool nested = true,
+    bool polyfill = false,
+    List<StyleSheet> includes}) {
   if (includes == null) {
     includes = [];
   }
@@ -68,14 +68,14 @@
 
   _createMessages(errors: errors, options: options);
 
-  var file = new SourceFile.fromString(source);
+  var file = SourceFile.fromString(source);
 
-  var tree = new _Parser(file, source).parse();
+  var tree = _Parser(file, source).parse();
 
   analyze([tree], errors: errors, options: options);
 
   if (polyfill) {
-    var processCss = new PolyFill(messages);
+    var processCss = PolyFill(messages);
     processCss.process(tree, includes: includes);
   }
 
@@ -86,7 +86,7 @@
 void analyze(List<StyleSheet> styleSheets,
     {List<Message> errors, PreprocessorOptions options}) {
   _createMessages(errors: errors, options: options);
-  new Analyzer(styleSheets, messages).run();
+  Analyzer(styleSheets, messages).run();
 }
 
 /// Parse the [input] CSS stylesheet into a tree. The [input] can be a [String],
@@ -97,8 +97,8 @@
 
   _createMessages(errors: errors, options: options);
 
-  var file = new SourceFile.fromString(source);
-  return new _Parser(file, source).parse();
+  var file = SourceFile.fromString(source);
+  return _Parser(file, source).parse();
 }
 
 /// Parse the [input] CSS selector into a tree. The [input] can be a [String],
@@ -110,9 +110,8 @@
 
   _createMessages(errors: errors);
 
-  var file = new SourceFile.fromString(source);
-  return (new _Parser(file, source)..tokenizer.inSelector = true)
-      .parseSelector();
+  var file = SourceFile.fromString(source);
+  return (_Parser(file, source)..tokenizer.inSelector = true).parseSelector();
 }
 
 SelectorGroup parseSelectorGroup(input, {List<Message> errors}) {
@@ -120,8 +119,8 @@
 
   _createMessages(errors: errors);
 
-  var file = new SourceFile.fromString(source);
-  return (new _Parser(file, source)
+  var file = SourceFile.fromString(source);
+  return (_Parser(file, source)
         // TODO(jmesserly): this fix should be applied to the parser. It's
         // tricky because by the time the flag is set one token has already
         // been fetched.
@@ -149,10 +148,10 @@
     // See encoding helpers at: package:html5lib/lib/src/char_encodings.dart
     // These helpers can decode in different formats given an encoding name
     // (mostly unicode, ascii, windows-1252 which is html5 default encoding).
-    source = new String.fromCharCodes(input as List<int>);
+    source = String.fromCharCodes(input as List<int>);
   } else {
     // TODO(terry): Support RandomAccessFile using console.
-    throw new ArgumentError("'source' must be a String or "
+    throw ArgumentError("'source' must be a String or "
         "List<int> (of bytes). RandomAccessFile not supported from this "
         "simple interface");
   }
@@ -168,14 +167,14 @@
 
   // TODO(jmesserly): having file and text is redundant.
   // TODO(rnystrom): baseUrl isn't used. Remove from API.
-  Parser(SourceFile file, String text, {int start: 0, String baseUrl})
-      : _parser = new _Parser(file, text, start: start);
+  Parser(SourceFile file, String text, {int start = 0, String baseUrl})
+      : _parser = _Parser(file, text, start: start);
 
   StyleSheet parse() => _parser.parse();
 }
 
 // CSS2.1 pseudo-elements which were defined with a single ':'.
-final _legacyPseudoElements = new Set<String>.from(const [
+final _legacyPseudoElements = Set<String>.from(const [
   'after',
   'before',
   'first-letter',
@@ -193,9 +192,9 @@
   Token _previousToken;
   Token _peekToken;
 
-  _Parser(SourceFile file, String text, {int start: 0})
+  _Parser(SourceFile file, String text, {int start = 0})
       : this.file = file,
-        tokenizer = new Tokenizer(file, text, true, start) {
+        tokenizer = Tokenizer(file, text, true, start) {
     _peekToken = tokenizer.next();
   }
 
@@ -216,7 +215,7 @@
 
     checkEndOfFile();
 
-    return new StyleSheet(productions, _makeSpan(start));
+    return StyleSheet(productions, _makeSpan(start));
   }
 
   /// Main entry point for parsing a simple selector sequence.
@@ -233,7 +232,7 @@
 
     checkEndOfFile();
 
-    return new StyleSheet.selector(productions, _makeSpan(start));
+    return StyleSheet.selector(productions, _makeSpan(start));
   }
 
   /// Generate an error if [file] has not been completely consumed.
@@ -264,7 +263,7 @@
     return _peekToken.kind;
   }
 
-  Token _next({bool unicodeRange: false}) {
+  Token _next({bool unicodeRange = false}) {
     _previousToken = _peekToken;
     _peekToken = tokenizer.next(unicodeRange: unicodeRange);
     return _previousToken;
@@ -280,8 +279,7 @@
   }
 
   /// Marks the parser/tokenizer look ahead to support Less nested selectors.
-  ParserState get _mark =>
-      new ParserState(_peekToken, _previousToken, tokenizer);
+  ParserState get _mark => ParserState(_peekToken, _previousToken, tokenizer);
 
   /// Restores the parser/tokenizer state to state remembered by _mark.
   void _restore(ParserState markedData) {
@@ -290,7 +288,7 @@
     _previousToken = markedData.previousToken;
   }
 
-  bool _maybeEat(int kind, {bool unicodeRange: false}) {
+  bool _maybeEat(int kind, {bool unicodeRange = false}) {
     if (_peekToken.kind == kind) {
       _previousToken = _peekToken;
       _peekToken = tokenizer.next(unicodeRange: unicodeRange);
@@ -300,7 +298,7 @@
     }
   }
 
-  void _eat(int kind, {bool unicodeRange: false}) {
+  void _eat(int kind, {bool unicodeRange = false}) {
     if (!_maybeEat(kind, unicodeRange: unicodeRange)) {
       _errorExpected(TokenKind.kindToString(kind));
     }
@@ -421,8 +419,8 @@
       exprs.add(expr);
     }
 
-    if (unaryOp != -1 || type != null || exprs.length > 0) {
-      return new MediaQuery(unaryOp, type, exprs, _makeSpan(start));
+    if (unaryOp != -1 || type != null || exprs.isNotEmpty) {
+      return MediaQuery(unaryOp, type, exprs, _makeSpan(start));
     }
     return null;
   }
@@ -436,10 +434,9 @@
         var feature = identifier(); // Media feature.
         var exprs = _maybeEat(TokenKind.COLON)
             ? processExpr()
-            : new Expressions(_makeSpan(_peekToken.span));
+            : Expressions(_makeSpan(_peekToken.span));
         if (_maybeEat(TokenKind.RPAREN)) {
-          return new MediaExpression(
-              andOperator, feature, exprs, _makeSpan(start));
+          return MediaExpression(andOperator, feature, exprs, _makeSpan(start));
         } else if (isChecked) {
           _warning(
               "Missing parenthesis around media expression", _makeSpan(start));
@@ -500,7 +497,7 @@
           _error('missing import string', _peekToken.span);
         }
 
-        return new ImportDirective(importStr.trim(), medias, _makeSpan(start));
+        return ImportDirective(importStr.trim(), medias, _makeSpan(start));
 
       case TokenKind.DIRECTIVE_MEDIA:
         _next();
@@ -522,7 +519,7 @@
         } else {
           _error('expected { after media before ruleset', _peekToken.span);
         }
-        return new MediaDirective(media, rules, _makeSpan(start));
+        return MediaDirective(media, rules, _makeSpan(start));
 
       case TokenKind.DIRECTIVE_HOST:
         _next();
@@ -541,7 +538,7 @@
         } else {
           _error('expected { after host before ruleset', _peekToken.span);
         }
-        return new HostDirective(rules, _makeSpan(start));
+        return HostDirective(rules, _makeSpan(start));
 
       case TokenKind.DIRECTIVE_PAGE:
         // @page S* IDENT? pseudo_page?
@@ -585,7 +582,7 @@
 
         String pseudoName = pseudoPage is Identifier ? pseudoPage.name : '';
         String ident = name is Identifier ? name.name : '';
-        return new PageDirective(
+        return PageDirective(
             ident, pseudoName, processMarginsDeclarations(), _makeSpan(start));
 
       case TokenKind.DIRECTIVE_CHARSET:
@@ -598,7 +595,7 @@
           _warning('missing character encoding string', _makeSpan(start));
         }
 
-        return new CharsetDirective(charEncoding, _makeSpan(start));
+        return CharsetDirective(charEncoding, _makeSpan(start));
 
       // TODO(terry): Workaround Dart2js bug continue not implemented in switch
       //              see https://code.google.com/p/dart/issues/detail?id=8270
@@ -647,10 +644,10 @@
 
         _eat(TokenKind.LBRACE);
 
-        var keyframe = new KeyFrameDirective(tokId, name, _makeSpan(start));
+        var keyframe = KeyFrameDirective(tokId, name, _makeSpan(start));
 
         do {
-          Expressions selectors = new Expressions(_makeSpan(start));
+          Expressions selectors = Expressions(_makeSpan(start));
 
           do {
             var term = processTerm();
@@ -660,7 +657,7 @@
             selectors.add(term);
           } while (_maybeEat(TokenKind.COMMA));
 
-          keyframe.add(new KeyFrameBlock(
+          keyframe.add(KeyFrameBlock(
               selectors, processDeclarations(), _makeSpan(start)));
         } while (!_maybeEat(TokenKind.RBRACE) && !isPrematureEndOfFile());
 
@@ -668,7 +665,7 @@
 
       case TokenKind.DIRECTIVE_FONTFACE:
         _next();
-        return new FontFaceDirective(processDeclarations(), _makeSpan(start));
+        return FontFaceDirective(processDeclarations(), _makeSpan(start));
 
       case TokenKind.DIRECTIVE_STYLET:
         // Stylet grammar:
@@ -698,7 +695,7 @@
 
         _eat(TokenKind.RBRACE);
 
-        return new StyletDirective(name, productions, _makeSpan(start));
+        return StyletDirective(name, productions, _makeSpan(start));
 
       case TokenKind.DIRECTIVE_NAMESPACE:
         // Namespace grammar:
@@ -733,7 +730,7 @@
           }
         }
 
-        return new NamespaceDirective(
+        return NamespaceDirective(
             prefix != null ? prefix.name : '', namespaceUri, _makeSpan(start));
 
       case TokenKind.DIRECTIVE_MIXIN:
@@ -812,7 +809,7 @@
           // If declGroup has items that are declarations then we assume
           // this mixin is a declaration mixin not a top-level mixin.
           if (include is IncludeDirective) {
-            newDecls.add(new IncludeMixinAtDeclaration(include, include.span));
+            newDecls.add(IncludeMixinAtDeclaration(include, include.span));
           } else {
             _warning("Error mixing of top-level vs declarations mixins",
                 _makeSpan(include.span));
@@ -834,7 +831,7 @@
 
       if (declGroup.declarations.isNotEmpty) {
         if (productions.isEmpty) {
-          mixinDirective = new MixinDeclarationDirective(
+          mixinDirective = MixinDeclarationDirective(
               name.name, params, false, declGroup, _makeSpan(start));
           break;
         } else {
@@ -844,14 +841,14 @@
           }
         }
       } else {
-        mixinDirective = new MixinRulesetDirective(
+        mixinDirective = MixinRulesetDirective(
             name.name, params, false, productions, _makeSpan(start));
         break;
       }
     }
 
     if (productions.isNotEmpty) {
-      mixinDirective = new MixinRulesetDirective(
+      mixinDirective = MixinRulesetDirective(
           name.name, params, false, productions, _makeSpan(start));
     }
 
@@ -863,7 +860,7 @@
   /// Returns a VarDefinitionDirective or VarDefinition if a varaible otherwise
   /// return the token id of a directive or -1 if neither.
   dynamic // VarDefinitionDirective | VarDefinition | int
-      processVariableOrDirective({bool mixinParameter: false}) {
+      processVariableOrDirective({bool mixinParameter = false}) {
     var start = _peekToken.span;
 
     var tokId = _peek();
@@ -902,8 +899,7 @@
           }
 
           var span = _makeSpan(start);
-          return new VarDefinitionDirective(
-              new VarDefinition(name, exprs, span), span);
+          return VarDefinitionDirective(VarDefinition(name, exprs, span), span);
         } else if (isChecked) {
           _error('unexpected directive @$_peekToken', _peekToken.span);
         }
@@ -918,13 +914,13 @@
         exprs = processExpr();
       }
 
-      return new VarDefinition(definedName, exprs, _makeSpan(start));
+      return VarDefinition(definedName, exprs, _makeSpan(start));
     }
 
     return tokId;
   }
 
-  IncludeDirective processInclude(SourceSpan span, {bool eatSemiColon: true}) {
+  IncludeDirective processInclude(SourceSpan span, {bool eatSemiColon = true}) {
     // Stylet grammar:
     //
     //     @include IDENT [(args,...)];
@@ -965,7 +961,7 @@
       _eat(TokenKind.SEMICOLON);
     }
 
-    return new IncludeDirective(name.name, params, span);
+    return IncludeDirective(name.name, params, span);
   }
 
   DocumentDirective processDocumentDirective() {
@@ -995,9 +991,9 @@
 
         _eat(TokenKind.RPAREN);
 
-        var arguments = new Expressions(_makeSpan(argumentSpan))
-          ..add(new LiteralTerm(argument, argument, argumentSpan));
-        function = new FunctionTerm(
+        var arguments = Expressions(_makeSpan(argumentSpan))
+          ..add(LiteralTerm(argument, argument, argumentSpan));
+        function = FunctionTerm(
             ident.name, ident.name, arguments, _makeSpan(ident.span));
       } else {
         function = processFunction(ident);
@@ -1009,7 +1005,7 @@
     _eat(TokenKind.LBRACE);
     var groupRuleBody = processGroupRuleBody();
     _eat(TokenKind.RBRACE);
-    return new DocumentDirective(functions, groupRuleBody, _makeSpan(start));
+    return DocumentDirective(functions, groupRuleBody, _makeSpan(start));
   }
 
   SupportsDirective processSupportsDirective() {
@@ -1019,7 +1015,7 @@
     _eat(TokenKind.LBRACE);
     var groupRuleBody = processGroupRuleBody();
     _eat(TokenKind.RBRACE);
-    return new SupportsDirective(condition, groupRuleBody, _makeSpan(start));
+    return SupportsDirective(condition, groupRuleBody, _makeSpan(start));
   }
 
   SupportsCondition processSupportsCondition() {
@@ -1057,9 +1053,9 @@
     }
 
     if (clauseType == ClauseType.conjunction) {
-      return new SupportsConjunction(conditions, _makeSpan(start));
+      return SupportsConjunction(conditions, _makeSpan(start));
     } else if (clauseType == ClauseType.disjunction) {
-      return new SupportsDisjunction(conditions, _makeSpan(start));
+      return SupportsDisjunction(conditions, _makeSpan(start));
     } else {
       return conditions.first;
     }
@@ -1071,7 +1067,7 @@
     if (text != 'not') return null;
     _next(); // 'not'
     var condition = processSupportsConditionInParens();
-    return new SupportsNegation(condition, _makeSpan(start));
+    return SupportsNegation(condition, _makeSpan(start));
   }
 
   SupportsConditionInParens processSupportsConditionInParens() {
@@ -1081,19 +1077,19 @@
     var condition = processSupportsCondition();
     if (condition != null) {
       _eat(TokenKind.RPAREN);
-      return new SupportsConditionInParens.nested(condition, _makeSpan(start));
+      return SupportsConditionInParens.nested(condition, _makeSpan(start));
     }
     // Otherwise, parse a declaration.
     var declaration = processDeclaration([]);
     _eat(TokenKind.RPAREN);
-    return new SupportsConditionInParens(declaration, _makeSpan(start));
+    return SupportsConditionInParens(declaration, _makeSpan(start));
   }
 
   ViewportDirective processViewportDirective() {
     var start = _peekToken.span;
     var name = _next().text;
     var declarations = processDeclarations();
-    return new ViewportDirective(name, declarations, _makeSpan(start));
+    return ViewportDirective(name, declarations, _makeSpan(start));
   }
 
   TreeNode processRule([SelectorGroup selectorGroup]) {
@@ -1106,8 +1102,7 @@
       selectorGroup = processSelectorGroup();
     }
     if (selectorGroup != null) {
-      return new RuleSet(
-          selectorGroup, processDeclarations(), selectorGroup.span);
+      return RuleSet(selectorGroup, processDeclarations(), selectorGroup.span);
     }
     return null;
   }
@@ -1173,7 +1168,7 @@
     }
   }
 
-  DeclarationGroup processDeclarations({bool checkBrace: true}) {
+  DeclarationGroup processDeclarations({bool checkBrace = true}) {
     var start = _peekToken.span;
 
     if (checkBrace) _eat(TokenKind.LBRACE);
@@ -1220,14 +1215,14 @@
     // declarations.
     for (var decl in decls) {
       if (decl is Declaration) {
-        if (decl.hasDartStyle && dartStyles.indexOf(decl.dartStyle) < 0) {
+        if (decl.hasDartStyle && !dartStyles.contains(decl.dartStyle)) {
           // Dart style not live, ignore these styles in this Declarations.
           decl.dartStyle = null;
         }
       }
     }
 
-    return new DeclarationGroup(decls, _makeSpan(start));
+    return DeclarationGroup(decls, _makeSpan(start));
   }
 
   List<DeclarationGroup> processMarginsDeclarations() {
@@ -1270,7 +1265,7 @@
 
           var declGroup = processDeclarations();
           if (declGroup != null) {
-            groups.add(new MarginGroup(
+            groups.add(MarginGroup(
                 marginSym, declGroup.declarations, _makeSpan(start)));
           }
           break;
@@ -1304,14 +1299,14 @@
     // Fixup declaration to only have dartStyle that are live for this set of
     // declarations.
     for (var decl in decls) {
-      if (decl.hasDartStyle && dartStyles.indexOf(decl.dartStyle) < 0) {
+      if (decl.hasDartStyle && !dartStyles.contains(decl.dartStyle)) {
         // Dart style not live, ignore these styles in this Declarations.
         decl.dartStyle = null;
       }
     }
 
-    if (decls.length > 0) {
-      groups.add(new DeclarationGroup(decls, _makeSpan(start)));
+    if (decls.isNotEmpty) {
+      groups.add(DeclarationGroup(decls, _makeSpan(start)));
     }
 
     return groups;
@@ -1328,8 +1323,8 @@
       }
     } while (_maybeEat(TokenKind.COMMA));
 
-    if (selectors.length > 0) {
-      return new SelectorGroup(selectors, _makeSpan(start));
+    if (selectors.isNotEmpty) {
+      return SelectorGroup(selectors, _makeSpan(start));
     }
     return null;
   }
@@ -1350,7 +1345,7 @@
 
     if (simpleSequences.isEmpty) return null;
 
-    return new Selector(simpleSequences, _makeSpan(start));
+    return Selector(simpleSequences, _makeSpan(start));
   }
 
   /// Same as [processSelector] but reports an error for each combinator.
@@ -1421,7 +1416,7 @@
 
     var span = _makeSpan(start);
     var simpleSel = thisOperator
-        ? new ElementSelector(new ThisOperator(span), span)
+        ? ElementSelector(ThisOperator(span), span)
         : simpleSelector();
     if (simpleSel == null &&
         (combinatorType == TokenKind.COMBINATOR_PLUS ||
@@ -1433,10 +1428,10 @@
       //    .foo&:hover     combinator before & is NONE
       //    .foo &          combinator before & is DESCDENDANT
       //    .foo > &        combinator before & is GREATER
-      simpleSel = new ElementSelector(new Identifier("", span), span);
+      simpleSel = ElementSelector(Identifier("", span), span);
     }
     if (simpleSel != null) {
-      return new SimpleSelectorSequence(simpleSel, span, combinatorType);
+      return SimpleSelectorSequence(simpleSel, span, combinatorType);
     }
     return null;
   }
@@ -1469,7 +1464,7 @@
       case TokenKind.ASTERISK:
         // Mark as universal namespace.
         var tok = _next();
-        first = new Wildcard(_makeSpan(tok.span));
+        first = Wildcard(_makeSpan(tok.span));
         break;
       case TokenKind.IDENTIFIER:
         first = identifier();
@@ -1492,7 +1487,7 @@
         case TokenKind.ASTERISK:
           // Mark as universal element
           var tok = _next();
-          element = new Wildcard(_makeSpan(tok.span));
+          element = Wildcard(_makeSpan(tok.span));
           break;
         case TokenKind.IDENTIFIER:
           element = identifier();
@@ -1503,10 +1498,10 @@
           break;
       }
 
-      return new NamespaceSelector(
-          first, new ElementSelector(element, element.span), _makeSpan(start));
+      return NamespaceSelector(
+          first, ElementSelector(element, element.span), _makeSpan(start));
     } else if (first != null) {
-      return new ElementSelector(first, _makeSpan(start));
+      return ElementSelector(first, _makeSpan(start));
     } else {
       // Check for HASH | class | attrib | pseudo | negation
       return simpleSelectorTail();
@@ -1544,7 +1539,7 @@
             // Generate bad selector id (normalized).
             id.name = " ${id.name}";
           }
-          return new IdSelector(id, _makeSpan(start));
+          return IdSelector(id, _makeSpan(start));
         }
         return null;
       case TokenKind.DOT:
@@ -1561,7 +1556,7 @@
           // Generate bad selector class (normalized).
           id.name = " ${id.name}";
         }
-        return new ClassSelector(id, _makeSpan(start));
+        return ClassSelector(id, _makeSpan(start));
       case TokenKind.COLON:
         // :pseudo-class ::pseudo-element
         return processPseudoSelector(start);
@@ -1602,7 +1597,7 @@
         var negArg = simpleSelector();
 
         _eat(TokenKind.RPAREN);
-        return new NegationSelector(negArg, _makeSpan(start));
+        return NegationSelector(negArg, _makeSpan(start));
       } else if (!pseudoElement && (name == 'host' || name == 'host-context')) {
         _eat(TokenKind.LPAREN);
         var selector = processCompoundSelector();
@@ -1612,7 +1607,7 @@
         }
         _eat(TokenKind.RPAREN);
         var span = _makeSpan(start);
-        return new PseudoClassFunctionSelector(pseudoName, selector, span);
+        return PseudoClassFunctionSelector(pseudoName, selector, span);
       } else {
         // Special parsing for expressions in pseudo functions.  Minus is used
         // as operator not identifier.
@@ -1633,8 +1628,8 @@
         if (expr is SelectorExpression) {
           _eat(TokenKind.RPAREN);
           return (pseudoElement)
-              ? new PseudoElementFunctionSelector(pseudoName, expr, span)
-              : new PseudoClassFunctionSelector(pseudoName, expr, span);
+              ? PseudoElementFunctionSelector(pseudoName, expr, span)
+              : PseudoClassFunctionSelector(pseudoName, expr, span);
         } else {
           _errorExpected("CSS expression");
           return null;
@@ -1645,9 +1640,9 @@
     // Treat CSS2.1 pseudo-elements defined with pseudo class syntax as pseudo-
     // elements for backwards compatibility.
     return pseudoElement || _legacyPseudoElements.contains(name)
-        ? new PseudoElementSelector(pseudoName, _makeSpan(start),
+        ? PseudoElementSelector(pseudoName, _makeSpan(start),
             isLegacy: !pseudoElement)
-        : new PseudoClassSelector(pseudoName, _makeSpan(start));
+        : PseudoClassSelector(pseudoName, _makeSpan(start));
   }
 
   /// In CSS3, the expressions are identifiers, strings, or of the form "an+b".
@@ -1672,12 +1667,12 @@
         case TokenKind.PLUS:
           start = _peekToken.span;
           termToken = _next();
-          expressions.add(new OperatorPlus(_makeSpan(start)));
+          expressions.add(OperatorPlus(_makeSpan(start)));
           break;
         case TokenKind.MINUS:
           start = _peekToken.span;
           termToken = _next();
-          expressions.add(new OperatorMinus(_makeSpan(start)));
+          expressions.add(OperatorMinus(_makeSpan(start)));
           break;
         case TokenKind.INTEGER:
           termToken = _next();
@@ -1690,11 +1685,11 @@
         case TokenKind.SINGLE_QUOTE:
           value = processQuotedString(false);
           value = "'${_escapeString(value, single: true)}'";
-          return new LiteralTerm(value, value, _makeSpan(start));
+          return LiteralTerm(value, value, _makeSpan(start));
         case TokenKind.DOUBLE_QUOTE:
           value = processQuotedString(false);
           value = '"${_escapeString(value)}"';
-          return new LiteralTerm(value, value, _makeSpan(start));
+          return LiteralTerm(value, value, _makeSpan(start));
         case TokenKind.IDENTIFIER:
           value = identifier(); // Snarf up the ident we'll remap, maybe.
           break;
@@ -1709,7 +1704,7 @@
           unitTerm = processDimension(termToken, value, _makeSpan(start));
         }
         if (unitTerm == null) {
-          unitTerm = new LiteralTerm(value, value.name, _makeSpan(start));
+          unitTerm = LiteralTerm(value, value.name, _makeSpan(start));
         }
         expressions.add(unitTerm);
 
@@ -1717,7 +1712,7 @@
       }
     }
 
-    return new SelectorExpression(expressions, _makeSpan(start));
+    return SelectorExpression(expressions, _makeSpan(start));
   }
 
   // Attribute grammar:
@@ -1774,7 +1769,7 @@
 
       _eat(TokenKind.RBRACK);
 
-      return new AttributeSelector(attrName, op, value, _makeSpan(start));
+      return AttributeSelector(attrName, op, value, _makeSpan(start));
     }
     return null;
   }
@@ -1817,8 +1812,7 @@
       // Handle !important (prio)
       var importantPriority = _maybeEat(TokenKind.IMPORTANT);
 
-      decl = new Declaration(
-          propertyIdent, exprs, dartComposite, _makeSpan(start),
+      decl = Declaration(propertyIdent, exprs, dartComposite, _makeSpan(start),
           important: importantPriority, ie7: ie7);
     } else if (_peekToken.kind == TokenKind.VAR_DEFINITION) {
       _next();
@@ -1829,12 +1823,12 @@
 
       Expressions exprs = processExpr();
 
-      decl = new VarDefinition(definedName, exprs, _makeSpan(start));
+      decl = VarDefinition(definedName, exprs, _makeSpan(start));
     } else if (_peekToken.kind == TokenKind.DIRECTIVE_INCLUDE) {
       // @include mixinName in the declaration area.
       var span = _makeSpan(start);
       var include = processInclude(span, eatSemiColon: false);
-      decl = new IncludeMixinAtDeclaration(include, span);
+      decl = IncludeMixinAtDeclaration(include, span);
     } else if (_peekToken.kind == TokenKind.DIRECTIVE_EXTEND) {
       var simpleSequences = <TreeNode>[];
 
@@ -1855,7 +1849,7 @@
           _warning("not a valid selector", span);
         }
       }
-      decl = new ExtendDeclaration(simpleSequences, span);
+      decl = ExtendDeclaration(simpleSequences, span);
     }
 
     return decl;
@@ -1892,7 +1886,7 @@
   static const int _paddingPartRight = 27;
   static const int _paddingPartBottom = 28;
 
-  static const Map<String, int> _stylesToDart = const {
+  static const Map<String, int> _stylesToDart = {
     'font': _fontPartFont,
     'font-family': _fontPartFamily,
     'font-size': _fontPartSize,
@@ -1924,7 +1918,7 @@
     'padding-bottom': _paddingPartBottom
   };
 
-  static const Map<String, int> _nameToFontWeight = const {
+  static const Map<String, int> _nameToFontWeight = {
     'bold': FontWeight.bold,
     'normal': FontWeight.normal
   };
@@ -1945,7 +1939,7 @@
     // Merge all font styles for this class selector.
     for (var dartStyle in dartStyles) {
       if (dartStyle.isFont) {
-        fontExpr = new FontExpression.merge(dartStyle, fontExpr);
+        fontExpr = FontExpression.merge(dartStyle, fontExpr);
       }
     }
 
@@ -1962,10 +1956,10 @@
       // The font-size and font-family values are required. If other values are
       // missing; a default, if it exist, will be used.
       case _fontPartFont:
-        var processor = new ExpressionsProcessor(exprs);
+        var processor = ExpressionsProcessor(exprs);
         return _mergeFontStyles(processor.processFont(), dartStyles);
       case _fontPartFamily:
-        var processor = new ExpressionsProcessor(exprs);
+        var processor = ExpressionsProcessor(exprs);
 
         try {
           return _mergeFontStyles(processor.processFontFamily(), dartStyles);
@@ -1974,7 +1968,7 @@
         }
         break;
       case _fontPartSize:
-        var processor = new ExpressionsProcessor(exprs);
+        var processor = ExpressionsProcessor(exprs);
         return _mergeFontStyles(processor.processFontSize(), dartStyles);
       case _fontPartStyle:
         // Possible style values:
@@ -2007,12 +2001,12 @@
         //              https://github.com/dart-lang/csslib/issues/1
         var expr = exprs.expressions[0];
         if (expr is NumberTerm) {
-          var fontExpr = new FontExpression(expr.span, weight: expr.value);
+          var fontExpr = FontExpression(expr.span, weight: expr.value);
           return _mergeFontStyles(fontExpr, dartStyles);
         } else if (expr is LiteralTerm) {
           int weight = _nameToFontWeight[expr.value.toString()];
           if (weight != null) {
-            var fontExpr = new FontExpression(expr.span, weight: weight);
+            var fontExpr = FontExpression(expr.span, weight: weight);
             return _mergeFontStyles(fontExpr, dartStyles);
           }
         }
@@ -2026,15 +2020,15 @@
             //              See https://github.com/dart-lang/csslib/issues/2.
             if (unitTerm.unit == TokenKind.UNIT_LENGTH_PX ||
                 unitTerm.unit == TokenKind.UNIT_LENGTH_PT) {
-              var fontExpr = new FontExpression(expr.span,
-                  lineHeight: new LineHeight(expr.value, inPixels: true));
+              var fontExpr = FontExpression(expr.span,
+                  lineHeight: LineHeight(expr.value, inPixels: true));
               return _mergeFontStyles(fontExpr, dartStyles);
             } else if (isChecked) {
               _warning("Unexpected unit for line-height", expr.span);
             }
           } else if (expr is NumberTerm) {
-            var fontExpr = new FontExpression(expr.span,
-                lineHeight: new LineHeight(expr.value, inPixels: false));
+            var fontExpr = FontExpression(expr.span,
+                lineHeight: LineHeight(expr.value, inPixels: false));
             return _mergeFontStyles(fontExpr, dartStyles);
           } else if (isChecked) {
             _warning("Unexpected value for line-height", expr.span);
@@ -2042,26 +2036,25 @@
         }
         break;
       case _marginPartMargin:
-        return new MarginExpression.boxEdge(exprs.span, processFourNums(exprs));
+        return MarginExpression.boxEdge(exprs.span, processFourNums(exprs));
       case _borderPartBorder:
         for (var expr in exprs.expressions) {
           var v = marginValue(expr);
           if (v != null) {
-            final box = new BoxEdge.uniform(v);
-            return new BorderExpression.boxEdge(exprs.span, box);
+            final box = BoxEdge.uniform(v);
+            return BorderExpression.boxEdge(exprs.span, box);
           }
         }
         break;
       case _borderPartWidth:
         var v = marginValue(exprs.expressions[0]);
         if (v != null) {
-          final box = new BoxEdge.uniform(v);
-          return new BorderExpression.boxEdge(exprs.span, box);
+          final box = BoxEdge.uniform(v);
+          return BorderExpression.boxEdge(exprs.span, box);
         }
         break;
       case _paddingPartPadding:
-        return new PaddingExpression.boxEdge(
-            exprs.span, processFourNums(exprs));
+        return PaddingExpression.boxEdge(exprs.span, processFourNums(exprs));
       case _marginPartLeft:
       case _marginPartTop:
       case _marginPartRight:
@@ -2080,7 +2073,7 @@
       case _paddingPartTop:
       case _paddingPartRight:
       case _paddingPartBottom:
-        if (exprs.expressions.length > 0) {
+        if (exprs.expressions.isNotEmpty) {
           return processOneNumber(exprs, styleType);
         }
         break;
@@ -2095,37 +2088,37 @@
     if (value != null) {
       switch (part) {
         case _marginPartLeft:
-          return new MarginExpression(exprs.span, left: value);
+          return MarginExpression(exprs.span, left: value);
         case _marginPartTop:
-          return new MarginExpression(exprs.span, top: value);
+          return MarginExpression(exprs.span, top: value);
         case _marginPartRight:
-          return new MarginExpression(exprs.span, right: value);
+          return MarginExpression(exprs.span, right: value);
         case _marginPartBottom:
-          return new MarginExpression(exprs.span, bottom: value);
+          return MarginExpression(exprs.span, bottom: value);
         case _borderPartLeft:
         case _borderPartLeftWidth:
-          return new BorderExpression(exprs.span, left: value);
+          return BorderExpression(exprs.span, left: value);
         case _borderPartTop:
         case _borderPartTopWidth:
-          return new BorderExpression(exprs.span, top: value);
+          return BorderExpression(exprs.span, top: value);
         case _borderPartRight:
         case _borderPartRightWidth:
-          return new BorderExpression(exprs.span, right: value);
+          return BorderExpression(exprs.span, right: value);
         case _borderPartBottom:
         case _borderPartBottomWidth:
-          return new BorderExpression(exprs.span, bottom: value);
+          return BorderExpression(exprs.span, bottom: value);
         case _heightPart:
-          return new HeightExpression(exprs.span, value);
+          return HeightExpression(exprs.span, value);
         case _widthPart:
-          return new WidthExpression(exprs.span, value);
+          return WidthExpression(exprs.span, value);
         case _paddingPartLeft:
-          return new PaddingExpression(exprs.span, left: value);
+          return PaddingExpression(exprs.span, left: value);
         case _paddingPartTop:
-          return new PaddingExpression(exprs.span, top: value);
+          return PaddingExpression(exprs.span, top: value);
         case _paddingPartRight:
-          return new PaddingExpression(exprs.span, right: value);
+          return PaddingExpression(exprs.span, right: value);
         case _paddingPartBottom:
-          return new PaddingExpression(exprs.span, bottom: value);
+          return PaddingExpression(exprs.span, bottom: value);
       }
     }
     return null;
@@ -2175,7 +2168,7 @@
         return null;
     }
 
-    return new BoxEdge.clockwiseFromTop(top, right, bottom, left);
+    return BoxEdge.clockwiseFromTop(top, right, bottom, left);
   }
 
   // TODO(terry): Need to handle auto.
@@ -2196,7 +2189,7 @@
   //  term:         (see processTerm)
   Expressions processExpr([bool ieFilter = false]) {
     var start = _peekToken.span;
-    var expressions = new Expressions(_makeSpan(start));
+    var expressions = Expressions(_makeSpan(start));
 
     var keepGoing = true;
     var expr;
@@ -2207,10 +2200,10 @@
 
       switch (_peek()) {
         case TokenKind.SLASH:
-          op = new OperatorSlash(_makeSpan(opStart));
+          op = OperatorSlash(_makeSpan(opStart));
           break;
         case TokenKind.COMMA:
-          op = new OperatorComma(_makeSpan(opStart));
+          op = OperatorComma(_makeSpan(opStart));
           break;
         case TokenKind.BACKSLASH:
           // Backslash outside of string; detected IE8 or older signaled by \9
@@ -2222,7 +2215,7 @@
             var numToken = _next();
             var value = int.parse(numToken.text);
             if (value == 9) {
-              op = new IE8Term(_makeSpan(ie8Start));
+              op = IE8Term(_makeSpan(ie8Start));
             } else if (isChecked) {
               _warning(
                   "\$value is not valid in an expression", _makeSpan(start));
@@ -2324,15 +2317,15 @@
       case TokenKind.SINGLE_QUOTE:
         value = processQuotedString(false);
         value = "'${_escapeString(value, single: true)}'";
-        return new LiteralTerm(value, value, _makeSpan(start));
+        return LiteralTerm(value, value, _makeSpan(start));
       case TokenKind.DOUBLE_QUOTE:
         value = processQuotedString(false);
         value = '"${_escapeString(value)}"';
-        return new LiteralTerm(value, value, _makeSpan(start));
+        return LiteralTerm(value, value, _makeSpan(start));
       case TokenKind.LPAREN:
         _next();
 
-        GroupTerm group = new GroupTerm(_makeSpan(start));
+        GroupTerm group = GroupTerm(_makeSpan(start));
 
         dynamic /* Expression | List<Expression> | ... */ term;
         do {
@@ -2355,7 +2348,7 @@
 
         _eat(TokenKind.RBRACK);
 
-        return new ItemTerm(term.value, term.text, _makeSpan(start));
+        return ItemTerm(term.value, term.text, _makeSpan(start));
       case TokenKind.IDENTIFIER:
         var nameValue = identifier(); // Snarf up the ident we'll remap, maybe.
 
@@ -2380,7 +2373,7 @@
         // TODO(terry): Need to have a list of known identifiers today only
         //              'from' is special.
         if (nameValue.name == 'from') {
-          return new LiteralTerm(nameValue, nameValue.name, _makeSpan(start));
+          return LiteralTerm(nameValue, nameValue.name, _makeSpan(start));
         }
 
         // What kind of identifier is it, named color?
@@ -2393,7 +2386,7 @@
                 : "Unknown property value ${propName}";
             _warning(errMsg, _makeSpan(start));
           }
-          return new LiteralTerm(nameValue, nameValue.name, _makeSpan(start));
+          return LiteralTerm(nameValue, nameValue.name, _makeSpan(start));
         }
 
         // Yes, process the color as an RGB value.
@@ -2430,7 +2423,7 @@
           first = _previousToken.text;
         }
 
-        return new UnicodeRangeTerm(first, second, _makeSpan(start));
+        return UnicodeRangeTerm(first, second, _makeSpan(start));
       case TokenKind.AT:
         if (messages.options.lessSupport) {
           _next();
@@ -2442,7 +2435,7 @@
 
           var param = expr.expressions[0];
           var varUsage =
-              new VarUsage((param as LiteralTerm).text, [], _makeSpan(start));
+              VarUsage((param as LiteralTerm).text, [], _makeSpan(start));
           expr.expressions[0] = varUsage;
           return expr.expressions;
         }
@@ -2459,11 +2452,11 @@
 
     switch (unitType) {
       case TokenKind.UNIT_EM:
-        term = new EmTerm(value, t.text, span);
+        term = EmTerm(value, t.text, span);
         _next(); // Skip the unit
         break;
       case TokenKind.UNIT_EX:
-        term = new ExTerm(value, t.text, span);
+        term = ExTerm(value, t.text, span);
         _next(); // Skip the unit
         break;
       case TokenKind.UNIT_LENGTH_PX:
@@ -2472,60 +2465,60 @@
       case TokenKind.UNIT_LENGTH_IN:
       case TokenKind.UNIT_LENGTH_PT:
       case TokenKind.UNIT_LENGTH_PC:
-        term = new LengthTerm(value, t.text, span, unitType);
+        term = LengthTerm(value, t.text, span, unitType);
         _next(); // Skip the unit
         break;
       case TokenKind.UNIT_ANGLE_DEG:
       case TokenKind.UNIT_ANGLE_RAD:
       case TokenKind.UNIT_ANGLE_GRAD:
       case TokenKind.UNIT_ANGLE_TURN:
-        term = new AngleTerm(value, t.text, span, unitType);
+        term = AngleTerm(value, t.text, span, unitType);
         _next(); // Skip the unit
         break;
       case TokenKind.UNIT_TIME_MS:
       case TokenKind.UNIT_TIME_S:
-        term = new TimeTerm(value, t.text, span, unitType);
+        term = TimeTerm(value, t.text, span, unitType);
         _next(); // Skip the unit
         break;
       case TokenKind.UNIT_FREQ_HZ:
       case TokenKind.UNIT_FREQ_KHZ:
-        term = new FreqTerm(value, t.text, span, unitType);
+        term = FreqTerm(value, t.text, span, unitType);
         _next(); // Skip the unit
         break;
       case TokenKind.PERCENT:
-        term = new PercentageTerm(value, t.text, span);
+        term = PercentageTerm(value, t.text, span);
         _next(); // Skip the %
         break;
       case TokenKind.UNIT_FRACTION:
-        term = new FractionTerm(value, t.text, span);
+        term = FractionTerm(value, t.text, span);
         _next(); // Skip the unit
         break;
       case TokenKind.UNIT_RESOLUTION_DPI:
       case TokenKind.UNIT_RESOLUTION_DPCM:
       case TokenKind.UNIT_RESOLUTION_DPPX:
-        term = new ResolutionTerm(value, t.text, span, unitType);
+        term = ResolutionTerm(value, t.text, span, unitType);
         _next(); // Skip the unit
         break;
       case TokenKind.UNIT_CH:
-        term = new ChTerm(value, t.text, span, unitType);
+        term = ChTerm(value, t.text, span, unitType);
         _next(); // Skip the unit
         break;
       case TokenKind.UNIT_REM:
-        term = new RemTerm(value, t.text, span, unitType);
+        term = RemTerm(value, t.text, span, unitType);
         _next(); // Skip the unit
         break;
       case TokenKind.UNIT_VIEWPORT_VW:
       case TokenKind.UNIT_VIEWPORT_VH:
       case TokenKind.UNIT_VIEWPORT_VMIN:
       case TokenKind.UNIT_VIEWPORT_VMAX:
-        term = new ViewportTerm(value, t.text, span, unitType);
+        term = ViewportTerm(value, t.text, span, unitType);
         _next(); // Skip the unit
         break;
       default:
         if (value != null && t != null) {
           term = (value is Identifier)
-              ? new LiteralTerm(value, value.name, span)
-              : new NumberTerm(value, t.text, span);
+              ? LiteralTerm(value, value.name, span)
+              : NumberTerm(value, t.text, span);
         }
         break;
     }
@@ -2569,7 +2562,7 @@
     }
 
     // Gobble up everything until we hit our stop token.
-    var stringValue = new StringBuffer();
+    var stringValue = StringBuffer();
     while (_peek() != stopToken && _peek() != TokenKind.END_OF_FILE) {
       stringValue.write(_next().text);
     }
@@ -2598,7 +2591,7 @@
     if (kind == TokenKind.SEMICOLON || kind == TokenKind.RBRACE) {
       var tok = tokenizer.makeIEFilter(
           startAfterProgidColon.start.offset, _peekToken.start);
-      return new LiteralTerm(tok.text, tok.text, tok.span);
+      return LiteralTerm(tok.text, tok.text, tok.span);
     }
 
     var parens = 0;
@@ -2613,7 +2606,7 @@
           if (--parens == 0) {
             var tok = tokenizer.makeIEFilter(
                 startAfterProgidColon.start.offset, _peekToken.start);
-            return new LiteralTerm(tok.text, tok.text, tok.span);
+            return LiteralTerm(tok.text, tok.text, tok.span);
           }
           break;
         default:
@@ -2638,7 +2631,7 @@
     tokenizer._inString = false;
 
     // Gobble up everything until we hit our stop token.
-    var stringValue = new StringBuffer();
+    var stringValue = StringBuffer();
     var left = 1;
     var matchingParens = false;
     while (_peek() != TokenKind.END_OF_FILE && !matchingParens) {
@@ -2667,13 +2660,13 @@
     if (name == 'calc' || name == '-webkit-calc' || name == '-moz-calc') {
       // TODO(terry): Implement expression parsing properly.
       String expression = processCalcExpression();
-      var calcExpr = new LiteralTerm(expression, expression, _makeSpan(start));
+      var calcExpr = LiteralTerm(expression, expression, _makeSpan(start));
 
       if (!_maybeEat(TokenKind.RPAREN)) {
         _error("problem parsing function expected ), ", _peekToken.span);
       }
 
-      return new CalcTerm(name, name, calcExpr, _makeSpan(start));
+      return CalcTerm(name, name, calcExpr, _makeSpan(start));
     }
 
     return null;
@@ -2702,7 +2695,7 @@
           _next();
         }
 
-        return new UriTerm(urlParam, _makeSpan(start));
+        return UriTerm(urlParam, _makeSpan(start));
       case 'var':
         // TODO(terry): Consider handling var in IE specific filter/progid.
         //              This will require parsing entire IE specific syntax
@@ -2727,14 +2720,14 @@
         var defaultValues = expr.expressions.length >= 3
             ? expr.expressions.sublist(2)
             : <Expression>[];
-        return new VarUsage(paramName, defaultValues, _makeSpan(start));
+        return VarUsage(paramName, defaultValues, _makeSpan(start));
       default:
         var expr = processExpr();
         if (!_maybeEat(TokenKind.RPAREN)) {
           _error("problem parsing function expected ), ", _peekToken.span);
         }
 
-        return new FunctionTerm(name, name, expr, _makeSpan(start));
+        return FunctionTerm(name, name, expr, _makeSpan(start));
     }
   }
 
@@ -2746,10 +2739,10 @@
       if (isChecked) {
         _warning('expected identifier, but found $tok', tok.span);
       }
-      return new Identifier("", _makeSpan(tok.span));
+      return Identifier("", _makeSpan(tok.span));
     }
 
-    return new Identifier(tok.text, _makeSpan(tok.span));
+    return Identifier(tok.text, _makeSpan(tok.span));
   }
 
   // TODO(terry): Move this to base <= 36 and into shared code.
@@ -2772,7 +2765,7 @@
       var digit = _hexDigit(hexText.codeUnitAt(i));
       if (digit < 0) {
         _warning('Bad hex number', span);
-        return new HexColorTerm(new BAD_HEX_VALUE(), hexText, span);
+        return HexColorTerm(BAD_HEX_VALUE(), hexText, span);
       }
       hexValue = (hexValue << 4) + digit;
     }
@@ -2792,7 +2785,7 @@
     } else if (hexText.length == 2 && hexText[0] == hexText[1]) {
       hexText = '${hexText[0]}';
     }
-    return new HexColorTerm(hexValue, hexText, span);
+    return HexColorTerm(hexValue, hexText, span);
   }
 }
 
@@ -2832,7 +2825,7 @@
           nextIsLineHeight = true;
         } else if (nextIsLineHeight && expr is LengthTerm) {
           assert(expr.unit == TokenKind.UNIT_LENGTH_PX);
-          lineHt = new LineHeight(expr.value, inPixels: true);
+          lineHt = LineHeight(expr.value, inPixels: true);
           nextIsLineHeight = false;
           _index++;
           break;
@@ -2844,7 +2837,7 @@
       }
     }
 
-    return new FontExpression(_exprs.span, size: size, lineHeight: lineHt);
+    return FontExpression(_exprs.span, size: size, lineHeight: lineHt);
   }
 
   FontExpression processFontFamily() {
@@ -2858,21 +2851,21 @@
     for (; _index < _exprs.expressions.length; _index++) {
       Expression expr = _exprs.expressions[_index];
       if (expr is LiteralTerm) {
-        if (family.length == 0 || moreFamilies) {
+        if (family.isEmpty || moreFamilies) {
           // It's font-family now.
           family.add(expr.toString());
           moreFamilies = false;
         } else if (isChecked) {
           messages.warning('Only font-family can be a list', _exprs.span);
         }
-      } else if (expr is OperatorComma && family.length > 0) {
+      } else if (expr is OperatorComma && family.isNotEmpty) {
         moreFamilies = true;
       } else {
         break;
       }
     }
 
-    return new FontExpression(_exprs.span, family: family);
+    return FontExpression(_exprs.span, family: family);
   }
 
   FontExpression processFont() {
@@ -2893,7 +2886,7 @@
       //               https://github.com/dart-lang/csslib/issues/5
     }
 
-    return new FontExpression(_exprs.span,
+    return FontExpression(_exprs.span,
         size: fontSize.font.size,
         lineHeight: fontSize.font.lineHeight,
         family: fontFamily.font.family);
@@ -2902,12 +2895,12 @@
 
 /// Escapes [text] for use in a CSS string.
 /// [single] specifies single quote `'` vs double quote `"`.
-String _escapeString(String text, {bool single: false}) {
-  StringBuffer result = null;
+String _escapeString(String text, {bool single = false}) {
+  StringBuffer result;
 
   for (int i = 0; i < text.length; i++) {
     var code = text.codeUnitAt(i);
-    String replace = null;
+    String replace;
     switch (code) {
       case 34 /*'"'*/ :
         if (!single) replace = r'\"';
@@ -2918,7 +2911,7 @@
     }
 
     if (replace != null && result == null) {
-      result = new StringBuffer(text.substring(0, i));
+      result = StringBuffer(text.substring(0, i));
     }
 
     if (result != null) result.write(replace != null ? replace : text[i]);
diff --git a/lib/src/analyzer.dart b/lib/src/analyzer.dart
index e6bb0eb..6421c6e 100644
--- a/lib/src/analyzer.dart
+++ b/lib/src/analyzer.dart
@@ -43,14 +43,14 @@
 
     // Expand any nested selectors using selector desendant combinator to
     // signal CSS inheritance notation.
-    _styleSheets.forEach((styleSheet) => new ExpandNestedSelectors()
+    _styleSheets.forEach((styleSheet) => ExpandNestedSelectors()
       ..visitStyleSheet(styleSheet)
       ..flatten(styleSheet));
 
     // Expand any @extend.
     _styleSheets.forEach((styleSheet) {
-      var allExtends = new AllExtends()..visitStyleSheet(styleSheet);
-      new InheritExtends(_messages, allExtends)..visitStyleSheet(styleSheet);
+      var allExtends = AllExtends()..visitStyleSheet(styleSheet);
+      InheritExtends(_messages, allExtends)..visitStyleSheet(styleSheet);
     });
   }
 }
@@ -186,7 +186,7 @@
   List<RuleSet> _expandedRuleSets = [];
 
   /// Maping of a nested rule set to the fully expanded list of RuleSet(s).
-  final Map<RuleSet, List<RuleSet>> _expansions = new Map();
+  final Map<RuleSet, List<RuleSet>> _expansions = Map();
 
   void visitRuleSet(RuleSet node) {
     final oldParent = _parentRuleSet;
@@ -196,7 +196,7 @@
     if (_nestedSelectorGroup == null) {
       // Create top-level selector (may have nested rules).
       final newSelectors = node.selectorGroup.selectors.toList();
-      _topLevelSelectorGroup = new SelectorGroup(newSelectors, node.span);
+      _topLevelSelectorGroup = SelectorGroup(newSelectors, node.span);
       _nestedSelectorGroup = _topLevelSelectorGroup;
     } else {
       // Generate new selector groups from the nested rules.
@@ -242,11 +242,11 @@
       for (Selector nestedSelector in nestedSelectors) {
         var seq = _mergeNestedSelector(nestedSelector.simpleSelectorSequences,
             selector.simpleSelectorSequences);
-        newSelectors.add(new Selector(seq, node.span));
+        newSelectors.add(Selector(seq, node.span));
       }
     }
 
-    return new SelectorGroup(newSelectors, node.span);
+    return SelectorGroup(newSelectors, node.span);
   }
 
   /// Merge the nested selector sequences [current] to the [parent] sequences or
@@ -293,7 +293,7 @@
 
     var newSequences = <SimpleSelectorSequence>[];
     var first = sequences.first;
-    newSequences.add(new SimpleSelectorSequence(
+    newSequences.add(SimpleSelectorSequence(
         first.simpleSelector, first.span, TokenKind.COMBINATOR_DESCENDANT));
     newSequences.addAll(sequences.skip(1));
 
@@ -303,7 +303,7 @@
   void visitDeclarationGroup(DeclarationGroup node) {
     var span = node.span;
 
-    var currentGroup = new DeclarationGroup([], span);
+    var currentGroup = DeclarationGroup([], span);
 
     var oldGroup = _flatDeclarationGroup;
     _flatDeclarationGroup = currentGroup;
@@ -325,7 +325,7 @@
     var selectorGroup = _nestedSelectorGroup;
 
     // Build new rule set from the nested selectors and declarations.
-    var newRuleSet = new RuleSet(selectorGroup, currentGroup, span);
+    var newRuleSet = RuleSet(selectorGroup, currentGroup, span);
 
     // Place in order so outer-most rule is first.
     if (expandedLength == _expandedRuleSets.length) {
@@ -395,7 +395,7 @@
   /// true.
   static bool replace(
       StyleSheet styleSheet, RuleSet ruleSet, List<RuleSet> newRules) {
-    var visitor = new _MediaRulesReplacer(ruleSet, newRules);
+    var visitor = _MediaRulesReplacer(ruleSet, newRules);
     visitor.visitStyleSheet(styleSheet);
     return visitor._foundAndReplaced;
   }
@@ -418,11 +418,11 @@
   final Messages _messages;
 
   /// Map of variable name key to it's definition.
-  final Map<String, MixinDefinition> map = new Map<String, MixinDefinition>();
+  final Map<String, MixinDefinition> map = Map<String, MixinDefinition>();
   MixinDefinition currDef;
 
   static void expand(Messages messages, List<StyleSheet> styleSheets) {
-    new TopLevelIncludes(messages, styleSheets);
+    TopLevelIncludes(messages, styleSheets);
   }
 
   bool _anyRulesets(MixinRulesetDirective def) =>
@@ -503,7 +503,7 @@
   /// true.
   static bool replace(Messages messages, StyleSheet styleSheet,
       IncludeDirective include, List<TreeNode> newRules) {
-    var visitor = new _TopLevelIncludeReplacer(messages, include, newRules);
+    var visitor = _TopLevelIncludeReplacer(messages, include, newRules);
     visitor.visitStyleSheet(styleSheet);
     return visitor._foundAndReplaced;
   }
@@ -514,7 +514,7 @@
     var index = node.topLevels.indexOf(_include);
     if (index != -1) {
       node.topLevels.insertAll(index + 1, _newRules);
-      node.topLevels.replaceRange(index, index + 1, [new NoOp()]);
+      node.topLevels.replaceRange(index, index + 1, [NoOp()]);
       _foundAndReplaced = true;
     }
     super.visitStyleSheet(node);
@@ -525,7 +525,7 @@
     if (index != -1) {
       node.rulesets.insertAll(index + 1, _newRules);
       // Only the resolve the @include once.
-      node.rulesets.replaceRange(index, index + 1, [new NoOp()]);
+      node.rulesets.replaceRange(index, index + 1, [NoOp()]);
       _foundAndReplaced = true;
     }
     super.visitMixinRulesetDirective(node);
@@ -556,7 +556,7 @@
   Expressions _currExpressions;
   int _currIndex = -1;
 
-  final varUsages = new Map<String, Map<Expressions, Set<int>>>();
+  final varUsages = Map<String, Map<Expressions, Set<int>>>();
 
   /// Only var defs with more than one expression (comma separated).
   final Map<String, VarDefinition> varDefs;
@@ -636,7 +636,7 @@
   }
 
   void _addExpression(Map<Expressions, Set<int>> expressions) {
-    var indexSet = new Set<int>();
+    var indexSet = Set<int>();
     indexSet.add(_currIndex);
     expressions[_currExpressions] = indexSet;
   }
@@ -653,7 +653,7 @@
         allIndexes.add(_currIndex);
       }
     } else {
-      var newExpressions = new Map<Expressions, Set<int>>();
+      var newExpressions = Map<Expressions, Set<int>>();
       _addExpression(newExpressions);
       varUsages[node.name] = newExpressions;
     }
@@ -677,18 +677,18 @@
   final Messages _messages;
 
   /// Map of variable name key to it's definition.
-  final Map<String, MixinDefinition> map = new Map<String, MixinDefinition>();
+  final Map<String, MixinDefinition> map = Map<String, MixinDefinition>();
 
   /// Cache of mixin called with parameters.
-  final Map<String, CallMixin> callMap = new Map<String, CallMixin>();
+  final Map<String, CallMixin> callMap = Map<String, CallMixin>();
   MixinDefinition currDef;
   DeclarationGroup currDeclGroup;
 
   /// Var definitions with more than 1 expression.
-  final Map<String, VarDefinition> varDefs = new Map<String, VarDefinition>();
+  final Map<String, VarDefinition> varDefs = Map<String, VarDefinition>();
 
   static void expand(Messages messages, List<StyleSheet> styleSheets) {
-    new DeclarationIncludes(messages, styleSheets);
+    DeclarationIncludes(messages, styleSheets);
   }
 
   DeclarationIncludes(this._messages, List<StyleSheet> styleSheets) {
@@ -702,7 +702,7 @@
 
   CallMixin _createCallDeclMixin(MixinDefinition mixinDef) {
     callMap.putIfAbsent(mixinDef.name,
-        () => callMap[mixinDef.name] = new CallMixin(mixinDef, varDefs));
+        () => callMap[mixinDef.name] = CallMixin(mixinDef, varDefs));
     return callMap[mixinDef.name];
   }
 
@@ -727,8 +727,7 @@
         if (!_allIncludes(mixinDef.rulesets) && currDeclGroup != null) {
           var index = _findInclude(currDeclGroup.declarations, node);
           if (index != -1) {
-            currDeclGroup.declarations
-                .replaceRange(index, index + 1, [new NoOp()]);
+            currDeclGroup.declarations.replaceRange(index, index + 1, [NoOp()]);
           }
           _messages.warning(
               "Using top-level mixin ${node.include.name} as a declaration",
@@ -740,7 +739,7 @@
           var rulesets = <Declaration>[];
           if (origRulesets.every((ruleset) => ruleset is IncludeDirective)) {
             origRulesets.forEach((ruleset) {
-              rulesets.add(new IncludeMixinAtDeclaration(
+              rulesets.add(IncludeMixinAtDeclaration(
                   ruleset as IncludeDirective, ruleset.span));
             });
             _IncludeReplacer.replace(_styleSheet, node, rulesets);
@@ -748,7 +747,7 @@
         }
       }
 
-      if (mixinDef.definedArgs.length > 0 && node.include.args.length > 0) {
+      if (mixinDef.definedArgs.isNotEmpty && node.include.args.isNotEmpty) {
         var callMixin = _createCallDeclMixin(mixinDef);
         mixinDef = callMixin.transform(node.include.args);
       }
@@ -776,7 +775,7 @@
             (currDef as MixinDeclarationDirective).declarations.declarations;
         var index = _findInclude(decls, node);
         if (index != -1) {
-          decls.replaceRange(index, index + 1, [new NoOp()]);
+          decls.replaceRange(index, index + 1, [NoOp()]);
         }
       }
     }
@@ -829,7 +828,7 @@
   /// with the [newRules].
   static void replace(
       StyleSheet ss, var include, List<TreeNode> newDeclarations) {
-    var visitor = new _IncludeReplacer(include, newDeclarations);
+    var visitor = _IncludeReplacer(include, newDeclarations);
     visitor.visitStyleSheet(ss);
   }
 
@@ -840,7 +839,7 @@
     if (index != -1) {
       node.declarations.insertAll(index + 1, _newDeclarations);
       // Change @include to NoOp so it's processed only once.
-      node.declarations.replaceRange(index, index + 1, [new NoOp()]);
+      node.declarations.replaceRange(index, index + 1, [NoOp()]);
       _foundAndReplaced = true;
     }
     super.visitDeclarationGroup(node);
@@ -851,7 +850,7 @@
 /// @include.
 class MixinsAndIncludes extends Visitor {
   static void remove(StyleSheet styleSheet) {
-    new MixinsAndIncludes()..visitStyleSheet(styleSheet);
+    MixinsAndIncludes()..visitStyleSheet(styleSheet);
   }
 
   bool _nodesToRemove(node) =>
@@ -881,7 +880,7 @@
 /// Find all @extend to create inheritance.
 class AllExtends extends Visitor {
   final Map<String, List<SelectorGroup>> inherits =
-      new Map<String, List<SelectorGroup>>();
+      Map<String, List<SelectorGroup>>();
 
   SelectorGroup _currSelectorGroup;
   int _currDeclIndex;
diff --git a/lib/src/css_printer.dart b/lib/src/css_printer.dart
index a8d5b4a..552f25e 100644
--- a/lib/src/css_printer.dart
+++ b/lib/src/css_printer.dart
@@ -6,14 +6,14 @@
 
 /// Visitor that produces a formatted string representation of the CSS tree.
 class CssPrinter extends Visitor {
-  StringBuffer _buff = new StringBuffer();
+  StringBuffer _buff = StringBuffer();
   bool prettyPrint = true;
 
   /// Walk the [tree] Stylesheet. [pretty] if true emits line breaks, extra
   /// spaces, friendly property values, etc., if false emits compacted output.
-  void visitTree(StyleSheet tree, {bool pretty: false}) {
+  void visitTree(StyleSheet tree, {bool pretty = false}) {
     prettyPrint = pretty;
-    _buff = new StringBuffer();
+    _buff = StringBuffer();
     visitStyleSheet(tree);
   }
 
@@ -177,7 +177,7 @@
   }
 
   void visitImportDirective(ImportDirective node) {
-    bool isStartingQuote(String ch) => ('\'"'.indexOf(ch[0]) >= 0);
+    bool isStartingQuote(String ch) => ('\'"'.contains(ch[0]));
 
     if (_isTesting) {
       // Emit assuming url() was parsed; most suite tests use url function.
@@ -223,7 +223,7 @@
   }
 
   void visitNamespaceDirective(NamespaceDirective node) {
-    bool isStartingQuote(String ch) => ('\'"'.indexOf(ch) >= 0);
+    bool isStartingQuote(String ch) => ('\'"'.contains(ch));
 
     if (isStartingQuote(node._uri)) {
       emit(' @namespace ${node.prefix}"${node._uri}"');
diff --git a/lib/src/messages.dart b/lib/src/messages.dart
index 3fe079b..17d1acf 100644
--- a/lib/src/messages.dart
+++ b/lib/src/messages.dart
@@ -23,7 +23,7 @@
 
 /// Map between error levels and their display color.
 final Map<Level, String> _ERROR_COLORS = (() {
-  var colorsMap = new Map<Level, String>();
+  var colorsMap = Map<Level, String>();
   colorsMap[Level.SEVERE] = RED_COLOR;
   colorsMap[Level.WARNING] = MAGENTA_COLOR;
   colorsMap[Level.INFO] = GREEN_COLOR;
@@ -32,7 +32,7 @@
 
 /// Map between error levels and their friendly name.
 final Map<Level, String> _ERROR_LABEL = (() {
-  var labels = new Map<Level, String>();
+  var labels = Map<Level, String>();
   labels[Level.SEVERE] = 'error';
   labels[Level.WARNING] = 'warning';
   labels[Level.INFO] = 'info';
@@ -46,12 +46,12 @@
   final SourceSpan span;
   final bool useColors;
 
-  Message(this.level, this.message, {SourceSpan span, bool useColors: false})
+  Message(this.level, this.message, {SourceSpan span, bool useColors = false})
       : this.span = span,
         this.useColors = useColors;
 
   String toString() {
-    var output = new StringBuffer();
+    var output = StringBuffer();
     bool colors = useColors && _ERROR_COLORS.containsKey(level);
     var levelColor = colors ? _ERROR_COLORS[level] : null;
     if (colors) output.write(levelColor);
@@ -69,7 +69,7 @@
   }
 }
 
-typedef void PrintHandler(Message obj);
+typedef PrintHandler = void Function(Message obj);
 
 /// This class tracks and prints information, warnings, and errors emitted by
 /// the compiler.
@@ -81,12 +81,12 @@
 
   final List<Message> messages = <Message>[];
 
-  Messages({PreprocessorOptions options, this.printHandler: print})
-      : options = options != null ? options : new PreprocessorOptions();
+  Messages({PreprocessorOptions options, this.printHandler = print})
+      : options = options != null ? options : PreprocessorOptions();
 
   /// Report a compile-time CSS error.
   void error(String message, SourceSpan span) {
-    var msg = new Message(Level.SEVERE, message,
+    var msg = Message(Level.SEVERE, message,
         span: span, useColors: options.useColors);
 
     messages.add(msg);
@@ -99,7 +99,7 @@
     if (options.warningsAsErrors) {
       error(message, span);
     } else {
-      var msg = new Message(Level.WARNING, message,
+      var msg = Message(Level.WARNING, message,
           span: span, useColors: options.useColors);
 
       messages.add(msg);
@@ -108,8 +108,8 @@
 
   /// Report and informational message about what the compiler is doing.
   void info(String message, SourceSpan span) {
-    var msg = new Message(Level.INFO, message,
-        span: span, useColors: options.useColors);
+    var msg =
+        Message(Level.INFO, message, span: span, useColors: options.useColors);
 
     messages.add(msg);
 
diff --git a/lib/src/options.dart b/lib/src/options.dart
index 19130fe..3300cf6 100644
--- a/lib/src/options.dart
+++ b/lib/src/options.dart
@@ -37,13 +37,13 @@
   final String inputFile;
 
   const PreprocessorOptions(
-      {this.verbose: false,
-      this.checked: false,
-      this.lessSupport: true,
-      this.warningsAsErrors: false,
-      this.throwOnErrors: false,
-      this.throwOnWarnings: false,
-      this.useColors: true,
-      this.polyfill: false,
+      {this.verbose = false,
+      this.checked = false,
+      this.lessSupport = true,
+      this.warningsAsErrors = false,
+      this.throwOnErrors = false,
+      this.throwOnWarnings = false,
+      this.useColors = true,
+      this.polyfill = false,
       this.inputFile});
 }
diff --git a/lib/src/polyfill.dart b/lib/src/polyfill.dart
index fc6cc5f..c8a01f1 100644
--- a/lib/src/polyfill.dart
+++ b/lib/src/polyfill.dart
@@ -8,10 +8,9 @@
 /// understand (var, calc, etc.).
 class PolyFill {
   final Messages _messages;
-  Map<String, VarDefinition> _allVarDefinitions =
-      new Map<String, VarDefinition>();
+  Map<String, VarDefinition> _allVarDefinitions = Map<String, VarDefinition>();
 
-  Set<StyleSheet> allStyleSheets = new Set<StyleSheet>();
+  Set<StyleSheet> allStyleSheets = Set<StyleSheet>();
 
   /// [_pseudoElements] list of known pseudo attributes found in HTML, any
   /// CSS pseudo-elements 'name::custom-element' is mapped to the manged name
@@ -20,20 +19,20 @@
 
   /// Run the analyzer on every file that is a style sheet or any component that
   /// has a style tag.
-  void process(StyleSheet styleSheet, {List<StyleSheet> includes: null}) {
+  void process(StyleSheet styleSheet, {List<StyleSheet> includes}) {
     if (includes != null) {
       processVarDefinitions(includes);
     }
     processVars(styleSheet);
 
     // Remove all var definitions for this style sheet.
-    new _RemoveVarDefinitions().visitTree(styleSheet);
+    _RemoveVarDefinitions().visitTree(styleSheet);
   }
 
   /// Process all includes looking for var definitions.
   void processVarDefinitions(List<StyleSheet> includes) {
     for (var include in includes) {
-      _allVarDefinitions = (new _VarDefinitionsIncludes(_allVarDefinitions)
+      _allVarDefinitions = (_VarDefinitionsIncludes(_allVarDefinitions)
             ..visitTree(include))
           .varDefs;
     }
@@ -42,7 +41,7 @@
   void processVars(StyleSheet styleSheet) {
     // Build list of all var definitions.
     var mainStyleSheetVarDefs =
-        (new _VarDefAndUsage(this._messages, _allVarDefinitions)
+        (_VarDefAndUsage(this._messages, _allVarDefinitions)
               ..visitTree(styleSheet))
             .varDefs;
 
@@ -82,7 +81,7 @@
 class _VarDefAndUsage extends Visitor {
   final Messages _messages;
   final Map<String, VarDefinition> _knownVarDefs;
-  final Map<String, VarDefinition> varDefs = new Map<String, VarDefinition>();
+  final Map<String, VarDefinition> varDefs = Map<String, VarDefinition>();
 
   VarDefinition currVarDefinition;
   List<Expression> currentExpressions;
diff --git a/lib/src/property.dart b/lib/src/property.dart
index cf614fe..de74760 100644
--- a/lib/src/property.dart
+++ b/lib/src/property.dart
@@ -87,7 +87,7 @@
   /// foreground).
   Color.createHsla(num hueDegree, num saturationPercent, num lightnessPercent,
       [num alpha])
-      : this._argb = new Hsla(
+      : this._argb = Hsla(
                 Color._clamp(hueDegree, 0, 360) / 360,
                 Color._clamp(saturationPercent, 0, 100) / 100,
                 Color._clamp(lightnessPercent, 0, 100) / 100,
@@ -108,7 +108,7 @@
   ///                completely transparent foreground and 1 is a completely
   ///                opaque foreground.
   Color.hslaRaw(num hue, num saturation, num lightness, [num alpha])
-      : this._argb = new Hsla(
+      : this._argb = Hsla(
                 Color._clamp(hue, 0, 1),
                 Color._clamp(saturation, 0, 1),
                 Color._clamp(lightness, 0, 1),
@@ -154,10 +154,10 @@
     int g = Color.hexToInt(_argb.substring(nextIndex, nextIndex + 2));
     nextIndex += 2;
     int b = Color.hexToInt(_argb.substring(nextIndex, nextIndex + 2));
-    return new Rgba(r, g, b, a);
+    return Rgba(r, g, b, a);
   }
 
-  Hsla get hsla => new Hsla.fromRgba(rgba);
+  Hsla get hsla => Hsla.fromRgba(rgba);
 
   int get argbValue => Color.hexToInt(_argb);
 
@@ -167,12 +167,12 @@
 
   Color darker(num amount) {
     Rgba newRgba = Color._createNewTintShadeFromRgba(rgba, -amount);
-    return new Color.hex("${newRgba.toHexArgbString()}");
+    return Color.hex("${newRgba.toHexArgbString()}");
   }
 
   Color lighter(num amount) {
     Rgba newRgba = Color._createNewTintShadeFromRgba(rgba, amount);
-    return new Color.hex("${newRgba.toHexArgbString()}");
+    return Color.hex("${newRgba.toHexArgbString()}");
   }
 
   static bool equal(ColorBase curr, other) {
@@ -224,7 +224,7 @@
       String v = color.substring(1);
       Color.hexToInt(v); // Valid hexadecimal, throws if not.
       return v;
-    } else if (color.length > 0 && color[color.length - 1] == ')') {
+    } else if (color.isNotEmpty && color[color.length - 1] == ')') {
       int type;
       if (color.indexOf("rgb(") == 0 || color.indexOf("RGB(") == 0) {
         color = color.substring(4);
@@ -239,7 +239,7 @@
         type = _hslaCss;
         color = color.substring(5);
       } else {
-        throw new UnsupportedError('CSS property not implemented');
+        throw UnsupportedError('CSS property not implemented');
       }
 
       color = color.substring(0, color.length - 1); // Strip close paren.
@@ -255,9 +255,9 @@
         case _rgbaCss:
           return Color.convertToHexString(args[0], args[1], args[2], args[3]);
         case _hslCss:
-          return new Hsla(args[0], args[1], args[2]).toHexArgbString();
+          return Hsla(args[0], args[1], args[2]).toHexArgbString();
         case _hslaCss:
-          return new Hsla(args[0], args[1], args[2], args[3]).toHexArgbString();
+          return Hsla(args[0], args[1], args[2], args[3]).toHexArgbString();
         default:
           // Type not defined UnsupportedOperationException should have thrown.
           assert(false);
@@ -321,7 +321,7 @@
       g = Color._changeTintShadeColor(rgba.g, tintShade).round().toInt();
       b = Color._changeTintShadeColor(rgba.b, tintShade).round().toInt();
     }
-    return new Rgba(r, g, b, rgba.a);
+    return Rgba(r, g, b, rgba.a);
   }
 
   // TODO(terry): This does an okay lighter/darker; better would be convert to
@@ -500,12 +500,12 @@
         this.a = (alpha != null) ? Color._clamp(alpha, 0, 1) : alpha;
 
   factory Rgba.fromString(String hexValue) =>
-      new Color.css("#${Color._convertCssToArgb(hexValue)}").rgba;
+      Color.css("#${Color._convertCssToArgb(hexValue)}").rgba;
 
   factory Rgba.fromColor(Color color) => color.rgba;
 
   factory Rgba.fromArgbValue(num value) {
-    return new Rgba(
+    return Rgba(
         ((value.toInt() & 0xff000000) >> 0x18), // a
         ((value.toInt() & 0xff0000) >> 0x10), // r
         ((value.toInt() & 0xff00) >> 8), // g
@@ -545,7 +545,7 @@
       b = (255 * Rgba._hueToRGB(var1, var2, h - (1 / 3))).round().toInt();
     }
 
-    return new Rgba(r, g, b, a);
+    return Rgba(r, g, b, a);
   }
 
   static num _hueToRGB(num v1, num v2, num vH) {
@@ -595,8 +595,8 @@
     return value;
   }
 
-  Color get color => new Color.createRgba(r, g, b, a);
-  Hsla get hsla => new Hsla.fromRgba(this);
+  Color get color => Color.createRgba(r, g, b, a);
+  Hsla get hsla => Hsla.fromRgba(this);
 
   Rgba darker(num amount) => Color._createNewTintShadeFromRgba(this, -amount);
   Rgba lighter(num amount) => Color._createNewTintShadeFromRgba(this, amount);
@@ -625,7 +625,7 @@
         this._a = (alpha != null) ? Color._clamp(alpha, 0, 1) : alpha;
 
   factory Hsla.fromString(String hexValue) {
-    Rgba rgba = new Color.css("#${Color._convertCssToArgb(hexValue)}").rgba;
+    Rgba rgba = Color.css("#${Color._convertCssToArgb(hexValue)}").rgba;
     return _createFromRgba(rgba.r, rgba.g, rgba.b, rgba.a);
   }
 
@@ -668,7 +668,7 @@
     num maxRgb = math.max(r, math.max(g, b));
     l = (maxRgb + minRgb) / 2;
     if (l <= 0) {
-      return new Hsla(0, 0, l); // Black;
+      return Hsla(0, 0, l); // Black;
     }
 
     num vm = maxRgb - minRgb;
@@ -676,7 +676,7 @@
     if (s > 0) {
       s /= (l < 0.5) ? (maxRgb + minRgb) : (2 - maxRgb - minRgb);
     } else {
-      return new Hsla(0, 0, l); // White
+      return Hsla(0, 0, l); // White
     }
 
     num r2, g2, b2;
@@ -692,7 +692,7 @@
     }
     h /= 6;
 
-    return new Hsla(h, s, l, a);
+    return Hsla(h, s, l, a);
   }
 
   /// Returns 0..1 fraction (ratio of 360°, e.g. 1° == 1/360).
@@ -722,18 +722,17 @@
       ? "hsl($hueDegrees,$saturationPercentage,$lightnessPercentage)"
       : "hsla($hueDegrees,$saturationPercentage,$lightnessPercentage,$_a)";
 
-  String toHexArgbString() => new Rgba.fromHsla(this).toHexArgbString();
+  String toHexArgbString() => Rgba.fromHsla(this).toHexArgbString();
 
   int get argbValue => Color.hexToInt(this.toHexArgbString());
 
-  Color get color => new Color.createHsla(_h, _s, _l, _a);
-  Rgba get rgba => new Rgba.fromHsla(this);
+  Color get color => Color.createHsla(_h, _s, _l, _a);
+  Rgba get rgba => Rgba.fromHsla(this);
 
-  Hsla darker(num amount) =>
-      new Hsla.fromRgba(new Rgba.fromHsla(this).darker(amount));
+  Hsla darker(num amount) => Hsla.fromRgba(Rgba.fromHsla(this).darker(amount));
 
   Hsla lighter(num amount) =>
-      new Hsla.fromRgba(new Rgba.fromHsla(this).lighter(amount));
+      Hsla.fromRgba(Rgba.fromHsla(this).lighter(amount));
 
   int get hashCode => toHexArgbString().hashCode;
 }
@@ -773,9 +772,9 @@
     return (top == left && bottom == right && top == right)
         ? "${left}px"
         : "${top != null ? '$top' : '0'}px "
-        "${right != null ? '$right' : '0'}px "
-        "${bottom != null ? '$bottom' : '0'}px "
-        "${left != null ? '$left' : '0'}px";
+            "${right != null ? '$right' : '0'}px "
+            "${bottom != null ? '$bottom' : '0'}px "
+            "${left != null ? '$left' : '0'}px";
   }
 }
 
@@ -901,14 +900,14 @@
 class LineHeight {
   final num height;
   final bool inPixels;
-  const LineHeight(this.height, {this.inPixels: true});
+  const LineHeight(this.height, {this.inPixels = true});
 }
 
 // TODO(terry): Support @font-face fule.
 /// Font style support for size, family, weight, style, variant, and lineheight.
 class Font implements _StyleProperty {
   /// Collection of most common sans-serif fonts in order.
-  static const List<String> sansSerif = const [
+  static const List<String> sansSerif = [
     FontFamily.arial,
     FontFamily.verdana,
     FontFamily.geneva,
@@ -917,7 +916,7 @@
   ];
 
   /// Collection of most common serif fonts in order.
-  static const List<String> serif = const [
+  static const List<String> serif = [
     FontFamily.georgia,
     FontFamily.timesNewRoman,
     FontFamily.times,
@@ -925,14 +924,14 @@
   ];
 
   /// Collection of most common monospace fonts in order.
-  static const List<String> monospace = const [
+  static const List<String> monospace = [
     FontFamily.courierNew,
     FontFamily.courier,
     FontGeneric.monospace
   ];
 
   /// Collection of most common cursive fonts in order.
-  static const List<String> cursive = const [
+  static const List<String> cursive = [
     FontFamily.textile,
     FontFamily.appleChancery,
     FontFamily.zaphChancery,
@@ -940,7 +939,7 @@
   ];
 
   /// Collection of most common fantasy fonts in order.
-  static const List<String> fantasy = const [
+  static const List<String> fantasy = [
     FontFamily.comicSansMs,
     FontFamily.impact,
     FontFamily.webdings,
@@ -1001,7 +1000,7 @@
   factory Font.merge(Font a, Font b) {
     if (a == null) return b;
     if (b == null) return a;
-    return new Font._merge(a, b);
+    return Font._merge(a, b);
   }
 
   Font._merge(Font a, Font b)
@@ -1031,7 +1030,7 @@
     return '${size}px $_fontsAsString';
   }
 
-  Font scale(num ratio) => new Font(
+  Font scale(num ratio) => Font(
       size: size * ratio,
       family: family,
       weight: weight,
@@ -1148,7 +1147,7 @@
       make = true;
       bottom = 0;
     }
-    return make ? new BoxEdge(left, top, right, bottom) : other;
+    return make ? BoxEdge(left, top, right, bottom) : other;
   }
 
   /// Merge the two box edge sizes and return the result. See [Style.merge] for
@@ -1156,7 +1155,7 @@
   factory BoxEdge.merge(BoxEdge x, BoxEdge y) {
     if (x == null) return y;
     if (y == null) return x;
-    return new BoxEdge._merge(x, y);
+    return BoxEdge._merge(x, y);
   }
 
   BoxEdge._merge(BoxEdge x, BoxEdge y)
diff --git a/lib/src/tokenizer.dart b/lib/src/tokenizer.dart
index a4ca215..a09e306 100644
--- a/lib/src/tokenizer.dart
+++ b/lib/src/tokenizer.dart
@@ -18,7 +18,7 @@
   Tokenizer(SourceFile file, String text, bool skipWhitespace, [int index = 0])
       : super(file, text, skipWhitespace, index);
 
-  Token next({bool unicodeRange: false}) {
+  Token next({bool unicodeRange = false}) {
     // keep track of our starting position
     _startIndex = _index;
 
@@ -241,7 +241,7 @@
         (_peekChar() == '-'.codeUnitAt(0));
   }
 
-  Token _errorToken([String message = null]) {
+  Token _errorToken([String message]) {
     return _finishToken(TokenKind.ERROR);
   }
 
@@ -314,9 +314,9 @@
     }
 
     var span = _file.span(_startIndex, _index);
-    var text = new String.fromCharCodes(chars);
+    var text = String.fromCharCodes(chars);
 
-    return new IdentifierToken(text, getIdentifierKind(), span);
+    return IdentifierToken(text, getIdentifierKind(), span);
   }
 
   Token finishNumber() {
diff --git a/lib/src/tokenizer_base.dart b/lib/src/tokenizer_base.dart
index 07aee79..a856727 100644
--- a/lib/src/tokenizer_base.dart
+++ b/lib/src/tokenizer_base.dart
@@ -55,7 +55,7 @@
   int getIdentifierKind();
 
   /// Snapshot of Tokenizer scanning state.
-  TokenizerState get mark => new TokenizerState(this);
+  TokenizerState get mark => TokenizerState(this);
 
   /// Restore Tokenizer scanning state.
   void restore(TokenizerState markedData) {
@@ -106,11 +106,11 @@
   }
 
   Token _finishToken(int kind) {
-    return new Token(kind, _file.span(_startIndex, _index));
+    return Token(kind, _file.span(_startIndex, _index));
   }
 
-  Token _errorToken([String message = null]) {
-    return new ErrorToken(
+  Token _errorToken([String message]) {
+    return ErrorToken(
         TokenKind.ERROR, _file.span(_startIndex, _index), message);
   }
 
@@ -248,14 +248,14 @@
   }
 
   Token _makeStringToken(List<int> buf, bool isPart) {
-    final s = new String.fromCharCodes(buf);
+    final s = String.fromCharCodes(buf);
     final kind = isPart ? TokenKind.STRING_PART : TokenKind.STRING;
-    return new LiteralToken(kind, _file.span(_startIndex, _index), s);
+    return LiteralToken(kind, _file.span(_startIndex, _index), s);
   }
 
   Token makeIEFilter(int start, int end) {
     var filter = _text.substring(start, end);
-    return new LiteralToken(TokenKind.STRING, _file.span(start, end), filter);
+    return LiteralToken(TokenKind.STRING, _file.span(start, end), filter);
   }
 
   Token _makeRawStringToken(bool isMultiline) {
@@ -268,8 +268,7 @@
     } else {
       s = _text.substring(_startIndex + 2, _index - 1);
     }
-    return new LiteralToken(
-        TokenKind.STRING, _file.span(_startIndex, _index), s);
+    return LiteralToken(TokenKind.STRING, _file.span(_startIndex, _index), s);
   }
 
   Token finishMultilineString(int quote) {
@@ -306,7 +305,7 @@
         _maybeEatChar(TokenChar.NEWLINE);
         return finishMultilineString(quote);
       } else {
-        return _makeStringToken(new List<int>(), false);
+        return _makeStringToken(List<int>(), false);
       }
     }
     return finishStringBody(quote);
@@ -342,7 +341,7 @@
   }
 
   Token finishStringBody(int quote) {
-    var buf = new List<int>();
+    var buf = List<int>();
     while (true) {
       int ch = _nextChar();
       if (ch == quote) {
diff --git a/lib/src/tokenkind.dart b/lib/src/tokenkind.dart
index 1afbe4e..af6233e 100644
--- a/lib/src/tokenkind.dart
+++ b/lib/src/tokenkind.dart
@@ -198,121 +198,97 @@
   static const int PSEUDO_CLASS_NAME = 705; // :pseudoClass
   static const int NEGATION = 706; // NOT
 
-  static const List<Map<String, dynamic>> _DIRECTIVES = const [
-    const {'type': TokenKind.DIRECTIVE_IMPORT, 'value': 'import'},
-    const {'type': TokenKind.DIRECTIVE_MEDIA, 'value': 'media'},
-    const {'type': TokenKind.DIRECTIVE_PAGE, 'value': 'page'},
-    const {'type': TokenKind.DIRECTIVE_CHARSET, 'value': 'charset'},
-    const {'type': TokenKind.DIRECTIVE_STYLET, 'value': 'stylet'},
-    const {'type': TokenKind.DIRECTIVE_KEYFRAMES, 'value': 'keyframes'},
-    const {
+  static const List<Map<String, dynamic>> _DIRECTIVES = [
+    {'type': TokenKind.DIRECTIVE_IMPORT, 'value': 'import'},
+    {'type': TokenKind.DIRECTIVE_MEDIA, 'value': 'media'},
+    {'type': TokenKind.DIRECTIVE_PAGE, 'value': 'page'},
+    {'type': TokenKind.DIRECTIVE_CHARSET, 'value': 'charset'},
+    {'type': TokenKind.DIRECTIVE_STYLET, 'value': 'stylet'},
+    {'type': TokenKind.DIRECTIVE_KEYFRAMES, 'value': 'keyframes'},
+    {
       'type': TokenKind.DIRECTIVE_WEB_KIT_KEYFRAMES,
       'value': '-webkit-keyframes'
     },
-    const {
-      'type': TokenKind.DIRECTIVE_MOZ_KEYFRAMES,
-      'value': '-moz-keyframes'
-    },
-    const {'type': TokenKind.DIRECTIVE_MS_KEYFRAMES, 'value': '-ms-keyframes'},
-    const {'type': TokenKind.DIRECTIVE_O_KEYFRAMES, 'value': '-o-keyframes'},
-    const {'type': TokenKind.DIRECTIVE_FONTFACE, 'value': 'font-face'},
-    const {'type': TokenKind.DIRECTIVE_NAMESPACE, 'value': 'namespace'},
-    const {'type': TokenKind.DIRECTIVE_HOST, 'value': 'host'},
-    const {'type': TokenKind.DIRECTIVE_MIXIN, 'value': 'mixin'},
-    const {'type': TokenKind.DIRECTIVE_INCLUDE, 'value': 'include'},
-    const {'type': TokenKind.DIRECTIVE_CONTENT, 'value': 'content'},
-    const {'type': TokenKind.DIRECTIVE_EXTEND, 'value': 'extend'},
-    const {'type': TokenKind.DIRECTIVE_MOZ_DOCUMENT, 'value': '-moz-document'},
-    const {'type': TokenKind.DIRECTIVE_SUPPORTS, 'value': 'supports'},
-    const {'type': TokenKind.DIRECTIVE_VIEWPORT, 'value': 'viewport'},
-    const {'type': TokenKind.DIRECTIVE_MS_VIEWPORT, 'value': '-ms-viewport'},
+    {'type': TokenKind.DIRECTIVE_MOZ_KEYFRAMES, 'value': '-moz-keyframes'},
+    {'type': TokenKind.DIRECTIVE_MS_KEYFRAMES, 'value': '-ms-keyframes'},
+    {'type': TokenKind.DIRECTIVE_O_KEYFRAMES, 'value': '-o-keyframes'},
+    {'type': TokenKind.DIRECTIVE_FONTFACE, 'value': 'font-face'},
+    {'type': TokenKind.DIRECTIVE_NAMESPACE, 'value': 'namespace'},
+    {'type': TokenKind.DIRECTIVE_HOST, 'value': 'host'},
+    {'type': TokenKind.DIRECTIVE_MIXIN, 'value': 'mixin'},
+    {'type': TokenKind.DIRECTIVE_INCLUDE, 'value': 'include'},
+    {'type': TokenKind.DIRECTIVE_CONTENT, 'value': 'content'},
+    {'type': TokenKind.DIRECTIVE_EXTEND, 'value': 'extend'},
+    {'type': TokenKind.DIRECTIVE_MOZ_DOCUMENT, 'value': '-moz-document'},
+    {'type': TokenKind.DIRECTIVE_SUPPORTS, 'value': 'supports'},
+    {'type': TokenKind.DIRECTIVE_VIEWPORT, 'value': 'viewport'},
+    {'type': TokenKind.DIRECTIVE_MS_VIEWPORT, 'value': '-ms-viewport'},
   ];
 
-  static const List<Map<String, dynamic>> MEDIA_OPERATORS = const [
-    const {'type': TokenKind.MEDIA_OP_ONLY, 'value': 'only'},
-    const {'type': TokenKind.MEDIA_OP_NOT, 'value': 'not'},
-    const {'type': TokenKind.MEDIA_OP_AND, 'value': 'and'},
+  static const List<Map<String, dynamic>> MEDIA_OPERATORS = [
+    {'type': TokenKind.MEDIA_OP_ONLY, 'value': 'only'},
+    {'type': TokenKind.MEDIA_OP_NOT, 'value': 'not'},
+    {'type': TokenKind.MEDIA_OP_AND, 'value': 'and'},
   ];
 
-  static const List<Map<String, dynamic>> MARGIN_DIRECTIVES = const [
-    const {
+  static const List<Map<String, dynamic>> MARGIN_DIRECTIVES = [
+    {
       'type': TokenKind.MARGIN_DIRECTIVE_TOPLEFTCORNER,
       'value': 'top-left-corner'
     },
-    const {'type': TokenKind.MARGIN_DIRECTIVE_TOPLEFT, 'value': 'top-left'},
-    const {'type': TokenKind.MARGIN_DIRECTIVE_TOPCENTER, 'value': 'top-center'},
-    const {'type': TokenKind.MARGIN_DIRECTIVE_TOPRIGHT, 'value': 'top-right'},
-    const {
+    {'type': TokenKind.MARGIN_DIRECTIVE_TOPLEFT, 'value': 'top-left'},
+    {'type': TokenKind.MARGIN_DIRECTIVE_TOPCENTER, 'value': 'top-center'},
+    {'type': TokenKind.MARGIN_DIRECTIVE_TOPRIGHT, 'value': 'top-right'},
+    {
       'type': TokenKind.MARGIN_DIRECTIVE_TOPRIGHTCORNER,
       'value': 'top-right-corner'
     },
-    const {
+    {
       'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMLEFTCORNER,
       'value': 'bottom-left-corner'
     },
-    const {
-      'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMLEFT,
-      'value': 'bottom-left'
-    },
-    const {
-      'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMCENTER,
-      'value': 'bottom-center'
-    },
-    const {
-      'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMRIGHT,
-      'value': 'bottom-right'
-    },
-    const {
+    {'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMLEFT, 'value': 'bottom-left'},
+    {'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMCENTER, 'value': 'bottom-center'},
+    {'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMRIGHT, 'value': 'bottom-right'},
+    {
       'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMRIGHTCORNER,
       'value': 'bottom-right-corner'
     },
-    const {'type': TokenKind.MARGIN_DIRECTIVE_LEFTTOP, 'value': 'left-top'},
-    const {
-      'type': TokenKind.MARGIN_DIRECTIVE_LEFTMIDDLE,
-      'value': 'left-middle'
-    },
-    const {
-      'type': TokenKind.MARGIN_DIRECTIVE_LEFTBOTTOM,
-      'value': 'right-bottom'
-    },
-    const {'type': TokenKind.MARGIN_DIRECTIVE_RIGHTTOP, 'value': 'right-top'},
-    const {
-      'type': TokenKind.MARGIN_DIRECTIVE_RIGHTMIDDLE,
-      'value': 'right-middle'
-    },
-    const {
-      'type': TokenKind.MARGIN_DIRECTIVE_RIGHTBOTTOM,
-      'value': 'right-bottom'
-    },
+    {'type': TokenKind.MARGIN_DIRECTIVE_LEFTTOP, 'value': 'left-top'},
+    {'type': TokenKind.MARGIN_DIRECTIVE_LEFTMIDDLE, 'value': 'left-middle'},
+    {'type': TokenKind.MARGIN_DIRECTIVE_LEFTBOTTOM, 'value': 'right-bottom'},
+    {'type': TokenKind.MARGIN_DIRECTIVE_RIGHTTOP, 'value': 'right-top'},
+    {'type': TokenKind.MARGIN_DIRECTIVE_RIGHTMIDDLE, 'value': 'right-middle'},
+    {'type': TokenKind.MARGIN_DIRECTIVE_RIGHTBOTTOM, 'value': 'right-bottom'},
   ];
 
-  static const List<Map> _UNITS = const [
-    const {'unit': TokenKind.UNIT_EM, 'value': 'em'},
-    const {'unit': TokenKind.UNIT_EX, 'value': 'ex'},
-    const {'unit': TokenKind.UNIT_LENGTH_PX, 'value': 'px'},
-    const {'unit': TokenKind.UNIT_LENGTH_CM, 'value': 'cm'},
-    const {'unit': TokenKind.UNIT_LENGTH_MM, 'value': 'mm'},
-    const {'unit': TokenKind.UNIT_LENGTH_IN, 'value': 'in'},
-    const {'unit': TokenKind.UNIT_LENGTH_PT, 'value': 'pt'},
-    const {'unit': TokenKind.UNIT_LENGTH_PC, 'value': 'pc'},
-    const {'unit': TokenKind.UNIT_ANGLE_DEG, 'value': 'deg'},
-    const {'unit': TokenKind.UNIT_ANGLE_RAD, 'value': 'rad'},
-    const {'unit': TokenKind.UNIT_ANGLE_GRAD, 'value': 'grad'},
-    const {'unit': TokenKind.UNIT_ANGLE_TURN, 'value': 'turn'},
-    const {'unit': TokenKind.UNIT_TIME_MS, 'value': 'ms'},
-    const {'unit': TokenKind.UNIT_TIME_S, 'value': 's'},
-    const {'unit': TokenKind.UNIT_FREQ_HZ, 'value': 'hz'},
-    const {'unit': TokenKind.UNIT_FREQ_KHZ, 'value': 'khz'},
-    const {'unit': TokenKind.UNIT_FRACTION, 'value': 'fr'},
-    const {'unit': TokenKind.UNIT_RESOLUTION_DPI, 'value': 'dpi'},
-    const {'unit': TokenKind.UNIT_RESOLUTION_DPCM, 'value': 'dpcm'},
-    const {'unit': TokenKind.UNIT_RESOLUTION_DPPX, 'value': 'dppx'},
-    const {'unit': TokenKind.UNIT_CH, 'value': 'ch'},
-    const {'unit': TokenKind.UNIT_REM, 'value': 'rem'},
-    const {'unit': TokenKind.UNIT_VIEWPORT_VW, 'value': 'vw'},
-    const {'unit': TokenKind.UNIT_VIEWPORT_VH, 'value': 'vh'},
-    const {'unit': TokenKind.UNIT_VIEWPORT_VMIN, 'value': 'vmin'},
-    const {'unit': TokenKind.UNIT_VIEWPORT_VMAX, 'value': 'vmax'},
+  static const List<Map> _UNITS = [
+    {'unit': TokenKind.UNIT_EM, 'value': 'em'},
+    {'unit': TokenKind.UNIT_EX, 'value': 'ex'},
+    {'unit': TokenKind.UNIT_LENGTH_PX, 'value': 'px'},
+    {'unit': TokenKind.UNIT_LENGTH_CM, 'value': 'cm'},
+    {'unit': TokenKind.UNIT_LENGTH_MM, 'value': 'mm'},
+    {'unit': TokenKind.UNIT_LENGTH_IN, 'value': 'in'},
+    {'unit': TokenKind.UNIT_LENGTH_PT, 'value': 'pt'},
+    {'unit': TokenKind.UNIT_LENGTH_PC, 'value': 'pc'},
+    {'unit': TokenKind.UNIT_ANGLE_DEG, 'value': 'deg'},
+    {'unit': TokenKind.UNIT_ANGLE_RAD, 'value': 'rad'},
+    {'unit': TokenKind.UNIT_ANGLE_GRAD, 'value': 'grad'},
+    {'unit': TokenKind.UNIT_ANGLE_TURN, 'value': 'turn'},
+    {'unit': TokenKind.UNIT_TIME_MS, 'value': 'ms'},
+    {'unit': TokenKind.UNIT_TIME_S, 'value': 's'},
+    {'unit': TokenKind.UNIT_FREQ_HZ, 'value': 'hz'},
+    {'unit': TokenKind.UNIT_FREQ_KHZ, 'value': 'khz'},
+    {'unit': TokenKind.UNIT_FRACTION, 'value': 'fr'},
+    {'unit': TokenKind.UNIT_RESOLUTION_DPI, 'value': 'dpi'},
+    {'unit': TokenKind.UNIT_RESOLUTION_DPCM, 'value': 'dpcm'},
+    {'unit': TokenKind.UNIT_RESOLUTION_DPPX, 'value': 'dppx'},
+    {'unit': TokenKind.UNIT_CH, 'value': 'ch'},
+    {'unit': TokenKind.UNIT_REM, 'value': 'rem'},
+    {'unit': TokenKind.UNIT_VIEWPORT_VW, 'value': 'vw'},
+    {'unit': TokenKind.UNIT_VIEWPORT_VH, 'value': 'vh'},
+    {'unit': TokenKind.UNIT_VIEWPORT_VMIN, 'value': 'vmin'},
+    {'unit': TokenKind.UNIT_VIEWPORT_VMAX, 'value': 'vmax'},
   ];
 
   // Some more constants:
@@ -320,154 +296,154 @@
   static const int ASCII_UPPER_Z = 90; // ASCII value for uppercase Z
 
   // Extended color keywords:
-  static const List<Map> _EXTENDED_COLOR_NAMES = const [
-    const {'name': 'aliceblue', 'value': 0xF08FF},
-    const {'name': 'antiquewhite', 'value': 0xFAEBD7},
-    const {'name': 'aqua', 'value': 0x00FFFF},
-    const {'name': 'aquamarine', 'value': 0x7FFFD4},
-    const {'name': 'azure', 'value': 0xF0FFFF},
-    const {'name': 'beige', 'value': 0xF5F5DC},
-    const {'name': 'bisque', 'value': 0xFFE4C4},
-    const {'name': 'black', 'value': 0x000000},
-    const {'name': 'blanchedalmond', 'value': 0xFFEBCD},
-    const {'name': 'blue', 'value': 0x0000FF},
-    const {'name': 'blueviolet', 'value': 0x8A2BE2},
-    const {'name': 'brown', 'value': 0xA52A2A},
-    const {'name': 'burlywood', 'value': 0xDEB887},
-    const {'name': 'cadetblue', 'value': 0x5F9EA0},
-    const {'name': 'chartreuse', 'value': 0x7FFF00},
-    const {'name': 'chocolate', 'value': 0xD2691E},
-    const {'name': 'coral', 'value': 0xFF7F50},
-    const {'name': 'cornflowerblue', 'value': 0x6495ED},
-    const {'name': 'cornsilk', 'value': 0xFFF8DC},
-    const {'name': 'crimson', 'value': 0xDC143C},
-    const {'name': 'cyan', 'value': 0x00FFFF},
-    const {'name': 'darkblue', 'value': 0x00008B},
-    const {'name': 'darkcyan', 'value': 0x008B8B},
-    const {'name': 'darkgoldenrod', 'value': 0xB8860B},
-    const {'name': 'darkgray', 'value': 0xA9A9A9},
-    const {'name': 'darkgreen', 'value': 0x006400},
-    const {'name': 'darkgrey', 'value': 0xA9A9A9},
-    const {'name': 'darkkhaki', 'value': 0xBDB76B},
-    const {'name': 'darkmagenta', 'value': 0x8B008B},
-    const {'name': 'darkolivegreen', 'value': 0x556B2F},
-    const {'name': 'darkorange', 'value': 0xFF8C00},
-    const {'name': 'darkorchid', 'value': 0x9932CC},
-    const {'name': 'darkred', 'value': 0x8B0000},
-    const {'name': 'darksalmon', 'value': 0xE9967A},
-    const {'name': 'darkseagreen', 'value': 0x8FBC8F},
-    const {'name': 'darkslateblue', 'value': 0x483D8B},
-    const {'name': 'darkslategray', 'value': 0x2F4F4F},
-    const {'name': 'darkslategrey', 'value': 0x2F4F4F},
-    const {'name': 'darkturquoise', 'value': 0x00CED1},
-    const {'name': 'darkviolet', 'value': 0x9400D3},
-    const {'name': 'deeppink', 'value': 0xFF1493},
-    const {'name': 'deepskyblue', 'value': 0x00BFFF},
-    const {'name': 'dimgray', 'value': 0x696969},
-    const {'name': 'dimgrey', 'value': 0x696969},
-    const {'name': 'dodgerblue', 'value': 0x1E90FF},
-    const {'name': 'firebrick', 'value': 0xB22222},
-    const {'name': 'floralwhite', 'value': 0xFFFAF0},
-    const {'name': 'forestgreen', 'value': 0x228B22},
-    const {'name': 'fuchsia', 'value': 0xFF00FF},
-    const {'name': 'gainsboro', 'value': 0xDCDCDC},
-    const {'name': 'ghostwhite', 'value': 0xF8F8FF},
-    const {'name': 'gold', 'value': 0xFFD700},
-    const {'name': 'goldenrod', 'value': 0xDAA520},
-    const {'name': 'gray', 'value': 0x808080},
-    const {'name': 'green', 'value': 0x008000},
-    const {'name': 'greenyellow', 'value': 0xADFF2F},
-    const {'name': 'grey', 'value': 0x808080},
-    const {'name': 'honeydew', 'value': 0xF0FFF0},
-    const {'name': 'hotpink', 'value': 0xFF69B4},
-    const {'name': 'indianred', 'value': 0xCD5C5C},
-    const {'name': 'indigo', 'value': 0x4B0082},
-    const {'name': 'ivory', 'value': 0xFFFFF0},
-    const {'name': 'khaki', 'value': 0xF0E68C},
-    const {'name': 'lavender', 'value': 0xE6E6FA},
-    const {'name': 'lavenderblush', 'value': 0xFFF0F5},
-    const {'name': 'lawngreen', 'value': 0x7CFC00},
-    const {'name': 'lemonchiffon', 'value': 0xFFFACD},
-    const {'name': 'lightblue', 'value': 0xADD8E6},
-    const {'name': 'lightcoral', 'value': 0xF08080},
-    const {'name': 'lightcyan', 'value': 0xE0FFFF},
-    const {'name': 'lightgoldenrodyellow', 'value': 0xFAFAD2},
-    const {'name': 'lightgray', 'value': 0xD3D3D3},
-    const {'name': 'lightgreen', 'value': 0x90EE90},
-    const {'name': 'lightgrey', 'value': 0xD3D3D3},
-    const {'name': 'lightpink', 'value': 0xFFB6C1},
-    const {'name': 'lightsalmon', 'value': 0xFFA07A},
-    const {'name': 'lightseagreen', 'value': 0x20B2AA},
-    const {'name': 'lightskyblue', 'value': 0x87CEFA},
-    const {'name': 'lightslategray', 'value': 0x778899},
-    const {'name': 'lightslategrey', 'value': 0x778899},
-    const {'name': 'lightsteelblue', 'value': 0xB0C4DE},
-    const {'name': 'lightyellow', 'value': 0xFFFFE0},
-    const {'name': 'lime', 'value': 0x00FF00},
-    const {'name': 'limegreen', 'value': 0x32CD32},
-    const {'name': 'linen', 'value': 0xFAF0E6},
-    const {'name': 'magenta', 'value': 0xFF00FF},
-    const {'name': 'maroon', 'value': 0x800000},
-    const {'name': 'mediumaquamarine', 'value': 0x66CDAA},
-    const {'name': 'mediumblue', 'value': 0x0000CD},
-    const {'name': 'mediumorchid', 'value': 0xBA55D3},
-    const {'name': 'mediumpurple', 'value': 0x9370DB},
-    const {'name': 'mediumseagreen', 'value': 0x3CB371},
-    const {'name': 'mediumslateblue', 'value': 0x7B68EE},
-    const {'name': 'mediumspringgreen', 'value': 0x00FA9A},
-    const {'name': 'mediumturquoise', 'value': 0x48D1CC},
-    const {'name': 'mediumvioletred', 'value': 0xC71585},
-    const {'name': 'midnightblue', 'value': 0x191970},
-    const {'name': 'mintcream', 'value': 0xF5FFFA},
-    const {'name': 'mistyrose', 'value': 0xFFE4E1},
-    const {'name': 'moccasin', 'value': 0xFFE4B5},
-    const {'name': 'navajowhite', 'value': 0xFFDEAD},
-    const {'name': 'navy', 'value': 0x000080},
-    const {'name': 'oldlace', 'value': 0xFDF5E6},
-    const {'name': 'olive', 'value': 0x808000},
-    const {'name': 'olivedrab', 'value': 0x6B8E23},
-    const {'name': 'orange', 'value': 0xFFA500},
-    const {'name': 'orangered', 'value': 0xFF4500},
-    const {'name': 'orchid', 'value': 0xDA70D6},
-    const {'name': 'palegoldenrod', 'value': 0xEEE8AA},
-    const {'name': 'palegreen', 'value': 0x98FB98},
-    const {'name': 'paleturquoise', 'value': 0xAFEEEE},
-    const {'name': 'palevioletred', 'value': 0xDB7093},
-    const {'name': 'papayawhip', 'value': 0xFFEFD5},
-    const {'name': 'peachpuff', 'value': 0xFFDAB9},
-    const {'name': 'peru', 'value': 0xCD853F},
-    const {'name': 'pink', 'value': 0xFFC0CB},
-    const {'name': 'plum', 'value': 0xDDA0DD},
-    const {'name': 'powderblue', 'value': 0xB0E0E6},
-    const {'name': 'purple', 'value': 0x800080},
-    const {'name': 'red', 'value': 0xFF0000},
-    const {'name': 'rosybrown', 'value': 0xBC8F8F},
-    const {'name': 'royalblue', 'value': 0x4169E1},
-    const {'name': 'saddlebrown', 'value': 0x8B4513},
-    const {'name': 'salmon', 'value': 0xFA8072},
-    const {'name': 'sandybrown', 'value': 0xF4A460},
-    const {'name': 'seagreen', 'value': 0x2E8B57},
-    const {'name': 'seashell', 'value': 0xFFF5EE},
-    const {'name': 'sienna', 'value': 0xA0522D},
-    const {'name': 'silver', 'value': 0xC0C0C0},
-    const {'name': 'skyblue', 'value': 0x87CEEB},
-    const {'name': 'slateblue', 'value': 0x6A5ACD},
-    const {'name': 'slategray', 'value': 0x708090},
-    const {'name': 'slategrey', 'value': 0x708090},
-    const {'name': 'snow', 'value': 0xFFFAFA},
-    const {'name': 'springgreen', 'value': 0x00FF7F},
-    const {'name': 'steelblue', 'value': 0x4682B4},
-    const {'name': 'tan', 'value': 0xD2B48C},
-    const {'name': 'teal', 'value': 0x008080},
-    const {'name': 'thistle', 'value': 0xD8BFD8},
-    const {'name': 'tomato', 'value': 0xFF6347},
-    const {'name': 'turquoise', 'value': 0x40E0D0},
-    const {'name': 'violet', 'value': 0xEE82EE},
-    const {'name': 'wheat', 'value': 0xF5DEB3},
-    const {'name': 'white', 'value': 0xFFFFFF},
-    const {'name': 'whitesmoke', 'value': 0xF5F5F5},
-    const {'name': 'yellow', 'value': 0xFFFF00},
-    const {'name': 'yellowgreen', 'value': 0x9ACD32},
+  static const List<Map> _EXTENDED_COLOR_NAMES = [
+    {'name': 'aliceblue', 'value': 0xF08FF},
+    {'name': 'antiquewhite', 'value': 0xFAEBD7},
+    {'name': 'aqua', 'value': 0x00FFFF},
+    {'name': 'aquamarine', 'value': 0x7FFFD4},
+    {'name': 'azure', 'value': 0xF0FFFF},
+    {'name': 'beige', 'value': 0xF5F5DC},
+    {'name': 'bisque', 'value': 0xFFE4C4},
+    {'name': 'black', 'value': 0x000000},
+    {'name': 'blanchedalmond', 'value': 0xFFEBCD},
+    {'name': 'blue', 'value': 0x0000FF},
+    {'name': 'blueviolet', 'value': 0x8A2BE2},
+    {'name': 'brown', 'value': 0xA52A2A},
+    {'name': 'burlywood', 'value': 0xDEB887},
+    {'name': 'cadetblue', 'value': 0x5F9EA0},
+    {'name': 'chartreuse', 'value': 0x7FFF00},
+    {'name': 'chocolate', 'value': 0xD2691E},
+    {'name': 'coral', 'value': 0xFF7F50},
+    {'name': 'cornflowerblue', 'value': 0x6495ED},
+    {'name': 'cornsilk', 'value': 0xFFF8DC},
+    {'name': 'crimson', 'value': 0xDC143C},
+    {'name': 'cyan', 'value': 0x00FFFF},
+    {'name': 'darkblue', 'value': 0x00008B},
+    {'name': 'darkcyan', 'value': 0x008B8B},
+    {'name': 'darkgoldenrod', 'value': 0xB8860B},
+    {'name': 'darkgray', 'value': 0xA9A9A9},
+    {'name': 'darkgreen', 'value': 0x006400},
+    {'name': 'darkgrey', 'value': 0xA9A9A9},
+    {'name': 'darkkhaki', 'value': 0xBDB76B},
+    {'name': 'darkmagenta', 'value': 0x8B008B},
+    {'name': 'darkolivegreen', 'value': 0x556B2F},
+    {'name': 'darkorange', 'value': 0xFF8C00},
+    {'name': 'darkorchid', 'value': 0x9932CC},
+    {'name': 'darkred', 'value': 0x8B0000},
+    {'name': 'darksalmon', 'value': 0xE9967A},
+    {'name': 'darkseagreen', 'value': 0x8FBC8F},
+    {'name': 'darkslateblue', 'value': 0x483D8B},
+    {'name': 'darkslategray', 'value': 0x2F4F4F},
+    {'name': 'darkslategrey', 'value': 0x2F4F4F},
+    {'name': 'darkturquoise', 'value': 0x00CED1},
+    {'name': 'darkviolet', 'value': 0x9400D3},
+    {'name': 'deeppink', 'value': 0xFF1493},
+    {'name': 'deepskyblue', 'value': 0x00BFFF},
+    {'name': 'dimgray', 'value': 0x696969},
+    {'name': 'dimgrey', 'value': 0x696969},
+    {'name': 'dodgerblue', 'value': 0x1E90FF},
+    {'name': 'firebrick', 'value': 0xB22222},
+    {'name': 'floralwhite', 'value': 0xFFFAF0},
+    {'name': 'forestgreen', 'value': 0x228B22},
+    {'name': 'fuchsia', 'value': 0xFF00FF},
+    {'name': 'gainsboro', 'value': 0xDCDCDC},
+    {'name': 'ghostwhite', 'value': 0xF8F8FF},
+    {'name': 'gold', 'value': 0xFFD700},
+    {'name': 'goldenrod', 'value': 0xDAA520},
+    {'name': 'gray', 'value': 0x808080},
+    {'name': 'green', 'value': 0x008000},
+    {'name': 'greenyellow', 'value': 0xADFF2F},
+    {'name': 'grey', 'value': 0x808080},
+    {'name': 'honeydew', 'value': 0xF0FFF0},
+    {'name': 'hotpink', 'value': 0xFF69B4},
+    {'name': 'indianred', 'value': 0xCD5C5C},
+    {'name': 'indigo', 'value': 0x4B0082},
+    {'name': 'ivory', 'value': 0xFFFFF0},
+    {'name': 'khaki', 'value': 0xF0E68C},
+    {'name': 'lavender', 'value': 0xE6E6FA},
+    {'name': 'lavenderblush', 'value': 0xFFF0F5},
+    {'name': 'lawngreen', 'value': 0x7CFC00},
+    {'name': 'lemonchiffon', 'value': 0xFFFACD},
+    {'name': 'lightblue', 'value': 0xADD8E6},
+    {'name': 'lightcoral', 'value': 0xF08080},
+    {'name': 'lightcyan', 'value': 0xE0FFFF},
+    {'name': 'lightgoldenrodyellow', 'value': 0xFAFAD2},
+    {'name': 'lightgray', 'value': 0xD3D3D3},
+    {'name': 'lightgreen', 'value': 0x90EE90},
+    {'name': 'lightgrey', 'value': 0xD3D3D3},
+    {'name': 'lightpink', 'value': 0xFFB6C1},
+    {'name': 'lightsalmon', 'value': 0xFFA07A},
+    {'name': 'lightseagreen', 'value': 0x20B2AA},
+    {'name': 'lightskyblue', 'value': 0x87CEFA},
+    {'name': 'lightslategray', 'value': 0x778899},
+    {'name': 'lightslategrey', 'value': 0x778899},
+    {'name': 'lightsteelblue', 'value': 0xB0C4DE},
+    {'name': 'lightyellow', 'value': 0xFFFFE0},
+    {'name': 'lime', 'value': 0x00FF00},
+    {'name': 'limegreen', 'value': 0x32CD32},
+    {'name': 'linen', 'value': 0xFAF0E6},
+    {'name': 'magenta', 'value': 0xFF00FF},
+    {'name': 'maroon', 'value': 0x800000},
+    {'name': 'mediumaquamarine', 'value': 0x66CDAA},
+    {'name': 'mediumblue', 'value': 0x0000CD},
+    {'name': 'mediumorchid', 'value': 0xBA55D3},
+    {'name': 'mediumpurple', 'value': 0x9370DB},
+    {'name': 'mediumseagreen', 'value': 0x3CB371},
+    {'name': 'mediumslateblue', 'value': 0x7B68EE},
+    {'name': 'mediumspringgreen', 'value': 0x00FA9A},
+    {'name': 'mediumturquoise', 'value': 0x48D1CC},
+    {'name': 'mediumvioletred', 'value': 0xC71585},
+    {'name': 'midnightblue', 'value': 0x191970},
+    {'name': 'mintcream', 'value': 0xF5FFFA},
+    {'name': 'mistyrose', 'value': 0xFFE4E1},
+    {'name': 'moccasin', 'value': 0xFFE4B5},
+    {'name': 'navajowhite', 'value': 0xFFDEAD},
+    {'name': 'navy', 'value': 0x000080},
+    {'name': 'oldlace', 'value': 0xFDF5E6},
+    {'name': 'olive', 'value': 0x808000},
+    {'name': 'olivedrab', 'value': 0x6B8E23},
+    {'name': 'orange', 'value': 0xFFA500},
+    {'name': 'orangered', 'value': 0xFF4500},
+    {'name': 'orchid', 'value': 0xDA70D6},
+    {'name': 'palegoldenrod', 'value': 0xEEE8AA},
+    {'name': 'palegreen', 'value': 0x98FB98},
+    {'name': 'paleturquoise', 'value': 0xAFEEEE},
+    {'name': 'palevioletred', 'value': 0xDB7093},
+    {'name': 'papayawhip', 'value': 0xFFEFD5},
+    {'name': 'peachpuff', 'value': 0xFFDAB9},
+    {'name': 'peru', 'value': 0xCD853F},
+    {'name': 'pink', 'value': 0xFFC0CB},
+    {'name': 'plum', 'value': 0xDDA0DD},
+    {'name': 'powderblue', 'value': 0xB0E0E6},
+    {'name': 'purple', 'value': 0x800080},
+    {'name': 'red', 'value': 0xFF0000},
+    {'name': 'rosybrown', 'value': 0xBC8F8F},
+    {'name': 'royalblue', 'value': 0x4169E1},
+    {'name': 'saddlebrown', 'value': 0x8B4513},
+    {'name': 'salmon', 'value': 0xFA8072},
+    {'name': 'sandybrown', 'value': 0xF4A460},
+    {'name': 'seagreen', 'value': 0x2E8B57},
+    {'name': 'seashell', 'value': 0xFFF5EE},
+    {'name': 'sienna', 'value': 0xA0522D},
+    {'name': 'silver', 'value': 0xC0C0C0},
+    {'name': 'skyblue', 'value': 0x87CEEB},
+    {'name': 'slateblue', 'value': 0x6A5ACD},
+    {'name': 'slategray', 'value': 0x708090},
+    {'name': 'slategrey', 'value': 0x708090},
+    {'name': 'snow', 'value': 0xFFFAFA},
+    {'name': 'springgreen', 'value': 0x00FF7F},
+    {'name': 'steelblue', 'value': 0x4682B4},
+    {'name': 'tan', 'value': 0xD2B48C},
+    {'name': 'teal', 'value': 0x008080},
+    {'name': 'thistle', 'value': 0xD8BFD8},
+    {'name': 'tomato', 'value': 0xFF6347},
+    {'name': 'turquoise', 'value': 0x40E0D0},
+    {'name': 'violet', 'value': 0xEE82EE},
+    {'name': 'wheat', 'value': 0xF5DEB3},
+    {'name': 'white', 'value': 0xFFFFFF},
+    {'name': 'whitesmoke', 'value': 0xF5F5F5},
+    {'name': 'yellow', 'value': 0xFFFF00},
+    {'name': 'yellowgreen', 'value': 0x9ACD32},
   ];
 
   // TODO(terry): Should used Dart mirroring for parameter values and types
@@ -597,7 +573,7 @@
   static String decimalToHex(int number, [int minDigits = 1]) {
     final String _HEX_DIGITS = '0123456789abcdef';
 
-    List<String> result = new List<String>();
+    List<String> result = List<String>();
 
     int dividend = number >> 4;
     int remain = number % 16;
@@ -608,7 +584,7 @@
       result.add(_HEX_DIGITS[remain]);
     }
 
-    StringBuffer invertResult = new StringBuffer();
+    StringBuffer invertResult = StringBuffer();
     int paddings = minDigits - result.length;
     while (paddings-- > 0) {
       invertResult.write('0');
diff --git a/lib/src/tree.dart b/lib/src/tree.dart
index f68c879..fa66422 100644
--- a/lib/src/tree.dart
+++ b/lib/src/tree.dart
@@ -13,7 +13,7 @@
 
   Identifier(this.name, SourceSpan span) : super(span);
 
-  Identifier clone() => new Identifier(name, span);
+  Identifier clone() => Identifier(name, span);
 
   visit(VisitorBase visitor) => visitor.visitIdentifier(this);
 
@@ -22,7 +22,7 @@
 
 class Wildcard extends TreeNode {
   Wildcard(SourceSpan span) : super(span);
-  Wildcard clone() => new Wildcard(span);
+  Wildcard clone() => Wildcard(span);
   visit(VisitorBase visitor) => visitor.visitWildcard(this);
 
   String get name => '*';
@@ -30,7 +30,7 @@
 
 class ThisOperator extends TreeNode {
   ThisOperator(SourceSpan span) : super(span);
-  ThisOperator clone() => new ThisOperator(span);
+  ThisOperator clone() => ThisOperator(span);
   visit(VisitorBase visitor) => visitor.visitThisOperator(this);
 
   String get name => '&';
@@ -38,7 +38,7 @@
 
 class Negation extends TreeNode {
   Negation(SourceSpan span) : super(span);
-  Negation clone() => new Negation(span);
+  Negation clone() => Negation(span);
   visit(VisitorBase visitor) => visitor.visitNegation(this);
 
   String get name => 'not';
@@ -53,7 +53,7 @@
   CalcTerm(var value, String t, this.expr, SourceSpan span)
       : super(value, t, span);
 
-  CalcTerm clone() => new CalcTerm(value, text, expr.clone(), span);
+  CalcTerm clone() => CalcTerm(value, text, expr.clone(), span);
   visit(VisitorBase visitor) => visitor.visitCalcTerm(this);
 
   String toString() => "$text($expr)";
@@ -64,14 +64,14 @@
   final String comment;
 
   CssComment(this.comment, SourceSpan span) : super(span);
-  CssComment clone() => new CssComment(comment, span);
+  CssComment clone() => CssComment(comment, span);
   visit(VisitorBase visitor) => visitor.visitCssComment(this);
 }
 
 // CDO/CDC (Comment Definition Open <!-- and Comment Definition Close -->).
 class CommentDefinition extends CssComment {
   CommentDefinition(String comment, SourceSpan span) : super(comment, span);
-  CommentDefinition clone() => new CommentDefinition(comment, span);
+  CommentDefinition clone() => CommentDefinition(comment, span);
   visit(VisitorBase visitor) => visitor.visitCommentDefinition(this);
 }
 
@@ -80,7 +80,7 @@
 
   SelectorGroup(this.selectors, SourceSpan span) : super(span);
 
-  SelectorGroup clone() => new SelectorGroup(selectors, span);
+  SelectorGroup clone() => SelectorGroup(selectors, span);
 
   visit(VisitorBase visitor) => visitor.visitSelectorGroup(this);
 }
@@ -98,7 +98,7 @@
     var simpleSequences =
         simpleSelectorSequences.map((ss) => ss.clone()).toList();
 
-    return new Selector(simpleSequences, span);
+    return Selector(simpleSequences, span);
   }
 
   visit(VisitorBase visitor) => visitor.visitSelector(this);
@@ -144,7 +144,7 @@
   }
 
   SimpleSelectorSequence clone() =>
-      new SimpleSelectorSequence(simpleSelector, span, combinator);
+      SimpleSelectorSequence(simpleSelector, span, combinator);
 
   visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this);
 
@@ -172,7 +172,7 @@
   ElementSelector(name, SourceSpan span) : super(name, span);
   visit(VisitorBase visitor) => visitor.visitElementSelector(this);
 
-  ElementSelector clone() => new ElementSelector(_name, span);
+  ElementSelector clone() => ElementSelector(_name, span);
 
   String toString() => name;
 }
@@ -191,7 +191,7 @@
 
   SimpleSelector get nameAsSimpleSelector => _name;
 
-  NamespaceSelector clone() => new NamespaceSelector(_namespace, "", span);
+  NamespaceSelector clone() => NamespaceSelector(_namespace, "", span);
 
   visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this);
 
@@ -261,7 +261,7 @@
     }
   }
 
-  AttributeSelector clone() => new AttributeSelector(_name, _op, _value, span);
+  AttributeSelector clone() => AttributeSelector(_name, _op, _value, span);
 
   visit(VisitorBase visitor) => visitor.visitAttributeSelector(this);
 
@@ -271,7 +271,7 @@
 // #id
 class IdSelector extends SimpleSelector {
   IdSelector(Identifier name, SourceSpan span) : super(name, span);
-  IdSelector clone() => new IdSelector(_name, span);
+  IdSelector clone() => IdSelector(_name, span);
   visit(VisitorBase visitor) => visitor.visitIdSelector(this);
 
   String toString() => "#$_name";
@@ -280,7 +280,7 @@
 // .class
 class ClassSelector extends SimpleSelector {
   ClassSelector(Identifier name, SourceSpan span) : super(name, span);
-  ClassSelector clone() => new ClassSelector(_name, span);
+  ClassSelector clone() => ClassSelector(_name, span);
   visit(VisitorBase visitor) => visitor.visitClassSelector(this);
 
   String toString() => ".$_name";
@@ -291,7 +291,7 @@
   PseudoClassSelector(Identifier name, SourceSpan span) : super(name, span);
   visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this);
 
-  PseudoClassSelector clone() => new PseudoClassSelector(_name, span);
+  PseudoClassSelector clone() => PseudoClassSelector(_name, span);
 
   String toString() => ":$name";
 }
@@ -302,11 +302,11 @@
   final bool isLegacy;
 
   PseudoElementSelector(Identifier name, SourceSpan span,
-      {this.isLegacy: false})
+      {this.isLegacy = false})
       : super(name, span);
   visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this);
 
-  PseudoElementSelector clone() => new PseudoElementSelector(_name, span);
+  PseudoElementSelector clone() => PseudoElementSelector(_name, span);
 
   String toString() => "${isLegacy ? ':' : '::'}$name";
 }
@@ -319,7 +319,7 @@
       : super(name, span);
 
   PseudoClassFunctionSelector clone() =>
-      new PseudoClassFunctionSelector(_name, _argument, span);
+      PseudoClassFunctionSelector(_name, _argument, span);
 
   TreeNode get argument => _argument;
   Selector get selector => _argument as Selector;
@@ -337,7 +337,7 @@
       : super(name, span);
 
   PseudoElementFunctionSelector clone() =>
-      new PseudoElementFunctionSelector(_name, expression, span);
+      PseudoElementFunctionSelector(_name, expression, span);
 
   visit(VisitorBase visitor) =>
       visitor.visitPseudoElementFunctionSelector(this);
@@ -349,8 +349,7 @@
   SelectorExpression(this.expressions, SourceSpan span) : super(span);
 
   SelectorExpression clone() {
-    return new SelectorExpression(
-        expressions.map((e) => e.clone()).toList(), span);
+    return SelectorExpression(expressions.map((e) => e.clone()).toList(), span);
   }
 
   visit(VisitorBase visitor) => visitor.visitSelectorExpression(this);
@@ -361,9 +360,9 @@
   final SimpleSelector negationArg;
 
   NegationSelector(this.negationArg, SourceSpan span)
-      : super(new Negation(span), span);
+      : super(Negation(span), span);
 
-  NegationSelector clone() => new NegationSelector(negationArg, span);
+  NegationSelector clone() => NegationSelector(negationArg, span);
 
   visit(VisitorBase visitor) => visitor.visitNegationSelector(this);
 }
@@ -371,7 +370,7 @@
 class NoOp extends TreeNode {
   NoOp() : super(null);
 
-  NoOp clone() => new NoOp();
+  NoOp clone() => NoOp();
 
   visit(VisitorBase visitor) => visitor.visitNoOp(this);
 }
@@ -391,7 +390,7 @@
 
   StyleSheet clone() {
     var clonedTopLevels = topLevels.map((e) => e.clone()).toList();
-    return new StyleSheet(clonedTopLevels, span);
+    return StyleSheet(clonedTopLevels, span);
   }
 
   visit(VisitorBase visitor) => visitor.visitStyleSheet(this);
@@ -399,7 +398,7 @@
 
 class TopLevelProduction extends TreeNode {
   TopLevelProduction(SourceSpan span) : super(span);
-  TopLevelProduction clone() => new TopLevelProduction(span);
+  TopLevelProduction clone() => TopLevelProduction(span);
   visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this);
 }
 
@@ -416,7 +415,7 @@
   RuleSet clone() {
     var cloneSelectorGroup = _selectorGroup.clone();
     var cloneDeclarationGroup = _declarationGroup.clone();
-    return new RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span);
+    return RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span);
   }
 
   visit(VisitorBase visitor) => visitor.visitRuleSet(this);
@@ -428,7 +427,7 @@
   bool get isBuiltIn => true; // Known CSS directive?
   bool get isExtension => false; // SCSS extension?
 
-  Directive clone() => new Directive(span);
+  Directive clone() => Directive(span);
   visit(VisitorBase visitor) => visitor.visitDirective(this);
 }
 
@@ -448,7 +447,7 @@
     for (var rule in groupRuleBody) {
       clonedGroupRuleBody.add(rule.clone());
     }
-    return new DocumentDirective(clonedFunctions, clonedGroupRuleBody, span);
+    return DocumentDirective(clonedFunctions, clonedGroupRuleBody, span);
   }
 
   visit(VisitorBase visitor) => visitor.visitDocumentDirective(this);
@@ -467,7 +466,7 @@
     for (var rule in groupRuleBody) {
       clonedGroupRuleBody.add(rule.clone());
     }
-    return new SupportsDirective(clonedCondition, clonedGroupRuleBody, span);
+    return SupportsDirective(clonedCondition, clonedGroupRuleBody, span);
   }
 
   visit(VisitorBase visitor) => visitor.visitSupportsDirective(this);
@@ -490,7 +489,7 @@
         super(span);
 
   SupportsConditionInParens clone() =>
-      new SupportsConditionInParens(condition.clone(), span);
+      SupportsConditionInParens(condition.clone(), span);
 
   visit(VisitorBase visitor) => visitor.visitSupportsConditionInParens(this);
 }
@@ -500,7 +499,7 @@
 
   SupportsNegation(this.condition, SourceSpan span) : super(span);
 
-  SupportsNegation clone() => new SupportsNegation(condition.clone(), span);
+  SupportsNegation clone() => SupportsNegation(condition.clone(), span);
 
   visit(VisitorBase visitor) => visitor.visitSupportsNegation(this);
 }
@@ -515,7 +514,7 @@
     for (var condition in conditions) {
       clonedConditions.add(condition.clone());
     }
-    return new SupportsConjunction(clonedConditions, span);
+    return SupportsConjunction(clonedConditions, span);
   }
 
   visit(VisitorBase visitor) => visitor.visitSupportsConjunction(this);
@@ -531,7 +530,7 @@
     for (var condition in conditions) {
       clonedConditions.add(condition.clone());
     }
-    return new SupportsDisjunction(clonedConditions, span);
+    return SupportsDisjunction(clonedConditions, span);
   }
 
   visit(VisitorBase visitor) => visitor.visitSupportsDisjunction(this);
@@ -545,7 +544,7 @@
       : super(span);
 
   ViewportDirective clone() =>
-      new ViewportDirective(name, declarations.clone(), span);
+      ViewportDirective(name, declarations.clone(), span);
 
   visit(VisitorBase visitor) => visitor.visitViewportDirective(this);
 }
@@ -565,7 +564,7 @@
     for (var mediaQuery in mediaQueries) {
       cloneMediaQueries.add(mediaQuery.clone());
     }
-    return new ImportDirective(import, cloneMediaQueries, span);
+    return ImportDirective(import, cloneMediaQueries, span);
   }
 
   visit(VisitorBase visitor) => visitor.visitImportDirective(this);
@@ -587,7 +586,7 @@
 
   MediaExpression clone() {
     var clonedExprs = exprs.clone();
-    return new MediaExpression(andOperator, _mediaFeature, clonedExprs, span);
+    return MediaExpression(andOperator, _mediaFeature, clonedExprs, span);
   }
 
   visit(VisitorBase visitor) => visitor.visitMediaExpression(this);
@@ -625,7 +624,7 @@
     for (var expr in expressions) {
       cloneExpressions.add(expr.clone());
     }
-    return new MediaQuery(_mediaUnary, _mediaType, cloneExpressions, span);
+    return MediaQuery(_mediaUnary, _mediaType, cloneExpressions, span);
   }
 
   visit(VisitorBase visitor) => visitor.visitMediaQuery(this);
@@ -646,7 +645,7 @@
     for (var rule in rules) {
       cloneRules.add(rule.clone());
     }
-    return new MediaDirective(cloneQueries, cloneRules, span);
+    return MediaDirective(cloneQueries, cloneRules, span);
   }
 
   visit(VisitorBase visitor) => visitor.visitMediaDirective(this);
@@ -662,7 +661,7 @@
     for (var rule in rules) {
       cloneRules.add(rule.clone());
     }
-    return new HostDirective(cloneRules, span);
+    return HostDirective(cloneRules, span);
   }
 
   visit(VisitorBase visitor) => visitor.visitHostDirective(this);
@@ -682,20 +681,20 @@
     for (var declMargin in _declsMargin) {
       cloneDeclsMargin.add(declMargin.clone());
     }
-    return new PageDirective(_ident, _pseudoPage, cloneDeclsMargin, span);
+    return PageDirective(_ident, _pseudoPage, cloneDeclsMargin, span);
   }
 
   visit(VisitorBase visitor) => visitor.visitPageDirective(this);
 
-  bool get hasIdent => _ident != null && _ident.length > 0;
-  bool get hasPseudoPage => _pseudoPage != null && _pseudoPage.length > 0;
+  bool get hasIdent => _ident != null && _ident.isNotEmpty;
+  bool get hasPseudoPage => _pseudoPage != null && _pseudoPage.isNotEmpty;
 }
 
 class CharsetDirective extends Directive {
   final String charEncoding;
 
   CharsetDirective(this.charEncoding, SourceSpan span) : super(span);
-  CharsetDirective clone() => new CharsetDirective(charEncoding, span);
+  CharsetDirective clone() => CharsetDirective(charEncoding, span);
   visit(VisitorBase visitor) => visitor.visitCharsetDirective(this);
 }
 
@@ -747,7 +746,7 @@
       : super(span);
 
   KeyFrameBlock clone() =>
-      new KeyFrameBlock(_blockSelectors.clone(), _declarations.clone(), span);
+      KeyFrameBlock(_blockSelectors.clone(), _declarations.clone(), span);
   visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this);
 }
 
@@ -756,8 +755,7 @@
 
   FontFaceDirective(this._declarations, SourceSpan span) : super(span);
 
-  FontFaceDirective clone() =>
-      new FontFaceDirective(_declarations.clone(), span);
+  FontFaceDirective clone() => FontFaceDirective(_declarations.clone(), span);
   visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this);
 }
 
@@ -776,7 +774,7 @@
     for (var rule in rules) {
       cloneRules.add(rule.clone());
     }
-    return new StyletDirective(dartClassName, cloneRules, span);
+    return StyletDirective(dartClassName, cloneRules, span);
   }
 
   visit(VisitorBase visitor) => visitor.visitStyletDirective(this);
@@ -791,11 +789,11 @@
 
   NamespaceDirective(this._prefix, this._uri, SourceSpan span) : super(span);
 
-  NamespaceDirective clone() => new NamespaceDirective(_prefix, _uri, span);
+  NamespaceDirective clone() => NamespaceDirective(_prefix, _uri, span);
 
   visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this);
 
-  String get prefix => _prefix.length > 0 ? '$_prefix ' : '';
+  String get prefix => _prefix.isNotEmpty ? '$_prefix ' : '';
 }
 
 /// To support Less syntax @name: expression
@@ -804,8 +802,7 @@
 
   VarDefinitionDirective(this.def, SourceSpan span) : super(span);
 
-  VarDefinitionDirective clone() =>
-      new VarDefinitionDirective(def.clone(), span);
+  VarDefinitionDirective clone() => VarDefinitionDirective(def.clone(), span);
 
   visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this);
 }
@@ -823,7 +820,7 @@
     for (var definedArg in definedArgs) {
       cloneDefinedArgs.add(definedArg.clone());
     }
-    return new MixinDefinition(name, cloneDefinedArgs, varArgs, span);
+    return MixinDefinition(name, cloneDefinedArgs, varArgs, span);
   }
 
   visit(VisitorBase visitor) => visitor.visitMixinDefinition(this);
@@ -846,7 +843,7 @@
     for (var ruleset in rulesets) {
       clonedRulesets.add(ruleset.clone());
     }
-    return new MixinRulesetDirective(
+    return MixinRulesetDirective(
         name, clonedArgs, varArgs, clonedRulesets, span);
   }
 
@@ -865,7 +862,7 @@
     for (var arg in definedArgs) {
       clonedArgs.add(arg.clone());
     }
-    return new MixinDeclarationDirective(
+    return MixinDeclarationDirective(
         name, clonedArgs, varArgs, declarations.clone(), span);
   }
 
@@ -884,7 +881,7 @@
     for (var arg in args) {
       cloneArgs.add(arg.map((term) => term.clone()).toList());
     }
-    return new IncludeDirective(name, cloneArgs, span);
+    return IncludeDirective(name, cloneArgs, span);
   }
 
   visit(VisitorBase visitor) => visitor.visitIncludeDirective(this);
@@ -915,7 +912,7 @@
   final bool isIE7;
 
   Declaration(this._property, this._expression, this.dartStyle, SourceSpan span,
-      {bool important: false, bool ie7: false})
+      {bool important = false, bool ie7 = false})
       : this.important = important,
         this.isIE7 = ie7,
         super(span);
@@ -926,7 +923,7 @@
   bool get hasDartStyle => dartStyle != null;
 
   Declaration clone() =>
-      new Declaration(_property.clone(), _expression.clone(), dartStyle, span,
+      Declaration(_property.clone(), _expression.clone(), dartStyle, span,
           important: important);
 
   visit(VisitorBase visitor) => visitor.visitDeclaration(this);
@@ -946,7 +943,7 @@
 
   String get definedName => _property.name;
 
-  VarDefinition clone() => new VarDefinition(
+  VarDefinition clone() => VarDefinition(
       _property.clone(), expression != null ? expression.clone() : null, span);
 
   visit(VisitorBase visitor) => visitor.visitVarDefinition(this);
@@ -965,7 +962,7 @@
       : super(null, null, null, span);
 
   IncludeMixinAtDeclaration clone() =>
-      new IncludeMixinAtDeclaration(include.clone(), span);
+      IncludeMixinAtDeclaration(include.clone(), span);
 
   visit(VisitorBase visitor) => visitor.visitIncludeMixinAtDeclaration(this);
 }
@@ -978,7 +975,7 @@
 
   ExtendDeclaration clone() {
     var newSelector = selectors.map((s) => s.clone()).toList();
-    return new ExtendDeclaration(newSelector, span);
+    return ExtendDeclaration(newSelector, span);
   }
 
   visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this);
@@ -992,7 +989,7 @@
 
   DeclarationGroup clone() {
     var clonedDecls = declarations.map((d) => d.clone()).toList();
-    return new DeclarationGroup(clonedDecls, span);
+    return DeclarationGroup(clonedDecls, span);
   }
 
   visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this);
@@ -1004,7 +1001,7 @@
   MarginGroup(this.margin_sym, List<TreeNode> decls, SourceSpan span)
       : super(decls, span);
   MarginGroup clone() =>
-      new MarginGroup(margin_sym, super.clone().declarations, span);
+      MarginGroup(margin_sym, super.clone().declarations, span);
   visit(VisitorBase visitor) => visitor.visitMarginGroup(this);
 }
 
@@ -1019,7 +1016,7 @@
     for (var expr in defaultValues) {
       clonedValues.add(expr.clone());
     }
-    return new VarUsage(name, clonedValues, span);
+    return VarUsage(name, clonedValues, span);
   }
 
   visit(VisitorBase visitor) => visitor.visitVarUsage(this);
@@ -1027,25 +1024,25 @@
 
 class OperatorSlash extends Expression {
   OperatorSlash(SourceSpan span) : super(span);
-  OperatorSlash clone() => new OperatorSlash(span);
+  OperatorSlash clone() => OperatorSlash(span);
   visit(VisitorBase visitor) => visitor.visitOperatorSlash(this);
 }
 
 class OperatorComma extends Expression {
   OperatorComma(SourceSpan span) : super(span);
-  OperatorComma clone() => new OperatorComma(span);
+  OperatorComma clone() => OperatorComma(span);
   visit(VisitorBase visitor) => visitor.visitOperatorComma(this);
 }
 
 class OperatorPlus extends Expression {
   OperatorPlus(SourceSpan span) : super(span);
-  OperatorPlus clone() => new OperatorPlus(span);
+  OperatorPlus clone() => OperatorPlus(span);
   visit(VisitorBase visitor) => visitor.visitOperatorPlus(this);
 }
 
 class OperatorMinus extends Expression {
   OperatorMinus(SourceSpan span) : super(span);
-  OperatorMinus clone() => new OperatorMinus(span);
+  OperatorMinus clone() => OperatorMinus(span);
   visit(VisitorBase visitor) => visitor.visitOperatorMinus(this);
 }
 
@@ -1057,7 +1054,7 @@
 
   bool get hasSecond => second != null;
 
-  UnicodeRangeTerm clone() => new UnicodeRangeTerm(first, second, span);
+  UnicodeRangeTerm clone() => UnicodeRangeTerm(first, second, span);
 
   visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this);
 }
@@ -1071,14 +1068,14 @@
 
   LiteralTerm(this.value, this.text, SourceSpan span) : super(span);
 
-  LiteralTerm clone() => new LiteralTerm(value, text, span);
+  LiteralTerm clone() => LiteralTerm(value, text, span);
 
   visit(VisitorBase visitor) => visitor.visitLiteralTerm(this);
 }
 
 class NumberTerm extends LiteralTerm {
   NumberTerm(value, String t, SourceSpan span) : super(value, t, span);
-  NumberTerm clone() => new NumberTerm(value, text, span);
+  NumberTerm clone() => NumberTerm(value, text, span);
   visit(VisitorBase visitor) => visitor.visitNumberTerm(this);
 }
 
@@ -1087,7 +1084,7 @@
 
   UnitTerm(value, String t, SourceSpan span, this.unit) : super(value, t, span);
 
-  UnitTerm clone() => new UnitTerm(value, text, span, unit);
+  UnitTerm clone() => UnitTerm(value, text, span, unit);
 
   visit(VisitorBase visitor) => visitor.visitUnitTerm(this);
 
@@ -1107,25 +1104,25 @@
         this.unit == TokenKind.UNIT_LENGTH_PT ||
         this.unit == TokenKind.UNIT_LENGTH_PC);
   }
-  LengthTerm clone() => new LengthTerm(value, text, span, unit);
+  LengthTerm clone() => LengthTerm(value, text, span, unit);
   visit(VisitorBase visitor) => visitor.visitLengthTerm(this);
 }
 
 class PercentageTerm extends LiteralTerm {
   PercentageTerm(value, String t, SourceSpan span) : super(value, t, span);
-  PercentageTerm clone() => new PercentageTerm(value, text, span);
+  PercentageTerm clone() => PercentageTerm(value, text, span);
   visit(VisitorBase visitor) => visitor.visitPercentageTerm(this);
 }
 
 class EmTerm extends LiteralTerm {
   EmTerm(value, String t, SourceSpan span) : super(value, t, span);
-  EmTerm clone() => new EmTerm(value, text, span);
+  EmTerm clone() => EmTerm(value, text, span);
   visit(VisitorBase visitor) => visitor.visitEmTerm(this);
 }
 
 class ExTerm extends LiteralTerm {
   ExTerm(value, String t, SourceSpan span) : super(value, t, span);
-  ExTerm clone() => new ExTerm(value, text, span);
+  ExTerm clone() => ExTerm(value, text, span);
   visit(VisitorBase visitor) => visitor.visitExTerm(this);
 }
 
@@ -1139,7 +1136,7 @@
         this.unit == TokenKind.UNIT_ANGLE_TURN);
   }
 
-  AngleTerm clone() => new AngleTerm(value, text, span, unit);
+  AngleTerm clone() => AngleTerm(value, text, span, unit);
   visit(VisitorBase visitor) => visitor.visitAngleTerm(this);
 }
 
@@ -1152,7 +1149,7 @@
         this.unit == TokenKind.UNIT_TIME_S);
   }
 
-  TimeTerm clone() => new TimeTerm(value, text, span, unit);
+  TimeTerm clone() => TimeTerm(value, text, span, unit);
   visit(VisitorBase visitor) => visitor.visitTimeTerm(this);
 }
 
@@ -1163,21 +1160,21 @@
     assert(unit == TokenKind.UNIT_FREQ_HZ || unit == TokenKind.UNIT_FREQ_KHZ);
   }
 
-  FreqTerm clone() => new FreqTerm(value, text, span, unit);
+  FreqTerm clone() => FreqTerm(value, text, span, unit);
   visit(VisitorBase visitor) => visitor.visitFreqTerm(this);
 }
 
 class FractionTerm extends LiteralTerm {
   FractionTerm(var value, String t, SourceSpan span) : super(value, t, span);
 
-  FractionTerm clone() => new FractionTerm(value, text, span);
+  FractionTerm clone() => FractionTerm(value, text, span);
   visit(VisitorBase visitor) => visitor.visitFractionTerm(this);
 }
 
 class UriTerm extends LiteralTerm {
   UriTerm(String value, SourceSpan span) : super(value, value, span);
 
-  UriTerm clone() => new UriTerm(value, span);
+  UriTerm clone() => UriTerm(value, span);
   visit(VisitorBase visitor) => visitor.visitUriTerm(this);
 }
 
@@ -1190,7 +1187,7 @@
         unit == TokenKind.UNIT_RESOLUTION_DPPX);
   }
 
-  ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit);
+  ResolutionTerm clone() => ResolutionTerm(value, text, span, unit);
   visit(VisitorBase visitor) => visitor.visitResolutionTerm(this);
 }
 
@@ -1201,7 +1198,7 @@
     assert(unit == TokenKind.UNIT_CH);
   }
 
-  ChTerm clone() => new ChTerm(value, text, span, unit);
+  ChTerm clone() => ChTerm(value, text, span, unit);
   visit(VisitorBase visitor) => visitor.visitChTerm(this);
 }
 
@@ -1212,7 +1209,7 @@
     assert(unit == TokenKind.UNIT_REM);
   }
 
-  RemTerm clone() => new RemTerm(value, text, span, unit);
+  RemTerm clone() => RemTerm(value, text, span, unit);
   visit(VisitorBase visitor) => visitor.visitRemTerm(this);
 }
 
@@ -1226,7 +1223,7 @@
         unit == TokenKind.UNIT_VIEWPORT_VMAX);
   }
 
-  ViewportTerm clone() => new ViewportTerm(value, text, span, unit);
+  ViewportTerm clone() => ViewportTerm(value, text, span, unit);
   visit(VisitorBase visitor) => visitor.visitViewportTerm(this);
 }
 
@@ -1236,7 +1233,7 @@
 class HexColorTerm extends LiteralTerm {
   HexColorTerm(var value, String t, SourceSpan span) : super(value, t, span);
 
-  HexColorTerm clone() => new HexColorTerm(value, text, span);
+  HexColorTerm clone() => HexColorTerm(value, text, span);
   visit(VisitorBase visitor) => visitor.visitHexColorTerm(this);
 }
 
@@ -1246,7 +1243,7 @@
   FunctionTerm(var value, String t, this._params, SourceSpan span)
       : super(value, t, span);
 
-  FunctionTerm clone() => new FunctionTerm(value, text, _params.clone(), span);
+  FunctionTerm clone() => FunctionTerm(value, text, _params.clone(), span);
   visit(VisitorBase visitor) => visitor.visitFunctionTerm(this);
 }
 
@@ -1255,7 +1252,7 @@
 /// browsers.
 class IE8Term extends LiteralTerm {
   IE8Term(SourceSpan span) : super('\\9', '\\9', span);
-  IE8Term clone() => new IE8Term(span);
+  IE8Term clone() => IE8Term(span);
   visit(VisitorBase visitor) => visitor.visitIE8Term(this);
 }
 
@@ -1270,14 +1267,14 @@
     _terms.add(term);
   }
 
-  GroupTerm clone() => new GroupTerm(span);
+  GroupTerm clone() => GroupTerm(span);
   visit(VisitorBase visitor) => visitor.visitGroupTerm(this);
 }
 
 class ItemTerm extends NumberTerm {
   ItemTerm(dynamic value, String t, SourceSpan span) : super(value, t, span);
 
-  ItemTerm clone() => new ItemTerm(value, text, span);
+  ItemTerm clone() => ItemTerm(value, text, span);
   visit(VisitorBase visitor) => visitor.visitItemTerm(this);
 }
 
@@ -1291,7 +1288,7 @@
   }
 
   Expressions clone() {
-    var clonedExprs = new Expressions(span);
+    var clonedExprs = Expressions(span);
     for (var expr in expressions) {
       clonedExprs.add(expr.clone());
     }
@@ -1308,8 +1305,7 @@
 
   BinaryExpression(this.op, this.x, this.y, SourceSpan span) : super(span);
 
-  BinaryExpression clone() =>
-      new BinaryExpression(op, x.clone(), y.clone(), span);
+  BinaryExpression clone() => BinaryExpression(op, x.clone(), y.clone(), span);
   visit(VisitorBase visitor) => visitor.visitBinaryExpression(this);
 }
 
@@ -1319,7 +1315,7 @@
 
   UnaryExpression(this.op, this.self, SourceSpan span) : super(span);
 
-  UnaryExpression clone() => new UnaryExpression(op, self.clone(), span);
+  UnaryExpression clone() => UnaryExpression(op, self.clone(), span);
   visit(VisitorBase visitor) => visitor.visitUnaryExpression(this);
 }
 
@@ -1369,7 +1365,7 @@
       String style,
       String variant,
       LineHeight lineHeight})
-      : font = new Font(
+      : font = Font(
             size: size is LengthTerm ? size.value : size as num,
             family: family,
             weight: weight,
@@ -1380,21 +1376,21 @@
 
   FontExpression merged(DartStyleExpression newFontExpr) {
     if (newFontExpr is FontExpression && this.isFont && newFontExpr.isFont) {
-      return new FontExpression.merge(this, newFontExpr);
+      return FontExpression.merge(this, newFontExpr);
     }
     return null;
   }
 
   /// Merge the two FontExpression and return the result.
   factory FontExpression.merge(FontExpression x, FontExpression y) {
-    return new FontExpression._merge(x, y, y.span);
+    return FontExpression._merge(x, y, y.span);
   }
 
   FontExpression._merge(FontExpression x, FontExpression y, SourceSpan span)
-      : font = new Font.merge(x.font, y.font),
+      : font = Font.merge(x.font, y.font),
         super(DartStyleExpression.fontStyle, span);
 
-  FontExpression clone() => new FontExpression(span,
+  FontExpression clone() => FontExpression(span,
       size: font.size,
       family: font.family,
       weight: font.weight,
@@ -1431,7 +1427,7 @@
   /// Margin expression ripped apart.
   MarginExpression(SourceSpan span, {num top, num right, num bottom, num left})
       : super(DartStyleExpression.marginStyle, span,
-            new BoxEdge(left, top, right, bottom));
+            BoxEdge(left, top, right, bottom));
 
   MarginExpression.boxEdge(SourceSpan span, BoxEdge box)
       : super(DartStyleExpression.marginStyle, span, box);
@@ -1440,7 +1436,7 @@
     if (newMarginExpr is MarginExpression &&
         this.isMargin &&
         newMarginExpr.isMargin) {
-      return new MarginExpression.merge(this, newMarginExpr);
+      return MarginExpression.merge(this, newMarginExpr);
     }
 
     return null;
@@ -1448,14 +1444,14 @@
 
   /// Merge the two MarginExpressions and return the result.
   factory MarginExpression.merge(MarginExpression x, MarginExpression y) {
-    return new MarginExpression._merge(x, y, y.span);
+    return MarginExpression._merge(x, y, y.span);
   }
 
   MarginExpression._merge(
       MarginExpression x, MarginExpression y, SourceSpan span)
-      : super(x._styleType, span, new BoxEdge.merge(x.box, y.box));
+      : super(x._styleType, span, BoxEdge.merge(x.box, y.box));
 
-  MarginExpression clone() => new MarginExpression(span,
+  MarginExpression clone() => MarginExpression(span,
       top: box.top, right: box.right, bottom: box.bottom, left: box.left);
 
   visit(VisitorBase visitor) => visitor.visitMarginExpression(this);
@@ -1465,7 +1461,7 @@
   /// Border expression ripped apart.
   BorderExpression(SourceSpan span, {num top, num right, num bottom, num left})
       : super(DartStyleExpression.borderStyle, span,
-            new BoxEdge(left, top, right, bottom));
+            BoxEdge(left, top, right, bottom));
 
   BorderExpression.boxEdge(SourceSpan span, BoxEdge box)
       : super(DartStyleExpression.borderStyle, span, box);
@@ -1474,7 +1470,7 @@
     if (newBorderExpr is BorderExpression &&
         this.isBorder &&
         newBorderExpr.isBorder) {
-      return new BorderExpression.merge(this, newBorderExpr);
+      return BorderExpression.merge(this, newBorderExpr);
     }
 
     return null;
@@ -1482,15 +1478,15 @@
 
   /// Merge the two BorderExpression and return the result.
   factory BorderExpression.merge(BorderExpression x, BorderExpression y) {
-    return new BorderExpression._merge(x, y, y.span);
+    return BorderExpression._merge(x, y, y.span);
   }
 
   BorderExpression._merge(
       BorderExpression x, BorderExpression y, SourceSpan span)
-      : super(DartStyleExpression.borderStyle, span,
-            new BoxEdge.merge(x.box, y.box));
+      : super(
+            DartStyleExpression.borderStyle, span, BoxEdge.merge(x.box, y.box));
 
-  BorderExpression clone() => new BorderExpression(span,
+  BorderExpression clone() => BorderExpression(span,
       top: box.top, right: box.right, bottom: box.bottom, left: box.left);
 
   visit(VisitorBase visitor) => visitor.visitBorderExpression(this);
@@ -1512,7 +1508,7 @@
     return null;
   }
 
-  HeightExpression clone() => new HeightExpression(span, height);
+  HeightExpression clone() => HeightExpression(span, height);
   visit(VisitorBase visitor) => visitor.visitHeightExpression(this);
 }
 
@@ -1532,7 +1528,7 @@
     return null;
   }
 
-  WidthExpression clone() => new WidthExpression(span, width);
+  WidthExpression clone() => WidthExpression(span, width);
   visit(VisitorBase visitor) => visitor.visitWidthExpression(this);
 }
 
@@ -1540,7 +1536,7 @@
   /// Padding expression ripped apart.
   PaddingExpression(SourceSpan span, {num top, num right, num bottom, num left})
       : super(DartStyleExpression.paddingStyle, span,
-            new BoxEdge(left, top, right, bottom));
+            BoxEdge(left, top, right, bottom));
 
   PaddingExpression.boxEdge(SourceSpan span, BoxEdge box)
       : super(DartStyleExpression.paddingStyle, span, box);
@@ -1549,7 +1545,7 @@
     if (newPaddingExpr is PaddingExpression &&
         this.isPadding &&
         newPaddingExpr.isPadding) {
-      return new PaddingExpression.merge(this, newPaddingExpr);
+      return PaddingExpression.merge(this, newPaddingExpr);
     }
 
     return null;
@@ -1557,15 +1553,15 @@
 
   /// Merge the two PaddingExpression and return the result.
   factory PaddingExpression.merge(PaddingExpression x, PaddingExpression y) {
-    return new PaddingExpression._merge(x, y, y.span);
+    return PaddingExpression._merge(x, y, y.span);
   }
 
   PaddingExpression._merge(
       PaddingExpression x, PaddingExpression y, SourceSpan span)
       : super(DartStyleExpression.paddingStyle, span,
-            new BoxEdge.merge(x.box, y.box));
+            BoxEdge.merge(x.box, y.box));
 
-  PaddingExpression clone() => new PaddingExpression(span,
+  PaddingExpression clone() => PaddingExpression(span,
       top: box.top, right: box.right, bottom: box.bottom, left: box.left);
   visit(VisitorBase visitor) => visitor.visitPaddingExpression(this);
 }
diff --git a/lib/src/tree_base.dart b/lib/src/tree_base.dart
index f662a7c..8338ad3 100644
--- a/lib/src/tree_base.dart
+++ b/lib/src/tree_base.dart
@@ -18,8 +18,8 @@
 
   /// A multiline string showing the node and its children.
   String toDebugString() {
-    var to = new TreeOutput();
-    var tp = new _TreePrinter(to, true);
+    var to = TreeOutput();
+    var tp = _TreePrinter(to, true);
     this.visit(tp);
     return to.buf.toString();
   }
@@ -33,7 +33,7 @@
 /// Simple class to provide a textual dump of trees for debugging.
 class TreeOutput {
   int depth = 0;
-  final StringBuffer buf = new StringBuffer();
+  final StringBuffer buf = StringBuffer();
   VisitorBase printer;
 
   void write(String s) {
diff --git a/lib/src/tree_printer.dart b/lib/src/tree_printer.dart
index 6aad40c..2371015 100644
--- a/lib/src/tree_printer.dart
+++ b/lib/src/tree_printer.dart
@@ -8,8 +8,8 @@
 
 /// Helper function to dump the CSS AST.
 String treeToDebugString(StyleSheet styleSheet, [bool useSpan = false]) {
-  var to = new TreeOutput();
-  new _TreePrinter(to, useSpan)..visitTree(styleSheet);
+  var to = TreeOutput();
+  _TreePrinter(to, useSpan)..visitTree(styleSheet);
   return to.toString();
 }
 
diff --git a/lib/src/validate.dart b/lib/src/validate.dart
index 72f14e0..6e903b6 100644
--- a/lib/src/validate.dart
+++ b/lib/src/validate.dart
@@ -22,7 +22,7 @@
         (selector.isCombinatorNone && matches == 0)) {
       if (matches < 0) {
         String tooMany = selector.simpleSelector.toString();
-        throw new CssSelectorException(
+        throw CssSelectorException(
             'Can not mix Id selector with class selector(s). Id '
             'selector must be singleton too many starting at $tooMany');
       }
@@ -30,7 +30,7 @@
       return matches + 1;
     } else {
       String error = selector.toString();
-      throw new CssSelectorException(
+      throw CssSelectorException(
           'Selectors can not have combinators (>, +, or ~) before $error');
     }
   }
@@ -41,11 +41,11 @@
       return -1;
     } else if (selector.isCombinatorDescendant) {
       String tooMany = selector.simpleSelector.toString();
-      throw new CssSelectorException(
+      throw CssSelectorException(
           'Use of Id selector must be singleton starting at $tooMany');
     } else {
       String error = selector.simpleSelector.toString();
-      throw new CssSelectorException(
+      throw CssSelectorException(
           'Selectors can not have combinators (>, +, or ~) before $error');
     }
   }
@@ -105,13 +105,12 @@
           }
         } else {
           String badSelector = simpleSelector.toString();
-          throw new CssSelectorException(
-              'Invalid template selector $badSelector');
+          throw CssSelectorException('Invalid template selector $badSelector');
         }
 
         if (!found) {
           String unknownName = simpleSelector.toString();
-          throw new CssSelectorException('Unknown selector name $unknownName');
+          throw CssSelectorException('Unknown selector name $unknownName');
         }
       }
     }
diff --git a/lib/visitor.dart b/lib/visitor.dart
index e2f1f04..7b411cd 100644
--- a/lib/visitor.dart
+++ b/lib/visitor.dart
@@ -436,12 +436,12 @@
 
   visitBinaryExpression(BinaryExpression node) {
     // TODO(terry): TBD
-    throw new UnimplementedError();
+    throw UnimplementedError();
   }
 
   visitUnaryExpression(UnaryExpression node) {
     // TODO(terry): TBD
-    throw new UnimplementedError();
+    throw UnimplementedError();
   }
 
   visitIdentifier(Identifier node) {}
@@ -456,36 +456,36 @@
 
   visitFontExpression(FontExpression node) {
     // TODO(terry): TBD
-    throw new UnimplementedError();
+    throw UnimplementedError();
   }
 
   visitBoxExpression(BoxExpression node) {
     // TODO(terry): TBD
-    throw new UnimplementedError();
+    throw UnimplementedError();
   }
 
   visitMarginExpression(MarginExpression node) {
     // TODO(terry): TBD
-    throw new UnimplementedError();
+    throw UnimplementedError();
   }
 
   visitBorderExpression(BorderExpression node) {
     // TODO(terry): TBD
-    throw new UnimplementedError();
+    throw UnimplementedError();
   }
 
   visitHeightExpression(HeightExpression node) {
     // TODO(terry): TB
-    throw new UnimplementedError();
+    throw UnimplementedError();
   }
 
   visitPaddingExpression(PaddingExpression node) {
     // TODO(terry): TBD
-    throw new UnimplementedError();
+    throw UnimplementedError();
   }
 
   visitWidthExpression(WidthExpression node) {
     // TODO(terry): TBD
-    throw new UnimplementedError();
+    throw UnimplementedError();
   }
 }
diff --git a/pubspec.yaml b/pubspec.yaml
index 4f6a9e2..c928dbd 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -6,7 +6,7 @@
 homepage: https://github.com/dart-lang/csslib
 
 environment:
-  sdk: '>=2.0.0-dev.17.0 <3.0.0'
+  sdk: '>=2.0.0 <3.0.0'
 
 dependencies:
   args: ^1.4.3
@@ -15,4 +15,5 @@
   source_span: ^1.4.0
 
 dev_dependencies:
+  pedantic: ^1.0.0
   test: ^1.2.0
diff --git a/test/extend_test.dart b/test/extend_test.dart
index 7df68c5..78c2994 100644
--- a/test/extend_test.dart
+++ b/test/extend_test.dart
@@ -199,13 +199,13 @@
 }
 ''',
       '.btn > .btn, '
-      'input.second + label > .btn, '
-      '.btn > input.second + label, '
-      'input.second + label > input.second + label, '
-      'input.second + label > input.second + label {\n'
-      '  margin-left: 5px;\n}\n'
-      'input.second + label {\n'
-      '}');
+          'input.second + label > .btn, '
+          '.btn > input.second + label, '
+          'input.second + label > input.second + label, '
+          'input.second + label > input.second + label {\n'
+          '  margin-left: 5px;\n}\n'
+          'input.second + label {\n'
+          '}');
 
   // TODO(terry): Optimize merge selectors would be:
   //
@@ -226,13 +226,13 @@
 }
 ''',
       '.btn + .btn, '
-      'input.second + label + .btn, '
-      '.btn + input.second + label, '
-      'input.second + label + input.second + label, '
-      'input.second + label + input.second + label {\n'
-      '  margin-left: 5px;\n}\n'
-      'input.second + label {\n'
-      '  color: #00f;\n}');
+          'input.second + label + .btn, '
+          '.btn + input.second + label, '
+          'input.second + label + input.second + label, '
+          'input.second + label + input.second + label {\n'
+          '  margin-left: 5px;\n}\n'
+          'input.second + label {\n'
+          '  color: #00f;\n}');
 }
 
 main() {
diff --git a/test/samples_test.dart b/test/samples_test.dart
index 4607a05..4059543 100644
--- a/test/samples_test.dart
+++ b/test/samples_test.dart
@@ -7,7 +7,7 @@
 import 'package:test/test.dart';
 import 'package:csslib/parser.dart';
 
-const testOptions = const PreprocessorOptions(
+const testOptions = PreprocessorOptions(
     useColors: false,
     checked: false,
     warningsAsErrors: true,
@@ -24,7 +24,7 @@
 
 main() {
   final libraryUri = currentMirrorSystem().findLibrary(#samples_test).uri;
-  final cssDir = new Directory.fromUri(libraryUri.resolve('examples'));
+  final cssDir = Directory.fromUri(libraryUri.resolve('examples'));
   for (var element in cssDir.listSync())
     if (element is File && element.uri.pathSegments.last.endsWith('.css')) {
       test(element.uri.pathSegments.last, () => testCSSFile(element));
diff --git a/test/testing.dart b/test/testing.dart
index 33dbe7c..28b707d 100644
--- a/test/testing.dart
+++ b/test/testing.dart
@@ -12,16 +12,16 @@
 
 export 'package:csslib/src/options.dart';
 
-const simpleOptionsWithCheckedAndWarningsAsErrors = const PreprocessorOptions(
+const simpleOptionsWithCheckedAndWarningsAsErrors = PreprocessorOptions(
     useColors: false,
     checked: true,
     warningsAsErrors: true,
     inputFile: 'memory');
 
 const simpleOptions =
-    const PreprocessorOptions(useColors: false, inputFile: 'memory');
+    PreprocessorOptions(useColors: false, inputFile: 'memory');
 
-const options = const PreprocessorOptions(
+const options = PreprocessorOptions(
     useColors: false, warningsAsErrors: true, inputFile: 'memory');
 
 /// Spin-up CSS parser in checked mode to detect any problematic CSS.  Normally,
@@ -40,8 +40,8 @@
 StyleSheet compileCss(String cssInput,
         {List<Message> errors,
         PreprocessorOptions opts,
-        bool polyfill: false,
-        List<StyleSheet> includes: null}) =>
+        bool polyfill = false,
+        List<StyleSheet> includes}) =>
     compile(cssInput,
         errors: errors,
         options:
@@ -54,10 +54,10 @@
     compileCss(input, errors: errors, polyfill: true, opts: opts);
 
 /// CSS emitter walks the style sheet tree and emits readable CSS.
-final _emitCss = new CssPrinter();
+final _emitCss = CssPrinter();
 
 /// Simple Visitor does nothing but walk tree.
-final _cssVisitor = new Visitor();
+final _cssVisitor = Visitor();
 
 /// Pretty printer for CSS.
 String prettyPrint(StyleSheet ss) {
diff --git a/test/visitor_test.dart b/test/visitor_test.dart
index 02784c4..b82ac6b 100644
--- a/test/visitor_test.dart
+++ b/test/visitor_test.dart
@@ -12,7 +12,7 @@
 
 class ClassVisitor extends Visitor {
   final List expectedClasses;
-  final Set<String> foundClasses = new Set();
+  final Set<String> foundClasses = Set();
 
   ClassVisitor(this.expectedClasses);
 
@@ -42,7 +42,7 @@
   expect(s != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
 
-  var clsVisits = new ClassVisitor(['foobar'])..visitTree(s);
+  var clsVisits = ClassVisitor(['foobar'])..visitTree(s);
   expect(clsVisits.matches, true);
 
   in1 = '''
@@ -56,8 +56,7 @@
   expect(s != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
 
-  clsVisits = new ClassVisitor(['foobar1', 'xyzzy', 'foo', 'hello'])
-    ..visitTree(s);
+  clsVisits = ClassVisitor(['foobar1', 'xyzzy', 'foo', 'hello'])..visitTree(s);
   expect(clsVisits.matches, true);
 
   expect(prettyPrint(s), r'''
@@ -82,7 +81,7 @@
 }
 
 String polyfillPrint(String prefix, StyleSheet ss) =>
-    (new PolyfillEmitter(prefix)..visitTree(ss, pretty: true)).toString();
+    (PolyfillEmitter(prefix)..visitTree(ss, pretty: true)).toString();
 
 void testPolyFill() {
   var errors = <Message>[];
