diff --git a/.travis.yml b/.travis.yml
index 4496f3a..48e46ca 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,7 +2,7 @@
 
 dart:
   - dev
-  - stable
+  - 2.0.0
 
 dart_task:
   - test: --platform vm,chrome
@@ -13,7 +13,11 @@
     - dart: dev
       dart_task: dartfmt
     - dart: dev
-      dart_task: analyzer
+      dart_task:
+        dartanalyzer: --fatal-warnings --fatal-hints .
+    - dart: 2.0.0
+      dart_task:
+        dartanalyzer: --fatal-warnings .
 
 # Only building master means that we don't run two builds for each pull request.
 branches:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 43b9453..1fba528 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.0.5
+
+- Update Dart SDK constraint to `>=2.0.0 <3.0.0`.
+
 ## 1.0.4
 
 * Add @alwaysThrows annotation to error method.
diff --git a/analysis_options.yaml b/analysis_options.yaml
new file mode 100644
index 0000000..d5d5213
--- /dev/null
+++ b/analysis_options.yaml
@@ -0,0 +1,93 @@
+include: package:pedantic/analysis_options.yaml
+analyzer:
+#  strong-mode:
+#    implicit-casts: false
+linter:
+  rules:
+    - always_declare_return_types
+    #- annotate_overrides
+    - avoid_bool_literals_in_conditional_expressions
+    - avoid_classes_with_only_static_members
+    - avoid_empty_else
+    - avoid_function_literals_in_foreach_calls
+    - avoid_init_to_null
+    - avoid_null_checks_in_equality_operators
+    - avoid_relative_lib_imports
+    - avoid_renaming_method_parameters
+    - avoid_return_types_on_setters
+    #- avoid_returning_null
+    - avoid_returning_null_for_future
+    - avoid_returning_null_for_void
+    - avoid_returning_this
+    - avoid_shadowing_type_parameters
+    - avoid_single_cascade_in_expression_statements
+    - avoid_types_as_parameter_names
+    - avoid_unused_constructor_parameters
+    - await_only_futures
+    - camel_case_types
+    - cancel_subscriptions
+    #- cascade_invocations
+    - comment_references
+    - constant_identifier_names
+    - control_flow_in_finally
+    - directives_ordering
+    - empty_catches
+    - empty_constructor_bodies
+    - empty_statements
+    - file_names
+    - hash_and_equals
+    - implementation_imports
+    - invariant_booleans
+    - iterable_contains_unrelated_type
+    - join_return_with_assignment
+    - library_names
+    - library_prefixes
+    - list_remove_unrelated_type
+    - literal_only_boolean_expressions
+    - no_adjacent_strings_in_list
+    - no_duplicate_case_values
+    - non_constant_identifier_names
+    - null_closures
+    - omit_local_variable_types
+    - only_throw_errors
+    - overridden_fields
+    - package_api_docs
+    - package_names
+    - package_prefixed_library_names
+    - prefer_adjacent_string_concatenation
+    - prefer_collection_literals
+    - prefer_conditional_assignment
+    - prefer_const_constructors
+    - prefer_contains
+    - prefer_equal_for_default_values
+    - prefer_final_fields
+    #- prefer_final_locals
+    - prefer_generic_function_type_aliases
+    - prefer_initializing_formals
+    - prefer_interpolation_to_compose_strings
+    - prefer_is_empty
+    - prefer_is_not_empty
+    - prefer_null_aware_operators
+    #- prefer_single_quotes
+    - prefer_typing_uninitialized_variables
+    - recursive_getters
+    - slash_for_doc_comments
+    - test_types_in_equals
+    - throw_in_finally
+    - type_init_formals
+    - unawaited_futures
+    - unnecessary_await_in_return
+    - unnecessary_brace_in_string_interps
+    - unnecessary_const
+    - unnecessary_getters_setters
+    - unnecessary_lambdas
+    - unnecessary_new
+    - unnecessary_null_aware_assignments
+    - unnecessary_parenthesis
+    - unnecessary_statements
+    - unnecessary_this
+    - unrelated_type_equality_checks
+    - use_function_type_syntax_for_parameters
+    - use_rethrow_when_possible
+    - valid_regexps
+    - void_checks
diff --git a/lib/src/eager_span_scanner.dart b/lib/src/eager_span_scanner.dart
index 96c7362..a2df0f8 100644
--- a/lib/src/eager_span_scanner.dart
+++ b/lib/src/eager_span_scanner.dart
@@ -11,7 +11,7 @@
 // sdk#23770 is fully complete, we should move the shared code into a mixin.
 
 /// A regular expression matching newlines across platforms.
