[CFE] Improve deps test

Change-Id: I8b94f93a57e600d2b4925faf635690229c605ac8
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/400642
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Jens Johansen <jensj@google.com>
diff --git a/pkg/front_end/lib/src/base/import_chains.dart b/pkg/front_end/lib/src/base/import_chains.dart
index af09cc8..abfe370 100644
--- a/pkg/front_end/lib/src/base/import_chains.dart
+++ b/pkg/front_end/lib/src/base/import_chains.dart
@@ -100,12 +100,11 @@
 
 class LoadedLibrariesImpl implements LoadedLibraries {
   /// The library of the compilation entry point.
-  final CompilationUnit rootCompilationUnit;
+  final List<CompilationUnit> rootCompilationUnits;
   final Map<Uri, CompilationUnit> compilationUnits = {};
 
-  // TODO(johnniwinther): Support multiple entry-points.
   LoadedLibrariesImpl(
-      this.rootCompilationUnit, Iterable<CompilationUnit> compilationUnits) {
+      this.rootCompilationUnits, Iterable<CompilationUnit> compilationUnits) {
     compilationUnits.forEach((CompilationUnit compilationUnit) {
       this.compilationUnits[compilationUnit.importUri] = compilationUnit;
     });
@@ -183,12 +182,14 @@
       return;
     }
 
-    computeSuffixes(rootCompilationUnit, const Link<Uri>());
+    for (CompilationUnit rootCompilationUnit in rootCompilationUnits) {
+      computeSuffixes(rootCompilationUnit, const Link<Uri>());
+    }
   }
 
   @override
   String toString() =>
-      'root=$rootCompilationUnit,compilationUnits=${compilationUnits.keys}';
+      'roots=$rootCompilationUnits,compilationUnits=${compilationUnits.keys}';
 }
 
 /// [CodeLocation] divides uris into different classes.
