From f4b19b8c2ac221fb887dccb2c2158ff966fec39f Mon Sep 17 00:00:00 2001 From: Joshua Litt Date: Fri, 26 Jun 2020 15:08:52 +0000 Subject: [PATCH] [dart2js] Support package json files in modular_test_suite. Change-Id: I6a17b9604d2a3e01d822a4872a2560f0aff0a63c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/152361 Commit-Queue: Joshua Litt Reviewed-by: Sigmund Cherem --- pkg/compiler/tool/modular_test_suite.dart | 66 ++++++++++++++++++----- 1 file changed, 54 insertions(+), 12 deletions(-) diff --git a/pkg/compiler/tool/modular_test_suite.dart b/pkg/compiler/tool/modular_test_suite.dart index a318ff1a1dec..eb8953bc2219 100644 --- a/pkg/compiler/tool/modular_test_suite.dart +++ b/pkg/compiler/tool/modular_test_suite.dart @@ -14,13 +14,21 @@ import 'package:modular_test/src/io_pipeline.dart'; import 'package:modular_test/src/pipeline.dart'; import 'package:modular_test/src/suite.dart'; import 'package:modular_test/src/runner.dart'; +import 'package:package_config/package_config.dart'; +String packageConfigJsonPath = ".dart_tool/package_config.json"; Uri sdkRoot = Platform.script.resolve("../../../"); +Uri packageConfigUri = sdkRoot.resolve(packageConfigJsonPath); Options _options; String _dart2jsScript; String _kernelWorkerScript; + +// TODO(joshualitt): Figure out a way to support package configs in +// tests/modular. +PackageConfig _packageConfig; main(List args) async { _options = Options.parse(args); + _packageConfig = await loadPackageConfigUri(packageConfigUri); await _resolveScripts(); await runSuite( sdkRoot.resolve('tests/modular/'), @@ -45,6 +53,17 @@ const codeId1 = const ShardDataId(codeId, 1); const jsId = const DataId("js"); const txtId = const DataId("txt"); +String _packageConfigEntry(String name, Uri root, + {Uri packageRoot, LanguageVersion version}) { + var fields = [ + '"name": "${name}"', + '"rootUri": "$root"', + if (packageRoot != null) '"packageUri": "$packageRoot"', + if (version != null) '"languageVersion": "$version"' + ]; + return '{${fields.join(',')}}'; +} + // Step that compiles sources in a module to a .dill file. class SourceToDillStep implements IOModularStep { @override @@ -88,31 +107,54 @@ class SourceToDillStep implements IOModularStep { } } - // We create a .packages file which defines the location of this module if - // it is a package. The CFE requires that if a `package:` URI of a - // dependency is used in an import, then we need that package entry in the - // .packages file. However, after it checks that the definition exists, the - // CFE will not actually use the resolved URI if a library for the import - // URI is already found in one of the provided .dill files of the - // dependencies. For that reason, and to ensure that a step only has access - // to the files provided in a module, we generate a .packages with invalid - // folders for other packages. + // We create both a .packages and package_config.json file which defines + // the location of this module if it is a package. The CFE requires that + // if a `package:` URI of a dependency is used in an import, then we need + // that package entry in the associated file. However, after it checks that + // the definition exists, the CFE will not actually use the resolved URI if + // a library for the import URI is already found in one of the provide + // .dill files of the dependencies. For that reason, and to ensure that + // a step only has access to the files provided in a module, we generate a + // config file with invalid folders for other packages. // TODO(sigmund): follow up with the CFE to see if we can remove the need - // for the .packages entry altogether if they won't need to read the - // sources. + // for these dummy entries.. + // TODO(joshualitt): Generate just the json file. + var packagesJson = []; var packagesContents = new StringBuffer(); if (module.isPackage) { packagesContents.write('${module.name}:${module.packageBase}\n'); + packagesJson.add(_packageConfigEntry( + module.name, Uri.parse('../${module.packageBase}'))); } + Set transitiveDependencies = computeTransitiveDependencies(module); int unusedNum = 0; for (Module dependency in transitiveDependencies) { if (dependency.isPackage) { + // rootUri should be ignored for dependent modules, so we pass in a + // bogus value. + var rootUri = Uri.parse('unused$unusedNum'); unusedNum++; - packagesContents.write('${dependency.name}:unused$unusedNum\n'); + + var dependentPackage = _packageConfig[dependency.name]; + var packageJson = dependentPackage == null + ? _packageConfigEntry(dependency.name, rootUri) + : _packageConfigEntry(dependentPackage.name, rootUri, + version: dependentPackage.languageVersion); + packagesJson.add(packageJson); + packagesContents.write('${dependency.name}:$rootUri\n'); } } + if (module.isPackage) { + await File.fromUri(root.resolve(packageConfigJsonPath)) + .create(recursive: true); + await File.fromUri(root.resolve(packageConfigJsonPath)).writeAsString('{' + ' "configVersion": ${_packageConfig.version},' + ' "packages": [ ${packagesJson.join(',')} ]' + '}'); + } + await File.fromUri(root.resolve('.packages')) .writeAsString('$packagesContents');