// 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 'package:kernel/src/tool/find_referenced_libraries.dart'; import '../relink_test.dart'; import 'find_sdk_dills.dart'; void main() { List dills = findSdkDills(); print("Found ${dills.length} dills!"); for (File dill in dills) { readAndRelink(dill); } } void readAndRelink(File dill) { print("Reading $dill"); Uint8List bytes = dill.readAsBytesSync(); try { // Loading a component it should be self-contained. Component component1 = new Component(); new BinaryBuilder(bytes, alwaysCreateNewNamedNodes: true, disableLazyReading: true) .readComponent(component1); checkReachable(component1); // Loading a component it should be self-contained. Component component2 = new Component(nameRoot: component1.root); new BinaryBuilder(bytes, alwaysCreateNewNamedNodes: true, disableLazyReading: true) .readComponent(component2); checkReachable(component2); // Now that we read "component 2" on top of "component 1" the 1-version is // no longer self-contained. try { checkReachable(component1); throw "Expected this one to fail."; } catch (e) { // Expected. } // Relinking it it should be back to being self contained though. component1.relink(); checkReachable(component1); // Now that component 1 is relinked component 2 is no longer self contained. try { checkReachable(component2); throw "Expected this one to fail."; } catch (e) { // Expected. } // But relinking makes it self-contained again. component2.relink(); checkReachable(component2); } catch (e, st) { print("Error for $dill:"); print(e); print(st); print(""); print("--------------------"); print(""); exitCode = 1; } } void checkReachable(Component component) { expectReachable( findAllReferencedLibraries(component.libraries), component.libraries); expectReachable( findAllReferencedLibraries(component.libraries, collectViaReferencesToo: true), component.libraries); if (duplicateLibrariesReachable(component.libraries)) { throw "Didn't expect duplicates libraries!"; } }