Extract a common RenameAdapter

This commit is contained in:
Alex Dima 2021-11-17 13:53:29 +01:00
parent 4b2441bf66
commit 6e986e8f96
No known key found for this signature in database
GPG key ID: 39563C1504FDD0C9
5 changed files with 66 additions and 93 deletions

View file

@ -589,3 +589,60 @@ export class ReferenceAdapter<T extends ILanguageWorkerWithReferences>
} }
//#endregion //#endregion
//#region RenameAdapter
export interface ILanguageWorkerWithRename {
doRename(
uri: string,
position: lsTypes.Position,
newName: string
): Promise<lsTypes.WorkspaceEdit>;
}
export class RenameAdapter<T extends ILanguageWorkerWithRename>
implements languages.RenameProvider
{
constructor(private readonly _worker: WorkerAccessor<T>) {}
provideRenameEdits(
model: editor.IReadOnlyModel,
position: Position,
newName: string,
token: CancellationToken
): Promise<languages.WorkspaceEdit> {
const resource = model.uri;
return this._worker(resource)
.then((worker) => {
return worker.doRename(resource.toString(), fromPosition(position), newName);
})
.then((edit) => {
return toWorkspaceEdit(edit);
});
}
}
function toWorkspaceEdit(edit: lsTypes.WorkspaceEdit): languages.WorkspaceEdit {
if (!edit || !edit.changes) {
return void 0;
}
let resourceEdits: languages.WorkspaceTextEdit[] = [];
for (let uri in edit.changes) {
const _uri = Uri.parse(uri);
for (let e of edit.changes[uri]) {
resourceEdits.push({
resource: _uri,
edit: {
range: toRange(e.range),
text: e.newText
}
});
}
}
return {
edits: resourceEdits
};
}
//#endregion

View file

@ -72,7 +72,7 @@ export function setupMode(defaults: LanguageServiceDefaults): IDisposable {
} }
if (modeConfiguration.rename) { if (modeConfiguration.rename) {
providers.push( providers.push(
languages.registerRenameProvider(languageId, new languageFeatures.RenameAdapter(worker)) languages.registerRenameProvider(languageId, new languageFeatures.CSSRenameAdapter(worker))
); );
} }
if (modeConfiguration.colors) { if (modeConfiguration.colors) {

View file

@ -17,7 +17,8 @@ import {
HoverAdapter, HoverAdapter,
DocumentHighlightAdapter, DocumentHighlightAdapter,
DefinitionAdapter, DefinitionAdapter,
ReferenceAdapter ReferenceAdapter,
RenameAdapter
} from '../common/lspLanguageFeatures'; } from '../common/lspLanguageFeatures';
export interface WorkerAccessor { export interface WorkerAccessor {
@ -44,50 +45,7 @@ export class CSSDefinitionAdapter extends DefinitionAdapter<CSSWorker> {}
export class CSSReferenceAdapter extends ReferenceAdapter<CSSWorker> {} export class CSSReferenceAdapter extends ReferenceAdapter<CSSWorker> {}
// --- rename ------ export class CSSRenameAdapter extends RenameAdapter<CSSWorker> {}
function toWorkspaceEdit(edit: lsTypes.WorkspaceEdit): languages.WorkspaceEdit {
if (!edit || !edit.changes) {
return void 0;
}
let resourceEdits: languages.WorkspaceTextEdit[] = [];
for (let uri in edit.changes) {
const _uri = Uri.parse(uri);
for (let e of edit.changes[uri]) {
resourceEdits.push({
resource: _uri,
edit: {
range: toRange(e.range),
text: e.newText
}
});
}
}
return {
edits: resourceEdits
};
}
export class RenameAdapter implements languages.RenameProvider {
constructor(private _worker: WorkerAccessor) {}
provideRenameEdits(
model: editor.IReadOnlyModel,
position: Position,
newName: string,
token: CancellationToken
): Promise<languages.WorkspaceEdit> {
const resource = model.uri;
return this._worker(resource)
.then((worker) => {
return worker.doRename(resource.toString(), fromPosition(position), newName);
})
.then((edit) => {
return toWorkspaceEdit(edit);
});
}
}
// --- document symbols ------ // --- document symbols ------

View file

@ -42,7 +42,7 @@ export function setupMode1(defaults: LanguageServiceDefaults): void {
languageId, languageId,
new languageFeatures.SelectionRangeAdapter(worker) new languageFeatures.SelectionRangeAdapter(worker)
); );
languages.registerRenameProvider(languageId, new languageFeatures.RenameAdapter(worker)); languages.registerRenameProvider(languageId, new languageFeatures.HTMLRenameAdapter(worker));
// only html // only html
if (languageId === 'html') { if (languageId === 'html') {
@ -109,7 +109,7 @@ export function setupMode(defaults: LanguageServiceDefaults): IDisposable {
} }
if (modeConfiguration.rename) { if (modeConfiguration.rename) {
providers.push( providers.push(
languages.registerRenameProvider(languageId, new languageFeatures.RenameAdapter(worker)) languages.registerRenameProvider(languageId, new languageFeatures.HTMLRenameAdapter(worker))
); );
} }
if (modeConfiguration.foldingRanges) { if (modeConfiguration.foldingRanges) {

View file

@ -20,7 +20,8 @@ import {
fromRange, fromRange,
CompletionAdapter, CompletionAdapter,
HoverAdapter, HoverAdapter,
DocumentHighlightAdapter DocumentHighlightAdapter,
RenameAdapter
} from '../common/lspLanguageFeatures'; } from '../common/lspLanguageFeatures';
export interface WorkerAccessor { export interface WorkerAccessor {
@ -35,52 +36,9 @@ export class HTMLCompletionAdapter extends CompletionAdapter<HTMLWorker> {
export class HTMLHoverAdapter extends HoverAdapter<HTMLWorker> {} export class HTMLHoverAdapter extends HoverAdapter<HTMLWorker> {}
// --- document highlights ------
export class HTMLDocumentHighlightAdapter extends DocumentHighlightAdapter<HTMLWorker> {} export class HTMLDocumentHighlightAdapter extends DocumentHighlightAdapter<HTMLWorker> {}
function toWorkspaceEdit(edit: lsTypes.WorkspaceEdit): languages.WorkspaceEdit { export class HTMLRenameAdapter extends RenameAdapter<HTMLWorker> {}
if (!edit || !edit.changes) {
return void 0;
}
let resourceEdits: languages.WorkspaceTextEdit[] = [];
for (let uri in edit.changes) {
const _uri = Uri.parse(uri);
for (let e of edit.changes[uri]) {
resourceEdits.push({
resource: _uri,
edit: {
range: toRange(e.range),
text: e.newText
}
});
}
}
return {
edits: resourceEdits
};
}
export class RenameAdapter implements languages.RenameProvider {
constructor(private _worker: WorkerAccessor) {}
provideRenameEdits(
model: editor.IReadOnlyModel,
position: Position,
newName: string,
token: CancellationToken
): Promise<languages.WorkspaceEdit> {
const resource = model.uri;
return this._worker(resource)
.then((worker) => {
return worker.doRename(resource.toString(), fromPosition(position), newName);
})
.then((edit) => {
return toWorkspaceEdit(edit);
});
}
}
// --- document symbols ------ // --- document symbols ------