// Copyright (c) 2019, 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. // @dart = 2.9 // Test that 79cc54e51924cd5a6bdc2bd1771f2d0ee7af8899 works as intended. import 'dart:convert'; import 'package:kernel/binary/ast_from_binary.dart'; import 'package:kernel/binary/ast_to_binary.dart'; import 'package:kernel/kernel.dart'; Uri uri1 = Uri.parse("foo://lib1.dart"); Uri uri2 = Uri.parse("foo://lib2.dart"); main() { Library library1 = new Library(uri1, fileUri: uri1); Library library2 = new Library(uri2, fileUri: uri2); Procedure p1 = new Procedure(new Name("p1"), ProcedureKind.Method, new FunctionNode(new ReturnStatement()), fileUri: uri2); Procedure p2 = new Procedure(new Name("p2"), ProcedureKind.Method, new FunctionNode(new ReturnStatement()), fileUri: uri1); library1.addProcedure(p1); library2.addProcedure(p2); Component component = new Component(libraries: [library1, library2]) ..setMainMethodAndMode(null, false, NonNullableByDefaultCompiledMode.Weak); component.uriToSource[uri1] = new Source( [42, 2 * 42], const Utf8Encoder().convert("source #1"), uri1, uri1); component.uriToSource[uri2] = new Source( [43, 3 * 43], const Utf8Encoder().convert("source #2"), uri1, uri1); expectSource(serialize(component), true, true); Component cPartial1 = new Component(nameRoot: component.root) ..setMainMethodAndMode(null, false, NonNullableByDefaultCompiledMode.Weak) ..libraries.add(library1); cPartial1.uriToSource[uri1] = new Source( [42, 2 * 42], const Utf8Encoder().convert("source #1"), uri1, uri1); cPartial1.uriToSource[uri2] = new Source([43, 3 * 43], const [], uri1, uri1); List partial1Serialized = serialize(cPartial1); expectSource(partial1Serialized, true, false); Component cPartial2 = new Component(nameRoot: component.root) ..setMainMethodAndMode(null, false, NonNullableByDefaultCompiledMode.Weak) ..libraries.add(library2); cPartial2.uriToSource[uri1] = new Source([42, 2 * 42], const [], uri1, uri1); cPartial2.uriToSource[uri2] = new Source( [43, 3 * 43], const Utf8Encoder().convert("source #2"), uri1, uri1); List partial2Serialized = serialize(cPartial2); expectSource(partial2Serialized, false, true); List combined = []; combined.addAll(partial1Serialized); combined.addAll(partial2Serialized); expectSource(combined, true, true); } void expectSource(List data, bool expect1, bool expect2) { BinaryBuilder builder = new BinaryBuilder(data); Component tmp = new Component(); builder.readComponent(tmp); if (tmp.uriToSource[uri1] == null) throw "No data for $uri1"; if (tmp.uriToSource[uri2] == null) throw "No data for $uri2"; if (expect1 && tmp.uriToSource[uri1].source.isEmpty) { throw "No data for $uri1"; } if (!expect1 && tmp.uriToSource[uri1].source.isNotEmpty) { throw "Unexpected data for $uri1"; } if (expect2 && tmp.uriToSource[uri2].source.isEmpty) { throw "No data data for $uri2"; } if (!expect2 && tmp.uriToSource[uri2].source.isNotEmpty) { throw "Unexpected data for $uri2"; } } List serialize(Component c) { SimpleSink sink = new SimpleSink(); BinaryPrinter printerWhole = new BinaryPrinter(sink); printerWhole.writeComponentFile(c); List result = []; for (List chunk in sink.chunks) { result.addAll(chunk); } return result; } class SimpleSink implements Sink> { final List> chunks = >[]; @override void add(List chunk) { chunks.add(chunk); } @override void close() {} }