Fix all strong mode errors and warnings.

This is almost all:

- Adding type annotations to empty lists that are later filled. Many
  of these could be simplified by using .map(...).toList() to create
  the list instead, but I wanted to minimize my changes.
- Adding type arguments to some List annotations.

I did find one thing that I believe was a bug where a list was being
inadvertently flattened. Strong mode caught that.

R=terry@google.com

Review URL: https://codereview.chromium.org//1832993003 .
diff --git a/.analysis_options b/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b4ee9e1..7133be0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,11 @@
+## 0.13.0
+
+ * **BREAKING** Fix all [strong mode][] errors and warnings.
+   This involved adding more precise on some public APIs, which
+   is why it may break users.
+ 
+[strong mode]: https://github.com/dart-lang/dev_compiler/blob/master/STRONG_MODE.md
+
 ## 0.12.2
 
  * Fix to handle calc functions however, the expressions are treated as a
diff --git a/example/call_parser.dart b/example/call_parser.dart
index 7179a17..3ae5889 100644
--- a/example/call_parser.dart
+++ b/example/call_parser.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 
 import 'package:csslib/parser.dart' as css;
+import 'package:csslib/src/messages.dart';
 import 'package:csslib/visitor.dart';
 
 const _default = const css.PreprocessorOptions(
@@ -16,7 +17,7 @@
  * tests (by default) will ensure that the CSS is really valid.
  */
 StyleSheet parseCss(String cssInput,
-    {List errors, css.PreprocessorOptions opts}) {
+    {List<Message> errors, css.PreprocessorOptions opts}) {
   return css.parse(cssInput,
       errors: errors, options: opts == null ? _default : opts);
 }
@@ -27,7 +28,7 @@
     (emitCss..visitTree(ss, pretty: true)).toString();
 
 main() {
-  var errors = [];
+  var errors = <Message>[];
 
   // Parse a simple stylesheet.
   print('1. Good CSS, parsed CSS emitted:');
diff --git a/lib/parser.dart b/lib/parser.dart
index b3a22d6..12c9d21 100644
--- a/lib/parser.dart
+++ b/lib/parser.dart
@@ -356,7 +356,7 @@
    *    : IDENT
    */
   List<MediaQuery> processMediaQueryList() {
-    var mediaQueries = [];
+    var mediaQueries = <MediaQuery>[];
 
     bool firstTime = true;
     var mediaQuery;
@@ -409,7 +409,7 @@
       if (_peekIdentifier()) type = identifier();
     }
 
-    var exprs = [];
+    var exprs = <MediaExpression>[];
 
     if (unaryOp == -1 || unaryOp == TokenKind.MEDIA_OP_AND) {
       var andOp = false;
@@ -775,7 +775,7 @@
 
     var name = identifier();
 
-    List<VarDefinitionDirective> params = [];
+    var params = <VarDefinition>[];
     // Any parameters?
     if (_maybeEat(TokenKind.LPAREN)) {
       var mustHaveParam = false;
@@ -813,7 +813,7 @@
       if (declGroup.declarations.any((decl) {
         return decl is Declaration && decl is! IncludeMixinAtDeclaration;
       })) {
-        var newDecls = [];
+        var newDecls = <Declaration>[];
         productions.forEach((include) {
           // If declGroup has items that are declarations then we assume
           // this mixin is a declaration mixin not a top-level mixin.
@@ -943,7 +943,7 @@
       name = identifier();
     }
 
-    var params = [];
+    var params = <List<Expression>>[];
 
     // Any parameters?  Parameters can be multiple terms per argument e.g.,
     // 3px solid yellow, green is two parameters:
@@ -951,7 +951,7 @@
     //    2. green
     // the first has 3 terms and the second has 1 term.
     if (_maybeEat(TokenKind.LPAREN)) {
-      var terms = [];
+      var terms = <Expression>[];
       var expr;
       var keepGoing = true;
       while (keepGoing && (expr = processTerm()) != null) {
@@ -1041,8 +1041,8 @@
 
     if (checkBrace) _eat(TokenKind.LBRACE);
 
-    List decls = [];
-    List dartStyles = []; // List of latest styles exposed to Dart.
+    var decls = <TreeNode>[];
+    var dartStyles = []; // List of latest styles exposed to Dart.
 
     do {
       var selectorGroup = _nestedSelector();
@@ -1093,7 +1093,7 @@
   }
 
   List<DeclarationGroup> processMarginsDeclarations() {
-    List groups = [];
+    var groups = <DeclarationGroup>[];
 
     var start = _peekToken.span;
 
@@ -1487,7 +1487,7 @@
   processSelectorExpression() {
     var start = _peekToken.span;
 
-    var expressions = [];
+    var expressions = <Expression>[];
 
     Token termToken;
     var value;
@@ -2269,7 +2269,8 @@
           }
 
           var param = expr.expressions[0];
-          var varUsage = new VarUsage(param.text, [], _makeSpan(start));
+          var varUsage = new VarUsage(
+              (param as LiteralTerm).text, [], _makeSpan(start));
           expr.expressions[0] = varUsage;
           return expr.expressions;
         }
@@ -2543,11 +2544,11 @@
           _error("too many parameters to var()", _peekToken.span);
         }
 
-        var paramName = expr.expressions[0].text;
+        var paramName = (expr.expressions[0] as LiteralTerm).text;
 
         // [0] - var name, [1] - OperatorComma, [2] - default value.
-        var defaultValues =
-            expr.expressions.length >= 3 ? expr.expressions.sublist(2) : [];
+        var defaultValues = expr.expressions.length >= 3
+            ? expr.expressions.sublist(2) : <Expression>[];
         return new VarUsage(paramName, defaultValues, _makeSpan(start));
       default:
         var expr = processExpr();
diff --git a/lib/src/analyzer.dart b/lib/src/analyzer.dart
index fc27ceb..4d3e3c8 100644
--- a/lib/src/analyzer.dart
+++ b/lib/src/analyzer.dart
@@ -243,7 +243,7 @@
     var selectors = node.selectorGroup.selectors;
 
     // Create a merged set of previous parent selectors and current selectors.
-    var newSelectors = [];
+    var newSelectors = <Selector>[];
     for (Selector selector in selectors) {
       for (Selector nestedSelector in nestedSelectors) {
         var seq = _mergeNestedSelector(nestedSelector.simpleSelectorSequences,
@@ -267,7 +267,7 @@
     // the parent selector is pre-pended to the current selector.
     var hasThis = current.any((s) => s.simpleSelector.isThis);
 
-    var newSequence = [];
+    var newSequence = <SimpleSelectorSequence>[];
 
     if (!hasThis) {
       // If no & in the sector group then prefix with the parent selector.
@@ -302,7 +302,7 @@
       List<SimpleSelectorSequence> sequences) {
     if (sequences.isEmpty) return sequences;
 
-    var newSequences = [];
+    var newSequences = <SimpleSelectorSequence>[];
     var first = sequences.first;
     newSequences.add(new SimpleSelectorSequence(
         first.simpleSelector, first.span, TokenKind.COMBINATOR_DESCENDANT));
@@ -592,7 +592,7 @@
    * Given a mixin's defined arguments return a cloned mixin defintion that has
    * replaced all defined arguments with user's supplied VarUsages.
    */
-  MixinDefinition transform(List callArgs) {
+  MixinDefinition transform(List<List<Expression>> callArgs) {
     // TODO(terry): Handle default arguments and varArgs.
     // Transform mixin with callArgs.
     for (var index = 0; index < _definedArgs.length; index++) {
@@ -628,11 +628,11 @@
   }
 
   /** Rip apart var def with multiple parameters. */
-  List<List<TreeNode>> _varDefsAsCallArgs(var callArg) {
-    var defArgs = [];
+  List<List<Expression>> _varDefsAsCallArgs(var callArg) {
+    var defArgs = <List<Expression>>[];
     if (callArg is List && callArg[0] is VarUsage) {
       var varDef = varDefs[callArg[0].name];
-      var expressions = varDef.expression.expressions;
+      var expressions = (varDef.expression as Expressions).expressions;
       assert(expressions.length > 1);
       for (var expr in expressions) {
         if (expr is! OperatorComma) {
@@ -756,11 +756,11 @@
           // We're a list of @include(s) inside of a mixin ruleset - convert
           // to a list of IncludeMixinAtDeclaration(s).
           var origRulesets = mixinDef.rulesets;
-          var rulesets = [];
+          var rulesets = <Declaration>[];
           if (origRulesets.every((ruleset) => ruleset is IncludeDirective)) {
             origRulesets.forEach((ruleset) {
-              rulesets
-                  .add(new IncludeMixinAtDeclaration(ruleset, ruleset.span));
+              rulesets.add(new IncludeMixinAtDeclaration(
+                  ruleset as IncludeDirective, ruleset.span));
             });
             _IncludeReplacer.replace(_styleSheet, node, rulesets);
           }
@@ -841,7 +841,7 @@
 /** @include as a top-level with ruleset(s). */
 class _IncludeReplacer extends Visitor {
   final _include;
-  final List<Declaration> _newDeclarations;
+  final List<TreeNode> _newDeclarations;
   bool _foundAndReplaced = false;
 
   /**
@@ -849,7 +849,7 @@
    * with the [newRules].
    */
   static void replace(
-      StyleSheet ss, var include, List<Declaration> newDeclarations) {
+      StyleSheet ss, var include, List<TreeNode> newDeclarations) {
     var visitor = new _IncludeReplacer(include, newDeclarations);
     visitor.visitStyleSheet(ss);
   }
diff --git a/lib/src/polyfill.dart b/lib/src/polyfill.dart
index b18abd1..69f9e6d 100644
--- a/lib/src/polyfill.dart
+++ b/lib/src/polyfill.dart
@@ -170,7 +170,7 @@
   }
 
   List<Expression> resolveUsageTerminal(VarUsage usage) {
-    var result = [];
+    var result = <Expression>[];
 
     var varDef = _knownVarDefs[usage.name];
     var expressions;
diff --git a/lib/src/property.dart b/lib/src/property.dart
index c2cf776..b4beaee 100644
--- a/lib/src/property.dart
+++ b/lib/src/property.dart
@@ -1232,4 +1232,4 @@
   num get height => (top != null ? top : 0) + (bottom != null ? bottom : 0);
 }
 
-_mergeVal(x, y) => y != null ? y : x;
+/*=T*/ _mergeVal/*<T>*/(/*=T*/ x, /*=T*/ y) => y != null ? y : x;
diff --git a/lib/src/tokenizer.dart b/lib/src/tokenizer.dart
index d423104..bc00fee 100644
--- a/lib/src/tokenizer.dart
+++ b/lib/src/tokenizer.dart
@@ -260,7 +260,7 @@
   Token finishIdentifier() {
     // If we encounter an escape sequence, remember it so we can post-process
     // to unescape.
-    var chars = [];
+    var chars = <int>[];
 
     // backup so we can start with the first character
     int validateFrom = _index;
diff --git a/lib/src/tree.dart b/lib/src/tree.dart
index ba8370e..ded846d 100644
--- a/lib/src/tree.dart
+++ b/lib/src/tree.dart
@@ -421,7 +421,7 @@
       : super(span);
 
   ImportDirective clone() {
-    var cloneMediaQueries = [];
+    var cloneMediaQueries = <MediaQuery>[];
     for (var mediaQuery in mediaQueries) {
       cloneMediaQueries.add(mediaQuery.clone());
     }
@@ -483,7 +483,7 @@
       TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary).toUpperCase();
 
   MediaQuery clone() {
-    var cloneExpressions = [];
+    var cloneExpressions = <MediaExpression>[];
     for (var expr in expressions) {
       cloneExpressions.add(expr.clone());
     }
@@ -500,11 +500,11 @@
       : super(span);
 
   MediaDirective clone() {
-    var cloneQueries = [];
+    var cloneQueries = <MediaQuery>[];
     for (var mediaQuery in mediaQueries) {
       cloneQueries.add(mediaQuery.clone());
     }
-    var cloneRulesets = [];
+    var cloneRulesets = <RuleSet>[];
     for (var ruleset in rulesets) {
       cloneRulesets.add(ruleset.clone());
     }
@@ -520,7 +520,7 @@
   HostDirective(this.rulesets, SourceSpan span) : super(span);
 
   HostDirective clone() {
-    var cloneRulesets = [];
+    var cloneRulesets = <RuleSet>[];
     for (var ruleset in rulesets) {
       cloneRulesets.add(ruleset.clone());
     }
@@ -540,7 +540,7 @@
       : super(span);
 
   PageDirective clone() {
-    var cloneDeclsMargin = [];
+    var cloneDeclsMargin = <DeclarationGroup>[];
     for (var declMargin in _declsMargin) {
       cloneDeclsMargin.add(declMargin.clone());
     }
@@ -635,7 +635,7 @@
   bool get isExtension => true;
 
   StyletDirective clone() {
-    var cloneRulesets = [];
+    var cloneRulesets = <RuleSet>[];
     for (var ruleset in rulesets) {
       cloneRulesets.add(ruleset.clone());
     }
@@ -675,14 +675,14 @@
 
 class MixinDefinition extends Directive {
   final String name;
-  final List definedArgs;
+  final List<TreeNode> definedArgs;
   final bool varArgs;
 
   MixinDefinition(this.name, this.definedArgs, this.varArgs, SourceSpan span)
       : super(span);
 
   MixinDefinition clone() {
-    var cloneDefinedArgs = [];
+    var cloneDefinedArgs = <TreeNode>[];
     for (var definedArg in definedArgs) {
       cloneDefinedArgs.add(definedArg.clone());
     }
@@ -694,18 +694,18 @@
 
 /** Support a Sass @mixin. See http://sass-lang.com for description. */
 class MixinRulesetDirective extends MixinDefinition {
-  final List rulesets;
+  final List<TreeNode> rulesets;
 
-  MixinRulesetDirective(String name, List<VarDefinitionDirective> args,
+  MixinRulesetDirective(String name, List<VarDefinition> args,
       bool varArgs, this.rulesets, SourceSpan span)
       : super(name, args, varArgs, span);
 
   MixinRulesetDirective clone() {
-    var clonedArgs = [];
+    var clonedArgs = <VarDefinition>[];
     for (var arg in definedArgs) {
       clonedArgs.add(arg.clone());
     }
-    var clonedRulesets = [];
+    var clonedRulesets = <TreeNode>[];
     for (var ruleset in rulesets) {
       clonedRulesets.add(ruleset.clone());
     }
@@ -719,12 +719,12 @@
 class MixinDeclarationDirective extends MixinDefinition {
   final DeclarationGroup declarations;
 
-  MixinDeclarationDirective(String name, List<VarDefinitionDirective> args,
+  MixinDeclarationDirective(String name, List<TreeNode> args,
       bool varArgs, this.declarations, SourceSpan span)
       : super(name, args, varArgs, span);
 
   MixinDeclarationDirective clone() {
-    var clonedArgs = [];
+    var clonedArgs = <TreeNode>[];
     for (var arg in definedArgs) {
       clonedArgs.add(arg.clone());
     }
@@ -738,16 +738,14 @@
 /** To support consuming a SASS mixin @include. */
 class IncludeDirective extends Directive {
   final String name;
-  final List<List<TreeNode>> args;
+  final List<List<Expression>> args;
 
   IncludeDirective(this.name, this.args, SourceSpan span) : super(span);
 
   IncludeDirective clone() {
-    var cloneArgs = [];
+    var cloneArgs = <List<Expression>>[];
     for (var arg in args) {
-      for (var term in arg) {
-        cloneArgs.add(term.clone());
-      }
+      cloneArgs.add(arg.map((term) => term.clone()).toList());
     }
     return new IncludeDirective(name, cloneArgs, span);
   }
@@ -852,7 +850,7 @@
 
 class DeclarationGroup extends TreeNode {
   /** Can be either Declaration or RuleSet (if nested selector). */
-  final List declarations;
+  final List<TreeNode> declarations;
 
   DeclarationGroup(this.declarations, SourceSpan span) : super(span);
 
@@ -867,10 +865,10 @@
 class MarginGroup extends DeclarationGroup {
   final int margin_sym; // TokenType for for @margin sym.
 
-  MarginGroup(this.margin_sym, List<Declaration> decls, SourceSpan span)
+  MarginGroup(this.margin_sym, List<TreeNode> decls, SourceSpan span)
       : super(decls, span);
   MarginGroup clone() =>
-      new MarginGroup(margin_sym, super.clone() as dynamic, span);
+      new MarginGroup(margin_sym, super.clone().declarations, span);
   visit(VisitorBase visitor) => visitor.visitMarginGroup(this);
 }
 
@@ -881,7 +879,7 @@
   VarUsage(this.name, this.defaultValues, SourceSpan span) : super(span);
 
   VarUsage clone() {
-    var clonedValues = [];
+    var clonedValues = <Expression>[];
     for (var expr in defaultValues) {
       clonedValues.add(expr.clone());
     }
diff --git a/pubspec.yaml b/pubspec.yaml
index 96f403e..8a9507e 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: csslib
-version: 0.12.2
+version: 0.13.0-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 f92ea82..9a6a584 100644
--- a/test/big_1_test.dart
+++ b/test/big_1_test.dart
@@ -4,11 +4,12 @@
 
 library big_1_test;
 
+import 'package:csslib/src/messages.dart';
 import 'package:test/test.dart';
 import 'testing.dart';
 
 compilePolyfillAndValidate(String input, String generated) {
-  var errors = [];
+  var errors = <Message>[];
   var stylesheet = polyFillCompileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
diff --git a/test/compiler_test.dart b/test/compiler_test.dart
index df5a44a..5faabe2 100644
--- a/test/compiler_test.dart
+++ b/test/compiler_test.dart
@@ -7,11 +7,12 @@
 import 'dart:convert';
 import 'package:test/test.dart';
 import 'package:csslib/parser.dart';
+import 'package:csslib/src/messages.dart';
 import 'package:csslib/visitor.dart';
 import 'testing.dart';
 
 void testClass() {
-  var errors = [];
+  var errors = <Message>[];
   var input = ".foobar {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -24,7 +25,7 @@
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
 
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -37,7 +38,7 @@
 }
 
 void testClass2() {
-  var errors = [];
+  var errors = <Message>[];
   var input = ".foobar .bar .no-story {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -49,7 +50,7 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -73,7 +74,7 @@
 }
 
 void testId() {
-  var errors = [];
+  var errors = <Message>[];
   var input = "#elemId {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -85,7 +86,7 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -99,7 +100,7 @@
 }
 
 void testElement() {
-  var errors = [];
+  var errors = <Message>[];
   var input = "div {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -111,7 +112,7 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -160,7 +161,7 @@
 }
 
 void testNamespace() {
-  var errors = [];
+  var errors = <Message>[];
   var input = "ns1|div {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -172,15 +173,15 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
   var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences;
 
   expect(simpleSeqs.length, 1);
-  var simpSelector = simpleSeqs[0].simpleSelector;
-  expect(simpSelector is NamespaceSelector, true);
+  expect(simpleSeqs[0].simpleSelector is NamespaceSelector, true);
+  var simpSelector = simpleSeqs[0].simpleSelector as NamespaceSelector;
   expect(simpleSeqs[0].isCombinatorNone, true);
   expect(simpSelector.isNamespaceWildcard, false);
   expect(simpSelector.namespace, "ns1");
@@ -191,7 +192,7 @@
 }
 
 void testNamespace2() {
-  var errors = [];
+  var errors = <Message>[];
   var input = "ns1|div div ns2|span .foobar {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -203,7 +204,7 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -211,8 +212,8 @@
 
   expect(simpleSeqs.length, 4);
 
-  var simpSelector0 = simpleSeqs[0].simpleSelector;
-  expect(simpSelector0 is NamespaceSelector, true);
+  expect(simpleSeqs[0].simpleSelector is NamespaceSelector, true);
+  var simpSelector0 = simpleSeqs[0].simpleSelector as NamespaceSelector;
   expect(simpleSeqs[0].isCombinatorNone, true);
   expect(simpSelector0.namespace, "ns1");
   var elementSelector0 = simpSelector0.nameAsSimpleSelector;
@@ -225,8 +226,8 @@
   expect(simpleSeqs[1].isCombinatorDescendant, true);
   expect(simpSelector1.name, "div");
 
-  var simpSelector2 = simpleSeqs[2].simpleSelector;
-  expect(simpSelector2 is NamespaceSelector, true);
+  expect(simpleSeqs[2].simpleSelector is NamespaceSelector, true);
+  var simpSelector2 = simpleSeqs[2].simpleSelector as NamespaceSelector;
   expect(simpleSeqs[2].isCombinatorDescendant, true);
   expect(simpSelector2.namespace, "ns2");
   var elementSelector2 = simpSelector2.nameAsSimpleSelector;
@@ -241,7 +242,7 @@
 }
 
 void testSelectorGroups() {
-  var errors = [];
+  var errors = <Message>[];
   var input =
       "div, .foobar ,#elemId, .xyzzy .test, ns1|div div #elemId .foobar {}";
   var stylesheet = parseCss(input, errors: errors);
@@ -254,7 +255,7 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 5);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -301,8 +302,8 @@
   expect(groupSelector4.simpleSelectorSequences.length, 4);
 
   var selector40 = groupSelector4.simpleSelectorSequences[0];
-  var simpleSelector40 = selector40.simpleSelector;
-  expect(simpleSelector40 is NamespaceSelector, true);
+  expect(selector40.simpleSelector is NamespaceSelector, true);
+  var simpleSelector40 = selector40.simpleSelector as NamespaceSelector;
   expect(selector40.isCombinatorNone, true);
   expect(simpleSelector40.namespace, "ns1");
   var elementSelector = simpleSelector40.nameAsSimpleSelector;
@@ -329,7 +330,7 @@
 }
 
 void testCombinator() {
-  var errors = [];
+  var errors = <Message>[];
   var input = ".foobar > .bar + .no-story ~ myNs|div #elemId {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -341,7 +342,7 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -368,8 +369,8 @@
   expect(simpleSelector2.name, "no-story");
 
   var selector3 = simpleSeqs[3];
-  var simpleSelector3 = selector3.simpleSelector;
-  expect(simpleSelector3 is NamespaceSelector, true);
+  expect(selector3.simpleSelector is NamespaceSelector, true);
+  var simpleSelector3 = selector3.simpleSelector as NamespaceSelector;
   expect(selector3.isCombinatorTilde, true);
   expect(simpleSelector3.namespace, "myNs");
   var elementSelector = simpleSelector3.nameAsSimpleSelector;
@@ -385,7 +386,7 @@
 }
 
 void testWildcard() {
-  var errors = [];
+  var errors = <Message>[];
   var input = "* {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -397,7 +398,7 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -429,12 +430,14 @@
 
   expect(simpleSeqs.length, 2);
 
-  var selector0 = simpleSeqs[0];
-  var simpleSelector0 = selector0.simpleSelector;
-  expect(simpleSelector0 is ElementSelector, true);
-  expect(selector0.isCombinatorNone, true);
-  expect(simpleSelector0.isWildcard, true);
-  expect(simpleSelector0.name, "*");
+  {
+    var selector0 = simpleSeqs[0];
+    var simpleSelector0 = selector0.simpleSelector;
+    expect(simpleSelector0 is ElementSelector, true);
+    expect(selector0.isCombinatorNone, true);
+    expect(simpleSelector0.isWildcard, true);
+    expect(simpleSelector0.name, "*");
+  }
 
   var selector1 = simpleSeqs[1];
   var simpleSelector1 = selector1.simpleSelector;
@@ -461,15 +464,17 @@
 
   expect(simpleSeqs.length, 2);
 
-  selector0 = simpleSeqs[0];
-  simpleSelector0 = selector0.simpleSelector;
-  expect(simpleSelector0 is NamespaceSelector, true);
-  expect(selector0.isCombinatorNone, true);
-  expect(simpleSelector0.isNamespaceWildcard, false);
-  var elementSelector = simpleSelector0.nameAsSimpleSelector;
-  expect("myNs", simpleSelector0.namespace);
-  expect(elementSelector.isWildcard, true);
-  expect("*", elementSelector.name);
+  {
+    var selector0 = simpleSeqs[0];
+    expect(selector0.simpleSelector is NamespaceSelector, true);
+    var simpleSelector0 = selector0.simpleSelector as NamespaceSelector;
+    expect(selector0.isCombinatorNone, true);
+    expect(simpleSelector0.isNamespaceWildcard, false);
+    var elementSelector = simpleSelector0.nameAsSimpleSelector;
+    expect("myNs", simpleSelector0.namespace);
+    expect(elementSelector.isWildcard, true);
+    expect("*", elementSelector.name);
+  }
 
   selector1 = simpleSeqs[1];
   simpleSelector1 = selector1.simpleSelector;
@@ -494,15 +499,17 @@
 
   expect(simpleSeqs.length, 2);
 
-  selector0 = simpleSeqs[0];
-  simpleSelector0 = selector0.simpleSelector;
-  expect(simpleSelector0 is NamespaceSelector, true);
-  expect(selector0.isCombinatorNone, true);
-  expect(simpleSelector0.isNamespaceWildcard, true);
-  expect("*", simpleSelector0.namespace);
-  elementSelector = simpleSelector0.nameAsSimpleSelector;
-  expect(elementSelector.isWildcard, true);
-  expect("*", elementSelector.name);
+  {
+    var selector0 = simpleSeqs[0];
+    expect(selector0.simpleSelector is NamespaceSelector, true);
+    var simpleSelector0 = selector0.simpleSelector as NamespaceSelector;
+    expect(selector0.isCombinatorNone, true);
+    expect(simpleSelector0.isNamespaceWildcard, true);
+    expect("*", simpleSelector0.namespace);
+    var elementSelector = simpleSelector0.nameAsSimpleSelector;
+    expect(elementSelector.isWildcard, true);
+    expect("*", elementSelector.name);
+  }
 
   selector1 = simpleSeqs[1];
   simpleSelector1 = selector1.simpleSelector;
@@ -513,7 +520,7 @@
 
 /** Test List<int> as input to parser. */
 void testArrayOfChars() {
-  var errors = [];
+  var errors = <Message>[];
   var input = '<![CDATA[.foo { '
       'color: red; left: 20px; top: 20px; width: 100px; height:200px'
       '}'
@@ -541,7 +548,7 @@
 }
 
 void testPseudo() {
-  var errors = [];
+  var errors = <Message>[];
 
   final input = r'''
 html:lang(fr-ca) { quotes: '" ' ' "' }
@@ -643,7 +650,7 @@
 }
 
 void testHost() {
-  var errors = [];
+  var errors = <Message>[];
   var input = '@host { '
       ':scope {'
       'white-space: nowrap;'
@@ -678,7 +685,7 @@
 }
 
 void testStringEscape() {
-  var errors = [];
+  var errors = <Message>[];
   var input = r'''a { foo: '{"text" : "a\\\""}' }''';
   var stylesheet = parseCss(input, errors: errors, opts: simpleOptions);
   expect(stylesheet != null, true);
@@ -692,7 +699,7 @@
 
 // TODO(terry): Move to emitter_test.dart when real emitter exist.
 void testEmitter() {
-  var errors = [];
+  var errors = <Message>[];
   var input = '.foo { '
       'color: red; left: 20px; top: 20px; width: 100px; height:200px'
       '}'
diff --git a/test/declaration_test.dart b/test/declaration_test.dart
index de589d7..a553522 100644
--- a/test/declaration_test.dart
+++ b/test/declaration_test.dart
@@ -4,12 +4,14 @@
 
 library declaration_test;
 
+import 'package:csslib/src/messages.dart';
+import 'package:csslib/visitor.dart';
 import 'package:test/test.dart';
 
 import 'testing.dart';
 
 void testSimpleTerms() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 @ import url("test.css");
 .foo {
@@ -64,7 +66,7 @@
  * no quotes.  Hex values with # and letters, and functions (rgba, url, etc.)
  */
 void testDeclarations() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 .more {
   color: white;
@@ -102,7 +104,7 @@
 }
 
 void testIdentifiers() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 #da {
   height: 100px;
@@ -129,7 +131,7 @@
 }
 
 void testComposites() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 .xyzzy {
   border: 10px 80px 90px 100px;
@@ -158,7 +160,7 @@
 }
 
 void testUnits() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 #id-1 {
   transition: color 0.4s;
@@ -242,7 +244,7 @@
 }
 
 void testUnicode() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 .toggle:after {
   content: '✔';
@@ -270,7 +272,7 @@
 }
 
 void testNewerCss() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 @media screen,print {
   .foobar_screen {
@@ -317,7 +319,7 @@
 }
 
 void testMediaQueries() {
-  var errors = [];
+  var errors = <Message>[];
   String input = '''
 @media screen and (-webkit-min-device-pixel-ratio:0) {
   .todo-item .toggle {
@@ -435,7 +437,7 @@
 }
 
 void testFontFace() {
-  var errors = [];
+  var errors = <Message>[];
 
   final String input = '''
 @font-face {
@@ -527,7 +529,7 @@
 }
 
 void testCssFile() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 @import 'simple.css'
 @import "test.css" print
@@ -591,7 +593,7 @@
 }
 
 void testCompactEmitter() {
-  var errors = [];
+  var errors = <Message>[];
 
   // Check !import compactly emitted.
   final String input = r'''
@@ -619,7 +621,7 @@
 }
 
 void testNotSelectors() {
-  var errors = [];
+  var errors = <Message>[];
 
   final String input = r'''
 .details:not(.open-details) x-element,
@@ -709,7 +711,7 @@
 }
 
 void testIE() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = ".test {\n"
       "  filter: progid:DXImageTransform.Microsoft.gradient"
       "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n"
@@ -785,7 +787,7 @@
  *        background: red\9;
  */
 void testIEDeclaration() {
-  var errors = [];
+  var errors = <Message>[];
 
   final input = '''
 .testIE-6 {
@@ -951,7 +953,7 @@
 }
 
 void testHangs() {
-  var errors = [];
+  var errors = <Message>[];
 
   // Bad hexvalue had caused a hang in processTerm.
   final input = r'''#a { color: #ebebeburl(0/IE8+9+); }''';
@@ -1008,36 +1010,48 @@
 void testExpressionSpans() {
   final input = r'''.foo { width: 50px; }''';
   var stylesheet = parseCss(input);
-  var decl = stylesheet.topLevels.single.declarationGroup.declarations.single;
+  var decl = (stylesheet.topLevels.single as RuleSet)
+      .declarationGroup
+      .declarations
+      .single;
   // This passes
   expect(decl.span.text, 'width: 50px');
   // This currently fails
-  expect(decl.expression.span.text, '50px');
+  expect((decl as Declaration).expression.span.text, '50px');
 }
 
 void simpleCalc() {
   final input = r'''.foo { height: calc(100% - 55px); }''';
   var stylesheet = parseCss(input);
-  var decl = stylesheet.topLevels.single.declarationGroup.declarations.single;
+  var decl = (stylesheet.topLevels.single as RuleSet)
+      .declarationGroup
+      .declarations
+      .single;
   expect(decl.span.text, 'height: calc(100% - 55px)');
 }
 
 void complexCalc() {
   final input = r'''.foo { left: calc((100%/3 - 2) * 1em - 2 * 1px); }''';
   var stylesheet = parseCss(input);
-  var decl = stylesheet.topLevels.single.declarationGroup.declarations.single;
+  var decl = (stylesheet.topLevels.single as RuleSet)
+      .declarationGroup
+      .declarations
+      .single;
   expect(decl.span.text, 'left: calc((100%/3 - 2) * 1em - 2 * 1px)');
 }
 
 void twoCalcs() {
   final input = r'''.foo { margin: calc(1rem - 2px) calc(1rem - 1px); }''';
   var stylesheet = parseCss(input);
-  var decl = stylesheet.topLevels.single.declarationGroup.declarations.single;
+  var decl = (stylesheet.topLevels.single as RuleSet)
+      .declarationGroup
+      .declarations
+      .single;
   expect(decl.span.text, 'margin: calc(1rem - 2px) calc(1rem - 1px)');
 }
 
 void selectorWithCalcs() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 .foo {
   width: calc(1em + 5 * 2em);
@@ -1079,7 +1093,7 @@
   test('Hanging bugs', testHangs);
   test('Expression spans', testExpressionSpans,
       skip: 'expression spans are broken'
-            ' (https://github.com/dart-lang/csslib/issues/15)');
+          ' (https://github.com/dart-lang/csslib/issues/15)');
   group('calc function', () {
     test('simple calc', simpleCalc);
     test('single complex', complexCalc);
@@ -1087,4 +1101,3 @@
     test('selector with many calc declarations', selectorWithCalcs);
   });
 }
-
diff --git a/test/error_test.dart b/test/error_test.dart
index fc9ecf6..9815b1b 100644
--- a/test/error_test.dart
+++ b/test/error_test.dart
@@ -13,7 +13,7 @@
  * Test for unsupported font-weights values of bolder, lighter and inherit.
  */
 void testUnsupportedFontWeights() {
-  var errors = [];
+  var errors = <Message>[];
 
   // TODO(terry): Need to support bolder.
   // font-weight value bolder.
@@ -70,7 +70,7 @@
  * inherit.
  */
 void testUnsupportedLineHeights() {
-  var errors = [];
+  var errors = <Message>[];
 
   // line-height value in percentge unit.
   var input = ".foobar { line-height: 120%; }";
@@ -122,7 +122,7 @@
 
 /** Test for bad selectors. */
 void testBadSelectors() {
-  var errors = [];
+  var errors = <Message>[];
 
   // Invalid id selector.
   var input = "# foo { color: #ff00ff; }";
@@ -157,7 +157,7 @@
 
 /** Test for bad hex values. */
 void testBadHexValues() {
-  var errors = [];
+  var errors = <Message>[];
 
   // Invalid hex value.
   var input = ".foobar { color: #AH787; }";
@@ -227,7 +227,7 @@
 }
 
 void testBadUnicode() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = '''
 @font-face {
   src: url(fonts/BBCBengali.ttf) format("opentype");
@@ -259,7 +259,7 @@
 }
 
 void testBadNesting() {
-  var errors = [];
+  var errors = <Message>[];
 
   // Test for bad declaration in a nested rule.
   final String input = '''
diff --git a/test/extend_test.dart b/test/extend_test.dart
index 49c8a9c..afec062 100644
--- a/test/extend_test.dart
+++ b/test/extend_test.dart
@@ -4,12 +4,13 @@
 
 library extend_test;
 
+import 'package:csslib/src/messages.dart';
 import 'package:test/test.dart';
 
 import 'testing.dart';
 
 compileAndValidate(String input, String generated) {
-  var errors = [];
+  var errors = <Message>[];
   var stylesheet = compileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
diff --git a/test/mixin_test.dart b/test/mixin_test.dart
index c94c9c0..71dcc50 100644
--- a/test/mixin_test.dart
+++ b/test/mixin_test.dart
@@ -4,12 +4,13 @@
 
 library mixin_test;
 
+import 'package:csslib/src/messages.dart';
 import 'package:test/test.dart';
 
 import 'testing.dart';
 
 compileAndValidate(String input, String generated) {
-  var errors = [];
+  var errors = <Message>[];
   var stylesheet = compileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
@@ -17,7 +18,7 @@
 }
 
 compilePolyfillAndValidate(String input, String generated) {
-  var errors = [];
+  var errors = <Message>[];
   var stylesheet = polyFillCompileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
@@ -413,7 +414,7 @@
 }
 
 void badDeclarationInclude() {
-  final errors = [];
+  final errors = <Message>[];
   final input = r'''
 @mixin a {
   #foo-id {
@@ -441,7 +442,7 @@
 }
 
 void badTopInclude() {
-  final errors = [];
+  final errors = <Message>[];
   final input = r'''
 @mixin b {
   color: red;
@@ -467,7 +468,7 @@
 }
 
 void emptyMixin() {
-  final errors = [];
+  final errors = <Message>[];
   final input = r'''
 @mixin a {
 }
@@ -492,7 +493,7 @@
 }
 
 void undefinedTopLevel() {
-  final errors = [];
+  final errors = <Message>[];
   final input = r'''
 @mixin a {
   @include b;
@@ -520,7 +521,7 @@
 }
 
 void undefinedDeclaration() {
-  final errors = [];
+  final errors = <Message>[];
   final input = r'''
 @mixin a {
   @include b;
@@ -578,7 +579,7 @@
   color: #f00;
 }''');
 
-  var errors = [];
+  var errors = <Message>[];
   var input = r'''
 @mixin a {
   foo { color: red }
diff --git a/test/nested_test.dart b/test/nested_test.dart
index 1848ef1..a5cadab 100644
--- a/test/nested_test.dart
+++ b/test/nested_test.dart
@@ -4,12 +4,13 @@
 
 library nested_test;
 
+import 'package:csslib/src/messages.dart';
 import 'package:test/test.dart';
 
 import 'testing.dart';
 
 compileAndValidate(String input, String generated) {
-  var errors = [];
+  var errors = <Message>[];
   var stylesheet = compileCss(input, errors: errors, opts: simpleOptions);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
diff --git a/test/selector_test.dart b/test/selector_test.dart
index aefab16..6249d31 100644
--- a/test/selector_test.dart
+++ b/test/selector_test.dart
@@ -5,12 +5,13 @@
 library selector_test;
 
 import 'package:csslib/parser.dart';
+import 'package:csslib/src/messages.dart';
 import 'package:test/test.dart';
 
 import 'testing.dart';
 
 void testSelectorSuccesses() {
-  var errors = [];
+  var errors = <Message>[];
   var selectorAst = selector('#div .foo', errors: errors);
   expect(errors.isEmpty, true, reason: errors.toString());
   expect('#div .foo', compactOuptut(selectorAst));
@@ -50,7 +51,7 @@
 // TODO(terry): Move this failure case to a failure_test.dart when the analyzer
 //              and validator exit then they'll be a bunch more checks.
 void testSelectorFailures() {
-  var errors = [];
+  var errors = <Message>[];
 
   // Test for invalid class name (can't start with number).
   selector('.foobar .1a-story .xyzzy', errors: errors);
diff --git a/test/var_test.dart b/test/var_test.dart
index d47fd78..c75de56 100644
--- a/test/var_test.dart
+++ b/test/var_test.dart
@@ -4,12 +4,13 @@
 
 library var_test;
 
+import 'package:csslib/src/messages.dart';
 import 'package:test/test.dart';
 
 import 'testing.dart';
 
 compileAndValidate(String input, String generated) {
-  var errors = [];
+  var errors = <Message>[];
   var stylesheet = compileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
@@ -17,7 +18,7 @@
 }
 
 compilePolyfillAndValidate(String input, String generated) {
-  var errors = [];
+  var errors = <Message>[];
   var stylesheet = polyFillCompileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
@@ -340,7 +341,7 @@
 }
 
 void undefinedVars() {
-  final errors = [];
+  final errors = <Message>[];
   final input = ''':root {
   var-color-background: red;
   var-color-foreground: blue;
@@ -622,7 +623,7 @@
 }
 
 testVar() {
-  final errors = [];
+  final errors = <Message>[];
   final input = '''
 @color-background: red;
 @color-foreground: blue;
@@ -676,7 +677,7 @@
 }
 
 testLess() {
-  final errors = [];
+  final errors = <Message>[];
   final input = '''
 @color-background: red;
 @color-foreground: blue;
@@ -772,7 +773,7 @@
 }
 
 void includes() {
-  var errors = [];
+  var errors = <Message>[];
   var file1Input = r'''
 :root {
   var-redef: #0f0;
diff --git a/test/visitor_test.dart b/test/visitor_test.dart
index 803b106..02784c4 100644
--- a/test/visitor_test.dart
+++ b/test/visitor_test.dart
@@ -4,6 +4,7 @@
 
 library visitor_test;
 
+import 'package:csslib/src/messages.dart';
 import 'package:csslib/visitor.dart';
 import 'package:test/test.dart';
 
@@ -33,7 +34,7 @@
 }
 
 void testClassVisitors() {
-  var errors = [];
+  var errors = <Message>[];
   var in1 = '.foobar { }';
 
   var s = parseCss(in1, errors: errors);
@@ -84,7 +85,7 @@
     (new PolyfillEmitter(prefix)..visitTree(ss, pretty: true)).toString();
 
 void testPolyFill() {
-  var errors = [];
+  var errors = <Message>[];
   final input = r'''
 .foobar { }
 div.xyzzy { }