diff --git a/example/call_parser.dart b/example/call_parser.dart
index 6271057..3248f7f 100644
--- a/example/call_parser.dart
+++ b/example/call_parser.dart
@@ -9,9 +9,12 @@
  * CSS will allow any property/value pairs regardless of validity; all of our
  * tests (by default) will ensure that the CSS is really valid.
  */
-StyleSheet parseCss(String cssInput, {List errors, List opts}) =>
-    css.parse(cssInput, errors: errors, options: opts == null ?
-        ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] : opts);
+StyleSheet parseCss(String cssInput, {List errors, List opts}) => css.parse(
+    cssInput,
+    errors: errors,
+    options: opts == null
+        ? ['--no-colors', '--checked', '--warnings_as_errors', 'memory']
+        : opts);
 
 // Pretty printer for CSS.
 var emitCss = new CssPrinter();
@@ -25,14 +28,14 @@
   print('1. Good CSS, parsed CSS emitted:');
   print('   =============================');
   var stylesheet = parseCss(
-    '@import "support/at-charset-019.css"; div { color: red; }'
-    'button[type] { background-color: red; }'
-    '.foo { '
+      '@import "support/at-charset-019.css"; div { color: red; }'
+      'button[type] { background-color: red; }'
+      '.foo { '
       'color: red; left: 20px; top: 20px; width: 100px; height:200px'
-    '}'
-    '#div {'
+      '}'
+      '#div {'
       'color : #00F578; border-color: #878787;'
-    '}', errors: errors);
+      '}', errors: errors);
 
   if (!errors.isEmpty) {
     print("Got ${errors.length} errors.\n");
@@ -46,10 +49,9 @@
   // Parse a stylesheet with errors
   print('2. Catch severe syntax errors:');
   print('   ===========================');
-  var stylesheetError = parseCss(
-    '.foo #%^&*asdf{ '
+  var stylesheetError = parseCss('.foo #%^&*asdf{ '
       'color: red; left: 20px; top: 20px; width: 100px; height:200px'
-    '}', errors: errors);
+      '}', errors: errors);
 
   if (!errors.isEmpty) {
     print("Got ${errors.length} errors.\n");
@@ -63,7 +65,7 @@
   // Parse a stylesheet that warns (checks) problematic CSS.
   print('3. Detect CSS problem with checking on:');
   print('   ===================================');
-  stylesheetError = parseCss( '# div1 { color: red; }', errors: errors);
+  stylesheetError = parseCss('# div1 { color: red; }', errors: errors);
 
   if (!errors.isEmpty) {
     print("Detected ${errors.length} problem in checked mode.\n");
@@ -86,5 +88,4 @@
   } else {
     print(prettyPrint(selectorAst));
   }
-
 }
diff --git a/lib/css.dart b/lib/css.dart
index 73400bc..590e835 100644
--- a/lib/css.dart
+++ b/lib/css.dart
@@ -39,16 +39,16 @@
     var file = new SourceFile(contents, url: path.toUri(inputPath));
 
     // Parse the CSS.
-    var tree = _time('Parse $filename',
-        () => new Parser(file, contents).parse(), verbose);
+    var tree = _time(
+        'Parse $filename', () => new Parser(file, contents).parse(), verbose);
 
-    _time('Analyzer $filename',
-        () => new Analyzer([tree], messages), verbose).run();
+    _time('Analyzer $filename', () => new Analyzer([tree], messages), verbose)
+        .run();
 
     // Emit the processed CSS.
     var emitter = new CssPrinter();
-    _time('Codegen $filename',
-        () => emitter.visitTree(tree, pretty: true), verbose);
+    _time('Codegen $filename', () => emitter.visitTree(tree, pretty: true),
+        verbose);
 
     // Write the contents to a file.
     var outPath = path.join(path.dirname(inputPath), '_$filename');
@@ -76,6 +76,8 @@
   buf.write(' -- ');
   if (duration < 10) buf.write(' ');
   if (duration < 100) buf.write(' ');
-  buf..write(duration)..write(' ms');
+  buf
+    ..write(duration)
+    ..write(' ms');
   print(buf.toString());
 }
diff --git a/lib/parser.dart b/lib/parser.dart
index dce31b6..e0aa338 100644
--- a/lib/parser.dart
+++ b/lib/parser.dart
@@ -20,7 +20,6 @@
 part 'src/tokenizer.dart';
 part 'src/tokenkind.dart';
 
-
 /** Used for parser lookup ahead (used for nested selectors Less support). */
 class ParserState extends TokenizerState {
   final Token peekToken;
@@ -47,10 +46,7 @@
 // TODO(terry): Remove nested name parameter.
 /** Parse and analyze the CSS file. */
 StyleSheet compile(input, {List<Message> errors, List<String> options,
-    bool nested: true,
-    bool polyfill: false,
-    List<StyleSheet> includes: null}) {
-
+    bool nested: true, bool polyfill: false, List<StyleSheet> includes: null}) {
   if (includes == null) {
     includes = [];
   }
@@ -76,7 +72,6 @@
 /** Analyze the CSS file. */
 void analyze(List<StyleSheet> styleSheets,
     {List<Message> errors, List<String> options}) {
-
   _createMessages(errors: errors, options: options);
   new Analyzer(styleSheets, messages).run();
 }
@@ -107,8 +102,7 @@
   _createMessages(errors: errors);
 
   var file = new SourceFile(source);
-  return (new _Parser(file, source)
-      ..tokenizer.inSelector = true)
+  return (new _Parser(file, source)..tokenizer.inSelector = true)
       .parseSelector();
 }
 
@@ -119,10 +113,9 @@
 
   var file = new SourceFile(source);
   return (new _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.
-      ..tokenizer.inSelector = true)
-      .processSelectorGroup();
+    // 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.
+    ..tokenizer.inSelector = true).processSelectorGroup();
 }
 
 String _inputAsString(input) {
@@ -163,8 +156,8 @@
   final _Parser _parser;
 
   // TODO(jmesserly): having file and text is redundant.
-  Parser(SourceFile file, String text, {int start: 0, String baseUrl}) :
-    _parser = new _Parser(file, text, start: start, baseUrl: baseUrl);
+  Parser(SourceFile file, String text, {int start: 0, String baseUrl})
+      : _parser = new _Parser(file, text, start: start, baseUrl: baseUrl);
 
   StyleSheet parse() => _parser.parse();
 }
@@ -263,7 +256,7 @@
     return _peekToken.kind;
   }
 
