1
+ import 'dart:io' ;
2
+
3
+ import 'package:lsp_server/lsp_server.dart' ;
1
4
import 'package:sass_language_server/sass_language_server.dart' ;
2
5
3
6
void main (List <String > arguments) async {
@@ -35,9 +38,10 @@ Logging options:
35
38
var fileSystemProvider = LocalFileSystem ();
36
39
var server = LanguageServer ();
37
40
41
+ Connection connection;
42
+ Socket ? socket;
38
43
if (transport == '--stdio' ) {
39
- await server.start (
40
- logLevel: logLevel, fileSystemProvider: fileSystemProvider);
44
+ connection = Connection (stdin, stdout);
41
45
} else {
42
46
// The client is the one listening to socket connections on the specified port.
43
47
// In other words the language server is a _client_ for the socket transport.
@@ -46,11 +50,31 @@ Logging options:
46
50
// the language server.
47
51
var split = transport.split ('=' );
48
52
int port = int .parse (split.last);
53
+ socket = await Socket .connect ('127.0.0.1' , port);
54
+ connection = Connection (socket, socket);
55
+ }
56
+
57
+ try {
58
+ exitCode = 1 ;
49
59
50
60
await server.start (
51
- logLevel: logLevel,
52
- fileSystemProvider: fileSystemProvider,
53
- transport: Transport .socket,
54
- port: port);
61
+ connection: connection,
62
+ logLevel: logLevel,
63
+ fileSystemProvider: fileSystemProvider,
64
+ );
65
+
66
+ // See
67
+ // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#shutdown
68
+ // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#exit
69
+ connection.onShutdown (() async {
70
+ socket? .close ();
71
+ exitCode = 0 ;
72
+ });
73
+
74
+ connection.onExit (() async {
75
+ exit (exitCode);
76
+ });
77
+ } on Exception catch (_) {
78
+ exit (1 );
55
79
}
56
80
}
0 commit comments