Merge the null_safety branch into master (#16)

diff --git a/.travis.yml b/.travis.yml
index de32a3b..e99f285 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,28 +1,39 @@
 language: dart
 
-# trying to get chrome working
-sudo: true
-
 dart:
-  - dev
-  - 2.7.0
+ - be/raw/latest
 
-dart_task:
-  - test: -p chrome,vm
-
-matrix:
+jobs:
   include:
-    # Only validate formatting using the dev release
-    - dart: dev
-      dart_task: dartfmt
-    - dart: dev
-      dart_task:
-        dartanalizer: --fatal-warnings --fatal-infos .
+    - stage: analyze_and_format
+      name: "Analyze"
+      dart: be/raw/latest
+      os: linux
+      script: dartanalyzer --enable-experiment=non-nullable --fatal-warnings --fatal-infos .
+    - stage: analyze_and_format
+      name: "Format"
+      dart: be/raw/latest
+      os: linux
+      script: dartfmt -n --set-exit-if-changed .
+    - stage: test
+      name: "Vm Tests"
+      dart: be/raw/latest
+      os: linux
+      script: pub run --enable-experiment=non-nullable test -p vm
+    - stage: test
+      name: "Web Tests"
+      dart: be/raw/latest
+      os: linux
+      script: pub run --enable-experiment=non-nullable test -p chrome
+
+stages:
+  - analyze_and_format
+  - test
 
 # Only building master means that we don't run two builds for each pull request.
 branches:
-  only: [master]
+  only: [master, null_safety]
 
 cache:
- directories:
-   - $HOME/.pub-cache
+  directories:
+    - $HOME/.pub-cache
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5bfef35..9b9df6a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.1.0
+
+* Migrate to null safety.
+
 ## 2.0.0
 
 ### Breaking Changes
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 76c449a..da905ca 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -4,3 +4,5 @@
     implicit-casts: false
   language:
     strict-raw-types: true
+  enable-experiment:
+    - non-nullable
diff --git a/lib/source_map_stack_trace.dart b/lib/source_map_stack_trace.dart
index fd1226a..51b5ec0 100644
--- a/lib/source_map_stack_trace.dart
+++ b/lib/source_map_stack_trace.dart
@@ -19,7 +19,7 @@
 /// [sdkRoot] is the URI surfaced in the stack traces for SDK libraries.
 /// If it's passed, stack frames from the SDK will have `dart:` URLs.
 StackTrace mapStackTrace(Mapping sourceMap, StackTrace stackTrace,
-    {bool minified = false, Map<String, Uri> packageMap, Uri sdkRoot}) {
+    {bool minified = false, Map<String, Uri>? packageMap, Uri? sdkRoot}) {
   if (stackTrace is Chain) {
     return Chain(stackTrace.traces.map((trace) {
       return Trace.from(mapStackTrace(sourceMap, trace,
@@ -31,24 +31,25 @@
 
   var trace = Trace.from(stackTrace);
   return Trace(trace.frames.map((frame) {
+    var line = frame.line;
     // If there's no line information, there's no way to translate this frame.
     // We could return it as-is, but these lines are usually not useful anyways.
-    if (frame.line == null) return null;
+    if (line == null) return null;
 
     // If there's no column, try using the first column of the line.
     var column = frame.column ?? 0;
 
     // Subtract 1 because stack traces use 1-indexed lines and columns and
     // source maps uses 0-indexed.
-    var span = sourceMap.spanFor(frame.line - 1, column - 1,
-        uri: frame.uri?.toString());
+    var span =
+        sourceMap.spanFor(line - 1, column - 1, uri: frame.uri.toString());
 
     // If we can't find a source span, ignore the frame. It's probably something
     // internal that the user doesn't care about.
     if (span == null) return null;
 
     var sourceUrl = span.sourceUrl.toString();
-    if (sdkRoot != null && p.url.isWithin(sdkLib, sourceUrl)) {
+    if (sdkLib != null && p.url.isWithin(sdkLib, sourceUrl)) {
       sourceUrl = 'dart:' + p.url.relative(sourceUrl, from: sdkLib);
     } else if (packageMap != null) {
       for (var package in packageMap.keys) {
@@ -70,8 +71,8 @@
         // use the minified member name.
         minified
             ? (span.isIdentifier ? span.text : frame.member)
-            : _prettifyMember(frame.member));
-  }).where((frame) => frame != null));
+            : _prettifyMember(frame.member!));
+  }).whereType<Frame>());
 }
 
 /// Reformats a JS member name to make it look more Dart-like.
@@ -86,7 +87,7 @@
           RegExp(r'(_+)closure\d*\.call$'),
           // The number of underscores before "closure" indicates how nested it
           // is.
-          (match) => '.<fn>' * match[1].length)
+          (match) => '.<fn>' * match[1]!.length)
       // Get rid of explicitly-generated calls.
       .replaceAll(RegExp(r'\.call$'), '')
       // Get rid of the top-level method prefix.
@@ -99,5 +100,5 @@
       // Convert underscores after identifiers to dots. This runs the risk of
       // incorrectly converting members that contain underscores, but those are
       // contrary to the style guide anyway.
-      .replaceAllMapped(RegExp(r'([a-zA-Z0-9]+)_'), (match) => match[1] + '.');
+      .replaceAllMapped(RegExp(r'([a-zA-Z0-9]+)_'), (match) => match[1]! + '.');
 }
diff --git a/pubspec.yaml b/pubspec.yaml
index ff5e7c7..c9db139 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,17 +1,95 @@
 name: source_map_stack_trace
-version: 2.0.0
+version: 2.1.0-nullsafety
 description: A package for applying source maps to stack traces.
 homepage: https://github.com/dart-lang/source_map_stack_trace
 
 environment:
-  sdk: '>=2.7.0 <3.0.0'
+  sdk: '>=2.9.0-18.0 <2.9.0'
 
 dependencies:
-  path: ^1.0.0
-  stack_trace: ^1.0.0
-  source_maps: ^0.10.2
+  path: '>=1.8.0-nullsafety <1.8.0'
+  stack_trace: '>=1.10.0-nullsafety <1.10.0'
+  source_maps: '>=0.11.0-nullsafety <0.11.0'
 
 dev_dependencies:
   source_span: ^1.6.0
   test: ^1.12.0
   pedantic: ^1.0.0
+
+dependency_overrides:
+  # Overrides required for a version solve
+  coverage: 0.14.0
+  # NNBD Branches
+  async:
+    git:
+      url: git://github.com/dart-lang/async.git
+      ref: null_safety
+  boolean_selector:
+    git:
+      url: git://github.com/dart-lang/boolean_selector.git
+      ref: null_safety
+  charcode:
+    git:
+      url: git://github.com/dart-lang/charcode.git
+      ref: null_safety
+  collection: 1.15.0-nullsafety
+  js:
+    git:
+      url: git://github.com/dart-lang/sdk.git
+      path: pkg/js
+  matcher:
+    git:
+      url: git://github.com/dart-lang/matcher.git
+      ref: null_safety
+  meta: 1.3.0-nullsafety
+  path:
+    git:
+      url: git://github.com/dart-lang/path.git
+      ref: null_safety
+  pedantic:
+    git:
+      url: git://github.com/dart-lang/pedantic.git
+      ref: null_safety
+  pool:
+    git:
+      url: git://github.com/dart-lang/pool.git
+      ref: null_safety
+  source_maps:
+    git:
+      url: git://github.com/dart-lang/source_maps.git
+      ref: null_safety
+  source_span:
+    git:
+      url: git://github.com/dart-lang/source_span.git
+      ref: null_safety
+  stack_trace:
+    git:
+      url: git://github.com/dart-lang/stack_trace.git
+      ref: null_safety
+  stream_channel:
+    git:
+      url: git://github.com/dart-lang/stream_channel.git
+      ref: null_safety
+  string_scanner:
+    git:
+      url: git://github.com/dart-lang/string_scanner.git
+      ref: null_safety
+  term_glyph:
+    git:
+      url: git://github.com/dart-lang/term_glyph.git
+      ref: null_safety
+  test:
+    git:
+      url: git://github.com/dart-lang/test.git
+      ref: null_safety
+      path: pkgs/test
+  test_api:
+    git:
+      url: git://github.com/dart-lang/test.git
+      ref: null_safety
+      path: pkgs/test_api
+  test_core:
+    git:
+      url: git://github.com/dart-lang/test.git
+      ref: null_safety
+      path: pkgs/test_core
diff --git a/test/source_map_stack_trace_test.dart b/test/source_map_stack_trace_test.dart
index 9f13306..ab92897 100644
--- a/test/source_map_stack_trace_test.dart
+++ b/test/source_map_stack_trace_test.dart
@@ -244,7 +244,7 @@
 /// Like [mapStackTrace], but is guaranteed to return a [Trace] so it can be
 /// inspected.
 Trace _mapTrace(Mapping sourceMap, StackTrace stackTrace,
-    {bool minified = false, Map<String, Uri> packageMap, Uri sdkRoot}) {
+    {bool minified = false, Map<String, Uri>? packageMap, Uri? sdkRoot}) {
   return Trace.from(mapStackTrace(sourceMap, stackTrace,
       minified: minified, packageMap: packageMap, sdkRoot: sdkRoot));
 }
@@ -252,13 +252,13 @@
 /// Like [mapStackTrace], but is guaranteed to return a [Chain] so it can be
 /// inspected.
 Chain _mapChain(Mapping sourceMap, StackTrace stackTrace,
-    {bool minified = false, Map<String, Uri> packageMap, Uri sdkRoot}) {
+    {bool minified = false, Map<String, Uri>? packageMap, Uri? sdkRoot}) {
   return Chain.forTrace(mapStackTrace(sourceMap, stackTrace,
       minified: minified, packageMap: packageMap, sdkRoot: sdkRoot));
 }
 
 /// Runs the mapper's prettification logic on [member] and returns the result.
-String _prettify(String member) {
+String? _prettify(String member) {
   var trace = Trace([Frame(Uri.parse('foo.dart.js'), 10, 11, member)]);
   return _mapTrace(_simpleMapping, trace).frames.first.member;
 }