1
0
Эх сурвалжийг харах

Merge pull request #39 from spahnke:rename-provider

Add a rename provider
Alexandru Dima 5 жил өмнө
parent
commit
7d4d30f874

+ 45 - 0
src/languageFeatures.ts

@@ -631,3 +631,48 @@ export class FormatOnTypeAdapter extends FormatHelper implements monaco.language
 		});
 	}
 }
+
+// --- rename ----
+
+export class RenameAdapter extends Adapter implements monaco.languages.RenameProvider {
+
+	async provideRenameEdits(model: monaco.editor.ITextModel, position: Position, newName: string, token: CancellationToken): Promise<monaco.languages.WorkspaceEdit & monaco.languages.Rejection> {
+		const resource = model.uri;
+		const fileName = resource.toString();
+		const offset = this._positionToOffset(resource, position);
+		const worker = await this._worker(resource);
+
+		const renameInfo = await worker.getRenameInfo(fileName, offset, { allowRenameOfImportPath: false });
+		if (renameInfo.canRename === false) { // use explicit comparison so that the discriminated union gets resolved properly
+			return {
+				edits: [],
+				rejectReason: renameInfo.localizedErrorMessage
+			};
+		}
+		if (renameInfo.fileToRename !== undefined) {
+			throw new Error("Renaming files is not supported.");
+		}
+
+		const renameLocations = await worker.findRenameLocations(fileName, offset, /*strings*/ false, /*comments*/ false, /*prefixAndSuffix*/ false);
+		const fileNameToResourceTextEditMap: { [fileName: string]: monaco.languages.ResourceTextEdit } = {};
+
+		const edits: monaco.languages.ResourceTextEdit[] = [];
+		for (const renameLocation of renameLocations) {
+			if (!(renameLocation.fileName in fileNameToResourceTextEditMap)) {
+				const resourceTextEdit = {
+					edits: [],
+					resource: monaco.Uri.parse(renameLocation.fileName)
+				};
+				fileNameToResourceTextEditMap[renameLocation.fileName] = resourceTextEdit;
+				edits.push(resourceTextEdit);
+			}
+
+			fileNameToResourceTextEditMap[renameLocation.fileName].edits.push({
+				range: this._textSpanToRange(resource, renameLocation.textSpan),
+				text: newName
+			});
+		}
+
+		return { edits };
+	}
+}

+ 1 - 0
src/tsMode.ts

@@ -64,6 +64,7 @@ function setupMode(defaults: LanguageServiceDefaultsImpl, modeId: string): (firs
 	monaco.languages.registerDocumentSymbolProvider(modeId, new languageFeatures.OutlineAdapter(worker));
 	monaco.languages.registerDocumentRangeFormattingEditProvider(modeId, new languageFeatures.FormatAdapter(worker));
 	monaco.languages.registerOnTypeFormattingEditProvider(modeId, new languageFeatures.FormatOnTypeAdapter(worker));
+	monaco.languages.registerRenameProvider(modeId, new languageFeatures.RenameAdapter(worker));
 	new languageFeatures.DiagnostcsAdapter(defaults, modeId, worker);
 
 	return worker;

+ 8 - 0
src/tsWorker.ts

@@ -196,6 +196,14 @@ export class TypeScriptWorker implements ts.LanguageServiceHost {
 		return Promise.resolve(this._languageService.getFormattingEditsAfterKeystroke(fileName, postion, ch, options));
 	}
 
+	findRenameLocations(fileName: string, positon: number, findInStrings: boolean, findInComments: boolean, providePrefixAndSuffixTextForRename: boolean): Promise<readonly ts.RenameLocation[]> {
+		return Promise.resolve(this._languageService.findRenameLocations(fileName, positon, findInStrings, findInComments, providePrefixAndSuffixTextForRename));
+	}
+
+	getRenameInfo(fileName: string, positon: number, options: ts.RenameInfoOptions): Promise<ts.RenameInfo> {
+		return Promise.resolve(this._languageService.getRenameInfo(fileName, positon, options));
+	}
+
 	getEmitOutput(fileName: string): Promise<ts.EmitOutput> {
 		return Promise.resolve(this._languageService.getEmitOutput(fileName));
 	}