Extract a common DocumentHighlightAdapter

This commit is contained in:
Alex Dima 2021-11-17 13:41:00 +01:00
parent ca17e09d53
commit 09c6ea48f0
No known key found for this signature in database
GPG key ID: 39563C1504FDD0C9
5 changed files with 62 additions and 85 deletions

View file

@ -462,3 +462,56 @@ function toMarkedStringArray(
} }
//#endregion //#endregion
//#region
export interface ILanguageWorkerWithDocumentHighlights {
findDocumentHighlights(
uri: string,
position: lsTypes.Position
): Promise<lsTypes.DocumentHighlight[]>;
}
export class DocumentHighlightAdapter<T extends ILanguageWorkerWithDocumentHighlights>
implements languages.DocumentHighlightProvider
{
constructor(private _worker: WorkerAccessor<T>) {}
public provideDocumentHighlights(
model: editor.IReadOnlyModel,
position: Position,
token: CancellationToken
): Promise<languages.DocumentHighlight[]> {
const resource = model.uri;
return this._worker(resource)
.then((worker) => worker.findDocumentHighlights(resource.toString(), fromPosition(position)))
.then((entries) => {
if (!entries) {
return;
}
return entries.map((entry) => {
return <languages.DocumentHighlight>{
range: toRange(entry.range),
kind: toDocumentHighlightKind(entry.kind)
};
});
});
}
}
function toDocumentHighlightKind(
kind: lsTypes.DocumentHighlightKind
): languages.DocumentHighlightKind {
switch (kind) {
case lsTypes.DocumentHighlightKind.Read:
return languages.DocumentHighlightKind.Read;
case lsTypes.DocumentHighlightKind.Write:
return languages.DocumentHighlightKind.Write;
case lsTypes.DocumentHighlightKind.Text:
return languages.DocumentHighlightKind.Text;
}
return languages.DocumentHighlightKind.Text;
}
//#endregion

View file

@ -42,7 +42,7 @@ export function setupMode(defaults: LanguageServiceDefaults): IDisposable {
providers.push( providers.push(
languages.registerDocumentHighlightProvider( languages.registerDocumentHighlightProvider(
languageId, languageId,
new languageFeatures.DocumentHighlightAdapter(worker) new languageFeatures.CSSDocumentHighlightAdapter(worker)
) )
); );
} }

View file

@ -14,7 +14,8 @@ import {
toTextEdit, toTextEdit,
fromRange, fromRange,
CompletionAdapter, CompletionAdapter,
HoverAdapter HoverAdapter,
DocumentHighlightAdapter
} from '../common/lspLanguageFeatures'; } from '../common/lspLanguageFeatures';
export interface WorkerAccessor { export interface WorkerAccessor {
@ -35,47 +36,7 @@ export class CSSCompletionAdapter extends CompletionAdapter<CSSWorker> {
export class CSSHoverAdapter extends HoverAdapter<CSSWorker> {} export class CSSHoverAdapter extends HoverAdapter<CSSWorker> {}
// --- document highlights ------ export class CSSDocumentHighlightAdapter extends DocumentHighlightAdapter<CSSWorker> {}
function toDocumentHighlightKind(
kind: lsTypes.DocumentHighlightKind
): languages.DocumentHighlightKind {
switch (kind) {
case lsTypes.DocumentHighlightKind.Read:
return languages.DocumentHighlightKind.Read;
case lsTypes.DocumentHighlightKind.Write:
return languages.DocumentHighlightKind.Write;
case lsTypes.DocumentHighlightKind.Text:
return languages.DocumentHighlightKind.Text;
}
return languages.DocumentHighlightKind.Text;
}
export class DocumentHighlightAdapter implements languages.DocumentHighlightProvider {
constructor(private _worker: WorkerAccessor) {}
public provideDocumentHighlights(
model: editor.IReadOnlyModel,
position: Position,
token: CancellationToken
): Promise<languages.DocumentHighlight[]> {
const resource = model.uri;
return this._worker(resource)
.then((worker) => worker.findDocumentHighlights(resource.toString(), fromPosition(position)))
.then((entries) => {
if (!entries) {
return;
}
return entries.map((entry) => {
return <languages.DocumentHighlight>{
range: toRange(entry.range),
kind: toDocumentHighlightKind(entry.kind)
};
});
});
}
}
// --- definition ------ // --- definition ------

View file

@ -27,7 +27,7 @@ export function setupMode1(defaults: LanguageServiceDefaults): void {
languages.registerDocumentHighlightProvider( languages.registerDocumentHighlightProvider(
languageId, languageId,
new languageFeatures.DocumentHighlightAdapter(worker) new languageFeatures.HTMLDocumentHighlightAdapter(worker)
); );
languages.registerLinkProvider(languageId, new languageFeatures.DocumentLinkAdapter(worker)); languages.registerLinkProvider(languageId, new languageFeatures.DocumentLinkAdapter(worker));
languages.registerFoldingRangeProvider( languages.registerFoldingRangeProvider(
@ -90,7 +90,7 @@ export function setupMode(defaults: LanguageServiceDefaults): IDisposable {
providers.push( providers.push(
languages.registerDocumentHighlightProvider( languages.registerDocumentHighlightProvider(
languageId, languageId,
new languageFeatures.DocumentHighlightAdapter(worker) new languageFeatures.HTMLDocumentHighlightAdapter(worker)
) )
); );
} }

View file

@ -19,7 +19,8 @@ import {
toTextEdit, toTextEdit,
fromRange, fromRange,
CompletionAdapter, CompletionAdapter,
HoverAdapter HoverAdapter,
DocumentHighlightAdapter
} from '../common/lspLanguageFeatures'; } from '../common/lspLanguageFeatures';
export interface WorkerAccessor { export interface WorkerAccessor {
@ -36,45 +37,7 @@ export class HTMLHoverAdapter extends HoverAdapter<HTMLWorker> {}
// --- document highlights ------ // --- document highlights ------
function toDocumentHighlightKind( export class HTMLDocumentHighlightAdapter extends DocumentHighlightAdapter<HTMLWorker> {}
kind: lsTypes.DocumentHighlightKind
): languages.DocumentHighlightKind {
switch (kind) {
case lsTypes.DocumentHighlightKind.Read:
return languages.DocumentHighlightKind.Read;
case lsTypes.DocumentHighlightKind.Write:
return languages.DocumentHighlightKind.Write;
case lsTypes.DocumentHighlightKind.Text:
return languages.DocumentHighlightKind.Text;
}
return languages.DocumentHighlightKind.Text;
}
export class DocumentHighlightAdapter implements languages.DocumentHighlightProvider {
constructor(private _worker: WorkerAccessor) {}
public provideDocumentHighlights(
model: editor.IReadOnlyModel,
position: Position,
token: CancellationToken
): Promise<languages.DocumentHighlight[]> {
const resource = model.uri;
return this._worker(resource)
.then((worker) => worker.findDocumentHighlights(resource.toString(), fromPosition(position)))
.then((entries) => {
if (!entries) {
return;
}
return entries.map((entry) => {
return <languages.DocumentHighlight>{
range: toRange(entry.range),
kind: toDocumentHighlightKind(entry.kind)
};
});
});
}
}
function toWorkspaceEdit(edit: lsTypes.WorkspaceEdit): languages.WorkspaceEdit { function toWorkspaceEdit(edit: lsTypes.WorkspaceEdit): languages.WorkspaceEdit {
if (!edit || !edit.changes) { if (!edit || !edit.changes) {