mirror of
https://github.com/microsoft/monaco-editor.git
synced 2025-12-22 20:52:56 +01:00
Merge pull request #39 from spahnke:rename-provider
Add a rename provider
This commit is contained in:
commit
7d4d30f874
3 changed files with 54 additions and 0 deletions
|
|
@ -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 };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -64,6 +64,7 @@ function setupMode(defaults: LanguageServiceDefaultsImpl, modeId: string): (firs
|
||||||
monaco.languages.registerDocumentSymbolProvider(modeId, new languageFeatures.OutlineAdapter(worker));
|
monaco.languages.registerDocumentSymbolProvider(modeId, new languageFeatures.OutlineAdapter(worker));
|
||||||
monaco.languages.registerDocumentRangeFormattingEditProvider(modeId, new languageFeatures.FormatAdapter(worker));
|
monaco.languages.registerDocumentRangeFormattingEditProvider(modeId, new languageFeatures.FormatAdapter(worker));
|
||||||
monaco.languages.registerOnTypeFormattingEditProvider(modeId, new languageFeatures.FormatOnTypeAdapter(worker));
|
monaco.languages.registerOnTypeFormattingEditProvider(modeId, new languageFeatures.FormatOnTypeAdapter(worker));
|
||||||
|
monaco.languages.registerRenameProvider(modeId, new languageFeatures.RenameAdapter(worker));
|
||||||
new languageFeatures.DiagnostcsAdapter(defaults, modeId, worker);
|
new languageFeatures.DiagnostcsAdapter(defaults, modeId, worker);
|
||||||
|
|
||||||
return worker;
|
return worker;
|
||||||
|
|
|
||||||
|
|
@ -196,6 +196,14 @@ export class TypeScriptWorker implements ts.LanguageServiceHost {
|
||||||
return Promise.resolve(this._languageService.getFormattingEditsAfterKeystroke(fileName, postion, ch, options));
|
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> {
|
getEmitOutput(fileName: string): Promise<ts.EmitOutput> {
|
||||||
return Promise.resolve(this._languageService.getEmitOutput(fileName));
|
return Promise.resolve(this._languageService.getEmitOutput(fileName));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue