| // Copyright (c) 2024, 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 'dart:typed_data'; |
| |
| import 'package:kernel/binary/ast_from_binary.dart'; |
| import 'package:kernel/kernel.dart'; |
| |
| import 'find_sdk_dills.dart'; |
| |
| void main() { |
| List<File> dills = findSdkDills(); |
| print("Found ${dills.length} dills!"); |
| |
| List<File> errors = []; |
| for (File dill in dills) { |
| if (!tryFile(dill)) { |
| errors.add(dill); |
| } |
| } |
| if (errors.isEmpty) { |
| print("All OK."); |
| } else { |
| print("Errors when reading:"); |
| for (File error in errors) { |
| print(error); |
| } |
| exitCode = 1; |
| } |
| } |
| |
| bool tryFile(File dill) { |
| print("Reading $dill"); |
| Uint8List bytes = dill.readAsBytesSync(); |
| |
| try { |
| Component component = new Component(); |
| new BinaryBuilderWithMetadata(bytes).readComponent(component); |
| LocationTester tester = new LocationTester(); |
| component.accept(tester); |
| return tester.ok; |
| } catch (e, st) { |
| print("Error for $dill:"); |
| print(e); |
| print(st); |
| print(""); |
| print("--------------------"); |
| print(""); |
| return false; |
| } |
| } |
| |
| class LocationTester extends RecursiveVisitor { |
| bool ok = true; |
| |
| @override |
| void defaultTreeNode(TreeNode node) { |
| super.defaultTreeNode(node); |
| try { |
| node.location; |
| } catch (e) { |
| ok = false; |
| print("Failure on $node: $e"); |
| try { |
| print(node.parent?.location); |
| } catch (e) {} |
| } |
| } |
| } |