diff --git a/analysis_options.yaml b/analysis_options.yaml
index 7684be7..60abe63 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -7,19 +7,21 @@
 linter:
   rules:
     - avoid_bool_literals_in_conditional_expressions
+    - avoid_catching_errors
     - avoid_classes_with_only_static_members
     - avoid_function_literals_in_foreach_calls
+    - avoid_private_typedef_functions
+    - avoid_redundant_argument_values
     - avoid_renaming_method_parameters
-    #- avoid_returning_null
     - avoid_returning_null_for_future
     - avoid_returning_null_for_void
     - avoid_returning_this
     - avoid_single_cascade_in_expression_statements
     - avoid_unused_constructor_parameters
+    - avoid_void_async
     - await_only_futures
     - camel_case_types
     - cancel_subscriptions
-    #- cascade_invocations
     - comment_references
     - constant_identifier_names
     - control_flow_in_finally
@@ -31,21 +33,34 @@
     - invariant_booleans
     - iterable_contains_unrelated_type
     - join_return_with_assignment
+    - lines_longer_than_80_chars
     - list_remove_unrelated_type
     - literal_only_boolean_expressions
+    - missing_whitespace_between_adjacent_strings
     - no_adjacent_strings_in_list
+    - no_runtimeType_toString
     - non_constant_identifier_names
     - only_throw_errors
     - overridden_fields
     - package_api_docs
     - package_names
     - package_prefixed_library_names
+    - prefer_asserts_in_initializer_lists
     - prefer_const_constructors
-    #- prefer_final_locals
+    - prefer_const_declarations
+    - prefer_expression_function_bodies
+    - prefer_final_locals
+    - prefer_function_declarations_over_variables
     - prefer_initializing_formals
+    - prefer_inlined_adds
     - prefer_interpolation_to_compose_strings
+    - prefer_is_not_operator
     - prefer_null_aware_operators
+    - prefer_relative_imports
     - prefer_typing_uninitialized_variables
+    - prefer_void_to_null
+    - provide_deprecation_message
+    - sort_pub_dependencies
     - test_types_in_equals
     - throw_in_finally
     - unnecessary_await_in_return
@@ -53,6 +68,9 @@
     - unnecessary_getters_setters
     - unnecessary_lambdas
     - unnecessary_null_aware_assignments
+    - unnecessary_overrides
     - unnecessary_parenthesis
     - unnecessary_statements
+    - unnecessary_string_interpolations
+    - use_string_buffers
     - void_checks
