[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;