diff --git a/dwds/lib/src/services/expression_compiler_service.dart b/dwds/lib/src/services/expression_compiler_service.dart index e0c40348e..2edcacca2 100644 --- a/dwds/lib/src/services/expression_compiler_service.dart +++ b/dwds/lib/src/services/expression_compiler_service.dart @@ -27,14 +27,22 @@ class _Compiler { /// Sends [request] on [_sendPort] and returns the next event from the /// response stream. - Future> _send(Map request) async { + Future> _send(Map request) async { _sendPort.send(request); - return await _responseQueue.hasNext - ? Map.from(await _responseQueue.next) - : { - 'succeeded': false, - 'errors': ['compilation service response stream closed'], - }; + if (!await _responseQueue.hasNext) { + return { + 'succeeded': false, + 'errors': ['compilation worker response stream closed'], + }; + } + final response = await _responseQueue.next; + if (response is! Map) { + return { + 'succeeded': false, + 'errors': ['compilation worker returned invalid response: $response'], + }; + } + return response; } /// Starts expression compilation service. @@ -46,11 +54,11 @@ class _Compiler { /// expression compilation (summaries, libraries spec, compiler worker /// snapshot). /// - /// [soundNullSafety] indiciates if the compioler should support sound null - /// safety. + /// [soundNullSafety] indicates if the compiler should support sound + /// null safety. /// /// Performs handshake with the isolate running expression compiler - /// worker to estabish communication via send/receive ports, returns + /// worker to establish communication via send/receive ports, returns /// the service after the communication is established. /// /// Users need to stop the service by calling [stop]. @@ -131,9 +139,12 @@ class _Compiler { if (result) { _logger.info('Updated dependencies.'); } else { - final e = response['exception']; - final s = response['stackTrace']; - _logger.severe('Failed to update dependencies: $e:$s'); + final errors = response['errors']; + final exception = response['exception']; + final s = response['stackTrace'] as String?; + final stackTrace = s == null ? null : StackTrace.fromString(s); + _logger.severe( + 'Failed to update dependencies: $errors', exception, stackTrace); } updateCompleter.complete(); return result; diff --git a/dwds/test/expression_compiler_service_test.dart b/dwds/test/expression_compiler_service_test.dart index 5004f0e59..ab873b847 100644 --- a/dwds/test/expression_compiler_service_test.dart +++ b/dwds/test/expression_compiler_service_test.dart @@ -55,8 +55,11 @@ void main() async { output.stream.listen(printOnFailure); configureLogWriter( - customLogWriter: (level, message, {error, loggerName, stackTrace}) => - output.add('[$level] $loggerName: $message')); + customLogWriter: (level, message, {error, loggerName, stackTrace}) { + final e = error == null ? '' : ': $error'; + final s = stackTrace == null ? '' : ':\n$stackTrace'; + output.add('[$level] $loggerName: $message$e$s'); + }); // start asset server _server = await startHttpServer('localhost'); @@ -147,7 +150,6 @@ void main() async { '[FINEST] ExpressionCompilerService: Compiled "true" to:'))); expect(output.stream, emitsThrough(contains('[INFO] ExpressionCompilerService: Stopped.'))); - final result = await service .updateDependencies({'try': ModuleInfo('try.full.dill', 'try.dill')}); expect(result, true, reason: 'failed to update dependencies');