sort directives and other lints
diff --git a/lib/dom.dart b/lib/dom.dart
index a500481..cd2b9fb 100644
--- a/lib/dom.dart
+++ b/lib/dom.dart
@@ -267,7 +267,7 @@
     nodes.clear();
   }
 
-  bool hasChildNodes() => !nodes.isEmpty;
+  bool hasChildNodes() => nodes.isNotEmpty;
 
   bool contains(Node node) => nodes.contains(node);
 
@@ -838,7 +838,7 @@
     this[index].replaceWith(value);
   }
 
-  void set length(int newLength) {
+  set length(int newLength) {
     final len = this.length;
     if (newLength >= len) {
       return;
@@ -974,7 +974,7 @@
 
   // TODO(sigmund): this should be typed Element, but we currently run into a
   // bug where ListMixin<E>.lastIndexOf() expects Object as the argument.
-  int lastIndexOf(element, [int start = null]) {
+  int lastIndexOf(element, [int start]) {
     if (start == null) start = length - 1;
     return _filtered.lastIndexOf(element, start);
   }
diff --git a/lib/dom_parsing.dart b/lib/dom_parsing.dart
index 5575dcd..56518c2 100644
--- a/lib/dom_parsing.dart
+++ b/lib/dom_parsing.dart
@@ -128,10 +128,10 @@
 String htmlSerializeEscape(String text, {bool attributeMode: false}) {
   // TODO(jmesserly): is it faster to build up a list of codepoints?
   // StringBuffer seems cleaner assuming Dart can unbox 1-char strings.
-  StringBuffer result = null;
+  StringBuffer result;
   for (int i = 0; i < text.length; i++) {
     var ch = text[i];
-    String replace = null;
+    String replace;
     switch (ch) {
       case '&':
         replace = '&amp;';
diff --git a/lib/parser.dart b/lib/parser.dart
index 546061f..e1c6099 100644
--- a/lib/parser.dart
+++ b/lib/parser.dart
@@ -17,13 +17,13 @@
 import 'dart:math';
 import 'package:source_span/source_span.dart';
 
-import 'src/treebuilder.dart';
+import 'dom.dart';
 import 'src/constants.dart';
 import 'src/encoding_parser.dart';
 import 'src/token.dart';
 import 'src/tokenizer.dart';
+import 'src/treebuilder.dart';
 import 'src/utils.dart';
-import 'dom.dart';
 
 /// Parse the [input] html5 document into a tree. The [input] can be
 /// a [String], [List<int>] of bytes or an [HtmlTokenizer].
@@ -2092,7 +2092,7 @@
       // Step 2
       // Start of the adoption agency algorithm proper
       var afeIndex = tree.openElements.indexOf(formattingElement);
-      Node furthestBlock = null;
+      Node furthestBlock;
       for (Node element in slice(tree.openElements, afeIndex)) {
         if (specialElements.contains(getElementNameTuple(element))) {
           furthestBlock = element;
@@ -2517,7 +2517,7 @@
   Phase originalPhase;
   List<StringToken> characterTokens;
 
-  InTableTextPhase(parser)
+  InTableTextPhase(HtmlParser parser)
       : characterTokens = <StringToken>[],
         super(parser);
 
@@ -2526,7 +2526,7 @@
 
     // TODO(sigmund,jmesserly): remove '' (dartbug.com/8480)
     var data = characterTokens.map((t) => t.data).join('');
-    var span = null;
+    FileSpan span;
 
     if (parser.generateSpans) {
       span = characterTokens[0].span.expand(characterTokens.last.span);
@@ -3551,7 +3551,7 @@
       parser.parseError(token.span, "unexpected-end-tag", {"name": token.name});
     }
 
-    var newToken = null;
+    var newToken;
     while (true) {
       if (asciiUpper2Lower(node.localName) == token.name) {
         //XXX this isn't in the spec but it seems necessary
diff --git a/lib/src/char_encodings.dart b/lib/src/char_encodings.dart
index 56680bd..bf1fa47 100644
--- a/lib/src/char_encodings.dart
+++ b/lib/src/char_encodings.dart
@@ -116,10 +116,10 @@
   final int length;
   final int replacementCodepoint;
 
-  IterableWindows1252Decoder(List<int> this.bytes,
-      [int this.offset = 0,
-      int this.length = null,
-      int this.replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
+  IterableWindows1252Decoder(this.bytes,
+      [this.offset = 0,
+      this.length,
+      this.replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
 
   Windows1252Decoder get iterator =>
       new Windows1252Decoder(bytes, offset, length, replacementCodepoint);
diff --git a/lib/src/css_class_set.dart b/lib/src/css_class_set.dart
index 40575c2..e1fc3f1 100644
--- a/lib/src/css_class_set.dart
+++ b/lib/src/css_class_set.dart
@@ -20,7 +20,7 @@
 
     for (String name in classname.split(' ')) {
       String trimmed = name.trim();
-      if (!trimmed.isEmpty) {
+      if (trimmed.isNotEmpty) {
         s.add(trimmed);
       }
     }
diff --git a/lib/src/inputstream.dart b/lib/src/inputstream.dart
index 849ed93..d683277 100644
--- a/lib/src/inputstream.dart
+++ b/lib/src/inputstream.dart
@@ -5,8 +5,8 @@
 import 'package:source_span/source_span.dart';
 import 'char_encodings.dart';
 import 'constants.dart';
-import 'utils.dart';
 import 'encoding_parser.dart';
+import 'utils.dart';
 
 /// Hooks to call into dart:io without directly referencing it.
 class ConsoleSupport {
diff --git a/lib/src/query_selector.dart b/lib/src/query_selector.dart
index 5c438db..38045d4 100644
--- a/lib/src/query_selector.dart
+++ b/lib/src/query_selector.dart
@@ -67,7 +67,7 @@
     var result = true;
 
     // Note: evaluate selectors right-to-left as it's more efficient.
-    int combinator = null;
+    int combinator;
     for (var s in selector.simpleSelectorSequences.reversed) {
       if (combinator == null) {
         result = s.simpleSelector.visit(this);
diff --git a/lib/src/tokenizer.dart b/lib/src/tokenizer.dart
index 21505df..db9ab63 100644
--- a/lib/src/tokenizer.dart
+++ b/lib/src/tokenizer.dart
@@ -310,7 +310,7 @@
 
       // At this point we have a string that starts with some characters
       // that may match an entity
-      String entityName = null;
+      String entityName;
 
       // Try to find the longest entity the string will match to take care
       // of &noti for instance.
diff --git a/lib/src/treebuilder.dart b/lib/src/treebuilder.dart
index ac71e48..db91651 100644
--- a/lib/src/treebuilder.dart
+++ b/lib/src/treebuilder.dart
@@ -350,9 +350,9 @@
     // The foster parent element is the one which comes before the most
     // recently opened table element
     // XXX - this is really inelegant
-    Node lastTable = null;
-    Node fosterParent = null;
-    Node insertBefore = null;
+    Node lastTable;
+    Node fosterParent;
+    Node insertBefore;
     for (var elm in openElements.reversed) {
       if (elm.localName == "table") {
         lastTable = elm;
diff --git a/test/selectors/level1_baseline_test.dart b/test/selectors/level1_baseline_test.dart
index bef290c..9bac00d 100644
--- a/test/selectors/level1_baseline_test.dart
+++ b/test/selectors/level1_baseline_test.dart
@@ -10,9 +10,10 @@
 import 'package:html/parser.dart';
 import 'package:path/path.dart' as p;
 import 'package:test/test.dart';
+
+import '../support.dart';
 import 'level1_lib.dart' hide test;
 import 'selectors.dart';
-import '../support.dart';
 
 Document getTestContentDocument() {
   var testPath = p.join(testDir, 'selectors', 'level1-content.html');
diff --git a/test/support.dart b/test/support.dart
index f467faa..2af8b7c 100644
--- a/test/support.dart
+++ b/test/support.dart
@@ -1,8 +1,8 @@
 /// Support code for the tests in this directory.
 library support;
 
-import 'dart:io';
 import 'dart:collection';
+import 'dart:io';
 
 import 'package:path/path.dart' as p;
 import 'package:html/src/treebuilder.dart';
@@ -45,7 +45,7 @@
 
   List<Map> _getData() {
     var data = <String, String>{};
-    var key = null;
+    String key;
     var result = <Map>[];
     var lines = _text.split('\n');
     // Remove trailing newline to match Python