blob: 1ffefabafc1e726b88f35b56d6d9b7cd27524240 [file] [log] [blame]
// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
// 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.
import 'dart:io';
import 'package:kernel/binary/ast_from_binary.dart';
import 'package:kernel/kernel.dart';
void main() {
File exe = new File(Platform.resolvedExecutable).absolute;
int steps = 0;
Directory parent = exe.parent.parent;
while (true) {
Set<String> foundDirs = {};
for (FileSystemEntity entry in parent.listSync(recursive: false)) {
if (entry is Directory) {
List<String> pathSegments = entry.uri.pathSegments;
String name = pathSegments[pathSegments.length - 2];
foundDirs.add(name);
}
}
if (foundDirs.contains("pkg") &&
foundDirs.contains("tools") &&
foundDirs.contains("tests")) {
break;
}
steps++;
if (parent.uri == parent.parent.uri) {
throw "Reached end without finding the root.";
}
parent = parent.parent;
}
// We had to go $steps steps to reach the "root" --- now we should go 2 steps
// shorter to be in the "compiled dir".
parent = exe.parent;
for (int i = steps - 2; i >= 0; i--) {
parent = parent.parent;
}
List<File> dills = [];
for (FileSystemEntity entry in parent.listSync(recursive: false)) {
if (entry is File) {
if (entry.path.toLowerCase().endsWith(".dill")) {
dills.add(entry);
}
}
}
Directory sdk = new Directory.fromUri(parent.uri.resolve("dart-sdk/"));
for (FileSystemEntity entry in sdk.listSync(recursive: true)) {
if (entry is File) {
if (entry.path.toLowerCase().endsWith(".dill")) {
dills.add(entry);
}
}
}
print("Found ${dills.length} dills!");
List<File> errors = [];
for (File dill in dills) {
if (!canRead(dill)) {
errors.add(dill);
}
}
if (errors.isEmpty) {
print("Read all OK.");
} else {
print("Errors when reading:");
for (File error in errors) {
print(error);
}
exitCode = 1;
}
}
bool canRead(File dill) {
print("Reading $dill");
List<int> bytes = dill.readAsBytesSync();
try {
Component component = new Component();
new BinaryBuilderWithMetadata(bytes).readComponent(component);
int libs = component.libraries.length;
component = new Component();
new BinaryBuilderWithMetadata(bytes).readComponentSource(component);
component = new Component();
new BinaryBuilder(bytes).readComponent(component);
if (libs != component.libraries.length) {
throw "Didn't get the same number of libraries: $libs when reading with "
"BinaryBuilderWithMetadata and ${component.libraries.length} "
"when reading with BinaryBuilder";
}
component = new Component();
new BinaryBuilder(bytes).readComponentSource(component);
return true;
} catch (e, st) {
print("Error for $dill:");
print(e);
print(st);
print("");
print("--------------------");
print("");
return false;
}
}