| Index: pkg/analysis_server/lib/src/analysis_manager.dart
|
| diff --git a/pkg/analysis_server/lib/src/analysis_manager.dart b/pkg/analysis_server/lib/src/analysis_manager.dart
|
| index 22892b82abddd47df9f976b87123b8464566f839..d9c009264e9b3fb8b02903e79b92a6029cd8496c 100644
|
| --- a/pkg/analysis_server/lib/src/analysis_manager.dart
|
| +++ b/pkg/analysis_server/lib/src/analysis_manager.dart
|
| @@ -30,19 +30,31 @@ class AnalysisManager {
|
| ClientCommunicationChannel channel;
|
|
|
| /**
|
| - * Launch analysis server in a separate process
|
| - * and return a future with a manager for that analysis server.
|
| - */
|
| - static Future<AnalysisManager> start(String serverPath) {
|
| - return new AnalysisManager()._launchServer(serverPath);
|
| - }
|
| -
|
| - /**
|
| - * Open a connection to a running analysis server
|
| - * and return a future with a manager for that analysis server.
|
| + * Stop the analysis server.
|
| + *
|
| + * Returns `true` if the signal is successfully sent and process terminates.
|
| + * Otherwise there was no attached process or the signal could not be sent,
|
| + * usually meaning that the process is already dead.
|
| */
|
| - static Future<AnalysisManager> connect(String serverUrl) {
|
| - return new AnalysisManager()._openConnection(serverUrl);
|
| + Future<bool> stop() {
|
| + if (process == null) {
|
| + return channel.close().then((_) => false);
|
| + }
|
| + return channel.sendRequest(
|
| + new ServerShutdownParams().toRequest(
|
| + '0')).timeout(new Duration(seconds: 2), onTimeout: () {
|
| + print('Expected shutdown response');
|
| + }).then((Response response) {
|
| + return channel.close().then((_) => process.exitCode);
|
| + }).timeout(new Duration(seconds: 2), onTimeout: () {
|
| + print('Expected server to shutdown');
|
| + process.kill();
|
| + }).then((int result) {
|
| + if (result != null && result != 0) {
|
| + exitCode = result;
|
| + }
|
| + return true;
|
| + });
|
| }
|
|
|
| /**
|
| @@ -51,12 +63,10 @@ class AnalysisManager {
|
| Future<AnalysisManager> _launchServer(String pathToServer) {
|
| // TODO dynamically allocate port and/or allow client to specify port
|
| List<String> serverArgs = [pathToServer, '--port', PORT.toString()];
|
| - return Process.start(Platform.executable, serverArgs)
|
| - .catchError((error) {
|
| - exitCode = 1;
|
| - throw 'Failed to launch analysis server: $error';
|
| - })
|
| - .then(_listenForPort);
|
| + return Process.start(Platform.executable, serverArgs).catchError((error) {
|
| + exitCode = 1;
|
| + throw 'Failed to launch analysis server: $error';
|
| + }).then(_listenForPort);
|
| }
|
|
|
| /**
|
| @@ -72,18 +82,18 @@ class AnalysisManager {
|
|
|
| // Listen for port from server
|
| const String pattern = 'Listening on port ';
|
| - return out.firstWhere((String line) => line.startsWith(pattern))
|
| - .timeout(new Duration(seconds: 10))
|
| - .catchError((error) {
|
| - exitCode = 1;
|
| - process.kill();
|
| - throw 'Expected port from analysis server';
|
| - })
|
| - .then((String line) {
|
| - String port = line.substring(pattern.length).trim();
|
| - String url = 'ws://${InternetAddress.LOOPBACK_IP_V4.address}:$port/';
|
| - return _openConnection(url);
|
| - });
|
| + return out.firstWhere(
|
| + (String line) =>
|
| + line.startsWith(
|
| + pattern)).timeout(new Duration(seconds: 10)).catchError((error) {
|
| + exitCode = 1;
|
| + process.kill();
|
| + throw 'Expected port from analysis server';
|
| + }).then((String line) {
|
| + String port = line.substring(pattern.length).trim();
|
| + String url = 'ws://${InternetAddress.LOOPBACK_IP_V4.address}:$port/';
|
| + return _openConnection(url);
|
| + });
|
| }
|
|
|
| /**
|
| @@ -98,45 +108,29 @@ class AnalysisManager {
|
| throw 'Failed to connect to analysis server at $serverUrl\n $error';
|
| };
|
| try {
|
| - return WebSocket.connect(serverUrl)
|
| - .catchError(onError)
|
| - .then((WebSocket socket) {
|
| - this.channel = new WebSocketClientChannel(socket);
|
| - return this;
|
| - });
|
| + return WebSocket.connect(
|
| + serverUrl).catchError(onError).then((WebSocket socket) {
|
| + this.channel = new WebSocketClientChannel(socket);
|
| + return this;
|
| + });
|
| } catch (error) {
|
| onError(error);
|
| }
|
| }
|
|
|
| /**
|
| - * Stop the analysis server.
|
| - *
|
| - * Returns `true` if the signal is successfully sent and process terminates.
|
| - * Otherwise there was no attached process or the signal could not be sent,
|
| - * usually meaning that the process is already dead.
|
| + * Open a connection to a running analysis server
|
| + * and return a future with a manager for that analysis server.
|
| */
|
| - Future<bool> stop() {
|
| - if (process == null) {
|
| - return channel.close().then((_) => false);
|
| - }
|
| - return channel
|
| - .sendRequest(new ServerShutdownParams().toRequest('0'))
|
| - .timeout(new Duration(seconds: 2), onTimeout: () {
|
| - print('Expected shutdown response');
|
| - })
|
| - .then((Response response) {
|
| - return channel.close().then((_) => process.exitCode);
|
| - })
|
| - .timeout(new Duration(seconds: 2), onTimeout: () {
|
| - print('Expected server to shutdown');
|
| - process.kill();
|
| - })
|
| - .then((int result) {
|
| - if (result != null && result != 0) {
|
| - exitCode = result;
|
| - }
|
| - return true;
|
| - });
|
| + static Future<AnalysisManager> connect(String serverUrl) {
|
| + return new AnalysisManager()._openConnection(serverUrl);
|
| + }
|
| +
|
| + /**
|
| + * Launch analysis server in a separate process
|
| + * and return a future with a manager for that analysis server.
|
| + */
|
| + static Future<AnalysisManager> start(String serverPath) {
|
| + return new AnalysisManager()._launchServer(serverPath);
|
| }
|
| }
|
|
|