@@ -40,7 +40,40 @@ let projectsFiles: Map<
40
40
> = new Map ( ) ;
41
41
// ^ caching AND states AND distributed system. Why does LSP has to be stupid like this
42
42
43
- let messageSender : any = { send : ( msg : m . Message ) => process . send ! ( msg ) } ;
43
+ type messageHandler = ( send : ( msg : m . Message ) => void , message : m . Message ) => void ;
44
+
45
+ let makeStdioChannel = ( ) => {
46
+ let writer = new rpc . StreamMessageWriter ( process . stdout ) ;
47
+ let reader = new rpc . StreamMessageReader ( process . stdin ) ;
48
+ let send = ( msg : m . Message ) => writer . write ( msg ) ;
49
+ return {
50
+ onMessage : ( ( func : messageHandler ) => {
51
+ let callback = ( message : m . Message ) => {
52
+ func ( send , message ) ;
53
+ }
54
+ reader . listen ( callback ) ;
55
+ } ) ,
56
+ send,
57
+ } ;
58
+ }
59
+
60
+ let makeNodeIpcChannel = ( ) => {
61
+ let send = ( msg : m . Message ) => process . send ! ( msg ) ;
62
+ return {
63
+ onMessage : ( func : messageHandler ) => {
64
+ process . on ( "message" , ( msg : m . Message ) => {
65
+ func ( send , msg ) ;
66
+ } )
67
+ } ,
68
+ send,
69
+ } ;
70
+ }
71
+
72
+ let channel = (
73
+ process . argv . includes ( "--stdio" )
74
+ ? makeStdioChannel ( )
75
+ : makeNodeIpcChannel ( )
76
+ ) ;
44
77
45
78
let sendUpdatedDiagnostics = ( ) => {
46
79
projectsFiles . forEach ( ( { filesWithDiagnostics } , projectRootPath ) => {
@@ -63,7 +96,7 @@ let sendUpdatedDiagnostics = () => {
63
96
method : "textDocument/publishDiagnostics" ,
64
97
params : params ,
65
98
} ;
66
- messageSender . send ( notification ) ;
99
+ channel . send ( notification ) ;
67
100
68
101
filesWithDiagnostics . add ( file ) ;
69
102
} ) ;
@@ -81,7 +114,7 @@ let sendUpdatedDiagnostics = () => {
81
114
method : "textDocument/publishDiagnostics" ,
82
115
params : params ,
83
116
} ;
84
- messageSender . send ( notification ) ;
117
+ channel . send ( notification ) ;
85
118
filesWithDiagnostics . delete ( file ) ;
86
119
}
87
120
} ) ;
@@ -101,7 +134,7 @@ let deleteProjectDiagnostics = (projectRootPath: string) => {
101
134
method : "textDocument/publishDiagnostics" ,
102
135
params : params ,
103
136
} ;
104
- messageSender . send ( notification ) ;
137
+ channel . send ( notification ) ;
105
138
} ) ;
106
139
107
140
projectsFiles . delete ( projectRootPath ) ;
@@ -170,7 +203,7 @@ let openedFile = (fileUri: string, fileContent: string) => {
170
203
method : "window/showMessageRequest" ,
171
204
params : params ,
172
205
} ;
173
- messageSender . send ( request ) ;
206
+ channel . send ( request ) ;
174
207
// the client might send us back the "start build" action, which we'll
175
208
// handle in the isResponseMessage check in the message handling way
176
209
// below
@@ -219,31 +252,7 @@ let getOpenedFileContent = (fileUri: string) => {
219
252
return content ;
220
253
} ;
221
254
222
- let onMessage = ( func : any ) => {
223
- process . on ( "message" , ( msg : m . Message ) => {
224
- func ( messageSender . send , msg ) ;
225
- } )
226
- } ;
227
-
228
- let argv = process . argv . slice ( 2 ) ;
229
- for ( let i = 0 ; i < argv . length ; i ++ ) {
230
- let arg = argv [ i ] ;
231
- if ( arg === "--stdio" ) {
232
- let writer = new rpc . StreamMessageWriter ( process . stdout ) ;
233
- let reader = new rpc . StreamMessageReader ( process . stdin ) ;
234
- messageSender . send = ( msg : m . Message ) => writer . write ( msg ) ;
235
- onMessage = ( ( func : any ) => {
236
- let callback = ( message : m . Message ) => {
237
- func ( messageSender . send , message ) ;
238
- }
239
- reader . listen ( callback ) ;
240
- } ) ;
241
-
242
- break ;
243
- } ;
244
- }
245
-
246
- onMessage ( ( send : any , msg : m . Message ) => {
255
+ channel . onMessage ( ( send , msg : m . Message ) => {
247
256
if ( m . isNotificationMessage ( msg ) ) {
248
257
// notification message, aka the client ends it and doesn't want a reply
249
258
if ( ! initialized && msg . method !== "exit" ) {
0 commit comments