-final _newlineRegExp = new 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 {
@@ -22,14 +22,14 @@
   int _column = 0;
 
   LineScannerState get state =>
-      new _EagerSpanScannerState(this, position, line, column);
+      _EagerSpanScannerState(this, position, line, column);
 
   bool get _betweenCRLF => peekChar(-1) == $cr && peekChar() == $lf;
 
   set state(LineScannerState state) {
     if (state is! _EagerSpanScannerState ||
         !identical((state as _EagerSpanScannerState)._scanner, this)) {
-      throw new ArgumentError("The given LineScannerState was not returned by "
+      throw ArgumentError("The given LineScannerState was not returned by "
           "this LineScanner.");
     }
 
diff --git a/lib/src/exception.dart b/lib/src/exception.dart
index 84bf5e8..3710ae8 100644
--- a/lib/src/exception.dart
+++ b/lib/src/exception.dart
@@ -4,6 +4,8 @@
 
 import 'package:source_span/source_span.dart';
 
+import 'string_scanner.dart';
+
 /// An exception thrown by a [StringScanner] that failed to parse a string.
 class StringScannerException extends SourceSpanFormatException {
   String get source => super.source;
diff --git a/lib/src/line_scanner.dart b/lib/src/line_scanner.dart
index 5182035..e16302a 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 = new 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 {
@@ -29,7 +29,7 @@
   ///
   /// This does not include the scanner's match information.
   LineScannerState get state =>
-      new LineScannerState._(this, position, line, column);
+      LineScannerState._(this, position, line, column);
 
   /// Whether the current position is between a CR character and an LF
   /// charactet.
@@ -37,7 +37,7 @@
 
   set state(LineScannerState state) {
     if (!identical(state._scanner, this)) {
-      throw new ArgumentError("The given LineScannerState was not returned by "
+      throw ArgumentError("The given LineScannerState was not returned by "
           "this LineScanner.");
     }
 
diff --git a/lib/src/relative_span_scanner.dart b/lib/src/relative_span_scanner.dart
index 088ff48..1a992e4 100644
--- a/lib/src/relative_span_scanner.dart
+++ b/lib/src/relative_span_scanner.dart
@@ -19,7 +19,7 @@
 class RelativeSpanScanner extends StringScanner implements SpanScanner {
   /// The source of the scanner.
   ///
-  /// This caches line break information and is used to generate [Span]s.
+  /// This caches line break information and is used to generate [SourceSpan]s.
   final SourceFile _sourceFile;
 
   /// The start location of the span within which this scanner is scanning.
@@ -40,16 +40,16 @@
         : column;
   }
 
-  LineScannerState get state => new _SpanScannerState(this, position);
+  LineScannerState get state => _SpanScannerState(this, position);
 
   set state(LineScannerState state) {
     if (state is! _SpanScannerState ||
         !identical((state as _SpanScannerState)._scanner, this)) {
-      throw new ArgumentError("The given LineScannerState was not returned by "
+      throw ArgumentError("The given LineScannerState was not returned by "
           "this LineScanner.");
     }
 
-    this.position = state.position;
+    position = state.position;
   }
 
   FileSpan get lastSpan => _lastSpan;
@@ -86,14 +86,12 @@
     validateErrorArgs(string, match, position, length);
 
     if (match == null && position == null && length == null) match = lastMatch;
-    if (position == null) {
-      position = match == null ? this.position : match.start;
-    }
-    if (length == null) length = match == null ? 1 : match.end - match.start;
+    position ??= match == null ? this.position : match.start;
+    length ??= match == null ? 1 : match.end - match.start;
 
     var span = _sourceFile.span(_startLocation.offset + position,
         _startLocation.offset + position + length);
-    throw new StringScannerException(message, span, string);
+    throw StringScannerException(message, span, string);
   }
 }
 
diff --git a/lib/src/span_scanner.dart b/lib/src/span_scanner.dart
index a629f13..d332216 100644
--- a/lib/src/span_scanner.dart
+++ b/lib/src/span_scanner.dart
@@ -12,26 +12,26 @@
 import 'utils.dart';
 
 /// A subclass of [LineScanner] that exposes matched ranges as source map
-/// [Span]s.
+/// [FileSpan]s.
 class SpanScanner extends StringScanner implements LineScanner {
   /// The source of the scanner.
   ///
-  /// This caches line break information and is used to generate [Span]s.
+  /// This caches line break information and is used to generate [FileSpan]s.
   final SourceFile _sourceFile;
 
   int get line => _sourceFile.getLine(position);
   int get column => _sourceFile.getColumn(position);
 
-  LineScannerState get state => new _SpanScannerState(this, position);
+  LineScannerState get state => _SpanScannerState(this, position);
 
   set state(LineScannerState state) {
     if (state is! _SpanScannerState ||
         !identical((state as _SpanScannerState)._scanner, this)) {
-      throw new ArgumentError("The given LineScannerState was not returned by "
+      throw ArgumentError("The given LineScannerState was not returned by "
           "this LineScanner.");
     }
 
-    this.position = state.position;
+    position = state.position;
   }
 
   /// The [FileSpan] for [lastMatch].
@@ -57,7 +57,7 @@
   /// [FileSpan]s as well as for error reporting. It can be a [String], a
   /// [Uri], or `null`.
   SpanScanner(String string, {sourceUrl, int position})
-      : _sourceFile = new SourceFile.fromString(string, url: sourceUrl),
+      : _sourceFile = SourceFile.fromString(string, url: sourceUrl),
         super(string, sourceUrl: sourceUrl, position: position);
 
   /// Creates a new [SpanScanner] that eagerly computes line and column numbers.
@@ -76,9 +76,9 @@
 
   /// Creates a new [SpanScanner] that scans within [span].
   ///
-  /// This scans through [span.text], but emits new spans from [span.file] in
+  /// 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]`.text`, and [position], [line], and [column] are all relative to the
   /// span.
   factory SpanScanner.within(FileSpan span) = RelativeSpanScanner;
 
@@ -103,13 +103,11 @@
     validateErrorArgs(string, match, position, length);
 
     if (match == null && position == null && length == null) match = lastMatch;
-    if (position == null) {
-      position = match == null ? this.position : match.start;
-    }
-    if (length == null) length = match == null ? 0 : match.end - match.start;
+    position ??= match == null ? this.position : match.start;
+    length ??= match == null ? 0 : match.end - match.start;
 
     var span = _sourceFile.span(position, position + length);
-    throw new StringScannerException(message, span, string);
+    throw StringScannerException(message, span, string);
   }
 }
 
diff --git a/lib/src/string_scanner.dart b/lib/src/string_scanner.dart
index d32dc38..4506355 100644
--- a/lib/src/string_scanner.dart
+++ b/lib/src/string_scanner.dart
@@ -12,7 +12,7 @@
 /// When compiled to JS, forward slashes are always escaped in [RegExp.pattern].
 ///
 /// See issue 17998.
-final _slashAutoEscape = new RegExp("/").pattern == "\\/";
+final _slashAutoEscape = RegExp("/").pattern == "\\/";
 
 /// A class that scans through a string using [Pattern]s.
 class StringScanner {
@@ -29,7 +29,7 @@
   int get position => _position;
   set position(int position) {
     if (position < 0 || position > string.length) {
-      throw new ArgumentError("Invalid position $position");
+      throw ArgumentError("Invalid position $position");
     }
 
     _position = position;
@@ -84,7 +84,7 @@
   /// This returns `null` if [offset] points outside the string. It doesn't
   /// affect [lastMatch].
   int peekChar([int offset]) {
-    if (offset == null) offset = 0;
+    offset ??= 0;
     var index = position + offset;
     if (index < 0 || index >= string.length) return null;
     return string.codeUnitAt(index);
@@ -115,7 +115,7 @@
       } else if (character == $double_quote) {
         name = r'"\""';
       } else {
-        name = '"${new String.fromCharCode(character)}"';
+        name = '"${String.fromCharCode(character)}"';
       }
     }
 
@@ -181,7 +181,7 @@
   /// Unlike [String.substring], [end] defaults to [position] rather than the
   /// end of the string.
   String substring(int start, [int end]) {
-    if (end == null) end = position;
+    end ??= position;
     return string.substring(start, end);
   }
 
@@ -203,20 +203,18 @@
     validateErrorArgs(string, match, position, length);
 
     if (match == null && position == null && length == null) match = lastMatch;
-    if (position == null) {
-      position = match == null ? this.position : match.start;
-    }
-    if (length == null) length = match == null ? 0 : match.end - match.start;
+    position ??= match == null ? this.position : match.start;
+    length ??= match == null ? 0 : match.end - match.start;
 
-    var sourceFile = new SourceFile.fromString(string, url: sourceUrl);
+    var sourceFile = SourceFile.fromString(string, url: sourceUrl);
     var span = sourceFile.span(position, position + length);
-    throw new StringScannerException(message, span, string);
+    throw StringScannerException(message, span, string);
   }
 
   // TODO(nweiz): Make this handle long lines more gracefully.
   /// Throws a [FormatException] describing that [name] is expected at the
   /// current position in the string.
   void _fail(String name) {
-    error("expected $name.", position: this.position, length: 0);
+    error("expected $name.", position: position, length: 0);
   }
 }
diff --git a/lib/src/utils.dart b/lib/src/utils.dart
index aa3e957..df29ba2 100644
--- a/lib/src/utils.dart
+++ b/lib/src/utils.dart
@@ -2,27 +2,29 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'string_scanner.dart';
+
 /// Validates the arguments passed to [StringScanner.error].
 void validateErrorArgs(String string, Match match, int position, int length) {
   if (match != null && (position != null || length != null)) {
-    throw new ArgumentError("Can't pass both match and position/length.");
+    throw ArgumentError("Can't pass both match and position/length.");
   }
 
   if (position != null) {
     if (position < 0) {
-      throw new 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 new RangeError("position must be less than or equal to the "
+      throw RangeError("position must be less than or equal to the "
           "string length.");
     }
   }
 
   if (length != null && length < 0) {
-    throw new 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 new RangeError("position plus length must not go beyond the end of "
+    throw RangeError("position plus length must not go beyond the end of "
         "the string.");
   }
 }
diff --git a/pubspec.yaml b/pubspec.yaml
index 7691990..2bc50d6 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,12 +1,12 @@
 name: string_scanner
-version: 1.0.4
+version: 1.0.5-dev
 
 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:
-  sdk: '>=1.8.0 <3.0.0'
+  sdk: '>=2.0.0 <3.0.0'
 
 dependencies:
   charcode: ^1.1.0
@@ -14,5 +14,5 @@
   source_span: ^1.4.0
 
 dev_dependencies:
-  test: '>=0.12.0 <2.0.0'
+  test: ^1.0.0
 
diff --git a/test/error_test.dart b/test/error_test.dart
index 166077d..b966b1b 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 = new StringScanner('foo bar baz');
+    var scanner = StringScanner('foo bar baz');
     scanner.expect('foo ');
     scanner.expect('bar');
     expect(() => scanner.error('oh no!'), throwsStringScannerException('bar'));
@@ -17,7 +17,7 @@
 
   group("with match", () {
     test('supports an earlier match', () {
-      var scanner = new StringScanner('foo bar baz');
+      var scanner = StringScanner('foo bar baz');
       scanner.expect('foo ');
       var match = scanner.lastMatch;
       scanner.expect('bar');
@@ -26,8 +26,7 @@
     });
 
     test('supports a match on a previous line', () {
-      var scanner =
-          new StringScanner('foo bar baz\ndo re mi\nearth fire water');
+      var scanner = StringScanner('foo bar baz\ndo re mi\nearth fire water');
       scanner.expect('foo bar baz\ndo ');
       scanner.expect('re');
       var match = scanner.lastMatch;
@@ -37,8 +36,7 @@
     });
 
     test('supports a multiline match', () {
-      var scanner =
-          new StringScanner('foo bar baz\ndo re mi\nearth fire water');
+      var scanner = StringScanner('foo bar baz\ndo re mi\nearth fire water');
       scanner.expect('foo bar ');
       scanner.expect('baz\ndo');
       var match = scanner.lastMatch;
@@ -48,7 +46,7 @@
     });
 
     test('supports a match after position', () {
-      var scanner = new StringScanner('foo bar baz');
+      var scanner = StringScanner('foo bar baz');
       scanner.expect('foo ');
       scanner.expect('bar');
       var match = scanner.lastMatch;
@@ -60,59 +58,57 @@
 
   group("with position and/or length", () {
     test('defaults to length 0', () {
-      var scanner = new StringScanner('foo bar baz');
+      var scanner = StringScanner('foo bar baz');
       scanner.expect('foo ');
       expect(() => scanner.error('oh no!', position: 1),
           throwsStringScannerException(''));
     });
 
     test('defaults to the current position', () {
-      var scanner = new StringScanner('foo bar baz');
+      var scanner = StringScanner('foo bar baz');
       scanner.expect('foo ');
       expect(() => scanner.error('oh no!', length: 3),
           throwsStringScannerException('bar'));
     });
 
     test('supports an earlier position', () {
-      var scanner = new StringScanner('foo bar baz');
+      var 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 =
-          new StringScanner('foo bar baz\ndo re mi\nearth fire water');
+      var 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 =
-          new StringScanner('foo bar baz\ndo re mi\nearth fire water');
+      var 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 = new StringScanner('foo bar baz');
+      var scanner = StringScanner('foo bar baz');
       expect(() => scanner.error('oh no!', position: 4, length: 3),
           throwsStringScannerException('bar'));
     });
 
     test('supports a length of zero', () {
-      var scanner = new StringScanner('foo bar baz');
+      var scanner = StringScanner('foo bar baz');
       expect(() => scanner.error('oh no!', position: 4, length: 0),
           throwsStringScannerException(''));
     });
   });
 
   group("argument errors", () {
-    var scanner;
+    StringScanner scanner;
     setUp(() {
-      scanner = new StringScanner('foo bar baz');
+      scanner = StringScanner('foo bar baz');
       scanner.scan('foo');
     });
 
diff --git a/test/line_scanner_test.dart b/test/line_scanner_test.dart
index ed04b37..8767142 100644
--- a/test/line_scanner_test.dart
+++ b/test/line_scanner_test.dart
@@ -7,9 +7,9 @@
 import 'package:test/test.dart';
 
 void main() {
-  var scanner;
+  LineScanner scanner;
   setUp(() {
-    scanner = new LineScanner('foo\nbar\r\nbaz');
+    scanner = LineScanner('foo\nbar\r\nbaz');
   });
 
   test('begins with line and column 0', () {
@@ -162,7 +162,7 @@
   test("state= rejects a foreign state", () {
     scanner.scan('foo\nb');
 
-    expect(() => new LineScanner(scanner.string).state = scanner.state,
+    expect(() => LineScanner(scanner.string).state = scanner.state,
         throwsArgumentError);
   });
 }
diff --git a/test/span_scanner_test.dart b/test/span_scanner_test.dart
index 37a01e0..65694ea 100644
--- a/test/span_scanner_test.dart
+++ b/test/span_scanner_test.dart
@@ -10,23 +10,22 @@
 
 void main() {
   testForImplementation("lazy", ([String string]) {
-    return new SpanScanner(string ?? 'foo\nbar\nbaz', sourceUrl: 'source');
+    return SpanScanner(string ?? 'foo\nbar\nbaz', sourceUrl: 'source');
   });
 
   testForImplementation("eager", ([String string]) {
-    return new SpanScanner.eager(string ?? 'foo\nbar\nbaz',
-        sourceUrl: 'source');
+    return SpanScanner.eager(string ?? 'foo\nbar\nbaz', sourceUrl: 'source');
   });
 
   group("within", () {
     var text = 'first\nbefore: foo\nbar\nbaz :after\nlast';
     var startOffset = text.indexOf('foo');
 
-    var scanner;
+    SpanScanner scanner;
     setUp(() {
-      var file = new SourceFile.fromString(text, url: 'source');
-      scanner = new SpanScanner.within(
-          file.span(startOffset, text.indexOf(' :after')));
+      var file = SourceFile.fromString(text, url: 'source');
+      scanner =
+          SpanScanner.within(file.span(startOffset, text.indexOf(' :after')));
     });
 
     test("string only includes the span text", () {
@@ -104,9 +103,10 @@
   });
 }
 
-void testForImplementation(String name, SpanScanner create([String string])) {
+void testForImplementation(
+    String name, SpanScanner Function([String string]) create) {
   group("for a $name scanner", () {
-    var scanner;
+    SpanScanner scanner;
     setUp(() => scanner = create());
 
     test("tracks the span for the last match", () {
diff --git a/test/string_scanner_test.dart b/test/string_scanner_test.dart
index 30711f5..9d6d6b8 100644
--- a/test/string_scanner_test.dart
+++ b/test/string_scanner_test.dart
@@ -8,9 +8,9 @@
 
 void main() {
   group('with an empty string', () {
-    var scanner;
+    StringScanner scanner;
     setUp(() {
-      scanner = new StringScanner('');
+      scanner = StringScanner('');
     });
 
     test('is done', () {
@@ -55,19 +55,19 @@
     });
 
     test("scan returns false and doesn't change the state", () {
-      expect(scanner.scan(new RegExp('.')), isFalse);
+      expect(scanner.scan(RegExp('.')), isFalse);
       expect(scanner.lastMatch, isNull);
       expect(scanner.position, equals(0));
     });
 
     test("expect throws a FormatException and doesn't change the state", () {
-      expect(() => scanner.expect(new RegExp('.')), throwsFormatException);
+      expect(() => scanner.expect(RegExp('.')), throwsFormatException);
       expect(scanner.lastMatch, isNull);
       expect(scanner.position, equals(0));
     });
 
     test("matches returns false and doesn't change the state", () {
-      expect(scanner.matches(new RegExp('.')), isFalse);
+      expect(scanner.matches(RegExp('.')), isFalse);
       expect(scanner.lastMatch, isNull);
       expect(scanner.position, equals(0));
     });
@@ -90,9 +90,9 @@
   });
 
   group('at the beginning of a string', () {
-    var scanner;
+    StringScanner scanner;
     setUp(() {
-      scanner = new StringScanner('foo bar');
+      scanner = StringScanner('foo bar');
     });
 
     test('is not done', () {
@@ -155,24 +155,24 @@
     });
 
     test("a matching scan returns true and changes the state", () {
-      expect(scanner.scan(new RegExp('f(..)')), isTrue);
+      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", () {
-      expect(scanner.matches(new RegExp('f(..)')), isTrue);
+      expect(scanner.matches(RegExp('f(..)')), isTrue);
       expect(scanner.lastMatch, isNotNull);
 
-      expect(scanner.scan(new RegExp('b(..)')), isFalse);
+      expect(scanner.scan(RegExp('b(..)')), isFalse);
       expect(scanner.lastMatch, isNull);
       expect(scanner.position, equals(0));
       expect(scanner.rest, equals('foo bar'));
     });
 
     test("a matching expect changes the state", () {
-      scanner.expect(new RegExp('f(..)'));
+      scanner.expect(RegExp('f(..)'));
       expect(scanner.lastMatch[1], equals('oo'));
       expect(scanner.position, equals(3));
       expect(scanner.rest, equals(' bar'));
@@ -181,17 +181,17 @@
     test(
         "a non-matching expect throws a FormatException and sets lastMatch to "
         "null", () {
-      expect(scanner.matches(new RegExp('f(..)')), isTrue);
+      expect(scanner.matches(RegExp('f(..)')), isTrue);
       expect(scanner.lastMatch, isNotNull);
 
-      expect(() => scanner.expect(new RegExp('b(..)')), throwsFormatException);
+      expect(() => scanner.expect(RegExp('b(..)')), throwsFormatException);
       expect(scanner.lastMatch, isNull);
       expect(scanner.position, equals(0));
       expect(scanner.rest, equals('foo bar'));
     });
 
     test("a matching matches returns true and only changes lastMatch", () {
-      expect(scanner.matches(new RegExp('f(..)')), isTrue);
+      expect(scanner.matches(RegExp('f(..)')), isTrue);
       expect(scanner.lastMatch[1], equals('oo'));
       expect(scanner.position, equals(0));
       expect(scanner.rest, equals('foo bar'));
@@ -199,7 +199,7 @@
 
     test("a non-matching matches returns false and doesn't change the state",
         () {
-      expect(scanner.matches(new RegExp('b(..)')), isFalse);
+      expect(scanner.matches(RegExp('b(..)')), isFalse);
       expect(scanner.lastMatch, isNull);
       expect(scanner.position, equals(0));
       expect(scanner.rest, equals('foo bar'));
@@ -222,7 +222,7 @@
       expect(scanner.position, equals(1));
       expect(scanner.rest, equals('oo bar'));
 
-      expect(scanner.scan(new RegExp('oo.')), isTrue);
+      expect(scanner.scan(RegExp('oo.')), isTrue);
       expect(scanner.lastMatch[0], equals('oo '));
       expect(scanner.position, equals(4));
       expect(scanner.rest, equals('bar'));
@@ -248,12 +248,12 @@
     });
 
     test('scans multiple times', () {
-      expect(scanner.scan(new RegExp('f(..)')), isTrue);
+      expect(scanner.scan(RegExp('f(..)')), isTrue);
       expect(scanner.lastMatch[1], equals('oo'));
       expect(scanner.position, equals(3));
       expect(scanner.rest, equals(' bar'));
 
-      expect(scanner.scan(new RegExp(' b(..)')), isTrue);
+      expect(scanner.scan(RegExp(' b(..)')), isTrue);
       expect(scanner.lastMatch[1], equals('ar'));
       expect(scanner.position, equals(7));
       expect(scanner.rest, equals(''));
@@ -263,9 +263,9 @@
   });
 
   group('after a scan', () {
-    var scanner;
+    StringScanner scanner;
     setUp(() {
-      scanner = new StringScanner('foo bar');
+      scanner = StringScanner('foo bar');
       expect(scanner.scan('foo'), isTrue);
     });
 
@@ -289,9 +289,9 @@
   });
 
   group('at the end of a string', () {
-    var scanner;
+    StringScanner scanner;
     setUp(() {
-      scanner = new StringScanner('foo bar');
+      scanner = StringScanner('foo bar');
       expect(scanner.scan('foo bar'), isTrue);
     });
 
@@ -333,19 +333,19 @@
     });
 
     test("scan returns false and sets lastMatch to null", () {
-      expect(scanner.scan(new RegExp('.')), isFalse);
+      expect(scanner.scan(RegExp('.')), isFalse);
       expect(scanner.lastMatch, isNull);
       expect(scanner.position, equals(7));
     });
 
     test("expect throws a FormatException and sets lastMatch to null", () {
-      expect(() => scanner.expect(new RegExp('.')), throwsFormatException);
+      expect(() => scanner.expect(RegExp('.')), throwsFormatException);
       expect(scanner.lastMatch, isNull);
       expect(scanner.position, equals(7));
     });
 
     test("matches returns false sets lastMatch to null", () {
-      expect(scanner.matches(new RegExp('.')), isFalse);
+      expect(scanner.matches(RegExp('.')), isFalse);
       expect(scanner.lastMatch, isNull);
       expect(scanner.position, equals(7));
     });
@@ -367,7 +367,7 @@
       expect(scanner.position, equals(1));
       expect(scanner.rest, equals('oo bar'));
 
-      expect(scanner.scan(new RegExp('oo.')), isTrue);
+      expect(scanner.scan(RegExp('oo.')), isTrue);
       expect(scanner.lastMatch[0], equals('oo '));
       expect(scanner.position, equals(4));
       expect(scanner.rest, equals('bar'));
@@ -395,24 +395,22 @@
 
   group('a scanner constructed with a custom position', () {
     test('starts scanning from that position', () {
-      var scanner = new StringScanner('foo bar', position: 1);
+      var scanner = StringScanner('foo bar', position: 1);
       expect(scanner.position, equals(1));
       expect(scanner.rest, equals('oo bar'));
 
-      expect(scanner.scan(new RegExp('oo.')), isTrue);
+      expect(scanner.scan(RegExp('oo.')), isTrue);
       expect(scanner.lastMatch[0], equals('oo '));
       expect(scanner.position, equals(4));
       expect(scanner.rest, equals('bar'));
     });
 
     test('throws an ArgumentError if the position is -1', () {
-      expect(() => new StringScanner('foo bar', position: -1),
-          throwsArgumentError);
+      expect(() => StringScanner('foo bar', position: -1), throwsArgumentError);
     });
 
     test('throws an ArgumentError if the position is beyond the string', () {
-      expect(
-          () => new StringScanner('foo bar', position: 8), throwsArgumentError);
+      expect(() => StringScanner('foo bar', position: 8), throwsArgumentError);
     });
   });
 }
diff --git a/test/utils.dart b/test/utils.dart
index 7767fbc..676b695 100644
--- a/test/utils.dart
+++ b/test/utils.dart
@@ -5,13 +5,8 @@
 import 'package:string_scanner/string_scanner.dart';
 import 'package:test/test.dart';
 
-/// Returns a matcher that asserts that a closure throws a [FormatException]
-/// with the given [message].
-Matcher throwsStringScannerException(String text) {
-  return throwsA(predicate((error) {
-    // ignore: deprecated_member_use
-    expect(error, new isInstanceOf<StringScannerException>());
-    expect(error.span.text, equals(text));
-    return true;
-  }));
-}
+/// Returns a matcher that asserts that a closure throws a
+/// [StringScannerException] with the given [text].
+Matcher throwsStringScannerException(String text) =>
+    throwsA(const TypeMatcher<StringScannerException>()
+        .having((e) => e.span.text, 'span.text', text));
