@@ -101,8 +101,7 @@ export default class CodeActionProvider extends AbstractProvider implements vsco
101101
102102 private async _runCodeAction ( req : protocol . V2 . RunCodeActionRequest ) : Promise < boolean | string | { } > {
103103
104- return serverUtils . runCodeAction ( this . _server , req ) . then ( response => {
105-
104+ return serverUtils . runCodeAction ( this . _server , req ) . then ( async response => {
106105 if ( response && Array . isArray ( response . Changes ) ) {
107106
108107 let edit = new vscode . WorkspaceEdit ( ) ;
@@ -123,9 +122,9 @@ export default class CodeActionProvider extends AbstractProvider implements vsco
123122 for ( let change of response . Changes ) {
124123 if ( change . ModificationType == FileModificationType . Opened )
125124 {
126- // The CodeAction requested that we open a file.
125+ // The CodeAction requested that we open a file.
127126 // Record that file name and keep processing CodeActions.
128- // If a CodeAction requests that we open multiple files
127+ // If a CodeAction requests that we open multiple files
129128 // we only open the last one (what would it mean to open multiple files?)
130129 fileToOpen = vscode . Uri . file ( change . FileName ) ;
131130 }
@@ -135,7 +134,7 @@ export default class CodeActionProvider extends AbstractProvider implements vsco
135134 let uri = vscode . Uri . file ( change . FileName ) ;
136135 if ( renamedFiles . some ( r => r == uri ) )
137136 {
138- // This file got renamed. Omnisharp has already
137+ // This file got renamed. OmniSharp has already
139138 // persisted the new file with any applicable changes.
140139 continue ;
141140 }
@@ -144,11 +143,28 @@ export default class CodeActionProvider extends AbstractProvider implements vsco
144143 for ( let textChange of change . Changes ) {
145144 edits . push ( vscode . TextEdit . replace ( toRange2 ( textChange ) , textChange . NewText ) ) ;
146145 }
147-
146+
148147 edit . set ( uri , edits ) ;
149148 }
150149 }
151150
151+ // Allow language middlewares to re-map its edits if necessary.
152+ try {
153+ const languageMiddlewares = this . _languageMiddlewareFeature . getLanguageMiddlewares ( ) ;
154+ for ( const middleware of languageMiddlewares )
155+ {
156+ if ( ! middleware . remapWorkspaceEdit ) {
157+ continue ;
158+ }
159+
160+ const modifiedEdit = await middleware . remapWorkspaceEdit ( edit , /*token*/ null ) ;
161+ edit = modifiedEdit ;
162+ }
163+ }
164+ catch ( error ) {
165+ // Something happened while remapping locations. Return the original set of locations.
166+ }
167+
152168 let applyEditPromise = vscode . workspace . applyEdit ( edit ) ;
153169
154170 // Unfortunately, the textEditor.Close() API has been deprecated
@@ -158,14 +174,14 @@ export default class CodeActionProvider extends AbstractProvider implements vsco
158174 let next = applyEditPromise ;
159175 if ( renamedFiles . some ( r => r . fsPath == vscode . window . activeTextEditor . document . uri . fsPath ) )
160176 {
161- next = applyEditPromise . then ( _ =>
177+ next = applyEditPromise . then ( _ =>
162178 {
163179 return vscode . commands . executeCommand ( "workbench.action.closeActiveEditor" ) ;
164180 } ) ;
165181 }
166182
167183 return fileToOpen != null
168- ? next . then ( _ =>
184+ ? next . then ( _ =>
169185 {
170186 return vscode . commands . executeCommand ( "vscode.open" , fileToOpen ) ;
171187 } )
0 commit comments