in src/common/lspLanguageFeatures.ts [495:636]
range: toRange(entry.range),
kind: toDocumentHighlightKind(entry.kind)
};
});
});
}
}
function toDocumentHighlightKind(
kind: lsTypes.DocumentHighlightKind | undefined
): 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
//#region DefinitionAdapter
export interface ILanguageWorkerWithDefinitions {
findDefinition(uri: string, position: lsTypes.Position): Promise<lsTypes.Location | null>;
}
export class DefinitionAdapter<T extends ILanguageWorkerWithDefinitions>
implements languages.DefinitionProvider
{
constructor(private readonly _worker: WorkerAccessor<T>) {}
public provideDefinition(
model: editor.IReadOnlyModel,
position: Position,
token: CancellationToken
): Promise<languages.Definition | undefined> {
const resource = model.uri;
return this._worker(resource)
.then((worker) => {
return worker.findDefinition(resource.toString(), fromPosition(position));
})
.then((definition) => {
if (!definition) {
return;
}
return [toLocation(definition)];
});
}
}
function toLocation(location: lsTypes.Location): languages.Location {
return {
uri: Uri.parse(location.uri),
range: toRange(location.range)
};
}
//#endregion
//#region ReferenceAdapter
export interface ILanguageWorkerWithReferences {
findReferences(uri: string, position: lsTypes.Position): Promise<lsTypes.Location[]>;
}
export class ReferenceAdapter<T extends ILanguageWorkerWithReferences>
implements languages.ReferenceProvider
{
constructor(private readonly _worker: WorkerAccessor<T>) {}
provideReferences(
model: editor.IReadOnlyModel,
position: Position,
context: languages.ReferenceContext,
token: CancellationToken
): Promise<languages.Location[] | undefined> {
const resource = model.uri;
return this._worker(resource)
.then((worker) => {
return worker.findReferences(resource.toString(), fromPosition(position));
})
.then((entries) => {
if (!entries) {
return;
}
return entries.map(toLocation);
});
}
}
//#endregion
//#region RenameAdapter
export interface ILanguageWorkerWithRename {
doRename(
uri: string,
position: lsTypes.Position,
newName: string
): Promise<lsTypes.WorkspaceEdit | null>;
}
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 | undefined> {
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 | null): languages.WorkspaceEdit | undefined {
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: {