Skip to content

Commit 901f97d

Browse files
Apply remapp workspace edits for CodeActions
1 parent cfdf8e8 commit 901f97d

File tree

1 file changed

+24
-8
lines changed

1 file changed

+24
-8
lines changed

src/features/codeActionProvider.ts

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)