Skip to content

Commit b02df6f

Browse files
Razmo99JustinGrote
authored andcommitted
registering new rename provider feature
1 parent efd6fd5 commit b02df6f

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed

src/extension.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { SessionManager } from "./session";
2525
import { LogLevel, getSettings } from "./settings";
2626
import { PowerShellLanguageId } from "./utils";
2727
import { LanguageClientConsumer } from "./languageClientConsumer";
28+
import { RenameSymbolFeature } from "./features/RenameSymbol";
2829

2930
// The most reliable way to get the name and version of the current extension.
3031
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-var-requires
@@ -35,6 +36,7 @@ const PackageJSON: any = require("../package.json");
3536
const TELEMETRY_KEY = "0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255";
3637

3738
let languageConfigurationDisposable: vscode.Disposable;
39+
let languageRenameProvider:vscode.Disposable;
3840
let logger: Logger;
3941
let sessionManager: SessionManager;
4042
let languageClientConsumers: LanguageClientConsumer[] = [];
@@ -56,6 +58,9 @@ export async function activate(context: vscode.ExtensionContext): Promise<IPower
5658
const settings = getSettings();
5759
logger.writeVerbose(`Loaded settings:\n${JSON.stringify(settings, undefined, 2)}`);
5860

61+
const RenameSymbol = new RenameSymbolFeature();
62+
languageRenameProvider = vscode.languages.registerRenameProvider(documentSelector,RenameSymbol);
63+
5964
languageConfigurationDisposable = vscode.languages.setLanguageConfiguration(
6065
PowerShellLanguageId,
6166
{
@@ -151,6 +156,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<IPower
151156
new RemoteFilesFeature(),
152157
new DebugSessionFeature(context, sessionManager, logger),
153158
new HelpCompletionFeature(),
159+
RenameSymbol
154160
];
155161

156162
sessionManager.setLanguageClientConsumers(languageClientConsumers);
@@ -184,4 +190,5 @@ export async function deactivate(): Promise<void> {
184190
await telemetryReporter.dispose();
185191

186192
languageConfigurationDisposable.dispose();
193+
languageRenameProvider.dispose();
187194
}

src/features/RenameSymbol.ts

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
import vscode = require("vscode");
5+
import { RequestType } from "vscode-languageclient";
6+
import { LanguageClientConsumer } from "../languageClientConsumer";
7+
import { RenameProvider, WorkspaceEdit, TextDocument, CancellationToken, Position,Uri,Range } from "vscode";
8+
// eslint-disable-next-line @typescript-eslint/no-empty-interface
9+
interface IRenameSymbolRequestArguments {
10+
FileName?:string
11+
Line?:number
12+
Column?:number
13+
RenameTo:string
14+
}
15+
16+
// eslint-disable-next-line @typescript-eslint/no-empty-interface
17+
interface TextChange {
18+
19+
newText: string;
20+
startLine: number;
21+
startColumn: number;
22+
endLine: number;
23+
endColumn: number;
24+
}
25+
interface ModifiedFileResponse{
26+
fileName: string;
27+
changes : TextChange[]
28+
}
29+
30+
interface IRenameSymbolRequestResponse {
31+
changes : ModifiedFileResponse[]
32+
}
33+
34+
export const RenameSymbolRequestType = new RequestType<IRenameSymbolRequestArguments, IRenameSymbolRequestResponse, void>("powerShell/renameSymbol");
35+
36+
export class RenameSymbolFeature extends LanguageClientConsumer implements RenameProvider {
37+
private command: vscode.Disposable;
38+
39+
constructor() {
40+
super();
41+
this.command = vscode.commands.registerCommand("PowerShell.RenameSymbol", () => {
42+
throw new Error("Not implemented");
43+
44+
});
45+
}
46+
public dispose() {
47+
this.command.dispose();
48+
}
49+
public async provideRenameEdits(document: TextDocument, position: Position, newName: string, _token: CancellationToken): Promise<WorkspaceEdit | undefined> {
50+
51+
const req:IRenameSymbolRequestArguments = {
52+
FileName : document.fileName,
53+
Line: position.line,
54+
Column : position.character,
55+
RenameTo : newName,
56+
};
57+
58+
try {
59+
const response = await this.languageClient?.sendRequest(RenameSymbolRequestType, req);
60+
61+
if (!response) {
62+
return undefined;
63+
}
64+
65+
const edit = new WorkspaceEdit();
66+
response.changes.forEach(change => {
67+
const uri = Uri.file(change.fileName);
68+
69+
change.changes.forEach(change => {
70+
edit.replace(uri,
71+
new Range(change.startLine, change.startColumn, change.endLine, change.endColumn),
72+
change.newText);
73+
});
74+
});
75+
return edit;
76+
}catch (error) {
77+
return undefined;
78+
}
79+
}
80+
81+
}

0 commit comments

Comments
 (0)