1
+ /* eslint-disable unicorn/consistent-destructuring */
1
2
import * as vscode from 'vscode'
2
3
import { getActiveRegularEditor } from '@zardoy/vscode-utils'
3
4
import { getExtensionCommandId , getExtensionSetting , registerExtensionCommand , VSCodeQuickPickItem } from 'vscode-framework'
@@ -9,7 +10,15 @@ import { offsetPosition } from '@zardoy/vscode-utils/build/position'
9
10
import { relative , join } from 'path-browserify'
10
11
import { RequestOptionsTypes , RequestResponseTypes } from '../typescript/src/ipcTypes'
11
12
import { sendCommand } from './sendCommand'
12
- import { getTsLikePath , pickFileWithQuickPick , tsRangeToVscode , tsRangeToVscodeSelection , tsTextChangesToVcodeTextEdits } from './util'
13
+ import {
14
+ getTsLikePath ,
15
+ pickFileWithQuickPick ,
16
+ tsRangeToVscode ,
17
+ tsRangeToVscodeSelection ,
18
+ tsTextChangesToVscodeSnippetTextEdits ,
19
+ tsTextChangesToVscodeTextEdits ,
20
+ vscodeRangeToTs ,
21
+ } from './util'
13
22
14
23
export default ( ) => {
15
24
registerExtensionCommand ( 'removeFunctionArgumentsTypesInSelection' , async ( ) => {
@@ -227,7 +236,7 @@ export default () => {
227
236
document,
228
237
position : range . start ,
229
238
inputOptions : {
230
- range : [ document . offsetAt ( range . start ) , document . offsetAt ( range . end ) ] as [ number , number ] ,
239
+ range : vscodeRangeToTs ( document , range ) ,
231
240
} ,
232
241
} )
233
242
}
@@ -239,7 +248,7 @@ export default () => {
239
248
document,
240
249
position : range . start ,
241
250
inputOptions : {
242
- range : [ document . offsetAt ( range . start ) , document . offsetAt ( range . end ) ] as [ number , number ] ,
251
+ range : vscodeRangeToTs ( document , range ) ,
243
252
data : secondStepData ,
244
253
} ,
245
254
} ,
@@ -343,10 +352,12 @@ export default () => {
343
352
}
344
353
345
354
if ( ! mainChanges ) return
346
- edit . set ( editor . document . uri , tsTextChangesToVcodeTextEdits ( editor . document , mainChanges ) )
355
+ edit . set ( editor . document . uri , tsTextChangesToVscodeTextEdits ( editor . document , mainChanges ) )
347
356
await vscode . workspace . applyEdit ( edit )
348
357
} )
349
358
359
+ type ExtendedCodeAction = vscode . CodeAction & { document : vscode . TextDocument ; requestRange : vscode . Range }
360
+
350
361
// most probably will be moved to ts-code-actions extension
351
362
vscode . languages . registerCodeActionsProvider ( defaultJsSupersetLangsWithVue , {
352
363
async provideCodeActions ( document , range , context , token ) {
@@ -355,18 +366,20 @@ export default () => {
355
366
}
356
367
357
368
if ( context . only ?. contains ( vscode . CodeActionKind . SourceFixAll ) ) {
358
- const fixAllEdits = await sendCommand < RequestResponseTypes [ 'getFixAllEdits' ] > ( 'getFixAllEdits' )
359
- if ( ! fixAllEdits ) return
369
+ const fixAllEdits = await sendCommand < RequestResponseTypes [ 'getFixAllEdits' ] > ( 'getFixAllEdits' , {
370
+ document,
371
+ } )
372
+ if ( ! fixAllEdits || token . isCancellationRequested ) return
360
373
const edit = new vscode . WorkspaceEdit ( )
361
- edit . set ( document . uri , tsTextChangesToVcodeTextEdits ( document , fixAllEdits ) )
374
+ edit . set ( document . uri , tsTextChangesToVscodeTextEdits ( document , fixAllEdits ) )
362
375
await vscode . workspace . applyEdit ( edit )
363
376
return
364
377
}
365
378
366
379
if ( context . triggerKind !== vscode . CodeActionTriggerKind . Invoke ) return
367
380
const result = await getPossibleTwoStepRefactorings ( range )
368
381
if ( ! result ) return
369
- const { turnArrayIntoObject, moveToExistingFile } = result
382
+ const { turnArrayIntoObject, moveToExistingFile, extendedCodeActions } = result
370
383
const codeActions : vscode . CodeAction [ ] = [ ]
371
384
const getCommand = ( arg ) : vscode . Command | undefined => ( {
372
385
title : '' ,
@@ -390,8 +403,55 @@ export default () => {
390
403
// })
391
404
}
392
405
406
+ codeActions . push (
407
+ ...compact (
408
+ extendedCodeActions . map ( ( { title, kind, codes } ) : ExtendedCodeAction | undefined => {
409
+ let diagnostics : vscode . Diagnostic [ ] | undefined
410
+ if ( codes ) {
411
+ diagnostics = context . diagnostics . filter ( ( { source, code } ) => {
412
+ if ( source !== 'ts' || ! code ) return
413
+ const codeNumber = + ( typeof code === 'object' ? code . value : code )
414
+ return codes . includes ( codeNumber )
415
+ } )
416
+ if ( diagnostics . length === 0 ) return
417
+ }
418
+
419
+ return {
420
+ title,
421
+ diagnostics,
422
+ kind : vscode . CodeActionKind . Empty . append ( kind ) ,
423
+ requestRange : range ,
424
+ document,
425
+ }
426
+ } ) ,
427
+ ) ,
428
+ )
429
+
393
430
return codeActions
394
431
} ,
432
+ async resolveCodeAction ( codeAction : ExtendedCodeAction , token ) {
433
+ const { document } = codeAction
434
+ if ( ! document ) throw new Error ( 'Unresolved code action without document' )
435
+ const result = await sendCommand < RequestResponseTypes [ 'getExtendedCodeActionEdits' ] , RequestOptionsTypes [ 'getExtendedCodeActionEdits' ] > (
436
+ 'getExtendedCodeActionEdits' ,
437
+ {
438
+ document,
439
+ inputOptions : {
440
+ applyCodeActionTitle : codeAction . title ,
441
+ range : vscodeRangeToTs ( document , codeAction . diagnostics ?. length ? codeAction . diagnostics [ 0 ] ! . range : codeAction . requestRange ) ,
442
+ } ,
443
+ } ,
444
+ )
445
+ if ( ! result ) throw new Error ( 'No code action edits. Try debug.' )
446
+ const { edits = [ ] , snippetEdits = [ ] } = result
447
+ const workspaceEdit = new vscode . WorkspaceEdit ( )
448
+ workspaceEdit . set ( document . uri , [
449
+ ...tsTextChangesToVscodeTextEdits ( document , edits ) ,
450
+ ...tsTextChangesToVscodeSnippetTextEdits ( document , snippetEdits ) ,
451
+ ] )
452
+ codeAction . edit = workspaceEdit
453
+ return codeAction
454
+ } ,
395
455
} )
396
456
// #endregion
397
457
}
0 commit comments