Move front_end's libraries.json parser to _fe_analyzer_shared

Bug: https://github.com/dart-lang/sdk/issues/35081
Change-Id: Idd1c68a871ace37e45970e5452a59fd655445fd3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/216100
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
Commit-Queue: Samuel Rawlins <srawlins@google.com>
diff --git a/pkg/front_end/lib/src/base/libraries_specification.dart b/pkg/_fe_analyzer_shared/lib/src/util/libraries_specification.dart
similarity index 98%
rename from pkg/front_end/lib/src/base/libraries_specification.dart
rename to pkg/_fe_analyzer_shared/lib/src/util/libraries_specification.dart
index ad345f4..bbc64f4 100644
--- a/pkg/front_end/lib/src/base/libraries_specification.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/util/libraries_specification.dart
@@ -87,11 +87,9 @@
 /// https://github.com/dart-lang/sdk/issues/28836), but for now we need to pay
 /// close attention to change them consistently.
 
-// TODO(sigmund): move this file to a shared package.
 import 'dart:convert' show jsonDecode, jsonEncode;
 
-import 'package:_fe_analyzer_shared/src/util/relativize.dart'
-    show relativizeUri, isWindows;
+import 'relativize.dart' show relativizeUri, isWindows;
 
 /// Contents from a single library specification file.
 ///
diff --git a/pkg/front_end/test/src/base/libraries_specification_test.dart b/pkg/_fe_analyzer_shared/test/util/libraries_specification_test.dart
similarity index 90%
rename from pkg/front_end/test/src/base/libraries_specification_test.dart
rename to pkg/_fe_analyzer_shared/test/util/libraries_specification_test.dart
index 033a877..10f9717 100644
--- a/pkg/front_end/test/src/base/libraries_specification_test.dart
+++ b/pkg/_fe_analyzer_shared/test/util/libraries_specification_test.dart
@@ -2,9 +2,7 @@
 // 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.
 
