diff --git a/lib/parser.dart b/lib/parser.dart
index e0aa338..25c329d 100644
--- a/lib/parser.dart
+++ b/lib/parser.dart
@@ -812,7 +812,6 @@
       }
 
       var declGroup = processDeclarations(checkBrace: false);
-      var decls = [];
       if (declGroup.declarations.any((decl) {
         return decl is Declaration && decl is! IncludeMixinAtDeclaration;
       })) {
@@ -881,7 +880,7 @@
     // sign and the directive name.  Technically, it's not valid grammar but
     // a number of CSS tests test for whitespace between @ and name.
     if (tokId == TokenKind.AT) {
-      Token tok = _next();
+      _next();
       tokId = _peek();
       if (_peekIdentifier()) {
         // Is it a directive?
@@ -1847,7 +1846,6 @@
         }
         break;
       case _lineHeightPart:
-        num lineHeight;
         if (exprs.expressions.length == 1) {
           var expr = exprs.expressions[0];
           if (expr is UnitTerm) {
@@ -2645,13 +2643,10 @@
   }
 
   FontExpression processFont() {
-    List<String> family;
-
     // Process all parts of the font expression.
     FontExpression fontSize;
     FontExpression fontFamily;
     for (; _index < _exprs.expressions.length; _index++) {
-      var expr = _exprs.expressions[_index];
       // Order is font-size font-family
       if (fontSize == null) {
         fontSize = processFontSize();
diff --git a/lib/src/analyzer.dart b/lib/src/analyzer.dart
index 1341bc2..4fdd833 100644
--- a/lib/src/analyzer.dart
+++ b/lib/src/analyzer.dart
@@ -596,7 +596,6 @@
   MixinDefinition transform(List callArgs) {
     // TODO(terry): Handle default arguments and varArgs.
     // Transform mixin with callArgs.
-    var index = 0;
     for (var index = 0; index < _definedArgs.length; index++) {
       var definedArg = _definedArgs[index];
       VarDefinition varDef;
@@ -908,7 +907,6 @@
       new Map<String, List<SelectorGroup>>();
 
   SelectorGroup _currSelectorGroup;
-  List _currDecls;
   int _currDeclIndex;
   List<int> _extendsToRemove = [];
 
diff --git a/lib/src/property.dart b/lib/src/property.dart
index 7e12352..5d6dc14 100644
--- a/lib/src/property.dart
+++ b/lib/src/property.dart
@@ -614,6 +614,7 @@
     value += (r << 0x10);
     value += (g << 0x08);
     value += b;
+    return value;
   }
 
   Color get color => new Color.createRgba(r, g, b, a);
diff --git a/lib/src/tokenizer.dart b/lib/src/tokenizer.dart
index ed616d2..f5c5210 100644
--- a/lib/src/tokenizer.dart
+++ b/lib/src/tokenizer.dart
@@ -40,7 +40,7 @@
 
           _startIndex = _index;
           ch = _nextChar();
-          Token ident = finishIdentifier();
+          finishIdentifier();
 
           // Is it a directive?
           int tokId = TokenKind.matchDirectives(
@@ -260,7 +260,6 @@
   Token finishIdentifier() {
     // If we encounter an escape sequence, remember it so we can post-process
     // to unescape.
-    bool hasEscapedChars = false;
     var chars = [];
 
     // backup so we can start with the first character
diff --git a/lib/src/tree_printer.dart b/lib/src/tree_printer.dart
index 8cb4de8..030a868 100644
--- a/lib/src/tree_printer.dart
+++ b/lib/src/tree_printer.dart
@@ -390,8 +390,6 @@
   }
 
   void visitUnitTerm(UnitTerm node) {
-    String unitValue;
-
     output.depth++;
     output.writeValue('value', node.text);
     output.writeValue('unit', node.unitToString());
diff --git a/test/error_test.dart b/test/error_test.dart
index 363bf3d..71890cc 100644
--- a/test/error_test.dart
+++ b/test/error_test.dart
@@ -233,7 +233,7 @@
   unicode-range: U+400-200;
 }''';
 
-  var stylesheet = parseCss(input, errors: errors);
+  parseCss(input, errors: errors);
 
   expect(errors.isEmpty, false);
   expect(errors[0].toString(),
@@ -248,7 +248,7 @@
   unicode-range: U+12FFFF;
 }''';
 
-  stylesheet = parseCss(input2, errors: errors..clear());
+  parseCss(input2, errors: errors..clear());
 
   expect(errors.isEmpty, false);
   expect(errors[0].toString(),
@@ -272,7 +272,7 @@
 }
 ''';
 
-  var stylesheet = parseCss(input, errors: errors);
+  parseCss(input, errors: errors);
   expect(errors.length, 1);
   var errorMessage = messages.messages[0];
   expect(errorMessage.message, contains('Bad hex number'));
@@ -289,7 +289,7 @@
   }
 }
 ''';
-  var stylesheet2 = parseCss(input2, errors: errors..clear());
+  parseCss(input2, errors: errors..clear());
   expect(errors.length, 4);
   errorMessage = messages.messages[0];
   expect(errorMessage.message, contains(':, but found +'));
@@ -326,7 +326,7 @@
     color: #green;
 }
 ''';
-  var stylesheet3 = parseCss(input3, errors: errors..clear());
+  parseCss(input3, errors: errors..clear());
   expect(errors.length, 2);
   errorMessage = messages.messages[0];
   expect(errorMessage.message, contains('Bad hex number'));
diff --git a/test/mixin_test.dart b/test/mixin_test.dart
index 5e32723..5c5a0fc 100644
--- a/test/mixin_test.dart
+++ b/test/mixin_test.dart
@@ -458,10 +458,6 @@
 @include a;
   ''';
 
-  var generated = r'''span {
-  border: 2px dashed #f00;
-}''';
-
   var stylesheet = compileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
   expect(errors.length, 1, reason: errors.toString());
diff --git a/test/nested_test.dart b/test/nested_test.dart
index c72666e..2a46da7 100644
--- a/test/nested_test.dart
+++ b/test/nested_test.dart
@@ -195,7 +195,6 @@
 }
 
 void simpleNest() {
-  final errors = [];
   final input = '''
 div span { color: green; }
 #header {
@@ -239,7 +238,6 @@
 }
 
 void complexNest() {
-  final errors = [];
   final input = '''
 @font-face  { font-family: arial; }
 div { color: #f0f0f0; }
diff --git a/test/selector_test.dart b/test/selector_test.dart
index 43a5a35..5d687e6 100644
--- a/test/selector_test.dart
+++ b/test/selector_test.dart
@@ -52,7 +52,7 @@
   var errors = [];
 
   // Test for invalid class name (can't start with number).
-  var selectorAst = selector('.foobar .1a-story .xyzzy', errors: errors);
+  selector('.foobar .1a-story .xyzzy', errors: errors);
   expect(errors.isEmpty, false);
   expect(errors[0].toString(),
       'error on line 1, column 9: name must start with a alpha character, but '
