Use BinaryPrinter instead of KernelSerializer to accommodate IKG (flutter/engine#4058)
* Use BinaryPrinter instead of KernelSerializer to accomodate IKG * Close sink opened with openWrite
This commit is contained in:
committed by
GitHub
parent
0b489580e3
commit
93713ea712
@@ -11,7 +11,8 @@ import 'package:front_end/incremental_kernel_generator.dart';
|
||||
import 'package:front_end/compiler_options.dart';
|
||||
import 'package:front_end/kernel_generator.dart';
|
||||
import 'package:kernel/ast.dart';
|
||||
import 'package:kernel/kernel.dart' as kernel;
|
||||
import 'package:kernel/binary/ast_to_binary.dart';
|
||||
import 'package:kernel/binary/limited_ast_to_binary.dart';
|
||||
import 'package:kernel/target/flutter.dart';
|
||||
import 'package:kernel/target/targets.dart';
|
||||
import 'package:usage/uuid/uuid.dart';
|
||||
@@ -82,32 +83,35 @@ abstract class CompilerInterface {
|
||||
void invalidate(Uri uri);
|
||||
}
|
||||
|
||||
/// Class that for test mocking purposes encapsulates interaction with
|
||||
/// global kernel methods.
|
||||
class KernelSerializer {
|
||||
/// Writes given kernel `program` to `path`.
|
||||
Future<dynamic> writeProgramToBinary(Program program, String path) {
|
||||
return kernel.writeProgramToBinary(program, path);
|
||||
}
|
||||
/// Class that for test mocking purposes encapsulates creation of [BinaryPrinter].
|
||||
class BinaryPrinterFactory {
|
||||
/// Creates new [BinaryPrinter] to write to [targetSink].
|
||||
BinaryPrinter newBinaryPrinter(IOSink targetSink) {
|
||||
return new LimitedBinaryPrinter(
|
||||
targetSink,
|
||||
(_) => true /* predicate */,
|
||||
false /* excludeUriToSource */); }
|
||||
}
|
||||
|
||||
class _FrontendCompiler implements CompilerInterface {
|
||||
_FrontendCompiler(this._outputStream, { this.kernelSerializer }) {
|
||||
_FrontendCompiler(this._outputStream, { this.printerFactory }) {
|
||||
_outputStream ??= stdout;
|
||||
kernelSerializer ??= new KernelSerializer();
|
||||
printerFactory ??= new BinaryPrinterFactory();
|
||||
}
|
||||
|
||||
StringSink _outputStream;
|
||||
KernelSerializer kernelSerializer;
|
||||
BinaryPrinterFactory printerFactory;
|
||||
|
||||
IncrementalKernelGenerator _generator;
|
||||
String _filename;
|
||||
String _kernelBinaryFilename;
|
||||
|
||||
@override
|
||||
Future<Null> compile(String filename, ArgResults options, {
|
||||
IncrementalKernelGenerator generator,
|
||||
}) async {
|
||||
_filename = filename;
|
||||
_kernelBinaryFilename = "$filename.dill";
|
||||
final String boundaryKey = new Uuid().generateV4();
|
||||
_outputStream.writeln("result $boundaryKey");
|
||||
final Uri sdkRoot = _ensureFolderPath(options['sdk-root']);
|
||||
@@ -123,7 +127,7 @@ class _FrontendCompiler implements CompilerInterface {
|
||||
_generator = generator != null
|
||||
? generator
|
||||
: await IncrementalKernelGenerator.newInstance(
|
||||
compilerOptions, Uri.base.resolve(_filename)
|
||||
compilerOptions, Uri.base.resolve(_filename)
|
||||
);
|
||||
final DeltaProgram deltaProgram = await _generator.computeDelta();
|
||||
program = deltaProgram.newProgram;
|
||||
@@ -136,9 +140,11 @@ class _FrontendCompiler implements CompilerInterface {
|
||||
program = await kernelForProgram(Uri.base.resolve(_filename), compilerOptions);
|
||||
}
|
||||
if (program != null) {
|
||||
final String kernelBinaryFilename = _filename + ".dill";
|
||||
await kernelSerializer.writeProgramToBinary(program, kernelBinaryFilename);
|
||||
_outputStream.writeln("$boundaryKey $kernelBinaryFilename");
|
||||
final IOSink sink = new File(_kernelBinaryFilename).openWrite();
|
||||
final BinaryPrinter printer = printerFactory.newBinaryPrinter(sink);
|
||||
printer.writeProgramFile(program);
|
||||
_outputStream.writeln("$boundaryKey $_kernelBinaryFilename");
|
||||
await sink.close();
|
||||
} else
|
||||
_outputStream.writeln(boundaryKey);
|
||||
return null;
|
||||
@@ -149,10 +155,11 @@ class _FrontendCompiler implements CompilerInterface {
|
||||
final String boundaryKey = new Uuid().generateV4();
|
||||
_outputStream.writeln("result $boundaryKey");
|
||||
final DeltaProgram deltaProgram = await _generator.computeDelta();
|
||||
final Program program = deltaProgram.newProgram;
|
||||
final String kernelBinaryFilename = _filename + ".dill";
|
||||
await kernelSerializer.writeProgramToBinary(program, kernelBinaryFilename);
|
||||
final IOSink sink = new File(_kernelBinaryFilename).openWrite();
|
||||
final BinaryPrinter printer = printerFactory.newBinaryPrinter(sink);
|
||||
printer.writeProgramFile(deltaProgram.newProgram);
|
||||
_outputStream.writeln("$boundaryKey");
|
||||
await sink.close();
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -188,13 +195,13 @@ Future<int> starter(List<String> args, {
|
||||
CompilerInterface compiler,
|
||||
Stream<List<int>> input, StringSink output,
|
||||
IncrementalKernelGenerator generator,
|
||||
KernelSerializer kernelSerializer
|
||||
BinaryPrinterFactory binaryPrinterFactory,
|
||||
}) async {
|
||||
final ArgResults options = _argParser.parse(args);
|
||||
if (options['train'])
|
||||
return 0;
|
||||
|
||||
compiler ??= new _FrontendCompiler(output, kernelSerializer: kernelSerializer);
|
||||
compiler ??= new _FrontendCompiler(output, printerFactory: binaryPrinterFactory);
|
||||
input ??= stdin;
|
||||
|
||||
if (options.rest.isNotEmpty) {
|
||||
@@ -205,9 +212,9 @@ Future<int> starter(List<String> args, {
|
||||
_State state = _State.READY_FOR_INSTRUCTION;
|
||||
String boundaryKey;
|
||||
input
|
||||
.transform(UTF8.decoder)
|
||||
.transform(new LineSplitter())
|
||||
.listen((String string) async {
|
||||
.transform(UTF8.decoder)
|
||||
.transform(new LineSplitter())
|
||||
.listen((String string) async {
|
||||
switch (state) {
|
||||
case _State.READY_FOR_INSTRUCTION:
|
||||
const String COMPILE_INSTRUCTION_SPACE = 'compile ';
|
||||
|
||||
@@ -6,6 +6,7 @@ import 'dart:isolate';
|
||||
import 'package:args/src/arg_results.dart';
|
||||
import 'package:frontend_server/server.dart';
|
||||
import 'package:front_end/incremental_kernel_generator.dart';
|
||||
import 'package:kernel/binary/ast_to_binary.dart';
|
||||
import 'package:mockito/mockito.dart';
|
||||
import 'package:test/test.dart';
|
||||
|
||||
@@ -14,7 +15,9 @@ class _MockedCompiler extends Mock implements CompilerInterface {}
|
||||
class _MockedIncrementalKernelGenerator extends Mock
|
||||
implements IncrementalKernelGenerator {}
|
||||
|
||||
class _MockedKernelSerializer extends Mock implements KernelSerializer {}
|
||||
class _MockedBinaryPrinterFactory extends Mock implements BinaryPrinterFactory {}
|
||||
|
||||
class _MockedBinaryPrinter extends Mock implements BinaryPrinter {}
|
||||
|
||||
Future<int> main() async {
|
||||
group('basic', () {
|
||||
@@ -231,11 +234,15 @@ Future<int> main() async {
|
||||
when(generator.computeDelta()).thenReturn(new Future<DeltaProgram>.value(
|
||||
new DeltaProgram(null /* program stub */)
|
||||
));
|
||||
final _MockedBinaryPrinterFactory printerFactory =
|
||||
new _MockedBinaryPrinterFactory();
|
||||
when(printerFactory.newBinaryPrinter(any))
|
||||
.thenReturn(new _MockedBinaryPrinter());
|
||||
final int exitcode = await starter(args, compiler: null,
|
||||
input: streamController.stream,
|
||||
output: ioSink,
|
||||
generator: generator,
|
||||
kernelSerializer: new _MockedKernelSerializer()
|
||||
binaryPrinterFactory: printerFactory,
|
||||
);
|
||||
expect(exitcode, equals(0));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user