Fix crash on missing libraries.json (#1472)

* Fix crash on missing libraries.json

* Addressed CR comments
diff --git a/dwds/CHANGELOG.md b/dwds/CHANGELOG.md
index 8941f9e..843f73a 100644
--- a/dwds/CHANGELOG.md
+++ b/dwds/CHANGELOG.md
@@ -7,6 +7,7 @@
 - Show an alert in the Dart Debug Extension for a multi-app scenario.
 - Fix a bug where `dartEmitDebugEvents` was set as a `String` instead of `bool`
   in the injected client.
+- Emit a warning instead of crashing on missing `libraries.json`.
 
 **Breaking changes:**
 
diff --git a/dwds/lib/src/utilities/dart_uri.dart b/dwds/lib/src/utilities/dart_uri.dart
index b9a3ab3..ecc839c 100644
--- a/dwds/lib/src/utilities/dart_uri.dart
+++ b/dwds/lib/src/utilities/dart_uri.dart
@@ -160,6 +160,7 @@
 
     librariesPath ??=
         p.toUri(p.join(_sdkDir.toFilePath(), 'lib', 'libraries.json'));
+
     var packagesUri = p.toUri(p.join(currentDirectory, '.packages'));
 
     clear();
@@ -169,6 +170,8 @@
 
   /// Clear the uri resolution tables.
   static void clear() {
+    _librariesSpec = null;
+    _packageConfig = null;
     _resolvedUriToUri.clear();
     _uriToResolvedUri.clear();
   }
@@ -198,8 +201,10 @@
       var json = File.fromUri(uri).readAsStringSync();
       _librariesSpec =
           LibrariesSpecification.parse(uri, json).specificationFor('dartdevc');
-    } on LibrariesSpecificationException catch (e, s) {
-      _logger.warning('Cannot read libraries spec: $uri', e, s);
+    } on LibrariesSpecificationException catch (e) {
+      _logger.warning('Cannot parse libraries spec: $uri', e);
+    } on FileSystemException catch (e) {
+      _logger.warning('Cannot read libraries spec: $uri', e);
     }
   }
 
diff --git a/dwds/test/dart_uri_test.dart b/dwds/test/dart_uri_test.dart
index 1dbd2a5..f5209bf 100644
--- a/dwds/test/dart_uri_test.dart
+++ b/dwds/test/dart_uri_test.dart
@@ -13,6 +13,7 @@
 import 'package:test/test.dart';
 
 import 'fixtures/fakes.dart';
+import 'fixtures/logging.dart';
 
 class TestStrategy extends FakeStrategy {
   @override
@@ -109,5 +110,58 @@
         expect(unresolved, 'dart:io');
       });
     });
+
+    group('initialized with other SDK directory with no libraries spec', () {
+      Directory outputDir;
+      var logs = <String>[];
+
+      void logWriter(level, message,
+          {String error, String loggerName, String stackTrace}) {
+        var errorMessage = error == null ? '' : ':\n$error';
+        var stackMessage = stackTrace == null ? '' : ':\n$stackTrace';
+        logs.add('[$level] $loggerName: $message'
+            '$errorMessage'
+            '$stackMessage');
+      }
+
+      setUpAll(() async {
+        configureLogWriter(customLogWriter: logWriter);
+        var systemTempDir = Directory.systemTemp;
+        outputDir = systemTempDir.createTempSync('foo bar');
+
+        var fakeSdkDir = outputDir.path;
+        var fakeLibrariesDir = p.join(fakeSdkDir, 'lib');
+        var fakeLibrariesPath = p.join(fakeLibrariesDir, 'libraries.json');
+
+        await DartUri.initialize(
+            sdkDir: Uri.file(fakeSdkDir),
+            librariesPath: Uri.file(fakeLibrariesPath));
+        await DartUri.recordAbsoluteUris(['dart:io', 'dart:html']);
+
+        expect(
+            logs,
+            containsAll([
+              contains('[WARNING] DartUri: Cannot read libraries spec:'),
+              contains('[WARNING] DartUri: Unresolved uri: dart:io'),
+              contains('[WARNING] DartUri: Unresolved uri: dart:html'),
+            ]));
+      });
+
+      tearDownAll(() async {
+        DartUri.clear();
+        await outputDir?.delete(recursive: true);
+      });
+
+      test('cannot resolve uris', () {
+        var resolved = DartUri.toResolvedUri('dart:io');
+        expect(resolved, null);
+      });
+
+      test('cannot unresolve uris', () {
+        var unresolved =
+            DartUri.toPackageUri('org-dartlang-sdk:///sdk/lib/io/io.dart');
+        expect(unresolved, null);
+      });
+    });
   });
 }