@@ -244,42 +244,61 @@ process.on('message', (a: (m.RequestMessage | m.NotificationMessage)) => {
244
244
process . send ! ( response ) ;
245
245
}
246
246
} else if ( aa . method === p . DocumentFormattingRequest . method ) {
247
+ // technically, a formatting failure should reply with the error. Sadly
248
+ // the LSP alert box for these error replies suck (e.g. don't actually
249
+ // display the message). In order to signal the client to display a proper
250
+ // alert box (sometime with actionable buttons), we need to first send
251
+ // back a fake success message (because reach request mandates a
252
+ // response), then right away send a server notification to display a
253
+ // nicer alert. Ugh.
254
+ let fakeSuccessResponse : m . ResponseMessage = {
255
+ jsonrpc : c . jsonrpcVersion ,
256
+ id : aa . id ,
257
+ result : [ ] ,
258
+ }
259
+
247
260
let params = ( aa . params as p . DocumentFormattingParams )
248
261
let filePath = fileURLToPath ( params . textDocument . uri )
249
262
let extension = path . extname ( params . textDocument . uri ) ;
250
263
if ( extension !== c . resExt && extension !== c . resiExt ) {
251
- let response : m . ResponseMessage = {
264
+ let params : p . ShowMessageParams = {
265
+ type : p . MessageType . Error ,
266
+ message : `Not a ${ c . resExt } or ${ c . resiExt } file. Cannot format it.`
267
+ }
268
+ let response : m . NotificationMessage = {
252
269
jsonrpc : c . jsonrpcVersion ,
253
- id : aa . id ,
254
- error : {
255
- code : m . ErrorCodes . InvalidRequest ,
256
- message : `Not a ${ c . resExt } or ${ c . resiExt } file.`
257
- }
258
- } ;
270
+ method : 'window/showMessage' ,
271
+ params : params ,
272
+ }
273
+ process . send ! ( fakeSuccessResponse ) ;
259
274
process . send ! ( response ) ;
260
275
} else {
261
276
let projectRootPath = utils . findProjectRootOfFile ( filePath )
262
277
if ( projectRootPath == null ) {
263
- let response : m . ResponseMessage = {
278
+ let params : p . ShowMessageParams = {
279
+ type : p . MessageType . Error ,
280
+ message : `Cannot find a nearby ${ c . bsconfigPartialPath } . It's needed for determining the project's root.` ,
281
+ }
282
+ let response : m . NotificationMessage = {
264
283
jsonrpc : c . jsonrpcVersion ,
265
- id : aa . id ,
266
- error : {
267
- code : m . ErrorCodes . InvalidRequest ,
268
- message : `Cannot find a nearby ${ c . bsconfigPartialPath } . It's needed for determining the project's root.` ,
269
- }
270
- } ;
284
+ method : 'window/showMessage' ,
285
+ params : params ,
286
+ }
287
+ process . send ! ( fakeSuccessResponse ) ;
271
288
process . send ! ( response ) ;
272
289
} else {
273
290
let bscPath = path . join ( projectRootPath , c . bscPartialPath )
274
291
if ( ! fs . existsSync ( bscPath ) ) {
275
- let response : m . ResponseMessage = {
292
+ let params : p . ShowMessageParams = {
293
+ type : p . MessageType . Error ,
294
+ message : `Cannot find a nearby ${ c . bscPartialPath } . It's needed for formatting.` ,
295
+ }
296
+ let response : m . NotificationMessage = {
276
297
jsonrpc : c . jsonrpcVersion ,
277
- id : aa . id ,
278
- error : {
279
- code : m . ErrorCodes . InvalidRequest ,
280
- message : `Cannot find a nearby ${ c . bscPartialPath } . It's needed for formatting.` ,
281
- }
282
- } ;
298
+ method : 'window/showMessage' ,
299
+ params : params ,
300
+ }
301
+ process . send ! ( fakeSuccessResponse ) ;
283
302
process . send ! ( response ) ;
284
303
} else {
285
304
// code will always be defined here, even though technically it can be undefined
@@ -304,24 +323,11 @@ process.on('message', (a: (m.RequestMessage | m.NotificationMessage)) => {
304
323
} ;
305
324
process . send ! ( response ) ;
306
325
} else {
307
- let response : m . ResponseMessage = {
308
- jsonrpc : c . jsonrpcVersion ,
309
- id : aa . id ,
310
- result : [ ] ,
311
- // technically a formatting failure should return the error but
312
- // since this is LSP... the idiom seems to be to silently return
313
- // nothing (to avoid an alert window each time on bad formatting)
314
- // while sending a diagnostic about the error afterward. We won't
315
- // send an extra diagnostic because the .compiler.log watcher
316
- // should have reported th won't send an extra diagnostic because
317
- // theiler.log watcher should have reported them.
318
-
319
- // error: {
320
- // code: m.ErrorCodes.ParseError,
321
- // message: formattedResult.error,
322
- // }
323
- } ;
324
- process . send ! ( response ) ;
326
+ // let the diagnostics logic display the updated syntax errors,
327
+ // from the build.
328
+ // Again, not sending the actual errors. See fakeSuccessResponse
329
+ // above for explanation
330
+ process . send ! ( fakeSuccessResponse ) ;
325
331
}
326
332
}
327
333
}
0 commit comments