// 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 dills = findSdkDills(); print("Found ${dills.length} dills!"); List 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) {} } } }