-// @dart = 2.9
-
-import 'package:front_end/src/base/libraries_specification.dart';
+import 'package:_fe_analyzer_shared/src/util/libraries_specification.dart';
 import 'package:test/test.dart';
 
 void main() {
@@ -91,7 +89,7 @@
       ''';
       var spec = LibrariesSpecification.parse(
           Uri.parse('org-dartlang-test:///f.json'), jsonString);
-      expect(spec.specificationFor("none").libraryInfoFor("c").patches.first,
+      expect(spec.specificationFor("none").libraryInfoFor("c")!.patches.first,
           Uri.parse('org-dartlang-test:///a.dart'));
 
       jsonString = '''
@@ -108,7 +106,7 @@
       ''';
       spec = LibrariesSpecification.parse(
           Uri.parse('org-dartlang-test:///f.json'), jsonString);
-      expect(spec.specificationFor("none").libraryInfoFor("c").patches.first,
+      expect(spec.specificationFor("none").libraryInfoFor("c")!.patches.first,
           Uri.parse('org-dartlang-test:///a.dart'));
     });
 
@@ -120,7 +118,7 @@
           Uri.parse('org-dartlang-test:///one/two/f.json'), jsonString);
       expect(spec, isNotNull);
       expect(
-          spec.specificationFor('none').libraryInfoFor('c').patches, isEmpty);
+          spec.specificationFor('none').libraryInfoFor('c')!.patches, isEmpty);
     });
 
     test('library paths are resolved from spec uri', () async {
@@ -130,7 +128,7 @@
 
       var spec = LibrariesSpecification.parse(
           Uri.parse('org-dartlang-test:///one/two/f.json'), jsonString);
-      expect(spec.specificationFor('none').libraryInfoFor('c').uri,
+      expect(spec.specificationFor('none').libraryInfoFor('c')!.uri,
           Uri.parse('org-dartlang-test:///one/two/c/main.dart'));
     });
 
@@ -153,9 +151,9 @@
 
       var spec = LibrariesSpecification.parse(
           Uri.parse('org-dartlang-test:///one/two/f.json'), jsonString);
-      expect(spec.specificationFor('none').libraryInfoFor('c').patches[0],
+      expect(spec.specificationFor('none').libraryInfoFor('c')!.patches[0],
           Uri.parse('org-dartlang-test:///one/a/p1.dart'));
-      expect(spec.specificationFor('none').libraryInfoFor('c').patches[1],
+      expect(spec.specificationFor('none').libraryInfoFor('c')!.patches[1],
           Uri.parse('org-dartlang-test:///one/a/p2.dart'));
     });
 
@@ -192,11 +190,11 @@
       var spec = LibrariesSpecification.parse(
           Uri.parse('org-dartlang-test:///one/two/f.json'), jsonString);
 
-      expect(spec.specificationFor('vm').libraryInfoFor('foo').uri,
+      expect(spec.specificationFor('vm').libraryInfoFor('foo')!.uri,
           Uri.parse('org-dartlang-test:///one/two/a/main.dart'));
-      expect(spec.specificationFor('vm').libraryInfoFor('bar').uri,
+      expect(spec.specificationFor('vm').libraryInfoFor('bar')!.uri,
           Uri.parse('org-dartlang-test:///one/two/b/main.dart'));
-      expect(spec.specificationFor('none').libraryInfoFor('c').uri,
+      expect(spec.specificationFor('none').libraryInfoFor('c')!.uri,
           Uri.parse('org-dartlang-test:///one/two/c/main.dart'));
     });
 
@@ -242,12 +240,12 @@
       ''';
       var spec = LibrariesSpecification.parse(
           Uri.parse('org-dartlang-test:///one/two/f.json'), jsonString);
+      expect(spec.specificationFor('vm').libraryInfoFor('foo')!.isSupported,
+          false);
       expect(
-          spec.specificationFor('vm').libraryInfoFor('foo').isSupported, false);
+          spec.specificationFor('vm').libraryInfoFor('bar')!.isSupported, true);
       expect(
-          spec.specificationFor('vm').libraryInfoFor('bar').isSupported, true);
-      expect(
-          spec.specificationFor('vm').libraryInfoFor('baz').isSupported, true);
+          spec.specificationFor('vm').libraryInfoFor('baz')!.isSupported, true);
     });
   });
 
diff --git a/pkg/front_end/lib/src/api_prototype/compiler_options.dart b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
index 7f14df8..e1b7997 100644
--- a/pkg/front_end/lib/src/api_prototype/compiler_options.dart
+++ b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
@@ -55,8 +55,8 @@
   ///
   /// A libraries specification file is a JSON file that describes how to map
   /// `dart:*` libraries to URIs in the underlying [fileSystem].  See
-  /// `package:front_end/src/base/libraries_specification.dart` for details on
-  /// the format.
+  /// `package:_fe_analyzer_shared/src/util/libraries_specification.dart` for
+  /// details on the format.
   ///
   /// If a value is not specified and `compileSdk = true`, the compiler will
   /// infer at a default location under [sdkRoot], typically under
diff --git a/pkg/front_end/lib/src/api_unstable/dart2js.dart b/pkg/front_end/lib/src/api_unstable/dart2js.dart
index e811ba1..18d185d 100644
--- a/pkg/front_end/lib/src/api_unstable/dart2js.dart
+++ b/pkg/front_end/lib/src/api_unstable/dart2js.dart
@@ -12,6 +12,9 @@
 
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show StringToken;
 
+import 'package:_fe_analyzer_shared/src/util/libraries_specification.dart'
+    show LibrariesSpecification;
+
 import 'package:kernel/kernel.dart' show Component;
 
 import 'package:kernel/ast.dart' as ir;
@@ -29,8 +32,6 @@
 
 import '../base/processed_options.dart' show ProcessedOptions;
 
