blob: b7cafae012a11977c272b580f6bc6ba2d093570c [file] [log] [blame]
diff --git a/packages/flutter_tools/lib/src/compile.dart b/packages/flutter_tools/lib/src/compile.dart
index 5f936715f..702101c9d 100644
--- a/packages/flutter_tools/lib/src/compile.dart
+++ b/packages/flutter_tools/lib/src/compile.dart
@@ -57,12 +57,15 @@ class TargetModel {
}
class CompilerOutput {
- const CompilerOutput(this.outputFilename, this.errorCount);
+ const CompilerOutput(this.outputFilename, this.errorCount, this.sources);
final String outputFilename;
final int errorCount;
+ final List<Uri> sources;
}
+enum StdoutState { CollectDiagnostic, CollectDependencies }
+
/// Handles stdin/stdout communication with the frontend server.
class StdoutHandler {
StdoutHandler({this.consumer = printError}) {
@@ -72,30 +75,54 @@ class StdoutHandler {
bool compilerMessageReceived = false;
final CompilerMessageConsumer consumer;
String boundaryKey;
+ StdoutState state = StdoutState.CollectDiagnostic;
Completer<CompilerOutput> compilerOutput;
+ final List<Uri> sources = <Uri>[];
bool _suppressCompilerMessages;
void handler(String message) {
+ printTrace('-> $message');
const String kResultPrefix = 'result ';
if (boundaryKey == null && message.startsWith(kResultPrefix)) {
boundaryKey = message.substring(kResultPrefix.length);
} else if (message.startsWith(boundaryKey)) {
- if (message.length <= boundaryKey.length) {
- compilerOutput.complete(null);
- return;
+ if (state == StdoutState.CollectDiagnostic) {
+ state = StdoutState.CollectDependencies;
+ } else {
+ if (message.length <= boundaryKey.length) {
+ compilerOutput.complete(null);
+ return;
+ }
+ final int spaceDelimiter = message.lastIndexOf(' ');
+ compilerOutput.complete(
+ CompilerOutput(
+ message.substring(boundaryKey.length + 1, spaceDelimiter),
+ int.parse(message.substring(spaceDelimiter + 1).trim()),
+ sources));
}
- final int spaceDelimiter = message.lastIndexOf(' ');
- compilerOutput.complete(
- CompilerOutput(
- message.substring(boundaryKey.length + 1, spaceDelimiter),
- int.parse(message.substring(spaceDelimiter + 1).trim())));
- } else if (!_suppressCompilerMessages) {
- if (compilerMessageReceived == false) {
- consumer('\nCompiler message:');
- compilerMessageReceived = true;
+ } else {
+ if (state == StdoutState.CollectDiagnostic) {
+ if (!_suppressCompilerMessages) {
+ if (compilerMessageReceived == false) {
+ consumer('\nCompiler message:');
+ compilerMessageReceived = true;
+ }
+ consumer(message);
+ }
+ } else {
+ assert(state == StdoutState.CollectDependencies);
+ switch (message[0]) {
+ case '+':
+ sources.add(Uri.parse(message.substring(1)));
+ break;
+ case '-':
+ sources.remove(Uri.parse(message.substring(1)));
+ break;
+ default:
+ printTrace('Unexpected prefix for $message uri - ignoring');
+ }
}
- consumer(message);
}
}
@@ -106,6 +133,7 @@ class StdoutHandler {
compilerMessageReceived = false;
compilerOutput = Completer<CompilerOutput>();
_suppressCompilerMessages = suppressCompilerMessages;
+ state = StdoutState.CollectDiagnostic;
}
}
@@ -200,7 +228,7 @@ class KernelCompiler {
if (await fingerprinter.doesFingerprintMatch()) {
printTrace('Skipping kernel compilation. Fingerprint match.');
- return CompilerOutput(outputFilePath, 0);
+ return CompilerOutput(outputFilePath, 0, /* sources */ null);
}
}
@@ -453,10 +481,13 @@ class ResidentCompiler {
? _mapFilename(request.mainPath, packageUriMapper) + ' '
: '';
_server.stdin.writeln('recompile $mainUri$inputKey');
+ printTrace('<- recompile $mainUri$inputKey');
for (String fileUri in request.invalidatedFiles) {
_server.stdin.writeln(_mapFileUri(fileUri, packageUriMapper));
+ printTrace('<- ${_mapFileUri(fileUri, packageUriMapper)}');
}
_server.stdin.writeln(inputKey);
+ printTrace('<- $inputKey');
return _stdoutHandler.compilerOutput.future;
}
@@ -546,6 +577,7 @@ class ResidentCompiler {
.listen((String message) { printError(message); });
_server.stdin.writeln('compile $scriptUri');
+ printTrace('<- compile $scriptUri');
return _stdoutHandler.compilerOutput.future;
}
@@ -598,6 +630,7 @@ class ResidentCompiler {
void accept() {
if (_compileRequestNeedsConfirmation) {
_server.stdin.writeln('accept');
+ printTrace('<- accept');
}
_compileRequestNeedsConfirmation = false;
}
@@ -621,6 +654,7 @@ class ResidentCompiler {
}
_stdoutHandler.reset();
_server.stdin.writeln('reject');
+ printTrace('<- reject');
_compileRequestNeedsConfirmation = false;
return _stdoutHandler.compilerOutput.future;
}
@@ -630,6 +664,7 @@ class ResidentCompiler {
/// kernel file.
void reset() {
_server?.stdin?.writeln('reset');
+ printTrace('<- reset');
}
String _mapFilename(String filename, PackageUriMapper packageUriMapper) {
diff --git a/packages/flutter_tools/lib/src/devfs.dart b/packages/flutter_tools/lib/src/devfs.dart
index 7940e8bb0..9e8b9bd45 100644
--- a/packages/flutter_tools/lib/src/devfs.dart
+++ b/packages/flutter_tools/lib/src/devfs.dart
@@ -557,6 +557,8 @@ class DevFS {
outputPath: dillOutputPath ?? getDefaultApplicationKernelPath(trackWidgetCreation: trackWidgetCreation),
packagesFilePath : _packagesFilePath,
);
+ // list of sources that needs to be monitored are in [compilerOutput.sources]
+ //
// Don't send full kernel file that would overwrite what VM already
// started loading from.
if (!bundleFirstUpload) {