diff --git a/pkg/front_end/lib/src/source/source_loader.dart b/pkg/front_end/lib/src/source/source_loader.dart
index 3816c06..85384d9 100644
--- a/pkg/front_end/lib/src/source/source_loader.dart
+++ b/pkg/front_end/lib/src/source/source_loader.dart
@@ -1191,7 +1191,7 @@
             templateUnavailableDartLibrary.withArguments(importUri);
         if (rootLibrary != null) {
           loadedLibraries ??=
-              new LoadedLibrariesImpl(rootLibrary, compilationUnits);
+              new LoadedLibrariesImpl([rootLibrary], compilationUnits);
           Set<String> importChain = computeImportChainsFor(
               rootLibrary.importUri, loadedLibraries, importUri,
               verbose: false);
diff --git a/pkg/front_end/test/deps_git_test.dart b/pkg/front_end/test/deps_git_test.dart
index 9b5d278..238098f 100644
--- a/pkg/front_end/test/deps_git_test.dart
+++ b/pkg/front_end/test/deps_git_test.dart
@@ -10,15 +10,18 @@
 import 'package:front_end/src/api_prototype/standard_file_system.dart';
 import 'package:front_end/src/base/compiler_context.dart';
 import 'package:front_end/src/base/file_system_dependency_tracker.dart';
+import 'package:front_end/src/base/import_chains.dart';
 import 'package:front_end/src/base/processed_options.dart';
 import 'package:front_end/src/base/ticker.dart';
 import 'package:front_end/src/base/uri_translator.dart';
+import 'package:front_end/src/builder/library_builder.dart';
 import 'package:front_end/src/compute_platform_binaries_location.dart'
     show computePlatformBinariesLocation;
 import 'package:front_end/src/dill/dill_target.dart';
 import 'package:front_end/src/kernel/kernel_target.dart';
 import 'package:kernel/kernel.dart';
 import 'package:kernel/target/targets.dart';
+import 'package:package_config/src/package_config.dart';
 import 'package:vm/modular/target/vm.dart' show VmTarget;
 
 import 'utils/io_utils.dart' show computeRepoDirUri;
@@ -26,36 +29,42 @@
 final Uri repoDir = computeRepoDirUri();
 
 Set<String> allowlistedExternalDartFiles = {
-  "third_party/pkg/package_config/lib/package_config.dart",
-  "third_party/pkg/package_config/lib/package_config_types.dart",
-  "third_party/pkg/package_config/lib/src/discovery.dart",
-  "third_party/pkg/package_config/lib/src/errors.dart",
-  "third_party/pkg/package_config/lib/src/package_config_impl.dart",
-  "third_party/pkg/package_config/lib/src/package_config_io.dart",
-  "third_party/pkg/package_config/lib/src/package_config_json.dart",
-  "third_party/pkg/package_config/lib/src/package_config.dart",
-  "third_party/pkg/package_config/lib/src/packages_file.dart",
-  "third_party/pkg/package_config/lib/src/util.dart",
-
-  // TODO(johnniwinther): Fix to allow dependency of package:package_config.
-  "third_party/pkg/package_config/lib/src/util_io.dart",
-
   // TODO(CFE-team): These files should not be included.
   // The package isn't even in pubspec.yaml.
+  // They're included via at least
+  // _fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
   "pkg/meta/lib/meta.dart",
   "pkg/meta/lib/meta_meta.dart",
 };
 
-Set<String> allowlistedThirdPartyPackages = {
+Set<String> allowedPackages = {
+  "front_end",
+  "kernel",
+  "_fe_analyzer_shared",
+  "package_config",
+  "macros",
+  "_macros",
+  // package:front_end imports package:yaml for the 'dynamic modules'
+  // experiment.
   "yaml",
-  // package:yaml dependencies
-  "core/pkgs/collection",
-  "core/pkgs/path",
+  // package:yaml uses package:source_span, package:string_scanner and
+  // package:collection.
   "source_span",
   "string_scanner",
+  "collection",
+  // package:source_span imports package:path.
+  "path",
+  // package:source_span imports package:term_glyph.
   "term_glyph",
 };
 
+List<String> allowedRelativePaths = [
+  // For VmTarget for macros.
+  "pkg/vm/lib/modular/",
+  // Platform.
+  "sdk/lib/",
+];
+
 /// Returns true on no errors and false if errors was found.
 Future<bool> main() async {
   Ticker ticker = new Ticker(isVerbose: false);
@@ -80,9 +89,21 @@
     }
   }
 
+  LoadedLibraries? loadedLibraries;
+  Map<Uri, Uri> fileUriToImportUri = {};
+  List<String> allowedUriPrefixes = [
+    for (String relativePath in allowedRelativePaths)
+      repoDir.resolve(relativePath).toString()
+  ];
+
   List<Uri> result = await CompilerContext.runWithOptions<List<Uri>>(options,
       (CompilerContext c) async {
     UriTranslator uriTranslator = await c.options.getUriTranslator();
+    for (Package package in uriTranslator.packages.packages) {
+      if (allowedPackages.contains(package.name)) {
+        allowedUriPrefixes.add(package.packageUriRoot.toString());
+      }
+    }
     DillTarget dillTarget =
         new DillTarget(c, ticker, uriTranslator, c.options.target);
     KernelTarget kernelTarget =
@@ -98,32 +119,27 @@
     kernelTarget.setEntryPoints(c.options.inputs);
     dillTarget.buildOutlines();
     await kernelTarget.loader.buildOutlines();
+
+    {
+      List<CompilationUnit> compilationUnits =
+          kernelTarget.loader.compilationUnits.toList(growable: false);
+      List<CompilationUnit> rootCompilationUnits = [];
+      Set<Uri> inputs = new Set.of(options.inputs);
+      for (CompilationUnit unit in compilationUnits) {
+        fileUriToImportUri[unit.fileUri] = unit.importUri;
+        if (inputs.contains(unit.fileUri) || inputs.contains(unit.importUri)) {
+          rootCompilationUnits.add(unit);
+        }
+      }
+      loadedLibraries =
+          new LoadedLibrariesImpl(rootCompilationUnits, compilationUnits);
+    }
+
     return new List<Uri>.from(tracker.dependencies);
   });
 
   Set<Uri> otherDartUris = new Set<Uri>();
   Set<Uri> otherNonDartUris = new Set<Uri>();
-  List<String> allowedRelativePaths = [
-    // Front-end.
-    "pkg/kernel/",
-    "pkg/_fe_analyzer_shared/",
-    // For VmTarget for macros.
-    "pkg/vm/lib/modular/",
-    // Platform.
-    "sdk/lib/",
-    "runtime/lib/",
-    "runtime/bin/",
-    // Macros.
-    "pkg/macros",
-    "pkg/_macros",
-    for (String package in allowlistedThirdPartyPackages)
-      "third_party/pkg/$package/",
-  ];
-  List<String> allowedUriPrefixes = [
-    frontendLibUri.toString(),
-    for (String relativePath in allowedRelativePaths)
-      repoDir.resolve(relativePath).toString()
-  ];
   for (Uri uri in result) {
     final String uriAsString = uri.toString();
     bool allowed = false;
@@ -145,7 +161,6 @@
   // Remove allow-listed non-dart files.
   otherNonDartUris.remove(packageConfigUri);
   otherNonDartUris.remove(repoDir.resolve("sdk/lib/libraries.json"));
-  otherNonDartUris.remove(repoDir.resolve(".dart_tool/package_config.json"));
 
   // Remove allow-listed dart files.
   for (String s in allowlistedExternalDartFiles) {
@@ -160,6 +175,17 @@
     }
     for (Uri uri in otherDartUris) {
       print(" - $uri");
+      if (loadedLibraries != null) {
+        Uri? importUri = fileUriToImportUri[uri];
+        if (importUri != null) {
+          Set<String> importChains = (computeImportChainsFor(
+              Uri.parse("<entry>"), loadedLibraries!, importUri,
+              verbose: false));
+          for (String s in importChains) {
+            print(" => $s");
+          }
+        }
+      }
     }
     exitCode = 1;
     return false;