blob: 6cc2a6b00c855adb6f307a7cffc3b18af103f308 [file] [log] [blame]
diff --git a/packages/flutter_tools/lib/src/compile.dart b/packages/flutter_tools/lib/src/compile.dart
index 12c0770ab..7787bd4ca 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;
}
@@ -545,6 +576,7 @@ class ResidentCompiler {
.listen((String message) { printError(message); });
_server.stdin.writeln('compile $scriptUri');
+ printTrace('<- compile $scriptUri');
return _stdoutHandler.compilerOutput.future;
}
@@ -597,6 +629,7 @@ class ResidentCompiler {
void accept() {
if (_compileRequestNeedsConfirmation) {
_server.stdin.writeln('accept');
+ printTrace('<- accept');
}
_compileRequestNeedsConfirmation = false;
}
@@ -620,6 +653,7 @@ class ResidentCompiler {
}
_stdoutHandler.reset();
_server.stdin.writeln('reject');
+ printTrace('<- reject');
_compileRequestNeedsConfirmation = false;
return _stdoutHandler.compilerOutput.future;
}
@@ -629,6 +663,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) {
diff --git a/packages/flutter_tools/test/src/mocks.dart b/packages/flutter_tools/test/src/mocks.dart
index 52c5fc907..36d63f2d5 100644
--- a/packages/flutter_tools/test/src/mocks.dart
+++ b/packages/flutter_tools/test/src/mocks.dart
@@ -496,6 +496,6 @@ class MockResidentCompiler extends BasicMock implements ResidentCompiler {
Future<CompilerOutput> recompile(String mainPath, List<String> invalidatedFiles, { String outputPath, String packagesFilePath }) async {
fs.file(outputPath).createSync(recursive: true);
fs.file(outputPath).writeAsStringSync('compiled_kernel_output');
- return CompilerOutput(outputPath, 0);
+ return CompilerOutput(outputPath, 0, <Uri>[]);
}
}
diff --git a/packages/flutter_tools/test/tester/flutter_tester_test.dart b/packages/flutter_tools/test/tester/flutter_tester_test.dart
index a78f70f4f..b6524bd5d 100644
--- a/packages/flutter_tools/test/tester/flutter_tester_test.dart
+++ b/packages/flutter_tools/test/tester/flutter_tester_test.dart
@@ -177,7 +177,7 @@ Hello!
packagesPath: anyNamed('packagesPath'),
)).thenAnswer((_) async {
fs.file('$mainPath.dill').createSync(recursive: true);
- return CompilerOutput('$mainPath.dill', 0);
+ return CompilerOutput('$mainPath.dill', 0, <Uri>[]);
});
final LaunchResult result = await device.startApp(null,