Skip to content

Commit

Permalink
[dart2js] Support package json files in modular_test_suite.
Browse files Browse the repository at this point in the history
Change-Id: I6a17b9604d2a3e01d822a4872a2560f0aff0a63c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/152361
Commit-Queue: Joshua Litt <joshualitt@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
  • Loading branch information
joshualitt authored and commit-bot@chromium.org committed Jun 26, 2020
1 parent 1a27811 commit f4b19b8
Showing 1 changed file with 54 additions and 12 deletions.
66 changes: 54 additions & 12 deletions pkg/compiler/tool/modular_test_suite.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> args) async {
_options = Options.parse(args);
_packageConfig = await loadPackageConfigUri(packageConfigUri);
await _resolveScripts();
await runSuite(
sdkRoot.resolve('tests/modular/'),
Expand All @@ -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
Expand Down Expand Up @@ -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<Module> 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');

Expand Down

0 comments on commit f4b19b8

Please sign in to comment.