-import '../base/libraries_specification.dart' show LibrariesSpecification;
-
 import '../base/nnbd_mode.dart' show NnbdMode;
 
 import '../fasta/compiler_context.dart' show CompilerContext;
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index de2886d..b1377c6 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -8,6 +8,12 @@
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
 
+import 'package:_fe_analyzer_shared/src/util/libraries_specification.dart'
+    show
+        LibrariesSpecification,
+        LibrariesSpecificationException,
+        TargetLibrariesSpecification;
+
 import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;
 
 import 'package:kernel/kernel.dart'
@@ -70,12 +76,6 @@
 
 import '../fasta/uri_translator.dart' show UriTranslator;
 
-import 'libraries_specification.dart'
-    show
-        LibrariesSpecification,
-        LibrariesSpecificationException,
-        TargetLibrariesSpecification;
-
 import 'nnbd_mode.dart';
 
 /// All options needed for the front end implementation.
diff --git a/pkg/front_end/lib/src/fasta/uri_translator.dart b/pkg/front_end/lib/src/fasta/uri_translator.dart
index c6777ee..cf624b4 100644
--- a/pkg/front_end/lib/src/fasta/uri_translator.dart
+++ b/pkg/front_end/lib/src/fasta/uri_translator.dart
@@ -6,7 +6,8 @@
 
 import 'package:package_config/package_config.dart';
 
-import '../base/libraries_specification.dart' show TargetLibrariesSpecification;
+import 'package:_fe_analyzer_shared/src/util/libraries_specification.dart'
+    show TargetLibrariesSpecification;
 import 'compiler_context.dart' show CompilerContext;
 import 'fasta_codes.dart';
 
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index f6468b1..b933c35 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -14,6 +14,8 @@
     show LanguageVersionToken, Token;
 
 import 'package:_fe_analyzer_shared/src/util/colors.dart' as colors;
+import 'package:_fe_analyzer_shared/src/util/libraries_specification.dart'
+    show LibraryInfo;
 import 'package:_fe_analyzer_shared/src/util/options.dart';
 import 'package:compiler/src/kernel/dart2js_target.dart';
 import 'package:dev_compiler/src/kernel/target.dart';
@@ -41,9 +43,6 @@
 import 'package:front_end/src/api_prototype/standard_file_system.dart'
     show StandardFileSystem;
 
-import 'package:front_end/src/base/libraries_specification.dart'
-    show LibraryInfo;
-
 import 'package:front_end/src/base/processed_options.dart'
     show ProcessedOptions;
 
diff --git a/pkg/front_end/test/fasta/uri_translator_test.dart b/pkg/front_end/test/fasta/uri_translator_test.dart
index d186bea..37e3564 100644
--- a/pkg/front_end/test/fasta/uri_translator_test.dart
+++ b/pkg/front_end/test/fasta/uri_translator_test.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-import 'package:front_end/src/base/libraries_specification.dart';
+import 'package:_fe_analyzer_shared/src/util/libraries_specification.dart';
 import 'package:front_end/src/fasta/uri_translator.dart';
 import 'package:package_config/package_config.dart';
 import 'package:test/test.dart';
diff --git a/pkg/front_end/test/static_types/cfe_allowed.json b/pkg/front_end/test/static_types/cfe_allowed.json
index cd3125e..adc8898 100644
--- a/pkg/front_end/test/static_types/cfe_allowed.json
+++ b/pkg/front_end/test/static_types/cfe_allowed.json
@@ -1,5 +1,5 @@
 {
-  "pkg/front_end/lib/src/base/libraries_specification.dart": {
+  "pkg/_fe_analyzer_shared/lib/src/util/libraries_specification.dart": {
     "Dynamic invocation of 'toList'.": 1,
     "Dynamic invocation of 'map'.": 1,
     "Dynamic invocation of '[]='.": 1
@@ -24,4 +24,4 @@
   "pkg/_fe_analyzer_shared/lib/src/scanner/string_canonicalizer.dart": {
     "Dynamic invocation of '[]'.": 2
   }
-}
\ No newline at end of file
+}