Fix latest pedantic lints, remove deprecated author field in pubspec (#17)

diff --git a/analysis_options.yaml b/analysis_options.yaml
index 6e8826b..c9899f2 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -5,7 +5,6 @@
 linter:
   rules:
     - always_declare_return_types
-    #- annotate_overrides
     - avoid_bool_literals_in_conditional_expressions
     - avoid_classes_with_only_static_members
     - avoid_empty_else
@@ -68,7 +67,6 @@
     - prefer_is_empty
     - prefer_is_not_empty
     - prefer_null_aware_operators
-    #- prefer_single_quotes
     - prefer_typing_uninitialized_variables
     - recursive_getters
     - slash_for_doc_comments
diff --git a/example/example.dart b/example/example.dart
index ddd9d3e..0358967 100644
--- a/example/example.dart
+++ b/example/example.dart
@@ -16,18 +16,18 @@
 
   // [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("-");
+  var 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.
-  scanner.expect(RegExp(r"\d+"));
+  scanner.expect(RegExp(r'\d+'));
 
   // [Scanner.lastMatch] holds the [MatchData] for the most recent call to
   // [Scanner.scan], [Scanner.expect], or [Scanner.matches].
   var number = num.parse(scanner.lastMatch[0]);
 
-  if (scanner.scan(".")) {
-    scanner.expect(RegExp(r"\d+"));
+  if (scanner.scan('.')) {
+    scanner.expect(RegExp(r'\d+'));
     var 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 a2df0f8..d34e4f7 100644
--- a/lib/src/eager_span_scanner.dart
+++ b/lib/src/eager_span_scanner.dart
@@ -11,26 +11,30 @@
 // sdk#23770 is fully complete, we should move the shared code into a mixin.
 
 /// A regular expression matching newlines across platforms.
-final _newlineRegExp = RegExp(r"\r\n?|\n");
+final _newlineRegExp = RegExp(r'\r\n?|\n');
 
 /// A [SpanScanner] that tracks the line and column eagerly, like [LineScanner].
 class EagerSpanScanner extends SpanScanner {
+  @override
   int get line => _line;
   int _line = 0;
 
+  @override
   int get column => _column;
   int _column = 0;
 
+  @override
   LineScannerState get state =>
       _EagerSpanScannerState(this, position, line, column);
 
   bool get _betweenCRLF => peekChar(-1) == $cr && peekChar() == $lf;
 
+  @override
   set state(LineScannerState state) {
     if (state is! _EagerSpanScannerState ||
         !identical((state as _EagerSpanScannerState)._scanner, this)) {
-      throw ArgumentError("The given LineScannerState was not returned by "
-          "this LineScanner.");
+      throw ArgumentError('The given LineScannerState was not returned by '
+          'this LineScanner.');
     }
 
     super.position = state.position;
@@ -38,6 +42,7 @@
     _column = state.column;
   }
 
+  @override
   set position(int newPosition) {
     var oldPosition = position;
     super.position = newPosition;
@@ -67,12 +72,14 @@
   EagerSpanScanner(String string, {sourceUrl, int position})
       : super(string, sourceUrl: sourceUrl, position: position);
 
+  @override
   bool scanChar(int character) {
     if (!super.scanChar(character)) return false;
     _adjustLineAndColumn(character);
     return true;
   }
 
+  @override
   int readChar() {
     var character = super.readChar();
     _adjustLineAndColumn(character);
@@ -89,6 +96,7 @@
     }
   }
 
+  @override
   bool scan(Pattern pattern) {
     if (!super.scan(pattern)) return false;
 
@@ -115,8 +123,11 @@
 /// A class representing the state of an [EagerSpanScanner].
 class _EagerSpanScannerState implements LineScannerState {
   final EagerSpanScanner _scanner;
+  @override
   final int position;
+  @override
   final int line;
+  @override
   final int column;
 
   _EagerSpanScannerState(this._scanner, this.position, this.line, this.column);
diff --git a/lib/src/exception.dart b/lib/src/exception.dart
index bad08f6..8c994b5 100644
--- a/lib/src/exception.dart
+++ b/lib/src/exception.dart
@@ -8,6 +8,7 @@
 
 /// An exception thrown by a [StringScanner] that failed to parse a string.
 class StringScannerException extends SourceSpanFormatException {
+  @override
   String get source => super.source as String;
 
   /// The URL of the source file being parsed.
diff --git a/lib/src/line_scanner.dart b/lib/src/line_scanner.dart
index e16302a..180d923 100644
--- a/lib/src/line_scanner.dart
+++ b/lib/src/line_scanner.dart
@@ -9,7 +9,7 @@
 // Note that much of this code is duplicated in eager_span_scanner.dart.
 
 /// A regular expression matching newlines across platforms.
-final _newlineRegExp = RegExp(r"\r\n?|\n");
+final _newlineRegExp = RegExp(r'\r\n?|\n');
 
 /// A subclass of [StringScanner] that tracks line and column information.
 class LineScanner extends StringScanner {
@@ -37,8 +37,8 @@
 
   set state(LineScannerState state) {
     if (!identical(state._scanner, this)) {
-      throw ArgumentError("The given LineScannerState was not returned by "
-          "this LineScanner.");
+      throw ArgumentError('The given LineScannerState was not returned by '
+          'this LineScanner.');
     }
 
     super.position = state.position;
@@ -46,6 +46,7 @@
     _column = state.column;
   }
 
+  @override
   set position(int newPosition) {
     var oldPosition = position;
     super.position = newPosition;
@@ -75,12 +76,14 @@
   LineScanner(String string, {sourceUrl, int position})
       : super(string, sourceUrl: sourceUrl, position: position);
 
+  @override
   bool scanChar(int character) {
     if (!super.scanChar(character)) return false;
     _adjustLineAndColumn(character);
     return true;
   }
 
+  @override
   int readChar() {
     var character = super.readChar();
     _adjustLineAndColumn(character);
@@ -97,6 +100,7 @@
     }
   }
 
+  @override
   bool scan(Pattern pattern) {
     if (!super.scan(pattern)) return false;
 
diff --git a/lib/src/relative_span_scanner.dart b/lib/src/relative_span_scanner.dart
index 1a992e4..096bee3 100644
--- a/lib/src/relative_span_scanner.dart
+++ b/lib/src/relative_span_scanner.dart
@@ -27,10 +27,12 @@
   /// This is used to convert between span-relative and file-relative fields.
   final FileLocation _startLocation;
 
+  @override
   int get line =>
       _sourceFile.getLine(_startLocation.offset + position) -
       _startLocation.line;
 
+  @override
   int get column {
     var line = _sourceFile.getLine(_startLocation.offset + position);
     var column =
@@ -40,24 +42,29 @@
         : column;
   }
 
+  @override
   LineScannerState get state => _SpanScannerState(this, position);
 
+  @override
   set state(LineScannerState state) {
     if (state is! _SpanScannerState ||
         !identical((state as _SpanScannerState)._scanner, this)) {
-      throw ArgumentError("The given LineScannerState was not returned by "
-          "this LineScanner.");
+      throw ArgumentError('The given LineScannerState was not returned by '
+          'this LineScanner.');
     }
 
     position = state.position;
   }
 
+  @override
   FileSpan get lastSpan => _lastSpan;
   FileSpan _lastSpan;
 
+  @override
   FileLocation get location =>
       _sourceFile.location(_startLocation.offset + position);
 
+  @override
   FileSpan get emptySpan => location.pointSpan();
 
   RelativeSpanScanner(FileSpan span)
@@ -65,12 +72,14 @@
         _startLocation = span.start,
         super(span.text, sourceUrl: span.sourceUrl);
 
+  @override
   FileSpan spanFrom(LineScannerState startState, [LineScannerState endState]) {
     var endPosition = endState == null ? position : endState.position;
     return _sourceFile.span(_startLocation.offset + startState.position,
         _startLocation.offset + endPosition);
   }
 
+  @override
   bool matches(Pattern pattern) {
     if (!super.matches(pattern)) {
       _lastSpan = null;
@@ -82,6 +91,7 @@
     return true;
   }
 
+  @override
   void error(String message, {Match match, int position, int length}) {
     validateErrorArgs(string, match, position, length);
 
@@ -100,8 +110,11 @@
   /// The [SpanScanner] that created this.
   final RelativeSpanScanner _scanner;
 
+  @override
   final int position;
+  @override
   int get line => _scanner._sourceFile.getLine(position);
+  @override
   int get column => _scanner._sourceFile.getColumn(position);
 
   _SpanScannerState(this._scanner, this.position);
diff --git a/lib/src/span_scanner.dart b/lib/src/span_scanner.dart
index d332216..732a76f 100644
--- a/lib/src/span_scanner.dart
+++ b/lib/src/span_scanner.dart
@@ -19,16 +19,20 @@
   /// This caches line break information and is used to generate [FileSpan]s.
   final SourceFile _sourceFile;
 
+  @override
   int get line => _sourceFile.getLine(position);
+  @override
   int get column => _sourceFile.getColumn(position);
 
+  @override
   LineScannerState get state => _SpanScannerState(this, position);
 
+  @override
   set state(LineScannerState state) {
     if (state is! _SpanScannerState ||
         !identical((state as _SpanScannerState)._scanner, this)) {
-      throw ArgumentError("The given LineScannerState was not returned by "
-          "this LineScanner.");
+      throw ArgumentError('The given LineScannerState was not returned by '
+          'this LineScanner.');
     }
 
     position = state.position;
@@ -89,6 +93,7 @@
     return _sourceFile.span(startState.position, endPosition);
   }
 
+  @override
   bool matches(Pattern pattern) {
     if (!super.matches(pattern)) {
       _lastSpan = null;
@@ -99,6 +104,7 @@
     return true;
   }
 
+  @override
   void error(String message, {Match match, int position, int length}) {
     validateErrorArgs(string, match, position, length);
 
@@ -116,8 +122,11 @@
   /// The [SpanScanner] that created this.
   final SpanScanner _scanner;
 
+  @override
   final int position;
+  @override
   int get line => _scanner._sourceFile.getLine(position);
+  @override
   int get column => _scanner._sourceFile.getColumn(position);
 
   _SpanScannerState(this._scanner, this.position);
diff --git a/lib/src/string_scanner.dart b/lib/src/string_scanner.dart
index 4a1d10c..1739a7c 100644
--- a/lib/src/string_scanner.dart
+++ b/lib/src/string_scanner.dart
@@ -24,7 +24,7 @@
   int get position => _position;
   set position(int position) {
     if (position < 0 || position > string.length) {
-      throw ArgumentError("Invalid position $position");
+      throw ArgumentError('Invalid position $position');
     }
 
     _position = position;
@@ -68,7 +68,7 @@
   /// This throws a [FormatException] if the string has been fully consumed. It
   /// doesn't affect [lastMatch].
   int readChar() {
-    if (isDone) _fail("more input");
+    if (isDone) _fail('more input');
     return string.codeUnitAt(_position++);
   }
 
@@ -144,10 +144,10 @@
     if (name == null) {
       if (pattern is RegExp) {
         var source = pattern.pattern;
-        name = "/$source/";
+        name = '/$source/';
       } else {
         name =
-            pattern.toString().replaceAll("\\", "\\\\").replaceAll('"', '\\"');
+            pattern.toString().replaceAll('\\', '\\\\').replaceAll('"', '\\"');
         name = '"$name"';
       }
     }
@@ -158,7 +158,7 @@
   /// [FormatException].
   void expectDone() {
     if (isDone) return;
-    _fail("no more input");
+    _fail('no more input');
   }
 
   /// Returns whether or not [pattern] matches at the current position of the
@@ -210,6 +210,6 @@
   /// Throws a [FormatException] describing that [name] is expected at the
   /// current position in the string.
   void _fail(String name) {
-    error("expected $name.", position: position, length: 0);
+    error('expected $name.', position: position, length: 0);
   }
 }
diff --git a/lib/src/utils.dart b/lib/src/utils.dart
index df29ba2..7fe3d52 100644
--- a/lib/src/utils.dart
+++ b/lib/src/utils.dart
@@ -12,19 +12,19 @@
 
   if (position != null) {
     if (position < 0) {
-      throw RangeError("position must be greater than or equal to 0.");
+      throw RangeError('position must be greater than or equal to 0.');
     } else if (position > string.length) {
-      throw RangeError("position must be less than or equal to the "
-          "string length.");
+      throw RangeError('position must be less than or equal to the '
+          'string length.');
     }
   }
 
   if (length != null && length < 0) {
-    throw RangeError("length must be greater than or equal to 0.");
+    throw RangeError('length must be greater than or equal to 0.');
   }
 
   if (position != null && length != null && position + length > string.length) {
-    throw RangeError("position plus length must not go beyond the end of "
-        "the string.");
+    throw RangeError('position plus length must not go beyond the end of '
+        'the string.');
   }
 }
diff --git a/pubspec.yaml b/pubspec.yaml
index 6cba21e..d5cefce 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -2,7 +2,6 @@
 version: 1.0.5
 
 description: A class for parsing strings using a sequence of patterns.
-author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/string_scanner
 
 environment:
diff --git a/test/error_test.dart b/test/error_test.dart
index b966b1b..dfa7175 100644
--- a/test/error_test.dart
+++ b/test/error_test.dart
@@ -15,7 +15,7 @@
     expect(() => scanner.error('oh no!'), throwsStringScannerException('bar'));
   });
 
-  group("with match", () {
+  group('with match', () {
     test('supports an earlier match', () {
       var scanner = StringScanner('foo bar baz');
       scanner.expect('foo ');
@@ -56,7 +56,7 @@
     });
   });
 
-  group("with position and/or length", () {
+  group('with position and/or length', () {
     test('defaults to length 0', () {
       var scanner = StringScanner('foo bar baz');
       scanner.expect('foo ');
@@ -105,39 +105,39 @@
     });
   });
 
-  group("argument errors", () {
+  group('argument errors', () {
     StringScanner scanner;
     setUp(() {
       scanner = StringScanner('foo bar baz');
       scanner.scan('foo');
     });
 
-    test("if match is passed with position", () {
+    test('if match is passed with position', () {
       expect(
-          () => scanner.error("oh no!", match: scanner.lastMatch, position: 1),
+          () => scanner.error('oh no!', match: scanner.lastMatch, position: 1),
           throwsArgumentError);
     });
 
-    test("if match is passed with length", () {
-      expect(() => scanner.error("oh no!", match: scanner.lastMatch, length: 1),
+    test('if match is passed with length', () {
+      expect(() => scanner.error('oh no!', match: scanner.lastMatch, length: 1),
           throwsArgumentError);
     });
 
-    test("if position is negative", () {
-      expect(() => scanner.error("oh no!", position: -1), throwsArgumentError);
+    test('if position is negative', () {
+      expect(() => scanner.error('oh no!', position: -1), throwsArgumentError);
     });
 
-    test("if position is outside the string", () {
-      expect(() => scanner.error("oh no!", position: 100), throwsArgumentError);
+    test('if position is outside the string', () {
+      expect(() => scanner.error('oh no!', position: 100), throwsArgumentError);
     });
 
-    test("if position + length is outside the string", () {
-      expect(() => scanner.error("oh no!", position: 7, length: 7),
+    test('if position + length is outside the string', () {
+      expect(() => scanner.error('oh no!', position: 7, length: 7),
           throwsArgumentError);
     });
 
-    test("if length is negative", () {
-      expect(() => scanner.error("oh no!", length: -1), throwsArgumentError);
+    test('if length is negative', () {
+      expect(() => scanner.error('oh no!', length: -1), throwsArgumentError);
     });
   });
 }
diff --git a/test/line_scanner_test.dart b/test/line_scanner_test.dart
index 8767142..dc9b8cf 100644
--- a/test/line_scanner_test.dart
+++ b/test/line_scanner_test.dart
@@ -17,20 +17,20 @@
     expect(scanner.column, equals(0));
   });
 
-  group("scan()", () {
-    test("consuming no newlines increases the column but not the line", () {
+  group('scan()', () {
+    test('consuming no newlines increases the column but not the line', () {
       scanner.scan('foo');
       expect(scanner.line, equals(0));
       expect(scanner.column, equals(3));
     });
 
-    test("consuming a newline resets the column and increases the line", () {
+    test('consuming a newline resets the column and increases the line', () {
       scanner.expect('foo\nba');
       expect(scanner.line, equals(1));
       expect(scanner.column, equals(2));
     });
 
-    test("consuming multiple newlines resets the column and increases the line",
+    test('consuming multiple newlines resets the column and increases the line',
         () {
       scanner.expect('foo\nbar\r\nb');
       expect(scanner.line, equals(2));
@@ -48,15 +48,15 @@
     });
   });
 
-  group("readChar()", () {
-    test("on a non-newline character increases the column but not the line",
+  group('readChar()', () {
+    test('on a non-newline character increases the column but not the line',
         () {
       scanner.readChar();
       expect(scanner.line, equals(0));
       expect(scanner.column, equals(1));
     });
 
-    test("consuming a newline resets the column and increases the line", () {
+    test('consuming a newline resets the column and increases the line', () {
       scanner.expect('foo');
       expect(scanner.line, equals(0));
       expect(scanner.column, equals(3));
@@ -81,15 +81,15 @@
     });
   });
 
-  group("scanChar()", () {
-    test("on a non-newline character increases the column but not the line",
+  group('scanChar()', () {
+    test('on a non-newline character increases the column but not the line',
         () {
       scanner.scanChar($f);
       expect(scanner.line, equals(0));
       expect(scanner.column, equals(1));
     });
 
-    test("consuming a newline resets the column and increases the line", () {
+    test('consuming a newline resets the column and increases the line', () {
       scanner.expect('foo');
       expect(scanner.line, equals(0));
       expect(scanner.column, equals(3));
@@ -114,28 +114,28 @@
     });
   });
 
-  group("position=", () {
-    test("forward through newlines sets the line and column", () {
+  group('position=', () {
+    test('forward through newlines sets the line and column', () {
       scanner.position = 10; // "foo\nbar\r\nb"
       expect(scanner.line, equals(2));
       expect(scanner.column, equals(1));
     });
 
-    test("forward through no newlines sets the column", () {
+    test('forward through no newlines sets the column', () {
       scanner.position = 2; // "fo"
       expect(scanner.line, equals(0));
       expect(scanner.column, equals(2));
     });
 
-    test("backward through newlines sets the line and column", () {
-      scanner.scan("foo\nbar\r\nbaz");
+    test('backward through newlines sets the line and column', () {
+      scanner.scan('foo\nbar\r\nbaz');
       scanner.position = 2; // "fo"
       expect(scanner.line, equals(0));
       expect(scanner.column, equals(2));
     });
 
-    test("backward through no newlines sets the column", () {
-      scanner.scan("foo\nbar\r\nbaz");
+    test('backward through no newlines sets the column', () {
+      scanner.scan('foo\nbar\r\nbaz');
       scanner.position = 10; // "foo\nbar\r\nb"
       expect(scanner.line, equals(2));
       expect(scanner.column, equals(1));
@@ -148,7 +148,7 @@
     });
   });
 
-  test("state= restores the line, column, and position", () {
+  test('state= restores the line, column, and position', () {
     scanner.scan('foo\nb');
     var state = scanner.state;
 
@@ -159,7 +159,7 @@
     expect(scanner.column, equals(1));
   });
 
-  test("state= rejects a foreign state", () {
+  test('state= rejects a foreign state', () {
     scanner.scan('foo\nb');
 
     expect(() => LineScanner(scanner.string).state = scanner.state,
diff --git a/test/span_scanner_test.dart b/test/span_scanner_test.dart
index 65694ea..e2570ae 100644
--- a/test/span_scanner_test.dart
+++ b/test/span_scanner_test.dart
@@ -9,15 +9,15 @@
 import 'utils.dart';
 
 void main() {
-  testForImplementation("lazy", ([String string]) {
+  testForImplementation('lazy', ([String string]) {
     return SpanScanner(string ?? 'foo\nbar\nbaz', sourceUrl: 'source');
   });
 
-  testForImplementation("eager", ([String string]) {
+  testForImplementation('eager', ([String string]) {
     return SpanScanner.eager(string ?? 'foo\nbar\nbaz', sourceUrl: 'source');
   });
 
-  group("within", () {
+  group('within', () {
     var text = 'first\nbefore: foo\nbar\nbaz :after\nlast';
     var startOffset = text.indexOf('foo');
 
@@ -28,24 +28,24 @@
           SpanScanner.within(file.span(startOffset, text.indexOf(' :after')));
     });
 
-    test("string only includes the span text", () {
-      expect(scanner.string, equals("foo\nbar\nbaz"));
+    test('string only includes the span text', () {
+      expect(scanner.string, equals('foo\nbar\nbaz'));
     });
 
-    test("line and column are span-relative", () {
+    test('line and column are span-relative', () {
       expect(scanner.line, equals(0));
       expect(scanner.column, equals(0));
 
-      scanner.scan("foo");
+      scanner.scan('foo');
       expect(scanner.line, equals(0));
       expect(scanner.column, equals(3));
 
-      scanner.scan("\n");
+      scanner.scan('\n');
       expect(scanner.line, equals(1));
       expect(scanner.column, equals(0));
     });
 
-    test("tracks the span for the last match", () {
+    test('tracks the span for the last match', () {
       scanner.scan('fo');
       scanner.scan('o\nba');
 
@@ -63,7 +63,7 @@
       expect(span.text, equals('o\nba'));
     });
 
-    test(".spanFrom() returns a span from a previous state", () {
+    test('.spanFrom() returns a span from a previous state', () {
       scanner.scan('fo');
       var state = scanner.state;
       scanner.scan('o\nba');
@@ -73,7 +73,7 @@
       expect(span.text, equals('o\nbar\nba'));
     });
 
-    test(".emptySpan returns an empty span at the current location", () {
+    test('.emptySpan returns an empty span at the current location', () {
       scanner.scan('foo\nba');
 
       var span = scanner.emptySpan;
@@ -90,14 +90,14 @@
       expect(span.text, equals(''));
     });
 
-    test(".error() uses an absolute span", () {
-      scanner.expect("foo");
+    test('.error() uses an absolute span', () {
+      scanner.expect('foo');
       expect(
-          () => scanner.error('oh no!'), throwsStringScannerException("foo"));
+          () => scanner.error('oh no!'), throwsStringScannerException('foo'));
     });
 
-    test(".isDone returns true at the end of the span", () {
-      scanner.expect("foo\nbar\nbaz");
+    test('.isDone returns true at the end of the span', () {
+      scanner.expect('foo\nbar\nbaz');
       expect(scanner.isDone, isTrue);
     });
   });
@@ -105,11 +105,11 @@
 
 void testForImplementation(
     String name, SpanScanner Function([String string]) create) {
-  group("for a $name scanner", () {
+  group('for a $name scanner', () {
     SpanScanner scanner;
     setUp(() => scanner = create());
 
-    test("tracks the span for the last match", () {
+    test('tracks the span for the last match', () {
       scanner.scan('fo');
       scanner.scan('o\nba');
 
@@ -127,7 +127,7 @@
       expect(span.text, equals('o\nba'));
     });
 
-    test(".spanFrom() returns a span from a previous state", () {
+    test('.spanFrom() returns a span from a previous state', () {
       scanner.scan('fo');
       var state = scanner.state;
       scanner.scan('o\nba');
@@ -137,7 +137,7 @@
       expect(span.text, equals('o\nbar\nba'));
     });
 
-    test(".spanFrom() handles surrogate pairs correctly", () {
+    test('.spanFrom() handles surrogate pairs correctly', () {
       scanner = create('fo\u{12345}o');
       scanner.scan('fo');
       var state = scanner.state;
@@ -146,7 +146,7 @@
       expect(span.text, equals('\u{12345}o'));
     });
 
-    test(".emptySpan returns an empty span at the current location", () {
+    test('.emptySpan returns an empty span at the current location', () {
       scanner.scan('foo\nba');
 
       var span = scanner.emptySpan;
diff --git a/test/string_scanner_test.dart b/test/string_scanner_test.dart
index 9d6d6b8..e1e5b4e 100644
--- a/test/string_scanner_test.dart
+++ b/test/string_scanner_test.dart
@@ -72,7 +72,7 @@
       expect(scanner.position, equals(0));
     });
 
-    test("substring returns the empty string", () {
+    test('substring returns the empty string', () {
       expect(scanner.substring(0), isEmpty);
     });
 
@@ -130,38 +130,38 @@
       expect(scanner.position, equals(0));
     });
 
-    test("a matching scanChar returns true moves forward", () {
+    test('a matching scanChar returns true moves forward', () {
       expect(scanner.scanChar($f), isTrue);
       expect(scanner.lastMatch, isNull);
       expect(scanner.position, equals(1));
     });
 
-    test("a non-matching scanChar returns false and does nothing", () {
+    test('a non-matching scanChar returns false and does nothing', () {
       expect(scanner.scanChar($x), isFalse);
       expect(scanner.lastMatch, isNull);
       expect(scanner.position, equals(0));
     });
 
-    test("a matching expectChar moves forward", () {
+    test('a matching expectChar moves forward', () {
       scanner.expectChar($f);
       expect(scanner.lastMatch, isNull);
       expect(scanner.position, equals(1));
     });
 
-    test("a non-matching expectChar fails", () {
+    test('a non-matching expectChar fails', () {
       expect(() => scanner.expectChar($x), throwsFormatException);
       expect(scanner.lastMatch, isNull);
       expect(scanner.position, equals(0));
     });
 
-    test("a matching scan returns true and changes the state", () {
+    test('a matching scan returns true and changes the state', () {
       expect(scanner.scan(RegExp('f(..)')), isTrue);
       expect(scanner.lastMatch[1], equals('oo'));
       expect(scanner.position, equals(3));
       expect(scanner.rest, equals(' bar'));
     });
 
-    test("a non-matching scan returns false and sets lastMatch to null", () {
+    test('a non-matching scan returns false and sets lastMatch to null', () {
       expect(scanner.matches(RegExp('f(..)')), isTrue);
       expect(scanner.lastMatch, isNotNull);
 
@@ -171,7 +171,7 @@
       expect(scanner.rest, equals('foo bar'));
     });
 
-    test("a matching expect changes the state", () {
+    test('a matching expect changes the state', () {
       scanner.expect(RegExp('f(..)'));
       expect(scanner.lastMatch[1], equals('oo'));
       expect(scanner.position, equals(3));
@@ -179,8 +179,8 @@
     });
 
     test(
-        "a non-matching expect throws a FormatException and sets lastMatch to "
-        "null", () {
+        'a non-matching expect throws a FormatException and sets lastMatch to '
+        'null', () {
       expect(scanner.matches(RegExp('f(..)')), isTrue);
       expect(scanner.lastMatch, isNotNull);
 
@@ -190,7 +190,7 @@
       expect(scanner.rest, equals('foo bar'));
     });
 
-    test("a matching matches returns true and only changes lastMatch", () {
+    test('a matching matches returns true and only changes lastMatch', () {
       expect(scanner.matches(RegExp('f(..)')), isTrue);
       expect(scanner.lastMatch[1], equals('oo'));
       expect(scanner.position, equals(0));
@@ -205,15 +205,15 @@
       expect(scanner.rest, equals('foo bar'));
     });
 
-    test("substring from the beginning returns the empty string", () {
+    test('substring from the beginning returns the empty string', () {
       expect(scanner.substring(0), isEmpty);
     });
 
-    test("substring with a custom end returns the substring", () {
+    test('substring with a custom end returns the substring', () {
       expect(scanner.substring(0, 3), equals('foo'));
     });
 
-    test("substring with the string length returns the whole string", () {
+    test('substring with the string length returns the whole string', () {
       expect(scanner.substring(0, 7), equals('foo bar'));
     });
 
@@ -332,33 +332,33 @@
       expect(scanner.position, equals(7));
     });
 
-    test("scan returns false and sets lastMatch to null", () {
+    test('scan returns false and sets lastMatch to null', () {
       expect(scanner.scan(RegExp('.')), isFalse);
       expect(scanner.lastMatch, isNull);
       expect(scanner.position, equals(7));
     });
 
-    test("expect throws a FormatException and sets lastMatch to null", () {
+    test('expect throws a FormatException and sets lastMatch to null', () {
       expect(() => scanner.expect(RegExp('.')), throwsFormatException);
       expect(scanner.lastMatch, isNull);
       expect(scanner.position, equals(7));
     });
 
-    test("matches returns false sets lastMatch to null", () {
+    test('matches returns false sets lastMatch to null', () {
       expect(scanner.matches(RegExp('.')), isFalse);
       expect(scanner.lastMatch, isNull);
       expect(scanner.position, equals(7));
     });
 
-    test("substring from the beginning returns the whole string", () {
+    test('substring from the beginning returns the whole string', () {
       expect(scanner.substring(0), equals('foo bar'));
     });
 
-    test("substring with a custom start returns a substring from there", () {
+    test('substring with a custom start returns a substring from there', () {
       expect(scanner.substring(4), equals('bar'));
     });
 
-    test("substring with a custom start and end returns that substring", () {
+    test('substring with a custom start and end returns that substring', () {
       expect(scanner.substring(3, 5), equals(' b'));
     });