| // 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; |
| } |
| } |