diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..4496f3a
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,24 @@
+language: dart
+
+dart:
+  - dev
+  - stable
+
+dart_task:
+  - test: --platform vm,chrome
+
+matrix:
+  include:
+    # Only validate formatting using the dev release
+    - dart: dev
+      dart_task: dartfmt
+    - dart: dev
+      dart_task: analyzer
+
+# Only building master means that we don't run two builds for each pull request.
+branches:
+  only: [master]
+
+cache:
+ directories:
+   - $HOME/.pub-cache
diff --git a/.analysis_options b/analysis_options.yaml
similarity index 100%
rename from .analysis_options
rename to analysis_options.yaml
diff --git a/lib/src/eager_span_scanner.dart b/lib/src/eager_span_scanner.dart
index f80dce5..96c7362 100644
--- a/lib/src/eager_span_scanner.dart
+++ b/lib/src/eager_span_scanner.dart
@@ -58,8 +58,8 @@
       if (newlines.isEmpty) {
         _column -= oldPosition - newPosition;
       } else {
-        _column = newPosition -
-            string.lastIndexOf(_newlineRegExp, newPosition) - 1;
+        _column =
+            newPosition - string.lastIndexOf(_newlineRegExp, newPosition) - 1;
       }
     }
   }
@@ -121,4 +121,3 @@
 
   _EagerSpanScannerState(this._scanner, this.position, this.line, this.column);
 }
-
diff --git a/lib/src/line_scanner.dart b/lib/src/line_scanner.dart
index 06f1cbc..5182035 100644
--- a/lib/src/line_scanner.dart
+++ b/lib/src/line_scanner.dart
@@ -66,8 +66,8 @@
       if (newlines.isEmpty) {
         _column -= oldPosition - newPosition;
       } else {
-        _column = newPosition -
-            string.lastIndexOf(_newlineRegExp, newPosition) - 1;
+        _column =
+            newPosition - string.lastIndexOf(_newlineRegExp, newPosition) - 1;
       }
     }
   }
diff --git a/lib/src/relative_span_scanner.dart b/lib/src/relative_span_scanner.dart
index fdcd03f..088ff48 100644
--- a/lib/src/relative_span_scanner.dart
+++ b/lib/src/relative_span_scanner.dart
@@ -27,13 +27,14 @@
   /// This is used to convert between span-relative and file-relative fields.
   final FileLocation _startLocation;
 
-  int get line => _sourceFile.getLine(_startLocation.offset + position) -
+  int get line =>
+      _sourceFile.getLine(_startLocation.offset + position) -
       _startLocation.line;
 
   int get column {
     var line = _sourceFile.getLine(_startLocation.offset + position);
-    var column = _sourceFile.getColumn(_startLocation.offset + position,
-        line: line);
+    var column =
+        _sourceFile.getColumn(_startLocation.offset + position, line: line);
     return line == _startLocation.line
         ? column - _startLocation.column
         : column;
@@ -66,8 +67,7 @@
 
   FileSpan spanFrom(LineScannerState startState, [LineScannerState endState]) {
     var endPosition = endState == null ? position : endState.position;
-    return _sourceFile.span(
-        _startLocation.offset + startState.position,
+    return _sourceFile.span(_startLocation.offset + startState.position,
         _startLocation.offset + endPosition);
   }
 
@@ -77,8 +77,7 @@
       return false;
     }
 
-    _lastSpan = _sourceFile.span(
-        _startLocation.offset + position,
+    _lastSpan = _sourceFile.span(_startLocation.offset + position,
         _startLocation.offset + lastMatch.end);
     return true;
   }
@@ -92,8 +91,7 @@
     }
     if (length == null) length = match == null ? 1 : match.end - match.start;
 
-    var span = _sourceFile.span(
-        _startLocation.offset + position,
+    var span = _sourceFile.span(_startLocation.offset + position,
         _startLocation.offset + position + length);
     throw new StringScannerException(message, span, string);
   }
diff --git a/lib/src/span_scanner.dart b/lib/src/span_scanner.dart
index f362223..a629f13 100644
--- a/lib/src/span_scanner.dart
+++ b/lib/src/span_scanner.dart
@@ -42,6 +42,7 @@
     if (lastMatch == null) _lastSpan = null;
     return _lastSpan;
   }
+
   FileSpan _lastSpan;
 
   /// The current location of the scanner.
diff --git a/lib/src/string_scanner.dart b/lib/src/string_scanner.dart
index 712292c..ea3d6d6 100644
--- a/lib/src/string_scanner.dart
+++ b/lib/src/string_scanner.dart
@@ -34,6 +34,7 @@
     _position = position;
     _lastMatch = null;
   }
+
   int _position = 0;
 
   /// The data about the previous match made by the scanner.
@@ -45,6 +46,7 @@
     if (_position != _lastMatchPosition) _lastMatch = null;
     return _lastMatch;
   }
+
   Match _lastMatch;
   int _lastMatchPosition;
 
diff --git a/test/span_scanner_test.dart b/test/span_scanner_test.dart
index ab3cc80..37a01e0 100644
--- a/test/span_scanner_test.dart
+++ b/test/span_scanner_test.dart
@@ -9,11 +9,11 @@
 import 'utils.dart';
 
 void main() {
-  testForImplementation("lazy", ([string]) {
+  testForImplementation("lazy", ([String string]) {
     return new SpanScanner(string ?? 'foo\nbar\nbaz', sourceUrl: 'source');
   });
 
-  testForImplementation("eager", ([string]) {
+  testForImplementation("eager", ([String string]) {
     return new SpanScanner.eager(string ?? 'foo\nbar\nbaz',
         sourceUrl: 'source');
   });
@@ -93,8 +93,8 @@
 
     test(".error() uses an absolute span", () {
       scanner.expect("foo");
-      expect(() => scanner.error('oh no!'),
-          throwsStringScannerException("foo"));
+      expect(
+          () => scanner.error('oh no!'), throwsStringScannerException("foo"));
     });
 
     test(".isDone returns true at the end of the span", () {
@@ -104,7 +104,7 @@
   });
 }
 
-void testForImplementation(String name, SpanScanner create()) {
+void testForImplementation(String name, SpanScanner create([String string])) {
   group("for a $name scanner", () {
     var scanner;
     setUp(() => scanner = create());
diff --git a/test/string_scanner_test.dart b/test/string_scanner_test.dart
index 55ffa0a..30711f5 100644
--- a/test/string_scanner_test.dart
+++ b/test/string_scanner_test.dart
@@ -178,7 +178,8 @@
       expect(scanner.rest, equals(' bar'));
     });
 
-    test("a non-matching expect throws a FormatException and sets lastMatch to "
+    test(
+        "a non-matching expect throws a FormatException and sets lastMatch to "
         "null", () {
       expect(scanner.matches(new RegExp('f(..)')), isTrue);
       expect(scanner.lastMatch, isNotNull);