-  Token _next({unicodeRange : false}) {
+  Token _next({unicodeRange: false}) {
     _previousToken = _peekToken;
     _peekToken = tokenizer.next(unicodeRange: unicodeRange);
     return _previousToken;
@@ -289,7 +282,7 @@
     _previousToken = markedData.previousToken;
   }
 
-  bool _maybeEat(int kind, {unicodeRange : false}) {
+  bool _maybeEat(int kind, {unicodeRange: false}) {
     if (_peekToken.kind == kind) {
       _previousToken = _peekToken;
       _peekToken = tokenizer.next(unicodeRange: unicodeRange);
@@ -299,7 +292,7 @@
     }
   }
 
-  void _eat(int kind, {unicodeRange : false}) {
+  void _eat(int kind, {unicodeRange: false}) {
     if (!_maybeEat(kind, unicodeRange: unicodeRange)) {
       _errorExpected(TokenKind.kindToString(kind));
     }
@@ -399,8 +392,7 @@
     var unaryOp = TokenKind.matchMediaOperator(op, 0, opLen);
     if (unaryOp != -1) {
       if (isChecked) {
-        if (startQuery &&
-            unaryOp != TokenKind.MEDIA_OP_NOT ||
+        if (startQuery && unaryOp != TokenKind.MEDIA_OP_NOT ||
             unaryOp != TokenKind.MEDIA_OP_ONLY) {
           _warning("Only the unary operators NOT and ONLY allowed",
               _makeSpan(start));
@@ -448,13 +440,13 @@
     // Grammar: '(' S* media_feature S* [ ':' S* expr ]? ')' S*
     if (_maybeEat(TokenKind.LPAREN)) {
       if (_peekIdentifier()) {
-        var feature = identifier();           // Media feature.
+        var feature = identifier(); // Media feature.
         while (_maybeEat(TokenKind.COLON)) {
           var startExpr = _peekToken.span;
           var exprs = processExpr();
           if (_maybeEat(TokenKind.RPAREN)) {
-            return new MediaExpression(andOperator, feature, exprs,
-                _makeSpan(startExpr));
+            return new MediaExpression(
+                andOperator, feature, exprs, _makeSpan(startExpr));
           } else if (isChecked) {
             _warning("Missing parenthesis around media expression",
                 _makeSpan(start));
@@ -589,10 +581,10 @@
             // TODO(terry): Normalize pseudoPage to lowercase.
             if (isChecked &&
                 !(pseudoPage.name == 'left' ||
-                  pseudoPage.name == 'right' ||
-                  pseudoPage.name == 'first')) {
-              _warning("Pseudo page must be left, top or first",
-                  pseudoPage.span);
+                    pseudoPage.name == 'right' ||
+                    pseudoPage.name == 'first')) {
+              _warning(
+                  "Pseudo page must be left, top or first", pseudoPage.span);
               return null;
             }
           }
@@ -600,8 +592,8 @@
 
         String pseudoName = pseudoPage is Identifier ? pseudoPage.name : '';
         String ident = name is Identifier ? name.name : '';
-        return new PageDirective(ident, pseudoName,
-            processMarginsDeclarations(), _makeSpan(start));
+        return new PageDirective(
+            ident, pseudoName, processMarginsDeclarations(), _makeSpan(start));
 
       case TokenKind.DIRECTIVE_CHARSET:
         // @charset S* STRING S* ';'
@@ -640,7 +632,7 @@
         if (tokId == TokenKind.DIRECTIVE_MS_KEYFRAMES && isChecked) {
           _warning('@-ms-keyframes should be @keyframes', _makeSpan(start));
         }
-      // TODO(terry): End of workaround.
+        // TODO(terry): End of workaround.
 
         /*  Key frames grammar:
          *
@@ -676,9 +668,8 @@
             selectors.add(term);
           } while (_maybeEat(TokenKind.COMMA));
 
-          keyframe.add(new KeyFrameBlock(selectors, processDeclarations(),
-              _makeSpan(start)));
-
+          keyframe.add(new KeyFrameBlock(
+              selectors, processDeclarations(), _makeSpan(start)));
         } while (!_maybeEat(TokenKind.RBRACE) && !isPrematureEndOfFile());
 
         return keyframe;
@@ -753,14 +744,14 @@
           }
         }
 
-        return new NamespaceDirective(prefix != null ? prefix.name : '',
-            namespaceUri, _makeSpan(start));
+        return new NamespaceDirective(
+            prefix != null ? prefix.name : '', namespaceUri, _makeSpan(start));
 
       case TokenKind.DIRECTIVE_MIXIN:
         return processMixin();
 
       case TokenKind.DIRECTIVE_INCLUDE:
-        return processInclude( _makeSpan(start));
+        return processInclude(_makeSpan(start));
 
       case TokenKind.DIRECTIVE_CONTENT:
         // TODO(terry): TBD
@@ -823,16 +814,14 @@
       var declGroup = processDeclarations(checkBrace: false);
       var decls = [];
       if (declGroup.declarations.any((decl) {
-        return decl is Declaration &&
-            decl is! IncludeMixinAtDeclaration;
+        return decl is Declaration && decl is! IncludeMixinAtDeclaration;
       })) {
         var newDecls = [];
         productions.forEach((include) {
           // 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(new IncludeMixinAtDeclaration(include, include.span));
           } else {
             _warning("Error mixing of top-level vs declarations mixins",
                 _makeSpan(include.span));
@@ -845,33 +834,34 @@
         // not a declaration group (anything else is a ruleset).  Make it a
         // list of productions, not a declaration group.
         for (var decl in declGroup.declarations) {
-          productions.add(decl is IncludeMixinAtDeclaration ?
-              decl.include : decl);
-        };
+          productions
+              .add(decl is IncludeMixinAtDeclaration ? decl.include : decl);
+        }
+        ;
         declGroup.declarations.clear();
       }
 
       if (declGroup.declarations.isNotEmpty) {
         if (productions.isEmpty) {
-          mixinDirective = new MixinDeclarationDirective(name.name, params,
-              false, declGroup, _makeSpan(start));
+          mixinDirective = new MixinDeclarationDirective(
+              name.name, params, false, declGroup, _makeSpan(start));
           break;
         } else {
           for (var decl in declGroup.declarations) {
-            productions.add(decl is IncludeMixinAtDeclaration ?
-                decl.include : decl);
+            productions
+                .add(decl is IncludeMixinAtDeclaration ? decl.include : decl);
           }
         }
       } else {
-        mixinDirective = new MixinRulesetDirective(name.name, params,
-            false, productions, _makeSpan(start));
+        mixinDirective = new MixinRulesetDirective(
+            name.name, params, false, productions, _makeSpan(start));
         break;
       }
     }
 
     if (productions.isNotEmpty) {
-      mixinDirective = new MixinRulesetDirective(name.name, params,
-          false, productions, _makeSpan(start));
+      mixinDirective = new MixinRulesetDirective(
+          name.name, params, false, productions, _makeSpan(start));
     }
 
     _eat(TokenKind.RBRACE);
@@ -994,8 +984,8 @@
       selectorGroup = processSelectorGroup();
     }
     if (selectorGroup != null) {
-      return new RuleSet(selectorGroup, processDeclarations(),
-          selectorGroup.span);
+      return new RuleSet(
+          selectorGroup, processDeclarations(), selectorGroup.span);
     }
   }
 
@@ -1031,7 +1021,8 @@
     // Look a head do we have a nested selector instead of a declaration?
     SelectorGroup selGroup = processSelectorGroup();
 
-    var nestedSelector = selGroup != null && _peekKind(TokenKind.LBRACE) &&
+    var nestedSelector = selGroup != null &&
+        _peekKind(TokenKind.LBRACE) &&
         messages.messages.isEmpty;
 
     if (!nestedSelector) {
@@ -1053,7 +1044,7 @@
     if (checkBrace) _eat(TokenKind.LBRACE);
 
     List decls = [];
-    List dartStyles = [];             // List of latest styles exposed to Dart.
+    List dartStyles = []; // List of latest styles exposed to Dart.
 
     do {
       var selectorGroup = _nestedSelector();
@@ -1111,7 +1102,7 @@
     _eat(TokenKind.LBRACE);
 
     List<Declaration> decls = [];
-    List dartStyles = [];             // List of latest styles exposed to Dart.
+    List dartStyles = []; // List of latest styles exposed to Dart.
 
     do {
       switch (_peek()) {
@@ -1142,8 +1133,8 @@
 
           var declGroup = processDeclarations();
           if (declGroup != null) {
-            groups.add(new MarginGroup(marginSym, declGroup.declarations,
-                _makeSpan(start)));
+            groups.add(new MarginGroup(
+                marginSym, declGroup.declarations, _makeSpan(start)));
           }
           break;
         default:
@@ -1248,7 +1239,7 @@
         _eat(TokenKind.AMPERSAND);
         thisOperator = true;
         break;
-      }
+    }
 
     // Check if WHITESPACE existed between tokens if so we're descendent.
     if (combinatorType == TokenKind.COMBINATOR_NONE && !forceCombinatorNone) {
@@ -1259,19 +1250,20 @@
     }
 
     var span = _makeSpan(start);
-    var simpleSel = thisOperator ?
-        new ElementSelector(new ThisOperator(span), span) : simpleSelector();
+    var simpleSel = thisOperator
+        ? new ElementSelector(new ThisOperator(span), span)
+        : simpleSelector();
     if (simpleSel == null &&
         (combinatorType == TokenKind.COMBINATOR_PLUS ||
-        combinatorType == TokenKind.COMBINATOR_GREATER ||
-        combinatorType == TokenKind.COMBINATOR_TILDE)) {
+            combinatorType == TokenKind.COMBINATOR_GREATER ||
+            combinatorType == TokenKind.COMBINATOR_TILDE)) {
       // For "+ &", "~ &" or "> &" a selector sequence with no name is needed
       // so that the & will have a combinator too.  This is needed to
       // disambiguate selector expressions:
       //    .foo&:hover     combinator before & is NONE
       //    .foo &          combinator before & is DESCDENDANT
       //    .foo > &        combinator before & is GREATER
-      simpleSel =  new ElementSelector(new Identifier("", span), span);
+      simpleSel = new ElementSelector(new Identifier("", span), span);
     }
     if (simpleSel != null) {
       return new SimpleSelectorSequence(simpleSel, span, combinatorType);
@@ -1342,8 +1334,8 @@
           break;
       }
 
-      return new NamespaceSelector(first,
-          new ElementSelector(element, element.span), _makeSpan(start));
+      return new NamespaceSelector(
+          first, new ElementSelector(element, element.span), _makeSpan(start));
     } else if (first != null) {
       return new ElementSelector(first, _makeSpan(start));
     } else {
@@ -1353,7 +1345,8 @@
   }
 
   bool _anyWhiteSpaceBeforePeekToken(int kind) {
-    if (_previousToken != null && _peekToken != null &&
+    if (_previousToken != null &&
+        _peekToken != null &&
         _previousToken.kind == kind) {
       // If end of previous token isn't same as the start of peek token then
       // there's something between these tokens probably whitespace.
@@ -1434,7 +1427,6 @@
     // Functional pseudo?
 
     if (_peekToken.kind == TokenKind.LPAREN) {
-
       if (!pseudoElement && pseudoName.name.toLowerCase() == 'not') {
         _eat(TokenKind.LPAREN);
 
@@ -1466,9 +1458,9 @@
         }
 
         _eat(TokenKind.RPAREN);
-        return (pseudoElement) ?
-            new PseudoElementFunctionSelector(pseudoName, expr, span) :
-              new PseudoClassFunctionSelector(pseudoName, expr, span);
+        return (pseudoElement)
+            ? new PseudoElementFunctionSelector(pseudoName, expr, span)
+            : new PseudoClassFunctionSelector(pseudoName, expr, span);
       }
     }
 
@@ -1478,9 +1470,9 @@
     // pseudo-class.  However, CSS2.1 allows for : to specify old
     // pseudo-elements (:first-line, :first-letter, :before and :after) any
     // new pseudo-elements defined would require a ::.
-    return pseudoElement ?
-        new PseudoElementSelector(pseudoName, _makeSpan(start)) :
-          new PseudoClassSelector(pseudoName, _makeSpan(start));
+    return pseudoElement
+        ? new PseudoElementSelector(pseudoName, _makeSpan(start))
+        : new PseudoClassSelector(pseudoName, _makeSpan(start));
   }
 
   /**
@@ -1531,7 +1523,7 @@
           value = '"${_escapeString(value)}"';
           return new LiteralTerm(value, value, _makeSpan(start));
         case TokenKind.IDENTIFIER:
-          value = identifier();   // Snarf up the ident we'll remap, maybe.
+          value = identifier(); // Snarf up the ident we'll remap, maybe.
           break;
         default:
           keepParsing = false;
@@ -1582,17 +1574,17 @@
 
       int op;
       switch (_peek()) {
-      case TokenKind.EQUALS:
-      case TokenKind.INCLUDES:        // ~=
-      case TokenKind.DASH_MATCH:      // |=
-      case TokenKind.PREFIX_MATCH:    // ^=
-      case TokenKind.SUFFIX_MATCH:    // $=
-      case TokenKind.SUBSTRING_MATCH: // *=
-        op = _peek();
-        _next();
-        break;
-      default:
-        op = TokenKind.NO_MATCH;
+        case TokenKind.EQUALS:
+        case TokenKind.INCLUDES: // ~=
+        case TokenKind.DASH_MATCH: // |=
+        case TokenKind.PREFIX_MATCH: // ^=
+        case TokenKind.SUFFIX_MATCH: // $=
+        case TokenKind.SUBSTRING_MATCH: // *=
+          op = _peek();
+          _next();
+          break;
+        default:
+          op = TokenKind.NO_MATCH;
       }
 
       var value;
@@ -1654,8 +1646,9 @@
       // Handle !important (prio)
       var importantPriority = _maybeEat(TokenKind.IMPORTANT);
 
-      decl = new Declaration(propertyIdent, exprs, dartComposite,
-          _makeSpan(start), important: importantPriority, ie7: ie7);
+      decl = new Declaration(
+          propertyIdent, exprs, dartComposite, _makeSpan(start),
+          important: importantPriority, ie7: ie7);
     } else if (_peekToken.kind == TokenKind.VAR_DEFINITION) {
       _next();
       var definedName;
@@ -1698,7 +1691,7 @@
   }
 
   /** List of styles exposed to the Dart UI framework. */
-  static const int _fontPartFont= 0;
+  static const int _fontPartFont = 0;
   static const int _fontPartVariant = 1;
   static const int _fontPartWeight = 2;
   static const int _fontPartSize = 3;
@@ -1729,46 +1722,46 @@
   static const int _paddingPartBottom = 28;
 
   static const Map<String, int> _stylesToDart = const {
-    'font':                 _fontPartFont,
-    'font-family':          _fontPartFamily,
-    'font-size':            _fontPartSize,
-    'font-style':           _fontPartStyle,
-    'font-variant':         _fontPartVariant,
-    'font-weight':          _fontPartWeight,
-    'line-height':          _lineHeightPart,
-    'margin':               _marginPartMargin,
-    'margin-left':          _marginPartLeft,
-    'margin-right':         _marginPartRight,
-    'margin-top':           _marginPartTop,
-    'margin-bottom':        _marginPartBottom,
-    'border':               _borderPartBorder,
-    'border-left':          _borderPartLeft,
-    'border-right':         _borderPartRight,
-    'border-top':           _borderPartTop,
-    'border-bottom':        _borderPartBottom,
-    'border-width':         _borderPartWidth,
-    'border-left-width':    _borderPartLeftWidth,
-    'border-top-width':     _borderPartTopWidth,
-    'border-right-width':   _borderPartRightWidth,
-    'border-bottom-width':  _borderPartBottomWidth,
-    'height':               _heightPart,
-    'width':                _widthPart,
-    'padding':              _paddingPartPadding,
-    'padding-left':         _paddingPartLeft,
-    'padding-top':          _paddingPartTop,
-    'padding-right':        _paddingPartRight,
-    'padding-bottom':       _paddingPartBottom
+    'font': _fontPartFont,
+    'font-family': _fontPartFamily,
+    'font-size': _fontPartSize,
+    'font-style': _fontPartStyle,
+    'font-variant': _fontPartVariant,
+    'font-weight': _fontPartWeight,
+    'line-height': _lineHeightPart,
+    'margin': _marginPartMargin,
+    'margin-left': _marginPartLeft,
+    'margin-right': _marginPartRight,
+    'margin-top': _marginPartTop,
+    'margin-bottom': _marginPartBottom,
+    'border': _borderPartBorder,
+    'border-left': _borderPartLeft,
+    'border-right': _borderPartRight,
+    'border-top': _borderPartTop,
+    'border-bottom': _borderPartBottom,
+    'border-width': _borderPartWidth,
+    'border-left-width': _borderPartLeftWidth,
+    'border-top-width': _borderPartTopWidth,
+    'border-right-width': _borderPartRightWidth,
+    'border-bottom-width': _borderPartBottomWidth,
+    'height': _heightPart,
+    'width': _widthPart,
+    'padding': _paddingPartPadding,
+    'padding-left': _paddingPartLeft,
+    'padding-top': _paddingPartTop,
+    'padding-right': _paddingPartRight,
+    'padding-bottom': _paddingPartBottom
   };
 
   static const Map<String, int> _nameToFontWeight = const {
-    'bold' : FontWeight.bold,
-    'normal' : FontWeight.normal
+    'bold': FontWeight.bold,
+    'normal': FontWeight.normal
   };
 
   static int _findStyle(String styleName) => _stylesToDart[styleName];
 
-  DartStyleExpression _styleForDart(Identifier property, Expressions exprs,
-      List dartStyles) {
+  DartStyleExpression _styleForDart(
+      Identifier property, Expressions exprs, List dartStyles) {
     var styleType = _findStyle(property.name.toLowerCase());
     if (styleType != null) {
       return buildDartStyleNode(styleType, exprs, dartStyles);
@@ -1786,9 +1779,8 @@
     return fontExpr;
   }
 
-  DartStyleExpression buildDartStyleNode(int styleType, Expressions exprs,
-      List dartStyles) {
-
+  DartStyleExpression buildDartStyleNode(
+      int styleType, Expressions exprs, List dartStyles) {
     switch (styleType) {
       /*
        * Properties in order:
@@ -1798,9 +1790,9 @@
        * 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);
-         return _mergeFontStyles(processor.processFont(), dartStyles);
+      case _fontPartFont:
+        var processor = new ExpressionsProcessor(exprs);
+        return _mergeFontStyles(processor.processFont(), dartStyles);
       case _fontPartFamily:
         var processor = new ExpressionsProcessor(exprs);
 
@@ -1844,8 +1836,7 @@
         //              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 = new FontExpression(expr.span, weight: expr.value);
           return _mergeFontStyles(fontExpr, dartStyles);
         } else if (expr is LiteralTerm) {
           int weight = _nameToFontWeight[expr.value.toString()];
@@ -1864,7 +1855,7 @@
             // TODO(terry): Need to handle other units and LiteralTerm normal
             //              See https://github.com/dart-lang/csslib/issues/2.
             if (unitTerm.unit == TokenKind.UNIT_LENGTH_PX ||
-                   unitTerm.unit == TokenKind.UNIT_LENGTH_PT) {
+                unitTerm.unit == TokenKind.UNIT_LENGTH_PT) {
               var fontExpr = new FontExpression(expr.span,
                   lineHeight: new LineHeight(expr.value, inPixels: true));
               return _mergeFontStyles(fontExpr, dartStyles);
@@ -1899,8 +1890,8 @@
         }
         break;
       case _paddingPartPadding:
-        return new PaddingExpression.boxEdge(exprs.span,
-            processFourNums(exprs));
+        return new PaddingExpression.boxEdge(
+            exprs.span, processFourNums(exprs));
       case _marginPartLeft:
       case _marginPartTop:
       case _marginPartRight:
@@ -2000,7 +1991,7 @@
         bottom = top;
         right = marginValue(exprs.expressions[1]);
         left = right;
-       break;
+        break;
       case 3:
         top = marginValue(exprs.expressions[0]);
         right = marginValue(exprs.expressions[1]);
@@ -2046,28 +2037,29 @@
       var opStart = _peekToken.span;
 
       switch (_peek()) {
-      case TokenKind.SLASH:
-        op = new OperatorSlash(_makeSpan(opStart));
-        break;
-      case TokenKind.COMMA:
-        op = new OperatorComma(_makeSpan(opStart));
-        break;
-      case TokenKind.BACKSLASH:
-        // Backslash outside of string; detected IE8 or older signaled by \9 at
-        // end of an expression.
-        var ie8Start = _peekToken.span;
+        case TokenKind.SLASH:
+          op = new OperatorSlash(_makeSpan(opStart));
+          break;
+        case TokenKind.COMMA:
+          op = new OperatorComma(_makeSpan(opStart));
+          break;
+        case TokenKind.BACKSLASH:
+          // Backslash outside of string; detected IE8 or older signaled by \9 at
+          // end of an expression.
+          var ie8Start = _peekToken.span;
 
-        _next();
-        if (_peekKind(TokenKind.INTEGER)) {
-          var numToken = _next();
-          var value = int.parse(numToken.text);
-          if (value == 9) {
-            op = new IE8Term(_makeSpan(ie8Start));
-          } else if (isChecked) {
-            _warning("\$value is not valid in an expression", _makeSpan(start));
+          _next();
+          if (_peekKind(TokenKind.INTEGER)) {
+            var numToken = _next();
+            var value = int.parse(numToken.text);
+            if (value == 9) {
+              op = new IE8Term(_makeSpan(ie8Start));
+            } else if (isChecked) {
+              _warning(
+                  "\$value is not valid in an expression", _makeSpan(start));
+            }
           }
-        }
-        break;
+          break;
       }
 
       if (expr != null) {
@@ -2120,165 +2112,167 @@
   //
   processTerm([bool ieFilter = false]) {
     var start = _peekToken.span;
-    Token t;                          // token for term's value
-    var value;                        // value of term (numeric values)
+    Token t; // token for term's value
+    var value; // value of term (numeric values)
 
     var unary = "";
     switch (_peek()) {
-    case TokenKind.HASH:
-      this._eat(TokenKind.HASH);
-      if (!_anyWhiteSpaceBeforePeekToken(TokenKind.HASH)) {
-        String hexText;
-        if (_peekKind(TokenKind.INTEGER)) {
-          String hexText1 = _peekToken.text;
-          _next();
-          if (_peekIdentifier()) {
-            hexText = '$hexText1${identifier().name}';
-          } else {
-            hexText = hexText1;
+      case TokenKind.HASH:
+        this._eat(TokenKind.HASH);
+        if (!_anyWhiteSpaceBeforePeekToken(TokenKind.HASH)) {
+          String hexText;
+          if (_peekKind(TokenKind.INTEGER)) {
+            String hexText1 = _peekToken.text;
+            _next();
+            if (_peekIdentifier()) {
+              hexText = '$hexText1${identifier().name}';
+            } else {
+              hexText = hexText1;
+            }
+          } else if (_peekIdentifier()) {
+            hexText = identifier().name;
           }
-        } else if (_peekIdentifier()) {
-          hexText = identifier().name;
+          if (hexText != null) {
+            return _parseHex(hexText, _makeSpan(start));
+          }
         }
-        if (hexText != null) {
-          return _parseHex(hexText, _makeSpan(start));
-        }
-      }
 
-      if (isChecked) {
-        _warning("Expected hex number", _makeSpan(start));
-      }
-      // Construct the bad hex value with a #<space>number.
-      return _parseHex(" ${processTerm().text}", _makeSpan(start));
-    case TokenKind.INTEGER:
-      t = _next();
-      value = int.parse("${unary}${t.text}");
-      break;
-    case TokenKind.DOUBLE:
-      t = _next();
-      value = double.parse("${unary}${t.text}");
-      break;
-    case TokenKind.SINGLE_QUOTE:
-      value = processQuotedString(false);
-      value = "'${_escapeString(value, single: true)}'";
-      return new LiteralTerm(value, value, _makeSpan(start));
-    case TokenKind.DOUBLE_QUOTE:
-      value = processQuotedString(false);
-      value = '"${_escapeString(value)}"';
-      return new LiteralTerm(value, value, _makeSpan(start));
-    case TokenKind.LPAREN:
-      _next();
-
-      GroupTerm group = new GroupTerm(_makeSpan(start));
-
-      var term;
-      do {
-        term = processTerm();
-        if (term != null && term is LiteralTerm) {
-          group.add(term);
-        }
-      } while (term != null && !_maybeEat(TokenKind.RPAREN) &&
-          !isPrematureEndOfFile());
-
-      return group;
-    case TokenKind.LBRACK:
-      _next();
-
-      var term = processTerm();
-      if (!(term is NumberTerm)) {
-        _error('Expecting a positive number', _makeSpan(start));
-      }
-
-      _eat(TokenKind.RBRACK);
-
-      return new ItemTerm(term.value, term.text, _makeSpan(start));
-    case TokenKind.IDENTIFIER:
-      var nameValue = identifier();   // Snarf up the ident we'll remap, maybe.
-
-      if (!ieFilter && _maybeEat(TokenKind.LPAREN)) {
-        // FUNCTION
-        return processFunction(nameValue);
-      } if (ieFilter) {
-         if (_maybeEat(TokenKind.COLON) &&
-           nameValue.name.toLowerCase() == 'progid') {
-           // IE filter:progid:
-           return processIEFilter(start);
-         } else {
-           // Handle filter:<name> where name is any filter e.g., alpha, chroma,
-           // Wave, blur, etc.
-           return processIEFilter(start);
-         }
-      }
-
-      // 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));
-      }
-
-      // What kind of identifier is it, named color?
-      var colorEntry = TokenKind.matchColorName(nameValue.name);
-      if (colorEntry == null) {
         if (isChecked) {
-          var propName = nameValue.name;
-          var errMsg = TokenKind.isPredefinedName(propName) ?
-              "Improper use of property value ${propName}" :
-              "Unknown property value ${propName}";
-          _warning(errMsg, _makeSpan(start));
+          _warning("Expected hex number", _makeSpan(start));
         }
-        return new LiteralTerm(nameValue, nameValue.name, _makeSpan(start));
-      }
-
-      // Yes, process the color as an RGB value.
-      var rgbColor =
-          TokenKind.decimalToHex(TokenKind.colorValue(colorEntry), 6);
-      return _parseHex(rgbColor, _makeSpan(start));
-    case TokenKind.UNICODE_RANGE:
-      var first;
-      var second;
-      var firstNumber;
-      var secondNumber;
-      _eat(TokenKind.UNICODE_RANGE, unicodeRange: true);
-      if (_maybeEat(TokenKind.HEX_INTEGER, unicodeRange: true)) {
-        first = _previousToken.text;
-        firstNumber = int.parse('0x$first');
-        if (firstNumber > MAX_UNICODE) {
-          _error("unicode range must be less than 10FFFF", _makeSpan(start));
-        }
-        if (_maybeEat(TokenKind.MINUS, unicodeRange: true)) {
-          if (_maybeEat(TokenKind.HEX_INTEGER, unicodeRange: true)) {
-            second = _previousToken.text;
-            secondNumber = int.parse('0x$second');
-            if (secondNumber > MAX_UNICODE) {
-              _error("unicode range must be less than 10FFFF",
-                  _makeSpan(start));
-            }
-            if (firstNumber > secondNumber) {
-              _error("unicode first range can not be greater than last",
-                  _makeSpan(start));
-            }
-          }
-        }
-      } else if (_maybeEat(TokenKind.HEX_RANGE, unicodeRange: true)) {
-        first = _previousToken.text;
-      }
-
-      return new UnicodeRangeTerm(first, second, _makeSpan(start));
-    case TokenKind.AT:
-      if (messages.options.lessSupport) {
+        // Construct the bad hex value with a #<space>number.
+        return _parseHex(" ${processTerm().text}", _makeSpan(start));
+      case TokenKind.INTEGER:
+        t = _next();
+        value = int.parse("${unary}${t.text}");
+        break;
+      case TokenKind.DOUBLE:
+        t = _next();
+        value = double.parse("${unary}${t.text}");
+        break;
+      case TokenKind.SINGLE_QUOTE:
+        value = processQuotedString(false);
+        value = "'${_escapeString(value, single: true)}'";
+        return new LiteralTerm(value, value, _makeSpan(start));
+      case TokenKind.DOUBLE_QUOTE:
+        value = processQuotedString(false);
+        value = '"${_escapeString(value)}"';
+        return new LiteralTerm(value, value, _makeSpan(start));
+      case TokenKind.LPAREN:
         _next();
 
-        var expr = processExpr();
-        if (isChecked && expr.expressions.length > 1) {
-          _error("only @name for Less syntax", _peekToken.span);
+        GroupTerm group = new GroupTerm(_makeSpan(start));
+
+        var term;
+        do {
+          term = processTerm();
+          if (term != null && term is LiteralTerm) {
+            group.add(term);
+          }
+        } while (term != null &&
+            !_maybeEat(TokenKind.RPAREN) &&
+            !isPrematureEndOfFile());
+
+        return group;
+      case TokenKind.LBRACK:
+        _next();
+
+        var term = processTerm();
+        if (!(term is NumberTerm)) {
+          _error('Expecting a positive number', _makeSpan(start));
         }
 
-        var param = expr.expressions[0];
-        var varUsage = new VarUsage(param.text, [], _makeSpan(start));
-        expr.expressions[0] = varUsage;
-        return expr.expressions;
-      }
-      break;
+        _eat(TokenKind.RBRACK);
+
+        return new ItemTerm(term.value, term.text, _makeSpan(start));
+      case TokenKind.IDENTIFIER:
+        var nameValue = identifier(); // Snarf up the ident we'll remap, maybe.
+
+        if (!ieFilter && _maybeEat(TokenKind.LPAREN)) {
+          // FUNCTION
+          return processFunction(nameValue);
+        }
+        if (ieFilter) {
+          if (_maybeEat(TokenKind.COLON) &&
+              nameValue.name.toLowerCase() == 'progid') {
+            // IE filter:progid:
+            return processIEFilter(start);
+          } else {
+            // Handle filter:<name> where name is any filter e.g., alpha, chroma,
+            // Wave, blur, etc.
+            return processIEFilter(start);
+          }
+        }
+
+        // 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));
+        }
+
+        // What kind of identifier is it, named color?
+        var colorEntry = TokenKind.matchColorName(nameValue.name);
+        if (colorEntry == null) {
+          if (isChecked) {
+            var propName = nameValue.name;
+            var errMsg = TokenKind.isPredefinedName(propName)
+                ? "Improper use of property value ${propName}"
+                : "Unknown property value ${propName}";
+            _warning(errMsg, _makeSpan(start));
+          }
+          return new LiteralTerm(nameValue, nameValue.name, _makeSpan(start));
+        }
+
+        // Yes, process the color as an RGB value.
+        var rgbColor =
+            TokenKind.decimalToHex(TokenKind.colorValue(colorEntry), 6);
+        return _parseHex(rgbColor, _makeSpan(start));
+      case TokenKind.UNICODE_RANGE:
+        var first;
+        var second;
+        var firstNumber;
+        var secondNumber;
+        _eat(TokenKind.UNICODE_RANGE, unicodeRange: true);
+        if (_maybeEat(TokenKind.HEX_INTEGER, unicodeRange: true)) {
+          first = _previousToken.text;
+          firstNumber = int.parse('0x$first');
+          if (firstNumber > MAX_UNICODE) {
+            _error("unicode range must be less than 10FFFF", _makeSpan(start));
+          }
+          if (_maybeEat(TokenKind.MINUS, unicodeRange: true)) {
+            if (_maybeEat(TokenKind.HEX_INTEGER, unicodeRange: true)) {
+              second = _previousToken.text;
+              secondNumber = int.parse('0x$second');
+              if (secondNumber > MAX_UNICODE) {
+                _error(
+                    "unicode range must be less than 10FFFF", _makeSpan(start));
+              }
+              if (firstNumber > secondNumber) {
+                _error("unicode first range can not be greater than last",
+                    _makeSpan(start));
+              }
+            }
+          }
+        } else if (_maybeEat(TokenKind.HEX_RANGE, unicodeRange: true)) {
+          first = _previousToken.text;
+        }
+
+        return new UnicodeRangeTerm(first, second, _makeSpan(start));
+      case TokenKind.AT:
+        if (messages.options.lessSupport) {
+          _next();
+
+          var expr = processExpr();
+          if (isChecked && expr.expressions.length > 1) {
+            _error("only @name for Less syntax", _peekToken.span);
+          }
+
+          var param = expr.expressions[0];
+          var varUsage = new VarUsage(param.text, [], _makeSpan(start));
+          expr.expressions[0] = varUsage;
+          return expr.expressions;
+        }
+        break;
     }
 
     return processDimension(t, value, _makeSpan(start));
@@ -2290,76 +2284,76 @@
     var unitType = this._peek();
 
     switch (unitType) {
-    case TokenKind.UNIT_EM:
-      term = new EmTerm(value, t.text, span);
-      _next();    // Skip the unit
-      break;
-    case TokenKind.UNIT_EX:
-      term = new ExTerm(value, t.text, span);
-      _next();    // Skip the unit
-      break;
-    case TokenKind.UNIT_LENGTH_PX:
-    case TokenKind.UNIT_LENGTH_CM:
-    case TokenKind.UNIT_LENGTH_MM:
-    case TokenKind.UNIT_LENGTH_IN:
-    case TokenKind.UNIT_LENGTH_PT:
-    case TokenKind.UNIT_LENGTH_PC:
-      term = new 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);
-      _next();    // Skip the unit
-      break;
-    case TokenKind.UNIT_TIME_MS:
-    case TokenKind.UNIT_TIME_S:
-      term = new 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);
-      _next();    // Skip the unit
-      break;
-    case TokenKind.PERCENT:
-      term = new PercentageTerm(value, t.text, span);
-      _next();    // Skip the %
-      break;
-    case TokenKind.UNIT_FRACTION:
-      term = new 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);
-      _next();    // Skip the unit
-      break;
-    case TokenKind.UNIT_CH:
-      term = new ChTerm(value, t.text, span, unitType);
-      _next();    // Skip the unit
-      break;
-    case TokenKind.UNIT_REM:
-      term = new 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);
-      _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);
-      }
-      break;
+      case TokenKind.UNIT_EM:
+        term = new EmTerm(value, t.text, span);
+        _next(); // Skip the unit
+        break;
+      case TokenKind.UNIT_EX:
+        term = new ExTerm(value, t.text, span);
+        _next(); // Skip the unit
+        break;
+      case TokenKind.UNIT_LENGTH_PX:
+      case TokenKind.UNIT_LENGTH_CM:
+      case TokenKind.UNIT_LENGTH_MM:
+      case TokenKind.UNIT_LENGTH_IN:
+      case TokenKind.UNIT_LENGTH_PT:
+      case TokenKind.UNIT_LENGTH_PC:
+        term = new 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);
+        _next(); // Skip the unit
+        break;
+      case TokenKind.UNIT_TIME_MS:
+      case TokenKind.UNIT_TIME_S:
+        term = new 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);
+        _next(); // Skip the unit
+        break;
+      case TokenKind.PERCENT:
+        term = new PercentageTerm(value, t.text, span);
+        _next(); // Skip the %
+        break;
+      case TokenKind.UNIT_FRACTION:
+        term = new 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);
+        _next(); // Skip the unit
+        break;
+      case TokenKind.UNIT_CH:
+        term = new ChTerm(value, t.text, span, unitType);
+        _next(); // Skip the unit
+        break;
+      case TokenKind.UNIT_REM:
+        term = new 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);
+        _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);
+        }
+        break;
     }
 
     return term;
@@ -2377,27 +2371,27 @@
     tokenizer._skipWhitespace = false;
 
     switch (_peek()) {
-    case TokenKind.SINGLE_QUOTE:
-      stopToken = TokenKind.SINGLE_QUOTE;
-      _next(); // Skip the SINGLE_QUOTE.
-      start = _peekToken.span;
-      break;
-    case TokenKind.DOUBLE_QUOTE:
-      stopToken = TokenKind.DOUBLE_QUOTE;
-      _next(); // Skip the DOUBLE_QUOTE.
-      start = _peekToken.span;
-      break;
-    default:
-      if (urlString) {
-        if (_peek() == TokenKind.LPAREN) {
-          _next();    // Skip the LPAREN.
-          start = _peekToken.span;
+      case TokenKind.SINGLE_QUOTE:
+        stopToken = TokenKind.SINGLE_QUOTE;
+        _next(); // Skip the SINGLE_QUOTE.
+        start = _peekToken.span;
+        break;
+      case TokenKind.DOUBLE_QUOTE:
+        stopToken = TokenKind.DOUBLE_QUOTE;
+        _next(); // Skip the DOUBLE_QUOTE.
+        start = _peekToken.span;
+        break;
+      default:
+        if (urlString) {
+          if (_peek() == TokenKind.LPAREN) {
+            _next(); // Skip the LPAREN.
+            start = _peekToken.span;
+          }
+          stopToken = TokenKind.RPAREN;
+        } else {
+          _error('unexpected string', _makeSpan(start));
         }
-        stopToken = TokenKind.RPAREN;
-      } else {
-        _error('unexpected string', _makeSpan(start));
-      }
-      break;
+        break;
     }
 
     // Gobble up everything until we hit our stop token.
@@ -2410,7 +2404,7 @@
 
     // All characters between quotes is the string.
     if (stopToken != TokenKind.RPAREN) {
-      _next();    // Skip the SINGLE_QUOTE or DOUBLE_QUOTE;
+      _next(); // Skip the SINGLE_QUOTE or DOUBLE_QUOTE;
     }
 
     return stringValue.toString();
@@ -2438,8 +2432,8 @@
         case TokenKind.RPAREN:
           _eat(TokenKind.RPAREN);
           if (--parens == 0) {
-            var tok = tokenizer.makeIEFilter(startAfterProgidColon.start.offset,
-                _peekToken.start);
+            var tok = tokenizer.makeIEFilter(
+                startAfterProgidColon.start.offset, _peekToken.start);
             return new LiteralTerm(tok.text, tok.text, tok.span);
           }
           break;
@@ -2459,53 +2453,53 @@
     var name = func.name;
 
     switch (name) {
-    case 'url':
-      // URI term sucks up everything inside of quotes(' or ") or between parens
-      var urlParam = processQuotedString(true);
+      case 'url':
+        // URI term sucks up everything inside of quotes(' or ") or between parens
+        var urlParam = processQuotedString(true);
 
-      // TODO(terry): Better error messge and checking for mismatched quotes.
-      if (_peek() == TokenKind.END_OF_FILE) {
-        _error("problem parsing URI", _peekToken.span);
-      }
+        // TODO(terry): Better error messge and checking for mismatched quotes.
+        if (_peek() == TokenKind.END_OF_FILE) {
+          _error("problem parsing URI", _peekToken.span);
+        }
 
-      if (_peek() == TokenKind.RPAREN) {
-        _next();
-      }
+        if (_peek() == TokenKind.RPAREN) {
+          _next();
+        }
 
-      return new UriTerm(urlParam, _makeSpan(start));
-    case 'calc':
-      // TODO(terry): Implement expression handling...
-      break;
-    case 'var':
-      // TODO(terry): Consider handling var in IE specific filter/progid.  This
-      //              will require parsing entire IE specific syntax e.g.,
-      //              param = value or progid:com_id, etc. for example:
-      //
-      //    var-blur: Blur(Add = 0, Direction = 225, Strength = 10);
-      //    var-gradient: progid:DXImageTransform.Microsoft.gradient"
-      //      (GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');
-      var expr = processExpr();
-      if (!_maybeEat(TokenKind.RPAREN)) {
-        _error("problem parsing var expected ), ", _peekToken.span);
-      }
-      if (isChecked &&
-          expr.expressions.where((e) => e is OperatorComma).length > 1) {
-        _error("too many parameters to var()", _peekToken.span);
-      }
+        return new UriTerm(urlParam, _makeSpan(start));
+      case 'calc':
+        // TODO(terry): Implement expression handling...
+        break;
+      case 'var':
+        // TODO(terry): Consider handling var in IE specific filter/progid.  This
+        //              will require parsing entire IE specific syntax e.g.,
+        //              param = value or progid:com_id, etc. for example:
+        //
+        //    var-blur: Blur(Add = 0, Direction = 225, Strength = 10);
+        //    var-gradient: progid:DXImageTransform.Microsoft.gradient"
+        //      (GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');
+        var expr = processExpr();
+        if (!_maybeEat(TokenKind.RPAREN)) {
+          _error("problem parsing var expected ), ", _peekToken.span);
+        }
+        if (isChecked &&
+            expr.expressions.where((e) => e is OperatorComma).length > 1) {
+          _error("too many parameters to var()", _peekToken.span);
+        }
 
-      var paramName = expr.expressions[0].text;
+        var paramName = expr.expressions[0].text;
 
-      // [0] - var name, [1] - OperatorComma, [2] - default value.
-      var defaultValues = expr.expressions.length >= 3
-          ? expr.expressions.sublist(2) : [];
-      return new VarUsage(paramName, defaultValues, _makeSpan(start));
-    default:
-      var expr = processExpr();
-      if (!_maybeEat(TokenKind.RPAREN)) {
-        _error("problem parsing function expected ), ", _peekToken.span);
-      }
+        // [0] - var name, [1] - OperatorComma, [2] - default value.
+        var defaultValues =
+            expr.expressions.length >= 3 ? expr.expressions.sublist(2) : [];
+        return new 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 new FunctionTerm(name, name, expr, _makeSpan(start));
     }
 
     return null;
@@ -2527,11 +2521,11 @@
 
   // TODO(terry): Move this to base <= 36 and into shared code.
   static int _hexDigit(int c) {
-    if (c >= 48/*0*/ && c <= 57/*9*/) {
+    if (c >= 48 /*0*/ && c <= 57 /*9*/) {
       return c - 48;
-    } else if (c >= 97/*a*/ && c <= 102/*f*/) {
+    } else if (c >= 97 /*a*/ && c <= 102 /*f*/) {
       return c - 87;
-    } else if (c >= 65/*A*/ && c <= 70/*F*/) {
+    } else if (c >= 65 /*A*/ && c <= 70 /*F*/) {
       return c - 55;
     } else {
       return -1;
@@ -2541,7 +2535,7 @@
   HexColorTerm _parseHex(String hexText, SourceSpan span) {
     var hexValue = 0;
 
-     for (var i = 0; i < hexText.length; i++) {
+    for (var i = 0; i < hexText.length; i++) {
       var digit = _hexDigit(hexText.codeUnitAt(i));
       if (digit < 0) {
         _warning('Bad hex number', span);
@@ -2689,8 +2683,12 @@
     var code = text.codeUnitAt(i);
     String replace = null;
     switch (code) {
-      case 34/*'"'*/:  if (!single) replace = r'\"'; break;
-      case 39/*"'"*/:  if (single) replace = r"\'"; break;
+      case 34 /*'"'*/ :
+        if (!single) replace = r'\"';
+        break;
+      case 39 /*"'"*/ :
+        if (single) replace = r"\'";
+        break;
     }
 
     if (replace != null && result == null) {
diff --git a/lib/src/analyzer.dart b/lib/src/analyzer.dart
index da1a9fa..1341bc2 100644
--- a/lib/src/analyzer.dart
+++ b/lib/src/analyzer.dart
@@ -4,7 +4,6 @@
 
 part of csslib.parser;
 
-
 // TODO(terry): Add optimizing phase to remove duplicated selectors in the same
 //              selector group (e.g., .btn, .btn { color: red; }).  Also, look
 //              at simplifying selectors expressions too (much harder).
@@ -34,12 +33,12 @@
   //               possibly combine in one walk.
   void run() {
     // Expand top-level @include.
-    _styleSheets.forEach((styleSheet) =>
-        TopLevelIncludes.expand(_messages, _styleSheets));
+    _styleSheets.forEach(
+        (styleSheet) => TopLevelIncludes.expand(_messages, _styleSheets));
 
     // Expand @include in declarations.
-    _styleSheets.forEach((styleSheet) =>
-        DeclarationIncludes.expand(_messages, _styleSheets));
+    _styleSheets.forEach(
+        (styleSheet) => DeclarationIncludes.expand(_messages, _styleSheets));
 
     // Remove all @mixin and @include
     _styleSheets.forEach((styleSheet) => MixinsAndIncludes.remove(styleSheet));
@@ -47,13 +46,13 @@
     // Expand any nested selectors using selector desendant combinator to
     // signal CSS inheritance notation.
     _styleSheets.forEach((styleSheet) => new ExpandNestedSelectors()
-        ..visitStyleSheet(styleSheet)
-        ..flatten(styleSheet));
+      ..visitStyleSheet(styleSheet)
+      ..flatten(styleSheet));
 
     // Expand any @extend.
     _styleSheets.forEach((styleSheet) {
-        var allExtends = new AllExtends()..visitStyleSheet(styleSheet);
-        new InheritExtends(_messages, allExtends)..visitStyleSheet(styleSheet);
+      var allExtends = new AllExtends()..visitStyleSheet(styleSheet);
+      new InheritExtends(_messages, allExtends)..visitStyleSheet(styleSheet);
     });
   }
 }
@@ -215,8 +214,8 @@
     _parentRuleSet = oldParent;
 
     // Remove nested rules; they're all flatten and in the _expandedRuleSets.
-    node.declarationGroup.declarations.removeWhere((declaration) =>
-        declaration is RuleSet);
+    node.declarationGroup.declarations
+        .removeWhere((declaration) => declaration is RuleSet);
 
     _nestedSelectorGroup = oldNestedSelectorGroups;
 
@@ -305,8 +304,8 @@
 
     var newSequences = [];
     var first = sequences.first;
-    newSequences.add(new SimpleSelectorSequence(first.simpleSelector,
-        first.span, TokenKind.COMBINATOR_DESCENDANT));
+    newSequences.add(new SimpleSelectorSequence(
+        first.simpleSelector, first.span, TokenKind.COMBINATOR_DESCENDANT));
     newSequences.addAll(sequences.skip(1));
 
     return newSequences;
@@ -407,8 +406,8 @@
    * Look for the [ruleSet] inside of an @media directive; if found then replace
    * with the [newRules].  If [ruleSet] is found and replaced return true.
    */
-  static bool replace(StyleSheet styleSheet, RuleSet ruleSet,
-                      List<RuleSet>newRules) {
+  static bool replace(
+      StyleSheet styleSheet, RuleSet ruleSet, List<RuleSet> newRules) {
     var visitor = new _MediaRulesReplacer(ruleSet, newRules);
     visitor.visitStyleSheet(styleSheet);
     return visitor._foundAndReplaced;
@@ -459,8 +458,8 @@
     if (map.containsKey(node.name)) {
       var mixinDef = map[node.name];
       if (mixinDef is MixinRulesetDirective) {
-        _TopLevelIncludeReplacer.replace(_messages, _styleSheet, node,
-            mixinDef.rulesets);
+        _TopLevelIncludeReplacer.replace(
+            _messages, _styleSheet, node, mixinDef.rulesets);
       } else if (currDef is MixinRulesetDirective && _anyRulesets(currDef)) {
         // currDef is MixinRulesetDirective
         MixinRulesetDirective mixinRuleset = currDef;
@@ -519,7 +518,7 @@
    * with the [newRules].  If [ruleSet] is found and replaced return true.
    */
   static bool replace(Messages messages, StyleSheet styleSheet,
-      IncludeDirective include, List<RuleSet>newRules) {
+      IncludeDirective include, List<RuleSet> newRules) {
     var visitor = new _TopLevelIncludeReplacer(messages, include, newRules);
     visitor.visitStyleSheet(styleSheet);
     return visitor._foundAndReplaced;
@@ -555,13 +554,12 @@
  * can be an include in a declaration or an include directive (top-level).
  */
 int _findInclude(List list, var node) {
-  IncludeDirective matchNode = (node is IncludeMixinAtDeclaration) ?
-      node.include : node;
+  IncludeDirective matchNode =
+      (node is IncludeMixinAtDeclaration) ? node.include : node;
 
   var index = 0;
   for (var item in list) {
-    var includeNode = (item is IncludeMixinAtDeclaration) ?
-        item.include : item;
+    var includeNode = (item is IncludeMixinAtDeclaration) ? item.include : item;
     if (includeNode == matchNode) return index;
     index++;
   }
@@ -724,8 +722,8 @@
       rulesets.every((rule) => rule is IncludeDirective || rule is NoOp);
 
   CallMixin _createCallDeclMixin(MixinDefinition mixinDef) {
-    callMap.putIfAbsent(mixinDef.name, () =>
-        callMap[mixinDef.name] = new CallMixin(mixinDef, varDefs));
+    callMap.putIfAbsent(mixinDef.name,
+        () => callMap[mixinDef.name] = new CallMixin(mixinDef, varDefs));
     return callMap[mixinDef.name];
   }
 
@@ -750,8 +748,8 @@
         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, [new NoOp()]);
           }
           _messages.warning(
               "Using top-level mixin ${node.include.name} as a declaration",
@@ -763,22 +761,22 @@
           var rulesets = [];
           if (origRulesets.every((ruleset) => ruleset is IncludeDirective)) {
             origRulesets.forEach((ruleset) {
-              rulesets.add(new IncludeMixinAtDeclaration(ruleset,
-                  ruleset.span));
+              rulesets
+                  .add(new IncludeMixinAtDeclaration(ruleset, ruleset.span));
             });
             _IncludeReplacer.replace(_styleSheet, node, rulesets);
           }
         }
       }
 
-      if ( mixinDef.definedArgs.length > 0 && node.include.args.length > 0) {
+      if (mixinDef.definedArgs.length > 0 && node.include.args.length > 0) {
         var callMixin = _createCallDeclMixin(mixinDef);
         mixinDef = callMixin.transform(node.include.args);
       }
 
       if (mixinDef is MixinDeclarationDirective) {
-        _IncludeReplacer.replace(_styleSheet, node,
-            mixinDef.declarations.declarations);
+        _IncludeReplacer.replace(
+            _styleSheet, node, mixinDef.declarations.declarations);
       }
     } else {
       _messages.warning("Undefined mixin ${node.include.name}", node.span);
@@ -792,11 +790,11 @@
       var mixinDef = map[node.name];
       if (currDef is MixinDeclarationDirective &&
           mixinDef is MixinDeclarationDirective) {
-        _IncludeReplacer.replace(_styleSheet, node,
-            mixinDef.declarations.declarations);
+        _IncludeReplacer.replace(
+            _styleSheet, node, mixinDef.declarations.declarations);
       } else if (currDef is MixinDeclarationDirective) {
-        var decls = (currDef as MixinDeclarationDirective)
-            .declarations.declarations;
+        var decls =
+            (currDef as MixinDeclarationDirective).declarations.declarations;
         var index = _findInclude(decls, node);
         if (index != -1) {
           decls.replaceRange(index, index + 1, [new NoOp()]);
@@ -835,7 +833,7 @@
       varDefs[node.definedName] = node;
     }
     super.visitVarDefinition(node);
- }
+  }
 
   void visitVarDefinitionDirective(VarDefinitionDirective node) {
     visitVarDefinition(node.def);
@@ -852,8 +850,8 @@
    * Look for the [ruleSet] inside of a @media directive; if found then replace
    * with the [newRules].
    */
-  static void replace(StyleSheet ss, var include,
-      List<Declaration> newDeclarations) {
+  static void replace(
+      StyleSheet ss, var include, List<Declaration> newDeclarations) {
     var visitor = new _IncludeReplacer(include, newDeclarations);
     visitor.visitStyleSheet(ss);
   }
@@ -973,12 +971,14 @@
   InheritExtends(this._messages, this._allExtends);
 
   void visitSelectorGroup(SelectorGroup node) {
-    for (var selectorsIndex = 0; selectorsIndex < node.selectors.length;
+    for (var selectorsIndex = 0;
+        selectorsIndex < node.selectors.length;
         selectorsIndex++) {
       var selectors = node.selectors[selectorsIndex];
       var isLastNone = false;
       var selectorName = "";
-      for (var index = 0; index < selectors.simpleSelectorSequences.length;
+      for (var index = 0;
+          index < selectors.simpleSelectorSequences.length;
           index++) {
         var simpleSeq = selectors.simpleSelectorSequences[index];
         var namePart = simpleSeq.simpleSelector.toString();
@@ -1001,8 +1001,8 @@
                   newSelectors.simpleSelectorSequences[index].combinator;
               newSeq.simpleSelectorSequences[0].combinator = orgCombinator;
 
-              newSelectors.simpleSelectorSequences.replaceRange(index,
-                  index + 1, newSeq.simpleSelectorSequences);
+              newSelectors.simpleSelectorSequences.replaceRange(
+                  index, index + 1, newSeq.simpleSelectorSequences);
               node.selectors.add(newSelectors);
             }
             isLastNone = false;
diff --git a/lib/src/css_printer.dart b/lib/src/css_printer.dart
index 9a80ee1..125b5ae 100644
--- a/lib/src/css_printer.dart
+++ b/lib/src/css_printer.dart
@@ -272,7 +272,6 @@
     }
   }
 
-
   void visitSelectorGroup(SelectorGroup node) {
     var selectors = node.selectors;
     var selectorsLength = selectors.length;
diff --git a/lib/src/messages.dart b/lib/src/messages.dart
index 92f8451..d8abcab 100644
--- a/lib/src/messages.dart
+++ b/lib/src/messages.dart
@@ -47,14 +47,17 @@
   final bool useColors;
 
   Message(this.level, this.message, {SourceSpan span, bool useColors: false})
-      : this.span = span, this.useColors = useColors;
+      : this.span = span,
+        this.useColors = useColors;
 
   String toString() {
     var output = new StringBuffer();
     bool colors = useColors && _ERROR_COLORS.containsKey(level);
     var levelColor = colors ? _ERROR_COLORS[level] : null;
     if (colors) output.write(levelColor);
-    output..write(_ERROR_LABEL[level])..write(' ');
+    output
+      ..write(_ERROR_LABEL[level])
+      ..write(' ');
     if (colors) output.write(NO_COLOR);
 
     if (span == null) {
@@ -87,8 +90,8 @@
 
   /** Report a compile-time CSS error. */
   void error(String message, SourceSpan span) {
-    var msg = new Message(Level.SEVERE, message, span: span,
-        useColors: options.useColors);
+    var msg = new Message(Level.SEVERE, message,
+        span: span, useColors: options.useColors);
 
     messages.add(msg);
 
@@ -100,8 +103,8 @@
     if (options.warningsAsErrors) {
       error(message, span);
     } else {
-      var msg = new Message(Level.WARNING, message, span: span,
-          useColors: options.useColors);
+      var msg = new Message(Level.WARNING, message,
+          span: span, useColors: options.useColors);
 
       messages.add(msg);
     }
@@ -109,8 +112,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 = new Message(Level.INFO, message,
+        span: span, useColors: options.useColors);
 
     messages.add(msg);
 
@@ -120,8 +123,11 @@
   /** Merge [newMessages] to this message lsit. */
   void mergeMessages(Messages newMessages) {
     messages.addAll(newMessages.messages);
-    newMessages.messages.where((message) =>
-        message.level.value == Level.SEVERE || options.verbose)
-        .forEach((message) { printHandler(message); });
+    newMessages.messages
+        .where(
+            (message) => message.level.value == Level.SEVERE || options.verbose)
+        .forEach((message) {
+      printHandler(message);
+    });
   }
 }
diff --git a/lib/src/options.dart b/lib/src/options.dart
index a344a39..0ebb5b4 100644
--- a/lib/src/options.dart
+++ b/lib/src/options.dart
@@ -44,38 +44,48 @@
   factory PreprocessorOptions() => parse(['']);
 
   PreprocessorOptions.fromArgs(ArgResults args)
-    : warningsAsErrors = args['warnings_as_errors'],
-      throwOnWarnings = args['throw_on_warnings'],
-      throwOnErrors = args['throw_on_errors'],
-      verbose = args['verbose'],
-      checked = args['checked'],
-      lessSupport = args['less'],
-      useColors = args['colors'],
-      polyfill = args['polyfill'],
-      inputFile = args.rest.length > 0 ? args.rest[0] : null;
+      : warningsAsErrors = args['warnings_as_errors'],
+        throwOnWarnings = args['throw_on_warnings'],
+        throwOnErrors = args['throw_on_errors'],
+        verbose = args['verbose'],
+        checked = args['checked'],
+        lessSupport = args['less'],
+        useColors = args['colors'],
+        polyfill = args['polyfill'],
+        inputFile = args.rest.length > 0 ? args.rest[0] : null;
 
   // tool.dart [options...] <css file>
   static PreprocessorOptions parse(List<String> arguments) {
     var parser = new ArgParser()
-      ..addFlag('verbose', abbr: 'v', defaultsTo: false, negatable: false,
+      ..addFlag('verbose',
+          abbr: 'v',
+          defaultsTo: false,
+          negatable: false,
           help: 'Display detail info')
-      ..addFlag('checked', defaultsTo: false, negatable: false,
+      ..addFlag('checked',
+          defaultsTo: false,
+          negatable: false,
           help: 'Validate CSS values invalid value display a warning message')
-      ..addFlag('less', defaultsTo: true, negatable: true,
+      ..addFlag('less',
+          defaultsTo: true,
+          negatable: true,
           help: 'Supports subset of Less syntax')
-      ..addFlag('suppress_warnings', defaultsTo: true,
-          help: 'Warnings not displayed')
-      ..addFlag('warnings_as_errors', defaultsTo: false,
-          help: 'Warning handled as errors')
-      ..addFlag('throw_on_errors', defaultsTo: false,
-          help: 'Throw on errors encountered')
-      ..addFlag('throw_on_warnings', defaultsTo: false,
-          help: 'Throw on warnings encountered')
-      ..addFlag('colors', defaultsTo: true,
-          help: 'Display errors/warnings in colored text')
-      ..addFlag('polyfill', defaultsTo: false,
-          help: 'Generate polyfill for new CSS features')
-      ..addFlag('help', abbr: 'h', defaultsTo: false, negatable: false,
+      ..addFlag('suppress_warnings',
+          defaultsTo: true, help: 'Warnings not displayed')
+      ..addFlag('warnings_as_errors',
+          defaultsTo: false, help: 'Warning handled as errors')
+      ..addFlag('throw_on_errors',
+          defaultsTo: false, help: 'Throw on errors encountered')
+      ..addFlag('throw_on_warnings',
+          defaultsTo: false, help: 'Throw on warnings encountered')
+      ..addFlag('colors',
+          defaultsTo: true, help: 'Display errors/warnings in colored text')
+      ..addFlag('polyfill',
+          defaultsTo: false, help: 'Generate polyfill for new CSS features')
+      ..addFlag('help',
+          abbr: 'h',
+          defaultsTo: false,
+          negatable: false,
           help: 'Displays this help message');
 
     try {
@@ -96,5 +106,4 @@
     print('Usage: css [options...] input.css');
     print(parser.getUsage());
   }
-
 }
diff --git a/lib/src/polyfill.dart b/lib/src/polyfill.dart
index 95749b9..bdd8330 100644
--- a/lib/src/polyfill.dart
+++ b/lib/src/polyfill.dart
@@ -41,15 +41,14 @@
   void processVarDefinitions(List<StyleSheet> includes) {
     for (var include in includes) {
       _allVarDefinitions = (new _VarDefinitionsIncludes(_allVarDefinitions)
-          ..visitTree(include)).varDefs;
+        ..visitTree(include)).varDefs;
     }
   }
 
   void processVars(StyleSheet styleSheet) {
     // Build list of all var definitions.
-    var mainStyleSheetVarDefs =
-        (new _VarDefAndUsage(this._messages, _allVarDefinitions)
-        ..visitTree(styleSheet)).varDefs;
+    var mainStyleSheetVarDefs = (new _VarDefAndUsage(
+        this._messages, _allVarDefinitions)..visitTree(styleSheet)).varDefs;
 
     // Resolve all definitions to a non-VarUsage (terminal expression).
     mainStyleSheetVarDefs.forEach((key, value) {
@@ -75,7 +74,7 @@
     // Replace with latest variable definition.
     varDefs[node.definedName] = node;
     super.visitVarDefinition(node);
- }
+  }
 
   void visitVarDefinitionDirective(VarDefinitionDirective node) {
     visitVarDefinition(node.def);
@@ -110,7 +109,7 @@
     super.visitVarDefinition(node);
 
     currVarDefinition = null;
- }
+  }
 
   void visitVarDefinitionDirective(VarDefinitionDirective node) {
     visitVarDefinition(node.def);
@@ -149,7 +148,7 @@
         terminalDefaults.addAll(resolveUsageTerminal(defaultValue));
       }
       expressions.replaceRange(index, index + 1, terminalDefaults);
-    } else if (node.defaultValues.isNotEmpty){
+    } else if (node.defaultValues.isNotEmpty) {
       // No VarDefinition but default value is a terminal expression; use it.
       expressions.replaceRange(index, index + 1, node.defaultValues);
     } else {
@@ -199,8 +198,7 @@
     return result;
   }
 
-  _resolveVarUsage(List<Expression> expressions, int index,
-                   VarDefinition def) {
+  _resolveVarUsage(List<Expression> expressions, int index, VarDefinition def) {
     var defExpressions = (def.expression as Expressions).expressions;
     expressions.replaceRange(index, index + 1, defExpressions);
   }
@@ -224,8 +222,8 @@
 }
 
 /** Find terminal definition (non VarUsage implies real CSS value). */
-VarDefinition _findTerminalVarDefinition(Map<String, VarDefinition> varDefs,
-    VarDefinition varDef) {
+VarDefinition _findTerminalVarDefinition(
+    Map<String, VarDefinition> varDefs, VarDefinition varDef) {
   var expressions = varDef.expression as Expressions;
   for (var expr in expressions.expressions) {
     if (expr is VarUsage) {
diff --git a/lib/src/property.dart b/lib/src/property.dart
index 5219c25..7e12352 100644
--- a/lib/src/property.dart
+++ b/lib/src/property.dart
@@ -29,7 +29,6 @@
   String get cssExpression;
 }
 
-
 /**
  * Base interface for Color, HSL and RGB.
  */
@@ -47,7 +46,6 @@
   int get argbValue;
 }
 
-
 /**
  * General purpse Color class.  Represent a color as an ARGB value that can be
  * converted to and from num, hex string, hsl, hsla, rgb, rgba and SVG pre-
@@ -68,8 +66,7 @@
    * Color.gold, where ff is red intensity, d7 is green intensity, and 00 is
    * blue intensity.
    */
-  Color(int rgb, [num alpha]) :
-    this._argb = Color._rgbToArgbString(rgb, alpha);
+  Color(int rgb, [num alpha]) : this._argb = Color._rgbToArgbString(rgb, alpha);
 
   /**
    * RGB takes three values. The [red], [green], and [blue] parameters are
@@ -81,18 +78,16 @@
    * internally be mapped to an int between '0' and '255' like the other color
    * components.
    */
-  Color.createRgba(int red, int green, int blue, [num alpha]) :
-      this._argb = Color.convertToHexString(Color._clamp(red, 0, 255),
-          Color._clamp(green, 0, 255),
-          Color._clamp(blue, 0, 255),
+  Color.createRgba(int red, int green, int blue, [num alpha])
+      : this._argb = Color.convertToHexString(Color._clamp(red, 0, 255),
+          Color._clamp(green, 0, 255), Color._clamp(blue, 0, 255),
           alpha != null ? Color._clamp(alpha, 0, 1) : alpha);
 
   /**
    * Creates a new color from a CSS color string. For more information, see
    * <https://developer.mozilla.org/en/CSS/color>.
    */
-  Color.css(String color) :
-      this._argb = Color._convertCssToArgb(color);
+  Color.css(String color) : this._argb = Color._convertCssToArgb(color);
 
   // TODO(jmesserly): I found the use of percents a bit suprising.
   /**
@@ -109,8 +104,8 @@
    * foreground).
    */
   Color.createHsla(num hueDegree, num saturationPercent, num lightnessPercent,
-      [num alpha]) :
-          this._argb = new Hsla(Color._clamp(hueDegree, 0, 360) / 360,
+      [num alpha])
+      : this._argb = new Hsla(Color._clamp(hueDegree, 0, 360) / 360,
           Color._clamp(saturationPercent, 0, 100) / 100,
           Color._clamp(lightnessPercent, 0, 100) / 100,
           alpha != null ? Color._clamp(alpha, 0, 1) : alpha).toHexArgbString();
@@ -130,10 +125,9 @@
    *                completely transparent foreground and 1 is a completely
    *                opaque foreground.
    */
-  Color.hslaRaw(num hue, num saturation, num lightness, [num alpha]) :
-    this._argb = new Hsla(Color._clamp(hue, 0, 1),
-          Color._clamp(saturation, 0, 1),
-          Color._clamp(lightness, 0, 1),
+  Color.hslaRaw(num hue, num saturation, num lightness, [num alpha])
+      : this._argb = new Hsla(Color._clamp(hue, 0, 1),
+          Color._clamp(saturation, 0, 1), Color._clamp(lightness, 0, 1),
           alpha != null ? Color._clamp(alpha, 0, 1) : alpha).toHexArgbString();
 
   /**
@@ -151,7 +145,7 @@
   //              create the CSS from the normalized value.
   String get cssExpression {
     if (_argb.length == 6) {
-      return "#$_argb";         // RGB only, no alpha blending.
+      return "#$_argb"; // RGB only, no alpha blending.
     } else {
       num alpha = Color.hexToInt(_argb.substring(0, 2));
       String a = (alpha / 255).toStringAsPrecision(2);
@@ -246,7 +240,7 @@
     String color = value.trim().replaceAll("\\s", "");
     if (color[0] == '#') {
       String v = color.substring(1);
-      Color.hexToInt(v);              // Valid hexadecimal, throws if not.
+      Color.hexToInt(v); // Valid hexadecimal, throws if not.
       return v;
     } else if (color.length > 0 && color[color.length - 1] == ')') {
       int type;
@@ -266,7 +260,7 @@
         throw new UnsupportedError('CSS property not implemented');
       }
 
-      color = color.substring(0, color.length - 1);     // Strip close paren.
+      color = color.substring(0, color.length - 1); // Strip close paren.
 
       var args = <num>[];
       List<String> params = color.split(",");
@@ -281,8 +275,7 @@
         case _hslCss:
           return new Hsla(args[0], args[1], args[2]).toHexArgbString();
         case _hslaCss:
-          return new Hsla(args[0], args[1], args[2],
-              args[3]).toHexArgbString();
+          return new Hsla(args[0], args[1], args[2], args[3]).toHexArgbString();
         default:
           // Type not defined UnsupportedOperationException should have thrown.
           assert(true);
@@ -297,8 +290,9 @@
     String rHex = Color._numAs2DigitHex(Color._clamp(r, 0, 255));
     String gHex = Color._numAs2DigitHex(Color._clamp(g, 0, 255));
     String bHex = Color._numAs2DigitHex(Color._clamp(b, 0, 255));
-    String aHex = (a != null) ?
-        Color._numAs2DigitHex((Color._clamp(a, 0, 1) * 255).round()) : "";
+    String aHex = (a != null)
+        ? Color._numAs2DigitHex((Color._clamp(a, 0, 1) * 255).round())
+        : "";
 
     // TODO(terry) 15.toRadixString(16) return 'F' on Dartium not f as in JS.
     //             bug: <http://code.google.com/p/dart/issues/detail?id=2670>
@@ -361,7 +355,7 @@
       Color._clamp(((1 - delta) * v + (delta * 255)).round(), 0, 255);
 
   // Predefined CSS colors see <http://www.w3.org/TR/css3-color/>
-  static final Color transparent = const Color.hex("00ffffff");  // Alpha 0.0
+  static final Color transparent = const Color.hex("00ffffff"); // Alpha 0.0
   static final Color aliceBlue = const Color.hex("0f08ff");
   static final Color antiqueWhite = const Color.hex("0faebd7");
   static final Color aqua = const Color.hex("00ffff");
@@ -511,7 +505,6 @@
   static final Color yellowGreen = const Color.hex("9acd32");
 }
 
-
 /**
  * Rgba class for users that want to interact with a color as a RGBA value.
  */
@@ -523,22 +516,22 @@
   final int b;
   final num a;
 
-  Rgba(int red, int green, int blue, [num alpha]) :
-    this.r = Color._clamp(red, 0, 255),
-    this.g = Color._clamp(green, 0, 255),
-    this.b = Color._clamp(blue, 0, 255),
-    this.a = (alpha != null) ? Color._clamp(alpha, 0, 1) : alpha;
+  Rgba(int red, int green, int blue, [num alpha])
+      : this.r = Color._clamp(red, 0, 255),
+        this.g = Color._clamp(green, 0, 255),
+        this.b = Color._clamp(blue, 0, 255),
+        this.a = (alpha != null) ? Color._clamp(alpha, 0, 1) : alpha;
 
   factory Rgba.fromString(String hexValue) =>
-    new Color.css("#${Color._convertCssToArgb(hexValue)}").rgba;
+      new Color.css("#${Color._convertCssToArgb(hexValue)}").rgba;
 
   factory Rgba.fromColor(Color color) => color.rgba;
 
   factory Rgba.fromArgbValue(num value) {
-    return new Rgba(((value.toInt() & 0xff000000) >> 0x18),  /* a */
-      ((value.toInt() & 0xff0000) >> 0x10),                  /* r */
-      ((value.toInt() & 0xff00) >> 8),                       /* g */
-      ((value.toInt() & 0xff)));                             /* b */
+    return new Rgba(((value.toInt() & 0xff000000) >> 0x18), /* a */
+        ((value.toInt() & 0xff0000) >> 0x10), /* r */
+        ((value.toInt() & 0xff00) >> 8), /* g */
+        ((value.toInt() & 0xff))); /* b */
   }
 
   factory Rgba.fromHsla(Hsla hsla) {
@@ -569,9 +562,9 @@
       }
       num var1 = 2 * l - var2;
 
-      r = (255 * Rgba._hueToRGB(var1, var2, h + (1/3))).round().toInt();
+      r = (255 * Rgba._hueToRGB(var1, var2, h + (1 / 3))).round().toInt();
       g = (255 * Rgba._hueToRGB(var1, var2, h)).round().toInt();
-      b = (255 * Rgba._hueToRGB(var1, var2, h - (1/3))).round().toInt();
+      b = (255 * Rgba._hueToRGB(var1, var2, h - (1 / 3))).round().toInt();
     }
 
     return new Rgba(r, g, b, a);
@@ -632,7 +625,6 @@
   int get hashCode => toHexArgbString().hashCode;
 }
 
-
 /**
  * Hsl class support to interact with a color as a hsl with hue, saturation, and
  * lightness with optional alpha blending.  The hue is a ratio of 360 degrees
@@ -640,10 +632,10 @@
  * (1 == 100%) and alpha is a 0..1 fraction.
  */
 class Hsla implements _StyleProperty, ColorBase {
-  final num _h;             // Value from 0..1
-  final num _s;             // Value from 0..1
-  final num _l;             // Value from 0..1
-  final num _a;             // Value from 0..1
+  final num _h; // Value from 0..1
+  final num _s; // Value from 0..1
+  final num _l; // Value from 0..1
+  final num _a; // Value from 0..1
 
   /**
    * [hue] is a 0..1 fraction of 360 degrees (360 == 0).
@@ -651,11 +643,11 @@
    * [lightness] is a 0..1 fraction (100% == 1).
    * [alpha] is a 0..1 fraction, alpha blending between 0..1, 1 == 100% opaque.
    */
-  Hsla(num hue, num saturation, num lightness, [num alpha]) :
-    this._h = (hue == 1) ? 0 : Color._clamp(hue, 0, 1),
-    this._s = Color._clamp(saturation, 0, 1),
-    this._l = Color._clamp(lightness, 0, 1),
-    this._a = (alpha != null) ? Color._clamp(alpha, 0, 1) : alpha;
+  Hsla(num hue, num saturation, num lightness, [num alpha])
+      : this._h = (hue == 1) ? 0 : Color._clamp(hue, 0, 1),
+        this._s = Color._clamp(saturation, 0, 1),
+        this._l = Color._clamp(lightness, 0, 1),
+        this._a = (alpha != null) ? Color._clamp(alpha, 0, 1) : alpha;
 
   factory Hsla.fromString(String hexValue) {
     Rgba rgba = new Color.css("#${Color._convertCssToArgb(hexValue)}").rgba;
@@ -682,7 +674,7 @@
   }
 
   factory Hsla.fromRgba(Rgba rgba) =>
-    _createFromRgba(rgba.r, rgba.g, rgba.b, rgba.a);
+      _createFromRgba(rgba.r, rgba.g, rgba.b, rgba.a);
 
   static Hsla _createFromRgba(num r, num g, num b, num a) {
     // Convert RGB to hsl.
@@ -701,7 +693,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 new Hsla(0, 0, l); // Black;
     }
 
     num vm = maxRgb - minRgb;
@@ -709,7 +701,7 @@
     if (s > 0) {
       s /= (l < 0.5) ? (maxRgb + minRgb) : (2 - maxRgb - minRgb);
     } else {
-      return new Hsla(0, 0, l);   // White
+      return new Hsla(0, 0, l); // White
     }
 
     num r2, g2, b2;
@@ -765,9 +757,9 @@
 
   bool operator ==(other) => Color.equal(this, other);
 
-  String get cssExpression => (_a == null) ?
-      "hsl($hueDegrees,$saturationPercentage,$lightnessPercentage)" :
-      "hsla($hueDegrees,$saturationPercentage,$lightnessPercentage,$_a)";
+  String get cssExpression => (_a == null)
+      ? "hsl($hueDegrees,$saturationPercentage,$lightnessPercentage)"
+      : "hsla($hueDegrees,$saturationPercentage,$lightnessPercentage,$_a)";
 
   String toHexArgbString() => new Rgba.fromHsla(this).toHexArgbString();
 
@@ -785,7 +777,6 @@
   int get hashCode => toHexArgbString().hashCode;
 }
 
-
 /** X,Y position. */
 class PointXY implements _StyleProperty {
   final num x, y;
@@ -796,7 +787,6 @@
   }
 }
 
-
 // TODO(terry): Implement style and color.
 /**
  * Supports border for measuring with layout.
@@ -810,22 +800,25 @@
   const Border([this.top, this.left, this.bottom, this.right]);
 
   // TODO(terry): Consider using Size or width and height.
-  Border.uniform(num amount) :
-      top = amount, left = amount, bottom = amount, right = amount;
+  Border.uniform(num amount)
+      : top = amount,
+        left = amount,
+        bottom = amount,
+        right = amount;
 
   int get width => left + right;
   int get height => top + bottom;
 
   String get cssExpression {
-    return (top == left && bottom == right && top == right) ? "${left}px" :
-      "${top != null ? '$top' : '0'}px ${
+    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";
   }
 }
 
-
 /** Font style constants. */
 class FontStyle {
   /** Font style [normal] default. */
@@ -842,7 +835,6 @@
   static const String oblique = "oblique";
 }
 
-
 /** Font variant constants. */
 class FontVariant {
   /** Font style [normal] default. */
@@ -851,7 +843,6 @@
   static const String smallCaps = "small-caps";
 }
 
-
 /** Font weight constants values 100, 200, 300, 400, 500, 600, 700, 800, 900. */
 class FontWeight {
   /** Font weight normal [default] */
@@ -870,7 +861,6 @@
   static const int wt900 = 900;
 }
 
-
 /** Generic font family names. */
 class FontGeneric {
   /** Generic family sans-serif font (w/o serifs). */
@@ -885,7 +875,6 @@
   static const String fantasy = "fantasy";
 }
 
-
 /**
  * List of most common font families across different platforms.  Use the
  * collection names in the Font class (e.g., Font.SANS_SERIF, Font.FONT_SERIF,
@@ -945,7 +934,7 @@
 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.
@@ -954,31 +943,41 @@
  */
 class Font implements _StyleProperty {
   /** Collection of most common sans-serif fonts in order. */
-  static const List<String> sansSerif = const [FontFamily.arial,
-                                               FontFamily.verdana,
-                                               FontFamily.geneva,
-                                               FontFamily.helvetica,
-                                               FontGeneric.sansSerif];
+  static const List<String> sansSerif = const [
+    FontFamily.arial,
+    FontFamily.verdana,
+    FontFamily.geneva,
+    FontFamily.helvetica,
+    FontGeneric.sansSerif
+  ];
 
   /** Collection of most common serif fonts in order. */
-  static const List<String> serif = const [FontFamily.georgia,
-                                           FontFamily.timesNewRoman,
-                                           FontFamily.times,
-                                           FontGeneric.serif];
+  static const List<String> serif = const [
+    FontFamily.georgia,
+    FontFamily.timesNewRoman,
+    FontFamily.times,
+    FontGeneric.serif
+  ];
   /** Collection of most common monospace fonts in order. */
-  static const List<String> monospace = const [FontFamily.courierNew,
-                                               FontFamily.courier,
-                                               FontGeneric.monospace];
+  static const List<String> monospace = const [
+    FontFamily.courierNew,
+    FontFamily.courier,
+    FontGeneric.monospace
+  ];
   /** Collection of most common cursive fonts in order. */
-  static const List<String> cursive = const [FontFamily.textile,
-                                             FontFamily.appleChancery,
-                                             FontFamily.zaphChancery,
-                                             FontGeneric.fantasy];
+  static const List<String> cursive = const [
+    FontFamily.textile,
+    FontFamily.appleChancery,
+    FontFamily.zaphChancery,
+    FontGeneric.fantasy
+  ];
   /** Collection of most common fantasy fonts in order. */
-  static const List<String> fantasy = const [FontFamily.comicSansMs,
-                                             FontFamily.impact,
-                                             FontFamily.webdings,
-                                             FontGeneric.fantasy];
+  static const List<String> fantasy = const [
+    FontFamily.comicSansMs,
+    FontFamily.impact,
+    FontFamily.webdings,
+    FontGeneric.fantasy
+  ];
 
   // TODO(terry): Should support the values xx-small, small, large, xx-large,
   //              etc. (mapped to a pixel sized font)?
@@ -1028,7 +1027,7 @@
    * pixels, if not specified it's 1.2 the font size.
    */
   const Font({this.size, this.family, this.weight, this.style, this.variant,
-              this.lineHeight});
+      this.lineHeight});
 
   /**
    * Merge the two fonts and return the result. See [Style.merge] for
@@ -1041,12 +1040,12 @@
   }
 
   Font._merge(Font a, Font b)
-    : size = _mergeVal(a.size, b.size),
-      family = _mergeVal(a.family, b.family),
-      weight = _mergeVal(a.weight, b.weight),
-      style = _mergeVal(a.style, b.style),
-      variant = _mergeVal(a.variant, b.variant),
-      lineHeight = _mergeVal(a.lineHeight, b.lineHeight);
+      : size = _mergeVal(a.size, b.size),
+        family = _mergeVal(a.family, b.family),
+        weight = _mergeVal(a.weight, b.weight),
+        style = _mergeVal(a.style, b.style),
+        variant = _mergeVal(a.variant, b.variant),
+        lineHeight = _mergeVal(a.lineHeight, b.lineHeight);
 
   /**
    * Shorthand CSS format for font is:
@@ -1069,9 +1068,12 @@
     return '${size}px $_fontsAsString';
   }
 
-  Font scale(num ratio) =>
-      new Font(size: size * ratio, family: family, weight: weight, style: style,
-          variant: variant);
+  Font scale(num ratio) => new Font(
+      size: size * ratio,
+      family: family,
+      weight: weight,
+      style: style,
+      variant: variant);
 
   /**
    * The lineHeight, provides an indirect means to specify the leading. The
@@ -1102,8 +1104,12 @@
   bool operator ==(other) {
     if (other is! Font) return false;
     Font o = other;
-    return o.size == size && o.family == family && o.weight == weight &&
-        o.lineHeight == lineHeight && o.style == style && o.variant == variant;
+    return o.size == size &&
+        o.family == family &&
+        o.weight == weight &&
+        o.lineHeight == lineHeight &&
+        o.style == style &&
+        o.variant == variant;
   }
 
   // TODO(terry): This is fragile should probably just iterate through the list
@@ -1152,14 +1158,17 @@
    * <https://developer.mozilla.org/en/CSS/border-width>
    * <https://developer.mozilla.org/en/CSS/padding>.
    */
-   const BoxEdge.clockwiseFromTop(this.top, this.right, this.bottom, this.left);
+  const BoxEdge.clockwiseFromTop(this.top, this.right, this.bottom, this.left);
 
   /**
    * This is a helper to creates a box edge with the same [left], [top]
    * [right], and [bottom] widths.
    */
   const BoxEdge.uniform(num size)
-    : top = size, left = size, bottom = size, right = size;
+      : top = size,
+        left = size,
+        bottom = size,
+        right = size;
 
   /**
    * Takes a possibly null box edge, with possibly null metrics, and fills
@@ -1202,10 +1211,10 @@
   }
 
   BoxEdge._merge(BoxEdge x, BoxEdge y)
-    : left = _mergeVal(x.left, y.left),
-      top = _mergeVal(x.top, y.top),
-      right = _mergeVal(x.right, y.right),
-      bottom = _mergeVal(x.bottom, y.bottom);
+      : left = _mergeVal(x.left, y.left),
+        top = _mergeVal(x.top, y.top),
+        right = _mergeVal(x.right, y.right),
+        bottom = _mergeVal(x.bottom, y.bottom);
 
   /**
    * The total size of the horizontal edges. Equal to [left] + [right], where
diff --git a/lib/src/token.dart b/lib/src/token.dart
index b78fbcc..e30484d 100644
--- a/lib/src/token.dart
+++ b/lib/src/token.dart
@@ -61,6 +61,5 @@
 class IdentifierToken extends Token {
   final String text;
 
-  IdentifierToken(this.text, int kind, FileSpan span)
-      : super(kind, span);
+  IdentifierToken(this.text, int kind, FileSpan span) : super(kind, span);
 }
diff --git a/lib/src/tokenizer.dart b/lib/src/tokenizer.dart
index 8d929ab..ed616d2 100644
--- a/lib/src/tokenizer.dart
+++ b/lib/src/tokenizer.dart
@@ -15,8 +15,7 @@
   /** CDATA keyword. */
   final List CDATA_NAME = 'CDATA'.codeUnits;
 
-  Tokenizer(SourceFile file, String text, bool skipWhitespace,
-      [int index = 0])
+  Tokenizer(SourceFile file, String text, bool skipWhitespace, [int index = 0])
       : super(file, text, skipWhitespace, index);
 
   Token next({unicodeRange: false}) {
@@ -44,12 +43,12 @@
           Token ident = finishIdentifier();
 
           // Is it a directive?
-          int tokId = TokenKind.matchDirectives(_text, _startIndex,
-              _index - _startIndex);
+          int tokId = TokenKind.matchDirectives(
+              _text, _startIndex, _index - _startIndex);
           if (tokId == -1) {
             // No, is it a margin directive?
-            tokId = TokenKind.matchMarginDirectives(_text, _startIndex,
-                _index - _startIndex);
+            tokId = TokenKind.matchMarginDirectives(
+                _text, _startIndex, _index - _startIndex);
           }
 
           if (tokId != -1) {
@@ -63,7 +62,7 @@
         }
         return _finishToken(TokenKind.AT);
       case TokenChar.DOT:
-        int start = _startIndex;             // Start where the dot started.
+        int start = _startIndex; // Start where the dot started.
         if (maybeEatDigit()) {
           // looks like a number dot followed by digit(s).
           Token number = finishNumber();
@@ -116,19 +115,19 @@
         return _finishToken(TokenKind.GREATER);
       case TokenChar.TILDE:
         if (_maybeEatChar(TokenChar.EQUALS)) {
-          return _finishToken(TokenKind.INCLUDES);          // ~=
+          return _finishToken(TokenKind.INCLUDES); // ~=
         }
         return _finishToken(TokenKind.TILDE);
       case TokenChar.ASTERISK:
         if (_maybeEatChar(TokenChar.EQUALS)) {
-          return _finishToken(TokenKind.SUBSTRING_MATCH);   // *=
+          return _finishToken(TokenKind.SUBSTRING_MATCH); // *=
         }
         return _finishToken(TokenKind.ASTERISK);
       case TokenChar.AMPERSAND:
         return _finishToken(TokenKind.AMPERSAND);
       case TokenChar.NAMESPACE:
         if (_maybeEatChar(TokenChar.EQUALS)) {
-          return _finishToken(TokenKind.DASH_MATCH);      // |=
+          return _finishToken(TokenKind.DASH_MATCH); // |=
         }
         return _finishToken(TokenKind.NAMESPACE);
       case TokenChar.COLON:
@@ -146,7 +145,7 @@
       case TokenChar.SLASH:
         if (_maybeEatChar(TokenChar.ASTERISK)) return finishMultiLineComment();
         return _finishToken(TokenKind.SLASH);
-      case  TokenChar.LESS:      // <!--
+      case TokenChar.LESS: // <!--
         if (_maybeEatChar(TokenChar.BANG)) {
           if (_maybeEatChar(TokenChar.MINUS) &&
               _maybeEatChar(TokenChar.MINUS)) {
@@ -167,12 +166,12 @@
         return _finishToken(TokenKind.EQUALS);
       case TokenChar.CARET:
         if (_maybeEatChar(TokenChar.EQUALS)) {
-          return _finishToken(TokenKind.PREFIX_MATCH);    // ^=
+          return _finishToken(TokenKind.PREFIX_MATCH); // ^=
         }
         return _finishToken(TokenKind.CARET);
       case TokenChar.DOLLAR:
         if (_maybeEatChar(TokenChar.EQUALS)) {
-          return _finishToken(TokenKind.SUFFIX_MATCH);    // $=
+          return _finishToken(TokenKind.SUFFIX_MATCH); // $=
         }
         return _finishToken(TokenKind.DOLLAR);
       case TokenChar.BANG:
@@ -207,8 +206,8 @@
             (_peekChar() == UNICODE_PLUS)) {
           // Unicode range: U+uNumber[-U+uNumber]
           //   uNumber = 0..10FFFF
-          _nextChar();                                // Skip +
-          _startIndex = _index;                       // Starts at the number
+          _nextChar(); // Skip +
+          _startIndex = _index; // Starts at the number
           return _finishToken(TokenKind.UNICODE_RANGE);
         } else if (varDef(ch)) {
           return _finishToken(TokenKind.VAR_DEFINITION);
@@ -224,13 +223,17 @@
   }
 
   bool varDef(int ch) {
-    return ch == 'v'.codeUnitAt(0) && _maybeEatChar('a'.codeUnitAt(0)) &&
-        _maybeEatChar('r'.codeUnitAt(0)) && _maybeEatChar('-'.codeUnitAt(0));
+    return ch == 'v'.codeUnitAt(0) &&
+        _maybeEatChar('a'.codeUnitAt(0)) &&
+        _maybeEatChar('r'.codeUnitAt(0)) &&
+        _maybeEatChar('-'.codeUnitAt(0));
   }
 
   bool varUsage(int ch) {
-    return ch == 'v'.codeUnitAt(0) && _maybeEatChar('a'.codeUnitAt(0)) &&
-        _maybeEatChar('r'.codeUnitAt(0)) && (_peekChar() == '-'.codeUnitAt(0));
+    return ch == 'v'.codeUnitAt(0) &&
+        _maybeEatChar('a'.codeUnitAt(0)) &&
+        _maybeEatChar('r'.codeUnitAt(0)) &&
+        (_peekChar() == '-'.codeUnitAt(0));
   }
 
   Token _errorToken([String message = null]) {
@@ -246,8 +249,9 @@
       tokId = TokenKind.matchUnits(_text, _startIndex, _index - _startIndex);
     }
     if (tokId == -1) {
-      tokId = (_text.substring(_startIndex, _index) == '!important') ?
-          TokenKind.IMPORTANT : -1;
+      tokId = (_text.substring(_startIndex, _index) == '!important')
+          ? TokenKind.IMPORTANT
+          : -1;
     }
 
     return tokId >= 0 ? tokId : TokenKind.IDENTIFIER;
@@ -270,7 +274,7 @@
       // if followed by hexadecimal digits, create the appropriate character.
       // otherwise, include the character in the identifier and don't treat it
       // specially.
-      if (ch == 92/*\*/) {
+      if (ch == 92 /*\*/) {
         int startHex = ++_index;
         eatHexDigits(startHex + 6);
         if (_index != startHex) {
@@ -282,8 +286,10 @@
           // if we stopped the hex because of a whitespace char, skip it
           ch = _text.codeUnitAt(_index);
           if (_index - startHex != 6 &&
-              (ch == TokenChar.SPACE || ch == TokenChar.TAB ||
-              ch == TokenChar.RETURN || ch == TokenChar.NEWLINE)) {
+              (ch == TokenChar.SPACE ||
+                  ch == TokenChar.TAB ||
+                  ch == TokenChar.RETURN ||
+                  ch == TokenChar.NEWLINE)) {
             _index++;
           }
         } else {
@@ -291,9 +297,10 @@
           if (_index == _text.length) break;
           chars.add(_text.codeUnitAt(_index++));
         }
-      } else if (_index < validateFrom || (inSelectorExpression
-          ? TokenizerHelpers.isIdentifierPartExpr(ch)
-          : TokenizerHelpers.isIdentifierPart(ch))) {
+      } else if (_index < validateFrom ||
+          (inSelectorExpression
+              ? TokenizerHelpers.isIdentifierPartExpr(ch)
+              : TokenizerHelpers.isIdentifierPart(ch))) {
         chars.add(ch);
         _index++;
       } else {
@@ -311,7 +318,7 @@
   Token finishNumber() {
     eatDigits();
 
-    if (_peekChar() == 46/*.*/) {
+    if (_peekChar() == 46 /*.*/) {
       // Handle the case of 1.toString().
       _nextChar();
       if (TokenizerHelpers.isDigit(_peekChar())) {
@@ -326,8 +333,8 @@
   }
 
   bool maybeEatDigit() {
-    if (_index < _text.length
-        && TokenizerHelpers.isDigit(_text.codeUnitAt(_index))) {
+    if (_index < _text.length &&
+        TokenizerHelpers.isDigit(_text.codeUnitAt(_index))) {
       _index += 1;
       return true;
     }
@@ -342,17 +349,17 @@
   void eatHexDigits(int end) {
     end = math.min(end, _text.length);
     while (_index < end) {
-     if (TokenizerHelpers.isHexDigit(_text.codeUnitAt(_index))) {
-       _index += 1;
-     } else {
-       return;
-     }
+      if (TokenizerHelpers.isHexDigit(_text.codeUnitAt(_index))) {
+        _index += 1;
+      } else {
+        return;
+      }
     }
   }
 
   bool maybeEatHexDigit() {
-    if (_index < _text.length
-        && TokenizerHelpers.isHexDigit(_text.codeUnitAt(_index))) {
+    if (_index < _text.length &&
+        TokenizerHelpers.isHexDigit(_text.codeUnitAt(_index))) {
       _index += 1;
       return true;
     }
@@ -360,8 +367,7 @@
   }
 
   bool maybeEatQuestionMark() {
-    if (_index < _text.length &&
-        _text.codeUnitAt(_index) == QUESTION_MARK) {
+    if (_index < _text.length && _text.codeUnitAt(_index) == QUESTION_MARK) {
       _index += 1;
       return true;
     }
@@ -370,11 +376,11 @@
 
   void eatQuestionMarks() {
     while (_index < _text.length) {
-     if (_text.codeUnitAt(_index) == QUESTION_MARK) {
-       _index += 1;
-     } else {
-       return;
-     }
+      if (_text.codeUnitAt(_index) == QUESTION_MARK) {
+        _index += 1;
+      } else {
+        return;
+      }
     }
   }
 
@@ -388,8 +394,8 @@
       int ch = _nextChar();
       if (ch == 0) {
         return _finishToken(TokenKind.INCOMPLETE_COMMENT);
-      } else if (ch == 42/*'*'*/) {
-        if (_maybeEatChar(47/*'/'*/)) {
+      } else if (ch == 42 /*'*'*/) {
+        if (_maybeEatChar(47 /*'/'*/)) {
           if (_skipWhitespace) {
             return next();
           } else {
@@ -411,7 +417,6 @@
     }
     return _errorToken();
   }
-
 }
 
 /** Static helper methods. */
@@ -421,12 +426,13 @@
   }
 
   static bool isDigit(int c) {
-    return (c >= 48/*0*/ && c <= 57/*9*/);
+    return (c >= 48 /*0*/ && c <= 57 /*9*/);
   }
 
   static bool isHexDigit(int c) {
-    return (isDigit(c) || (c >= 97/*a*/ && c <= 102/*f*/)
-        || (c >= 65/*A*/ && c <= 70/*F*/));
+    return (isDigit(c) ||
+        (c >= 97 /*a*/ && c <= 102 /*f*/) ||
+        (c >= 65 /*A*/ && c <= 70 /*F*/));
   }
 
   static bool isIdentifierPart(int c) {
@@ -435,12 +441,13 @@
 
   /** Pseudo function expressions identifiers can't have a minus sign. */
   static bool isIdentifierStartExpr(int c) {
-    return ((c >= 97/*a*/ && c <= 122/*z*/) || (c >= 65/*A*/ && c <= 90/*Z*/) ||
+    return ((c >= 97 /*a*/ && c <= 122 /*z*/) ||
+        (c >= 65 /*A*/ && c <= 90 /*Z*/) ||
         // Note: Unicode 10646 chars U+00A0 or higher are allowed, see:
         // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
         // http://www.w3.org/TR/CSS21/syndata.html#characters
         // Also, escaped character should be allowed.
-        c == 95/*_*/ || c >= 0xA0 || c == 92/*\*/);
+        c == 95 /*_*/ || c >= 0xA0 || c == 92 /*\*/);
   }
 
   /** Pseudo function expressions identifiers can't have a minus sign. */
diff --git a/lib/src/tokenizer_base.dart b/lib/src/tokenizer_base.dart
index 5501e6c..7999a8f 100644
--- a/lib/src/tokenizer_base.dart
+++ b/lib/src/tokenizer_base.dart
@@ -12,11 +12,11 @@
   final bool inSelectorExpression;
   final bool inSelector;
 
-  TokenizerState(TokenizerBase base) :
-      index = base._index,
-      startIndex = base._startIndex,
-      inSelectorExpression = base.inSelectorExpression,
-      inSelector = base.inSelector;
+  TokenizerState(TokenizerBase base)
+      : index = base._index,
+        startIndex = base._startIndex,
+        inSelectorExpression = base.inSelectorExpression,
+        inSelector = base.inSelector;
 }
 
 /**
@@ -141,7 +141,6 @@
           return _finishToken(TokenKind.WHITESPACE);
         }
       }
-
     }
     return _finishToken(TokenKind.END_OF_FILE);
   }
@@ -181,11 +180,11 @@
   }
 
   static int _hexDigit(int c) {
-    if(c >= 48/*0*/ && c <= 57/*9*/) {
+    if (c >= 48 /*0*/ && c <= 57 /*9*/) {
       return c - 48;
-    } else if (c >= 97/*a*/ && c <= 102/*f*/) {
+    } else if (c >= 97 /*a*/ && c <= 102 /*f*/) {
       return c - 87;
-    } else if (c >= 65/*A*/ && c <= 70/*F*/) {
+    } else if (c >= 65 /*A*/ && c <= 70 /*F*/) {
       return c - 55;
     } else {
       return -1;
@@ -241,7 +240,7 @@
   }
 
   Token finishNumberExtra(int kind) {
-    if (_maybeEatChar(101/*e*/) || _maybeEatChar(69/*E*/)) {
+    if (_maybeEatChar(101 /*e*/) || _maybeEatChar(69 /*E*/)) {
       kind = TokenKind.DOUBLE;
       _maybeEatChar(TokenKind.MINUS);
       _maybeEatChar(TokenKind.PLUS);
@@ -276,8 +275,8 @@
     } else {
       s = _text.substring(_startIndex + 2, _index - 1);
     }
-    return new LiteralToken(TokenKind.STRING,
-        _file.span(_startIndex, _index), s);
+    return new LiteralToken(
+        TokenKind.STRING, _file.span(_startIndex, _index), s);
   }
 
   Token finishMultilineString(int quote) {
@@ -382,22 +381,22 @@
     final ch = _nextChar();
     int hexValue;
     switch (ch) {
-      case 110/*n*/:
+      case 110 /*n*/ :
         return TokenChar.NEWLINE;
-      case 114/*r*/:
+      case 114 /*r*/ :
         return TokenChar.RETURN;
-      case 102/*f*/:
+      case 102 /*f*/ :
         return TokenChar.FF;
-      case 98/*b*/:
+      case 98 /*b*/ :
         return TokenChar.BACKSPACE;
-      case 116/*t*/:
+      case 116 /*t*/ :
         return TokenChar.TAB;
-      case 118/*v*/:
+      case 118 /*v*/ :
         return TokenChar.FF;
-      case 120/*x*/:
+      case 120 /*x*/ :
         hexValue = readHex(2);
         break;
-      case 117/*u*/:
+      case 117 /*u*/ :
         if (_maybeEatChar(TokenChar.LBRACE)) {
           hexValue = readHex();
           if (!_maybeEatChar(TokenChar.RBRACE)) {
@@ -407,7 +406,8 @@
           hexValue = readHex(4);
         }
         break;
-      default: return ch;
+      default:
+        return ch;
     }
 
     if (hexValue == -1) return -1;
@@ -417,7 +417,7 @@
     // are not legal Unicode values.
     if (hexValue < 0xD800 || hexValue > 0xDFFF && hexValue <= 0xFFFF) {
       return hexValue;
-    } else if (hexValue <= 0x10FFFF){
+    } else if (hexValue <= 0x10FFFF) {
       messages.error('unicode values greater than 2 bytes not implemented yet',
           _file.span(_startIndex, _startIndex + 1));
       return -1;
diff --git a/lib/src/tokenkind.dart b/lib/src/tokenkind.dart
index 67bce33..8e976bf 100644
--- a/lib/src/tokenkind.dart
+++ b/lib/src/tokenkind.dart
@@ -8,44 +8,44 @@
 //              e.g., ASTERISK or they're CSS e.g., PSEUDO, COMBINATOR_*.
 class TokenKind {
   // Common shared tokens used in TokenizerBase.
-  static const int UNUSED = 0;                  // Unused place holder...
-  static const int END_OF_FILE = 1;             // EOF
-  static const int LPAREN = 2;                  // (
-  static const int RPAREN = 3;                  // )
-  static const int LBRACK = 4;                  // [
-  static const int RBRACK = 5;                  // ]
-  static const int LBRACE = 6;                  // {
-  static const int RBRACE = 7;                  // }
-  static const int DOT = 8;                     // .
-  static const int SEMICOLON = 9;               // ;
+  static const int UNUSED = 0; // Unused place holder...
+  static const int END_OF_FILE = 1; // EOF
+  static const int LPAREN = 2; // (
+  static const int RPAREN = 3; // )
+  static const int LBRACK = 4; // [
+  static const int RBRACK = 5; // ]
+  static const int LBRACE = 6; // {
+  static const int RBRACE = 7; // }
+  static const int DOT = 8; // .
+  static const int SEMICOLON = 9; // ;
 
   // Unique tokens for CSS.
-  static const int AT = 10;                     // @
-  static const int HASH = 11;                   // #
-  static const int PLUS = 12;                   // +
-  static const int GREATER = 13;                // >
-  static const int TILDE = 14;                  // ~
-  static const int ASTERISK = 15;               // *
-  static const int NAMESPACE = 16;              // |
-  static const int COLON = 17;                  // :
-  static const int PRIVATE_NAME = 18;           // _ prefix private class or id
-  static const int COMMA = 19;                  // ,
+  static const int AT = 10; // @
+  static const int HASH = 11; // #
+  static const int PLUS = 12; // +
+  static const int GREATER = 13; // >
+  static const int TILDE = 14; // ~
+  static const int ASTERISK = 15; // *
+  static const int NAMESPACE = 16; // |
+  static const int COLON = 17; // :
+  static const int PRIVATE_NAME = 18; // _ prefix private class or id
+  static const int COMMA = 19; // ,
   static const int SPACE = 20;
-  static const int TAB = 21;                    // /t
-  static const int NEWLINE = 22;                // /n
-  static const int RETURN = 23;                 // /r
-  static const int PERCENT = 24;                // %
-  static const int SINGLE_QUOTE = 25;           // '
-  static const int DOUBLE_QUOTE = 26;           // "
-  static const int SLASH = 27;                  // /
-  static const int EQUALS = 28;                 // =
-  static const int CARET = 30;                  // ^
-  static const int DOLLAR = 31;                 // $
-  static const int LESS = 32;                   // <
-  static const int BANG = 33;                   // !
-  static const int MINUS = 34;                  // -
-  static const int BACKSLASH = 35;              // \
-  static const int AMPERSAND = 36;              // &
+  static const int TAB = 21; // /t
+  static const int NEWLINE = 22; // /n
+  static const int RETURN = 23; // /r
+  static const int PERCENT = 24; // %
+  static const int SINGLE_QUOTE = 25; // '
+  static const int DOUBLE_QUOTE = 26; // "
+  static const int SLASH = 27; // /
+  static const int EQUALS = 28; // =
+  static const int CARET = 30; // ^
+  static const int DOLLAR = 31; // $
+  static const int LESS = 32; // <
+  static const int BANG = 33; // !
+  static const int MINUS = 34; // -
+  static const int BACKSLASH = 35; // \
+  static const int AMPERSAND = 36; // &
 
   // WARNING: Tokens from this point and above must have the corresponding ASCII
   //          character in the TokenChar list at the bottom of this file.  The
@@ -75,41 +75,41 @@
   /** [TokenKind] representing incomplete comment tokens. */
   static const int INCOMPLETE_COMMENT = 67;
 
-  static const int VAR_DEFINITION = 400;        // var-NNN-NNN
-  static const int VAR_USAGE = 401;             // var(NNN-NNN [,default])
+  static const int VAR_DEFINITION = 400; // var-NNN-NNN
+  static const int VAR_USAGE = 401; // var(NNN-NNN [,default])
 
   // Synthesized Tokens (no character associated with TOKEN).
   static const int STRING = 500;
   static const int STRING_PART = 501;
   static const int NUMBER = 502;
   static const int HEX_NUMBER = 503;
-  static const int HTML_COMMENT = 504;          // <!--
-  static const int IMPORTANT = 505;             // !important
-  static const int CDATA_START = 506;           // <![CDATA[
-  static const int CDATA_END = 507;             // ]]>
+  static const int HTML_COMMENT = 504; // <!--
+  static const int IMPORTANT = 505; // !important
+  static const int CDATA_START = 506; // <![CDATA[
+  static const int CDATA_END = 507; // ]]>
   // U+uNumber[-U+uNumber]
   // uNumber = 0..10FFFF | ?[?]*
   static const int UNICODE_RANGE = 508;
-  static const int HEX_RANGE = 509;             // ? in the hex range
+  static const int HEX_RANGE = 509; // ? in the hex range
   static const int IDENTIFIER = 511;
 
   // Uniquely synthesized tokens for CSS.
   static const int SELECTOR_EXPRESSION = 512;
   static const int COMBINATOR_NONE = 513;
   static const int COMBINATOR_DESCENDANT = 514; // Space combinator
-  static const int COMBINATOR_PLUS = 515;       // + combinator
-  static const int COMBINATOR_GREATER = 516;    // > combinator
-  static const int COMBINATOR_TILDE = 517;      // ~ combinator
+  static const int COMBINATOR_PLUS = 515; // + combinator
+  static const int COMBINATOR_GREATER = 516; // > combinator
+  static const int COMBINATOR_TILDE = 517; // ~ combinator
 
-  static const int UNARY_OP_NONE = 518;         // No unary operator present.
+  static const int UNARY_OP_NONE = 518; // No unary operator present.
 
   // Attribute match types:
-  static const int INCLUDES = 530;              // '~='
-  static const int DASH_MATCH = 531;            // '|='
-  static const int PREFIX_MATCH = 532;          // '^='
-  static const int SUFFIX_MATCH = 533;          // '$='
-  static const int SUBSTRING_MATCH = 534;       // '*='
-  static const int NO_MATCH = 535;              // No operator.
+  static const int INCLUDES = 530; // '~='
+  static const int DASH_MATCH = 531; // '|='
+  static const int PREFIX_MATCH = 532; // '^='
+  static const int SUFFIX_MATCH = 533; // '$='
+  static const int SUBSTRING_MATCH = 534; // '*='
+  static const int NO_MATCH = 535; // No operator.
 
   // Unit types:
   static const int UNIT_EM = 600;
@@ -133,8 +133,8 @@
   static const int UNIT_RESOLUTION_DPI = 618;
   static const int UNIT_RESOLUTION_DPCM = 619;
   static const int UNIT_RESOLUTION_DPPX = 620;
-  static const int UNIT_CH = 621;   // Measure of "0" U+0030 glyph.
-  static const int UNIT_REM = 622;  // computed value ‘font-size’ on root elem.
+  static const int UNIT_CH = 621; // Measure of "0" U+0030 glyph.
+  static const int UNIT_REM = 622; // computed value ‘font-size’ on root elem.
   static const int UNIT_VIEWPORT_VW = 623;
   static const int UNIT_VIEWPORT_VH = 624;
   static const int UNIT_VIEWPORT_VMIN = 625;
@@ -161,9 +161,9 @@
   static const int DIRECTIVE_EXTEND = 657;
 
   // Media query operators
-  static const int MEDIA_OP_ONLY = 665;     // Unary.
-  static const int MEDIA_OP_NOT = 666;      // Unary.
-  static const int MEDIA_OP_AND = 667;      // Binary.
+  static const int MEDIA_OP_ONLY = 665; // Unary.
+  static const int MEDIA_OP_NOT = 666; // Unary.
+  static const int MEDIA_OP_AND = 667; // Binary.
 
   // Directives inside of a @page (margin sym).
   static const int MARGIN_DIRECTIVE_TOPLEFTCORNER = 670;
@@ -184,259 +184,280 @@
   static const int MARGIN_DIRECTIVE_RIGHTBOTTOM = 685;
 
   // Simple selector type.
-  static const int CLASS_NAME = 700;            // .class
-  static const int ELEMENT_NAME = 701;          // tagName
-  static const int HASH_NAME = 702;             // #elementId
-  static const int ATTRIBUTE_NAME = 703;        // [attrib]
-  static const int PSEUDO_ELEMENT_NAME = 704;   // ::pseudoElement
-  static const int PSEUDO_CLASS_NAME = 705;     // :pseudoClass
-  static const int NEGATION = 706;              // NOT
+  static const int CLASS_NAME = 700; // .class
+  static const int ELEMENT_NAME = 701; // tagName
+  static const int HASH_NAME = 702; // #elementId
+  static const int ATTRIBUTE_NAME = 703; // [attrib]
+  static const int PSEUDO_ELEMENT_NAME = 704; // ::pseudoElement
+  static const int PSEUDO_CLASS_NAME = 705; // :pseudoClass
+  static const int NEGATION = 706; // NOT
 
   static const List<Map<int, String>> _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 {'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_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 {
+      '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'},
   ];
 
   static const List<Map<int, String>> 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'},
-];
+    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<int, String>> MARGIN_DIRECTIVES = const [
-    const {'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_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_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'},
+    const {
+      '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_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_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'
+    },
   ];
 
   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'},
-    ];
+    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'},
+  ];
 
   // Some more constants:
-  static const int ASCII_UPPER_A = 65;    // ASCII value for uppercase A
-  static const int ASCII_UPPER_Z = 90;    // ASCII value for uppercase Z
+  static const int ASCII_UPPER_A = 65; // ASCII value for uppercase A
+  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},
+    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},
   ];
 
   // TODO(terry): Should used Dart mirroring for parameter values and types
@@ -448,41 +469,36 @@
 
   // List of valid CSS functions:
   static const List<Map<String, Object>> _FUNCTIONS = const [
-    const {'name' : 'counter', 'info' : const {'params' : 2, 'expr' : false}},
-    const {'name' : 'attr', 'info' : const {'params' : 1, 'expr' : false}},
-    const {'name' : 'calc', 'info' : const {'params' : 1, 'expr' : true}},
-    const {'name' : 'min', 'info' : const {'params' : 2, 'expr' : true}},
-    const {'name' : 'max', 'info' : const {'params' : 2, 'expr' : true}},
+    const {'name': 'counter', 'info': const {'params': 2, 'expr': false}},
+    const {'name': 'attr', 'info': const {'params': 1, 'expr': false}},
+    const {'name': 'calc', 'info': const {'params': 1, 'expr': true}},
+    const {'name': 'min', 'info': const {'params': 2, 'expr': true}},
+    const {'name': 'max', 'info': const {'params': 2, 'expr': true}},
 
     // 2D functions:
-    const {'name' : 'translateX',
-        'info' : const {'params' : 1, 'expr' : false}},
-    const {'name' : 'translateY',
-        'info' : const {'params' : 1, 'expr' : false}},
-    const {'name' : 'translate', 'info' : const {'params' : 2, 'expr' : false}},
-    const {'name' : 'rotate', 'info' : const {'params' : 1, 'expr' : false}},
-    const {'name' : 'scaleX', 'info' : const {'params' : 1, 'expr' : false}},
-    const {'name' : 'scaleY', 'info' : const {'params' : 1, 'expr' : false}},
-    const {'name' : 'scale', 'info' : const {'params' : 2, 'expr' : false}},
-    const {'name' : 'skewX', 'info' : const {'params' : 1, 'expr' : false}},
-    const {'name' : 'skewY', 'info' : const {'params' : 1, 'expr' : false}},
-    const {'name' : 'skew', 'info' : const {'params' : 2, 'expr' : false}},
-    const {'name' : 'matrix', 'info' : const {'params' : 6, 'expr' : false}},
+    const {'name': 'translateX', 'info': const {'params': 1, 'expr': false}},
+    const {'name': 'translateY', 'info': const {'params': 1, 'expr': false}},
+    const {'name': 'translate', 'info': const {'params': 2, 'expr': false}},
+    const {'name': 'rotate', 'info': const {'params': 1, 'expr': false}},
+    const {'name': 'scaleX', 'info': const {'params': 1, 'expr': false}},
+    const {'name': 'scaleY', 'info': const {'params': 1, 'expr': false}},
+    const {'name': 'scale', 'info': const {'params': 2, 'expr': false}},
+    const {'name': 'skewX', 'info': const {'params': 1, 'expr': false}},
+    const {'name': 'skewY', 'info': const {'params': 1, 'expr': false}},
+    const {'name': 'skew', 'info': const {'params': 2, 'expr': false}},
+    const {'name': 'matrix', 'info': const {'params': 6, 'expr': false}},
 
     // 3D functions:
-    const {'name' : 'matrix3d', 'info' : const {'params' : 16, 'expr' : false}},
-    const {'name' : 'translate3d',
-        'info' : const {'params' : 3, 'expr' : false}},
-    const {'name' : 'translateZ',
-        'info' : const {'params' : 1, 'expr' : false}},
-    const {'name' : 'scale3d', 'info' : const {'params' : 3, 'expr' : false}},
-    const {'name' : 'scaleZ', 'info' : const {'params' : 1, 'expr' : false}},
-    const {'name' : 'rotate3d', 'info' : const {'params' : 3, 'expr' : false}},
-    const {'name' : 'rotateX', 'info' : const {'params' : 1, 'expr' : false}},
-    const {'name' : 'rotateY', 'info' : const {'params' : 1, 'expr' : false}},
-    const {'name' : 'rotateZ', 'info' : const {'params' : 1, 'expr' : false}},
-    const {'name' : 'perspective',
-        'info' : const {'params' : 1, 'expr' : false}},
+    const {'name': 'matrix3d', 'info': const {'params': 16, 'expr': false}},
+    const {'name': 'translate3d', 'info': const {'params': 3, 'expr': false}},
+    const {'name': 'translateZ', 'info': const {'params': 1, 'expr': false}},
+    const {'name': 'scale3d', 'info': const {'params': 3, 'expr': false}},
+    const {'name': 'scaleZ', 'info': const {'params': 1, 'expr': false}},
+    const {'name': 'rotate3d', 'info': const {'params': 3, 'expr': false}},
+    const {'name': 'rotateX', 'info': const {'params': 1, 'expr': false}},
+    const {'name': 'rotateY', 'info': const {'params': 1, 'expr': false}},
+    const {'name': 'rotateZ', 'info': const {'params': 1, 'expr': false}},
+    const {'name': 'perspective', 'info': const {'params': 1, 'expr': false}},
   ];
 
   /**
@@ -503,8 +519,8 @@
   }
 
   /** Return the token that matches the unit ident found. */
-  static int matchList(var identList, String tokenField, String text,
-                       int offset, int length) {
+  static int matchList(
+      var identList, String tokenField, String text, int offset, int length) {
     for (final entry in identList) {
       String ident = entry['value'];
 
@@ -515,9 +531,10 @@
           int identChar = ident.codeUnitAt(i);
           int char = text.codeUnitAt(idx++);
           // Compare lowercase to lowercase then check if char is uppercase.
-          match = match && (char == identChar ||
-              ((char >= ASCII_UPPER_A && char <= ASCII_UPPER_Z) &&
-               (char + 32) == identChar));
+          match = match &&
+              (char == identChar ||
+                  ((char >= ASCII_UPPER_A && char <= ASCII_UPPER_Z) &&
+                      (char + 32) == identChar));
           if (!match) {
             break;
           }
@@ -530,7 +547,7 @@
       }
     }
 
-    return -1;  // Not a unit token.
+    return -1; // Not a unit token.
   }
 
   /** Return the token that matches the unit ident found. */
@@ -563,7 +580,6 @@
     return null;
   }
 
-
   /** Return the unit token as its pretty name. */
   static String unitToString(int unitTokenToFind) {
     if (unitTokenToFind == TokenKind.PERCENT) {
@@ -577,7 +593,7 @@
       }
     }
 
-    return '<BAD UNIT>';  // Not a unit token.
+    return '<BAD UNIT>'; // Not a unit token.
   }
 
   /**
@@ -586,8 +602,8 @@
    */
   static Map matchColorName(String text) {
     var name = text.toLowerCase();
-    return _EXTENDED_COLOR_NAMES.
-        firstWhere((e) => e['name'] == name, orElse: () => null);
+    return _EXTENDED_COLOR_NAMES.firstWhere((e) => e['name'] == name,
+        orElse: () => null);
   }
 
   /** Return RGB value as [int] from a color entry in _EXTENDED_COLOR_NAMES. */
@@ -633,49 +649,84 @@
   }
 
   static String kindToString(int kind) {
-    switch(kind) {
-      case TokenKind.UNUSED: return "ERROR";
-      case TokenKind.END_OF_FILE: return "end of file";
-      case TokenKind.LPAREN: return "(";
-      case TokenKind.RPAREN: return ")";
-      case TokenKind.LBRACK: return "[";
-      case TokenKind.RBRACK: return "]";
-      case TokenKind.LBRACE: return "{";
-      case TokenKind.RBRACE: return "}";
-      case TokenKind.DOT: return ".";
-      case TokenKind.SEMICOLON: return ";";
-      case TokenKind.AT: return "@";
-      case TokenKind.HASH: return "#";
-      case TokenKind.PLUS: return "+";
-      case TokenKind.GREATER: return ">";
-      case TokenKind.TILDE: return "~";
-      case TokenKind.ASTERISK: return "*";
-      case TokenKind.NAMESPACE: return "|";
-      case TokenKind.COLON: return ":";
-      case TokenKind.PRIVATE_NAME: return "_";
-      case TokenKind.COMMA: return ",";
-      case TokenKind.SPACE: return " ";
-      case TokenKind.TAB: return "\t";
-      case TokenKind.NEWLINE: return "\n";
-      case TokenKind.RETURN: return "\r";
-      case TokenKind.PERCENT: return "%";
-      case TokenKind.SINGLE_QUOTE: return "'";
-      case TokenKind.DOUBLE_QUOTE: return "\"";
-      case TokenKind.SLASH: return "/";
-      case TokenKind.EQUALS: return '=';
-      case TokenKind.CARET: return '^';
-      case TokenKind.DOLLAR: return '\$';
-      case TokenKind.LESS: return '<';
-      case TokenKind.BANG: return '!';
-      case TokenKind.MINUS: return '-';
-      case TokenKind.BACKSLASH: return '\\';
+    switch (kind) {
+      case TokenKind.UNUSED:
+        return "ERROR";
+      case TokenKind.END_OF_FILE:
+        return "end of file";
+      case TokenKind.LPAREN:
+        return "(";
+      case TokenKind.RPAREN:
+        return ")";
+      case TokenKind.LBRACK:
+        return "[";
+      case TokenKind.RBRACK:
+        return "]";
+      case TokenKind.LBRACE:
+        return "{";
+      case TokenKind.RBRACE:
+        return "}";
+      case TokenKind.DOT:
+        return ".";
+      case TokenKind.SEMICOLON:
+        return ";";
+      case TokenKind.AT:
+        return "@";
+      case TokenKind.HASH:
+        return "#";
+      case TokenKind.PLUS:
+        return "+";
+      case TokenKind.GREATER:
+        return ">";
+      case TokenKind.TILDE:
+        return "~";
+      case TokenKind.ASTERISK:
+        return "*";
+      case TokenKind.NAMESPACE:
+        return "|";
+      case TokenKind.COLON:
+        return ":";
+      case TokenKind.PRIVATE_NAME:
+        return "_";
+      case TokenKind.COMMA:
+        return ",";
+      case TokenKind.SPACE:
+        return " ";
+      case TokenKind.TAB:
+        return "\t";
+      case TokenKind.NEWLINE:
+        return "\n";
+      case TokenKind.RETURN:
+        return "\r";
+      case TokenKind.PERCENT:
+        return "%";
+      case TokenKind.SINGLE_QUOTE:
+        return "'";
+      case TokenKind.DOUBLE_QUOTE:
+        return "\"";
+      case TokenKind.SLASH:
+        return "/";
+      case TokenKind.EQUALS:
+        return '=';
+      case TokenKind.CARET:
+        return '^';
+      case TokenKind.DOLLAR:
+        return '\$';
+      case TokenKind.LESS:
+        return '<';
+      case TokenKind.BANG:
+        return '!';
+      case TokenKind.MINUS:
+        return '-';
+      case TokenKind.BACKSLASH:
+        return '\\';
       default:
         throw "Unknown TOKEN";
     }
   }
 
   static bool isKindIdentifier(int kind) {
-    switch(kind) {
+    switch (kind) {
       // Synthesized tokens.
       case TokenKind.DIRECTIVE_IMPORT:
       case TokenKind.DIRECTIVE_MEDIA:
@@ -716,7 +767,7 @@
   }
 
   static bool isIdentifier(int kind) {
-    return kind == IDENTIFIER ;
+    return kind == IDENTIFIER;
   }
 }
 
diff --git a/lib/src/tree.dart b/lib/src/tree.dart
index 37d0741..5dad435 100644
--- a/lib/src/tree.dart
+++ b/lib/src/tree.dart
@@ -11,7 +11,7 @@
 class Identifier extends TreeNode {
   String name;
 
-  Identifier(this.name, SourceSpan span): super(span);
+  Identifier(this.name, SourceSpan span) : super(span);
 
   Identifier clone() => new Identifier(name, span);
 
@@ -21,7 +21,7 @@
 }
 
 class Wildcard extends TreeNode {
-  Wildcard(SourceSpan span): super(span);
+  Wildcard(SourceSpan span) : super(span);
   Wildcard clone() => new Wildcard(span);
   visit(VisitorBase visitor) => visitor.visitWildcard(this);
 
@@ -29,7 +29,7 @@
 }
 
 class ThisOperator extends TreeNode {
-  ThisOperator(SourceSpan span): super(span);
+  ThisOperator(SourceSpan span) : super(span);
   ThisOperator clone() => new ThisOperator(span);
   visit(VisitorBase visitor) => visitor.visitThisOperator(this);
 
@@ -37,7 +37,7 @@
 }
 
 class Negation extends TreeNode {
-  Negation(SourceSpan span): super(span);
+  Negation(SourceSpan span) : super(span);
   Negation clone() => new Negation(span);
   visit(VisitorBase visitor) => visitor.visitNegation(this);
 
@@ -48,14 +48,14 @@
 class CssComment extends TreeNode {
   final String comment;
 
-  CssComment(this.comment, SourceSpan span): super(span);
+  CssComment(this.comment, SourceSpan span) : super(span);
   CssComment clone() => new 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(String comment, SourceSpan span) : super(comment, span);
   CommentDefinition clone() => new CommentDefinition(comment, span);
   visit(VisitorBase visitor) => visitor.visitCommentDefinition(this);
 }
@@ -63,7 +63,7 @@
 class SelectorGroup extends TreeNode {
   final List<Selector> selectors;
 
-  SelectorGroup(this.selectors, SourceSpan span): super(span);
+  SelectorGroup(this.selectors, SourceSpan span) : super(span);
 
   SelectorGroup clone() => new SelectorGroup(selectors, span);
 
@@ -80,9 +80,8 @@
   int get length => simpleSelectorSequences.length;
 
   Selector clone() {
-    var simpleSequences = simpleSelectorSequences
-        .map((ss) => ss.clone())
-        .toList();
+    var simpleSequences =
+        simpleSelectorSequences.map((ss) => ss.clone()).toList();
 
     return new Selector(simpleSequences, span);
   }
@@ -97,7 +96,8 @@
 
   SimpleSelectorSequence(this.simpleSelector, SourceSpan span,
       [int combinator = TokenKind.COMBINATOR_NONE])
-      : combinator = combinator, super(span);
+      : combinator = combinator,
+        super(span);
 
   bool get isCombinatorNone => combinator == TokenKind.COMBINATOR_NONE;
   bool get isCombinatorPlus => combinator == TokenKind.COMBINATOR_PLUS;
@@ -106,11 +106,11 @@
   bool get isCombinatorDescendant =>
       combinator == TokenKind.COMBINATOR_DESCENDANT;
 
-  String get _combinatorToString =>
-      isCombinatorDescendant ? ' ' :
-          isCombinatorPlus ? ' + ' :
-              isCombinatorGreater ? ' > ' :
-                  isCombinatorTilde ? ' ~ ' : '';
+  String get _combinatorToString => isCombinatorDescendant
+      ? ' '
+      : isCombinatorPlus
+          ? ' + '
+          : isCombinatorGreater ? ' > ' : isCombinatorTilde ? ' ~ ' : '';
 
   SimpleSelectorSequence clone() =>
       new SimpleSelectorSequence(simpleSelector, span, combinator);
@@ -149,7 +149,7 @@
 
 // namespace|element
 class NamespaceSelector extends SimpleSelector {
-  final _namespace;           // null, Wildcard or Identifier
+  final _namespace; // null, Wildcard or Identifier
 
   NamespaceSelector(this._namespace, var name, SourceSpan span)
       : super(name, span);
@@ -173,8 +173,8 @@
   final int _op;
   final _value;
 
-  AttributeSelector(Identifier name, this._op, this._value,
-      SourceSpan span) : super(name, span);
+  AttributeSelector(Identifier name, this._op, this._value, SourceSpan span)
+      : super(name, span);
 
   int get operatorKind => _op;
 
@@ -182,38 +182,38 @@
 
   String matchOperator() {
     switch (_op) {
-    case TokenKind.EQUALS:
-      return '=';
-    case TokenKind.INCLUDES:
-      return '~=';
-    case TokenKind.DASH_MATCH:
-      return '|=';
-    case TokenKind.PREFIX_MATCH:
-      return '^=';
-    case TokenKind.SUFFIX_MATCH:
-      return '\$=';
-    case TokenKind.SUBSTRING_MATCH:
-      return '*=';
-    case TokenKind.NO_MATCH:
-      return '';
+      case TokenKind.EQUALS:
+        return '=';
+      case TokenKind.INCLUDES:
+        return '~=';
+      case TokenKind.DASH_MATCH:
+        return '|=';
+      case TokenKind.PREFIX_MATCH:
+        return '^=';
+      case TokenKind.SUFFIX_MATCH:
+        return '\$=';
+      case TokenKind.SUBSTRING_MATCH:
+        return '*=';
+      case TokenKind.NO_MATCH:
+        return '';
     }
   }
 
   // Return the TokenKind for operator used by visitAttributeSelector.
   String matchOperatorAsTokenString() {
     switch (_op) {
-    case TokenKind.EQUALS:
-      return 'EQUALS';
-    case TokenKind.INCLUDES:
-      return 'INCLUDES';
-    case TokenKind.DASH_MATCH:
-      return 'DASH_MATCH';
-    case TokenKind.PREFIX_MATCH:
-      return 'PREFIX_MATCH';
-    case TokenKind.SUFFIX_MATCH:
-      return 'SUFFIX_MATCH';
-    case TokenKind.SUBSTRING_MATCH:
-      return 'SUBSTRING_MATCH';
+      case TokenKind.EQUALS:
+        return 'EQUALS';
+      case TokenKind.INCLUDES:
+        return 'INCLUDES';
+      case TokenKind.DASH_MATCH:
+        return 'DASH_MATCH';
+      case TokenKind.PREFIX_MATCH:
+        return 'PREFIX_MATCH';
+      case TokenKind.SUFFIX_MATCH:
+        return 'SUFFIX_MATCH';
+      case TokenKind.SUBSTRING_MATCH:
+        return 'SUBSTRING_MATCH';
     }
   }
 
@@ -284,16 +284,15 @@
   PseudoClassFunctionSelector clone() =>
       new PseudoClassFunctionSelector(_name, expression, span);
 
-  visit(VisitorBase visitor) =>
-      visitor.visitPseudoClassFunctionSelector(this);
+  visit(VisitorBase visitor) => visitor.visitPseudoClassFunctionSelector(this);
 }
 
 // ::pseudoElementFunction(expression)
 class PseudoElementFunctionSelector extends PseudoElementSelector {
   final SelectorExpression expression;
 
-  PseudoElementFunctionSelector(Identifier name, this.expression,
-          SourceSpan span)
+  PseudoElementFunctionSelector(
+      Identifier name, this.expression, SourceSpan span)
       : super(name, span);
 
   PseudoElementFunctionSelector clone() =>
@@ -306,7 +305,7 @@
 class SelectorExpression extends TreeNode {
   final List<Expression> expressions;
 
-  SelectorExpression(this.expressions, SourceSpan span): super(span);
+  SelectorExpression(this.expressions, SourceSpan span) : super(span);
 
   SelectorExpression clone() {
     return new SelectorExpression(
@@ -387,8 +386,8 @@
 class Directive extends TreeNode {
   Directive(SourceSpan span) : super(span);
 
-  bool get isBuiltIn => true;       // Known CSS directive?
-  bool get isExtension => false;    // SCSS extension?
+  bool get isBuiltIn => true; // Known CSS directive?
+  bool get isExtension => false; // SCSS extension?
 
   Directive clone() => new Directive(span);
   visit(VisitorBase visitor) => visitor.visitDirective(this);
@@ -424,8 +423,8 @@
   final Identifier _mediaFeature;
   final Expressions exprs;
 
-  MediaExpression(this.andOperator, this._mediaFeature, this.exprs,
-          SourceSpan span)
+  MediaExpression(
+      this.andOperator, this._mediaFeature, this.exprs, SourceSpan span)
       : super(span);
 
   String get mediaFeature => _mediaFeature.name;
@@ -455,8 +454,8 @@
   final Identifier _mediaType;
   final List<MediaExpression> expressions;
 
-  MediaQuery(this._mediaUnary, this._mediaType, this.expressions,
-          SourceSpan span)
+  MediaQuery(
+      this._mediaUnary, this._mediaType, this.expressions, SourceSpan span)
       : super(span);
 
   bool get hasMediaType => _mediaType != null;
@@ -519,8 +518,9 @@
   final String _pseudoPage;
   final List<DeclarationGroup> _declsMargin;
 
-  PageDirective(this._ident, this._pseudoPage, this._declsMargin,
-      SourceSpan span) : super(span);
+  PageDirective(
+      this._ident, this._pseudoPage, this._declsMargin, SourceSpan span)
+      : super(span);
 
   PageDirective clone() {
     var cloneDeclsMargin = [];
@@ -553,7 +553,8 @@
   final List<KeyFrameBlock> _blocks;
 
   KeyFrameDirective(this._keyframeName, this.name, SourceSpan span)
-      : _blocks = [], super(span);
+      : _blocks = [],
+        super(span);
 
   add(KeyFrameBlock block) {
     _blocks.add(block);
@@ -564,9 +565,12 @@
       case TokenKind.DIRECTIVE_KEYFRAMES:
       case TokenKind.DIRECTIVE_MS_KEYFRAMES:
         return '@keyframes';
-      case TokenKind.DIRECTIVE_WEB_KIT_KEYFRAMES: return '@-webkit-keyframes';
-      case TokenKind.DIRECTIVE_MOZ_KEYFRAMES: return '@-moz-keyframes';
-      case TokenKind.DIRECTIVE_O_KEYFRAMES: return '@-o-keyframes';
+      case TokenKind.DIRECTIVE_WEB_KIT_KEYFRAMES:
+        return '@-webkit-keyframes';
+      case TokenKind.DIRECTIVE_MOZ_KEYFRAMES:
+        return '@-moz-keyframes';
+      case TokenKind.DIRECTIVE_O_KEYFRAMES:
+        return '@-o-keyframes';
     }
   }
 
@@ -607,7 +611,7 @@
   final List<RuleSet> rulesets;
 
   StyletDirective(this.dartClassName, this.rulesets, SourceSpan span)
-     : super(span);
+      : super(span);
 
   bool get isBuiltIn => false;
   bool get isExtension => true;
@@ -675,8 +679,8 @@
   final List<RuleSet> rulesets;
 
   MixinRulesetDirective(String name, List<VarDefinitionDirective> args,
-      bool varArgs, this.rulesets, SourceSpan span) :
-      super(name, args, varArgs, span);
+      bool varArgs, this.rulesets, SourceSpan span)
+      : super(name, args, varArgs, span);
 
   MixinRulesetDirective clone() {
     var clonedArgs = [];
@@ -687,8 +691,8 @@
     for (var ruleset in rulesets) {
       clonedRulesets.add(ruleset.clone());
     }
-    return new MixinRulesetDirective(name, clonedArgs, varArgs, clonedRulesets,
-        span);
+    return new MixinRulesetDirective(
+        name, clonedArgs, varArgs, clonedRulesets, span);
   }
 
   visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this);
@@ -697,17 +701,17 @@
 class MixinDeclarationDirective extends MixinDefinition {
   final DeclarationGroup declarations;
 
-  MixinDeclarationDirective(String name, List<VarDefinitionDirective>  args,
-      bool varArgs, this.declarations, SourceSpan span) :
-      super(name, args, varArgs, span);
+  MixinDeclarationDirective(String name, List<VarDefinitionDirective> args,
+      bool varArgs, this.declarations, SourceSpan span)
+      : super(name, args, varArgs, span);
 
   MixinDeclarationDirective clone() {
     var clonedArgs = [];
     for (var arg in definedArgs) {
       clonedArgs.add(arg.clone());
     }
-    return new MixinDeclarationDirective(name, clonedArgs, varArgs,
-        declarations.clone(), span);
+    return new MixinDeclarationDirective(
+        name, clonedArgs, varArgs, declarations.clone(), span);
   }
 
   visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this);
@@ -758,16 +762,18 @@
   final bool isIE7;
 
   Declaration(this._property, this._expression, this.dartStyle, SourceSpan span,
-              {important: false, ie7: false})
-      : this.important = important, this.isIE7 = ie7, super(span);
+      {important: false, ie7: false})
+      : this.important = important,
+        this.isIE7 = ie7,
+        super(span);
 
   String get property => isIE7 ? '*${_property.name}' : _property.name;
   Expression get expression => _expression;
 
   bool get hasDartStyle => dartStyle != null;
 
-  Declaration clone() =>
-      new Declaration(_property.clone(), _expression.clone(), dartStyle, span,
+  Declaration clone() => new Declaration(
+      _property.clone(), _expression.clone(), dartStyle, span,
       important: important);
 
   visit(VisitorBase visitor) => visitor.visitDeclaration(this);
@@ -787,9 +793,8 @@
 
   String get definedName => _property.name;
 
-  VarDefinition clone() =>
-      new VarDefinition(_property.clone(),
-      expression != null ? expression.clone() : null, span);
+  VarDefinition clone() => new VarDefinition(
+      _property.clone(), expression != null ? expression.clone() : null, span);
 
   visit(VisitorBase visitor) => visitor.visitVarDefinition(this);
 }
@@ -810,15 +815,14 @@
   IncludeMixinAtDeclaration clone() =>
       new IncludeMixinAtDeclaration(include.clone(), span);
 
-  visit(VisitorBase visitor) =>
-      visitor.visitIncludeMixinAtDeclaration(this);
+  visit(VisitorBase visitor) => visitor.visitIncludeMixinAtDeclaration(this);
 }
 
 class ExtendDeclaration extends Declaration {
   final List<TreeNode> selectors;
 
-  ExtendDeclaration(this.selectors, SourceSpan span) :
-      super(null, null, null, span);
+  ExtendDeclaration(this.selectors, SourceSpan span)
+      : super(null, null, null, span);
 
   ExtendDeclaration clone() {
     var newSelector = selectors.map((s) => s.clone()).toList();
@@ -843,12 +847,12 @@
 }
 
 class MarginGroup extends DeclarationGroup {
-  final int margin_sym;       // TokenType for for @margin sym.
+  final int margin_sym; // TokenType for for @margin sym.
 
   MarginGroup(this.margin_sym, List<Declaration> decls, SourceSpan span)
       : super(decls, span);
   MarginGroup clone() =>
-    new MarginGroup(margin_sym, super.clone() as dynamic, span);
+      new MarginGroup(margin_sym, super.clone() as dynamic, span);
   visit(VisitorBase visitor) => visitor.visitMarginGroup(this);
 }
 
@@ -942,7 +946,8 @@
 
 class LengthTerm extends UnitTerm {
   LengthTerm(value, String t, SourceSpan span,
-      [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
+      [int unit = TokenKind.UNIT_LENGTH_PX])
+      : super(value, t, span, unit) {
     assert(this.unit == TokenKind.UNIT_LENGTH_PX ||
         this.unit == TokenKind.UNIT_LENGTH_CM ||
         this.unit == TokenKind.UNIT_LENGTH_MM ||
@@ -974,7 +979,8 @@
 
 class AngleTerm extends UnitTerm {
   AngleTerm(var value, String t, SourceSpan span,
-    [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
+      [int unit = TokenKind.UNIT_LENGTH_PX])
+      : super(value, t, span, unit) {
     assert(this.unit == TokenKind.UNIT_ANGLE_DEG ||
         this.unit == TokenKind.UNIT_ANGLE_RAD ||
         this.unit == TokenKind.UNIT_ANGLE_GRAD ||
@@ -987,7 +993,8 @@
 
 class TimeTerm extends UnitTerm {
   TimeTerm(var value, String t, SourceSpan span,
-    [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
+      [int unit = TokenKind.UNIT_LENGTH_PX])
+      : super(value, t, span, unit) {
     assert(this.unit == TokenKind.UNIT_ANGLE_DEG ||
         this.unit == TokenKind.UNIT_TIME_MS ||
         this.unit == TokenKind.UNIT_TIME_S);
@@ -999,7 +1006,8 @@
 
 class FreqTerm extends UnitTerm {
   FreqTerm(var value, String t, SourceSpan span,
-    [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
+      [int unit = TokenKind.UNIT_LENGTH_PX])
+      : super(value, t, span, unit) {
     assert(unit == TokenKind.UNIT_FREQ_HZ || unit == TokenKind.UNIT_FREQ_KHZ);
   }
 
@@ -1023,7 +1031,8 @@
 
 class ResolutionTerm extends UnitTerm {
   ResolutionTerm(var value, String t, SourceSpan span,
-    [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
+      [int unit = TokenKind.UNIT_LENGTH_PX])
+      : super(value, t, span, unit) {
     assert(unit == TokenKind.UNIT_RESOLUTION_DPI ||
         unit == TokenKind.UNIT_RESOLUTION_DPCM ||
         unit == TokenKind.UNIT_RESOLUTION_DPPX);
@@ -1035,7 +1044,8 @@
 
 class ChTerm extends UnitTerm {
   ChTerm(var value, String t, SourceSpan span,
-    [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
+      [int unit = TokenKind.UNIT_LENGTH_PX])
+      : super(value, t, span, unit) {
     assert(unit == TokenKind.UNIT_CH);
   }
 
@@ -1045,7 +1055,8 @@
 
 class RemTerm extends UnitTerm {
   RemTerm(var value, String t, SourceSpan span,
-    [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
+      [int unit = TokenKind.UNIT_LENGTH_PX])
+      : super(value, t, span, unit) {
     assert(unit == TokenKind.UNIT_REM);
   }
 
@@ -1055,7 +1066,8 @@
 
 class ViewportTerm extends UnitTerm {
   ViewportTerm(var value, String t, SourceSpan span,
-    [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
+      [int unit = TokenKind.UNIT_LENGTH_PX])
+      : super(value, t, span, unit) {
     assert(unit == TokenKind.UNIT_VIEWPORT_VW ||
         unit == TokenKind.UNIT_VIEWPORT_VH ||
         unit == TokenKind.UNIT_VIEWPORT_VMIN ||
@@ -1067,7 +1079,7 @@
 }
 
 /** Type to signal a bad hex value for HexColorTerm.value. */
-class BAD_HEX_VALUE { }
+class BAD_HEX_VALUE {}
 
 class HexColorTerm extends LiteralTerm {
   HexColorTerm(var value, String t, SourceSpan span) : super(value, t, span);
@@ -1100,7 +1112,9 @@
 class GroupTerm extends Expression {
   final List<LiteralTerm> _terms;
 
-  GroupTerm(SourceSpan span) : _terms =  [], super(span);
+  GroupTerm(SourceSpan span)
+      : _terms = [],
+        super(span);
 
   void add(LiteralTerm term) {
     _terms.add(term);
@@ -1120,7 +1134,7 @@
 class Expressions extends Expression {
   final List<Expression> expressions = [];
 
-  Expressions(SourceSpan span): super(span);
+  Expressions(SourceSpan span) : super(span);
 
   void add(Expression expression) {
     expressions.add(expression);
@@ -1141,7 +1155,7 @@
   final Expression x;
   final Expression y;
 
-  BinaryExpression(this.op, this.x, this.y, SourceSpan span): super(span);
+  BinaryExpression(this.op, this.x, this.y, SourceSpan span) : super(span);
 
   BinaryExpression clone() =>
       new BinaryExpression(op, x.clone(), y.clone(), span);
@@ -1152,7 +1166,7 @@
   final Token op;
   final Expression self;
 
-  UnaryExpression(this.op, this.self, SourceSpan span): super(span);
+  UnaryExpression(this.op, this.self, SourceSpan span) : super(span);
 
   UnaryExpression clone() => new UnaryExpression(op, self.clone(), span);
   visit(VisitorBase visitor) => visitor.visitUnaryExpression(this);
@@ -1200,10 +1214,14 @@
   // TODO(terry): Only px/pt for now need to handle all possible units to
   //              support calc expressions on units.
   FontExpression(SourceSpan span, {dynamic size, List<String> family,
-      int weight, String style, String variant, LineHeight lineHeight}) :
-        font = new Font(size : size is LengthTerm ? size.value : size,
-            family: family, weight: weight, style: style, variant: variant,
-            lineHeight: lineHeight),
+      int weight, String style, String variant, LineHeight lineHeight})
+      : font = new Font(
+          size: size is LengthTerm ? size.value : size,
+          family: family,
+          weight: weight,
+          style: style,
+          variant: variant,
+          lineHeight: lineHeight),
         super(DartStyleExpression.fontStyle, span);
 
   FontExpression merged(DartStyleExpression newFontExpr) {
@@ -1224,10 +1242,13 @@
       : font = new Font.merge(x.font, y.font),
         super(DartStyleExpression.fontStyle, span);
 
-  FontExpression clone() =>
-    new FontExpression(span, size: font.size, family: font.family,
-        weight: font.weight, style: font.style, variant: font.variant,
-        lineHeight: font.lineHeight);
+  FontExpression clone() => new FontExpression(span,
+      size: font.size,
+      family: font.family,
+      weight: font.weight,
+      style: font.style,
+      variant: font.variant,
+      lineHeight: font.lineHeight);
 
   visit(VisitorBase visitor) => visitor.visitFontExpression(this);
 }
@@ -1241,8 +1262,7 @@
   visit(VisitorBase visitor) => visitor.visitBoxExpression(this);
 
   String get formattedBoxEdge {
-    if (box.top == box.left && box.top == box.bottom &&
-        box.top== box.right) {
+    if (box.top == box.left && box.top == box.bottom && box.top == box.right) {
       return '.uniform(${box.top})';
     } else {
       var left = box.left == null ? 0 : box.left;
@@ -1259,13 +1279,14 @@
   /** 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));
+          new BoxEdge(left, top, right, bottom));
 
   MarginExpression.boxEdge(SourceSpan span, BoxEdge box)
       : super(DartStyleExpression.marginStyle, span, box);
 
   merged(DartStyleExpression newMarginExpr) {
-    if (newMarginExpr is MarginExpression && this.isMargin &&
+    if (newMarginExpr is MarginExpression &&
+        this.isMargin &&
         newMarginExpr.isMargin) {
       return new MarginExpression.merge(this, newMarginExpr);
     }
@@ -1280,13 +1301,12 @@
     return new MarginExpression._merge(x, y, y.span);
   }
 
-  MarginExpression._merge(MarginExpression x, MarginExpression y,
-          SourceSpan span)
+  MarginExpression._merge(
+      MarginExpression x, MarginExpression y, SourceSpan span)
       : super(x._styleType, span, new BoxEdge.merge(x.box, y.box));
 
-  MarginExpression clone() =>
-      new MarginExpression(span, top: box.top, right: box.right,
-      bottom: box.bottom, left: box.left);
+  MarginExpression clone() => new MarginExpression(span,
+      top: box.top, right: box.right, bottom: box.bottom, left: box.left);
 
   visit(VisitorBase visitor) => visitor.visitMarginExpression(this);
 }
@@ -1295,13 +1315,15 @@
   /** 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));
+          new BoxEdge(left, top, right, bottom));
 
   BorderExpression.boxEdge(SourceSpan span, BoxEdge box)
       : super(DartStyleExpression.borderStyle, span, box);
 
   merged(DartStyleExpression newBorderExpr) {
-    if (newBorderExpr is BorderExpression && this.isBorder && newBorderExpr.isBorder) {
+    if (newBorderExpr is BorderExpression &&
+        this.isBorder &&
+        newBorderExpr.isBorder) {
       return new BorderExpression.merge(this, newBorderExpr);
     }
 
@@ -1315,14 +1337,13 @@
     return new BorderExpression._merge(x, y, y.span);
   }
 
-  BorderExpression._merge(BorderExpression x, BorderExpression y,
-      SourceSpan span)
+  BorderExpression._merge(
+      BorderExpression x, BorderExpression y, SourceSpan span)
       : super(DartStyleExpression.borderStyle, span,
-              new BoxEdge.merge(x.box, y.box));
+          new BoxEdge.merge(x.box, y.box));
 
-  BorderExpression clone() =>
-      new BorderExpression(span, top: box.top, right: box.right,
-      bottom: box.bottom, left: box.left);
+  BorderExpression clone() => new BorderExpression(span,
+      top: box.top, right: box.right, bottom: box.bottom, left: box.left);
 
   visit(VisitorBase visitor) => visitor.visitBorderExpression(this);
 }
@@ -1334,7 +1355,9 @@
       : super(DartStyleExpression.heightStyle, span);
 
   merged(DartStyleExpression newHeightExpr) {
-    if (newHeightExpr is DartStyleExpression && this.isHeight && newHeightExpr.isHeight) {
+    if (newHeightExpr is DartStyleExpression &&
+        this.isHeight &&
+        newHeightExpr.isHeight) {
       return newHeightExpr;
     }
 
@@ -1352,7 +1375,8 @@
       : super(DartStyleExpression.widthStyle, span);
 
   merged(DartStyleExpression newWidthExpr) {
-    if (newWidthExpr is WidthExpression && this.isWidth &&
+    if (newWidthExpr is WidthExpression &&
+        this.isWidth &&
         newWidthExpr.isWidth) {
       return newWidthExpr;
     }
@@ -1368,13 +1392,14 @@
   /** 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));
+          new BoxEdge(left, top, right, bottom));
 
   PaddingExpression.boxEdge(SourceSpan span, BoxEdge box)
       : super(DartStyleExpression.paddingStyle, span, box);
 
   merged(DartStyleExpression newPaddingExpr) {
-    if (newPaddingExpr is PaddingExpression && this.isPadding &&
+    if (newPaddingExpr is PaddingExpression &&
+        this.isPadding &&
         newPaddingExpr.isPadding) {
       return new PaddingExpression.merge(this, newPaddingExpr);
     }
@@ -1389,13 +1414,12 @@
     return new PaddingExpression._merge(x, y, y.span);
   }
 
-  PaddingExpression._merge(PaddingExpression x, PaddingExpression y,
-          SourceSpan span)
+  PaddingExpression._merge(
+      PaddingExpression x, PaddingExpression y, SourceSpan span)
       : super(DartStyleExpression.paddingStyle, span,
-            new BoxEdge.merge(x.box, y.box));
+          new BoxEdge.merge(x.box, y.box));
 
-  PaddingExpression clone() =>
-      new PaddingExpression(span, top: box.top, right: box.right,
-      bottom: box.bottom, left: box.left);
+  PaddingExpression clone() => new 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 35aef13..095b493 100644
--- a/lib/src/tree_base.dart
+++ b/lib/src/tree_base.dart
@@ -29,7 +29,7 @@
 
 /** The base type for expressions. */
 abstract class Expression extends TreeNode {
-  Expression(SourceSpan span): super(span);
+  Expression(SourceSpan span) : super(span);
 }
 
 /** Simple class to provide a textual dump of trees for debugging. */
@@ -39,7 +39,7 @@
   VisitorBase printer;
 
   void write(String s) {
-    for (int i=0; i < depth; i++) {
+    for (int i = 0; i < depth; i++) {
       buf.write(' ');
     }
     buf.write(s);
diff --git a/lib/src/tree_printer.dart b/lib/src/tree_printer.dart
index 3a8b748..8cb4de8 100644
--- a/lib/src/tree_printer.dart
+++ b/lib/src/tree_printer.dart
@@ -17,7 +17,9 @@
 class _TreePrinter extends Visitor {
   final TreeOutput output;
   final bool useSpan;
-  _TreePrinter(this.output, this.useSpan) { output.printer = this; }
+  _TreePrinter(this.output, this.useSpan) {
+    output.printer = this;
+  }
 
   void visitTree(StyleSheet tree) => visitStylesheet(tree);
 
@@ -244,8 +246,8 @@
   void visitSelector(Selector node) {
     heading('Selector', node);
     output.depth++;
-    output.writeNodeList('simpleSelectorsSequences',
-        node.simpleSelectorSequences);
+    output.writeNodeList(
+        'simpleSelectorsSequences', node.simpleSelectorSequences);
     output.depth--;
   }
 
@@ -370,7 +372,7 @@
     output.depth++;
     output.writeValue('value', node.text);
     output.depth--;
- }
+  }
 
   void visitHexColorTerm(HexColorTerm node) {
     heading('HexColorTerm', node);
diff --git a/lib/src/validate.dart b/lib/src/validate.dart
index bc3a6ad..d45cd95 100644
--- a/lib/src/validate.dart
+++ b/lib/src/validate.dart
@@ -40,9 +40,9 @@
       // Perfect just one element id returns matches of -1.
       return -1;
     } else if (selector.isCombinatorDescendant()) {
-        String tooMany = selector.simpleSelector.toString();
-        throw new CssSelectorException(
-            'Use of Id selector must be singleton starting at $tooMany');
+      String tooMany = selector.simpleSelector.toString();
+      throw new CssSelectorException(
+          'Use of Id selector must be singleton starting at $tooMany');
     } else {
       String error = selector.simpleSelector.toString();
       throw new CssSelectorException(
@@ -53,9 +53,9 @@
   // Validate the @{css expression} only .class and #elementId are valid inside
   // of @{...}.
   static template(List<Selector> selectors) {
-    var errorSelector;                  // signal which selector didn't match.
-    bool found = false;                 // signal if a selector is matched.
-    int matches = 0;                    // < 0 IdSelectors, > 0 ClassSelector
+    var errorSelector; // signal which selector didn't match.
+    bool found = false; // signal if a selector is matched.
+    int matches = 0; // < 0 IdSelectors, > 0 ClassSelector
 
     // At most one selector group (any number of simple selector sequences).
     assert(selectors.length <= 1);
@@ -73,20 +73,19 @@
             for (final className in classes) {
               if (selector.simpleSelector.name == className) {
                 matches = _classNameCheck(selector, matches);
-                found = true;              // .class found.
+                found = true; // .class found.
                 break;
               }
               for (final className2 in classes) {
                 print(className2);
               }
             }
-
           } else {
             // Don't check any class name that is prefixed with an underscore.
             // However, signal as found and bump up matches; it's a valid class
             // name.
             matches = _classNameCheck(selector, matches);
-            found = true;                 // ._class are always okay.
+            found = true; // ._class are always okay.
           }
         } else if (simpleSelector is IdSelector) {
           // Any element id starting with an underscore is a private element id
@@ -95,7 +94,7 @@
             for (final id in ids) {
               if (simpleSelector.name == id) {
                 matches = _elementIdCheck(selector, matches);
-                found = true;             // #id found.
+                found = true; // #id found.
                 break;
               }
             }
@@ -103,7 +102,7 @@
             // Don't check any element ID that is prefixed with an underscore.
             // Signal as found and bump up matches; it's a valid element ID.
             matches = _elementIdCheck(selector, matches);
-            found = true;                 // #_id are always okay
+            found = true; // #_id are always okay
           }
         } else {
           String badSelector = simpleSelector.toString();
@@ -124,4 +123,3 @@
         selector.simpleSelectorSequences.length);
   }
 }
-
diff --git a/lib/visitor.dart b/lib/visitor.dart
index 154d235..fa0f8d2 100644
--- a/lib/visitor.dart
+++ b/lib/visitor.dart
@@ -126,15 +126,15 @@
     _visitNodeList(ss.topLevels);
   }
 
-  void visitNoOp(NoOp node) { }
+  void visitNoOp(NoOp node) {}
 
-  void visitTopLevelProduction(TopLevelProduction node) { }
+  void visitTopLevelProduction(TopLevelProduction node) {}
 
-  void visitDirective(Directive node) { }
+  void visitDirective(Directive node) {}
 
-  void visitCssComment(CssComment node) { }
+  void visitCssComment(CssComment node) {}
 
-  void visitCommentDefinition(CommentDefinition node) { }
+  void visitCommentDefinition(CommentDefinition node) {}
 
   void visitMediaExpression(MediaExpression node) {
     visitExpressions(node.exprs);
@@ -171,7 +171,7 @@
     }
   }
 
-  void visitCharsetDirective(CharsetDirective node) { }
+  void visitCharsetDirective(CharsetDirective node) {}
 
   void visitImportDirective(ImportDirective node) {
     for (var mediaQuery in node.mediaQueries) {
@@ -197,7 +197,7 @@
     _visitNodeList(node.rulesets);
   }
 
-  void visitNamespaceDirective(NamespaceDirective node) { }
+  void visitNamespaceDirective(NamespaceDirective node) {}
 
   void visitVarDefinitionDirective(VarDefinitionDirective node) {
     visitVarDefinition(node.def);
@@ -207,7 +207,7 @@
     _visitNodeList(node.rulesets);
   }
 
-  void visitMixinDefinition(MixinDefinition node) { }
+  void visitMixinDefinition(MixinDefinition node) {}
 
   void visitMixinDeclarationDirective(MixinDeclarationDirective node) {
     visitDeclarationGroup(node.declarations);
@@ -303,15 +303,15 @@
     _visitNodeList(node.expressions);
   }
 
-  void visitUnicodeRangeTerm(UnicodeRangeTerm node) { }
+  void visitUnicodeRangeTerm(UnicodeRangeTerm node) {}
 
-  void visitLiteralTerm(LiteralTerm node) { }
+  void visitLiteralTerm(LiteralTerm node) {}
 
-  void visitHexColorTerm(HexColorTerm node) { }
+  void visitHexColorTerm(HexColorTerm node) {}
 
-  void visitNumberTerm(NumberTerm node) { }
+  void visitNumberTerm(NumberTerm node) {}
 
-  void visitUnitTerm(UnitTerm node) { }
+  void visitUnitTerm(UnitTerm node) {}
 
   void visitLengthTerm(LengthTerm node) {
     visitUnitTerm(node);
@@ -380,15 +380,15 @@
     visitNumberTerm(node);
   }
 
-  void visitIE8Term(IE8Term node) { }
+  void visitIE8Term(IE8Term node) {}
 
-  void visitOperatorSlash(OperatorSlash node) { }
+  void visitOperatorSlash(OperatorSlash node) {}
 
-  void visitOperatorComma(OperatorComma node) { }
+  void visitOperatorComma(OperatorComma node) {}
 
-  void visitOperatorPlus(OperatorPlus node) { }
+  void visitOperatorPlus(OperatorPlus node) {}
 
-  void visitOperatorMinus(OperatorMinus node) { }
+  void visitOperatorMinus(OperatorMinus node) {}
 
   void visitVarUsage(VarUsage node) {
     _visitNodeList(node.defaultValues);
@@ -408,15 +408,15 @@
     throw UnimplementedError;
   }
 
-  void visitIdentifier(Identifier node) { }
+  void visitIdentifier(Identifier node) {}
 
-  void visitWildcard(Wildcard node) { }
+  void visitWildcard(Wildcard node) {}
 
-  void visitThisOperator(ThisOperator node) { }
+  void visitThisOperator(ThisOperator node) {}
 
-  void visitNegation(Negation node) { }
+  void visitNegation(Negation node) {}
 
-  void visitDartStyleExpression(DartStyleExpression node) { }
+  void visitDartStyleExpression(DartStyleExpression node) {}
 
   void visitFontExpression(FontExpression node) {
     // TODO(terry): TBD
diff --git a/pubspec.yaml b/pubspec.yaml
index 7bb6317..b168432 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: csslib
-version: 0.11.0+4
+version: 0.11.1-dev
 author: Polymer.dart Team <web-ui-dev@dartlang.org>
 description: A library for parsing CSS.
 homepage: https://github.com/dart-lang/csslib
diff --git a/test/big_1_test.dart b/test/big_1_test.dart
index 5210115..ed1c271 100644
--- a/test/big_1_test.dart
+++ b/test/big_1_test.dart
@@ -7,7 +7,7 @@
 import 'package:unittest/unittest.dart';
 import 'testing.dart';
 
-var  options = ['--warnings_as_errors', '--no-colors', 'memory'];
+var options = ['--warnings_as_errors', '--no-colors', 'memory'];
 
 compilePolyfillAndValidate(String input, String generated) {
   var errors = [];
diff --git a/test/compiler_test.dart b/test/compiler_test.dart
index 8d63f8b..a7cdf4a 100644
--- a/test/compiler_test.dart
+++ b/test/compiler_test.dart
@@ -516,10 +516,10 @@
   var errors = [];
   var input = '<![CDATA[.foo { '
       'color: red; left: 20px; top: 20px; width: 100px; height:200px'
-    '}'
-    '#div {'
+      '}'
+      '#div {'
       'color : #00F578; border-color: #878787;'
-    '}]]>';
+      '}]]>';
 
   var stylesheet = parse(UTF8.encode(input), errors: errors);
 
@@ -584,8 +584,8 @@
 div:nth-child(2n) { color : red; }
 ''';
 
-  var stylesheet = parseCss(input, errors: errors,
-      opts: ['--no-colors', 'memory']);
+  var stylesheet =
+      parseCss(input, errors: errors, opts: ['--no-colors', 'memory']);
 
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
@@ -647,16 +647,16 @@
   var errors = [];
   var input = '@host { '
       ':scope {'
-        'white-space: nowrap;'
-        'overflow-style: marquee-line;'
-        'overflow-x: marquee;'
+      'white-space: nowrap;'
+      'overflow-style: marquee-line;'
+      'overflow-x: marquee;'
       '}'
       '* { color: red; }'
       '*:hover { font-weight: bold; }'
       ':nth-child(odd) { color: blue; }'
-    '}';
-  var stylesheet = parseCss(input, errors: errors,
-      opts: ['--no-colors', 'memory']);
+      '}';
+  var stylesheet =
+      parseCss(input, errors: errors, opts: ['--no-colors', 'memory']);
 
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
@@ -684,10 +684,10 @@
   var errors = [];
   var input = '.foo { '
       'color: red; left: 20px; top: 20px; width: 100px; height:200px'
-    '}'
-    '#div {'
+      '}'
+      '#div {'
       'color : #00F578; border-color: #878787;'
-    '}';
+      '}';
   var stylesheet = parseCss(input, errors: errors);
 
   expect(stylesheet != null, true);
diff --git a/test/declaration_test.dart b/test/declaration_test.dart
index 857df48..0cf012c 100644
--- a/test/declaration_test.dart
+++ b/test/declaration_test.dart
@@ -7,7 +7,6 @@
 import 'package:unittest/unittest.dart';
 import 'testing.dart';
 
-
 /** CSS compiler options no checks in in memory style sheet. */
 List options = ['--no-colors', 'memory'];
 
@@ -365,7 +364,7 @@
     }
   }''';
   generated =
-    '''@media handheld AND (min-width:20em), screen AND (min-width:20em) {
+      '''@media handheld AND (min-width:20em), screen AND (min-width:20em) {
 #id {
   color: #f00;
 }
@@ -481,8 +480,7 @@
      url(basic-sans-serif.ttf) format("opentype"),
      local(Gentium Bold);
 }''';
-  final String generated2 =
-      '@font-face  {\n'
+  final String generated2 = '@font-face  {\n'
       '  src: url("ideal-sans-serif.woff") '
       'format("woff"), url("basic-sans-serif.ttf") '
       'format("opentype"), local(Gentium Bold);\n}';
@@ -563,8 +561,7 @@
 }
 ''';
 
-  final String generated =
-      '@import "simple.css"; '
+  final String generated = '@import "simple.css"; '
       '@import "test.css" print; '
       '@import "test.css" screen, print; '
       '@import "http://google.com/maps/maps.css";\n'
@@ -715,36 +712,32 @@
 
 void testIE() {
   var errors = [];
-  final String input =
-".test {\n"
-"  filter: progid:DXImageTransform.Microsoft.gradient"
-"(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n"
-"}";
-  final String generated =
-".test {\n"
-"  filter: progid:DXImageTransform.Microsoft.gradient"
-"(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n"
-"}";
+  final String input = ".test {\n"
+      "  filter: progid:DXImageTransform.Microsoft.gradient"
+      "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n"
+      "}";
+  final String generated = ".test {\n"
+      "  filter: progid:DXImageTransform.Microsoft.gradient"
+      "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n"
+      "}";
 
-  var stylesheet = parseCss(input,  errors: errors, opts: options);
+  var stylesheet = parseCss(input, errors: errors, opts: options);
 
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
   expect(prettyPrint(stylesheet), generated);
 
-  final String input2 =
-".test {\n"
-"  filter: progid:DXImageTransform.Microsoft.gradient"
-"(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670')\n"
-"        progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n"
-"}";
+  final String input2 = ".test {\n"
+      "  filter: progid:DXImageTransform.Microsoft.gradient"
+      "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670')\n"
+      "        progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n"
+      "}";
 
-  final String generated2 =
-".test {\n"
-"  filter: progid:DXImageTransform.Microsoft.gradient"
-"(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670')\n"
-"         progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n"
-"}";
+  final String generated2 = ".test {\n"
+      "  filter: progid:DXImageTransform.Microsoft.gradient"
+      "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670')\n"
+      "         progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n"
+      "}";
 
   stylesheet = parseCss(input2, errors: errors..clear(), opts: options);
 
diff --git a/test/error_test.dart b/test/error_test.dart
index f48906c..363bf3d 100644
--- a/test/error_test.dart
+++ b/test/error_test.dart
@@ -223,7 +223,6 @@
 .foobar {
   color: # 123 fff;
 }''');
-
 }
 
 void testBadUnicode() {
@@ -239,7 +238,7 @@
   expect(errors.isEmpty, false);
   expect(errors[0].toString(),
       'error on line 3, column 20: unicode first range can not be greater than '
-        'last\n'
+      'last\n'
       '  unicode-range: U+400-200;\n'
       '                   ^^^^^^^');
 
diff --git a/test/extend_test.dart b/test/extend_test.dart
index 7136c45..ed24b35 100644
--- a/test/extend_test.dart
+++ b/test/extend_test.dart
@@ -7,7 +7,7 @@
 import 'package:unittest/unittest.dart';
 import 'testing.dart';
 
-var  options = ['--warnings_as_errors', '--no-colors', 'memory'];
+var options = ['--warnings_as_errors', '--no-colors', 'memory'];
 
 compileAndValidate(String input, String generated) {
   var errors = [];
@@ -215,13 +215,13 @@
   color: blue;
 }
 ''', '.btn + .btn, '
-    'input.second + label + .btn, '
-    '.btn + input.second + label, '
+      '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}');
+      '  margin-left: 5px;\n}\n'
+      'input.second + label {\n'
+      '  color: #00f;\n}');
 }
 
 main() {
diff --git a/test/mixin_test.dart b/test/mixin_test.dart
index 6d3b71e..5e32723 100644
--- a/test/mixin_test.dart
+++ b/test/mixin_test.dart
@@ -496,7 +496,6 @@
   expect(prettyPrint(stylesheet), generated);
 }
 
-
 void undefinedTopLevel() {
   final errors = [];
   final input = r'''
diff --git a/test/nested_test.dart b/test/nested_test.dart
index ef7cb46..c72666e 100644
--- a/test/nested_test.dart
+++ b/test/nested_test.dart
@@ -159,9 +159,9 @@
   color: #f00;
 }
 '''
-'html button span, body button span, html div span, body div span, '
-'html button a, body button a, html div a, body div a, html button ul, '
-r'''body button ul, html div ul, body div ul {
+      'html button span, body button span, html div span, body div span, '
+      'html button a, body button a, html div a, body div a, html button ul, '
+      r'''body button ul, html div ul, body div ul {
   height: 200;
 }
 html table, body table {
@@ -215,8 +215,7 @@
 div > span[attr="foo"] { color: yellow; }
 ''';
 
-  final generated =
-r'''div span {
+  final generated = r'''div span {
   color: #008000;
 }
 #header {
diff --git a/test/selector_test.dart b/test/selector_test.dart
index 3f764e7..43a5a35 100644
--- a/test/selector_test.dart
+++ b/test/selector_test.dart
@@ -27,8 +27,8 @@
   expect(errors.isEmpty, true, reason: errors.toString());
   expect('.foobar .a-story .xyzzy', compactOuptut(selectorAst));
 
-  selectorAst = selector('.foobar .xyzzy .a-story .b-story',
-      errors: errors..clear());
+  selectorAst =
+      selector('.foobar .xyzzy .a-story .b-story', errors: errors..clear());
   expect(errors.isEmpty, true, reason: errors.toString());
   expect('.foobar .xyzzy .a-story .b-story', compactOuptut(selectorAst));
 
@@ -56,7 +56,7 @@
   expect(errors.isEmpty, false);
   expect(errors[0].toString(),
       'error on line 1, column 9: name must start with a alpha character, but '
-        'found a number\n'
+      'found a number\n'
       '.foobar .1a-story .xyzzy\n'
       '        ^^');
 }
diff --git a/test/testing.dart b/test/testing.dart
index 002c452..b9a6738 100644
--- a/test/testing.dart
+++ b/test/testing.dart
@@ -18,10 +18,12 @@
  * CSS will allow any property/value pairs regardless of validity; all of our
  * tests (by default) will ensure that the CSS is really valid.
  */
-StyleSheet parseCss(String cssInput, {List<Message> errors,
-  List<String> opts}) =>
-  parse(cssInput, errors: errors, options: opts == null ?
-      ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] : opts);
+StyleSheet parseCss(String cssInput,
+    {List<Message> errors, List<String> opts}) => parse(cssInput,
+        errors: errors,
+        options: opts == null
+            ? ['--no-colors', '--checked', '--warnings_as_errors', 'memory']
+            : opts);
 
 /**
  * Spin-up CSS parser in checked mode to detect any problematic CSS.  Normally,
@@ -29,13 +31,16 @@
  * tests (by default) will ensure that the CSS is really valid.
  */
 StyleSheet compileCss(String cssInput, {List<Message> errors, List<String> opts,
-    bool polyfill: false, List<StyleSheet> includes: null}) =>
-  compile(cssInput, errors: errors, options: opts == null ?
-      ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] : opts,
-      polyfill: polyfill, includes: includes);
+    bool polyfill: false, List<StyleSheet> includes: null}) => compile(cssInput,
+        errors: errors,
+        options: opts == null
+            ? ['--no-colors', '--checked', '--warnings_as_errors', 'memory']
+            : opts,
+        polyfill: polyfill,
+        includes: includes);
 
-StyleSheet polyFillCompileCss(input, {List<Message> errors,
-  List<String> opts}) =>
+StyleSheet polyFillCompileCss(input,
+        {List<Message> errors, List<String> opts}) =>
     compileCss(input, errors: errors, polyfill: true, opts: opts);
 
 /** CSS emitter walks the style sheet tree and emits readable CSS. */
diff --git a/test/var_test.dart b/test/var_test.dart
index 0ec2852..17349b8 100644
--- a/test/var_test.dart
+++ b/test/var_test.dart
@@ -393,27 +393,27 @@
 
   var errorStrings = [
     'error on line 5, column 14: Variable is not defined.\n'
-    '  var-a: var(b);\n'
-    '             ^^',
+        '  var-a: var(b);\n'
+        '             ^^',
     'error on line 6, column 14: Variable is not defined.\n'
-    '  var-b: var(c);\n'
-    '             ^^',
+        '  var-b: var(c);\n'
+        '             ^^',
     'error on line 9, column 16: Variable is not defined.\n'
-    '  var-one: var(two);\n'
-    '               ^^^^',
+        '  var-one: var(two);\n'
+        '               ^^^^',
     'error on line 12, column 17: Variable is not defined.\n'
-    '  var-four: var(five);\n'
-    '                ^^^^^',
+        '  var-four: var(five);\n'
+        '                ^^^^^',
     'error on line 13, column 17: Variable is not defined.\n'
-    '  var-five: var(six);\n'
-    '                ^^^^',
+        '  var-five: var(six);\n'
+        '                ^^^^',
     'error on line 16, column 18: Variable is not defined.\n'
-    '  var-def-1: var(def-2);\n'
-    '                 ^^^^^^',
+        '  var-def-1: var(def-2);\n'
+        '                 ^^^^^^',
     'error on line 17, column 18: Variable is not defined.\n'
-    '  var-def-2: var(def-3);\n'
-    '                 ^^^^^^',
-    ];
+        '  var-def-2: var(def-3);\n'
+        '                 ^^^^^^',
+  ];
 
   var generated = r''':root {
   var-color-background: #f00;
@@ -445,8 +445,8 @@
 
   compileAndValidate(input, generated);
 
-  var stylesheet = polyFillCompileCss(input, errors: errors..clear(),
-      opts: options);
+  var stylesheet =
+      polyFillCompileCss(input, errors: errors..clear(), opts: options);
 
   expect(stylesheet != null, true);
 
@@ -644,8 +644,8 @@
   color: var(color-foreground);
 }''';
 
-  var stylesheet = parseCss(input, errors: errors,
-      opts: ['--no-colors', 'memory']);
+  var stylesheet =
+      parseCss(input, errors: errors, opts: ['--no-colors', 'memory']);
 
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
@@ -670,8 +670,8 @@
   color: var(color-foreground);
 }''';
 
-  stylesheet = parseCss(input, errors: errors..clear(),
-      opts: ['--no-colors', 'memory']);
+  stylesheet =
+      parseCss(input, errors: errors..clear(), opts: ['--no-colors', 'memory']);
 
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
@@ -699,8 +699,8 @@
   color: var(color-foreground);
 }''';
 
-  var stylesheet = parseCss(input, errors: errors,
-      opts: ['--no-colors', 'memory']);
+  var stylesheet =
+      parseCss(input, errors: errors, opts: ['--no-colors', 'memory']);
 
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
@@ -725,8 +725,8 @@
   color: var(color-foreground);
 }''';
 
-  stylesheet = parseCss(input, errors: errors..clear(),
-      opts: ['--no-colors', 'memory']);
+  stylesheet =
+      parseCss(input, errors: errors..clear(), opts: ['--no-colors', 'memory']);
 
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
@@ -854,8 +854,8 @@
   border-color: var(a3);
 }''';
 
-  var stylesheet2 = compileCss(file2Input, includes: [stylesheet1],
-      errors: errors..clear(), opts: options);
+  var stylesheet2 = compileCss(file2Input,
+      includes: [stylesheet1], errors: errors..clear(), opts: options);
   expect(stylesheet2 != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
   expect(prettyPrint(stylesheet2), generated2);
@@ -870,8 +870,8 @@
 .test-1a {
   color: #000;
 }''';
-  var styleSheet1Polyfill = compileCss(file1Input, errors: errors..clear(),
-      polyfill: true, opts: options);
+  var styleSheet1Polyfill = compileCss(file1Input,
+      errors: errors..clear(), polyfill: true, opts: options);
   expect(styleSheet1Polyfill != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
   expect(prettyPrint(styleSheet1Polyfill), generatedPolyfill1);
@@ -883,8 +883,11 @@
   background-color: #0b0;
   border-color: #fff;
 }''';
-  var styleSheet2Polyfill = compileCss(file2Input, includes: [stylesheet1],
-      errors: errors..clear(), polyfill: true, opts: options);
+  var styleSheet2Polyfill = compileCss(file2Input,
+      includes: [stylesheet1],
+      errors: errors..clear(),
+      polyfill: true,
+      opts: options);
   expect(styleSheet2Polyfill != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
   expect(prettyPrint(styleSheet2Polyfill), generatedPolyfill2);
@@ -900,8 +903,10 @@
   border-color: #fff;
 }''';
   var stylesheetPolyfill = compileCss(input,
-      includes: [stylesheet1, stylesheet2], errors: errors..clear(),
-      polyfill: true, opts: options);
+      includes: [stylesheet1, stylesheet2],
+      errors: errors..clear(),
+      polyfill: true,
+      opts: options);
 
   expect(stylesheetPolyfill != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
diff --git a/test/visitor_test.dart b/test/visitor_test.dart
index 451b687..1777748 100644
--- a/test/visitor_test.dart
+++ b/test/visitor_test.dart
@@ -43,7 +43,7 @@
   var clsVisits = new ClassVisitor(['foobar'])..visitTree(s);
   expect(clsVisits.matches, true);
 
-  in1= '''
+  in1 = '''
       .foobar1 { }
       .xyzzy .foo #my-div { color: red; }
       div.hello { font: arial; }
@@ -54,8 +54,8 @@
   expect(s != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
 
-  clsVisits =
-      new ClassVisitor(['foobar1', 'xyzzy', 'foo', 'hello'])..visitTree(s);
+  clsVisits = new ClassVisitor(['foobar1', 'xyzzy', 'foo', 'hello'])
+    ..visitTree(s);
   expect(clsVisits.matches, true);
 
   expect(prettyPrint(s), r'''
@@ -80,7 +80,7 @@
 }
 
 String polyfillPrint(String prefix, StyleSheet ss) =>
-  (new PolyfillEmitter(prefix)..visitTree(ss, pretty: true)).toString();
+    (new PolyfillEmitter(prefix)..visitTree(ss, pretty: true)).toString();
 
 void testPolyFill() {
   var errors = [];