diff --git a/example/example.dart b/example/example.dart
index 0358967..e92677f 100644
--- a/example/example.dart
+++ b/example/example.dart
@@ -12,11 +12,11 @@
 
 num parseNumber(String source) {
   // Scan a number ("1", "1.5", "-3").
-  var scanner = StringScanner(source);
+  final scanner = StringScanner(source);
 
   // [Scanner.scan] tries to consume a [Pattern] and returns whether or not it
   // succeeded. It will move the scan pointer past the end of the pattern.
-  var negative = scanner.scan('-');
+  final negative = scanner.scan('-');
 
   // [Scanner.expect] consumes a [Pattern] and throws a [FormatError] if it
   // fails. Like [Scanner.scan], it will move the scan pointer forward.
@@ -28,7 +28,7 @@
 
   if (scanner.scan('.')) {
     scanner.expect(RegExp(r'\d+'));
-    var decimal = scanner.lastMatch[0];
+    final decimal = scanner.lastMatch[0];
     number += int.parse(decimal) / math.pow(10, decimal.length);
   }
 
diff --git a/lib/src/eager_span_scanner.dart b/lib/src/eager_span_scanner.dart
index d34e4f7..848cb72 100644
--- a/lib/src/eager_span_scanner.dart
+++ b/lib/src/eager_span_scanner.dart
@@ -44,11 +44,11 @@
 
   @override
   set position(int newPosition) {
-    var oldPosition = position;
+    final oldPosition = position;
     super.position = newPosition;
 
     if (newPosition > oldPosition) {
-      var newlines = _newlinesIn(string.substring(oldPosition, newPosition));
+      final newlines = _newlinesIn(string.substring(oldPosition, newPosition));
       _line += newlines.length;
       if (newlines.isEmpty) {
         _column += newPosition - oldPosition;
@@ -56,7 +56,7 @@
         _column = newPosition - newlines.last.end;
       }
     } else {
-      var newlines = _newlinesIn(string.substring(newPosition, oldPosition));
+      final newlines = _newlinesIn(string.substring(newPosition, oldPosition));
       if (_betweenCRLF) newlines.removeLast();
 
       _line -= newlines.length;
@@ -81,7 +81,7 @@
 
   @override
   int readChar() {
-    var character = super.readChar();
+    final character = super.readChar();
     _adjustLineAndColumn(character);
     return character;
   }
@@ -100,7 +100,7 @@
   bool scan(Pattern pattern) {
     if (!super.scan(pattern)) return false;
 
-    var newlines = _newlinesIn(lastMatch[0]);
+    final newlines = _newlinesIn(lastMatch[0]);
     _line += newlines.length;
     if (newlines.isEmpty) {
       _column += lastMatch[0].length;
@@ -114,7 +114,7 @@
   /// Returns a list of [Match]es describing all the newlines in [text], which
   /// is assumed to end at [position].
   List<Match> _newlinesIn(String text) {
-    var newlines = _newlineRegExp.allMatches(text).toList();
+    final newlines = _newlineRegExp.allMatches(text).toList();
     if (_betweenCRLF) newlines.removeLast();
     return newlines;
   }
diff --git a/lib/src/line_scanner.dart b/lib/src/line_scanner.dart
index 180d923..9e7d918 100644
--- a/lib/src/line_scanner.dart
+++ b/lib/src/line_scanner.dart
@@ -48,11 +48,11 @@
 
   @override
   set position(int newPosition) {
-    var oldPosition = position;
+    final oldPosition = position;
     super.position = newPosition;
 
     if (newPosition > oldPosition) {
-      var newlines = _newlinesIn(string.substring(oldPosition, newPosition));
+      final newlines = _newlinesIn(string.substring(oldPosition, newPosition));
       _line += newlines.length;
       if (newlines.isEmpty) {
         _column += newPosition - oldPosition;
@@ -60,7 +60,7 @@
         _column = newPosition - newlines.last.end;
       }
     } else {
-      var newlines = _newlinesIn(string.substring(newPosition, oldPosition));
+      final newlines = _newlinesIn(string.substring(newPosition, oldPosition));
       if (_betweenCRLF) newlines.removeLast();
 
       _line -= newlines.length;
@@ -85,7 +85,7 @@
 
   @override
   int readChar() {
-    var character = super.readChar();
+    final character = super.readChar();
     _adjustLineAndColumn(character);
     return character;
   }
@@ -104,7 +104,7 @@
   bool scan(Pattern pattern) {
     if (!super.scan(pattern)) return false;
 
-    var newlines = _newlinesIn(lastMatch[0]);
+    final newlines = _newlinesIn(lastMatch[0]);
     _line += newlines.length;
     if (newlines.isEmpty) {
       _column += lastMatch[0].length;
@@ -118,7 +118,7 @@
   /// Returns a list of [Match]es describing all the newlines in [text], which
   /// is assumed to end at [position].
   List<Match> _newlinesIn(String text) {
-    var newlines = _newlineRegExp.allMatches(text).toList();
+    final newlines = _newlineRegExp.allMatches(text).toList();
     if (_betweenCRLF) newlines.removeLast();
     return newlines;
   }
diff --git a/lib/src/relative_span_scanner.dart b/lib/src/relative_span_scanner.dart
index 096bee3..a7a035a 100644
--- a/lib/src/relative_span_scanner.dart
+++ b/lib/src/relative_span_scanner.dart
@@ -34,8 +34,8 @@
 
   @override
   int get column {
-    var line = _sourceFile.getLine(_startLocation.offset + position);
-    var column =
+    final line = _sourceFile.getLine(_startLocation.offset + position);
+    final column =
         _sourceFile.getColumn(_startLocation.offset + position, line: line);
     return line == _startLocation.line
         ? column - _startLocation.column
@@ -74,7 +74,7 @@
 
   @override
   FileSpan spanFrom(LineScannerState startState, [LineScannerState endState]) {
-    var endPosition = endState == null ? position : endState.position;
+    final endPosition = endState == null ? position : endState.position;
     return _sourceFile.span(_startLocation.offset + startState.position,
         _startLocation.offset + endPosition);
   }
@@ -99,7 +99,7 @@
     position ??= match == null ? this.position : match.start;
     length ??= match == null ? 1 : match.end - match.start;
 
-    var span = _sourceFile.span(_startLocation.offset + position,
+    final span = _sourceFile.span(_startLocation.offset + position,
         _startLocation.offset + position + length);
     throw StringScannerException(message, span, string);
   }
diff --git a/lib/src/span_scanner.dart b/lib/src/span_scanner.dart
index 732a76f..1a8ca2a 100644
--- a/lib/src/span_scanner.dart
+++ b/lib/src/span_scanner.dart
@@ -82,14 +82,14 @@
   ///
   /// This scans through [span]`.text, but emits new spans from [span]`.file` in
   /// their appropriate relative positions. The [string] field contains only
-  /// [span]`.text`, and [position], [line], and [column] are all relative to the
-  /// span.
+  /// [span]`.text`, and [position], [line], and [column] are all relative to
+  /// the span.
   factory SpanScanner.within(FileSpan span) = RelativeSpanScanner;
 
   /// Creates a [FileSpan] representing the source range between [startState]
   /// and the current position.
   FileSpan spanFrom(LineScannerState startState, [LineScannerState endState]) {
-    var endPosition = endState == null ? position : endState.position;
+    final endPosition = endState == null ? position : endState.position;
     return _sourceFile.span(startState.position, endPosition);
   }
 
@@ -112,7 +112,7 @@
     position ??= match == null ? this.position : match.start;
     length ??= match == null ? 0 : match.end - match.start;
 
-    var span = _sourceFile.span(position, position + length);
+    final span = _sourceFile.span(position, position + length);
     throw StringScannerException(message, span, string);
   }
 }
diff --git a/lib/src/string_scanner.dart b/lib/src/string_scanner.dart
index 1739a7c..55ff17d 100644
--- a/lib/src/string_scanner.dart
+++ b/lib/src/string_scanner.dart
@@ -81,7 +81,7 @@
   /// affect [lastMatch].
   int peekChar([int offset]) {
     offset ??= 0;
-    var index = position + offset;
+    final index = position + offset;
     if (index < 0 || index >= string.length) return null;
     return string.codeUnitAt(index);
   }
@@ -123,7 +123,7 @@
   ///
   /// Returns whether or not [pattern] matched.
   bool scan(Pattern pattern) {
-    var success = matches(pattern);
+    final success = matches(pattern);
     if (success) {
       _position = _lastMatch.end;
       _lastMatchPosition = _position;
@@ -143,7 +143,7 @@
 
     if (name == null) {
       if (pattern is RegExp) {
-        var source = pattern.pattern;
+        final source = pattern.pattern;
         name = '/$source/';
       } else {
         name =
@@ -201,8 +201,8 @@
     position ??= match == null ? this.position : match.start;
     length ??= match == null ? 0 : match.end - match.start;
 
-    var sourceFile = SourceFile.fromString(string, url: sourceUrl);
-    var span = sourceFile.span(position, position + length);
+    final sourceFile = SourceFile.fromString(string, url: sourceUrl);
+    final span = sourceFile.span(position, position + length);
     throw StringScannerException(message, span, string);
   }
 
diff --git a/test/error_test.dart b/test/error_test.dart
index dfa7175..6173040 100644
--- a/test/error_test.dart
+++ b/test/error_test.dart
@@ -9,7 +9,7 @@
 
 void main() {
   test('defaults to the last match', () {
-    var scanner = StringScanner('foo bar baz');
+    final scanner = StringScanner('foo bar baz');
     scanner.expect('foo ');
     scanner.expect('bar');
     expect(() => scanner.error('oh no!'), throwsStringScannerException('bar'));
@@ -17,39 +17,39 @@
 
   group('with match', () {
     test('supports an earlier match', () {
-      var scanner = StringScanner('foo bar baz');
+      final scanner = StringScanner('foo bar baz');
       scanner.expect('foo ');
-      var match = scanner.lastMatch;
+      final match = scanner.lastMatch;
       scanner.expect('bar');
       expect(() => scanner.error('oh no!', match: match),
           throwsStringScannerException('foo '));
     });
 
     test('supports a match on a previous line', () {
-      var scanner = StringScanner('foo bar baz\ndo re mi\nearth fire water');
+      final scanner = StringScanner('foo bar baz\ndo re mi\nearth fire water');
       scanner.expect('foo bar baz\ndo ');
       scanner.expect('re');
-      var match = scanner.lastMatch;
+      final match = scanner.lastMatch;
       scanner.expect(' mi\nearth ');
       expect(() => scanner.error('oh no!', match: match),
           throwsStringScannerException('re'));
     });
 
     test('supports a multiline match', () {
-      var scanner = StringScanner('foo bar baz\ndo re mi\nearth fire water');
+      final scanner = StringScanner('foo bar baz\ndo re mi\nearth fire water');
       scanner.expect('foo bar ');
       scanner.expect('baz\ndo');
-      var match = scanner.lastMatch;
+      final match = scanner.lastMatch;
       scanner.expect(' re mi');
       expect(() => scanner.error('oh no!', match: match),
           throwsStringScannerException('baz\ndo'));
     });
 
     test('supports a match after position', () {
-      var scanner = StringScanner('foo bar baz');
+      final scanner = StringScanner('foo bar baz');
       scanner.expect('foo ');
       scanner.expect('bar');
-      var match = scanner.lastMatch;
+      final match = scanner.lastMatch;
       scanner.position = 0;
       expect(() => scanner.error('oh no!', match: match),
           throwsStringScannerException('bar'));
@@ -58,48 +58,48 @@
 
   group('with position and/or length', () {
     test('defaults to length 0', () {
-      var scanner = StringScanner('foo bar baz');
+      final scanner = StringScanner('foo bar baz');
       scanner.expect('foo ');
       expect(() => scanner.error('oh no!', position: 1),
           throwsStringScannerException(''));
     });
 
     test('defaults to the current position', () {
-      var scanner = StringScanner('foo bar baz');
+      final scanner = StringScanner('foo bar baz');
       scanner.expect('foo ');
       expect(() => scanner.error('oh no!', length: 3),
           throwsStringScannerException('bar'));
     });
 
     test('supports an earlier position', () {
-      var scanner = StringScanner('foo bar baz');
+      final scanner = StringScanner('foo bar baz');
       scanner.expect('foo ');
       expect(() => scanner.error('oh no!', position: 1, length: 2),
           throwsStringScannerException('oo'));
     });
 
     test('supports a position on a previous line', () {
-      var scanner = StringScanner('foo bar baz\ndo re mi\nearth fire water');
+      final scanner = StringScanner('foo bar baz\ndo re mi\nearth fire water');
       scanner.expect('foo bar baz\ndo re mi\nearth');
       expect(() => scanner.error('oh no!', position: 15, length: 2),
           throwsStringScannerException('re'));
     });
 
     test('supports a multiline length', () {
-      var scanner = StringScanner('foo bar baz\ndo re mi\nearth fire water');
+      final scanner = StringScanner('foo bar baz\ndo re mi\nearth fire water');
       scanner.expect('foo bar baz\ndo re mi\nearth');
       expect(() => scanner.error('oh no!', position: 8, length: 8),
           throwsStringScannerException('baz\ndo r'));
     });
 
     test('supports a position after the current one', () {
-      var scanner = StringScanner('foo bar baz');
+      final scanner = StringScanner('foo bar baz');
       expect(() => scanner.error('oh no!', position: 4, length: 3),
           throwsStringScannerException('bar'));
     });
 
     test('supports a length of zero', () {
-      var scanner = StringScanner('foo bar baz');
+      final scanner = StringScanner('foo bar baz');
       expect(() => scanner.error('oh no!', position: 4, length: 0),
           throwsStringScannerException(''));
     });
diff --git a/test/line_scanner_test.dart b/test/line_scanner_test.dart
index dc9b8cf..aafc74a 100644
--- a/test/line_scanner_test.dart
+++ b/test/line_scanner_test.dart
@@ -150,7 +150,7 @@
 
   test('state= restores the line, column, and position', () {
     scanner.scan('foo\nb');
-    var state = scanner.state;
+    final state = scanner.state;
 
     scanner.scan('ar\nba');
     scanner.state = state;
diff --git a/test/span_scanner_test.dart b/test/span_scanner_test.dart
index e2570ae..2034d0a 100644
--- a/test/span_scanner_test.dart
+++ b/test/span_scanner_test.dart
@@ -9,21 +9,23 @@
 import 'utils.dart';
 
 void main() {
-  testForImplementation('lazy', ([String string]) {
-    return SpanScanner(string ?? 'foo\nbar\nbaz', sourceUrl: 'source');
-  });
+  testForImplementation(
+      'lazy',
+      ([String string]) =>
+          SpanScanner(string ?? 'foo\nbar\nbaz', sourceUrl: 'source'));
 
-  testForImplementation('eager', ([String string]) {
-    return SpanScanner.eager(string ?? 'foo\nbar\nbaz', sourceUrl: 'source');
-  });
+  testForImplementation(
+      'eager',
+      ([String string]) =>
+          SpanScanner.eager(string ?? 'foo\nbar\nbaz', sourceUrl: 'source'));
 
   group('within', () {
-    var text = 'first\nbefore: foo\nbar\nbaz :after\nlast';
-    var startOffset = text.indexOf('foo');
+    const text = 'first\nbefore: foo\nbar\nbaz :after\nlast';
+    final startOffset = text.indexOf('foo');
 
     SpanScanner scanner;
     setUp(() {
-      var file = SourceFile.fromString(text, url: 'source');
+      final file = SourceFile.fromString(text, url: 'source');
       scanner =
           SpanScanner.within(file.span(startOffset, text.indexOf(' :after')));
     });
@@ -49,7 +51,7 @@
       scanner.scan('fo');
       scanner.scan('o\nba');
 
-      var span = scanner.lastSpan;
+      final span = scanner.lastSpan;
       expect(span.start.offset, equals(startOffset + 2));
       expect(span.start.line, equals(1));
       expect(span.start.column, equals(10));
@@ -65,18 +67,18 @@
 
     test('.spanFrom() returns a span from a previous state', () {
       scanner.scan('fo');
-      var state = scanner.state;
+      final state = scanner.state;
       scanner.scan('o\nba');
       scanner.scan('r\nba');
 
-      var span = scanner.spanFrom(state);
+      final span = scanner.spanFrom(state);
       expect(span.text, equals('o\nbar\nba'));
     });
 
     test('.emptySpan returns an empty span at the current location', () {
       scanner.scan('foo\nba');
 
-      var span = scanner.emptySpan;
+      final span = scanner.emptySpan;
       expect(span.start.offset, equals(startOffset + 6));
       expect(span.start.line, equals(2));
       expect(span.start.column, equals(2));
@@ -113,7 +115,7 @@
       scanner.scan('fo');
       scanner.scan('o\nba');
 
-      var span = scanner.lastSpan;
+      final span = scanner.lastSpan;
       expect(span.start.offset, equals(2));
       expect(span.start.line, equals(0));
       expect(span.start.column, equals(2));
@@ -129,27 +131,27 @@
 
     test('.spanFrom() returns a span from a previous state', () {
       scanner.scan('fo');
-      var state = scanner.state;
+      final state = scanner.state;
       scanner.scan('o\nba');
       scanner.scan('r\nba');
 
-      var span = scanner.spanFrom(state);
+      final span = scanner.spanFrom(state);
       expect(span.text, equals('o\nbar\nba'));
     });
 
     test('.spanFrom() handles surrogate pairs correctly', () {
       scanner = create('fo\u{12345}o');
       scanner.scan('fo');
-      var state = scanner.state;
+      final state = scanner.state;
       scanner.scan('\u{12345}o');
-      var span = scanner.spanFrom(state);
+      final span = scanner.spanFrom(state);
       expect(span.text, equals('\u{12345}o'));
     });
 
     test('.emptySpan returns an empty span at the current location', () {
       scanner.scan('foo\nba');
 
-      var span = scanner.emptySpan;
+      final span = scanner.emptySpan;
       expect(span.start.offset, equals(6));
       expect(span.start.line, equals(1));
       expect(span.start.column, equals(2));
diff --git a/test/string_scanner_test.dart b/test/string_scanner_test.dart
index e1e5b4e..9dee9d1 100644
--- a/test/string_scanner_test.dart
+++ b/test/string_scanner_test.dart
@@ -374,7 +374,7 @@
     });
 
     test('setting and resetting position clears lastMatch', () {
-      var oldPosition = scanner.position;
+      final oldPosition = scanner.position;
       scanner.position = 1;
       scanner.position = oldPosition;
       expect(scanner.lastMatch, isNull);
@@ -395,7 +395,7 @@
 
   group('a scanner constructed with a custom position', () {
     test('starts scanning from that position', () {
-      var scanner = StringScanner('foo bar', position: 1);
+      final scanner = StringScanner('foo bar', position: 1);
       expect(scanner.position, equals(1));
       expect(scanner.rest, equals('oo bar'));
 
