1+ /* eslint-disable unicorn/consistent-destructuring */
12import * as vscode from 'vscode'
23import { getActiveRegularEditor } from '@zardoy/vscode-utils'
34import { getExtensionCommandId , getExtensionSetting , registerExtensionCommand , VSCodeQuickPickItem } from 'vscode-framework'
@@ -9,7 +10,15 @@ import { offsetPosition } from '@zardoy/vscode-utils/build/position'
910import { relative , join } from 'path-browserify'
1011import { RequestOptionsTypes , RequestResponseTypes } from '../typescript/src/ipcTypes'
1112import { 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'
1322
1423export default ( ) => {
1524 registerExtensionCommand ( 'removeFunctionArgumentsTypesInSelection' , async ( ) => {
@@ -227,7 +236,7 @@ export default () => {
227236 document,
228237 position : range . start ,
229238 inputOptions : {
230- range : [ document . offsetAt ( range . start ) , document . offsetAt ( range . end ) ] as [ number , number ] ,
239+ range : vscodeRangeToTs ( document , range ) ,
231240 } ,
232241 } )
233242 }
@@ -239,7 +248,7 @@ export default () => {
239248 document,
240249 position : range . start ,
241250 inputOptions : {
242- range : [ document . offsetAt ( range . start ) , document . offsetAt ( range . end ) ] as [ number , number ] ,
251+ range : vscodeRangeToTs ( document , range ) ,
243252 data : secondStepData ,
244253 } ,
245254 } ,
@@ -343,10 +352,12 @@ export default () => {
343352 }
344353
345354 if ( ! mainChanges ) return
346- edit . set ( editor . document . uri , tsTextChangesToVcodeTextEdits ( editor . document , mainChanges ) )
355+ edit . set ( editor . document . uri , tsTextChangesToVscodeTextEdits ( editor . document , mainChanges ) )
347356 await vscode . workspace . applyEdit ( edit )
348357 } )
349358
359+ type ExtendedCodeAction = vscode . CodeAction & { document : vscode . TextDocument ; requestRange : vscode . Range }
360+
350361 // most probably will be moved to ts-code-actions extension
351362 vscode . languages . registerCodeActionsProvider ( defaultJsSupersetLangsWithVue , {
352363 async provideCodeActions ( document , range , context , token ) {
@@ -355,18 +366,20 @@ export default () => {
355366 }
356367
357368 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
360373 const edit = new vscode . WorkspaceEdit ( )
361- edit . set ( document . uri , tsTextChangesToVcodeTextEdits ( document , fixAllEdits ) )
374+ edit . set ( document . uri , tsTextChangesToVscodeTextEdits ( document , fixAllEdits ) )
362375 await vscode . workspace . applyEdit ( edit )
363376 return
364377 }
365378
366379 if ( context . triggerKind !== vscode . CodeActionTriggerKind . Invoke ) return
367380 const result = await getPossibleTwoStepRefactorings ( range )
368381 if ( ! result ) return
369- const { turnArrayIntoObject, moveToExistingFile } = result
382+ const { turnArrayIntoObject, moveToExistingFile, extendedCodeActions } = result
370383 const codeActions : vscode . CodeAction [ ] = [ ]
371384 const getCommand = ( arg ) : vscode . Command | undefined => ( {
372385 title : '' ,
@@ -390,8 +403,55 @@ export default () => {
390403 // })
391404 }
392405
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+
393430 return codeActions
394431 } ,
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+ } ,
395455 } )
396456 // #endregion
397457}
0 commit comments