55// @dart = 2.8
66
77import 'dart:async' ;
8+ import 'dart:typed_data' ;
89
910import 'package:meta/meta.dart' ;
1011import 'package:package_config/package_config.dart' ;
@@ -65,24 +66,30 @@ class TargetModel {
6566}
6667
6768class CompilerOutput {
68- const CompilerOutput (this .outputFilename, this .errorCount, this .sources);
69+ const CompilerOutput (this .outputFilename, this .errorCount, this .sources, { this .expressionData} );
6970
7071 final String outputFilename;
7172 final int errorCount;
7273 final List <Uri > sources;
74+
75+ /// This field is only non-null for expression compilation requests.
76+ final Uint8List expressionData;
7377}
7478
7579enum StdoutState { CollectDiagnostic , CollectDependencies }
7680
7781/// Handles stdin/stdout communication with the frontend server.
7882class StdoutHandler {
7983 StdoutHandler ({
80- @required Logger logger
81- }) : _logger = logger {
84+ @required Logger logger,
85+ @required FileSystem fileSystem,
86+ }) : _logger = logger,
87+ _fileSystem = fileSystem {
8288 reset ();
8389 }
8490
8591 final Logger _logger;
92+ final FileSystem _fileSystem;
8693
8794 String boundaryKey;
8895 StdoutState state = StdoutState .CollectDiagnostic ;
@@ -91,6 +98,7 @@ class StdoutHandler {
9198
9299 bool _suppressCompilerMessages;
93100 bool _expectSources;
101+ bool _readFile;
94102
95103 void handler (String message) {
96104 const String kResultPrefix = 'result ' ;
@@ -110,11 +118,19 @@ class StdoutHandler {
110118 return ;
111119 }
112120 final int spaceDelimiter = message.lastIndexOf (' ' );
113- compilerOutput.complete (
114- CompilerOutput (
115- message.substring (boundaryKey.length + 1 , spaceDelimiter),
116- int .parse (message.substring (spaceDelimiter + 1 ).trim ()),
117- sources));
121+ final String fileName = message.substring (boundaryKey.length + 1 , spaceDelimiter);
122+ final int errorCount = int .parse (message.substring (spaceDelimiter + 1 ).trim ());
123+ Uint8List expressionData;
124+ if (_readFile) {
125+ expressionData = _fileSystem.file (fileName).readAsBytesSync ();
126+ }
127+ final CompilerOutput output = CompilerOutput (
128+ fileName,
129+ errorCount,
130+ sources,
131+ expressionData: expressionData,
132+ );
133+ compilerOutput.complete (output);
118134 return ;
119135 }
120136 if (state == StdoutState .CollectDiagnostic ) {
@@ -140,11 +156,12 @@ class StdoutHandler {
140156
141157 // This is needed to get ready to process next compilation result output,
142158 // with its own boundary key and new completer.
143- void reset ({ bool suppressCompilerMessages = false , bool expectSources = true }) {
159+ void reset ({ bool suppressCompilerMessages = false , bool expectSources = true , bool readFile = false }) {
144160 boundaryKey = null ;
145161 compilerOutput = Completer <CompilerOutput >();
146162 _suppressCompilerMessages = suppressCompilerMessages;
147163 _expectSources = expectSources;
164+ _readFile = readFile;
148165 state = StdoutState .CollectDiagnostic ;
149166 }
150167}
@@ -191,7 +208,7 @@ class KernelCompiler {
191208 _processManager = processManager,
192209 _fileSystemScheme = fileSystemScheme,
193210 _fileSystemRoots = fileSystemRoots,
194- _stdoutHandler = stdoutHandler ?? StdoutHandler (logger: logger);
211+ _stdoutHandler = stdoutHandler ?? StdoutHandler (logger: logger, fileSystem : fileSystem );
195212
196213 final FileSystem _fileSystem;
197214 final Artifacts _artifacts;
@@ -430,6 +447,7 @@ abstract class ResidentCompiler {
430447 @required ProcessManager processManager,
431448 @required Artifacts artifacts,
432449 @required Platform platform,
450+ @required FileSystem fileSystem,
433451 bool testCompilation,
434452 bool trackWidgetCreation,
435453 String packagesPath,
@@ -530,6 +548,7 @@ class DefaultResidentCompiler implements ResidentCompiler {
530548 @required ProcessManager processManager,
531549 @required Artifacts artifacts,
532550 @required Platform platform,
551+ @required FileSystem fileSystem,
533552 this .testCompilation = false ,
534553 this .trackWidgetCreation = true ,
535554 this .packagesPath,
@@ -547,7 +566,7 @@ class DefaultResidentCompiler implements ResidentCompiler {
547566 _logger = logger,
548567 _processManager = processManager,
549568 _artifacts = artifacts,
550- _stdoutHandler = stdoutHandler ?? StdoutHandler (logger: logger),
569+ _stdoutHandler = stdoutHandler ?? StdoutHandler (logger: logger, fileSystem : fileSystem ),
551570 _platform = platform,
552571 dartDefines = dartDefines ?? const < String > [],
553572 // This is a URI, not a file path, so the forward slash is correct even on Windows.
@@ -762,21 +781,20 @@ class DefaultResidentCompiler implements ResidentCompiler {
762781 String libraryUri,
763782 String klass,
764783 bool isStatic,
765- ) {
784+ ) async {
766785 if (! _controller.hasListener) {
767786 _controller.stream.listen (_handleCompilationRequest);
768787 }
769788
770789 final Completer <CompilerOutput > completer = Completer <CompilerOutput >();
771- _controller.add (
772- _CompileExpressionRequest (
773- completer, expression, definitions, typeDefinitions, libraryUri, klass, isStatic)
774- );
790+ final _CompileExpressionRequest request = _CompileExpressionRequest (
791+ completer, expression, definitions, typeDefinitions, libraryUri, klass, isStatic);
792+ _controller.add (request);
775793 return completer.future;
776794 }
777795
778796 Future <CompilerOutput > _compileExpression (_CompileExpressionRequest request) async {
779- _stdoutHandler.reset (suppressCompilerMessages: true , expectSources: false );
797+ _stdoutHandler.reset (suppressCompilerMessages: true , expectSources: false , readFile : true );
780798
781799 // 'compile-expression' should be invoked after compiler has been started,
782800 // program was compiled.
0 commit comments